做者:xybaby
www.cnblogs.com/xybaby/p/10794700.htmlhtml
因爲項目的需求,最近花了較多的時間來看開源項目的代碼,在本文中,簡單總結一下對爲何要看源碼、如何看源碼這兩個問題的思考。java
看源碼只是一種方法、手段,而不是目的。我也曾經給本身制定過「閱讀xxx源碼」的目標,如今看起來真的很蠢,一點不smart(specific、measurable、attainable、relevant、time-bound)。python
只有搞清楚了閱讀代碼的目標,纔能有的放矢,抓住重點,高效達成任務。面試
看源碼的意義總結起來包含但不限於如下幾點:redis
只要是代碼,就會有bug,只是說bug的多與少、深與淺罷了。如今你們都喜歡發佈、使用開源項目,不一樣的開源項目社區成熟度、代碼質量又會有較大的差別,遇到bug就不足爲奇了。算法
固然,遇到bug確定是先在網上搜索是否有相似的問題,通常能夠在google、Stack Overflow、項目的issues裏面有對應的關鍵詞搜索。若是搜不到,那麼就只能看源碼解決了mongodb
我在[如何學習新技術、團隊技術選型時要注意些什麼][Link 1]裏面提到過,若是咱們須要將一個開源項目用到本身的項目中,那麼就必須瞭解這項項目的優缺點,並深知原理,對部分細節(尤爲是項目的優點、feature)進行深刻研究。後端
若是是成熟的開源項目,遇到問題也許能google到不少答案;但若是是一個處於快速發展中的開源項目,多瞭解其架構、核心原理,也能幫助快速定位問題。多線程
另外,有的項目文檔可能不那麼豐富,但又不得不使用,那麼如何以正確的姿式使用呢?也得參考源碼架構
看源碼也是一種不錯的學習方式(雖然不必定不是最佳的方式),尤爲對於比較優秀的開源項目,能讓人大開眼界。
即便是出於學習的目的,也是有不少側重的,好比
學習語言:代碼風格、規範、慣用法、高級語法。對於某個語言的新手,找一個熟悉領域的開源項目來深刻掌握這門語言,也是一個不錯的注意。
學習設計:數據接口、框架、總體架構
學習理論:算法、協議。好比我以前寫過的[raft協議][raft],光看論文是很枯燥的,並且算法理論到工程實踐仍是有必定的差距,這個時候結合開源項目([mongodb])實現每每更事半功倍。
通常來講,咱們剛開始僅僅是使用一個開源項目,但隨着使用的深刻,會發現一些本身須要的功能並無很好的支持,向項目組提的issues也可能得不到快速的響應,這個時候就要本身開分支,改代碼,加功能了。
[固然,比較好的是將本身分支比較好的新feature 給原項目提merge request,反哺開源項目,好比阿里的[Blink]。
他山之石能夠攻玉,若是有須要從新開始本身造輪子,那麼參考一些已有的、優秀的輪子確定是有好處的。
這一點,不該該做爲咱們閱讀源碼的出發點,可是確實能在實際中對找工做、面試有加成,算是副產品吧。
看源碼的目的很大程度上影響了看源碼的方式、須要閱讀的代碼的範圍。好比說,若是是爲了修一個線上bug,那麼閱讀代碼的範圍就牢牢圍繞bug自己;而若是是爲了瞭解某個分佈式算法,那就須要按大量的、可能運行在不一樣節點(進程)上的代碼,瞭解其交互原理、工做流程。
下面說一些通用的方法。
通常來講,文檔是對代碼的高度凝練,一個高質量的開源通常會包含tutorial、specification、API reference等documents,經過選擇性的略讀、精讀這些文檔,就能大體瞭解項目的總體架構、設計原則。6 大設計原則,你知道嗎?
正確的路線是經過文檔去認識這個項目,然乎經過閱讀代碼去驗證文檔、深刻細節,而不是經過直接啃源碼來了解這個項目,以偏概全。
當須要看代碼的時候,不要找到一個文件就開始,先看看代碼組織,粗略看看文件名、類名,基本就能猜想到每一部分。好比redis的源碼就組織得很好,基本上看文件名就能夠快速定位每個command的實現位置。
看源碼的目標決定了此時此刻的關注點,不論是解決遇到的bug仍是學習某個算法,都讓咱們聚焦到一個具體的問題,從這個具體的問題去追蹤代碼,忽略掉當前無需關注的細枝末節,步步深刻,直達目標。
固然在解決一個問題的時候,有可能會引起新的問題,尤爲是學習的時候,此時只需記錄新問題(放到收集籃,不要當即發散),待以前追蹤的問題解決以後,再來看新發現的問題。
若是本身沒有問題,那麼就幫忙解決別人的問題,一般來講,開源項目都有許多待解決的issue,從中選擇一個入手便可。
只要能夠,必定先讓代碼編譯經過、跑起來,這樣不論是加log、打印調用棧仍是斷點調試都方便不少。尤爲是對於像python這種動態類型代碼,不跑起來很難知道到底在幹啥。
若是某份源代碼的閱讀並非一錘子買賣,往後還可能回顧、從新閱讀,那麼就必定要作好代碼註釋和筆記。筆記主要是框架圖、類圖、流程圖,目標是創建索引,方便往後快速回憶。
而註釋就是閱讀代碼時的細節,從新閱讀的時候看註釋(特別是函數的註釋)能節省不少時間。
推薦去個人博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以爲不錯,別忘了點贊+轉發哦!