在軟體開發中遇到問題的時候,我傾向於在不需要閱讀原始碼的情況下解決問題,我會優先去查官方文件、FAQ、google或stackoverflow等網站,去看下有沒有前人已經遇到過同類問題。閱讀原始碼來解決問題,算是殺手鐗。當然,還有另一種需求,就是希望通過閱讀原始碼瞭解軟體的設計細節,來達到學習的目的,例如,通過閱讀Dubbo的原始碼,我可以瞭解一個RPC框架的設計細節。
前提
閱讀原始碼之前要做一定的準備工作。
首先,確保自己掌握了相關的基礎知識,例如,如果你要閱讀Linux核心原始碼,要掌握C語言的語法、作業系統的基本概念和原理,如果你要閱讀Spring的原始碼,要掌握Java語言基礎、Maven的使用、一些設計模式等等;
第二,要學會使用這個軟體或框架,瞭解這個軟體或框架的使用場景,有什麼功能,同類競品有哪些,在學習使用軟體或框架的過程中,最重要的參考資料是官方文件,一款優質的軟體或框架,官方文件一般包括三塊:快速開始,即一些demo;參考文件,最詳細的文件,包括概念、特性的解讀;FAQ:對於使用者來說常見的問題的解答;
第三,初步瞭解程式碼的整體組織結構,每個資料夾是做什麼用的。
除錯環境
除錯環境非常重要,有了除錯環境,就可以根據需要進行斷點,對閱讀原始碼非常有幫助。至於說如何搭建除錯環境,不同的情況有不同的處理辦法,例如MAT的原始碼,我是先將它的核心邏輯剝離出來,然後自己用單元測試進行除錯;對於Dubbo原始碼,我則是寫了一個Dubbo服務提供者、一個Dubbo服務消費者,以及安裝了ZK之後才搭建起來的;對於Spring最簡單了,利用Spring Boot啟動一個hello word的demo就可以。
場景閱讀
在做完上述準備工作後,我會按照使用功能或場景來閱讀原始碼,例如,在閱讀MAT(記憶體分析工具)的原始碼的時候,我是按照以下幾個步驟來閱讀:檔案解析、索引建立、類直方圖查詢、支配樹查詢、執行緒檢視查詢等等;在閱讀Spring原始碼的時候,我會按照Spring容器的啟動、IoC的工作過程、AOP的工作過程、靜態屬性的引入等功能來閱讀;在閱讀Dubbo原始碼的時候,我會按照服務釋出、服務訂閱、服務呼叫三個主要場景進行原始碼閱讀。按照功能或場景閱讀,可以讓我們從整體上對程式碼有所理解,然後就可以進入自己關注的一些細節了,例如:在MAT中,索引檔案是如何建立的,在Dubbo中,請求的超時機制和心跳機制是如何實現的。
總結
閱讀原始碼的過程中,我總結出了一些需要注意的點:
- 自頂向下閱讀,先把握整體的、大的流程,然後再根據需要切入到對應的分支
- 忽略一些細節,例如引數的檢查、錯誤的處理、資料形式的轉換和儲存
- 儘量準備好除錯環境
- 要關注核心的業務邏輯或演算法
- 最好能在閱讀的過程中輸出一些筆記或文件,例如模組劃分圖、函式的流程圖、針對某個業務場景,在幾個模組之間的時序圖等等,這些文件可以先手寫,然後再形成電子版存檔。
上述就是我自己針對原始碼閱讀的一些經驗,如果你有好的經驗或想法,歡迎在留言區與我交流
本號專注於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。