在軟件開(kāi)發(fā)中遇到問(wèn)題的時(shí)候,我傾向于在不需要閱讀源碼的情況下解決問(wèn)題竞帽,我會(huì)優(yōu)先去查官方文檔扛施、FAQ鸿捧、google或stackoverflow等網(wǎng)站,去看下有沒(méi)有前人已經(jīng)遇到過(guò)同類問(wèn)題疙渣。閱讀源碼來(lái)解決問(wèn)題匙奴,算是殺手锏。當(dāng)然妄荔,還有另一種需求泼菌,就是希望通過(guò)閱讀源碼了解軟件的設(shè)計(jì)細(xì)節(jié),來(lái)達(dá)到學(xué)習(xí)的目的啦租,例如哗伯,通過(guò)閱讀Dubbo的源碼,我可以了解一個(gè)RPC框架的設(shè)計(jì)細(xì)節(jié)刷钢。
前提
閱讀源碼之前要做一定的準(zhǔn)備工作笋颤。
首先,確保自己掌握了相關(guān)的基礎(chǔ)知識(shí)内地,例如伴澄,如果你要閱讀Linux內(nèi)核源碼,要掌握C語(yǔ)言的語(yǔ)法阱缓、操作系統(tǒng)的基本概念和原理非凌,如果你要閱讀Spring的源碼,要掌握J(rèn)ava語(yǔ)言基礎(chǔ)荆针、Maven的使用敞嗡、一些設(shè)計(jì)模式等等;
第二航背,要學(xué)會(huì)使用這個(gè)軟件或框架喉悴,了解這個(gè)軟件或框架的使用場(chǎng)景,有什么功能玖媚,同類競(jìng)品有哪些箕肃,在學(xué)習(xí)使用軟件或框架的過(guò)程中,最重要的參考資料是官方文檔今魔,一款優(yōu)質(zhì)的軟件或框架勺像,官方文檔一般包括三塊:快速開(kāi)始,即一些demo错森;參考文檔吟宦,最詳細(xì)的文檔,包括概念涩维、特性的解讀殃姓;FAQ:對(duì)于使用者來(lái)說(shuō)常見(jiàn)的問(wèn)題的解答;
第三,初步了解代碼的整體組織結(jié)構(gòu)辰狡,每個(gè)文件夾是做什么用的锋叨。
調(diào)試環(huán)境
調(diào)試環(huán)境非常重要,有了調(diào)試環(huán)境宛篇,就可以根據(jù)需要進(jìn)行斷點(diǎn)娃磺,對(duì)閱讀源碼非常有幫助。至于說(shuō)如何搭建調(diào)試環(huán)境叫倍,不同的情況有不同的處理辦法偷卧,例如MAT的源碼,我是先將它的核心邏輯剝離出來(lái)吆倦,然后自己用單元測(cè)試進(jìn)行調(diào)試听诸;對(duì)于Dubbo源碼,我則是寫了一個(gè)Dubbo服務(wù)提供者蚕泽、一個(gè)Dubbo服務(wù)消費(fèi)者晌梨,以及安裝了ZK之后才搭建起來(lái)的;對(duì)于Spring最簡(jiǎn)單了须妻,利用Spring Boot啟動(dòng)一個(gè)hello word的demo就可以仔蝌。
場(chǎng)景閱讀
在做完上述準(zhǔn)備工作后,我會(huì)按照使用功能或場(chǎng)景來(lái)閱讀源碼荒吏,例如敛惊,在閱讀MAT(內(nèi)存分析工具)的源碼的時(shí)候,我是按照以下幾個(gè)步驟來(lái)閱讀:文件解析绰更、索引創(chuàng)建瞧挤、類直方圖查詢、支配樹(shù)查詢儡湾、線程視圖查詢等等特恬;在閱讀Spring源碼的時(shí)候,我會(huì)按照Spring容器的啟動(dòng)徐钠、IoC的工作過(guò)程鸵鸥、AOP的工作過(guò)程、靜態(tài)屬性的引入等功能來(lái)閱讀丹皱;在閱讀Dubbo源碼的時(shí)候,我會(huì)按照服務(wù)發(fā)布宋税、服務(wù)訂閱摊崭、服務(wù)調(diào)用三個(gè)主要場(chǎng)景進(jìn)行源碼閱讀。按照功能或場(chǎng)景閱讀杰赛,可以讓我們從整體上對(duì)代碼有所理解呢簸,然后就可以進(jìn)入自己關(guān)注的一些細(xì)節(jié)了,例如:在MAT中,索引文件是如何創(chuàng)建的根时,在Dubbo中瘦赫,請(qǐng)求的超時(shí)機(jī)制和心跳機(jī)制是如何實(shí)現(xiàn)的。
總結(jié)
閱讀源碼的過(guò)程中蛤迎,我總結(jié)出了一些需要注意的點(diǎn):
自頂向下閱讀确虱,先把握整體的、大的流程替裆,然后再根據(jù)需要切入到對(duì)應(yīng)的分支
忽略一些細(xì)節(jié)校辩,例如參數(shù)的檢查、錯(cuò)誤的處理辆童、數(shù)據(jù)形式的轉(zhuǎn)換和存儲(chǔ)
盡量準(zhǔn)備好調(diào)試環(huán)境
要關(guān)注核心的業(yè)務(wù)邏輯或算法
最好能在閱讀的過(guò)程中輸出一些筆記或文檔宜咒,例如模塊劃分圖、函數(shù)的流程圖把鉴、針對(duì)某個(gè)業(yè)務(wù)場(chǎng)景故黑,在幾個(gè)模塊之間的時(shí)序圖等等,這些文檔可以先手寫庭砍,然后再形成電子版存檔场晶。