在軟件開發(fā)中遇到問題的時候亏娜,我傾向于在不需要閱讀源碼的情況下解決問題,我會優(yōu)先去查官方文檔绑雄、FAQ航夺、google或stackoverflow等網(wǎng)站,去看下有沒有前人已經(jīng)遇到過同類問題腥光。閱讀源碼來解決問題丁存,算是殺手锏。當然柴我,還有另一種需求解寝,就是希望通過閱讀源碼了解軟件的設計細節(jié),來達到學習的目的艘儒,例如聋伦,通過閱讀Dubbo的源碼夫偶,我可以了解一個RPC框架的設計細節(jié)。
前提
閱讀源碼之前要做一定的準備工作觉增。
首先兵拢,確保自己掌握了相關的基礎知識,例如逾礁,如果你要閱讀Linux內(nèi)核源碼说铃,要掌握C語言的語法、操作系統(tǒng)的基本概念和原理嘹履,如果你要閱讀Spring的源碼腻扇,要掌握Java語言基礎、Maven的使用砾嫉、一些設計模式等等幼苛;
第二,要學會使用這個軟件或框架焕刮,了解這個軟件或框架的使用場景舶沿,有什么功能,同類競品有哪些配并,在學習使用軟件或框架的過程中括荡,最重要的參考資料是官方文檔,一款優(yōu)質(zhì)的軟件或框架溉旋,官方文檔一般包括三塊:快速開始一汽,即一些demo;參考文檔低滩,最詳細的文檔,包括概念岩喷、特性的解讀恕沫;FAQ:對于使用者來說常見的問題的解答;
第三纱意,初步了解代碼的整體組織結構婶溯,每個文件夾是做什么用的。
調(diào)試環(huán)境
調(diào)試環(huán)境非常重要偷霉,有了調(diào)試環(huán)境迄委,就可以根據(jù)需要進行斷點,對閱讀源碼非常有幫助类少。至于說如何搭建調(diào)試環(huán)境叙身,不同的情況有不同的處理辦法,例如MAT的源碼硫狞,我是先將它的核心邏輯剝離出來信轿,然后自己用單元測試進行調(diào)試晃痴;對于Dubbo源碼,我則是寫了一個Dubbo服務提供者财忽、一個Dubbo服務消費者倘核,以及安裝了ZK之后才搭建起來的;對于Spring最簡單了即彪,利用Spring Boot啟動一個hello word的demo就可以紧唱。
場景閱讀
在做完上述準備工作后,我會按照使用功能或場景來閱讀源碼隶校,例如漏益,在閱讀MAT(內(nèi)存分析工具)的源碼的時候,我是按照以下幾個步驟來閱讀:文件解析惠况、索引創(chuàng)建遭庶、類直方圖查詢、支配樹查詢稠屠、線程視圖查詢等等峦睡;在閱讀Spring源碼的時候,我會按照Spring容器的啟動权埠、IoC的工作過程榨了、AOP的工作過程、靜態(tài)屬性的引入等功能來閱讀攘蔽;在閱讀Dubbo源碼的時候龙屉,我會按照服務發(fā)布、服務訂閱满俗、服務調(diào)用三個主要場景進行源碼閱讀转捕。按照功能或場景閱讀,可以讓我們從整體上對代碼有所理解唆垃,然后就可以進入自己關注的一些細節(jié)了五芝,例如:在MAT中,索引文件是如何創(chuàng)建的辕万,在Dubbo中枢步,請求的超時機制和心跳機制是如何實現(xiàn)的。
總結
閱讀源碼的過程中渐尿,我總結出了一些需要注意的點:
- 自頂向下閱讀醉途,先把握整體的、大的流程砖茸,然后再根據(jù)需要切入到對應的分支
- 忽略一些細節(jié)隘擎,例如參數(shù)的檢查、錯誤的處理凉夯、數(shù)據(jù)形式的轉(zhuǎn)換和存儲
- 盡量準備好調(diào)試環(huán)境
- 要關注核心的業(yè)務邏輯或算法
- 最好能在閱讀的過程中輸出一些筆記或文檔嵌屎,例如模塊劃分圖推正、函數(shù)的流程圖、針對某個業(yè)務場景宝惰,在幾個模塊之間的時序圖等等植榕,這些文檔可以先手寫,然后再形成電子版存檔尼夺。
上述就是我自己針對源碼閱讀的一些經(jīng)驗尊残,如果你有好的經(jīng)驗或想法,歡迎在留言區(qū)與我交流
本號專注于Java后端技術淤堵、IT行業(yè)雜談寝衫、程序員面試等主題,堅持高質(zhì)量原創(chuàng)產(chǎn)出拐邪,如果你對它的內(nèi)容比較肯定慰毅,歡迎掃碼關注。