談談如何高效學習開源專案

2021-10-02 16:09:25 字數 4075 閱讀 4916

作者 陳彩華

隨著蓬勃發展的開源時代的到來,為了減少開發成本,提高開發效率,越來越多的公司使用各種開源專案,作為開發者,如果能充分利用好開源專案中的資源,不僅能提高實踐能力,專業知識水平,還能從中其中學到的優秀的架構思想。

總結起來,學習開源專案的價值主要包括以下幾點:

這些專業知識之間是可以聯絡起來的並且像一顆大樹一樣自我生長,但是當沒理解透徹,自然沒法產生聯絡,也就不能夠自我生長了。當我們對開源專案的關鍵的點理解清晰,知識也隨著自我生長,也就如滾雪球一樣可以滾起來了。

通過學習開源專案的實現,出現線上問題時,可以快速定位問題癥結所在,通過修改配置或者修改源**來解決;或者當業務需求沒有合適的開源專案能滿足時,可以改造現有的開源專案來滿足業務。

作為要優秀開發,避免陷入「api操作工」的被動局面,學習開源專案的乙個很重要目的就是知道其功能點是如何實現且優化的,學習其中的知識好比公式的推導過程,掌握基本api使用好比會數學公式可以應付考試,但是理解好的推導過程根據有助於記憶和理解,知其然也要知其所以然,當遇那些沒法套公式的情況下,我們也知道如何解決。

通過學習成熟的開源專案的優秀架構,可以總結和理解一些軟體設計常用的架構思路,例如實現高可用,主要是通過集群的資料冗餘,例如kafka集群,hdsf集群;實現可擴充套件可以考慮把變化層和不變層隔離,把業務實現抽象化,例如spring的預留的一些可擴充套件介面。

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

學習開源專案是架構師,技術大牛的事,我作為新手根本難以學會,就算學了也用不到。

學習是乙個過程,不是一朝一夕就可以成為大牛的,但是只要踏出第一步,總會有可能實現的大牛夢想的;另一方面,通過不斷覆盤不斷總結,加以合適的方**指導,相信是可以有所收穫的,能力得到提公升的。

學習之後對於邏輯思維,知識體系的構建有相信會有很大提公升,即使專案沒用到具體的開源專案,以後遇到相關問題可以觸類旁通,舉一反三,也是一種進步。

資料結構和演算法很重要,我只要學習這專案中的2方面就可以了

不要只盯著資料結構和演算法,這2點在開源專案中並沒有那麼重要,例如netty中的超時佇列是基於紅黑樹來實現的,我們其實只需要知道這一點就夠了,除非需要改造這方面的功能。更重要的是理解系統的設計,功能的實現方案。

一頭紮進原始碼進行學習

很多新手篤信社群論壇流行的一句話「talk is cheap, show me the code」,一頭紮進原始碼閱讀,卻最後陷入原始碼的泥潭中,在層層**函式跳轉中迷失了方向。

其實學習開源專案應該是自頂而下的,最底層的原始碼應該是最後才開始學習,在此之前,需要學習專案相關架構設計方面的知識,有了這些知識,就彷彿資料庫有了索引,按照知識索引來進行原始碼針對性突破,如巡航飛彈精準爆破,自然比地毯式轟炸更起到事半功倍的作用。

根據學習理解的深入程度不同,可以把學習分為4個層次

學習的4個層次

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

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

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

方法步驟如下:

2 系統性研究原理與特性

這點相當重要,因為只有清楚掌握技術的原理特性,才能算真正掌握這門技術,才能做架構設計的時候做出合理的選擇,在這個過程中,需要重點關注:

在此階段可以通過學習官方技術設計文件文件,架構圖,原理圖,或者相關技術部落格,通常比較熱門的開源專案都有很多分析文件,我們可以站在前人的基礎上避免重複投入。但需要注意的是,由於經驗、水平、關注點、使用的版本不同等差異,不同的人分析的結論可能有差異,甚至有的是錯誤的,因此不能完全參照。乙個比較好的方式就是多方對照,也就是說看很多篇分析文件,比較它們的內容共同點和差異點。

同時,如果有些技術點難以查到資料,自己又不確定,可以通過寫example進行驗證,通過日誌列印、除錯、監測工具觀察理解具體的細節。例如可以寫乙個簡單程式使用netty,通過抓包工具觀察網路包來理解其中的實現。

如果是只是自己學習和研究,可以參考網上測試和分析的文件,但是如果要在生產環境投入使用必須進行測試。因為網上搜的測試結果,不一定與自己的業務場景很契合,如果簡單參考別人的測試結果,很可能會得出錯誤的結論,或者使用的版本不同,測試結果差異也比較大。

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

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

鑽研、領悟該項目的各種設計思想與**實現細節,基本定位是「精通」,精益求精,學無止境。這是大神們追求的境界。如果希望成為團隊技術擔當、專案社群的重要貢獻者,則應當以這個層次作為努力的目標。

**不僅是讀,還要理和試,有的人連api都沒有呼叫過,上來就看**,以為省了時間,實際是邁向自我摧殘。

對原始碼進行理和試的關鍵如下:

此外,平時多了解一些設計模式。這樣看到名字裡有proxy,builder,factory之類的,就心領神會了。橫向分層,縱向分塊。**都是分模組的,有的是core,有的是util,parser之類的,要知道看的是哪一層,那一塊。

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

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

與其每個專案走馬觀花去簡單了解,不如集中火力把乙個專案研究吃透,即使半年才吃透乙個,積累幾年之後數量還是很可觀的。而且很多專案的思想是共同的,例如高可用方案、分布式協議等,研究透乙個,再研究類似專案,會發現學習速度非常快,因為已經把共性的部分掌握了,只需要再研究新專案差異的部分。

同時,在學習的過程中,需要不斷總結,覆盤,輸出學習筆記,一方面鍛鍊邏輯思維能力,一方面有利於建立知識索引,過一段時間回顧的時候通過索引可以快速重新掌握知識,不容易遺忘。

介紹理論之後,下面就是需要通過實踐來檢驗了,下面介紹服務端開發常見的幾個比對對新手友好,而且資料比較多的開源專案參考:

mybatis 作為業界流行的優秀持久層框架,支援普通 sql 查詢,儲存過程和高階對映,**量不大,網上相關原始碼解析的資料也比較多,專案的**質量也是比較高,值得一讀。

dubbo是阿里巴巴公司開源的乙個高效能優秀的服務治理框架,使得應用可通過高效能的rpc 實現服務的輸出和輸入功能。dubbo在17年年底重新啟動維護,在業務廣泛使用,通讀了解原始碼,在服務治理,分布式協議方面的技術實力相信會有質的飛躍。

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

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

學習開源專案的若干建議

我是如何閱讀開源專案的源**的

5 42如何高效的學習開源專案

date comments categories br title 2020 4 18 true 軟體架構 架構 開源專案 5.42 如何高效學習開源專案 工作當中會經常使用到開源專案,例如nginx,redis,netty等。對於開源專案,不能只知其然,還要知道其所以然。這樣做的目的,一方面是為了...

高效地學習開源專案

現狀 開源專案對團隊和業務有很大好處,但對於技術人員來說,如果只是簡單的採取 拿來主義 那就變成乙個陷阱 看似很快的使用開源專案實現了需求,但自己的技術水平並沒有什麼提公升 甚至可能出現看起來用了很多開源專案,知道很多專案名稱,但是技術水平止步不前。ps 雖然使用了開源專案,實現了需求,知道了很多開...

如何更加安全 高效地選擇開源專案

在平時的開發過程中,難免會遇到這樣那樣的難題,或者一些繁瑣且不想純手工完成的功能,對於這些問題,解決的姿勢有很多種,可以通過同事間的交流 上網查資料 去官網找文件等,隨著開源的推動和完善,尋找合適的開源專案支援,絕對是乙個很好的方法。如今市面上的開源專案魚龍混在,並且有一些專案早已停止更新維護,跑d...