使人生畏的源碼,到底該怎樣看?

一個軟件開發人員,工做到了必定的年限(通常是三、4年左右),若是他還沒學會閱讀源碼,那麼他就會遇到瓶頸。由於到了這個時候的開發,他應該不只僅只會作那些 CURD 的業務邏輯,而應該會根據公司的實際狀況去寫框架。java

而基本上沒有誰能像天才同樣從零寫出一個框架,不少人寫框架其實都是從模仿開始的。而你要模仿,那麼你首先得看得懂框架源碼才行。因此說閱讀源碼才顯得那麼重要。框架

我在工做一兩年的時候有嘗試去看過 JDK 的源碼,那時候感受就跟看天書同樣,看一點都以爲痛苦。一直到工做三年左右,由於同事都在看源碼,我也開始看一些源碼。ide

我看的第一個框架的源碼是 dubbo,雖說沒有徹底搞懂它。可是經過閱讀 dubbo 源碼,我弄懂了 JDK 的 SPI 機制,知道 SPI 在框架開發中的做用。一直到最近閱讀公司的一個網關框架,我才慢慢有一點閱讀源碼的經驗和套路。正好趁熱打鐵,把這些經驗寫下來,但願大家也能早日踏上源碼閱讀之路。工具

1、搜索網上資料

閱讀一個框架的源碼,最基礎的操做確定是掃一遍網上的各類分析文章。經過這個操做,你能夠對這個框架有個大體的瞭解。站在巨人的肩膀上,少走許多彎路。但若是你看的項目是公司內部的框架,那麼你只能找公司內部的文檔了,更甚者,有些連文檔都沒有。那麼你能夠略過這一步。spa

2、掃一遍源碼

當你拿到框架的源碼的時候,你能夠大體把源碼的每一個包,以及每一個包下面的文件掃讀一遍。掃讀並不須要你弄清楚每一行代碼的意思,只須要讓你知道源碼每一部分的做用。插件

若是一個開源框架足夠標準,那麼他的命名是很是語義化的。因此咱們掃讀的時候,經過包名、文件名就能夠判斷出這個包是用來幹嗎的。設計

例如 util 包是工具類,那咱們能夠直接跳過。vo 包是存放實體模型的,一樣能夠跳過。protocol 包是存放協議相關的等等。經過這麼一個步驟,你會對整個項目有一個基本的印象,知道這個項目大概有哪些東西,哪些相對比較重要。開發

3、找到入口

閱讀任何一個框架的源碼,首先就是要找到框架的入口。經過上面掃讀源碼,你應該可以發現一些入口的跡象,例如對於 Dubbo 來講,你會發現它有一個名爲 dubbo-demo 的子模塊,那麼咱們確定重點看它。文檔

進一步發掘需求你會發現它的入口就是 dubbo-demo 中的 Provider 類、Consumer 類。咱們能夠直接接運行這兩個類的 main 方法,並一步步跟蹤代碼的執行狀況。源碼

4、通讀源碼

找到入口以後,下一步就是通讀全部源碼了,就是把源碼的每一個文件每一行都看一遍。在這個階段不求徹底弄懂細緻的業務邏輯,可是要造成一個大概的框架,知道這個框架是如何設計的,有哪些大體的模塊,這些模塊是如何設計的。

在通讀源碼這個階段是最枯燥無味的,也是最容易放棄的。一方面由於源碼實在過於多,另外一方面由於沒有一個目標,因此看着看着內心沒有底,因此容易放棄。我一開始也是如此,但以後我想出了一個比較好的辦法經過數字化的方式讓本身知道閱讀進度。這樣本身就不會以爲內心沒底,不知道要多久才能看完了。

個人方法是給個人 IDE 裝一個代碼統計插件:Statistics。這個插件可以統計項目中的源碼行數。例以下面是我統計 dubbo 項目源碼的截圖,它會列出每一個 java 文件的源碼行數,以及總共的行數。

640

從上面的截圖咱們能夠看到 dubbo 項目裏,源碼的行數有 11 萬行。這樣一來,本身心理也有個大體的預期了。接下來,我會把這些數據拷貝出來,放在一個 Excel 表格裏,就像下面這樣子:

640

在 Excel 表格中,我只會存放每一個源碼文件的名字、其源碼行數、源碼行數佔比。接下來我會按着入口,一個個去看源文件,把每一個方法看過一遍,看過的方法我會寫一個註釋,例如:csy mark,並寫上個人註釋。

當我把一個文件都看過以後,我會把 Excel 表格中對應的文件最右邊一列,寫上其百分比。最後我會在下邊有一行,統計我所看完文件的百分比。

640

我每看完一個方法,我就寫一個 csy done 來鼓勵下本身。每看完一個文件,我就在 Excel 中把它標記爲完成,最下邊的已讀百分比也會跟着不斷升高。經過這種方式,我讓枯燥無味的源碼閱讀,有些一點趣味,有了一些目標。

通讀源碼是最枯燥的,最容易沒有方向和目標的。有了數字化的記錄,你能夠知道本身如今的進度是怎麼樣,看了多少的源碼。不少時候咱們看了好久,發覺沒什麼進度的樣子,又不想看了。

這時候你能夠給本身定一個目標,例如:一天看完 5% 的源碼就能夠休息。那當你想偷懶的時候,看看 Excel 下方的已讀百分比,還沒到 5%,繼續看吧。

這種方式對於我來講,仍是有必定做用的。但對於大家不知道有沒有做用,大家能夠嘗試一下。若是有用的話,就來評論告訴我吧。

5、梳理框架

在通讀源碼的過程當中,你就會對框架有許多新的認識,會知道這個框架大體分爲哪幾個部分,每一個部分的做用是什麼,這個模塊用了什麼設計理念等等。

若是說上個階段是通讀源碼,那麼這個階段就是要把你在通讀源碼過程當中的收穫整理出來。在整理的過程當中,你確定會有更多的疑問,你會不斷地細化,不斷地精讀。

6、批判性思考

經過了上面幾個階段,你會發現你對這個框架有了總體的認識,而且對每一個模塊的實現細節都有了比較深入的認識。這個時候,你能夠想想爲何它要這麼作,這麼作有什麼好處,那能用另外一種方式作得更好嗎?

7、總結

上面幾個階段是我閱讀幾個框架源碼以後的一些體會,相信會是一個不錯的源碼閱讀指南。若是你有更好的源碼閱讀經驗或方法,歡迎留言與我交流。

相關文章
相關標籤/搜索