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

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

Hola,我是 yes。git

原本今天是沒打算髮文的,我正在寫下週四要去大學分享的 PPT。github

嘿嘿,老師讓我給學弟學妹們作個小分享。算法

而後刷公衆號刷到個廣告:《想漲薪,要學會讀源碼》。微信

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

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

相信經過今天的分享你不會被源碼輕易勸退,其實沒什麼,不就是代碼嗎?源碼分析

並且你一直在看源碼,可能你沒意識到,你看別人的代碼不就是源碼?學習

你新入職一個公司要熟悉代碼的時候不就是看源碼?url

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

那時候你怎麼作的?

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

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

因此沒啥好怕的,不要被勸退了。

我先分享一下我入職一家新公司接手項目的時候是怎麼作的。

入職新公司接手項目就是在讀源碼

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

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

開發在旁邊補充、解答個人疑惑,畢竟產品經理不太瞭解細節上的數據交互。

這個會議下來你就能得知這個項目究竟是幹嗎的,能提供哪些功能。

業務上的理解對你以後讀源碼很是的重要!!

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

看完以後對整個項目有了大體的瞭解。

而後讓項目跑起來,跑起來以後,開始用這個軟件,各類功能點一點,畢竟聽產品經理說和本身實際用仍是有區別的。

基本上項目主流程都過了一遍以後,開始看源碼。

這個時候看源碼,單看文件的命名其實已經能知道這個文件對應着哪一個模塊了,有種成竹在胸的感受。

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

穩了。

因此入職接手項目是須要了解背景、總覽全局而後再細化。

讀開源項目的源碼也是如此,自頂向下。

如何閱讀開源項目的源碼

讀源碼我我的分爲兩種狀況:爲了提高本身和爲了找問題。

爲了提高本身而讀源碼

我默認你是知道你要看的開源項目是幹嗎的,好比 RocketMQ 是消息隊列,消息隊列是幹嗎的你應該先知道。

我也默認你用過這個開源項目,業務上沒用過本身私下也要先用用,瞭解簡單功能怎麼用,讓它先跑起來。


首先看官網、wiki。

我截個 RocketMQ 的:

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

這一步能讓你腦子裏有個角色分佈圖和數據流轉圖,讓你明白總體項目的主要角色及之間的交互。

而後看源碼目錄,你得先知道每一個目錄是幹嗎的涉及哪些功能,這其實和你看業務源碼同樣。

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

好比 RocketMQ 的:

好比 Dubbo 的:

這就是突破口。

而後就開始源碼之路了,是的仍是得本身啃,硬啃,這是讀源碼的必經之路!

可是這時候你不是像無頭蒼蠅同樣亂啃。

你是在知曉大致會涉及到的角色和數據流轉以後讀源碼,這很不同!

你會對一些方法調用有一種「承認感」,由於你知曉大體的流程,因此以爲本該如此。

讀源碼有時候會以爲代碼不少,分支好多。

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

總體核心流程先理清楚!

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

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

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

而後這一模塊就收工了!搞定!

而後各類分支發散出去,大體的流程就都清晰了,源碼也就讀的差很少了。

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

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

再好比以前看 Kafka 的索引設計涉及到二分查找,可是源碼中是改版的二分查找。把索引項分爲熱區和冷區,深究下去是爲了不缺頁中斷。

再好比 RocketMQ 裏面看預熱文件的時候涉及的這個方法。

這時候又涉及到 mlock、madvise 。

這些就是細節,而細節每每就是咱們須要學習的地方,因此在理清總體流程以後不要錯過細節。

每每你以爲很奇怪的地方可能就是一些「騷操做」,學的就是「騷操做」。

這一趴讀源碼是爲了讓本身獲得晉升、學習學習優秀開源框架是如何設計而讀的源碼。

爲了找問題而讀源碼

這個目的性很強,有時候是項目出錯,通常而言有日誌,因此經過日誌搜就行。

若是你自己對這個框架很熟悉那固然最好,若是不熟悉經過日誌搜索結合上下文其實也能找到一些原因。

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

有時候是由於看到一些文章的說法衝突了,一篇說 A 另外一篇說 B ,若是你找不到權威的信息你只能本身去看源碼,經過關鍵字搜。

好比我這篇寫的

這就是源碼之下無祕密。

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

最後

不知不覺說了這麼多。

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

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

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

而後再看細節,學學優秀開源框架的「騷操做」。

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

固然也能夠先去網上搜一搜別人的源碼分析文章,好比我以前的一些,而後本身再上手,這樣會比較舒服和順利。

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

人家彙總整理知識,你花點小錢,節省你本身研究的時間,我以爲不虧。

反正我本身買了不少,我本身從中有收穫,因此我說的一點都不心虛。

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

道阻且長,行則將至。

衝!

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


本文分享自微信公衆號 - yes的練級攻略(yes_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索