11没有源码注释_我们为什么要看源码、应该如何看源码?
看源碼的意義
看源碼只是一種方法、手段,而不是目的。我也曾經(jīng)給自己制定過“閱讀xxx源碼”的目標(biāo),現(xiàn)在看起來真的很蠢,一點(diǎn)不smart(specific、measurable、attainable、relevant、time-bound)。
只有搞清楚了閱讀代碼的目標(biāo),才能有的放矢,抓住重點(diǎn),高效達(dá)成任務(wù)。
這里也給大家分享一下我們的專欄《Java 進(jìn)階集中營》,每天都會給大家分享一個最新的java技術(shù)內(nèi)容,有優(yōu)秀的技術(shù)訊息,也歡迎分享在我的專欄里。
JAVA 進(jìn)階集中營?zhuanlan.zhihu.com看源碼的意義總結(jié)起來包含但不限于以下幾點(diǎn):
一、解決問題(BUG)
只要是代碼,就會有bug,只是說bug的多與少、深與淺罷了。現(xiàn)在大家都喜歡發(fā)布、使用開源項目,不同的開源項目社區(qū)成熟度、代碼質(zhì)量又會有較大的差異,遇到bug就不足為奇了。
當(dāng)然,遇到bug肯定是先在網(wǎng)上搜索是否有類似的問題,一般可以在google、Stack Overflow、項目的issues里面有對應(yīng)的關(guān)鍵詞搜索。如果搜不到,那么就只能看源碼解決了
二、知其所以然
我在[如何學(xué)習(xí)新技術(shù)、團(tuán)隊技術(shù)選型時要注意些什么][Link 1]里面提到過,如果我們需要將一個開源項目用到自己的項目中,那么就必須了解這項項目的優(yōu)缺點(diǎn),并深知原理,對部分細(xì)節(jié)(尤其是項目的優(yōu)勢、feature)進(jìn)行深入研究。
如果是成熟的開源項目,遇到問題也許能google到很多答案;但如果是一個處于快速發(fā)展中的開源項目,多了解其架構(gòu)、核心原理,也能幫助快速定位問題。
另外,有的項目文檔可能不那么豐富,但又不得不使用,那么如何以正確的姿勢使用呢?也得參考源碼
三、學(xué)習(xí)
看源碼也是一種不錯的學(xué)習(xí)方式(雖然不一定不是最佳的方式),尤其對于比較優(yōu)秀的開源項目,能讓人大開眼界。
即使是出于學(xué)習(xí)的目的,也是有很多側(cè)重的,比如
學(xué)習(xí)語言:代碼風(fēng)格、規(guī)范、慣用法、高級語法。對于某個語言的新手,找一個熟悉領(lǐng)域的開源項目來深入掌握這門語言,也是一個不錯的注意。
學(xué)習(xí)設(shè)計:數(shù)據(jù)接口、框架、整體架構(gòu)
學(xué)習(xí)理論:算法、協(xié)議。比如我之前寫過的[raft協(xié)議][raft],光看論文是很枯燥的,而且算法理論到工程實踐還是有一定的差距,這個時候結(jié)合開源項目([mongodb][])實現(xiàn)往往更事半功倍。
四、改造
一般來說,我們剛開始僅僅是使用一個開源項目,但隨著使用的深入,會發(fā)現(xiàn)一些自己需要的功能并沒有很好的支持,向項目組提的issues也可能得不到快速的響應(yīng),這個時候就要自己開分支,改代碼,加功能了。
當(dāng)然,比較好的是將自己分支比較好的新feature 給原項目提merge request,反哺開源項目,比如阿里的[Blink][]
五、借鑒
他山之石可以攻玉,如果有需要重新開始自己造輪子,那么參考一些已有的、優(yōu)秀的輪子肯定是有好處的。
六、副產(chǎn)品
這一點(diǎn),不應(yīng)該作為我們閱讀源碼的出發(fā)點(diǎn),但是確實能在實際中對找工作、面試有加成,算是副產(chǎn)品吧。
應(yīng)該如何看源碼:
看源碼的目的很大程度上影響了看源碼的方式、需要閱讀的代碼的范圍。比如說,如果是為了修一個線上bug,那么閱讀代碼的范圍就緊緊圍繞bug本身;而如果是為了了解某個分布式算法,那就需要按大量的、可能運(yùn)行在不同節(jié)點(diǎn)(進(jìn)程)上的代碼,了解其交互原理、工作流程。
下面說一些通用的方法。
先看文檔,整體把握
一般來說,文檔是對代碼的高度凝練,一個高質(zhì)量的開源一般會包含tutorial、specification、API reference等documents,通過選擇性的略讀、精讀這些文檔,就能大致了解項目的整體架構(gòu)、設(shè)計原則。6 大設(shè)計原則,你知道嗎?
正確的路線是通過文檔去認(rèn)識這個項目,然乎通過閱讀代碼去驗證文檔、深入細(xì)節(jié),而不是通過直接啃源碼來了解這個項目,以偏概全。
理解代碼組織,文件名,類名
當(dāng)需要看代碼的時候,不要找到一個文件就開始,先看看代碼組織,粗略看看文件名、類名,基本就能猜測到每一部分。比如redis的源碼就組織得很好,基本上看文件名就可以快速定位每一個command的實現(xiàn)位置。
關(guān)注一個問題,從問題追蹤代碼
看源碼的目標(biāo)決定了此時此刻的關(guān)注點(diǎn),不管是解決遇到的bug還是學(xué)習(xí)某個算法,都讓我們聚焦到一個具體的問題,從這個具體的問題去追蹤代碼,忽略掉當(dāng)前無需關(guān)注的細(xì)枝末節(jié),步步深入,直達(dá)目標(biāo)。
當(dāng)然在解決一個問題的時候,有可能會引發(fā)新的問題,尤其是學(xué)習(xí)的時候,此時只需記錄新問題(放到收集籃,不要立即發(fā)散),待之前追蹤的問題解決之后,再來看新發(fā)現(xiàn)的問題。
解決一個issue
如果自己沒有問題,那么就幫忙解決別人的問題,通常來說,開源項目都有許多待解決的issue,從中選擇一個入手即可。
調(diào)試
只要可以,一定先讓代碼編譯通過、跑起來,這樣不管是加log、打印調(diào)用棧還是斷點(diǎn)調(diào)試都方便很多。尤其是對于像python這種動態(tài)類型代碼,不跑起來很難知道到底在干啥。
加注釋,做筆記
如果某份源代碼的閱讀并不是一錘子買賣,日后還可能回顧、重新閱讀,那么就一定要做好代碼注釋和筆記。筆記主要是框架圖、類圖、流程圖,目標(biāo)是建立索引,方便日后快速回憶。
而注釋就是閱讀代碼時的細(xì)節(jié),重新閱讀的時候看注釋(特別是函數(shù)的注釋)能節(jié)省很多時間。
總結(jié)
以上是生活随笔為你收集整理的11没有源码注释_我们为什么要看源码、应该如何看源码?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab中给图像加几个矩形框_没想到
- 下一篇: 四元数左乘右乘_四元数、欧拉角学习笔记个