參與開源項(xiàng)目很難嗎?
hello大家好,我是小樓。
流量真是個(gè)讓人捉摸不透的東西,有時(shí)候?qū)懥艘黄约焊杏X牛的不行的文章,結(jié)果閱讀數(shù)據(jù)慘淡,有時(shí)候覺數(shù)據(jù)可能沒那么好的文章,實(shí)際數(shù)據(jù)卻出乎意料。

之前的文章《慘,給Go提的代碼被批麻了》就是這樣,我以為就一般吧吧,沒想到卻“火了”。
這篇文章截止目前,發(fā)表的20天時(shí)間里,在掘金閱讀量突破1w,知乎閱讀量突破1.8w,頭條閱讀量破1.7w,微信公眾號的閱讀加上被轉(zhuǎn)載的閱讀也有1w,就連公司內(nèi)網(wǎng)的閱讀都有3k。
可以說這個(gè)數(shù)據(jù)是我從寫公眾號以來最好的了,但我并不覺得它是我寫得最好的文章,所以就很迷。
好了,以上只是寫技術(shù)文過程中的一點(diǎn)點(diǎn)驚喜,這樣的驚喜是我繼續(xù)寫好文章的最大動力,所以動動你們的小手,點(diǎn)贊+在看+轉(zhuǎn)發(fā)安排起來。
今天我就順著這篇文章來聊聊大家可能都比較感興趣的話題,開源。本文會結(jié)合自己的一些看法,從參與開源項(xiàng)目的收益和如何參與開源項(xiàng)目兩個(gè)方面展開。
參與開源項(xiàng)目的好處
首先要明確,為什么要參與開源項(xiàng)目?總得對我有點(diǎn)好處吧。每個(gè)人可能追求不一樣,所以我這里就列舉一下我知道的好處,看看有沒有戳中你的點(diǎn)。
- 小禮品
這點(diǎn)可能是被很多人忽略的點(diǎn),因?yàn)樘×?,但確實(shí)也算得上一個(gè)好處。如果你掌握了一些技巧,每年從開源社區(qū)拿點(diǎn)?。ㄞ叮┒Y(羊)物(毛)是很easy的。尤其是國內(nèi)的社區(qū),T恤、杯子、背包等等是很容易拿到的。
比如這兩年Nacos、Dubbo社區(qū)送我的一些杯具:


據(jù)我觀察,阿里的開源項(xiàng)目只要每年都去提一個(gè)PR,很大概率會送你禮物,不管這個(gè)PR是大是小,可以大到貢獻(xiàn)一點(diǎn)源碼,也可以小到format一下代碼、修改文檔中的一些錯(cuò)誤、增加一個(gè)單元測試等等,所以是不是學(xué)到了薅羊毛的技巧?
- 朋友圈素材
這點(diǎn)只是滿足一下虛榮心,其實(shí)并沒有什么卵用,但還是提一嘴,比如下面這些素材,是發(fā)朋友圈裝x的利器:


- 裝飾簡歷
如果你有參與開源項(xiàng)目的經(jīng)歷,寫到簡歷上一般是個(gè)加分項(xiàng),說一般情況是因?yàn)槲以诿嬖嚨臅r(shí)候遇到過候選人在簡歷上這樣寫:
參與貢獻(xiàn)過上萬star的項(xiàng)目。(后面還貼上了項(xiàng)目地址)
一看這句描述就有貓膩,為啥強(qiáng)調(diào)上萬star卻不說出項(xiàng)目名稱?于是我打開后面的github地址發(fā)現(xiàn),原來這個(gè)上萬star的項(xiàng)目是個(gè)聚合在線學(xué)習(xí)資料的項(xiàng)目。
不能說參與這樣的項(xiàng)目不好,只是簡歷上這句話讓我感覺在打擦邊球,所以不但沒有加分,反而減分了。
一般來說對項(xiàng)目有過貢獻(xiàn),無論大小,都可以稱之為Contributor,貢獻(xiàn)達(dá)到一定程度則稱為Committer,達(dá)到多少貢獻(xiàn)才能稱為Committer一般每個(gè)社區(qū)都有自己的衡量標(biāo)準(zhǔn),比如Nacos社區(qū)有明確的規(guī)定:

翻譯下就是:至少有8個(gè)PR,團(tuán)隊(duì)協(xié)作能力,理解項(xiàng)目的代碼風(fēng)格,能寫出優(yōu)秀的代碼。當(dāng)然也有很多社區(qū)沒有明文規(guī)定,總之就是貢獻(xiàn)越多越有可能成為Committer。
所以在簡歷中如果你是某個(gè)項(xiàng)目的Committer就很厲害了,一詞勝千言。退一步就算不是Committer,如果你有一些比較重要或者核心的代碼提交,也可以寫上,附上具體的issue。如果只是代碼的format、增加一些單元測試,我建議簡歷上就不要提了。
- 能力提升
通常開源項(xiàng)目的代碼、設(shè)計(jì)、規(guī)范都是比較優(yōu)秀的,和優(yōu)秀的人一起共事能成長更快。
一般我們在參與開源項(xiàng)目時(shí),都是使用英文來交流,所以對你的英文書寫能力是個(gè)提升。
其次代碼規(guī)范、測試能力、考慮事情的全面性都將得到鍛煉。
以我個(gè)人的感受來說,雖然嘴上說寫代碼要規(guī)范,但在公司寫代碼的時(shí)候,有時(shí)候就不太注意,都是以快速完成任務(wù)為目標(biāo),但開源項(xiàng)目不一樣,你寫的每一行代碼都要被眾多的大佬一行一行地review,只要有一點(diǎn)點(diǎn)不滿意都會要求你修改。
測試也是如此,你寫的每一行代碼都將被代碼測試,單元測試、集成測試。開源項(xiàng)目更相信用代碼測試,所以這也鍛煉了你寫測試和寫代碼的能力,寫出代碼不難,寫出容易測試的代碼還是比較困難的。
- 提升影響力
這是更高層級的追求,當(dāng)你想在技術(shù)上走的遠(yuǎn)的時(shí)候,需要一些業(yè)界影響力,這時(shí),參與開源是個(gè)不錯(cuò)的選擇,能結(jié)識更多的圈內(nèi)牛人,也讓大家能認(rèn)識你,你的圈子、人脈就會擴(kuò)張。
提升影響力有什么作用呢?最直接的是,讓別人知道你的存在,下一次機(jī)會來臨時(shí),說不定你會被看中或者推薦。
當(dāng)然我離這個(gè)層次還很遠(yuǎn),只是說一點(diǎn)自己的理解。
如何參與開源項(xiàng)目
- 參與開源的方式
上文其實(shí)也提到了,參與開源項(xiàng)目不一定是直接的貢獻(xiàn)源碼,也可以是對文檔的編寫或修正、寫一些單元測試或者測試用例、也可以寫一些開源項(xiàng)目相關(guān)的文章。
比如我在去年寫《Dubbo為什么要用Go重寫?》這篇文章時(shí),就順手把Dubbo-go項(xiàng)目的README改了

還有比如在寫《使用dubbo-go搭建dubbo接口測試平臺》這篇文章時(shí),把這篇文章投稿給了Dubbo-go官方網(wǎng)站,也被收錄進(jìn)去

這些都算是對開源的一種貢獻(xiàn)。當(dāng)然如果你有代碼的直接貢獻(xiàn)是最好的,這也是獲得技術(shù)成長最快的方式。
- 從哪里開始
如果我們平時(shí)工作中用到什么開源項(xiàng)目,沒事的時(shí)候可以把源碼下載下來翻一番,可以按照文檔跑起來,打上斷點(diǎn)看看是否跟自己想的一樣,這時(shí)我們便有了一些基礎(chǔ),可以去github上的issue找找,一般的項(xiàng)目會把issue分類,可以從標(biāo)了good first issue或者bug標(biāo)簽的issue看起,看看有沒有自己能解決的,再結(jié)合代碼,一步一步調(diào)試。
這種方式目的性比較強(qiáng),我就是沖著提交代碼去的,而且比較有時(shí)間去研究,目前我還沒用過這種方式,我更多的是下面提到的這種方式。
另外一種是如果我在使用開源項(xiàng)目的過程中發(fā)現(xiàn)了一個(gè)bug,或者一個(gè)可以優(yōu)化的點(diǎn),可以去github上提個(gè)issue先討論討論,如果社區(qū)的人也認(rèn)可你的觀點(diǎn),可以把你的修復(fù)或者修復(fù)作為一個(gè)PR提交上去。
這個(gè)方式我在Dubbo/Sentinel/Nacos/Skywalking/Go中都是這么干的,都是平時(shí)遇到的一些問題,反哺到社區(qū)。
發(fā)現(xiàn)問題往往比解決問題更困難,開源項(xiàng)目也是如此。
等等,在你想提交代碼前,我建議你好好看看開源項(xiàng)目的規(guī)范,一般位于項(xiàng)目的README或者官網(wǎng)中,他對issue有什么要求,對代碼有什么要求,對commit message等等都有什么樣的要求,如果不按照這些規(guī)范來提交,可能你的下場會和我一樣,一個(gè)字「慘」。
- 提交代碼流程
這一步網(wǎng)上資料比較多,我這里只說個(gè)大概的流程,具體到每一步我相信你能在網(wǎng)上找到更詳細(xì)的教程:
- 提issue討論(不是必須,有些項(xiàng)目可以直接提代碼)
- fork代碼倉庫
- 在fork的代碼倉庫拉一個(gè)分支,并把代碼提交到這個(gè)分支上
- 簽署Contributor License Agreement(簡稱CLA)
- 在這個(gè)倉庫上向原倉庫發(fā)起一個(gè)PR
- 等待代碼Review反饋,并按照反饋修改
- Merge進(jìn)代碼倉庫,貢獻(xiàn)完成
最后說一句
萬事開頭難,往往第一個(gè)PR是最難提交的,如果嘗試著提交了,我相信你會打開新世界的大門。
對了,雖然我參與到開源項(xiàng)目的經(jīng)驗(yàn)不夠多,但可以給你一點(diǎn)參考,有正例也有反例
- https://github.com/golang/go/pull/50023
- https://github.com/dubbogo/dubbogo.github.io/pull/7
- https://github.com/apache/dubbo/pull/8066
- https://github.com/apache/dubbo/pull/7929
- https://github.com/alibaba/nacos/pull/2403
- https://github.com/alibaba/Sentinel/pull/1045
- https://github.com/alibaba/Sentinel/pull/104
- https://github.com/apache/skywalking/pull/2930
- https://github.com/apache/skywalking/pull/2874
好了,今天的分享到此為止,如果文章中寫的有不清楚的地方,也歡迎加我微信MrRoshi私聊,我們下期再見!
