源碼閱讀的三個境界,我服了!

沒有經歷的手藝差根柢薄的低級軌範員,若何閱讀項目源碼? "

"有人閱讀過 mybatis 的源碼嗎 ?就看一個初始化過程就看的已經頭暈目炫了,小夥伴們支支招吧!"

"源碼應該怎樣閱讀,我已經考試考試閱讀一些源碼,例如alibaba的druid中sqlparser局部,spring-mvc,可是創造很費勁,都說debug是最好的閱讀編制,我在debug時經常有跟丟的徵象……就是走著走著感受彷彿進入了一些我當前不太關注細枝末節。 "

。。。。。。

源碼閱讀的三個境界,我服了!

估量良多人都有如許的迷惑。

我很是能理解小夥伴們的疾苦,由於我也是這麼疾苦著走過來的。

閱讀優秀源碼的好處想必大師都曉得,進修別人優秀的設計,合理的籠統,精練的代碼...... 總之是好處多多。

可是真的把複雜的代碼放到你的面前,就如統一個龐大的迷宮,要在其中東轉西轉尋出一條路來,把迷宮的整個構造搞清楚,理解焦點思惟,至心不隨意。

在閱讀由面向工具的說話如Java寫的代碼時,會創造接口和詳細的實現經常對應不起來,不太清楚一個功能到底是怎樣在哪個實現類中才能找到。 不像C說話,就是函數挪用函數,相對還好點。

若是是動態說話如Ruby,Python, 一個變量的類型甚至都不隨意曉得,閱讀的難度大大添加。

還有一個重要的緣故緣由,如今我們看到的源碼根基上都經由若干年生長、經由良多人不竭地完滿的,枝枝蔓蔓很是多,魔鬼都在細節中。 閱讀的時辰很隨意陷進去, 看了幾十層函數挪用往後,就徹底懵了,就拋卻了: 甭管你把源碼吹得輕諾寡言, 老子再也不看了。

經由良多疾苦的掙扎往後,我也算有一些成功的履歷,今天用治學的三個境界來類比, 給大師分享一下:

昨夜西風凋碧樹,獨上高樓,望盡海角路

想把源碼搞懂,吃透,首先得登高望遠,瞰察途徑,明晰方針與標的目的,體味源碼的概貌。

所以有些預備工作必需得做。

1. 閱讀源碼之前,必要有必定的手藝儲藏。

比如設計形式,在良多Java源碼中幾乎就是標配,尤其是這幾個:模板編制,單例,不雅觀不雅觀察者,工場編制,代庖署理,計策,裝飾者。

再比如閱讀Spring源碼,必定得先體味IoC是怎樣回事,AOP的實現編制,CGLib,Java動態代庖署理等,本身脫手,寫點相干的代碼,把這些知識點把握了。

2. 必需得會使用這個框架/類庫, 最好是精曉各類各樣的用法。

上面剛提過,魔鬼都在細節中,若是有些用法根柢不曉得,可能你能看明白代碼是什麼意思,可是不曉得它為什麼這些寫。

3. 先去找書,找質料,體味這個軟件的團體設計。

都有哪些模塊? 模塊之間是怎樣聯絡關係的?怎樣聯絡關係的?

可能一會兒理解不了,可是要建立一個團體的概念,就像一個輿圖,防止你迷航。

在讀源碼的時辰可以時不時看看本身在什麼地方。

4. 搭建體系,把源代碼跑起來!

信託我,Debug是非常很是重要的手段, 你想經由過程只看而不運轉就把體系搞清楚,那是根柢不成能的!

衣帶漸寬終不悔,為伊消得人憔悴。

5. 按照你對體系的理解,設計幾個首要的測試案例,界說好輸入,輸出。

運轉體系,漸漸地debug ,一步步地走,這是個死功夫,沒有方法繞過。

Debug一遍必定是不行的,必要Debug良多遍。

第一遍儘可能拋棄細節,捉住首要流程, 比如有些看起來不重要的編制就不進去看了。

第二遍、第三遍....再去看那些細節。

一個很是重要的工作就是記筆記(又是寫作!),畫出體系的類圖(不要依靠IDE給你生成的), 記實下首要的函數挪用, 便當後續檢察。

文檔工作極為重要,由於代碼太複雜,人的大腦容量也有限,記不居處有的細節。 文檔可以輔佐你記住關頭點, 到時辰可以回憶起來,敏捷地接著往下看。

要不然,你今天看的,可能到明天就忘個差不多了。

給大師看看我做的一些筆記, 名目不重要,很隨意,便當本身看懂就行。

源碼閱讀的三個境界,我服了!

。。。。

源碼閱讀的三個境界,我服了!

。。。。。。

源碼閱讀的三個境界,我服了!

6. 首要的測試案例搞明白了,豐盛測試案例,考慮一些分主流程。

繼續Debug......

總之,靜態地看代碼 + 動態地debug (從業務的角度), 就會漸漸揭開這個烏黑森林的面紗。

這一步會很是很是地破耗時辰,可是你做完了,對體系的理解絕對有質的飛躍。

眾裡尋他千百度,驀然回首回頭回憶,那人卻在燈火衰退處。

沒有千百度的上下求索,不會有霎時的頓悟和理解,衷心祝福閱讀源碼的伴侶們都能到達這一境界。

末了一點,也是最關頭的一點: 要能堅持下去。

我不是一個聰明人, 可是笨人自有笨方法:什麼事都架不住不竭的頻頻,一遍看不明白,再來第二遍, 兩遍搞不明白,再來第三遍......

可能有人要問: 你怎樣能這麼堅持地刨根問底呢?

謎底就是獵奇心: 這玩意兒到底是怎樣實現的?!

源碼閱讀的三個境界,我服了!


分享到:


相關文章: