今年我讀了四個開源項目的源碼,來分享下心得


微信搜 「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 !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM