成為一名更好的程序員:如何閱讀源代碼
閱讀源代碼有許多益處。你會(huì)發(fā)現(xiàn)新的架構(gòu)(construct)和庫(kù),與其他的代碼維護(hù)者產(chǎn)生共鳴,但最重要的是學(xué)會(huì)如何組織代碼,避免因內(nèi)部極其復(fù)雜而變得不可維護(hù)。
但是也有一個(gè)不好的地方,那就是閱讀源代碼太困難了。每當(dāng)我看到一個(gè)新的代碼庫(kù)(code base)時(shí),這種讓人眩暈的感覺(jué)就充斥了我的大腦。我的內(nèi)心告訴我壓根不想趟眼前這趟渾水。
這是(希望是)正常的反應(yīng)。當(dāng)我們的大腦接觸過(guò)多的新東西,就會(huì)產(chǎn)生排斥。造物主賦予我們的這臺(tái)強(qiáng)大的模式匹配機(jī)器根本找不到規(guī)律。所有的抽象(abstraction)都是之前沒(méi)見(jiàn)過(guò)的,類的名稱也毫無(wú)印象。程序又到底是從什么地方開(kāi)始執(zhí)行的?
對(duì)此,我能給出的一般性建議如下:1. 尋找并建立自己能夠理解的初步基礎(chǔ),通常就是主要的入口點(diǎn)(main entry point)。2. 從這個(gè)基礎(chǔ)開(kāi)始,逐步探索主要功能。3. 記錄下自己的見(jiàn)聞。
從頭開(kāi)始
竅門就是給自己一個(gè)起點(diǎn)。我是這樣做的。我通過(guò)-h選項(xiàng)運(yùn)行程序,并調(diào)用help命令。之后我復(fù)制其中一條help文檔字符串,以此為檢索詞搜索一遍代碼庫(kù),找到這個(gè)幫助文檔所在地方。通常情況下,調(diào)用help命令之后你會(huì)發(fā)現(xiàn)離程序的主入口點(diǎn)很近了。
辨明輪廓
找到主入口點(diǎn)之后,我會(huì)運(yùn)行幾個(gè)文檔中提供的示例。然后,我會(huì)試著追蹤主要的代碼塊,大致了解下每個(gè)部分是如何連接起來(lái)的。
我會(huì)問(wèn)自己,是否存在一個(gè)管理程序,負(fù)責(zé)調(diào)用一堆幫助函數(shù)和類?是不是有一些類是平級(jí)關(guān)系,相互之間輪流交換控制權(quán)?是不是有一個(gè)程序逐步執(zhí)行的主任務(wù)隊(duì)列?
了解全局有助于你理清小細(xì)節(jié)。如果你沒(méi)有理解程序的主流程就悶頭讀下去,那你很可能會(huì)被細(xì)枝末節(jié)搞得焦頭爛額。
勤做筆記
我習(xí)慣直接在代碼中做筆記。做筆記的時(shí)候,我會(huì)使用特殊的注釋符(例如,使用#=>,而非常用的#),這樣可以將我自己的筆記與原作者注釋區(qū)分開(kāi)來(lái)。
如果碰到巧妙的技巧、不易理解的流程、編程架構(gòu)(construct)的漂亮使用方式或者是其他任何你想牢記的內(nèi)容,務(wù)必要做筆記。如果你讀不下去了,你也可以做個(gè)記錄,提醒自己之后要回去再讀看不懂的部分。
通過(guò)寫下你的思緒,你實(shí)際上是在把那塊代碼變成你自己寫的。慢慢地,你就會(huì)開(kāi)始在工作中自然地用上新掌握的那些架構(gòu)(construct)。
融匯貫通
學(xué)習(xí)編程,是一個(gè)反復(fù)讀代碼和寫代碼的持續(xù)過(guò)程。只要你愿意接觸不同的風(fēng)格、代碼,最終你會(huì)形成自己的獨(dú)特視角和思維。