如何快速自學開源專案?試試我的訣竅

程序员鱼皮發表於2024-08-16

大家好,我是程式設計師魚皮。上週二晚上我直播帶大家學習了一個 GitHub 上不錯的開源聊天室專案 MallChat ,大家表示學到了很多,所以我專門剪出了一期專案導學影片,分享給大家: https://www.bilibili.com/video/BV1Q142147yk

如何快速自學開源專案?試試我的訣竅

在講解專案的過程中,我發現很多同學並不清楚如何快速學習專案、以及如何快速閱讀原始碼。今天這篇文章,我就帶大家領悟這些技能,以後再自學專案會輕鬆很多~

如何快速學習專案?

1、初步瞭解專案

開啟一個 GitHub 上的開源專案後,第一件事就是去看專案的 README.md 介紹文件,可以速覽一遍看看有沒有幫助你學習的內容,比如技術選型、功能介紹、如何快速啟動專案、架構設計、注意事項等等。

以 MallChat 聊天室為例:https://github.com/zongzibinbin/MallChat ,專案介紹文件中包含對核心功能的介紹,可以看看有沒有自己感興趣的功能:

如何快速自學開源專案?試試我的訣竅

如果是公司內部的專案、或者比較成熟的開源專案,還會有 Wiki 文件,往往對專案的介紹會更加詳細,但暫時不用通篇閱讀,關注 “快速啟動專案” 或者 “專案結構介紹” 的部分即可。

像我如果決心要學一個新的專案,除了 GitHub 官方文件外,還會在網上搜集一些相關資料,整理到自己的文件中,便於後續學習時能快速找到。

2、瞭解專案結構

看完專案介紹文件後,建議先從上帝視角整體瞭解專案的結構,比如專案分為哪些模組、每個模組大致有哪些檔案、檔案命名規則如何等等,但不用進一步理解模組(或目錄)內部的組織和實現方式。尤其對於複雜的微服務專案來說,這樣做可以快速幫你定位到學習重點。

大多數情況下,大家應該都是把專案程式碼下載到本地來學習。但如果你只是為了快速瞭解專案,並不打算深入學習,其實有更高效的方式。

比如在 GitHub 倉庫的主頁按 句號鍵,就能快速進入網頁版的程式碼編輯器,跟本地瀏覽專案的體驗幾乎一致:

如何快速自學開源專案?試試我的訣竅

對於有一定經驗的開發者,一般會先查詢關鍵檔案,比如前端專案找 package.json(Node.js)、Java 專案找 pom.xml(Maven)或 build.gradle(Gradle)、Python 專案找 requirements.txtsetup.py 等,這些檔案通常包含專案依賴和配置資訊。如果專案是比較規範的,一般透過依賴和配置資訊就能快速理解專案結構了。

舉個例子,看到 aop 依賴,就知道專案用到了切面;看到 freemarker 依賴,就知道專案資源目錄中會有 FTL 模板檔案;看到 Redisson,就知道會有初始化 Redisson 客戶端的配置類,這些就是積累經驗的重要性了。

3、執行專案

如果要正式學習專案,先不要急著去閱讀原始碼,而是要先把專案在本地成功執行,便於後續邊除錯邊學習。

執行專案的步驟很簡單,用 git clone 命令將專案複製到你的電腦,然後根據 README 檔案或其他文件中的指示,安裝專案的必要依賴項、修改本地執行配置、並最終執行專案。

雖然步驟很簡單,但現實往往是大家把專案拉到本地後各種各樣的報錯資訊,所以執行專案時要格外注重以下幾點:

  1. 確保自己系統環境和專案要求一致,比如注意下前端 Node.js 和後端 JDK 版本要求。

  2. 確保專案依賴的版本和專案要求一致,比如後端依賴的 MySQL 和 Redis 版本。對於這種主流的技術,一般情況下只要別用太新的版本,基本不會影響專案的執行。

  3. 修改本地執行配置為自己的,比如資料庫賬號、密碼等,而且要格外注意不要讀取錯了配置檔案,否則可能改了半天還在疑惑 “怎麼配置沒生效呢”?

遇到報錯是很正常的,因為不是所有的開源專案都做到了 “易用易上手”,遇到報錯時,我們只要定位到關鍵報錯資訊,然後順藤摸瓜找到對應的檔案去修改即可。實在搞不定,這不還有搜尋引擎和 AI 麼?

這裡分享一個常用的快速執行專案的技巧。有的時候專案用到了很多依賴(比如 MallChat 中用了 MinIO、RocketMQ 等),但是我們本地並沒有安裝這些依賴,導致專案無法啟動。如下圖,因為我沒安裝 RocketMQ,導致啟動時連線 RocketMQ 報錯:

如何快速自學開源專案?試試我的訣竅

要想啟動專案,傳統方法就是自己安裝所有依賴,但如果專案只有一個不起眼的位置用到了某個依賴,其實花時間去安裝價效比不高。這時,我們可以用一種更簡單的方法,直接禁用掉用到這些依賴的 Bean 載入。

比如在啟動類加上 exclude ,就能快速禁用某些依賴的自動載入,示例程式碼如下:

@SpringBootApplication(exclude = {RocketMQAutoConfiguration.class})

但是,禁用了 RocketMQ Bean 的初始化後,如果有程式碼用到了這個 Bean,就會因為缺失依賴的 Bean 而報錯。這種情況下,可以使用 @Lazy 註解對 Bean 進行懶載入,用到的時候才會載入,啟動專案時就不會報錯了~ 示例程式碼如下:

public class MQProducer {
@Autowired
@Lazy
private RocketMQTemplate rocketMQTemplate;
}

4、瞭解業務流程和庫表設計

在閱讀程式碼學習前,最好先整體瞭解專案的業務流程和庫表設計,有助於明確後續閱讀原始碼時的順序和學習方向。

核心業務流程可以透過閱讀文件、或者自己體驗系統的方式來了解。比如對於聊天室系統,核心業務流程就是:使用者登入 => 使用者上線 => 新增好友 => 建立房間 => 加入房間 => 傳送訊息 => 訊息稽核 => 其他使用者接收訊息 => 回覆訊息。

瞭解專案的庫表設計也是有技巧的,比起直接看 SQL 檔案,一般我會先在本地初始化資料庫,然後透過視覺化圖表來檢視。

如何快速自學開源專案?試試我的訣竅

如圖,表之間的關係一目瞭然!比如房間又分為單聊和群聊,一個房間內有多個會話和訊息:

如何快速自學開源專案?試試我的訣竅

5、閱讀程式碼

剛開始閱讀程式碼時,不要急著一行程式碼一行程式碼地按照順序去閱讀,而是要先整體理解每個目錄的 作用和目錄內部的檔案組織形式 ,但暫時不必深入理解具體的實現方式。

舉個例子,對於 MallChat 專案,你要先能明確紅字中的資訊:

如何快速自學開源專案?試試我的訣竅

檢視某個目錄內部的檔案組織形式時,有一個小技巧。可以直接在 IDEA 中右鍵點選某個包,檢視 UML 結構圖:

如何快速自學開源專案?試試我的訣竅

透過結構圖,我們可以速覽類之間的關係。比如下圖中,工廠建立策略、兩個具體策略繼承了抽象策略類:

如何快速自學開源專案?試試我的訣竅

之後,你就可以找到感興趣的專案核心功能模組進行學習了,分享幾個學習技巧:

1)如果想快速學習某個功能的實現,建議是透過文件等方式 先了解業務流程 ,再學習原始碼。學習原始碼時,建議使用 Debug 模式啟動專案,透過介面文件(或前端)傳送請求,完整地分析一個請求的處理流程。

可以透過 IDEA 的 Endpoints 功能快速檢視專案中的介面,並定位到原始碼:

如何快速自學開源專案?試試我的訣竅

2)如果想快速瞭解單個檔案的核心結構(比如方法和屬性),可以使用 IDEA 的 Structure 功能,如圖:

如何快速自學開源專案?試試我的訣竅

3)可以透過 Call Hierarchy 功能檢視方法、類或變數在程式中被呼叫的層次結構和關係。比如下圖我檢視了 doMark 方法的呼叫者檢視,可以看到哪些方法呼叫了它,便於快速理解程式碼之間的互動,不用自己一層一層點進去看了。

如何快速自學開源專案?試試我的訣竅

4)可以透過 Find Usages 功能快速檢視一個方法或者類在專案中所有的使用位置:

如何快速自學開源專案?試試我的訣竅

5)當然,對於複雜的功能,單獨看程式碼可能是理解不了的,這時就需要搭配文件和程式碼註釋了。什麼?沒有文件?!不寫註釋?!那就直接透過 Git 版本控制工具找到原作者去詢問吧。

如何快速自學開源專案?試試我的訣竅

6、理解專案開發流程和規範

在你熟悉了專案後,就可以嘗試參與開發了。可以先透過 閱讀專案的貢獻指南或開發文件 來理解專案的開發流程、開發規範等,跟專案的其他開發者保持一致。如果有疑惑,可以看看別人的程式碼中是怎麼做的,有樣學樣就行;實在不確定的話,最好是提前詢問,不要提交一堆不符合規範的程式碼,再被別人打回來,浪費彼此的時間。

7、參與專案

最後,學習開源專案最好的方式就是親身參與專案的開發,這也是我一直建議大家做的,不僅能提升能力、也能給自己的簡歷加分。

其實參與開源專案沒有那麼困難,可以先在專案的 Issues 部分檢視別人反饋的 Bug,並且幫忙修復,熟悉整個參與開源專案的流程。之後還可以 跟作者溝通 並嘗試新增新功能、進行最佳化等。

如果想讓你貢獻的程式碼更快被作者接受,就一定要做好溝通!因為我自己也有很多開源專案,也有小夥伴給我貢獻過程式碼,但不可能所有的程式碼都接受。因為每個人關於專案的想法是不同的,在沒有跟作者交流的情況下,可能你做的功能對專案並沒有幫助、超出了專案的規劃,反而會讓專案更加複雜。團隊開發也是一樣,大家要一起評審需求,確保需求是有價值的、和專案定位是匹配的,而不是誰想加功能就加功能。


OK,以上就是本期分享,原創不易,有幫助的話還請點贊支援哦!

更多程式設計學習資源

  • Java前端程式設計師必做專案實戰教程+畢設網站

  • 程式設計師免費程式設計學習交流社群(自學必備)

  • 程式設計師保姆級求職寫簡歷指南(找工作必備)

  • 程式設計師免費面試刷題網站工具(找工作必備)

  • 最新Java零基礎入門學習路線 + Java教程

  • 最新Python零基礎入門學習路線 + Python教程

  • 最新前端零基礎入門學習路線 + 前端教程

  • 最新資料結構和演算法零基礎入門學習路線 + 演算法教程

  • 最新C++零基礎入門學習路線、C++教程

  • 最新資料庫零基礎入門學習路線 + 資料庫教程

  • 最新Redis零基礎入門學習路線 + Redis教程

  • 最新計算機基礎入門學習路線 + 計算機基礎教程

  • 最新小程式入門學習路線 + 小程式開發教程

  • 最新SQL零基礎入門學習路線 + SQL教程

  • 最新Linux零基礎入門學習路線 + Linux教程

  • 最新Git/GitHub零基礎入門學習路線 + Git教程

  • 最新作業系統零基礎入門學習路線 + 作業系統教程

  • 最新計算機網路零基礎入門學習路線 + 計算機網路教程

  • 最新設計模式零基礎入門學習路線 + 設計模式教程

  • 最新軟體工程零基礎入門學習路線 + 軟體工程教程

相關文章