在軟件開發中遇到問題的時候,我傾向於在不須要閱讀源碼的狀況下解決問題,我會優先去查官方文檔、FAQ、google或stackoverflow等網站,去看下有沒有前人已經遇到過同類問題。閱讀源碼來解決問題,算是殺手鐗。固然,還有另外一種需求,就是但願經過閱讀源碼瞭解軟件的設計細節,來達到學習的目的,例如,經過閱讀Dubbo的源碼,我能夠了解一個RPC框架的設計細節。java
閱讀源碼以前要作必定的準備工做。web
首先,確保本身掌握了相關的基礎知識,例如,若是你要閱讀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中,請求的超時機制和心跳機制是如何實現的。框架
閱讀源碼的過程當中,我總結出了一些須要注意的點:svg
上述就是我本身針對源碼閱讀的一些經驗,若是你有好的經驗或想法,歡迎在留言區與我交流函數
***本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。工具