閱讀大型開源軟件的四個技巧

最近的一段時間裏,我在研究 Android 配套工具和 Android Studio 相關的實現,以及它們如何配合完成一個 APK 的構建。由於整個系統各個模塊之間的關係過於複雜,除此,不一樣模塊之間也包含了大量的代碼 —— 不管是從行數上,仍是從函數長度上來講。編程

從整體的思路上來講,在進入代碼閱讀以前,咱們須要:微信

  1. 理解代碼背後的業務流程架構

  2. 理解架構設計的思想框架

從而咱們才能理解主流程(脈絡)。針對於此,咱們會發現一些不一樣的模式:編程語言

  1. 借鑑他人。從他人的學習筆記中,理解總體的思路和過程。如 Android APK 的構建,Android 資源如何優化,從中理清代碼閱讀的思路。編輯器

  2. 源碼學習。ide

  3. 藉助測試調試。函數

  4. fork 主流程。工具

它們並非互相獨立的,每每是結合一塊兒使用的。單元測試

借鑑他人

這種模式,能夠實現快速地學習。它存在的一些明顯的缺點是:

  1. 學到的東西是二手加工過的。

  2. 部分的代碼可能與真實的情形脫節。

因此,它適用於你想快速瞭解某一部分的功能,從而瞭解全貌,隨後咱們就能夠深刻某一部分進行了解。

在這種模式之下,我推薦:經過購買、閱讀書籍的方式來學習。若是能買到書即是一件幸運的事,由於它已經通過了系統性的加工。惟一的問題多是上面的代碼有些老舊。可是,它更加的系統化、完整,方便咱們理解,並減小搜索資料的成本。

爲何不是網上找資料?:

  1. 找資料須要投入時間成本

  2. 資料不必定詳細

若是你能直接找到詳細的資料,畢竟花費的時間足夠短的話,那麼也是沒問題的。

源碼學習

源碼學習是一個須要花費大量時間和精力的事情,除非萬不得已,不然我也不想用這種方式。由於,咱們會缺乏大量的上下文,這些上下文可能致使咱們理解出現一些偏差。

前期準備:

  1. 合適的工具。最好是~~收費的()~~能用上的。

  2. 合適的存儲空間。像 Android 這樣的系統,clone 下來就要 120G,編譯的話,估計得達到 200G 吧;而像 Android Studio 的源碼,clone 下來也要 60G。

  3. 尋找閱讀的模式。

  4. 嘗試去構建應用。它不必定可行,可是若是能夠的話,會節省你大量的時間。

源碼學習是一個很是重的學習模式。咱們要花費大量的時間:

  1. 在代碼間跳轉

  2. 梳理業務邏輯

因此,還有一些不錯的犯懶的姿式:

經過書籍來增強。我一直以爲對於學習來講,閱讀書籍是最理想的方式。由於尋找資料須要成本,而多數的書都會起到一個索引的目的。

尋找類似的輪子。一個有意思的技術,必然有不少公司、不少人都研究過。他們都會嘗試去創造相似的輪子。惟一的問題是,咱們要學習到什麼程度,若是隻是理解的話,那麼看看別人重複的輪子也是能夠的;若是是爲了深刻的話,那麼還得回過頭去看看源碼

藉助測試調試

對於調試來講,咱們還會面臨的一個挑戰是:諸如我這樣的入門級 MBP 配置,對於大型系統來講編譯根本不夠用。應對這種問題的一個比較良好的姿式是:經過 IDE 調試測試來完成對部分代碼的調試。(PS:這種方式也適用於業務代碼的開發)

若是咱們能夠在應用的入口中建立某一模塊對應的測試,那麼咱們就能夠快速調試整個應用了。

fork 主流程

對於我來講,我以爲只閱讀源碼是一種只爲了解決一時問題的方式。同時,像我這樣的凡人,對於某些知識和內容,只要不使用,我可能隔個十天半個月,我就忘光了(雖然我一直以爲這是一件好事)。

邊閱讀代碼,邊 fork 項目,咱們還會有一些挑戰:

  1. 語言的熟練度和模式。對於熟悉的語言來講,好比平常編寫業務代碼的時候,咱們並不須要理解於諸如類加載器、元編程、字節碼這一類的複雜模式。

  2. 新的框架、工具或語言的學習成本。好比,我在過程當中就遇到須要理解和學習 Gradle 插件的一些構建機制。

  3. 代碼中大量的、無用的異常處理的代碼。

  4. 別人的代碼都是 。(PS:一個月後本身的代碼也是屎)

因此,還有一些模式:

  1. 劃分模塊邊界。尋找架構圖,經過架構圖來劃分模塊。

  2. 切片化運行。一個模塊,一個模塊來理解整個系統。如 IDEA 插件的編寫、IDEA 插件與 Gradle 如何交互,Gradle 插件的原理與編寫,Gradle 如何調用其它命令行工具,命令行工具的原理與編寫。

  3. 經過測試運行。如針對於 ApkAnalyser 這樣的工具,咱們能夠經過單元測試而非構建一個 CLI 的方式來運行。

  4. 選擇另一門語言。由於別人用 Java、Groovy、Kotlin 編寫的應用,若是你用 Rust、Go 再寫一遍的話,那麼你就能一次學到兩個東西了:一個是新的編程語言,一個是這個開源項目的代碼。

README 輸出

爲了方便咱們查閱和其餘/她人使用,我每每會把相關的內容記錄到項目的 README 上。

  • 相關的文檔資料

  • 類似的開源項目

  • 過程當中的內容產出

  • 代碼簡要說明

  • ……

這樣一來,其餘/她人在學習的過程當中還能 GET 到類似的思路。

結論

最後,簡單作一些成本對比:

模式 成本 性價比 主要場景
借鑑他人 學習
閱讀源碼學習 理解思想
fork 主流程 理解、模仿
藉助測試調試 較高 理解、模仿

一些結合模式:

閱讀二手資料,根據二手資料理解主脈絡

編寫主流程調用鏈,理解架構設計理想

藉助開源軟件的測試調試,理解參數及流程

……

本文轉載自微信公衆號「phodal」,能夠經過如下二維碼關注。轉載本文請聯繫phodal公衆號。

【編輯推薦】

  1. 真愛!微軟宣佈新開源網站,由 Jekyll 一鍵生成,代碼所見即所得

  2. PyTorch實現,GitHub 4000星:這是微軟開源的計算機視覺庫

  3. Photoflare:知足簡單編輯需求的開源圖像編輯器

  4. 美國知名媒體 TechCrunch 關注中國建設獨立開源平臺

  5. 微軟開源計算機視覺專題庫在GitHub上又火了

【責任編輯:武曉燕 TEL:(010)68476606】

相關文章
相關標籤/搜索