看源代碼時,你喜歡怎麼做筆記?


新手,因為畢業課題的原因,最近在看LinxCNC的源代碼,核心代碼大概10M左右,頭一次看開放源代碼,走了很多彎路,以LinuxCNC為例說說我的一點感受,可能有點跑題,請見諒。

  1. 不要一上來就啃源代碼,去搜索和代碼對應的『代碼架構圖』和『開發者手冊』,後者會提供代碼的設計思路和很多概念的說明,還會將代碼中的注釋進行整理匯總,非常有用。當我看了2天的代碼,即將要崩潰時,@huha 找到了『數據流圖』和『開發者手冊』。
  2. 在LinuxCNC的根目錄下有directory.map,是為代碼的組織框架,根據這個,可以快速定位到核心的代碼所在的文件夾。
  3. LinuxCNC的核心代碼有2個文件夾,每個又包含有幾十個c文件和h文件。切忌一開始就將精力放在細節上,開始我通過c文件的名字尋找我覺得重要的代碼,然後逐行逐字地看,花了很多時間,完全摸不著方向,挫敗感很強。
  4. 後來經師兄的提醒,逐個看c文件,只關注『函數名』和是否為內部函數,『頭文件、變數、輸入參數、輸出參數』都忽略掉,並根據注釋或函數名大致確定每個函數的功能,整理成文檔。
  5. 經過第4部,就能知道哪些c文件是核心,哪些函數是核心中的核心,然後從某一個函數開始,跟蹤到無法跟蹤下去為止,可以用『樹狀結構』記錄這些調用關係,經過這步後會對代碼整個的操作流程有個整體的認識。這個過程當中需要留意源碼中的注釋,那是很多前輩的智慧,他們將思考、疑問、心得都寫下來,今天看到了一句注釋『This is the brains of the operation.』,激動啊。因為還不清楚『數據結構』,所以這時的認識很籠統。
  6. 從核心c文件包含的頭文件開始,梳理『數據結構』,LinuxCNC裡面有大量的結構體,建議將重要的『數據結構』整理出來。
  7. 接下來goto第5步,不過要挖的細一些,碰到不懂的『數據結構』,goto第6步,有啥新心得體會都記錄下來,until你覺得看懂了源代碼。

ps,看源碼是一個來回跳轉的過程,需要一個好的工具,至少得具有『語法高亮』『宏、變數、函數列表』以及強大的跳轉功能,我用的是Vim。


如果是 OOP,首選當然是 UML 建模了,邊讀源碼邊畫圖,好處多多。

包圖 - 基本架構組織,分層

類圖 - 核心對象、介面,依賴關係

交互圖 - 執行流程,消息走向,調用關係

活動圖(加強版流程圖) - 核心演算法,任務流程

狀態圖。。。

而且在圖形旁邊加文本注釋,也是很優雅。

我暫時想不出還有比這更好的筆記方式。一圖勝千言,UML 建模遠強於連篇累牘、可讀性差的文字記錄。


我很喜歡的一個方式是畫流程圖,順著main函數一直畫下去,然後就清晰很多了。離職前,把自己做的一個項目的流程圖畫出來了,然後基本上接手的同事沒問多少問題,就接過去了


我喜歡寫注釋,注釋的內容包括:

1:暫時不理解的東西,寫一些「為什麼」

2:寫一些感悟,比如之前就知道但不太理解的知識,現在看代碼的時候頓悟,然後寫「XXX,原來是這樣呀!哈哈哈」


時髦的做法是一種叫做「Mikado Graph」的程序拓撲圖。這種圖從某一個函數或者Class入手,把它需要的上游邏輯一一列舉出來直到最後沒有上游邏輯為止。可以說是一種特殊的Dependency Graph。

這個方法在研究陌生代碼(尤其是需要短時間內做Debug的時候)很有幫助。


@岳武 大師兄,我也在苦心研究linuxcnc源代碼中,願意一起研究嗎,我有一個linuxcnc的群,群號是:302377173,歡迎入群,群里都是熱心於研究linuxcnc的小夥伴們,大家一起學習交流吧~


推薦閱讀:

運維人員如何搭建堡壘機(跳板機)?
如何用開源飛控PIXHAWK進行二次開發?
魅族開放了M9,MX,MX2的內核源代碼,這意味著什麼?
Alljoyn 是什麼樣的技術,有哪些優缺點?
如果魔獸世界的代碼開源了會有什麼有趣的影響?

TAG:編程 | 代碼 | 開源 | 源代碼 | UML建模 |