本篇是專題《如何高效閱讀原始碼》的第一篇,來聊一聊閱讀原始碼的錯誤姿勢!以及本專題的內容及章節。
似曾相識的場景
你聽說Spring已經有一段時間了,它已經是Java企業級開發事實上的標準。你覺得自己應該讀一讀Spring的原始碼,深入理解一下Spring的實現,這能使自己更好的使用Spring,同時也能提高自己專案設計和編碼能力。
於是你泡了一杯咖啡,從github上下載最新的Spring原始碼,匯入到IDE中,寫了一個demo,然後就開始debug。你一邊StepOver,一邊嘴裡嘟囔著「A類的a方法呼叫了B類的b方法,然後又呼叫了C類的c方法,然後又執行到了這裡」。嗯,很清晰嘛,喝口咖啡。咦,剛才看到哪裡了?!沒辦法,只好重新debug!
「A類的a方法呼叫了B類的b方法,然後又呼叫了C類的c方法。。。。。。這裡是個介面,要執行的是子類,子類在哪裡呢」?你在IDEA裡按下ALT+F7,發現有幾十個實現,到底是哪個實現呢?你按下F7 StepIn想確認下。我去,一堆AOP的包裝方法,按了半天,就是進不到最終的類!
最後,好不容易找到了執行的類。咦,剛才看的是什麼來著?!唉,算了,看不下去了,先來把王者吧!然後,就沒有然後了!!!
為什麼你沒辦法把原始碼讀下去呢?因為你的方法不對:
-
不瞭解專案就讀原始碼
-
一上來就讀最新版本的原始碼
-
直接讀完整的原始碼
-
通過debug的方式閱讀原始碼
我們一個個的來說!
不瞭解專案就讀原始碼
首先,你瞭解專案了嗎?你有實際使用過專案嗎?你對專案的執行流程瞭解多少?如果你還沒有熟練的使用專案,那你就不要急著去讀專案原始碼。
讀原始碼需要在熟練使用的基礎上進行。為什麼呢?
你想想你讀原始碼的目的是什麼?你是希望能瞭解這個專案是如何設計實現的,程式碼如何組織的,有哪些技巧或思路可以學習。但是你連專案都不瞭解,你怎麼去理解這個專案是怎麼設計的?
就像上面,你只知道Spring是目前企業級開發事實上的標準,但是你不知道原因,也不知道它解決了什麼問題,以及解決問題的方式。那你如何能理解程式碼為什麼要這麼寫?!假如你最終千辛萬苦的終於將Spring原始碼讀完了,你也只知道Spring構建了Bean塞到了容器中,然後使用的時候獲取這個Bean,而不清楚深層次的用意。
一上來就讀最新版本的原始碼
很多開源專案經歷了很多年,程式碼量成指數級增長。版本越新,程式碼量也就越多。以Spring來說,現在Spring已經到了5.*版本,從git上下載下來的spring-framework的原始碼大小有200多兆,你能想象這得有多少程式碼嗎?一上來就讀這種龐然大物,心裡不瘮得慌才怪!
所以從相對老一點的版本入手,程式碼量上會少很多,閱讀起來也會容易很多。但是版本也不能太老,太老的版本可能使用的技術已經過時了,讀了也沒有什麼太大的用處。
直接看完整程式碼
雖然老版本的程式碼量相對少一點,但是一個相對較大一點的專案的程式碼量還是比較多的。比如Spring3的程式碼量也已經很多了。
所以,無論是哪個版本的原始碼,你都不應該看完整的程式碼。那該怎麼去讀原始碼呢?這就是本專題要解決的問題之一,在後面的章節中會進行詳細的講解。
通過debug的方式閱讀原始碼
很多原始碼分析的部落格都是通過debug的方式來講述原始碼。也有不少教讀原始碼的文章,也是建議通過debug的方式來進行閱讀。但是,實際上通過debug的方式來閱讀原始碼不是一個好方法,至少一上來就進行debug,是個很不好的習慣。
大部分人應該都知道,人的記憶可以分為「短時記憶」和「長時記憶」!對於「短時記憶」來說,一般正常人一次只能記憶7(加減2)個左右的無規律資訊。對於通過debug進行原始碼閱讀的方式,每一次的方法跟進,實際就是一次資訊記憶,所以最多7次左右的StepOver,你就沒法記住所有的呼叫關係了。所以你就會出現看了後面忘了前面的情況。
同時像Spring這種使用了AOP的專案,由於在執行時有多層的代理,所以debug的層級更多,也就更加的難以閱讀了。
再加上眾多的子類實現,很容易就迷失在了一堆沒用的程式碼中。
專題內容
既然已經知道了錯誤的閱讀原始碼的方式,那正確的閱讀原始碼的方式是什麼呢?這就是本專題的內容!
本專題包括四部分內容:
-
錯誤的閱讀原始碼的方式
-
提高閱讀效率的方法
-
高效閱讀原始碼的步驟
-
以及一個完整的演示例項
看完本專題,你將學會:
-
一種高效閱讀原始碼的方法
-
理解閱讀原始碼的目的是什麼
-
理解設計模式的用途
-
理解如何從架構層面看原始碼
預備知識
為了更好的理解本專題,你最好需要:
-
至少掌握一門程式語言,本專題使用Java語言講解,故掌握Java語言最佳
-
瞭解UML,本專題會繪製一些簡單的UML圖
-
瞭解常用設計原則
-
瞭解常用設計模式,瞭解設計原則和設計模式能更快的理解專案
-
熟練使用一款IDE,本專題使用Intellij IDEA演示,故熟悉Intellij IDEA最佳
-
熟練使用紙和筆或熟悉一款繪圖軟體,本專題使用draw.io進行繪圖
-
熟練使用你需要閱讀原始碼的專案,本專題使用JUnit進行講解,故熟練使用JUnit最佳
適用人群
-
想快速瞭解一個專案的原始碼結構的開發人員
-
想閱讀原始碼,但是一直找不到方法,讀不下去的開發人員