程式設計師如何學習開源項目,這篇文章告訴你
工作幾年的程式設計師同學,有了一定的項目經驗,對於編程也有了自己的理解,但他們偶爾也會感到困惑,不知道接下來該如何提升自己。
在筆者看來:”這個階段的程式設計師最需要的是提升自身編程能力和視野高度,而學習開源項目是最有效的方法之一”。
這篇文章,筆者聊聊自己的學習開源項目的心得,希望對你有所幫助。
1 學會使用
首先,我們需要學習如何使用開源項目。
Github 是全球最大的在線軟體源程式碼託管服務平台,很多開源項目都託管在他上面。
在 GIthub 下載源碼後,需要重點關注類似 Quick Start,Getting started ,Example 之類的文檔,這些文檔告訴初學者如何使用項目。
假如項目需要部署,參考項目文檔,在獨立的環境中,嘗試從零開始,動手部署該項目。
某些項目也會提供完善的 example 工程·,裡面有現成的例子,可以嘗試按照文檔介紹運行入門例子。
如果入門例子運行順利 ,對於項目初學者來講是一個很好的開始。若運行中出現異常,也不必慌張,尋找項目中 FAQ 文檔,或者搜索出現問題的關鍵字(比如異常資訊),查詢相關的解決方案。
成功運行了項目中第一個基礎例子之後,可以嘗試運行更複雜的功能例子。
筆者建議單獨創建一個工程,一個一個功能例子完善整個項目。當這個項目越來越充盈,也就證明你掌握得越多。在學習過程中,將學習的心得記錄在筆記中,便於後續回溯。
2 閱讀源碼
閱讀源碼是深入理解開源項目最重要的一步。
閱讀源碼之前,嘗試從源碼構建該項目。通常開源項目都會提供一份構建指南,指導你如何搭建一個用於開發、調試和構建的環境。構建成功後,嘗試運行該項目。
查看該項目的架構設計文檔,梳理出整個項目的骨架,可以畫流程圖或者 UML 圖,加深對項目的理解。
當我們了解到整個項目的骨架後,可以挑選感興趣的模組來閱讀,比如你對網路通訊感興趣,就閱讀網路層的程式碼,深入到實現細節,如它用了什麼庫,採用了什麼設計模式,為什麼這樣做等。如果可以,DEBUG 細節程式碼。
閱讀源碼的時候,重視單元測試,嘗試去運行單元測試,基本上一個好的單元測試會將該程式碼的功能和邊界描述清楚。
筆者體系化的閱讀源碼是在2014年。彼時,RocketMQ 3.0 剛開源不久,筆者對消息隊列極其感興趣,同時也迫切想了解網路編程框架 Netty 到底是如何使用的。
於是,先從 RocketMQ 網路通訊模組 remoting 開始學習,因為源碼中有完善的測試用例,先運行單元測試,學習網路編碼模型。
在學習網路編程的過程中,筆者有兩點思維突破:
▍一、客戶端的編程模型
RocketMQ 客戶端網路通訊有如下三種方式:
-
oneway : 單向發送
-
sync :同步調用
-
callback :非同步回調
很多技術的思想是相通的,下圖是螞蟻開源的通訊組件 sofa-bolt 支援的調用類型。
▍二、服務端處理器模式
RocketMQ 服務端通訊使用經典的 Reactor 模式 ,服務端註冊不同的業務處理器,而各個業務處理器可以綁定不同的執行緒池。
void registerProcessor(
final int requestCode,
final NettyRequestProcessor processor,
final ExecutorService executor);
學完網路框架 Remoting 之後,然後結合 Broker 模組,學習 RocketMQ 存儲模型,通過這種方式就可以對 RocketMQ 有了一個相對清晰的認識。
3 知行合一
筆者大學剛畢業的時候,讀李開復老師的書,書中有一句話,我印象深刻: 「I Hear and I Forget, I See and I Remember, I Do and I Understand 」 。
中國古代哲學家荀子也說過:”不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至於行之而止矣“。
學習源碼的過程中,將知識點夯實的關鍵要訣是動手實踐,並保證實踐之後有輸出產物,也就是知行合一。
筆者總結了兩點經驗,供大家參考。
▍一、源碼中的知識點應用到項目中
開源項目中有非常多的優秀實踐 ,可以將程式碼中的編碼技巧,設計思想,優秀源碼引進到業務項目里。
2014年,藝龍的優惠券計算服務遇到性能瓶頸,筆者負責重構這個系統。 在閱讀 RocketMQ 源碼後,學習到了執行緒池使用精髓:執行緒池隔離,各司其職 。
於是,筆者先梳理出業務場景,根據任務類型,綁定不同的執行緒池,為了便於擴展同時對外暴露並發度的配置參數。在重構這個系統的過程中,還引入 RocketMQ 創建執行緒工具類程式碼 。
重構之後,不僅系統的性能提升了5倍,而且筆者的自信心也大大提升,對技術的理解也更加深刻。
▍ 二、造輪子
當我們學習了一個開源項目,我們可以參考開源源碼仿寫一個。仿寫的過程就是查漏補缺的過程,也能完善自己的知識體系。
2016年,sharding-jdbc 開源了,下圖是當時 sharding-jdbc 的架構設計圖:
筆者當時對分庫分表著迷,同時腦海里有很多疑問,比如如何封裝 jdbc 的介面,如何實現 SQL 解析 ,如何將多個分片的結果聚合等。
於是,筆者參考 sharding-jdbc 的源碼,仿寫了一個分庫分表組件。
經過這次仿寫,筆者深入實踐了 client 模式分庫分表的原理,並積累了自己的技術儲備。
4 參與開源
「開源理念之一就是非常鼓勵不同的人一起合作」。——Linux 之父
Linus Torvalds
2016 年 2 月 TED 演講《The mind behind Linux (opens new window)》
在《教授鼓勵學生參與開源項目的 5 個理由》這篇文章里,提到了如下五點理由:
- 無邊界的學習
- 專業的交流
- 外在的機會
- 更深入的理解電腦科學
- 玩
那麼程式設計師如何參與開源呢 ?參與開源有很多種方式,最常見的有如下幾種:
- 直接參与開源項目的開發
- 參考開源項目的社區比賽
- 修復開源項目中的 Bug
- 開源項目文檔編寫
- 參與開源項目的測試和 Demo 編寫工作
- 參與開源項目推廣
參與一個開源項目,並與許許多多同樣聰明的工程師協作,把腦海中的奇思妙想一一實現,那是多麼美好的事情。
5 寫到最後
當你不知道選擇哪一個開源項目開始學習時,希望你立足當下,行動起來。當前技術團隊使用的開源組件,正是你學習的方向。
行動起來,你會變成更好的自己,加油。
如果我的文章對你有所幫助,還請幫忙點贊、在看、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!