做者:劉欣 公衆號:碼農翻身
連接:http://mp.weixin.qq.com/s/PDhEKM2XG_qzOmBjWb-M7Q
"沒有經驗的技術差底子薄的初級程序員,如何閱讀項目源碼? "程序員
"有人閱讀過 mybatis 的源碼嗎 ?就看一個初始化過程就看的已經頭暈眼花了,小夥伴們支支招吧!"spring
"源碼應該怎麼閱讀,我曾經嘗試閱讀一些源碼,例如alibaba的druid中sqlparser部分,spring-mvc,可是發現很吃力,都說debug是最好的閱讀方式,我在debug時常常有跟丟的現象……就是走着走着感受好像進入了一些我當前不太關注細枝末節。 "sql
。。。。。。設計模式
估計不少人都有這樣的疑惑。spring-mvc
我很是能理解小夥伴們的痛苦,由於我也是這麼痛苦着走過來的。mybatis
閱讀優秀源碼的好處想必你們都知道,學習別人優秀的設計,合理的抽象,簡潔的代碼...... 總之是好處多多。mvc
可是真的把龐大的代碼放到你的面前,就如同一個巨大的迷宮,要在其中東轉西轉尋出一條路來,把迷宮的整個結構搞清楚,理解核心思想,真心不容易。框架
在閱讀由面向對象的語言如Java寫的代碼時,會發現接口和具體的實現常常對應不起來,不太清楚一個功能究竟是怎麼在哪一個實現類中才能找到。 不像C語言,就是函數調用函數,相對還好點。函數
若是是動態語言如Ruby, Python,一個變量的類型甚至都不容易知道,閱讀的難度大大增長。學習
還有一個重要的緣由,如今咱們看到的源碼基本上都通過若干年發展、通過不少人不斷地完善的,枝枝蔓蔓很是多,魔鬼都在細節中。 閱讀的時候很容易陷進去, 看了幾十層函數調用之後,就完全懵了,就放棄了: 甭管你把源碼吹得天花亂墜, 老子不再看了。
通過不少痛苦的掙扎之後,我也算有一些成功的經歷,今天用治學的三個境界來類比, 給你們分享一下:
昨夜西風凋碧樹,獨上高樓,望盡天涯路
想把源碼搞懂,吃透,首先得登高望遠,瞰察路徑,明確目標與方向,瞭解源碼的概貌。
因此有些準備工做必須得作。
1. 閱讀源碼以前,須要有必定的技術儲備。
好比設計模式,在不少Java源碼中幾乎就是標配,尤爲是這幾個:模板方法,單例,觀察者,工廠方法,代理,策略,裝飾者。
再好比閱讀Spring源碼,確定得先了解IoC是怎麼回事,AOP的實現方式,CGLib,Java動態代理等,本身動手,寫點相關的代碼,把這些知識點掌握了。
2. 必須得會使用這個框架/類庫, 最好是精通各類各樣的用法。
上面剛提過,魔鬼都在細節中,若是有些用法根本不知道,可能你能看明白代碼是什麼意思,可是不知道它爲何這些寫。
3. 先去找書,找資料,瞭解這個軟件的總體設計。
都有哪些模塊? 模塊之間是怎麼關聯的?怎麼關聯的?
可能一會兒理解不了,可是要創建一個總體的概念,就像一個地圖,防止你迷航。
在讀源碼的時候能夠時不時看看本身在什麼地方。
4. 搭建系統,把源代碼跑起來!
相信我,Debug是很是很是重要的手段, 你想經過只看而不運行就把系統搞清楚,那是根本不可能的!
衣帶漸寬終不悔,爲伊消得人憔悴。
5. 根據你對系統的理解,設計幾個主要的測試案例,定義好輸入,輸出。
運行系統,慢慢地debug ,一步步地走,這是個死功夫,沒有辦法繞過。
Debug一遍確定是不行的,須要Debug不少遍。
第一遍儘量拋棄細節,抓住主要流程, 好比有些看起來不重要的方法就不進去看了。
第二遍、第三遍....再去看那些細節。
一個很是重要的工做就是記筆記(又是寫做!),畫出系統的類圖(不要依靠IDE給你生成的), 記錄下主要的函數調用, 方便後續查看。
文檔工做極爲重要,由於代碼太複雜,人的大腦容量也有限,記不住全部的細節。 文檔能夠幫助你記住關鍵點, 到時候能夠回想起來,迅速地接着往下看。
要否則,你今天看的,可能到明天就忘個差很少了。
給你們看看我作的一些筆記, 格式不重要,很隨意,方便本身看懂就行。
6. 主要的測試案例搞明白了,豐富測試案例,考慮一些分支流程。
繼續Debug......
總之,靜態地看代碼 + 動態地debug (從業務的角度), 就會慢慢揭開這個黑暗森林的面紗。
這一步會很是很是地花費時間,可是你作完了,對系統的理解絕對有質的飛躍。
衆裏尋他千百度,驀然回首,那人卻在燈火闌珊處。
沒有千百度的上下求索,不會有瞬間的頓悟和理解,衷心祝願閱讀源碼的朋友們都能達到這一境界。
最後一點,也是最關鍵的一點: 要能堅持下去。
我不是一個聰明人, 可是笨人自有笨辦法:什麼事都架不住不斷的重複,一遍看不明白,再來第二遍, 兩遍搞不明白,再來第三遍......
可能有人要問: 你怎麼能這麼堅持地刨根問底呢?
答案就是好奇心: 這玩意兒究竟是怎麼實現的?!
(完)