毫無疑問,開(kai)源(yuan)(yuan)已經成為(wei)未來軟件發展(zhan)的(de)一大重(zhong)要趨(qu)勢。對(dui)于企業(ye)來說,開(kai)源(yuan)(yuan)能(neng)夠進(jin)一步(bu)提(ti)升產品(pin)的(de)影(ying)響力,拉近與用(yong)戶的(de)距離(li),那對(dui)于程序(xu)員來說,開(kai)源(yuan)(yuan)又能(neng)帶來什(shen)么呢?作(zuo)為(wei)程序(xu)員的(de)你(ni),是否也會產生這些困惑:工(gong)作(zuo)這么忙,哪有時間參與開(kai)源(yuan)(yuan)項(xiang)目?程序(xu)員如何(he)才能(neng)加入到開(kai)源(yuan)(yuan)項(xiang)目中(zhong)去?閱(yue)讀一份開(kai)源(yuan)(yuan)代碼都很難,更別提(ti)去 Review 代碼了(le)(le)……為(wei)了(le)(le)找尋答(da)案,我們(men)溝通了(le)(le)幾位(wei)深入參與了(le)(le)開(kai)源(yuan)(yuan)項(xiang)目的(de)研發同事,把他們(men)的(de)相(xiang)關見解(jie)進(jin)行了(le)(le)整(zheng)理和總結。
首先要了解你自己,參與開源項目的初衷是什么
分享人:濤思(si)數據(ju)研(yan)發工程師 唐方智
作為一(yi)(yi)個(ge)有經驗的(de)(de)(de)程序員(yuan),大大小(xiao)小(xiao)的(de)(de)(de)項目我也參與了不少,程序員(yuan)圈子里的(de)(de)(de)一(yi)(yi)個(ge)現象是(shi),在做項目開發(fa)時總是(shi)覺得被(bei)趕著跑,這(zhe)或許(xu)也是(shi)大環境下(xia)的(de)(de)(de)一(yi)(yi)種無奈(nai)。對于這(zhe)一(yi)(yi)點,我后面開始有意識的(de)(de)(de)調節,方(fang)法(fa)之一(yi)(yi)就是(shi)積極地參與開源項目,和眾多開發(fa)者一(yi)(yi)起協作、分(fen)享、鼓(gu)勵,這(zhe)種心情(qing)也得到(dao)了極大地改善。
我(wo)(wo)(wo)參與開源項(xiang)目起源于(yu)一次偶然(ran)的(de)嘗試,因為幫助(zhu)同(tong)部門的(de)一個(ge)(ge)伙伴排查代(dai)碼缺陷而入的(de)坑。大概情(qing)況是,他(ta)認(ren)為一家開源社區的(de)代(dai)碼寫(xie)(xie)的(de)不(bu)好,就自(zi)(zi)己改(gai)了(le)(le)一下(xia)還(huan)(huan)提交了(le)(le) PR,結果被人駁(bo)回了(le)(le),他(ta)不(bu)相信(xin)自(zi)(zi)己代(dai)碼有(you)問題,覺得這個(ge)(ge)開源社區有(you)些針對(dui)他(ta),就拉(la)著我(wo)(wo)(wo)一起排查。但在排查之(zhi)后,我(wo)(wo)(wo)們(men)發(fa)現確實是他(ta)改(gai)寫(xie)(xie)的(de)代(dai)碼有(you)誤,之(zhi)后我(wo)(wo)(wo)倆合(he)作(zuo)修(xiu)改(gai)后再次提交了(le)(le) PR,令人高興(xing)的(de)是,很(hen)快就收到了(le)(le) GitHub 發(fa)來的(de)合(he)并成功(gong)的(de)通知(zhi)郵件,還(huan)(huan)收獲了(le)(le)社區代(dai)碼管理人員的(de)一個(ge)(ge)大大的(de)贊(zan)。
這(zhe)(zhe)次經(jing)歷讓(rang)我(wo)覺(jue)得(de)詫(cha)異(yi)的(de)(de)一點是這(zhe)(zhe)個(ge)社區的(de)(de)開發(fa)者水(shui)平,實話講,我(wo)幫著修(xiu)改的(de)(de)代(dai)碼(ma)提交確實有點難度(du),如果沒有資深的(de)(de)內核(he)開發(fa)功底是很難處(chu)理的(de)(de),但社區的(de)(de)開發(fa)者對(dui)于細微的(de)(de)對(dui)錯也能很快(kuai)分辨出來,其功底之強讓(rang)我(wo)眼前一亮(liang),對(dui)這(zhe)(zhe)個(ge)項目也產生(sheng)了(le)很大的(de)(de)興趣。
基于(yu)此,我關注了(le)這個開(kai)(kai)源(yuan)項目并成(cheng)為了(le)它(ta)的(de)(de)(de) Contributor,后面(mian)還參加過(guo)(guo)他們(men)組織的(de)(de)(de) Meeting Up,也(ye)和(he)社區的(de)(de)(de)開(kai)(kai)發(fa)者(zhe)頻繁(fan)地(di)探討技(ji)術問題(ti),令我驚(jing)喜(xi)的(de)(de)(de)是(shi)(shi),在(zai)(zai)這個過(guo)(guo)程中(zhong),我對此前略感枯燥的(de)(de)(de)開(kai)(kai)發(fa)工作有了(le)截(jie)然(ran)不(bu)同的(de)(de)(de)熱情。究其(qi)原(yuan)因(yin),我覺得是(shi)(shi)因(yin)為開(kai)(kai)源(yuan)社區和(he)封閉部門(men)集(ji)中(zhong)開(kai)(kai)發(fa)的(de)(de)(de)工作模式完全(quan)不(bu)一(yi)樣,在(zai)(zai)這里(li)你能遇(yu)到同道中(zhong)人,既(ji)能溝通(tong)技(ji)術,也(ye)會(hui) Battle 方法,而(er)這些(xie)社區開(kai)(kai)發(fa)人員也(ye)帶著一(yi)股對技(ji)術油(you)然(ran)而(er)生(sheng)的(de)(de)(de)熱愛,并沒有像(xiang)企業開(kai)(kai)發(fa)者(zhe)一(yi)樣被明確的(de)(de)(de)目標和(he)功利追(zhui)求所左右(you)。
綜上所述,我參與開源項目的初衷,一是覺得自己的代碼創作得到了認同,二是在日常的工作之余,關注開源項目讓我對程序員的日常有了新的感受,也為我打造了一個既能進步又不會產生太多束縛的社區圈子。我們在做任何(he)一(yi)件事情時明確(que)自己的(de)初衷和(he)目(mu)的(de)是很重(zhong)要的(de),如果你明確(que)了自己參(can)與(yu)開(kai)源的(de)初衷和(he)目(mu)的(de),不僅會干起來更(geng)有勁(jing),還(huan)能從中(zhong)享受到樂趣。
有意愿去嘗試,但如何行動?
分(fen)享人(ren):濤思(si)數(shu)據研發工(gong)程師 唐方(fang)智
我知(zhi)道還有(you)一(yi)些小伙伴(ban),有(you)心想要投(tou)入開源,但卻遲(chi)遲(chi)沒有(you)找(zhao)到(dao)有(you)效的(de)路徑。從(cong)參與開源的(de)經驗出(chu)發,我總結了以下幾點(dian)方法和路徑,給到(dao)大家參考:
(1) 圈定幾個目標,找到喜歡的項目。多關注 GitHub 上(shang)熱門(men)的方向,分析這些技術方向和(he)(he)自(zi)己想嘗試的方向是(shi)否匹(pi)配,從中選取技術體(ti)系(xi)和(he)(he)自(zi)己相符(fu)、應用前景和(he)(he)自(zi)己想從事(shi)的領域大致相同(tong)、并(bing)且項(xiang)目(mu)(mu)社區活躍、開(kai)發(fa)者相對豐富、交流(liu)也(ye)簡單的項(xiang)目(mu)(mu)。
(2)找到喜歡的項目后,可以多關注一些它們分享信息的渠道,包(bao)括微信群、博(bo)客(ke)、Twitter 、issue 郵(you)件(jian)通知、網站信息等,便(bian)于你(ni)及時地找到社區伙伴,并快速融(rong)入其中。
(3)嘗試對一些 issue 進行分析和解答。先不要急(ji)著(zhu)提出(chu)問(wen)題,可以先看(kan)下別(bie)人都提出(chu)了(le)哪些問(wen)題,結合你自己的技術實踐,看(kan)看(kan)這(zhe)些問(wen)題是否(fou)自己也能夠解(jie)答,這(zhe)樣基本可以評估(gu)出(chu)社區開發者(zhe)(zhe)的水平(ping)。當然,還是要理性地看(kan),期望一個社區中全是資深的精英開發者(zhe)(zhe),那是不現實的。
(4)去排查并嘗試解決一些 Bug。在進行漏洞修補(bu)的過程(cheng)中(zhong),能讓你更(geng)好地熟(shu)悉代(dai)碼結構(gou)和代(dai)碼內容,并對代(dai)碼中(zhong)的模塊有一個(ge)全局的認知(zhi)。
(5)嘗試做一次 Pull Request 。結合(he)你對(dui)(dui)項(xiang)目(mu)的熟悉(xi)和理(li)解程度(du),開始真(zhen)正地為(wei)項(xiang)目(mu)貢(gong)獻代(dai)碼力量,可以試著發起(qi)一些合(he)并請求,將你的 ideas 貢(gong)獻給(gei)社區(qu),并附上你對(dui)(dui)項(xiang)目(mu)和代(dai)碼的思考,看(kan)是否能夠獲取到(dao)一些共(gong)識。
(6)寫一些博客或者技術分享的文章。在文章(zhang)中可(ke)以(yi)對項目做一(yi)(yi)些剖析,去(qu)發現項目更多(duo)的(de)熱點,然后和身邊的(de)人一(yi)(yi)起(qi)討論,和志(zhi)同道合的(de)開發者融入(ru)到一(yi)(yi)起(qi),也(ye)為(wei)自(zi)己(ji)沉淀(dian)一(yi)(yi)些思考。
(7)參加一些線下的 Meetup 。以線下見面的(de)(de)(de)方式結識(shi)活躍(yue)在(zai)社區中的(de)(de)(de)網友(you),以及項(xiang)目的(de)(de)(de)開發成(cheng)員,去(qu)了解他們的(de)(de)(de)理(li)念和(he)價值觀,并(bing)做一(yi)些深入的(de)(de)(de)技術交流、行業交流,進一(yi)步(bu)拓展視野、思(si)維和(he)人脈(mo)。
(8)相信自己所做的努力和工作具有長期價值。當你真正身(shen)處其(qi)中后,你會發(fa)現參(can)與(yu)開源為自己和參(can)與(yu)其(qi)中的開發(fa)者帶來技(ji)能提(ti)升(sheng)和精神(shen)愉悅(yue)等諸(zhu)多價(jia)值,是(shi)幫助你實現成功的一(yi)個有效途徑,強化這股(gu)信念,最終讓自己熱(re)愛協作,熱(re)愛共(gong)享和開源精神(shen)。
我自己也參與過很多開源項目,就拿我目前在參與和建設的 TDengine 來講,現在基本上做物聯網大數據場景的企業,都會將其列為 Database 選型調研的產品之一,接下來隨著物聯網的快速發展,TDengine 一定還有更大的應用空間。無論是從哪個角度來看,自己參與建設的開源項目能夠一直得到發展和維護,這都是一件讓人非常愉悅的事情,畢竟它代表著我們對生活和技術的熱愛。
我們從開源項目中能獲得什么?
分(fen)享人:濤思數(shu)據研發(fa)工程(cheng)師 溫(wen)洲(zhou)
我(wo)從(cong)開(kai)(kai)源(yuan)(yuan)(yuan)項(xiang)(xiang)目(mu)中學(xue)(xue)到(dao)(dao)的第一(yi)(yi)件事就是(shi)(shi)如何去閱讀、理解(jie)大量的代碼,這也(ye)是(shi)(shi)成為一(yi)(yi)個專業選手的必經(jing)之(zhi)路。在當下開(kai)(kai)源(yuan)(yuan)(yuan)已漸趨流行的時代,開(kai)(kai)源(yuan)(yuan)(yuan)項(xiang)(xiang)目(mu)也(ye)是(shi)(shi)層出不窮,很多優秀的開(kai)(kai)源(yuan)(yuan)(yuan)項(xiang)(xiang)目(mu)源(yuan)(yuan)(yuan)碼都是(shi)(shi)經(jing)過(guo)實踐驗證、千(qian)錘百煉(lian)而成的,和我(wo)一(yi)(yi)樣年輕(qing)的程序員,可以從(cong)這些項(xiang)(xiang)目(mu)中學(xue)(xue)到(dao)(dao)很多課(ke)堂上學(xue)(xue)不到(dao)(dao)的東西。從(cong)自身開(kai)(kai)源(yuan)(yuan)(yuan)經(jing)歷出發,我(wo)總結了以下四個方面的獲得:
- 編碼風格。在開源項目中你可以看到各種各樣的編碼風格,盡可能讓自己嘗試去適應這些不同的風格。此外,你還能通過代碼風格辨認項目專業程度,如果一些項目使用了多種編碼風格,那它就會顯得不太專業,統一的代碼風格對于代碼的可閱讀性非常重要。
- 編譯方式。從開源項目中你可以學習到不同的編譯方式,例如:Make、CMake、GYP 還有各種 IDE,學習到如何用各種方式配置你的工程。
- 代碼管理方式。從開源項目中你可以學到不同的代碼管理方式,例如:SVN、GIT。學會熟練地使用它們,并且高效地運用到開發過程中,這會幫助你更加深入地了解項目分支的管理。
- 解決問題的方式。從開源項目中你可學習到工程師是如何解決問題的,比如如何選擇算法、如何選擇庫、如何把設計轉化為模塊等,借鑒他們的經驗來幫助自己更好地解決工作中出現的問題。
Review 代碼真的很難嗎?
分享人(ren):濤思(si)數據解(jie)決方案架構師 劉溢清
不知(zhi)道大(da)家有(you)(you)沒有(you)(you)這樣(yang)的感受:閱讀一份開(kai)源代(dai)(dai)碼太難了,更別提去(qu) Review 代(dai)(dai)碼了;面對一個(ge)龐大(da)的開(kai)源項(xiang)目(mu),真的不知(zhi)道如何下手……我(wo)之(zhi)前也有(you)(you)過這種困惑(huo),直到后來(lai)在使(shi)用(yong) TDengine 這款 Database 時(shi)遇到了一個(ge)問(wen)題(此時(shi)還尚未加(jia)入濤思(si)數(shu)據)——我(wo)需要從 TDengine 遷移數(shu)據,官方(fang)提供了一個(ge) taosdump 工具,但是(shi)導出的數(shu)據表有(you)(you)丟(diu)失。
當時我(wo)第一(yi)時間向(xiang)官方反饋了這(zhe)個問題,但由(you)于源碼是開(kai)源的,我(wo)就想抱著試(shi)試(shi)看(kan)的心理(li),自己進行(xing)一(yi)下(xia)修復。隨后我(wo)就打(da)開(kai)了 TDengine 在 GitHub() 上的源碼。

二話不說,gdb 走(zou)起:
(gdb) p tableDes->cols[26]
$17 = {field = "inspection_well_place", '\000' <repeats 44 times>, type = "NCHAR\000\000\000\000\000\000\000\000\000\000", length = 150,note = "'一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一", <incomplete sequence \344>}
(gdb) p tableDes->cols[27]
$18 = {field = "\270\211四五六七八九十一二三四五六七八九十一二三", <incomplete sequence \344>, type = "\272\224六七八", <incomplete sequence \345\215>,length = -1159429960, note = "\214三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三", <incomplete sequence \344>}
隨(sui)后發現在代碼里(li)已經把(ba)這個字段截斷了,回過頭去查(cha)看代碼,發現這里(li)對導出字符的長度做了限制:
#define COL_NOTE_LEN 128
接下(xia)來把這個長度(du)改(gai)得(de)更長了一些,編譯(yi)運行,表(biao)就(jiu)順利地導出了。我(wo)(wo)也成(cheng)功參與到(dao)了開源的事情中了,自我(wo)(wo)感覺還(huan)挺良好。
試想一下(xia),如果說當初選擇(ze)了(le)一個閉源的軟件,發(fa)(fa)生了(le)這個問題或(huo)者有了(le)新的需求,我們就(jiu)只(zhi)能去聯系開發(fa)(fa)團隊,至于什么時候能夠(gou)修復或(huo)者開發(fa)(fa)都還是個未知數。如果不幸開發(fa)(fa)團隊已(yi)經解(jie)散,就(jiu)徹底涼涼了(le)。
除(chu)此之(zhi)外,在我看來開源軟件還有(you)很多優點:
- 開源的代碼讓人更有信心去使用。源碼開源,別人就可以去研究底層的實現,可以去證實你的功能和實例。
- 好的開源項目,代碼質量更高。越是好的開源項目,越是有更多的人愿意去維護他,久而久之,功能就會越來越完善,代碼也會越來越健壯。
- 好的開源項目,代碼更持久。一個好的項目不只有作者自己維護,還會吸引更多的開發者去協同,如果作者不再維護,也會有其他的人站出來繼續維護。
- 開源的代碼可以有更多的客制化開發。沒有一個工具可以做到適用于任何場景,每個項目都會有各自不同的需求,我們可以根據需求來定制屬于自己的版本。當初阿里選擇 Flink 的時候,Flink 也并沒有多么完善,阿里也是重構了 Flink 的分布式架構,實現了增量的 Checkpoint 來應對阿里的需求。
通(tong)過(guo)參(can)(can)與 TDengine 開源(yuan)(yuan)這件事,我(wo)也給自(zi)己建立(li)了信(xin)心,發現其實參(can)(can)加開源(yuan)(yuan)并沒有我(wo)們(men)想象的(de)那么難,以(yi)至于后來我(wo)越來越多地參(can)(can)與到了開源(yuan)(yuan)的(de)項目中:

從這件事情(qing)說(shuo)起,不僅(jin)是為了分享我是如(ru)何踏(ta)入開源大門的,也(ye)是為了證明 Review 代碼(ma)真的沒有很難,你可以從以下三點出發:
- 需求驅動:對于需求驅動型的人,帶著需求去學習,效率才是最高的。很多時候,我們并不需要通讀所有的代碼,完全可以從自己的需求出發,這樣也會充滿動力。
- 選擇低起點:我們可以從一些簡單的模塊入手參與到開源項目中,較低的起點更容易上手實踐,也有利于更深入地去閱讀其他代碼。
- 高效使用工具:通過 gdb 等自己擅長的調試工具,能更快地了解代碼運行邏輯,了解參數、棧的信息,對于源碼閱讀很有幫助。
一些好上手的開源項目推薦
分享人:濤思數(shu)據研發工程師溫洲
萬事(shi)開(kai)頭難,對(dui)于(yu)新(xin)手來說,面(mian)對(dui)龐大數量的(de)代碼時肯(ken)定會(hui)很(hen)困(kun)惑,所以(yi)我們可(ke)以(yi)選擇一些(xie)對(dui)初學者(zhe)(zhe)友好的(de)項目開(kai)始。下面(mian)這幾個項目是我參與過的(de),對(dui)于(yu)初學者(zhe)(zhe)來說上手會(hui)相對(dui)容易。
- Mozilla Firefox Source Tree
Mozilla Firefox Source Tree 包(bao)含有十多(duo)個(ge)子項目。他(ta)們(men)提供了完(wan)備的文檔,便于(yu)新的開(kai)發者(zhe)上(shang)手、貢獻代碼(ma)。因(yin)為整個(ge)開(kai)發涉及到的技術比較多(duo),他(ta)們(men)還設立了單獨的 Channel,開(kai)發者(zhe)可以(yi)在(zai)這(zhe)些 Channel 尋(xun)求幫助。在(zai)他(ta)們(men)的文檔頁(ye)面上(shang),列舉了一些 BUG、缺陷等,開(kai)發者(zhe)可以(yi)從這(zhe)些基礎問(wen)題入手嘗試進(jin)行(xing)學習或者(zhe)開(kai)發。
- Visual Studio Code
VS Code 是一(yi)個(ge)相當大規模的開源(yuan)軟(ruan)件(jian)。目(mu)前(qian)這個(ge)軟(ruan)件(jian)有(you)超過(guo) 5000 個(ge)開放式問題(ti),這就意味著你(ni)可(ke)以(yi)很容易地從(cong)中選擇出一(yi)個(ge)或者幾個(ge)問題(ti)來重(zhong)點(dian)跟(gen)蹤。在此過(guo)程(cheng)(cheng)中也可(ke)以(yi)提交新(xin)的問題(ti)、新(xin)的特性要(yao)求,對于你(ni)學習這個(ge)工程(cheng)(cheng)會有(you)很大幫助。
- TDengine
TDengine 是濤思數據使用 C 語言自主研發的一款時序數據庫(Time-Series Database),已(yi)在 2018 年 8 月推(tui)出正式商(shang)業化版(ban)本,目前(qian)單機和集群版(ban)均已(yi)經(jing)實現開(kai)源,是(shi)一(yi)款較為流行的(de)(de)時(shi)序數據(ju)庫(ku)產品。如(ru)果你(ni)(ni)對數據(ju)庫(ku)或(huo) C 語言感興(xing)趣,那可以(yi)嘗(chang)試(shi)閱讀一(yi)下(xia) TDengine 的(de)(de)代(dai)碼,都有比(bi)較完整的(de)(de)文(wen)檔(dang)說明,上手(shou)操作會(hui)比(bi)較容易。如(ru)果你(ni)(ni)愿意,你(ni)(ni)甚至(zhi)可以(yi)參與到項目的(de)(de)開(kai)發中。
寫在最后
很多(duo)(duo)人在參(can)與(yu)(yu)(yu)開(kai)源項(xiang)(xiang)目時,往往會糾(jiu)結于(yu)自身(shen)時間有限、知識(shi)儲備不(bu)(bu)足(zu)、不(bu)(bu)知道如何(he)開(kai)始、找不(bu)(bu)到合(he)適的(de)項(xiang)(xiang)目,因此一拖再拖,直到熱(re)情(qing)消退。但其(qi)實參(can)與(yu)(yu)(yu)開(kai)源項(xiang)(xiang)目根本不(bu)(bu)需要(yao)考慮太(tai)多(duo)(duo),它不(bu)(bu)像日常的(de)公司項(xiang)(xiang)目開(kai)發(fa),有進度(du)要(yao)求、規劃協作(zuo),很多(duo)(duo)開(kai)發(fa)者參(can)與(yu)(yu)(yu)開(kai)源就是為了緩解工(gong)作(zuo)中(zhong)各種壓力(li)的(de)。你(ni)可以(yi)隨(sui)時隨(sui)地投入到這項(xiang)(xiang)事業(ye)中(zhong),不(bu)(bu)需要(yao)有任何(he)壓力(li)和(he)包袱,在這里可以(yi)盡(jin)情(qing)地發(fa)表自己對于(yu)技(ji)術(shu)和(he)代碼的(de)看(kan)法,與(yu)(yu)(yu)其(qi)他的(de)社區成員溝通和(he)交(jiao)流(liu)。
從上面三位開源參與者的分享中我們也可以總結出參與開源的意義:當你真的成為一名開源社區的貢獻者后,你會為自己的 idea 被社區接納而興奮,會為和社區開發者們愉快真誠的協作而開心,會因為偶爾一次的線下見面會彼此感情的增進而愉悅……你會發現,除了日常的工作之外,原來還能和一群有共同志向的朋友一起做這樣有價值有意義的事情,過程中你不僅收獲到了更多的認可和成長,也對技術和工作產生了更多的熱情。


























