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