Open Source 開源社群的第一門課 | 如何成為 Apache Committer
關於作者
我是許秉倫 (Byron Hsu),畢業於台大電機系 (B05),預計在 2021 Fall 前往 UC Berkeley 攻讀 EECS MEng,現為 Apache Submarine 專案中的 Committer。
2020/10/04 我在 Apache Submarine 發出第一支 Pull Request,2021/03/31 收到 Apache Submarine Committer 的邀約。很幸運地在過程中獲得非常多人的幫忙,歷經一番努力,終於達到自己半年前設定的目標。
有鑒於台灣在 Apache 開源社群的資訊較為匱乏,可能只知道阿帕契是某種直升機 (X ,因此我會把我所知道的濃縮成一篇文章,內容包括:
- 我為何加入 Apache 專案?
- Apache 是什麼?開源專案是如何運作的?
- 我想成為 Committer,我該怎麼做?
我對於開源專案、科技、商業非常感興趣,也很喜歡認識各式各樣的人,如果對於這方面的議題想聊聊,歡迎直接加我的 Facebook 或 LinkedIn。
Facebook: https://www.facebook.com/profile.php?id=100006511962880
LinkedIn: https://www.linkedin.com/in/byronhsu1230/
好那我們開始吧!
教練,我想做開源…
故事要從這裡說起,某天搭捷運上學的途中,我在 Facebook 看到 謝秉昂學長 談到關於「國際移動力」這個名詞,裡面的一個條件是知名專案 Committer,那是我第一次看到 Apache Committer 這個名詞。
我對「開源專案」一直非常著迷,大學時期受到 John Wu 以及 Chung-Yang Ric Huang 老師的啟發,我做過幾個小 Projects,像是 life-commit (900 stars)、Never-Blink (800 stars, Winner of Fun Project of the year in React Summit 2020)。
雖說這些專案星星很多看起來很厲害,而確實也因為星星數帶給我極大的成就感,但事實上這些專案僅僅稱得上是「玩票」性質,既沒有嚴謹的架構,也沒有持續在維護,只是因為主題有趣才吸引到那麼多的關注。
因為認知到自己的不足,讓我對參與「世界級開源專案」更加嚮往,以前的我覺得只要有非常多星星就足以稱得上是「世界級」的專案,但我逐漸認知到,軟體專案最重要的是它的 Impact,比如是否真的被大型企業採用,或是解決什麼難題。
Apache 底下的專案皆符合我自己對世界級專案的定義。以 Submarine 來說,它是由一群資深工程師帶領維護,並且有實際被大企業 (LinkedIn, 貝殼找房) 等採用。
至於當 Committer 有什麼好處,我認為主要是:
- 累積 Credit: 全世界 Apache Committer 只有八千多位,這是個非常稀有且高價值的頭銜。
- 和世界接軌: 和頂尖的開發者建立connection,並和他們學習。
- 提升自身實力: 會學到新技術、大專案開發流程、專案協作方式等等。
看了 Apache Submarine Committer 的清單,發現有一位竟然是台大電機系的學長陳楷訓,於是我立馬在捷運上直接加他好友,簡單介紹一下我的經歷,學長就答應讓我加入,從此踏上不歸路。
開源組織是如何運作的?
Apache 組織科普時間
先簡單談談什麼是 Apache,Apache 內部的組織架構又是如何。
Apache 是全世界最大的開源組織,目前底下有 300 多個專案,根據估計每年可產生 $22B 的產值,Hadoop、HTTP Server 等知名專案都是由 Apache 所孕育。
Apache 專案的貢獻者分為三種位階:
- PMC: 最高權力者,可想像成專案中的 Engineering Manager,負責決定專案走向、時程規劃,也擁有提名 Committer 的權利。
- Committer: 達到一定貢獻程度後,PMC 們會把你拔擢為 Committer,可以獲得更高的專案權限(e.g. 可 merge code 到 master),還可以拿到一個超級潮的 Apache Email (e.g. byronhsu@apache.org)
- Users: 前兩者以外的都是 Users
目前全球約有 8000 位 Apache Committer,雖然此風氣在台灣較不興盛,但仍有許多前輩在為這塊領域默默耕耘著,包括莊偉赳、蔡嘉平、戴資力、葉祐欣、成大蕭老師等等,都不遺餘力地在培育台灣的開源人才,在此致上最大的 RESPECT!
你一定很好奇開源專案內部是如何運作的,大家都是無酬的情況下,如何推動專案的前進,此處我會以 Submarine 為例,向你介紹。
成員組成
我大致會把我們的成員分為三種:
- Senior Engineer: 又稱「大佬」,是任職於大企業的資深工程師,包括:Cloudera、滴滴打車、LinkedIn 等,基於興趣或者公司業務需要而加入專案,負責架構專案、實作雛形、規劃進度。
- Junior Engineer: 經驗不多的菜鳥工程師,大多為學生。不必擔心自己太廢沒有人會幫忙,社群裡的大佬對新人都極度友善,問問題他們都會秒回。
- Consultant: 領域的專家,比如 Facebook ML infra Tech Lead,他們通常不會親自下來寫 code,但我們若遇到問題可向他們請教。
專案管理
- 每週固定週會: 每週二中午 (約中午才不會佔用到工作時間) 會舉行 Weekly Sync Meeting,由 PMC 帶領大家討論,通常是報告當週進度,大佬們會給予回饋,有時週會也會邀請 Consultant 來演講,主題大多圍繞著 ML system。
- 分主題線下討論: 專案會同時有幾個小支線在進行,總不能任何事情都放在大會議上討論,因此每一個小組如果遇到問題,就會和社群的大佬約額外的時間開會。
- Code, Review, Merge: 當方向明確後就可以開始寫 Code 啦,寫完後發送 PR (Pull Request) 就會有人幫你 Review,如果沒問題就可以被 Merge 進 Master Branch。
我想成為 Committer,我該怎麼做?
1.「刷存」是最重要的
上面有提到,PMC 握有提名 Committer 的權利,成為 Committer 最重要的條件就是要讓 PMC 認識你,並且讓你的貢獻被看到,講簡單一點就是要在社群「刷存在感」。
當你對專案還不熟悉時,可以從簡單的事情做起,建立大佬的好感。
用心寫「自我介紹」:
剛加入社群時的自我介紹很重要,絕對不要只是「大家好,我是 XXX,很高興能加入,跟各位學習 : )」這類的幹話,你必須言之有物,寫出你擅長什麼 (e.g. ReactJS),你之前做過什麼專案 (e.g. Never-Blink) 以及你對什麼主題有興趣 (開發 Server),最好再貼上 Github 和 LinkedIn 的連結。
以我來說,我一進去就說我對網頁技術很熟悉,大佬們應該是對我有個印象,所以很快就 assign 一個 pending 已久的前端 issue 給我。
幫忙做週會紀錄:
這看起來很 trivial,但我覺得有非常多的好處。
在剛加入社群時,因對專案不熟悉,開會常會聽得霧撒撒。
透過做會議記錄,你會強迫自己去組織資訊,當聽不懂時,你也有個合理的理由發問,因為你是會議記錄,他們會解釋到你聽得懂才放心。
主動找大佬請教:
在初期什麼 tech stacks 都不會時,你可以直接向大佬請教這個專案會用到的所有 tech stacks,依據這些關鍵字去搜尋線上課程、官方教學等等。
會願意在開源社群的人個性都非常好,非常樂於分享知識。
大門永遠都是敞開的,只是你要主動去敲門。
當對專案較為熟悉以後,你應該也開始寫 Code 了,要特別注意的是,PMC 在意的並不是你寫了多少行 Code,發了幾個 PR,而是你對專案的貢獻度。
解決「重要」的問題
如果你每週參加週會,就會對大佬們較重視哪些議題有感覺,比如哪個 feature 是下個版本的重點,或者哪個 bug 已經延宕很久了但都解不掉。
不必擔心自己能力不足而不敢主動接任務,只要你主動說要做,社群都會提供你協助。
以我來說,我加入的時候剛好是 Submarine 0.5.0 完成,要跨入 0.6.0 的階段,當初 0.6.0 裡面有幾個目標,我就主動接起幾個任務,包括: TensorBoard 整合、重構前端、支援 NFS support 等等。
我認為我能被提名為 Committer 的原因,很大部分是我所做的貢獻真的有推動專案在前進。
在行動之前,先和大佬討論
雖說「積極主動」很重要,但如果都不和人家討論,就埋頭下去猛做,花了很多時間,結果卻不被社群接受,那就尷尬了。
因此,在做任何改動前,最好都先寫個簡易的 Design Doc(e.g. 畫個架構圖),拿去和大佬討論,確認方向是正確再開始行動。
2. 學會「自己找事做」
Apache 專案都有那麼多神人維護了,會不會找不到事情做?
絕對不會,再完美的專案一定都有它可以改進的地方,但如何一直找到事情可以做,我認為是有技巧的。
我會把專案比喻為迷宮:
參與大型專案就像是拿著手電筒在摸黑走迷宮,剛開始你覺得四周都很陌生,但隨著你照亮一個又一個新場景,你會對地圖越來越熟悉。
去哪找事做
最簡單的方法是直接問 PMC,他們對專案都有深厚的了解,知道目前還缺什麼。
更大型的專案(e.g. Hadoop)通常會有很多 rookie issue,可以從那邊下手。或者你可以試著從解 Flaky Test 開始(蔡嘉平大大的建議),解 Test 的同時你會學習到該模組的功用。
找哪類型的事做
我會建議你把每個組都碰過一遍,如此對專案能有更高層次的了解,以迷宮的比喻來說的話,是能照亮更大片的區域。
就 Submarine 而言,可分成前端、後端和 Cloud 的部分,我一開始的策略就是把三個組都碰過一次,這樣的好處是會更有「全局觀」,你能知道每個模塊的功用,同時也能訓練到不同方面的能力。
做完然後呢
在解 Issue 的過程中,你會踩到更多的 Issue,如此形成一個正循環。
解 Issue ➡️ 實力提升 (Lv 1) ➡️ 發現新 Issue ➡️ 解 Issue ➡️ 實力提升 (Lv 2) …
當你照亮更大片的區域,你同時會發現有新的坑洞可以修補,過程中你會變得越來越強。
3. 投資時間、組織知識
空出一段時間,專心投入
做開源專案相當花時間,在新手的時期,一週至少得花 20 ~ 30 hr。
如果你一週只能花 5 hr 在專案,你不太可能被 assign 到重要的 issue,因為社群會希望重要 issue 是能儘速被解決的。
我會建議你騰出空閒的一段時期密集衝刺一波,例如:寒暑假或者課修較少的學期。
像我自己是利用申請學校完 + 寒假的時間密集輸出 (2020/12 ~ 2021/2),那段時期把所有外務排開,每天除了休息就是在做 Submarine,那段時期一口氣就把很多 issue 解掉,刷了 20 多個 PR。
系統化整理知識,快速學習
從前我在學習技術知識時都只記在腦袋裡,沒有用筆記系統性整理的習慣。
但參與大型專案後會發現,有太多太多的新知要學習,那些知識量不是我小小腦袋裝的下的,我利用 Notion 來管理專案所有的資訊,我覺得還蠻受用的,分享給大家我管理的方法。
我套用的是 Notion 裡面叫做 Engineering 的模板,他裡面有幾個部分:
To-Do: 管理手上的 issue
我會把找到的、正在做的、已完成的 issue 都記下來,並把過程中遇到的問題記錄在 issue 的頁面內。
Engineering Wiki: 知識的筆記本
這裡先談談怎麼快速學習一門新知識。
我覺得這因人而異,有些人很厲害,直接啃 Man Page 來學 Linux(e.g. John Wu 大神學長),但我自己是不太行 XD。
如果是比較小型的工具(e.g. Helm, Selenium),通常核心概念都不多,這種可以直接去看他的官方教學,或者 Youtube 上應該也有蠻多教學影片(感謝印度人)。
但如果是比較複雜的工具(e.g. Kubernetes, Angular),核心概念不是三言兩語就能講完的,官方文檔也跟天書一樣。這種我建議可以直接買線上課程來看,像我自己就很喜歡用 Udemy,課程很便宜,持續有在更新,而且品質很高,能讓你在短時間完整地學習一門知識。
例如當時我 Kubernetes 看的是 Kubernetes Certified Application Developer (CKAD) with Tests,Angular 看的是 Angular — The Complete Guide (2021 Edition)。
我會把線上課程、文檔、部落格學到的內容整理成筆記,常用的指令做成 Cheatsheet,如此不僅能幫你梳理知識,也能在你之後回來看時,快速喚醒你的記憶,省掉許多時間。
結語
如果你現在是大學生,未來想成為軟體工程師,「做專題」或許不是你唯一的選擇。若你能在大型專案中發光發熱,成為 Committer / PMC,我相信你所會獲得的 Credit 絕對不亞於發論文到頂尖會議,同時你可以培養實戰能力,並建立有價值的人脈網。
看到這邊,如果你已經充滿熱血,準備大幹一番,我可以推薦你幾個專案。
如果你覺得你實力不錯,你可以嘗試 Kafka, HBase, Flink, Hadoop 這類的大型專案,點這裡有蔡嘉平大大的經驗分享。
如果你想入門,那你可以加入 Submarine, Ozone, Yunikorn 這類較小型的專案。
這幾個專案就我所知,都是有台灣 Committer / PMC 的,初期最好的方法就是找到一個大腿,請他帶你入門。
致謝
啊,終於寫完了,希望你看完有收穫。
感謝秉昂的貼文讓我加入 Submarine。
感謝楷訓、桓平學長一路拉拔我成長。
感謝文謙、Ryan Lo 等學長在過程中的幫忙。
感謝社群大佬 (e.g. Mr. Tang, Mr. Liu …) 的提攜。
感謝偉赳、宏毅老師對 NTUEE 開源專題的支持。
感謝嘉平、John Wu、資力、祐欣等大神願意來台大分享經驗。
感謝自己對於追求目標的偏執。