工作幾年的程式設計師同學,有了一定的專案經驗,對於程式設計也有了自己的理解,但他們偶爾也會感到困惑,不知道接下來該如何提升自己。
在筆者看來:"這個階段的程式設計師最需要的是提升自身程式設計能力和視野高度,而學習開源專案是最有效的方法之一"。
這篇文章,筆者聊聊自己的學習開源專案的心得,希望對你有所幫助。
首先,我們需要學習如何使用開源專案。
Github 是全球最大的線上軟體原始碼託管服務平臺,很多開源專案都託管在他上面。
在 GIthub 下載原始碼後,需要重點關注類似 Quick Start,Getting started ,Example 之類的檔案,這些檔案告訴初學者如何使用專案。
假如專案需要部署,參考專案檔案,在獨立的環境中,嘗試從零開始,動手部署該專案。
某些專案也會提供完善的 example 工程·,裡面有現成的例子,可以嘗試按照檔案介紹執行入門例子。
如果入門例子執行順利 ,對於專案初學者來講是一個很好的開始。若執行中出現異常,也不必慌張,尋找專案中 FAQ 檔案,或者搜尋出現問題的關鍵字(比如異常資訊),查詢相關的解決方案。
成功執行了專案中第一個基礎例子之後,可以嘗試執行更復雜的功能例子。
筆者建議單獨建立一個工程,一個一個功能例子完善整個專案。當這個專案越來越充盈,也就證明你掌握得越多。在學習過程中,將學習的心得記錄在筆記中,便於後續回溯。
閱讀原始碼是深入理解開源專案最重要的一步。
閱讀原始碼之前,嘗試從原始碼構建該專案。通常開源專案都會提供一份構建指南,指導你如何搭建一個用於開發、偵錯和構建的環境。構建成功後,嘗試執行該專案。
檢視該專案的架構設計檔案,梳理出整個專案的骨架,可以畫流程圖或者 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 有了一個相對清晰的認識。
筆者大學剛畢業的時候,讀李開復老師的書,書中有一句話,我印象深刻: 「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 模式分庫分表的原理,並積累了自己的技術儲備。
「開源理念之一就是非常鼓勵不同的人一起合作」。——Linux 之父
Linus Torvalds
2016 年 2 月 TED 演講《The mind behind Linux (opens new window)》
在《教授鼓勵學生參與開源專案的 5 個理由》這篇文章裡,提到了如下五點理由:
那麼程式設計師如何參與開源呢 ?參與開源有很多種方式,最常見的有如下幾種:
參與一個開源專案,並與許許多多同樣聰明的工程師共同作業,把腦海中的奇思妙想一一實現,那是多麼美好的事情。
當你不知道選擇哪一個開源專案開始學習時,希望你立足當下,行動起來。當前技術團隊使用的開源元件,正是你學習的方向。
行動起來,你會變成更好的自己,加油。
如果我的文章對你有所幫助,還請幫忙點贊、在看、轉發一下,你的支援會激勵我輸出更高質量的文章,非常感謝!