1. 程式人生 > >轉知乎:如何閱讀原始碼-- 原始碼理解不是讀出來的,是用來debug出來的.

轉知乎:如何閱讀原始碼-- 原始碼理解不是讀出來的,是用來debug出來的.

首先先強調一個觀點,原始碼不是讀出來的,而是debug出來的(標題黨).

0.首先還是要知道怎麼用,大體的概念,當你只通過原始碼閱讀遇到瓶頸時,debug就能掃清你的疑問.在對應的地方設定debug.(特別是call hierechary流程特別長時,)

1. 第一句話偏激了點,但debug在毫無文件的情況下是一個保底通用方法: 如果讀原始碼費勁時,那麼請debug瞭解執行流程和啟動流程.(知道了業務和設計文旦,但不一定知道很細的各個類的作用)

2. 可以從啟動的列印入手,把日誌級別開為debug

3. 再返回去了解架構什麼的.

4.

 4.1 業務系統,有表的先看錶.  後面看能不能將表拆出. 業務垂直切割,水平分割. 還有就是邊界. 功能需求,效能需求,安全需求.

 4.2中介軟體系統. 啟動過程,配置配置過程(spring的FactoryBean定義過程,FactoryBean的例項化過程).執行過程,將程式碼分層. 哪些是DO,哪些是中間BO. 框架看回調,模式看回調,看介面. 然後就是演算法邏輯了.

看到知乎幾位同學所答,甚為同意

0. 使用過,看使用者文件,下載可執行包進行使用。

1. 使用過,或者知道是幹什麼的

2. 看設計文件,理解大概(能理解對應的術語和背後的領域含義)

     注:大部分情況,1,2,3 都沒有啥問題。只有極少數情況才會有問題。 如果1,2都不過關,那就要去補基礎知識。或者先看他的使用者文件,進行使用。

3. 看quick start 或者自己找個單測跑跑

4. 大致理解單測結構和程式碼結構。整理出程式碼結構文件。這個是看細節程式碼比較重要的。

5. 帶著設計文件沒有介紹的問題去跑單測,debug (從而看懂程式碼)理解持久化類(資料庫物件,檔案物件)/長期記憶體類(例如:執行緒池物件,連線池物件,執行緒,連線),忽略Bussiniss Object

     例如kafka 的分割槽和rocketmq的分割槽的區別,即持久化區別。

     這個比較難的,如果沒有人能直接回答的話。設計文件上也沒有明確說明。好在rocketmq上已經回答了該問題。

6. 畫出模組圖和框架圖

程式碼結構圖可以是這樣的


1.連結:http://www.zhihu.com/question/21186887/answer/18200218

來源:知乎

1:讀文件。儘管讀了文件你不一定知道每一個程式碼的細節,但是如果你瞭解那個問題的話,你一定知道怎麼寫可以寫出一個滿足文件的內容。這個時候大腦裡面就可以有個框架,先猜一猜,然後看程式碼,事半功倍。這樣你還可以學到新的知識,如果程式碼跟你寫的不一樣,要麼就是你傻逼,要麼就是作者傻逼,你總會學到東西的。
2:找不到好的文件,就看他的測試用例,也是有一樣的功效的。因為測試都是從文件出發編寫的,而不是從程式碼出發編寫的。

3:找不到文件和測試用例?請聯絡作者。作者不肯給,就換一個庫。

2. 連結:http://www.zhihu.com/question/21186887/answer/18206842
來源:知乎

讀程式碼還是要層次化、帶著問題去閱讀:
  • 首先整體瞭解這個軟體是幹什麼,使用者是誰?解決什麼問題?包含哪些大的模組,各個模組的作用是什麼,各個模組的呼叫關係怎麼樣?
  • 然後對於每一個模組,這個模組是幹什麼的?為什麼要有這個模組?這個模組怎麼實現的?
  • 最後細化到每一個包,每一個類,每一個函式方法。
從上到下,一一擊破每一個問題,認真去思考他這樣設計、寫程式碼的好處,因為好的軟體都會滿足這種從抽象->具體的原則的。
個人不不喜歡bottom-up的閱讀方法,有時候會一頭扎進去,出不來了。
這種方式適合讀一些比較優秀的開源專案的程式碼,也會很好地提高內功。
3.連結:http://www.zhihu.com/question/21186887/answer/18229165
來源:知乎

過去一個月做專案看前人程式碼,彙編、C、微控制器、VB差不多幾萬行,基本沒註釋沒文件,到現在也有些許經驗,希望有所幫助:
先從main()開始,top-down地畫出整個程式的流程圖(動圖),撿主要的大function出來作為節點,然後看每個節點的作用是什麼,節點之間如何互動,期間穿插bottom-up的方法補充細節。
更多的,其實看陌生程式碼整個人的思路是非線性的,重要的是堅持看下來,時間長了自然就熟悉前人思路了。 最後得到類圖(靜態圖) 說到這個會被很多問題卡住。上次看druid原始碼,想mvn編譯下,發現jar包找不到。 明明pom裡配置了本地檔案系統的reposity
<repositories>
   <repository>
      <id>local-file</id>
      <url>file://${basedir}/lib/</url>
      <layout>default</layout>
   </repository>
</repositories>

查了半天,突發奇想,看看maven的settings.xml檔案,發現裡面有個mirror,直接把所有源都映象遮蔽了,難怪下載不到。吐血。如果對mirror不熟悉的話,得找死。

當碼農真辛苦啊。