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

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

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

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