這個(gè)問題簡(jiǎn)單,程序從哪里開始就哪里開始讀起。譬如,C 代碼,當(dāng)然是從 main(),其他語言也是類似的。但閱讀的時(shí)候,要帶著問題去讀。
帶著最簡(jiǎn)單的問題,開始閱讀源碼。
拿到一個(gè)別人寫的代碼,或多或少,細(xì)節(jié)有很多,不可能一開始就能把所有的細(xì)節(jié)都吃透,所以需要一個(gè)簡(jiǎn)單的問題先把整個(gè)代碼系統(tǒng)的閱讀一遍,知道里面的整體框架是怎么樣的。譬如 Memcache/Redis 這種 key/value 系統(tǒng),當(dāng)它們收到一個(gè) set/get key 請(qǐng)求,是如何做相應(yīng)的呢?整個(gè)服務(wù)是如何運(yùn)作起來的?譬如 Django,當(dāng)它拿到一個(gè) HTTP 請(qǐng)求,是如何做相應(yīng)的呢?帶著這些簡(jiǎn)單的問題,瀏覽源代碼能更快了解它們的代碼框架是怎么樣的,對(duì)于之后繼續(xù)閱讀里面的模塊,也是非常有好處的。
讀源代碼,框架才是最先需要了解的,細(xì)節(jié)才是最重要的。
看到一個(gè)函數(shù), 首先要做的是知道這個(gè)函數(shù)到底做了什么, 而不是他底層是怎么實(shí)現(xiàn)的。這有點(diǎn)類似于英語中的閱讀理解,遇到文中陌生的單詞,首先是根據(jù)上下文來判斷它是什么意思,到最后真的不能理解再回頭拿字典去查單詞。
忽略變量聲明。好的開源 C 代碼會(huì)將所有變量提前聲明,即放在函數(shù)的開頭。實(shí)際上,沒必要例會(huì)這一大坨的變量,等遇到用到這個(gè)變量的時(shí)候自然就能懂得這個(gè)參數(shù)是用來做什么,而不用我們首次見到就猜測(cè)它的用處。 畫出函數(shù)的調(diào)用鏈,用自己認(rèn)為最合適的圖表說明問題。有時(shí)候 Redis 里面的調(diào)用鏈比較長(zhǎng),經(jīng)常畫滿一張 A4 紙。在每個(gè)函數(shù)旁邊都標(biāo)注它所完成的事情,這是收集線索的一個(gè)過程,可能會(huì)非常的枯燥。
我會(huì)在小冊(cè)子的最后推薦幾款源碼閱讀的軟件。