鍍金池/ 問答/Linux/ 如何閱讀源碼?

如何閱讀源碼?

"沒有經(jīng)驗(yàn)的技術(shù)差底子薄的初級程序員,如何閱讀項(xiàng)目源碼? "

"有人閱讀過 mybatis 的源碼嗎 ?就看一個(gè)初始化過程就看的已經(jīng)頭暈眼花了,小伙伴們支支招吧!"

"源碼應(yīng)該怎么閱讀,我曾經(jīng)嘗試閱讀一些源碼,例如alibaba的druid中sqlparser部分,spring-mvc,但是發(fā)現(xiàn)很吃力,都說debug是最好的閱讀方式,我在debug時(shí)經(jīng)常有跟丟的現(xiàn)象……就是走著走著感覺好像進(jìn)入了一些我當(dāng)前不太關(guān)注細(xì)枝末節(jié)。 "

。。。。。。

估計(jì)很多人都有這樣的疑惑。

我非常能理解小伙伴們的痛苦,因?yàn)槲乙彩沁@么痛苦著走過來的。

閱讀優(yōu)秀源碼的好處想必大家都知道,學(xué)習(xí)別人優(yōu)秀的設(shè)計(jì),合理的抽象,簡潔的代碼...... 總之是好處多多。

但是真的把龐大的代碼放到你的面前,就如同一個(gè)巨大的迷宮,要在其中東轉(zhuǎn)西轉(zhuǎn)尋出一條路來,把迷宮的整個(gè)結(jié)構(gòu)搞清楚,理解核心思想,真心不容易。

在閱讀由面向?qū)ο蟮恼Z言如Java寫的代碼時(shí),會(huì)發(fā)現(xiàn)接口和具體的實(shí)現(xiàn)經(jīng)常對應(yīng)不起來,不太清楚一個(gè)功能到底是怎么在哪個(gè)實(shí)現(xiàn)類中才能找到。 不像C語言,就是函數(shù)調(diào)用函數(shù),相對還好點(diǎn)。

如果是動(dòng)態(tài)語言如Ruby,Python, 一個(gè)變量的類型甚至都不容易知道,閱讀的難度大大增加。

還有一個(gè)重要的原因,現(xiàn)在我們看到的源碼基本上都經(jīng)過若干年發(fā)展、經(jīng)過很多人不斷地完善的,枝枝蔓蔓非常多,魔鬼都在細(xì)節(jié)中。 閱讀的時(shí)候很容易陷進(jìn)去, 看了幾十層函數(shù)調(diào)用以后,就徹底懵了,就放棄了: 甭管你把源碼吹得天花亂墜, 老子再也不看了。

回答
編輯回答
獨(dú)白

我不是什么資深程序猿,但還是想稍微分享一下經(jīng)驗(yàn)吧。

一個(gè)結(jié)構(gòu)合理的項(xiàng)目

  1. 盡可能找到一個(gè)合適的源代碼閱讀器/編輯器/IDE;
  2. 如果這個(gè)項(xiàng)目使用了某個(gè)框架,那么先去了解這個(gè)框架;
  3. 找到這個(gè)項(xiàng)目的入口(如果有的話),大致瀏覽一遍;
  4. 想象某個(gè)使用場景,人肉單步調(diào)試(當(dāng)然可以的話拿debugger單步調(diào)試也行),了解這個(gè)項(xiàng)目最外層每一步都干了什么(不需要知道怎么實(shí)現(xiàn)),有必要的話還可以畫一下草圖,加深自己對程序流程和結(jié)構(gòu)的理解。看不懂的地方可以先跳過,但跳過這一步不能影響你對整體的理解,總體理解得差不多了后就可以進(jìn)行下一步
  5. 重新進(jìn)行上一步,但每一步要“step into”深入這個(gè)項(xiàng)目,同時(shí)若上一步中還有不理解的地方,還要嘗試在深入的過程中尋找答案。有時(shí)候在外層挖的坑會(huì)在內(nèi)層填上。

差不多就是醬紫啦

一個(gè)亂七八糟的項(xiàng)目

  1. 盡可能找到一個(gè)合適的源代碼閱讀器/編輯器/IDE;
  2. 拋開源碼,整理出這個(gè)項(xiàng)目的需求和實(shí)現(xiàn)的功能,思考如果要你實(shí)現(xiàn)的話,你會(huì)如何實(shí)現(xiàn);
  3. 嘗試進(jìn)行“一個(gè)結(jié)構(gòu)合理的項(xiàng)目”中的步驟,祈禱作者的想法和你的想法一樣。

GCC

如果你在看GCC源碼的話,當(dāng)我沒說。

我瞄過一眼GCC源碼,甚至妄圖把它們clone下來。

技不如人,甘拜下風(fēng)。
2018年1月24日 03:28