今年我讀了四個開源專案的原始碼,來分享下心得

yes的練級攻略發表於2020-12-15

微信搜 「yes的練級攻略」乾貨滿滿,不然來掐我,回覆【123】一份20W字的演算法刷題筆記等你來領。
個人文章彙總:https://github.com/yessimida/yes 歡迎 star !

Hola,我是 yes。

今年來看了 RocketMQ、Kafka、Dubbo 、Tomcat 的原始碼,之前也有讀者詢問過如何讀原始碼,索性就來分享一下。

其實還看了一點點 Linux、Redis、jdk8,這幾個閱讀的目的和上面幾個是不同的,下面會提到。

相信通過今天的分享你不會被原始碼輕易勸退,其實沒什麼,不就是程式碼嗎?

而且你一直在看原始碼,可能你沒意識到,你看別人的程式碼不就是原始碼?

你新入職一個公司要熟悉程式碼的時候不就是看原始碼?

這和你看開源框架原始碼沒有本質的區別,要真說區別無非是程式碼的質量、整體的設計區別罷了。

那時候你怎麼做的?

反正最終結果你應該都是上手了的。

那就得了,開源框架的一樣,最終你也會上手。

所以沒啥好怕的,不要被勸退了。

我先分享一下我入職一家新公司接手專案的時候是怎麼做的。

入職新公司接手專案就是在讀原始碼

新入職接手專案的時候,我先拉上了產品經理和原先這個專案的主力開發開了個會。

這個會的目的就是讓產品經理介紹一下這個專案的背景、要解決什麼問題、有哪些功能。

開發在旁邊補充、解答我的疑惑,畢竟產品經理不太瞭解細節上的資料互動。

這個會議下來你就能得知這個專案到底是幹嘛的,能提供哪些功能。

業務上的理解對你之後讀原始碼非常的重要!!

然後我會去要文件、架構圖、流程圖、時序圖等等(有多少要多少,沒的話沒辦法)。

看完之後對整個專案有了大致的瞭解。

然後讓專案跑起來,跑起來之後,開始用這個軟體,各種功能點一點,畢竟聽產品經理說和自己實際用還是有區別的。

基本上專案主流程都過了一遍之後,開始看原始碼。

這個時候看原始碼,單看檔案的命名其實已經能知道這個檔案對應著哪個模組了,有種胸有成竹的感覺。

然後具體深入細節就看分配到的任務了,幾個需求接下來漸漸地細節就都全清楚了。

穩了。

所以入職接手專案是需要了解背景、總覽全域性然後再細化。

讀開源專案的原始碼也是如此,自頂向下。

如何閱讀開源專案的原始碼

讀原始碼我個人分為兩種情況:為了提升自己和為了找問題。

為了提升自己而讀原始碼

我預設你是知道你要看的開源專案是幹嘛的,比如 RocketMQ 是訊息佇列,訊息佇列是幹嘛的你應該先知道。

我也預設你用過這個開源專案,業務上沒用過自己私下也要先用用,瞭解簡單功能怎麼用,讓它先跑起來。


首先看官網、wiki。

我截個 RocketMQ 的:

瞭解具體涉及到的概念、名稱、特性、架構這是第一步。

這一步能讓你腦子裡有個角色分佈圖和資料流轉圖,讓你明白整體專案的主要角色及之間的互動。

然後看原始碼目錄,你得先知道每個目錄是幹嘛的涉及哪些功能,這其實和你看業務原始碼一樣。

然後就是找突破口了,這種開源專案都有 demo ,跑,打斷點就完事兒了!

比如 RocketMQ 的:

比如 Dubbo 的:

這就是突破口。

然後就開始原始碼之路了,是的還是得自己啃,硬啃,這是讀原始碼的必經之路!

但是這時候你不是像無頭蒼蠅一樣亂啃。

你是在知曉大體會涉及到的角色和資料流轉之後讀原始碼,這很不一樣!

你會對一些方法呼叫有一種“認可感”,因為你知曉大致的流程,所以覺得本該如此。

讀原始碼有時候會覺得程式碼很多,分支好多。

沒事,先拷貝一份,然後把一些異常處理和不常見的分支先刪了。

整體核心流程先理清楚!

並且理清楚了一個流程之後開始畫圖,流程圖、腦圖都上。

清楚之後再看沒刪減的程式碼,把異常處理的一些也理解了,補充完整流程圖、腦圖等。

看看我之前分析 Kafka 的時候畫的圖,就類似這樣的搞清楚一個流程:

然後這一模組就收工了!搞定!

然後各種分支發散出去,大致的流程就都清晰了,原始碼也就讀的差不多了。

讀原始碼的時候也會遇到一些不能理解的,先略過,主流程先搞懂。

搞懂整體核心流程之後可以摳一些細節了,比如我之前看 Dubbo 的時候就摳了一個從一段 Dubbo 原始碼到 CPU 分支預測的一次探險之旅

再比如之前看 Kafka 的索引設計涉及到二分查詢,但是原始碼中是改版的二分查詢。把索引項分為熱區和冷區,深究下去是為了避免缺頁中斷。

再比如 RocketMQ 裡面看預熱檔案的時候涉及的這個方法。

這時候又涉及到 mlock、madvise 。

這些就是細節,而細節往往就是我們需要學習的地方,所以在理清整體流程之後不要錯過細節。

往往你覺得很奇怪的地方可能就是一些“騷操作”,學的就是“騷操作”。

這一趴讀原始碼是為了讓自己得到晉升、學習學習優秀開源框架是如何設計而讀的原始碼。

為了找問題而讀原始碼

這個目的性很強,有時候是專案出錯,一般而言有日誌,所以通過日誌搜就行。

如果你本身對這個框架很熟悉那當然最好,如果不熟悉通過日誌搜尋結合上下文其實也能找到一些緣由。

不過有時候還是得整個鏈路分析下來才能排查問題,這個看功力了。

有時候是因為看到一些文章的說法衝突了,一篇說 A 另一篇說 B ,如果你找不到權威的資訊你只能自己去看原始碼,通過關鍵字搜。

比如我這篇寫的

這就是原始碼之下無祕密。

這種目的性很強的讀原始碼就得結合當時上下文和靠個人功力了。

最後

不知不覺說了這麼多。

我只能告訴你不要被原始碼勸退,你其實一直在看原始碼。

然後要自頂向下的看原始碼,不要一頭就鑽進細節,先從官網等渠道對開源框架有個全面的瞭解,然後看原始碼理清主流程。

再配合流程圖、時序圖、腦圖等記錄、歸類。

然後再看細節,學學優秀開源框架的“騷操作”。

模仿它,學會它,從中能延展出很多額外的底層知識,比如上面提到的預防缺頁中斷,預熱鎖頁,分支預測等等。

當然也可以先去網上搜一搜別人的原始碼分析文章,比如我之前的一些,然後自己再上手,這樣會比較舒服和順利。

或者一些相關的付費專欄,我個人覺得不要排斥知識付費,就這麼點錢,比你買個皮膚划算。

人家彙總整理知識,你花點小錢,節省你自己研究的時間,我覺得不虧。

反正我自己買了很多,我自己從中有收穫,所以我說的一點都不心虛。

最後,原始碼是塊硬骨頭這毋庸置疑,我只能告訴你看原始碼的準備工作和一些小心得。

道阻且長,行則將至。

衝!

最後的最後

歡迎關注我的公眾號【yes的練級攻略】,更多硬核文章等你來讀。

微信搜尋【yes的練級攻略】,關注 yes,回覆【123】一份20W字的演算法刷題筆記等你來領,從一點點到億點點,我們下篇見。 個人文章彙總:https://github.com/yessimida/yes 歡迎 star !

相關文章