關(guān)于閱讀源碼

--轉(zhuǎn)自某知乎回答
以下是我閱讀源碼總結(jié)的經(jīng)驗(yàn),希望對(duì)你有幫助。

  • 1兰怠、從最簡(jiǎn)單的源碼開始:別幻想一步登天
    其實(shí)開源項(xiàng)目有很多種擦酌,比如說有Spring這種框架類的,還有比如數(shù)據(jù)庫連接池盆佣、log4j等這種工具類的往堡。
    當(dāng)然還有特別重型的中間件類的,比如說RocketMQ共耍、Kafka虑灰、Redis。更有甚者也有上百萬行代碼的大數(shù)據(jù)類的痹兜,比如Hadoop穆咐、Spark。
    所以如果很多同學(xué)想要讀源碼的話字旭,面臨的第一個(gè)問題:不知道從何下手对湃。
    那么是不是說只要隨便挑選一個(gè)開源技術(shù)的源碼,采用愚公移山的精神遗淳,直接硬著頭皮去讀拍柒,堅(jiān)持就是勝利,鐵杵一定就能磨成針嗎屈暗?
    不是的拆讯!其實(shí)很多同學(xué)始終都沒掌握到閱讀源碼的順序、技巧和方法养叛,所以導(dǎo)致嘗試看過一些源碼种呐,卻還是看不懂。
    首先你要明白一個(gè)前提弃甥,比如說Kafka的作者爽室,Hadoop的作者,他們本身都是有很多年經(jīng)驗(yàn)淆攻,技術(shù)功底極為扎實(shí)阔墩,都是技術(shù)大牛的人,站在一個(gè)很高的角度去設(shè)計(jì)和開發(fā)出來了這些極為出色的分布式系統(tǒng)瓶珊。
    那么如果你的技術(shù)實(shí)力達(dá)不到他們的水平戈擒,你覺得你直接去讀他們寫出來的源碼,就能看懂嗎艰毒?
    那估計(jì)是很難的,因?yàn)槔锩嫣N(yùn)含的各種底層技術(shù)細(xì)節(jié)搜囱,分布式架構(gòu)設(shè)計(jì)思想丑瞧,還有復(fù)雜的算法和機(jī)制,都不是你能理解的蜀肘。
    所以建議大家第一點(diǎn)绊汹,想看源碼,先挑一個(gè)最最簡(jiǎn)單的扮宠,適合自己技術(shù)水平的去看西乖。
    給大家舉個(gè)例子狐榔,比如說你平時(shí)常用的一些源碼都有什么?顯而易見获雕,每個(gè)人都會(huì)用Spring Web MVC薄腻、Spring、MyBatis届案、Spring Boot庵楷,等等。
    其實(shí)這些開源框架的源碼也不能說就簡(jiǎn)單了楣颠,他們同樣蘊(yùn)含了開源作者深厚的技術(shù)功底在里面尽纽。
    但是你要考慮一點(diǎn),這些開源項(xiàng)目已經(jīng)相對(duì)來說是普通人可以優(yōu)先觸碰的了童漩。因?yàn)樗麄儾皇欠植际较到y(tǒng)弄贿,不涉及到復(fù)雜的架構(gòu),網(wǎng)絡(luò)通信矫膨,IO差凹,等技術(shù)細(xì)節(jié)。
    他們大多就是依賴一些底層的Java基礎(chǔ)技術(shù)豆拨,比如說動(dòng)態(tài)代理直奋、Servlet、HTTP協(xié)議施禾、JDBC等等脚线。
    而他們依賴的那些基礎(chǔ),大多數(shù)普通工程師都是掌握的弥搞,你完全可以優(yōu)先嘗試去閱讀一些這種開源框架類的源碼邮绿。
  • 2、循序漸進(jìn):先搞定底層依賴的技術(shù)
    好攀例,現(xiàn)在假如說你經(jīng)過了幾個(gè)月的努力船逮,把一些開源框架的源碼,比如上面說的SSM三大框架的源碼都看過了粤铭,現(xiàn)在你的技術(shù)實(shí)力有了進(jìn)一步的提升挖胃。
    這些提升,主要體現(xiàn)在對(duì)開源項(xiàng)目的設(shè)計(jì)思想梆惯,組件設(shè)計(jì)酱鸭,組件交互,還有框架封裝垛吗,等等凹髓,都有了進(jìn)一步的理解。
    接下來怯屉,你就可以嘗試去讀一些更難一點(diǎn)的源碼蔚舀。
    給大家舉個(gè)例子饵沧,假設(shè)你這個(gè)時(shí)候去閱讀Kafka的源碼。沒問題赌躺。但是這里有一些是你需要注意的地方狼牺,Kafka的底層是重度依賴ZooKeeper的。
    如果你不把ZooKeeper給掌握精通的話寿谴,會(huì)導(dǎo)致Kafka你也難以理解锁右。
    所以這個(gè)時(shí)候你得先把底層依賴的技術(shù)給搞定,那么你就得回過頭去先閱讀ZooKeeper的源碼讶泰,把ZK這個(gè)技術(shù)先給搞精通一些咏瑟。
    同理,如果你在研究ZK的時(shí)候痪署,發(fā)現(xiàn)他底層有一些技術(shù)是你掌握不好的码泞,比如你發(fā)現(xiàn)他大量運(yùn)用了Java并發(fā)包下的東西。
    因此如果你對(duì)Java并發(fā)包掌握的不夠好狼犯,那么建議你去把Java并發(fā)包下的源碼先仔細(xì)研究一下余寥。
    通過這種方式,你可以自行追蹤到自己還不熟悉的很多底層技術(shù)悯森,然后一個(gè)一個(gè)擊破宋舷,把這些底層依賴的技術(shù)的源碼你可以先研究透徹一些。
    然后瓢姻,你再一步一步往上層的技術(shù)去研究祝蝠,這樣看那些復(fù)雜技術(shù)的源碼就會(huì)輕松很多了。
  • 3幻碱、一定要以Hello World作為入口來閱讀
    閱讀源碼有一個(gè)非常非常有用的技巧绎狭,那就是你別下載了源碼到本地IDE里然后直接胡亂的翻看,那是不行的褥傍。
    一般建議就是基于一個(gè)開源技術(shù)寫一個(gè)最最基本的HelloWorld程序儡嘶,就是一個(gè)入門級(jí)的程序,然后把他的核心功能給跑通恍风。
    舉個(gè)例子蹦狂,假如說你要閱讀ZooKeeper的源碼,那么你先寫一個(gè)ZK的HelloWorld程序朋贬。
    比如說先連接鸥咖,然后創(chuàng)建一個(gè)znode,對(duì)znode注冊(cè)一個(gè)監(jiān)聽兄世。接著觸發(fā)這個(gè)監(jiān)聽,接著再關(guān)閉連接啊研,就這樣的一個(gè)簡(jiǎn)單的程序御滩。
    然后就可以打斷點(diǎn)鸥拧,跟蹤這個(gè)Hello World級(jí)別的源碼一步一步調(diào)試追蹤,他是如何發(fā)起和建立連接的削解,底層的代碼流程是什么樣的富弦。
  • 4、抓大放小氛驮,邊寫注釋邊畫圖
    在看源碼的過程中腕柜,很多人會(huì)被核心流程中混雜的一些特殊業(yè)務(wù)邏輯的處理給搞懵。
    給大家舉個(gè)例子矫废,看下面的代碼盏缤,是一段隨手寫出來演示的:
    checkUser();
    fetchFromPeers();
    countMetrics();
    大家可以看到,上面就三行代碼蓖扑,從方法名稱就可以看出來唉铜,先是做了一個(gè)權(quán)限檢查之類的操作,然后是核心業(yè)務(wù)邏輯去抓取數(shù)據(jù)律杠,最后是做了一些metric指標(biāo)統(tǒng)計(jì)潭流。
    那么很多同學(xué)看源碼的時(shí)候,就喜歡把每一行代碼都看懂柜去,最后不停的點(diǎn)到很深層的地方去灰嫉,把自己給繞暈了。最后淹死在源碼的海洋里嗓奢。讼撒。。
    其實(shí)這個(gè)是不對(duì)的蔓罚,這就是沒有掌握源碼閱讀的一大典型原則:
    抓大放小椿肩。
    比如上面的三行代碼,你應(yīng)該直接跳過第一行和第三行豺谈,連看都別去看郑象,直接進(jìn)入第二行核心邏輯。
    也就是說茬末,你只需要抓最核心的代碼流程就可以了厂榛,那些無關(guān)緊要的代碼,千萬別有強(qiáng)迫癥點(diǎn)進(jìn)去反復(fù)看丽惭,那樣絕對(duì)會(huì)讓你對(duì)源碼從入門到放棄击奶。
    所以,再次強(qiáng)調(diào)责掏!強(qiáng)調(diào)柜砾!強(qiáng)調(diào)!重要的事情說三遍换衬。閱讀源碼痰驱,你一定要有粗大的神經(jīng)证芭,反復(fù)告訴自己,剛開始先把握代碼的主流程即可担映。
    很多細(xì)節(jié)看不懂直接跳過去废士,別有強(qiáng)迫癥讓自己看明白每個(gè)細(xì)節(jié)。
    此外蝇完,大家一定要形成一個(gè)習(xí)慣官硝,在看源碼的過程中盡量多自己對(duì)源碼寫一些注釋。
    你應(yīng)該結(jié)合自己的理解短蜕,盡可能把自己對(duì)源碼閱讀過程中的思考都寫成注釋寫在源碼里氢架。
    這個(gè)習(xí)慣可以促使你一邊閱讀一邊思考,而且有自己注釋的源碼忿危,是你寶貴的財(cái)富达箍。
    此外,還有一個(gè)非常重要的點(diǎn)铺厨,那就是一定要多畫圖缎玫。
    你可以嘗試在閱讀的過程中,提取源碼運(yùn)行的核心流程解滓,一邊讀源碼赃磨,一邊自己畫在圖上,可以用那種畫圖軟件來作圖即可洼裤。
    大家記住邻辉,人腦對(duì)圖片的敏感度,是遠(yuǎn)高于對(duì)文字或者代碼的腮鞍,這個(gè)是大腦機(jī)制決定的值骇。
    筆者公眾號(hào)寫的很多篇文章,里面對(duì)各種技術(shù)的講解移国,無一不是通過大量的畫圖吱瘩。相比于冗長(zhǎng)的文字描述,圖片會(huì)讓人容易理解接受的多迹缀。
    通過畫圖使碾,能幫助你抽象和總結(jié)出源碼的核心流程,以后如果你要回顧和復(fù)習(xí)祝懂,直接看圖即可票摇。
  • 5、反復(fù)三遍:真正理解源碼
    另外一個(gè)要注意的點(diǎn)砚蓬,源碼這個(gè)東西矢门,是多看幾遍理解的就會(huì)越深刻。
    因?yàn)槟憧吹谝槐椋凑丈厦嬲f的抓大放小的思路颅和,可能很多東西就直接略過去了傅事,因?yàn)閯傞_始你看不懂一些非核心代碼在干什么。
    但是第一遍看完以后峡扩,通過寫注釋,自己動(dòng)手畫圖障本,對(duì)一個(gè)開源項(xiàng)目的核心流程教届、架構(gòu)以及原理都有了一定的理解了。
    此時(shí)再去讀第二遍源碼驾霜,再過一遍案训,你會(huì)發(fā)現(xiàn)之前很多看不懂的細(xì)節(jié)都能看懂了。然后再看第三遍源碼粪糙,你會(huì)發(fā)現(xiàn)大多數(shù)的代碼自己都能看懂了强霎。
    所以說任何一個(gè)源碼,都是要至少反復(fù)看三遍的過程蓉冈,不是看一遍就可以完成的城舞。
  • 6、借力打力:參考源碼分析書籍及博客
    其實(shí)現(xiàn)在有很多對(duì)熱門開源項(xiàng)目進(jìn)行源碼分析的書籍以及博客寞酿,你大致可以認(rèn)為就是一些技術(shù)比較牛的兄弟自己看了源碼之后家夺,寫出來的一些分析和感悟。
    但是那畢竟是別人的東西伐弹,如果你上來就直接看源碼分析書籍或者博客拉馋,那么不一定可以看懂,因?yàn)槲淖值男畔鬟f未必能很好的讓你理解有些復(fù)雜的東西惨好。
    所以比較建議的方式煌茴,就是先自己嘗試看幾遍,有了一定的理解之后日川,此時(shí)可以借助源碼分析書籍或者是博客蔓腐,參考其他技術(shù)牛的同學(xué)對(duì)這個(gè)源碼理解,結(jié)合自己之前的一些思考逗鸣,綜合起來進(jìn)行分析合住,相信一定會(huì)大有裨益。
    你會(huì)發(fā)現(xiàn)人家的一些理解可以很好的補(bǔ)充你沒想明白的一些問題撒璧,或者是忽略的一些細(xì)節(jié)透葛。
    不過,需要提醒的一點(diǎn)卿樱,網(wǎng)上不少博客僚害,包括一些書籍,他們寫出的一些源碼分析,可能是錯(cuò)誤的萨蚕。
    所以靶草,盡信書不如無書,你需要帶著一定的糾錯(cuò)眼光岳遥。在和你的理解相悖時(shí)奕翔,不一定就是你錯(cuò)了。
  • 7浩蓉、最后寄語:用幾年時(shí)間鍛造自己的核心技術(shù)
    其實(shí)上面那個(gè)過程說起來很簡(jiǎn)單派继,做起來非常的困難。
    因?yàn)樵谏厦嫒魏我粋€(gè)步驟捻艳,閱讀的過程中你都有大量的東西是不會(huì)的驾窟,而且會(huì)覺得很難,甚至經(jīng)常有想放棄的沖動(dòng)认轨。
    畢竟人的大腦天生就是會(huì)對(duì)困難的事情產(chǎn)生抗拒感绅络,這是本能,天生就是對(duì)舒服嘁字、放松的事情有向往恩急。
    但是只有那些能克服人的動(dòng)物本能,惰性本能拳锚,迎難而上假栓,堅(jiān)韌不拔的同學(xué),才能真正攻克各種技術(shù)難題霍掺。
    讓自己的大腦不停的開動(dòng)匾荆,不停的思考上面那個(gè)過程,也許你要持續(xù)一年才能有個(gè)小的開悟杆烁,持續(xù)三年才能有一定的心得牙丽,持續(xù)五年甚至八年,才能說真的融匯貫通兔魂,打通任督二脈烤芦,成為技術(shù)大牛。
    但是堅(jiān)持這個(gè)事情同樣是很可怕的析校,一旦你堅(jiān)持做到了构罗,那么你將鍛造出來自己最硬核的技術(shù)實(shí)力,遠(yuǎn)遠(yuǎn)不是普通人智玻,或者剛畢業(yè)的年輕同學(xué)可以追上你的遂唧。技術(shù)深度、技術(shù)功底吊奢,這是每一個(gè)工程師最最硬核的技術(shù)實(shí)力盖彭。
    希望各位同學(xué)可以從現(xiàn)在開始,嘗試著用筆者分享的技巧閱讀源碼。跳出舒適區(qū)召边,去擁抱更大的舒適區(qū)铺呵。

真正體驗(yàn)一下讀透源碼之后,根據(jù)報(bào)錯(cuò)日志隧熙,從源碼層面精確定位項(xiàng)目問題片挂、精確制導(dǎo)線上bug,感受一下這種上帝視角解決問題的快感吧贞盯!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宴卖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邻悬,更是在濱河造成了極大的恐慌,老刑警劉巖随闽,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父丰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掘宪,警方通過查閱死者的電腦和手機(jī)蛾扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魏滚,“玉大人镀首,你說我怎么就攤上這事∈蟠危” “怎么了更哄?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腥寇。 經(jīng)常有香客問我成翩,道長(zhǎng),這世上最難降的妖魔是什么赦役? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任麻敌,我火速辦了婚禮,結(jié)果婚禮上掂摔,老公的妹妹穿的比我還像新娘术羔。我一直安慰自己,他們只是感情好乙漓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布级历。 她就那樣靜靜地躺著,像睡著了一般簇秒。 火紅的嫁衣襯著肌膚如雪鱼喉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音扛禽,去河邊找鬼锋边。 笑死,一個(gè)胖子當(dāng)著我的面吹牛编曼,可吹牛的內(nèi)容都是我干的豆巨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼掐场,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼往扔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熊户,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萍膛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚷堡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗罗,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蝌戒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了串塑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡北苟,死狀恐怖桩匪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情友鼻,我是刑警寧澤傻昙,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站桃移,受9級(jí)特大地震影響屋匕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借杰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一过吻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔗衡,春花似錦纤虽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至济蝉,卻和暖如春杰刽,著一層夾襖步出監(jiān)牢的瞬間菠发,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工贺嫂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滓鸠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓第喳,卻偏偏與公主長(zhǎng)得像糜俗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曲饱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容