聊聊如何學(xué)習(xí)開源項目
工作幾年的程序員同學(xué),有了一定的項目經(jīng)驗,對于編程也有了自己的理解,但他們偶爾也會感到困惑,不知道接下來該如何提升自己。
在筆者看來:"這個階段的程序員最需要的是提升自身編程能力和視野高度,而學(xué)習(xí)開源項目是最有效的方法之一"。
這篇文章,筆者聊聊自己的學(xué)習(xí)開源項目的心得,希望對你有所幫助。
1 學(xué)會使用首先,我們需要學(xué)習(xí)如何使用開源項目。
Github 是全球最大的在線軟件源代碼托管服務(wù)平臺,很多開源項目都托管在他上面。
在 GIthub 下載源碼后,需要重點關(guān)注類似 Quick Start,Getting started ,Example?之類的文檔,這些文檔告訴初學(xué)者如何使用項目。
假如項目需要部署,參考項目文檔,在獨立的環(huán)境中,嘗試從零開始,動手部署該項目。
某些項目也會提供完善的 example 工程·,里面有現(xiàn)成的例子,可以嘗試按照文檔介紹運行入門例子。
如果入門例子運行順利 ,對于項目初學(xué)者來講是一個很好的開始。若運行中出現(xiàn)異常,也不必慌張,尋找項目中 FAQ 文檔,或者搜索出現(xiàn)問題的關(guān)鍵字(比如異常信息),查詢相關(guān)的解決方案。
成功運行了項目中第一個基礎(chǔ)例子之后,可以嘗試運行更復(fù)雜的功能例子。
筆者建議單獨創(chuàng)建一個工程,一個一個功能例子完善整個項目。當(dāng)這個項目越來越充盈,也就證明你掌握得越多。在學(xué)習(xí)過程中,將學(xué)習(xí)的心得記錄在筆記中,便于后續(xù)回溯。
2 閱讀源碼閱讀源碼是深入理解開源項目最重要的一步。
閱讀源碼之前,嘗試從源碼構(gòu)建該項目。通常開源項目都會提供一份構(gòu)建指南,指導(dǎo)你如何搭建一個用于開發(fā)、調(diào)試和構(gòu)建的環(huán)境。構(gòu)建成功后,嘗試運行該項目。
查看該項目的架構(gòu)設(shè)計文檔,梳理出整個項目的骨架,可以畫流程圖或者 UML 圖,加深對項目的理解。
當(dāng)我們了解到整個項目的骨架后,可以挑選感興趣的模塊來閱讀,比如你對網(wǎng)絡(luò)通訊感興趣,就閱讀網(wǎng)絡(luò)層的代碼,深入到實現(xiàn)細(xì)節(jié),如它用了什么庫,采用了什么設(shè)計模式,為什么這樣做等。如果可以,DEBUG 細(xì)節(jié)代碼。
閱讀源碼的時候,重視單元測試,嘗試去運行單元測試,基本上一個好的單元測試會將該代碼的功能和邊界描述清楚。
筆者體系化的閱讀源碼是在2014年。彼時,RocketMQ 3.0 剛開源不久,筆者對消息隊列極其感興趣,同時也迫切想了解網(wǎng)絡(luò)編程框架 Netty 到底是如何使用的。
于是,先從 RocketMQ 網(wǎng)絡(luò)通訊模塊 remoting 開始學(xué)習(xí),因為源碼中有完善的測試用例,先運行單元測試,學(xué)習(xí)網(wǎng)絡(luò)編碼模型。
在學(xué)習(xí)網(wǎng)絡(luò)編程的過程中,筆者有兩點思維突破:
▍一、客戶端的編程模型
RocketMQ 客戶端網(wǎng)絡(luò)通訊有如下三種方式:
-
oneway : 單向發(fā)送
-
sync :同步調(diào)用
-
callback :異步回調(diào)
很多技術(shù)的思想是相通的,下圖是螞蟻開源的通訊組件 sofa-bolt 支持的調(diào)用類型。
螞蟻通訊框架Bolt調(diào)用類型▍二、服務(wù)端處理器模式
RocketMQ 服務(wù)端通訊使用經(jīng)典的 Reactor 模式 ,服務(wù)端注冊不同的業(yè)務(wù)處理器,而各個業(yè)務(wù)處理器可以綁定不同的線程池。
void?registerProcessor(
??????final?int?requestCode,?
??????final?NettyRequestProcessor?processor,
??????final?ExecutorService?executor);

學(xué)完網(wǎng)絡(luò)框架 Remoting 之后,然后結(jié)合 Broker 模塊,學(xué)習(xí) RocketMQ 存儲模型,通過這種方式就可以對 RocketMQ 有了一個相對清晰的認(rèn)識。
3 知行合一筆者大學(xué)剛畢業(yè)的時候,讀李開復(fù)老師的書,書中有一句話,我印象深刻:“I Hear and I Forget, I See and I Remember, I Do and I Understand ” 。
中國古代哲學(xué)家荀子也說過:"不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學(xué)至于行之而止矣"。
學(xué)習(xí)源碼的過程中,將知識點夯實的關(guān)鍵要訣是動手實踐,并保證實踐之后有輸出產(chǎn)物,也就是知行合一。
筆者總結(jié)了兩點經(jīng)驗,供大家參考。
▍一、源碼中的知識點應(yīng)用到項目中
開源項目中有非常多的優(yōu)秀實踐 ,可以將代碼中的編碼技巧,設(shè)計思想,優(yōu)秀源碼引進到業(yè)務(wù)項目里。
2014年,藝龍的優(yōu)惠券計算服務(wù)遇到性能瓶頸,筆者負(fù)責(zé)重構(gòu)這個系統(tǒng)。在閱讀 RocketMQ 源碼后,學(xué)習(xí)到了線程池使用精髓:線程池隔離,各司其職 。
于是,筆者先梳理出業(yè)務(wù)場景,根據(jù)任務(wù)類型,綁定不同的線程池,為了便于擴展同時對外暴露并發(fā)度的配置參數(shù)。在重構(gòu)這個系統(tǒng)的過程中,還引入 RocketMQ 創(chuàng)建線程工具類代碼 。
重構(gòu)之后,不僅系統(tǒng)的性能提升了5倍,而且筆者的自信心也大大提升,對技術(shù)的理解也更加深刻。
▍ 二、造輪子
當(dāng)我們學(xué)習(xí)了一個開源項目,我們可以參考開源源碼仿寫一個。仿寫的過程就是查漏補缺的過程,也能完善自己的知識體系。
2016年,sharding-jdbc 開源了,下圖是當(dāng)時 sharding-jdbc 的架構(gòu)設(shè)計圖:

筆者當(dāng)時對分庫分表著迷,同時腦海里有很多疑問,比如如何封裝 jdbc 的接口,如何實現(xiàn) SQL 解析 ,如何將多個分片的結(jié)果聚合等。
于是,筆者參考 sharding-jdbc 的源碼,仿寫了一個分庫分表組件。

經(jīng)過這次仿寫,筆者深入實踐了 client 模式分庫分表的原理,并積累了自己的技術(shù)儲備。
4 參與開源“開源理念之一就是非常鼓勵不同的人一起合作”?!狶inux 之父
Linus Torvalds2016 年 2 月 TED 演講《The mind behind Linux (opens new window)》
在《教授鼓勵學(xué)生參與開源項目的 5 個理由》這篇文章里,提到了如下五點理由:
- 無邊界的學(xué)習(xí)
- 專業(yè)的交流
- 外在的機會
- 更深入的理解計算機科學(xué)
- 玩
那么程序員如何參與開源呢 ?參與開源有很多種方式,最常見的有如下幾種:
- 直接參與開源項目的開發(fā)
- 參考開源項目的社區(qū)比賽
- 修復(fù)開源項目中的 Bug
- 開源項目文檔編寫
- 參與開源項目的測試和 Demo 編寫工作
- 參與開源項目推廣
參與一個開源項目,并與許許多多同樣聰明的工程師協(xié)作,把腦海中的奇思妙想一一實現(xiàn),那是多么美好的事情。
5 寫到最后親愛的程序員朋友,當(dāng)你不知道選擇哪一個開源項目開始學(xué)習(xí)時,希望你立足當(dāng)下,當(dāng)前技術(shù)團隊使用的開源組件,正是你學(xué)習(xí)的方向。
行動起來,相信你會成為更好的自己,加油。
最近我開通了
股東服務(wù)
,感興趣的可戳:
我開通了付費渠道
關(guān)注公眾號回復(fù)「
對線
」
即可免費領(lǐng)取《對線面試官》系列電子書
。
點擊 ?閱讀原文?? 跳轉(zhuǎn)至Java開源消息推送平臺項目倉庫
