談談如何高效學習開源項目

隨着蓬勃發展的開源時代的到來,爲了減小開發成本,提升開發效率,愈來愈多的公司使用各類開源項目,做爲開發者,若是能充分利用好開源項目中的資源,不只能提升實踐能力,專業知識水平,還能從中其中學到的優秀的架構思想。html

本文將提供一些學習開源項目的思路,相信看了這篇文章,小白也可學習讀懂開源項目,沒必要再對着高大上的開源項目望而生畏,淺嘗輒止。面試

1 學習的價值

總結起來,學習開源項目的價值主要包括如下幾點:算法

  • 專業水平的提高 不少通用的專業知識,在專業領域內去到哪一個公司都能通用,特別是底層方面的知識,能夠在開源項目中學到,好比多線程處理、網絡通訊、操做系統處理等。 舉個例子,經過學習Redis 的 RDB 持久化模式的「會將當前內存中的數據庫快照保存到磁盤文件中」,能夠學習到其實就是在操做系統fork一個子進程來實現,再繼續深刻的話,就涉及到父子進程機制, copy-on-write 技術。

這些專業知識之間是能夠聯繫起來的而且像一顆大樹同樣自我生長,可是當沒理解透徹,天然無法產生聯繫,也就不可以自我生長了。當咱們對開源項目的關鍵的點理解清晰,知識也隨着自我生長,也就如滾雪球同樣能夠滾起來了。數據庫

  • 解決問題能力的提高

經過學習開源項目的實現,出現線上問題時,能夠快速定位問題癥結所在,經過修改配置或者修改源代碼來解決;或者當業務需求沒有合適的開源項目能知足時,能夠改造現有的開源項目來知足業務。 做爲要優秀開發,避免陷入「API操做工」的被動局面,學習開源項目的一個很重要目的就是知道其功能點是如何實現且優化的,學習其中的知識比如公式的推導過程,掌握基本API使用比如會數學公式能夠應付考試,可是理解好的推導過程根據有助於記憶和理解,知其然也要知其因此然,當遇那些無法套公式的狀況下,咱們也知道如何解決。設計模式

  • 思惟的提高

經過學習成熟的開源項目的優秀架構,能夠總結和理解一些軟件設計經常使用的架構思路,例如實現高可用,主要是經過集羣的數據冗餘,例如Kafka集羣,HDSF集羣;實現可擴展能夠考慮把變化層和不變層隔離,把業務實現抽象化,例如Spring的預留的一些可擴展接口。bash

2 常見錯誤觀點

學習開源項目有一些常見的錯誤觀點,致使新手容易望而生畏而輕易放棄,或者浪費大量時間而收穫不大:網絡

學習開源項目是架構師,技術大牛的事,我做爲新手根本難以學會,就算學了也用不到。
複製代碼

學習是一個過程,不是一朝一夕就能夠成爲大牛的,可是隻要踏出第一步,總會有可能實現的大牛夢想的;另外一方面,經過不斷覆盤不斷總結,加以合適的方法論指導,相信是能夠有所收穫的,能力獲得提高的。 學習以後對於邏輯思惟,知識體系的構建有相信會有很大提高,即便項目沒用到具體的開源項目,之後遇到相關問題能夠舉一反三,觸類旁通,也是一種進步。數據結構

數據結構和算法很重要,我只要學習這項目中的2方面就能夠了
複製代碼

不要只盯着數據結構和算法,這2點在開源項目中並無那麼重要,例如Netty中的超時隊列是基於紅黑樹來實現的,咱們其實只須要知道這一點就夠了,除非須要改造這方面的功能。更重要的是理解系統的設計,功能的實現方案。多線程

一頭扎進源碼進行學習
複製代碼

不少新手篤信社區論壇流行的一句話「Talk is cheap, show me the code」,一頭扎進源碼閱讀,卻最後陷入源碼的泥潭中,在層層代碼函數跳轉中迷失了方向。架構

其實學習開源項目應該是自頂而下的,最底層的源碼應該是最後纔開始學習,在此以前,須要學習項目相關架構設計方面的知識,有了這些知識,就彷彿數據庫有了索引,按照知識索引來進行源碼針對性突破,如巡航導彈精準爆破,天然比地毯式轟炸更起到事半功倍的做用。

3 學習的4個層次

根據學習理解的深刻程度不一樣,能夠把學習分爲4個層次

學習的4個層次

  • 基礎學習 對項目有一個大概性、基礎性的瞭解,好比項目是什麼,有什麼做用,大概怎麼用,解決了什麼問題。 在面試中,很多初入職場的人的簡歷寫到用到衆多的技術框架,實際上每每僅僅只到了這個層次,再深刻往下問,便支支吾吾答不上來了。

  • 檢視學習 對項目有一個系統性的瞭解,系統的各方面功能,基本原理,優缺點,使用場景,各配置項、API使用。 在實際工做中,若是做爲一個團隊的普通成員,達到這個級別已經能夠知足基本業務開發需求,可是若是想有更高的技術追求,僅僅到此是不夠的。

  • 分析學習 在檢視學習的基礎上,對開源項目的各項性能參數,各自場景性能調優有比較全面的瞭解和實踐經驗。 到達這個層次,在項目生產中,已經有獨當一面的能力,有必定能力承擔核心主力開發的角色。

  • 主題學習 在分析學習的基礎上,對開源項目的關鍵功能模塊的源碼有所瞭解,可以根據實際須要封裝、修改源碼,或者借鑑項目造出新的輪子。 到達這個層次,每每有必定能力承擔技術負責人、技術帶頭人的角色。

4 學習的4個步驟

針對上面提到的學習的層次,下面介紹如何「自頂而下」學習,來達到這4個層次。

4.1 基礎性瞭解學習

目標是達到基礎學習的層次,對項目有大概性的瞭解,包括項目背景,解決的問題場景,項目功能,使用場景,基本的API使用。經過查找官方文檔、相關博客、視頻資料學習便可。

經過對系統有大概性瞭解以後,會天然而然有一些疑問,例如實現的原理,優缺點等,後續學習帶着這些疑問進行學習會更高效。

4.2 系統性學習與實踐

目標是達到檢視學習的層次,對項目有系統性、全面性的瞭解,包括項目的功能、組成模塊、基本原理、使用場景、配置項、API使用、與其餘相似項目的優缺點比較等。

方法步驟以下:

  • 1 安裝運行 按照相關文檔,安裝運行項目。在這個過程當中,須要關注:

    • 系統的依賴組件 由於依賴組件是系統設計和實現的基礎,能夠了解系統一下關鍵信息,例如 Memcached最重要的依賴是高性能的網絡庫 libevent,咱們就能大概推測 Memcached 的網絡實現應該是 Reactor 模型的。
    • 安裝目錄 常見的安裝目錄是conf存放配置文件,logs存放日誌文件,bin存放日誌文件,而不一樣項目有些特殊目錄,好比Nginx有html目錄,這種目錄能促使咱們帶着相關疑問繼續去研究學習,帶着問題去學習效率是最高的。
    • 系統提供的工具 須要特別關注命令行和配置文件,它們提供2個很是重要的關鍵信息,系統具有哪些能力和系統將會如何運行。這些信息是咱們學習系統內部機制和原理的一個觀察窗口。 一般狀況下,若是對每一個命令行參數和配置項的做用和原理基本掌握瞭解的話,基本上對系統已經很熟悉了。實踐中,能夠不斷嘗試去修改配置項,而後觀察系統有什麼變化。
  • 2 系統性研究原理與特性 這點至關重要,由於只有清楚掌握技術的原理特性,才能算真正掌握這門技術,才能作架構設計的時候作出合理的選擇,在這個過程當中,須要重點關注:

    • 關鍵特性的基本實現原理 關鍵特性是該開源開源項目流行的重要賣點,常見的有高性能、高可用、可擴展等特性,項目是如何作到的,這是咱們須要重點關注的地方。

    • 優缺點比對分析 優缺點主要經過對比來分析,即:咱們將兩個相似的系統進行對比,看看它們的實現差別,以及不一樣的實現優缺點都是什麼。典型的對比有 Memcached 和 Redis、Kafka和ActiveMQ、RocketMQ的比較。

    • 使用場景 項目在哪些場景適用,哪些場景不適用,業界適用常見案例等。

在此階段能夠經過學習官方技術設計文檔文檔,架構圖,原理圖,或者相關技術博客,一般比較熱門的開源項目都有不少分析文檔,咱們能夠站在前人的基礎上避免重複投入。但須要注意的是,因爲經驗、水平、關注點、使用的版本不一樣等差別,不一樣的人分析的結論可能有差別,甚至有的是錯誤的,所以不能徹底參照。一個比較好的方式就是多方對照,也就是說看不少篇分析文檔,比較它們的內容共同點和差別點。

同時,若是有些技術點難以查到資料,本身又不肯定,能夠經過寫Example進行驗證,經過日誌打印、調試、監測工具觀察理解具體的細節。例如能夠寫一個簡單程序使用Netty,經過抓包工具觀察網絡包來理解其中的實現。

4.3 系統測試

若是是隻是本身學習和研究,能夠參考網上測試和分析的文檔,可是若是要在生產環境投入使用必須進行測試。由於網上搜的測試結果,不必定與本身的業務場景很契合,若是簡單參考別人的測試結果,極可能會得出錯誤的結論,或者使用的版本不一樣,測試結果差別也比較大。

要特別注意的是,測試必須創建在對這個開源項目有系統性瞭解的基礎上,不能安裝完就立馬測試,不然可能會由於配置項不對,使用方法不當,致使沒有根據業務的特色搭建正確的環境、沒有設計合理的測試用例,從而使得最終的測試結果得出了錯誤結論,誤導了設計決策。

下面提供測試常見的思路參考,須要根據具體項目具體業務進行測試用例的設計。

  • 覈對每一個配置項的做用和影響,識別出關鍵配置項
  • 進行多種場景的性能測試
  • 進行壓力測試,連續跑幾天,觀察 CPU、內存、磁盤 IO等指標波動
  • 進行故障測試:kill,斷電、拔網線、重啓 100 次以上、倒換等

4.4 關鍵源碼學習

鑽研、領悟該項目的各類設計思想與代碼實現細節,基本定位是「精通」,精益求精,學無止境。這是大神們追求的境界。若是但願成爲團隊技術擔當、項目社區的重要貢獻者,則應當以這個層次做爲努力的目標。

代碼不只是讀,還要理和試,有的人連API都沒有調用過,上來就看代碼,覺得省了時間,實際是邁向自我摧殘。

對源碼進行理和試的關鍵以下:

  • 1 在IDE拿到調用棧 在IDE裏讀。IDE裏能夠方便跳轉,查看定義,比起網頁上看效率高得多。 經過IDE工具,運行example程序進行跟蹤調試,經過打斷點能夠獲得程序運行的調用棧。 儘量編譯調試。能調試的代碼,幾乎沒有看不懂的。

  • 2 把調用棧畫下來 把代碼的調用邏輯梳理出來以後,再經過畫圖工具,把代碼的圖畫出來,能夠畫:流程圖、類圖、調用圖、時序圖,更具實際狀況選擇最有表現力的圖。

此外,平時多瞭解一些設計模式。這樣看到名字裏有proxy,builder,factory之類的,就心照不宣了。橫向分層,縱向分塊。代碼都是分模塊的,有的是core,有的是util,parser之類的,要知道看的是哪一層,那一塊。

有的小項目分層不明顯,也沒必要強求。要看的不僅是語法上的技巧,更重要的是設計上的思路和原理。讀沒讀懂,最簡單的標準是,假如給充足的時間,有沒有信心寫出一個差很少的東西來

5 步驟總結

實際實踐操做中,完整執行上面5個步驟花費時間就長,一般狀況下,前面2個步驟,在研究開源項目的時候都必不可少,第3個步驟能夠在工做中打算採用開源項目才實施,第4個步驟在有必定的時間和精力下靈活安排時間作。

與其每一個項目蜻蜓點水去簡單瞭解,不如集中火力把一個項目研究吃透,即便半年才吃透一個,積累幾年以後數量仍是很可觀的。並且不少項目的思想是共同的,例如高可用方案、分佈式協議等,研究透一個,再研究相似項目,會發現學習速度很是快,由於已經把共性的部分掌握了,只須要再研究新項目差別的部分。

同時,在學習的過程當中,須要不斷總結,覆盤,輸出學習筆記,一方面鍛鍊邏輯思惟能力,一方面有利於創建知識索引,過一段時間回顧的時候經過索引能夠快速從新掌握知識,不容易遺忘。

6 面向新手友好的幾個開源項目推薦

介紹理論以後,下面就是須要經過實踐來檢驗了,下面介紹服務端開發常見的幾個比對對新手友好,並且資料比較多的開源項目參考:

  • Spring

    Spring做爲業界最流行的框架,其重要性不言而喻。須要注意的是,因爲Spring的生態圈很是龐大,精力有限,建議新手先選最簡單的模塊進行入門,例如Spring JDBC Template,Spring IOC, Spring AOP, Spring MVC

  • Mybatis

MyBatis 做爲業界流行的優秀持久層框架,支持普通 SQL 查詢,存儲過程和高級映射,代碼量不大,網上相關源碼解析的資料也比較多,項目的代碼質量也是比較高,值得一讀。

  • Elastic-Job

    Elastic-Job做爲一個噹噹網開源的分佈式任務調度解決方案,其社區活躍度,受歡迎程度較高,經過學習,能夠對分佈式一些通訊、調度方面的知識有所掌握。

  • Dubbo

Dubbo是阿里巴巴公司開源的一個高性能優秀的服務治理框架,使得應用可經過高性能的RPC 實現服務的輸出和輸入功能。Dubbo在17年年末從新啓動維護,在業務普遍使用,通讀了解源碼,在服務治理,分佈式協議方面的技術實力相信會有質的飛躍。

更多精彩,歡迎關注做者公衆號【分佈式系統架構】

參考

從0開始學架構 —— Alibaba 李運華

如何高效的學習掌握新技術

學習開源項目的若干建議

我是如何閱讀開源項目的源代碼的

相關文章
相關標籤/搜索