微信搜 「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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。