想讀專案原始碼?可為什麼總是讀不下去?

一瑜一琂發表於2022-02-19

本篇是專題《如何高效閱讀原始碼》的第一篇,來聊一聊閱讀原始碼的錯誤姿勢!以及本專題的內容及章節。

似曾相識的場景

你聽說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最佳

適用人群

    • 想快速瞭解一個專案的原始碼結構的開發人員

    • 想閱讀原始碼,但是一直找不到方法,讀不下去的開發人員

相關文章