讀代碼這事,先要分是精讀還是泛讀。
從學(xué)習(xí)的目的來(lái)看,一定要精讀一定量的經(jīng)典代碼。而精讀是指每行都讀懂,不看代碼腦子里就能勾畫(huà)出程序的基本結(jié)構(gòu)。
這里有個(gè)很形象的狀態(tài),精讀代碼時(shí)會(huì)滿腦子都是代碼,放不下,甚至睡覺(jué)前腦子里也是代碼。
但這一篇里主要不是關(guān)注如何精讀代碼的,而是關(guān)于如何在工作中掌握既有代碼的,等價(jià)于泛讀。
現(xiàn)存的很多系統(tǒng)往往很大,幾十萬(wàn)行的可能也只算普通。
這時(shí)候一旦加入了這樣一個(gè)項(xiàng)目,那么如何去讀代碼?
下面說(shuō)點(diǎn)個(gè)人體會(huì)。
讀這類(lèi)代碼前,先得把規(guī)格大致弄清楚,而不能上來(lái)就讀,比如:對(duì)于應(yīng)用型程序,你要先大致整清楚它的使用方法。
如果其中有涉及到領(lǐng)域知識(shí),比如:流程、財(cái)會(huì)等,那也最好預(yù)先有些認(rèn)識(shí)。這類(lèi)東西從代碼里反推回來(lái)是不太可能的。
我個(gè)人感覺(jué)這對(duì)讀程序是個(gè)很大的障礙,你不知道編碼規(guī)則,卻去讀編碼的程序,總是會(huì)云里霧里,這時(shí)候反倒不是因?yàn)槌绦螂y,
而是因?yàn)椴恢莱绦蛑兴膶?zhuān)業(yè)知識(shí)。
在這一步里,最好能抽取出來(lái)幾個(gè)典型的應(yīng)用場(chǎng)景,這在后面有用。
一旦開(kāi)始接觸代碼,那要先弄清楚代碼的基本靜態(tài)結(jié)構(gòu)。如:包構(gòu)成、類(lèi)構(gòu)成等。
這里涉及一個(gè)層次問(wèn)題。一下子把層次探的太深,就容易盯在細(xì)節(jié)上出不來(lái)。
有設(shè)計(jì)文檔的項(xiàng)目,大致上可以通過(guò)包來(lái)界定這個(gè)層次。
沒(méi)設(shè)計(jì)文檔的就可怕了,只能靠自己劃分,最好不要超過(guò)10個(gè),超過(guò)了真記不住。
在靜態(tài)結(jié)構(gòu)這步,要弄清楚每個(gè)部分的核心職責(zé),可以簡(jiǎn)單,最好能記住。
接下來(lái)就要用到上面的典型場(chǎng)景了。
要在典型場(chǎng)景下考察上面的靜態(tài)結(jié)構(gòu)是如何發(fā)揮作用的。
典型場(chǎng)景下用到的接口往往就是關(guān)鍵的接口,要整清楚,他們的定義和作用。
也要整清楚,典型場(chǎng)景下數(shù)據(jù)流的變遷。
這步驟算是弄清楚代碼的時(shí)序。很像UML里的Sequence圖。
但牽涉到數(shù)據(jù)的時(shí)候,一般需要對(duì)數(shù)據(jù)的規(guī)格有所了解。
接下來(lái)要關(guān)注進(jìn)程、線程的結(jié)構(gòu)。比如:都是什么時(shí)候開(kāi)始、什么時(shí)候結(jié)束的,在上述典型場(chǎng)景下都負(fù)責(zé)干什么。
上述四步(規(guī)格、靜態(tài)結(jié)構(gòu)、典型場(chǎng)景、進(jìn)程線程)完成后,對(duì)程序的第一次泛讀完成。
檢驗(yàn)標(biāo)準(zhǔn)很簡(jiǎn)單,這時(shí)應(yīng)該能夠單靠紙筆描述出程序典型場(chǎng)景的Sequence圖。
干這事兒的時(shí)候,要抑制自己的求知欲,因?yàn)榭偸呛芟朐谡{(diào)試器里通過(guò)call stack把一個(gè)功能的實(shí)現(xiàn)細(xì)節(jié)整清楚,
但至少在第一個(gè)層次里,可以先不要這樣。
第一次泛讀后,就要進(jìn)入深掘的過(guò)程,針對(duì)的對(duì)象應(yīng)該是自己會(huì)負(fù)責(zé)的部分。這部分功能往往會(huì)隱藏在某個(gè)接口之下。
這時(shí)候一般來(lái)講可以放過(guò)功能型的模塊,比如:XML解析的模塊等。其他部分可以認(rèn)為是需要把之前所說(shuō)的四個(gè)步驟再重復(fù)一下。
但這時(shí)候要關(guān)注細(xì)節(jié)和調(diào)用堆棧了。
不管是在那個(gè)讀代碼的層次,有兩個(gè)基本技巧總是需要的,一個(gè)是要掌握具體程序里內(nèi)嵌的Log機(jī)制,要能看Log,必要時(shí)可能還得加Log;一個(gè)是基本調(diào)試方法。
調(diào)試很難展開(kāi),《軟件調(diào)試》一書(shū)寫(xiě)了1000多頁(yè)。
但只停留在設(shè)個(gè)斷點(diǎn)等他停下來(lái)這個(gè)層次上還是會(huì)有點(diǎn)欠缺的。條件斷點(diǎn)、多線程調(diào)試、多進(jìn)程時(shí)的調(diào)試還是要知道一點(diǎn)的。
程序類(lèi)型太多,因此估計(jì)讀程序的方法也很多。上面只是個(gè)人的一點(diǎn)經(jīng)驗(yàn),歡迎補(bǔ)充。