閱讀原始碼的第一個工具,就是你手中的code base。把它編譯出來,執行它,加log,試著修改一些資料和程式碼,看看有什麼變化。第二個重要的工具就是debugger,而debugger最重要的功能是獲取call stack。在你感興趣的use case裡pause一下,在你不知道有什麼用的函數里加個斷點,顯示出來的call stack都能讓你對系統有更清晰的認識。一個軟體系統就是一個小宇宙。別期待有什麼高明的文件。要把自己當成探求自然真理的物理學家。
閱讀原始碼的第一個工具,就是你手中的code base。把它編譯出來,執行它,加log,試著修改一些資料和程式碼,看看有什麼變化。第二個重要的工具就是debugger,而debugger最重要的功能是獲取call stack。在你感興趣的use case裡pause一下,在你不知道有什麼用的函數里加個斷點,顯示出來的call stack都能讓你對系統有更清晰的認識。一個軟體系統就是一個小宇宙。別期待有什麼高明的文件。要把自己當成探求自然真理的物理學家。
必須找好切入點。你要解決什麼問題。是要fix bug;還是要把這個系統和其它模組整合;還是要增加新功能。物理學家沒有上來就研究整個宇宙的,必須選好分支。如果你有一個猜想,但是又和你的目標關聯不太大,那就堅持這個猜想,直到出現明顯反例。物理學有很多這樣的例子,和數學不同,為了旁支猜想投入過多研究是不明智的。如果有明顯證據證明你的某個旁支猜想大錯特錯,你就要放棄主要目標,暫時把解決旁支猜想作為主要目標。比如,你本來以為某個結構是LRU的cache,結果發現怎麼做都不對,那就先放棄原來的目標,專門研究這個結構的用途。對於旁支猜想的不斷切換,要做好自己的task stack保留。在旁支猜想解決之後,要根據結論儘快回到上次中斷的任務。複雜的軟體系統更像一個動物,待久了你會了解它的脾性。有些是透過邏輯,有些是透過感覺。玩車的尚且有這種感覺,我們玩的東西比車複雜上萬倍,就更不能對它缺乏感情投入。(這也是我不愛做企業開發的原因,我不愛養個爬行類當寵物,還是貓貓狗狗的親切。)