【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】

石杉的架構筆記發表於2019-03-25

目錄

1、從最簡單的原始碼開始:別幻想一步登天

2、循序漸進:先搞定底層依賴的技術

3、一定要以Hello World作為入口來閱讀

4、抓大放小,邊寫註釋邊畫圖

5、反覆三遍,真正理解原始碼

6、借力打力,參考原始碼分析書籍及部落格

7、最後寄語:用幾年時間鍛造自己的核心技術

前言

這篇文章,給大家簡單介紹一下很多同學都非常關心的一個問題:如何閱讀一個開源專案的原始碼。

我相信很多同學都希望能夠去閱讀一些原始碼來提升自己的技術水平,畢竟在面試的時候,很多大廠都經常會扣到非常深入的底層原始碼。

1、從最簡單的原始碼開始:別幻想一步登天

其實開源專案有很多種,比如說有Spring這種框架類的,還有比如資料庫連線池、log4j等這種工具類的。

當然還有特別重型的中介軟體類的,比如說RocketMQ、Kafka、Redis。更有甚者也有上百萬行程式碼的大資料類的,比如Hadoop、Spark。

所以如果很多同學想要讀原始碼的話,面臨的第一個問題:不知道從何下手。

那麼是不是說只要隨便挑選一個開源技術的原始碼,採用愚公移山的精神,直接硬著頭皮去讀,堅持就是勝利,鐵杵一定就能磨成針嗎?

不是的!其實很多同學始終都沒掌握到閱讀原始碼的順序、技巧和方法,所以導致嘗試看過一些原始碼,卻還是看不懂。

【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】

首先你要明白一個前提,比如說Kafka的作者,Hadoop的作者,他們本身都是有很多年經驗,技術功底極為紮實,都是技術大牛的人,站在一個很高的角度去設計和開發出來了這些極為出色的分散式系統。

那麼如果你的技術實力達不到他們的水平,你覺得你直接去讀他們寫出來的原始碼,就能看懂嗎?

那估計是很難的,因為裡面蘊含的各種底層技術細節,分散式架構設計思想,還有複雜的演算法和機制,都不是你能理解的。

所以建議大家第一點,想看原始碼,先挑一個最最簡單的,適合自己技術水平的去看。

給大家舉個例子,比如說你平時常用的一些原始碼都有什麼?顯而易見,每個人都會用Spring Web MVC、Spring、MyBatis、Spring Boot,等等。

其實這些開源框架的原始碼也不能說就簡單了,他們同樣蘊含了開源作者深厚的技術功底在裡面。

但是你要考慮一點,這些開源專案已經相對來說是普通人可以優先觸碰的了。因為他們不是分散式系統,不涉及到複雜的架構,網路通訊,IO,等技術細節。

他們大多就是依賴一些底層的Java基礎技術,比如說動態代理、Servlet、HTTP協議、JDBC等等。

而他們依賴的那些基礎,大多數普通工程師都是掌握的,你完全可以優先嚐試去閱讀一些這種開源框架類的原始碼。


2、循序漸進:先搞定底層依賴的技術


好,現在假如說你經過了幾個月的努力,把一些開源框架的原始碼,比如上面說的SSM三大框架的原始碼都看過了,現在你的技術實力有了進一步的提升。

這些提升,主要體現在對開源專案的設計思想,元件設計,元件互動,還有框架封裝,等等,都有了進一步的理解。

接下來,你就可以嘗試去讀一些更難一點的原始碼。

給大家舉個例子,假設你這個時候去閱讀Kafka的原始碼。沒問題。但是這裡有一些是你需要注意的地方,Kafka的底層是重度依賴ZooKeeper的。

如果你不把ZooKeeper給掌握精通的話,會導致Kafka你也難以理解。

【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】

所以這個時候你得先把底層依賴的技術給搞定,那麼你就得回過頭去先閱讀ZooKeeper的原始碼,把ZK這個技術先給搞精通一些。

同理,如果你在研究ZK的時候,發現他底層有一些技術是你掌握不好的,比如你發現他大量運用了Java併發包下的東西。

因此如果你對Java併發包掌握的不夠好,那麼建議你去把Java併發包下的原始碼先仔細研究一下。

通過這種方式,你可以自行追蹤到自己還不熟悉的很多底層技術,然後一個一個擊破,把這些底層依賴的技術的原始碼你可以先研究透徹一些。

然後,你再一步一步往上層的技術去研究,這樣看那些複雜技術的原始碼就會輕鬆很多了。


3、一定要以Hello World作為入口來閱讀


閱讀原始碼有一個非常非常有用的技巧,那就是你別下載了原始碼到本地IDE裡然後直接胡亂的翻看,那是不行的。

一般建議就是基於一個開源技術寫一個最最基本的HelloWorld程式,就是一個入門級的程式,然後把他的核心功能給跑通。

舉個例子,假如說你要閱讀ZooKeeper的原始碼,那麼你先寫一個ZK的HelloWorld程式。

比如說先連線,然後建立一個znode,對znode註冊一個監聽。接著觸發這個監聽,接著再關閉連線,就這樣的一個簡單的程式。

然後就可以打斷點,跟蹤這個Hello World級別的原始碼一步一步除錯追蹤,他是如何發起和建立連線的,底層的程式碼流程是什麼樣的。


4、抓大放小,邊寫註釋邊畫圖

在看原始碼的過程中,很多人會被核心流程中混雜的一些特殊業務邏輯的處理給搞懵。

給大家舉個例子,看下面的程式碼,是一段隨手寫出來演示的:

checkUser();

fetchFromPeers();

countMetrics();

大家可以看到,上面就三行程式碼,從方法名稱就可以看出來,先是做了一個許可權檢查之類的操作,然後是核心業務邏輯去抓取資料,最後是做了一些metric指標統計。

那麼很多同學看原始碼的時候,就喜歡把每一行程式碼都看懂,最後不停的點到很深層的地方去,把自己給繞暈了。最後淹死在原始碼的海洋裡。。。

其實這個是不對的,這就是沒有掌握原始碼閱讀的一大典型原則:

抓大放小

比如上面的三行程式碼,你應該直接跳過第一行和第三行,連看都別去看,直接進入第二行核心邏輯。

也就是說,你只需要抓最核心的程式碼流程就可以了,那些無關緊要的程式碼,千萬別有強迫症點進去反覆看,那樣絕對會讓你對原始碼從入門到放棄。

【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】

所以,再次強調!強調!強調!重要的事情說三遍。閱讀原始碼,你一定要有粗大的神經,反覆告訴自己,剛開始先把握程式碼的主流程即可。

很多細節看不懂直接跳過去,別有強迫症讓自己看明白每個細節。

此外,大家一定要形成一個習慣,在看原始碼的過程中儘量多自己對原始碼寫一些註釋。

你應該結合自己的理解,儘可能把自己對原始碼閱讀過程中的思考都寫成註釋寫在原始碼裡。

這個習慣可以促使你一邊閱讀一邊思考,而且有自己註釋的原始碼,是你寶貴的財富。

此外,還有一個非常重要的點,那就是一定要多畫圖

你可以嘗試在閱讀的過程中,提取原始碼執行的核心流程,一邊讀原始碼,一邊自己畫在圖上,可以用那種畫圖軟體來作圖即可。

大家記住,人腦對圖片的敏感度,是遠高於對文字或者程式碼的,這個是大腦機制決定的。

筆者公眾號寫的很多篇文章,裡面對各種技術的講解,無一不是通過大量的畫圖。相比於冗長的文字描述,圖片會讓人容易理解接受的多。

通過畫圖,能幫助你抽象和總結出原始碼的核心流程,以後如果你要回顧和複習,直接看圖即可。


5、反覆三遍:真正理解原始碼

另外一個要注意的點,原始碼這個東西,是多看幾遍理解的就會越深刻。

因為你看第一遍,按照上面說的抓大放小的思路,可能很多東西就直接略過去了,因為剛開始你看不懂一些非核心程式碼在幹什麼。

但是第一遍看完以後,通過寫註釋,自己動手畫圖,對一個開源專案的核心流程、架構以及原理都有了一定的理解了。

此時再去讀第二遍原始碼,再過一遍,你會發現之前很多看不懂的細節都能看懂了。然後再看第三遍原始碼,你會發現大多數的程式碼自己都能看懂了。

所以說任何一個原始碼,都是要至少反覆看三遍的過程,不是看一遍就可以完成的。


6、借力打力:參考原始碼分析書籍及部落格

其實現在有很多對熱門開源專案進行原始碼分析的書籍以及部落格,你大致可以認為就是一些技術比較牛的兄弟自己看了原始碼之後,寫出來的一些分析和感悟。

但是那畢竟是別人的東西,如果你上來就直接看原始碼分析書籍或者部落格,那麼不一定可以看懂,因為文字的資訊傳遞未必能很好的讓你理解有些複雜的東西。

所以比較建議的方式,就是先自己嘗試看幾遍,有了一定的理解之後,此時可以藉助原始碼分析書籍或者是部落格,參考其他技術牛的同學對這個原始碼理解,結合自己之前的一些思考,綜合起來進行分析,相信一定會大有裨益。

你會發現人家的一些理解可以很好的補充你沒想明白的一些問題,或者是忽略的一些細節。

不過,需要提醒的一點,網上不少部落格,包括一些書籍,他們寫出的一些原始碼分析,可能是錯誤的。

所以,盡信書不如無書,你需要帶著一定的糾錯眼光。在和你的理解相悖時,不一定就是你錯了。


7、最後寄語:用幾年時間鍛造自己的核心技術

其實上面那個過程說起來很簡單,做起來非常的困難。

因為在上面任何一個步驟,閱讀的過程中你都有大量的東西是不會的,而且會覺得很難,甚至經常有想放棄的衝動。

畢竟人的大腦天生就是會對困難的事情產生抗拒感,這是本能,天生就是對舒服、放鬆的事情有嚮往。

但是隻有那些能克服人的動物本能,惰性本能,迎難而上,堅韌不拔的同學,才能真正攻克各種技術難題。

讓自己的大腦不停的開動,不停的思考上面那個過程,也許你要持續一年才能有個小的開悟,持續三年才能有一定的心得,持續五年甚至八年,才能說真的融匯貫通,打通任督二脈,成為技術大牛。

【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】

但是堅持這個事情同樣是很可怕的,一旦你堅持做到了,那麼你將鍛造出來自己最硬核的技術實力,遠遠不是普通人,或者剛畢業的年輕同學可以追上你的。技術深度、技術功底,這是每一個工程師最最硬核的技術實力。

希望各位同學可以從現在開始,嘗試著用筆者分享的技巧閱讀原始碼。跳出舒適區,去擁抱更大的舒適區。

真正體驗一下讀透原始碼之後,根據報錯日誌,從原始碼層面精確定位專案問題、精確制導線上bug,感受一下這種上帝視角解決問題的快感吧!

【架構師成長必備】如何閱讀一個開源專案的原始碼?【石杉的架構筆記】


一大波微服務、分散式、高併發、高可用的原創系列文章正在路上,

歡迎關注公眾號:石杉的架構筆記

週一至週五早八點半!精品技術文章準時送上!!!

十餘年BAT架構經驗傾囊相授



相關文章