曼陀號是一個為期六個月,邀請各領域專家擔任船長,分享經驗傳承來幫助水手縮短摸索時間並突破職涯瓶頸的計畫。我參加的是 Enginearing 組,在今年擔任助教的角色~
第七屆 Enginearing 組的船長是顧職創辦人 Bryan,本次月會分享的內容「影響力:參與開源軟體社群」介紹了入門參與開源的方式,也有一些我的見解、查的補充資料來提供大家參考,對開源軟體有興趣的大家可以繼續看下去!
Why Open Source
- 閲讀陌生程式碼 / Debug 的能力:
- 透過閱讀 Commit/ Issue 等歷史資訊,嘗試看出軟體發展設計的方向。
- 在陌生的程式碼中嘗試復現、解決問題也是工作常會用到的技能。 - 學習多人協作框架設計:
- 在大規模專案中,透過模組化、抽象化設計,以及清晰定義的介面,可以將動作侷限在各自負責的模組範圍內,避免多人同時修改同一份檔案,降低產生衝突(conflict)的機率。更適合已經有框架設計概念基礎的人觀察開源的設計,之後要實作可能更有方向。 - 接觸協作、寫測試、重構、處理效能、CI/CD:
如果在工作中沒有這些機會,開源是個可以學習的機會,但可能對 Junior 來說較為複雜,建議可以尋求更資深的人導覽或建議。 - 可以跟大神們一同工作:
你可能暫時還無法進入Google 但可以參與 Google 的開源專案跟他們一起工作。
筆者小建議:開源社群聽起來很酷也很有參與的價值,但如果 Junior 程式開發基礎概念不穩,很容易加深挫敗感。可以考慮從公司內部的專案開始練習閱讀程式架構,像是考古詢問資深前輩當初的設計原則,來熟悉模組化等概念。
How Open Source
已經有了想參與開源的想法,如何選擇適合自己的專案,這邊有一些開源專案資源:
- GitHub Trending (https://github.com/trending)
- Awesome List (https://github.com/sindresorhus/awesome)
- 工作常用的開源專案:👍
- 熟悉使用
- 有機會邊上班邊當 Contributor
- 以公司的角度來說,會有各路大神幫公司看功能
筆者個人認為,除非公司使用的專案和功能非常龐大,有開源的協助能大幅提升效率及產值,否則在資安及沒有立即效益的考量下,公司內部很難同意在工作的同時貢獻開源,更多的情況是僅將開源軟體Fork 到 Private 使用。
Quick See
可以以這個專案作為參考,對照一下的架構內容: https://github.com/googleapis/google-cloud-python
典型專案結構介紹
通常以下文件越完善,能降低專案入門的門檻,規範貢獻者的行為,也會有更多人使用,這點後面也會再提到~
- README.md
點入專案第一個看的,通常包含專案目的、架構、如何啟動、如何使用 (demo code)、contributors 等資訊,好的 readme 應該可以幫助你了解專案主要目的,並順利搭建環境運行。 - CONTRIBUTING.md
貢獻者指南,主要包含參與貢獻需要了解的事,如commit msg 、流程要符合規範,是否有文件要簽核 (e.g. apache airflow) 等等。 - LICENSE
開源許可證,說明並規範這份開源軟體能如何被使用,詳細說明分類可以參考這裡,如: - GPL: 崇尚自由,並規定只要「引用/修改/衍生自 GPL 授權程式碼的軟體也必須採用GPL授權」,且要求未來所有的使用者、開發者也必須採用同樣的條款。 - Apache, MIT: 偏向鼓勵原始碼分享、允許代碼修改、衍生再發佈(開源或商業軟體皆可) - 文件內容之外,同樣重要的其他參考:Issue、PR、Wiki,可以由這些內容觀察社群整體的氛圍
- Issue: 建立專案工作事項的地方,工作事項可以是新的 feature、回報 bug 等,能看出事項的歷史發展,包含關於細節的討論,是否有已經完成的 branch、milestone 或 pull request等等。
- PR, Pull Request : 一個功能或修正完成後,會發出 PR, 由專案維護者 (Maintainer) 審核過後才能 merge 到主程式中,因此 PR 發出及完成的速度可以看出 Maintainer 及相關社群的活躍程度。
- Wiki: 存放專案相關的文件,相較於前兩項,wiki 不是一個開源必要的項目,但一定是一個大大的加分項,可以幫助使用者更了解專案的內容和運作。
專案選擇的一些Tips
- 適合自己技術背景,能為履歷加分!
- 專案文件是否完整:清晰的 README、CONTRIBUTING、Wiki 等文件規畫可以讓入門門檻降低,也能快速地了解專案,詳細可以參考上面的開源架構。
- 專案活躍程度:Maintainer 是否經常回覆 Issue/ PR、社群討論多不多,可以判斷日後貢獻的功能能不能友善討論、快速被審核等等。
Start Open Source
小補充:在了解Repo時,也可以使用AI工具輔助快速了解架構讓入門門檻降低,如DeepWiki。
Step.1 確認 issue 類型
- bug 修復
- 新增功能
- 文件更新....
Sept.2 判斷 issue 適不適合自己
- 有沒有具體描述(背景、重現步驟、預期結果等)
- Maintainer 是否回應過:表示這個 Issue 是值得關注的,且有較容易有額外指導/資訊
- 涉及的檔案與語言是否熟悉
- 評估能力是否符合解決問題的需求:選擇與自己背景相符,有能力解決問題
若沒有已經開好適合的,也可以自己開一個,記得檢查確認沒有一樣的噢。
小試身手:可以從修改 typo 、補充文件或 Unit Test 等不影響主程式的功能開始,建立自身信心及Maintainer 的信任度。
Step 3. 重現問題
- 了解專案架構 ex 程式入口、檔案分類等等
- Fork 專案,Clone 到本地端,由 README 的指引開始,安裝環境並將程式 Run 起來
- 嘗試重現 Issue 中提到的問題
- 追蹤程式碼被 Trigger 路徑,確認核心問題所在
如果無法復現問題也可以嘗試在 Issue 提出跟大家討論更多資訊。
Step 4. 解決問題
修改程式碼之前,記得要 Fork 專案出來避免影響原作者的 git。
- 建立 branch
- 針對問題進行程式碼修改
- 一定一定要在本地端驗證測試並記錄
- 驗證想法時,有能力的話就可以先寫 unit test
- commit 並 push 回去自己的 repo
- 發出 PR (一定要先有 Issue 才開 PR !
注意commit message/ PR 的描述等等是否符合規定。
PR Review
發出PR後,就等 Maintainer 審核你的 PR,但通常他們是怎麼審核的呢?
- 審查標準 是否符合專案規範(程式碼風格、功能完整性)
- 常見退件原因 Maintainter 通常會提供具體修改建議,並解釋退件原因,如不符合規範、缺乏測試、功能重複、文件不完整等。
Hint
- 避免頻繁推送,應該完成後一次性提交,避免過多的 commit 造成難以定義修改內容
- 專注於目標,PR 範圍要足夠小:一次專注於特定功能或 bug 的修改
- 不被接受也不要太灰心,可以嘗試說明功能重要性、Bug的嚴重性,說服別人接受你的變更。因為即使現在不接受,相同的問題也有可能重複提出,說不定在多年後突然同意。
以上就是這次月會的內容及心得分享啦!這次的內容花了一點時間消化,才藉著讀書會的分享一同發出文章,在查補充資料時也覺得有所收穫。
謝謝小夥伴們給我動力完成這樣的分享!也謝謝各位的時間跟耐心看到這邊!本篇內含大量 Git 相關的操作,還不熟悉的朋友們也可以去看看這些資源:
看完文章的你會想要貢獻開源社群嗎~