天天看點

如何閱讀大型代碼庫?

Casey問我:“對于新手,有什麼有針對性的訣竅來閱讀大型代碼庫嗎?”

碰巧,我認為這是一個非常好的問題。我覺得想要成為一個優秀的開發者,閱讀代碼庫并弄清清楚内部是怎麼回事的能力非常重要。在你的職業生涯中你會中途加入一個現有的項目并被要求迅速融入進去。或者,甚至更難,會有一個項目丢給你讓你自己一個人搞清楚。

最壞的情景就是你被帶入一個項目,要你替換掉讓工程運作失敗的“那些肆無忌憚的*雜種”,并且讓工程運作起來。不過更常見的情景是你被要求維護一個已經離職的員工寫的代碼庫。最後,當然,如果你用了任何開源的項目,很大的可能是被要求“你可以擴充它讓它也能做這個功能嗎?”亦或者你隻是好奇。

尤其是新手程式員,我強烈建議閱讀代碼庫,看看以下我是怎麼做的,然後你需要實際的去閱讀代碼。

當我接觸到新的代碼庫時,我常常忽略文檔和表面的細節。目的是摒棄先入為主的關于它怎麼運作的想法。我試圖從檔案結構上找出項目的結構。僅僅這個就能告訴你很多,我常常試圖找出它的結構。這是整個系統的核心嗎?它是怎麼分割的?等等。

之後我會找到最底層的代碼然後開始閱讀。我常常用字典序來讀。找到一個檔案,讀完它,然後讀下一個檔案。我盡量記錄下來關于這些東西是如何連接配接在一起的(你可以在部落格裡找到關于記筆記的例子),但我做的最多的找到對這個代碼的感覺。有很多代碼常常是項目風格的一部分,比如預處理檢查,日志記錄,抓取錯誤等等。你可以先了解這部分内容,之後就可以忽略它們閱讀有趣的部分。

我通常不在某一點上閱讀太深,我會試圖宏觀的找到感覺。比如:這個檔案通過調用Y和Z傳回了X,但在這個點上閱讀每一個細節對我來講并不真的重要。哦對了,我還記錄筆記,很多筆記。往往它們不是真的筆記而更像是問題清單,在這裡我了解的越多,加入的問題和寫入的回答也就更多。在閱讀完我能找到的最底層代碼之後,我會做一個縱向的比較。這是最讓我能弄清楚事情是如何布局和工作的。這就意味着下一次我來看這部分的時候,對于代碼結構我會有更好的想法。

接下來,我會找有意思的部分。系統當中對我有意思的部分而不是被我束之高閣的部分。

這部分内容很多,但其實要做的并不多。我僅僅是通讀一遍代碼首先找到結構,之後我會認真研讀獨一無二的部分并找出他們是如何寫的。

在這期間,尤其是遇到難點的時候,我會試圖尋找任何文檔(隻要有的話)。對于這一點,我應當首先知道代碼是如何組織的,這樣我才能更快的閱讀文檔。

*原作者注:我一開始隻寫了肆無忌憚,不過這樣更有趣。

繼續閱讀