如何閱讀開源項目

最近這段時間一直比較忙,相對于之前少了很多的學習時間。抽空看幾篇源碼分析的文章,大多數(shù)都是大同小異的思路,把英文翻譯為中文而已。鑒于關于介紹如何閱讀開源項目的文章比較稀少,常言道授人予魚不如授人予漁。希望這篇文章能夠給準備閱讀三方源碼的同學一些啟示。

目的


在閱讀源碼之前最好明確一下閱讀的目的,這樣有助于閱讀的深度和時間的控制。比如如果是為了解決項目中的bug,則可以閱讀bug所涉及的部分;如果是為了提高自己的編碼能力,學習設計技巧,則就需要更為深入的閱讀。

因為閱讀源碼其實是一件非常辛苦的事情,尤其是分析一些大型開源項目的源碼,如果毫無目的的閱讀會浪費大量的時間。而且閱讀源碼也是一個長期的過程,不可能一天分析完Spring源碼的分析,所以在分析源碼之前一定要有一個明確的認識,不僅僅只是翻譯英文注釋,花大量的時間是在所難免的。

對筆者而言閱讀源碼的目的基本上可以分為如下幾種:

  1. 提高自己的編碼能力,學習設計思想。
  2. 解決工作中所用第三方庫遇到的bug。
  3. 借鑒開源代碼,私有化別人的代碼,完成工作需求。

當然不排除某些大神,讀源碼純粹是了找開源代碼漏洞或者想改進該項目。畢竟這種牛逼的人是少數(shù)。當我們明確了閱讀的目的就可以大致確定所需要花費的時間及精力了。

源碼獲取


獲取源碼的地方太多了,最負有盛名的就是GitHub。除此之外還有sourceforge,Google和Apple也有其開源項目下載地址,分別是Google OpenSourceApple OpenSource。國內(nèi)有比較出名的有開源中國碼云(開源中國代碼托管平臺))Coding

整理一下:

  1. GitHub
  2. sourceforge
  3. Google OpenSource
  4. Apple OpenSource
  5. 開源中國
  6. 碼云(開源中國代碼托管平臺))
  7. Coding

在進行搜索的開源項目有很多搜索技巧,就拿GitHub舉個例子。想高效的使用GitHub,一定要把 advanced searchprefixes看一下。

除了上面提到的開源項目下載地址,還有很多其他的地方可以獲取到源碼,這里就不多提了。

分析方法


閱讀方法才是今天的重點,筆者一般是按照下面的步驟開始。

  1. 基本思想就是先對項目有個大致的了解。比如關鍵的類有哪些,各個文件夾之間的關系。
  2. 然后從最核心的API開始,先使用UML里的類圖建立靜態(tài)結(jié)構(gòu),分析出類與類之間的關系(繼承,組合,實現(xiàn),依賴,關聯(lián)等等)。這一步是精讀的必經(jīng)之路,如果想要徹底理解,畫UML圖無意識最直接的方式。
  3. 配合IDE工具分析核心流程,理解項目是如何工作的。
  4. 著重看項目中添加的注釋,因為一般開源項目中的注釋都非常重要。

接下來分下面幾個部分詳細介紹。

  • 看:靜態(tài)對代碼進行分析,看相關資料,代碼邏輯
  • 跑:將項目在IDE里面跑起來,通過IDE調(diào)試參數(shù),加Log等。
  • 查:閱讀過程中肯定會遇到不懂的,這時候需要通過搜索引擎來解決你的疑惑。

這個部分是非常基礎但是重要的部分,主要完成對代碼的基本感知。從靜態(tài)的角度理解代碼。

現(xiàn)有資料

在我們準備閱讀某個開源項目之前,如果搜集了相關的資料的話,對我理解起來非常有幫助。也就是常說的站在巨人的肩膀上

主要分為兩種:

  1. 項目官方文檔比如Wiki
  2. 使用者分析的文檔比如項目源碼分析。

GitHub上的開源項目大部分都有文檔介紹,好一點的項目都會有對應的Wiki。除此之外開源項目的Issue也是我們需要關心的。往往這些Isuue對應到項目中都是核心部分,也就是我們非常值得關注的地方。如下圖所示,一定要善用這些選項。因為這些都是前人踩過的坑,對于項目理解非常有用。

除了項目本身的文檔外,還有一種形式的文檔也需要我們注意。這類文檔就是別人對這個項目寫過的一些源碼分析文章。這類文章已經(jīng)對項目分析過一次了,先閱讀完之后,會對我們自己去閱讀源碼起到一個理清思路,引路的作用。

但是有些大型的開源項目文檔太多了,就官方說明文檔就不可能一次看完,比如java中的Spring,看完文檔也是不現(xiàn)實的。這個時候就應該把文檔與代碼調(diào)試結(jié)合在一起。效率會高不少。而且這類型的大型項目至少也得花一年半載才能弄清楚。

代碼內(nèi)注釋

對于開源項目內(nèi)注釋一定,一定要仔細看看。在使用第三方庫的時候,往往因為沒有仔細閱讀代碼內(nèi)注釋而導致濫用方法。

如下圖是iOS開源項目CocoaAsyncSocket一段代碼內(nèi)注釋


如果沒有仔細看代碼內(nèi)注釋,沒有注意到必須設置代理和代理隊列,遇到報錯了根本不知道怎么發(fā)生的。

代碼內(nèi)注釋是作者著重想傳達給使用者的信息,所以切記切記,一定要仔細看代碼內(nèi)注釋。但是好多人都誤以為把注釋看懂就是源碼分析了,而且好多源碼分析文章也是這樣寫的,把注釋翻譯一下,說明一下用途。

這個過程是對代碼的深入理解部分,通過改變函數(shù)參數(shù),運行環(huán)境等。不同的語言用了不同的IDE,大部分IDE的作用都相差不多,都可以追溯堆棧,查看變量信息等。所以思路都是相同的。

IDE調(diào)試

項目編譯出來,運行加log,試著修改一些數(shù)據(jù)和代碼,看看有什么變化。這是最為常用的方法。靈活使用IDE的debugger,而debugger最重要的功能是獲取call stack。查看變量的變化情況,在你不知道有什么用的函數(shù)里加個斷點,顯示出來的call stack都能讓你對系統(tǒng)有更清晰的認識。

關于IDE的調(diào)試使用常用的斷點調(diào)試,變量跟中這些,這里就不多講了。

調(diào)試技巧

很多時候我們不知道某個變量或者某個變量具體的作用,那么這個時候就可以用到對CUD(Create,Update,Delete)思想

調(diào)試中的CUD具體來講就是對源代碼的類、函數(shù)、變量進行增加、修改、刪除。如果一直停留在源碼的基礎上很有可能不能透徹的理解,當我們掌握了代碼設計規(guī)則,使用CUD方式可以加深理解,以及驗證我們的猜想是否正確。

特別注意,在實現(xiàn)項目中一定不要去修改第三方的源碼,有時候可以通過修改第三方源碼來達到暫時的目的,但是往往在后期維護,升級方面必將付出慘重的代價。這里指的CUD只適合在分析源碼的時候。


在分析源碼的過程中,肯定會遇到自己不懂的地方,對于這種問題,大部分靠自己現(xiàn)有的知識很有可能無法理解,這個時候就需要實在不懂就問了。Google、相關社區(qū)、GitHub Issue、Stackoverflow多搜多問。

查這個步驟應該是貫穿整個過程的,但是也得注意不是一遇到問題就上網(wǎng)查,而是應該在自己思考之后,得不到解答才去查。很多同學養(yǎng)成了一遇到問題就Google,百度,其實從長遠來看不利于自己的提升。

分析總結(jié)

走完上面的步驟之后,基本上對一個項目源碼掌握了。但是這個層次還是有點low。僅僅停留在理解的階段,如果想做得更好就需要對項目的設計進行分析,看看有沒有可以改進的地方,甚至完全試一試自己能不能針對某個模塊改進一下。

這個階段類似于提升、創(chuàng)新的程度,建立在見多識廣的基礎之上,對于閱讀開源項目不多的同學還是非常有難度的。

整理成文

最后的階段就是把自己分析的內(nèi)容整理成為文檔,分享出來。這也是提升自己能力的一個重要渠道,在寫文章的時候,會強迫自己對那些不清楚的知識點加深理解。

文章內(nèi)容應包括自己整理的UML圖,核心類的實現(xiàn),代碼設計技巧,以及告知讀者使用該第三方的時候需要注意的問題。

在寫文章的時候需要注意,不要過多的延伸。畢竟一個點所涉及的知識網(wǎng)太大了,選擇其中比較核心的幾點闡述即可。

EOF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 當天邊那顆行出現(xiàn),你可知我又開始想念。偶爾瘋魔,會回憶會哭泣會想你卻不會露痕跡,感情濃烈也只“沉默”便掩埋了...
    燦然笑步閱讀 310評論 2 1
  • 今天有點忙!主要是全力籌備慶六一文藝匯演,這不上午基本都在剪輯音樂課了,下午全程參與了第一次彩排,下午放學后急急地...
    甲午之印閱讀 208評論 0 0
  • 「東京不是實現(xiàn)夢想的地方。東京是讓人忘記自己沒有實現(xiàn)夢想的地方。」 鎮(zhèn)樓圖是富士臺月九連續(xù)劇。直譯:“某天想起這段...
    少女冉閱讀 1,740評論 12 13