天天看點

為什麼要讀源代碼,如何閱讀源代碼看源碼的意義如何看源碼

目錄
  • 看源碼的意義
  • 如何看源碼
正文

由于項目的需求,最近花了較多的時間來看開源項目的代碼,在本文中,簡單總結一下對為什麼要看源碼、如何看源碼這兩個問題的思考。

為什麼要讀源代碼,如何閱讀源代碼看源碼的意義如何看源碼

本文位址:https://www.cnblogs.com/xybaby/p/10794700.html

看源碼的意義

回到頂部

看源碼隻是一種方法、手段,而不是目的。我也曾經給自己制定過“閱讀xxx源碼”的目标,現在看起來真的很蠢,一點不smart(specific、measurable、attainable、relevant、time-bound)。隻有搞清楚了閱讀代碼的目标,才能有的放矢,抓住重點,高效達成任務。

看源碼的意義總結起來包含但不限于以下幾點:

第一:解決問題(BUG)

隻要是代碼,就會有bug,隻是說bug的多與少、深與淺罷了。現在大家都喜歡釋出、使用開源項目,不同的開源項目社群成熟度、代碼品質又會有較大的差異,遇到bug就不足為奇了。

當然,遇到bug肯定是先在網上搜尋是否有類似的問題,一般可以在google、Stack Overflow、項目的issues裡面有對應的關鍵詞搜尋。如果搜不到,那麼就隻能看源碼解決了

第二:知其是以然

我在如何學習新技術、團隊技術選型時要注意些什麼裡面提到過,如果我們需要将一個開源項目用到自己的項目中,那麼就必須了解這項項目的優缺點,并深知原理,對部分細節(尤其是項目的優勢、feature)進行深入研究。如果是成熟的開源項目,遇到問題也許能google到很多答案;但如果是一個處于快速發展中的開源項目,多了解其架構、核心原理,也能幫助快速定位問題。

另外,有的項目文檔可能不那麼豐富,但又不得不使用,那麼如何以正确的姿勢使用呢?也得參考源碼

第三:學習

看源碼也是一種不錯的學習方式(雖然不一定不是最佳的方式),尤其對于比較優秀的開源項目,能讓人大開眼界。

即使是出于學習的目的,也是有很多側重的,比如

  • 學習語言:代碼風格、規範、慣用法、進階文法。對于某個語言的新手,找一個熟悉領域的開源項目來深入掌握這門語言,也是一個不錯的注意。
  • 學習設計:資料接口、架構、整體架構
  • 學習理論:算法、協定。比如我之前寫過的raft協定,光看論文是很枯燥的,而且算法理論到工程實踐還是有一定的差距,這個時候結合開源項目(mongodb)實作往往更事半功倍。
  • 其他

第四:改造

一般來說,我們剛開始僅僅是使用一個開源項目,但随着使用的深入,會發現一些自己需要的功能并沒有很好的支援,向項目組提的issues也可能得不到快速的響應,這個時候就要自己開分支,改代碼,加功能了。當然,比較好的是将自己分支比較好的新feature 給原項目提merge request,反哺開源項目,比如阿裡的Blink

第五:借鑒

他山之石可以攻玉,如果有需要重新開始自己造輪子,那麼參考一些已有的、優秀的輪子肯定是有好處的。

副産品:找工作

這一點,不應該作為我們閱讀源碼的出發點,但是确實能在實際中對找工作、面試有加成,算是副産品吧。

如何看源碼

回到頂部

看源碼的目的很大程度上影響了看源碼的方式、需要閱讀的代碼的範圍。比如說,如果是為了修一個線上bug,那麼閱讀代碼的範圍就緊緊圍繞bug本身;而如果是為了了解某個分布式算法,那就需要按大量的、可能運作在不同節點(程序)上的代碼,了解其互動原理、工作流程。

下面說一些通用的方法。

先看文檔,整體把握

一般來說,文檔是對代碼的高度凝練,一個高品質的開源一般會包含tutorial、specification、API reference等documents,通過選擇性的略讀、精讀這些文檔,就能大緻了解項目的整體架構、設計原則。正确的路線是通過文檔去認識這個項目,然乎通過閱讀代碼去驗證文檔、深入細節,而不是通過直接啃源碼來了解這個項目,以偏概全。

了解代碼組織,檔案名,類名

當需要看代碼的時候,不要找到一個檔案就開始,先看看代碼組織,粗略看看檔案名、類名,基本就能猜測到每一部分。比如redis的源碼就組織得很好,基本上看檔案名就可以快速定位每一個command的實作位置。

關注一個問題,從問題追蹤代碼

看源碼的目标決定了此時此刻的關注點,不管是解決遇到的bug還是學習某個算法,都讓我們聚焦到一個具體的問題,從這個具體的問題去追蹤代碼,忽略掉目前無需關注的細枝末節,步步深入,直達目标。當然在解決一個問題的時候,有可能會引發新的問題,尤其是學習的時候,此時隻需記錄新問題(放到收集籃,不要立即發散),待之前追蹤的問題解決之後,再來看新發現的問題。

解決一個issue

如果自己沒有問題,那麼就幫忙解決别人的問題,通常來說,開源項目都有許多待解決的issue,從中選擇一個入手即可。

調試

隻要可以,一定先讓代碼編譯通過、跑起來,這樣不管是加log、列印調用棧還是斷點調試都友善很多。尤其是對于像python這種動态類型代碼,不跑起來很難知道到底在幹啥。

加注釋,做筆記

如果某份源代碼的閱讀并不是一錘子買賣,日後還可能回顧、重新閱讀,那麼就一定要做好代碼注釋和筆記。筆記主要是架構圖、類圖、流程圖,目标是建立索引,友善日後快速回憶。而注釋就是閱讀代碼時的細節,重新閱讀的時候看注釋(特别是函數的注釋)能節省很多時間。

以上,僅僅是一些個人總結,還請多多指教!

繼續閱讀