由于項(xiàng)目的需求,最近花了較多的時(shí)間來(lái)看開源項(xiàng)目的代碼,在本文中,簡(jiǎn)單總結(jié)一下對(duì)這兩個(gè)問(wèn)題的思考。
看源碼的意義
看源碼的意義總結(jié)起來(lái)包含但不限于以下幾點(diǎn):
一、解決問(wèn)題(BUG)二、知其所以然
我在[如何學(xué)習(xí)新技術(shù)、團(tuán)隊(duì)技術(shù)選型時(shí)要注意些什么][Link 1]里面提到過(guò),如果我們需要將一個(gè)開源項(xiàng)目用到自己的項(xiàng)目中,那么就必須了解這項(xiàng)項(xiàng)目的優(yōu)缺點(diǎn),并深知原理,對(duì)部分細(xì)節(jié)(尤其是項(xiàng)目的優(yōu)勢(shì)、)進(jìn)行深入研究。
先看文檔,整體把握
一般來(lái)說(shuō),文檔是對(duì)代碼的高度凝練,一個(gè)高質(zhì)量的開源一般會(huì)包含、、API 等,通過(guò)選擇性的略讀、精讀這些文檔,就能大致了解項(xiàng)目的整體架構(gòu)、設(shè)計(jì)原則。,你知道嗎?
正確的路線是通過(guò)文檔去認(rèn)識(shí)這個(gè)項(xiàng)目,然乎通過(guò)閱讀代碼去驗(yàn)證文檔、深入細(xì)節(jié),而不是通過(guò)直接啃源碼來(lái)了解這個(gè)項(xiàng)目,以偏概全。
理解代碼組織,文件名,類名
當(dāng)需要看代碼的時(shí)候,不要找到一個(gè)文件就開始,先看看代碼組織,粗略看看文件名、類名,基本就能猜測(cè)到每一部分。比如redis的源碼就組織得很好,基本上看文件名就可以快速定位每一個(gè)的實(shí)現(xiàn)位置。
關(guān)注一個(gè)問(wèn)題,從問(wèn)題追蹤代碼
看源碼的目標(biāo)決定了此時(shí)此刻的關(guān)注點(diǎn)為什么源代碼沒(méi)有2,不管是解決遇到的bug還是學(xué)習(xí)某個(gè)算法,都讓我們聚焦到一個(gè)具體的問(wèn)題,從這個(gè)具體的問(wèn)題去追蹤代碼,忽略掉當(dāng)前無(wú)需關(guān)注的細(xì)枝末節(jié),步步深入,直達(dá)目標(biāo)。
當(dāng)然在解決一個(gè)問(wèn)題的時(shí)候,有可能會(huì)引發(fā)新的問(wèn)題,尤其是學(xué)習(xí)的時(shí)候,此時(shí)只需記錄新問(wèn)題(放到收集籃,不要立即發(fā)散),待之前追蹤的問(wèn)題解決之后,再來(lái)看新發(fā)現(xiàn)的問(wèn)題。
解決一個(gè)issue
如果自己沒(méi)有問(wèn)題,那么就幫忙解決別人的問(wèn)題,通常來(lái)說(shuō),開源項(xiàng)目都有許多待解決的issue,從中選擇一個(gè)入手即可。
調(diào)試
只要可以,一定先讓代碼編譯通過(guò)、跑起來(lái),這樣不管是加log、打印調(diào)用棧還是斷點(diǎn)調(diào)試都方便很多。尤其是對(duì)于像這種動(dòng)態(tài)類型代碼為什么源代碼沒(méi)有2,不跑起來(lái)很難知道到底在干啥。
加注釋,做筆記