今天是個不錯的日子,最開始由我帶進 nerdctl 社區的 @yuchanns 因為其很活躍的表現被項目的主要維護者 @AkihiroSuda 推薦成為了項目的 maintainer,參見 nerdctl#PR1540。而我也在這個項目中被提名成為 committer,參見 nerdctl#1539。加上今天的公益群有太多關於開源的討論,所以我想寫篇文章記錄下我自己的經歷,希望能幫助更多的人熱愛開源,擁抱開源。
為什麼我會參加開源#
我參與的第一個開源項目,應該是能追溯到 16 年,我還沒有本科畢業的時候,當時的我參加了 稀土掘金翻譯計劃(slogan 裡說的最好的英文技術資訊翻譯項目,我覺得毫不誇張),在這個項目裡我第一次接觸到了 Git Workflow,也完整接觸到了 GitHub 這個世界最大的同性交友社區(大霧(不過我相交至今對我幫助巨大的幾位密友真的是通過這個項目結識的)。而我第一個參與的代碼項目,應該可以追溯到 17 年 3 月,我給 Sanic 這個項目新增了一個 Code Example,參見 Sanic#PR558。
在往後,我就一直在不斷的參與開源社區,到現在為止,我貢獻過不少的開源項目,CPython,Docker/Moby,Taichi,Logseq,Kubernetes,Dubbo,TiDB,nerdctl 等等。我也在不斷的學習開源社區的工作方式,我也在不斷的學習開源社區的文化,我也在不斷的學習開源社區的技術。(最後面這句由 GitHub Copilot 自動完成)(XD
那麼回到這一章的標題,我為什麼會參與開源社區?或者更功利的說,開源社區給我帶來了什麼樣的利益?
無他,對於我自己全方位的成長。
首先,參與開源社區對於我來講,對於我自己是一個非常非常棒的提升的過程。你可以在這裡面學到很多的東西
- 怎麼樣去有效的說服別人
- 怎麼樣去寫好 UT
- 怎麼樣去打磨 code style
- 怎麼樣去幫助同為新人的其餘人
更早的鏈接先不談,大家可以看我 2022 年在 nerdctl 項目的貢獻 nerdctl#ZheaoLi,大家可以很明顯的看到,我的 PR 從最開始到後面,無論是質量,還是風格都有不少的提升。這實際上就是開源社區所帶給我的最直觀的成長。我很慶幸有很棒的 Community Mentor 對我的 PR 從不放水,Review 非常嚴格,促使我不斷的成長。
同時,讓我也有機會去表達自己的想法,去發起 Proposal(比如 nerdctl#Issue1387),去學會做一個 Owner,去幫助更多的新人參與進來。
某種意義上,這是日常的工作所給予不了我的特殊的體驗,開源社區相對較少的利益糾葛,會讓互利互惠的行為變得更純粹,更加的自然。也會讓人收益更大。這裡引用 @yuchanns 今晚的一段發言
我想大家剛學編程的時候都會有這種困境:學完不知道幹啥、感覺好像沒學,所以就想尋找各種實戰教程來加深體會。
這種現象會在實際從事工作後迅速消除,因為有了實際應用場景。
但是當你對一些其他領域的東西產生興趣,又會有這種困惑;而這是工作中不太有機會接觸到的東西。除非你換了個工作、不然沒法再通過工作經驗來擺脫困境。
這時候參與到一個開放式的社區就很好了。其他人的工作中產生的需求給你提供了實戰機((
你不需要自己一一涉足到具體的工作中,只要解決他們延伸出來的需要,就可以有機會運用學到的東西((
當然,從功利的角度來說,積極的參與開源社區,你能認識很多有意思的人,讓你職業生涯更為順利也是能給你帶來的好處就是了(
那麼怎麼樣去參與開源社區#
參與開源社區無外乎有兩種途徑,
- 自己創立一個項目的開源社區
- 加入一個已經存在的開源社區
我主要會討論下後者
很多人會給出開源三問 “我想參與開源社區,但是我不知道怎麼做”,“我想參與開源社區,但是我不知道怎麼找到一個項目”,“我想參與開源社區,但是我太菜了怎麼辦啊”
實際上這些問題解決起來都是沒有你想象的那麼困難,可能只是需要一點行動能力加一點好奇心。
實際上發展到現在,開源社區已經極其的龐大了,無論你的技術棧是什麼,你都能找到合適的項目去參與。而且,開源社區的參與門檻也越來越低了,你不需要去了解整個項目的代碼,你只需要去了解項目的 Issue,然後去解決這些 Issue,就可以參與到開源社區中來了。那麼 How to find a project to contribute to ?
我自己的途徑有兩個
- 通過 GitHub 的 Explore 頁面,找一些新的項目,看這個項目是否戳中了我的痛點
- 社交媒體上大家的宣傳
nerdctl 這個項目的實際上的來源就是當時好友 @Junnplus 在推上的推廣
然後我去看了下這個項目的定位,發現這個項目實際上戳中了我的痛點,於是我就開始在自己的環境中使用這個項目。
實際上去找到你感興趣的項目實際上不是一件難事,可能只是需要一點點好奇心
那麼,我找到一個項目後,我應該怎麼樣去參與進去?
實際上這裡就需要一點行動力了,我自己大概方法是這樣
- 掃 Issue 區,以及訂閱項目,一個項目的 Issue 能讓我一定程度上的去了解這個項目的發展方向
- 我會不斷的去使用這個項目,將我在使用中的問題轉化成 Issue,進而轉化成 PR
- 我會用我已有的知識進行遷移,嘗試是否有可能發現新的潛在的問題
以 nerdctl 為例,Issue 區時不時的會有 Good First Issue 的出現,這個時候你可以主動的去認領對應的 Issue 進行貢獻(從我的視角來看,項目的維護者對於 Good First Issue 的上心程度將會決定了一個項目的長遠發展),@yuchanns 第一个 PR nerdctl#PR1331 實際上就來源於我提的一個 Good First Issue nerdctl#1330。當然對於一個已經有一定規模的項目來說,坐著等 Good First Issue 可能需要點運氣,那麼怎麼辦,答案就是第二,第三點
我在 nerdctl 第一个貢獻的 PR nerdctl#PR790 來自於我提出的 Issue nerdctl#Issue775 ,這個 Issue 是我在使用過程中發現的 Bug,簡而言之就是在私有鏡像倉庫下鑑權的一些問題。然後將 Issue 轉化成對應的 PR 了。我在這個項目中其餘的一些貢獻也是修我自己遇到的一些問題
另外一個方法是,我會用我已有的知識去進行遷移,嘗試是否能發現有潛在的問題。我在 Affine(一個非常棒的筆記項目) 提的 PR Affine#PR403 是我在本地構建 Affine 的時候,順手讀了一下他們的 Dockerfile(我是 SRE,對這個比較敏感(不然前端項目我去讀 Dockerfile 幹嘛),發現他們沒有高效的利用緩存,然後我就提了 PR,進行了構建加速。這是實際上就是跨領域的去看一個項目能給你帶來不一樣的視角,進而促進你對項目的貢獻。
那麼,開源三問最後一問,” 我想參與開源社區,但是我太菜了怎麼辦 “
首先要說一點,開源社區的精髓就在於邊做邊學邊成長,比如 @yuchanns 在寫 nerdctl#PR1407 的時候(這個 PR 主要是給容器新增一個可以綁定 MacAddress 的選項),他當時對於 CNI 這塊也不是很熟悉,然後邊做邊學,我和他也在群裡討論過幾次方案。最終 PR 合併的非常順利。這某種意義上也是開源社區的一種樂趣與魅力。
那如果你說你現在就是背景知識不夠,你想等再學學再寫代碼,那還能貢獻嗎?可以啊,用 @tison 的經典言論” 一個社區的活絕對是很多樣的 “。你看,我給 bytebase 提 Bug 的時候,發現他們的 Ticket 模板太難用了,然後我交了Bytebase#PR3050 重構了他們的 Issue Template,後面他們基於我的基礎上又完善了一波。所以,無論是 Issue,文檔完善,幫助完善用例等,都是很棒的參與開源社區的方式。
當然可能新進來的同學還有個顧慮就是如果被拒絕了怎麼辦?那其實很常見,你看我拍腦袋給 lima 提的 lima#Issue1087 被拒的很慘。但是被拒絕也是一種學習,能讓我自己從這個討論的過程裡去回顧到我思考不完善的地方。
所以看到這,你會發現,參與開源社區,真的沒有那麼難。需要的真的只是一點點行動力,以及一點點的好奇心而已
總結#
從互聯網誕生之初到現在,開源這一極具理想主義氣質的行為事實上改變了這個世界。世界各地的人都在開源的旗幟下,自由的揮發著自己的創意,盡情的一點點的改變著這個世界。有些時候想到我會有機會去參與到這樣一個偉大的活動中,我會不由自主的顫栗。我很慶幸在我最初的職業生涯裡就加入到了這個偉大的事業,我也希望我身邊會有越來越多的人參與進來,一起揮灑著汗水,一起在這個操蛋但是又美好的世界裡,找到自己心靈的應許之地。
Long Live the Open Source!