“How to Use Open Source and Shut the Fuck Up At the Same Time”
去年在用 Node.js 編寫一個(gè) side project 的過程中,,因?yàn)樾枰刹煌谌骄W(wǎng)站的 OAuth 登陸,所以接觸到了 passport.js 。雖然各類渠道都表明它似乎是 OAuth 解決方案的不二之選,,但是在實(shí)際集成的過程中發(fā)現(xiàn)問題頗多,,在前往 GitHub 上查看有沒有相關(guān)的 issue 時(shí),,驚訝的發(fā)現(xiàn) passport-github (passport 下允許使用 GitHub 進(jìn)行 OAuth 登陸的子模塊 )已經(jīng)至少有兩年沒有新的代碼提交了,。正在我納悶這個(gè)項(xiàng)目還會(huì)不會(huì)繼續(xù)維護(hù)時(shí),在主項(xiàng)目 passport 的 issue 里也找到了提出了相同問題的人:Library still mantained?這則 issue 的討論非常簡短,,很快就能閱讀完畢,。在我看來最能體現(xiàn)項(xiàng)目維護(hù)者對于這個(gè)問題的答復(fù),是他直接對于這則文章的引用:
“
”How to Use Open Source and Shut the Fuck Up At the Same Time“
”
你甚至不用讀完整篇文章,,光是看標(biāo)題就大致明白他的態(tài)度如何了,。這篇文章含標(biāo)題在內(nèi)一共使用了 fuck 這個(gè)單詞8次。它所表達(dá)的是作者對于開源社區(qū)目前“衣來伸手,,飯來張口”和“端起碗吃肉,,放下筷子罵娘”現(xiàn)象的不滿:作者認(rèn)為項(xiàng)目維護(hù)者完全是無償在貢獻(xiàn)出自己的時(shí)間,且從中沒有絲毫的獲利,,也就沒有義務(wù)滿足任何人提出的任何需求,;作者還認(rèn)為使用開源項(xiàng)目完全是各位自己的決定,,不愛用就滾——雖然“滾”這個(gè)詞在是我提煉出來的,但用來表達(dá)作者的態(tài)度一點(diǎn)都不夸張,。
這篇文章的作者可不是名不見經(jīng)傳的無名小輩,,他是 Eran Hammer,是 Node.js 社區(qū)中赫赫有名的 web 框架 hapijs 和數(shù)據(jù)驗(yàn)證類庫 joi 的核心貢獻(xiàn)者之一,,在 GitHub 上有超過 2k 的關(guān)注者,。
過去一年因?yàn)楣ぷ鞯年P(guān)系,我需要和越來越多的開源項(xiàng)目打交道,,自然就被動(dòng)地接觸到了開源社區(qū)中各種討論甚至爭吵,。雖然這些內(nèi)容最終只不過淪為我和朋友們茶余飯后的談資, 但聯(lián)想到幾年前 event-stream 被植入惡意代碼 以及 antd 的圣誕節(jié)彩蛋 等一系列事件,,不得不承認(rèn)這些“八卦”已然讓我對開源社區(qū)的信心產(chǎn)生動(dòng)搖。終于,, passport.js 作者的這則令我不適的回復(fù)則徹底點(diǎn)燃了我的好奇心:
我們究竟應(yīng)該以怎樣的姿態(tài)與開源項(xiàng)目相處,?
這個(gè)時(shí)候我才發(fā)現(xiàn)似乎我們每個(gè)人都置身其中,但實(shí)際上我們每個(gè)人也都置身事外:你可能下載過 lodash 這個(gè)類庫成千上萬次,,但是卻對它背后的維護(hù)團(tuán)隊(duì),、演進(jìn)路線和發(fā)布節(jié)奏一無所知;你會(huì)在antd 的圣誕節(jié)彩蛋事件的 issue 下會(huì)看到很多大跌眼鏡的評論,,但仔細(xì)想來你也無法對其擲地有聲地反駁,;拋開 Eran Hammer 文章中情緒化的文字,他所想表達(dá)的觀點(diǎn)也并不無道理:項(xiàng)目消費(fèi)者的權(quán)利和貢獻(xiàn)者的義務(wù)是否具有天然正當(dāng)性的,?
這篇文章不會(huì)對上述的任何一個(gè)問題予以解答,,它只不過是一個(gè)旁觀者在碎碎念中表達(dá)出來的個(gè)人意見而已,充其量豐富了你的認(rèn)知,。你所認(rèn)可的答案,,要靠你自己去探索才行,但它并非完全沒有意義——借用賈樟柯2013年在接受《三聯(lián)生活周刊》采訪時(shí)說過一段話:我拍《天注定》就是想從中跳出來告訴大家,,我們正在經(jīng)歷的時(shí)代到底是怎樣的,,只有把我們正在經(jīng)歷什么搞清楚,可能接下來才能知道將來要怎么辦——同樣地,,開源社區(qū)也值得被審視和反思,。落到我們的個(gè)人利益上,如果你正有打算發(fā)布開源項(xiàng)目的沖動(dòng)或者回饋開源社區(qū)的想法,,這篇文章在這些方面都能給你一些建議,。
當(dāng)我們在這篇文章中將自己抽離出來重新認(rèn)識(shí)開源社區(qū)時(shí),我們審視的并不是空氣,,而是實(shí)實(shí)在在的人和真真切切的事,。所以文章選取了大量開源社區(qū)中的事例,,來對觀點(diǎn)進(jìn)行說明,這些事例的選取是有傾向性的——我們當(dāng)然可以暢想如果沒有 Richard Stallman 或者 Linus Torvalds 開源社區(qū)會(huì)怎么樣,;如果沒有 GitHub 的話 mailing list 的協(xié)作方式會(huì)比現(xiàn)在更好嗎,?但很多時(shí)候與其追求宏大敘事,不如隨手截取一些開源社區(qū)的剖面展示在大家面前,,這些接地氣的例子始終會(huì)比 那些高高在上的假設(shè)更具有說服力一些,。
“On whose authority?”
Chris Zheng 在2017年發(fā)表了一篇名為 _On whose authority? _的文章,在這篇文章中他敘述了他個(gè)人從加入Clojure社區(qū)到失望離開的經(jīng)歷,,并且著力痛斥了導(dǎo)致他離開的主要原因 1. 迷信明星程序員,;2. 忽略社區(qū)的聲音;他認(rèn)為這些問題是由 Clojure 背后的商業(yè)贊助公司 cognitect 一手造成的,。
這篇文章中頻繁提到的明星程序員之一 Rich Hickey 在 Reddit 上對文章里提到的問題一一進(jìn)行了回應(yīng),,在回復(fù)的最后,他也毫不客氣地指出對于開源社區(qū)的攻擊等同于對所有無償付出的貢獻(xiàn)者的否定:
“
……In the end it's about people. You can't say fk XYZ and deny that it is an attack on the people who work on XYZ…… it's a bunch of people with families trying to make a living, pay their mortgages and send their kids to college. And, if you are talking about Clojure, you are talking to me. The indirection doesn't mask the attack on people, their work and their choices.
”
咨詢行業(yè)中的金句“不管一開始看起來什么樣,,它永遠(yuǎn)是人的問題”(溫伯格《咨詢的奧秘》)在這里也同樣成立——雖然我們?nèi)湓掚x不開“社區(qū)”,,離不開“項(xiàng)目”,但我們談?wù)摰谋举|(zhì)都是人的問題,。
事件背后的孰是孰非暫且擱置,,不過這個(gè)“On whose authoirty?”(誰說的算,?)實(shí)在是一個(gè)再經(jīng)典不過的問題了:當(dāng)一個(gè)開源項(xiàng)目發(fā)布到開源社區(qū)之后,,項(xiàng)目的擁有者是依然享有“統(tǒng)治”它的權(quán)力,還是應(yīng)該交由另一類人群來管理,,是一個(gè)經(jīng)久不衰的話題,。
大部分真實(shí)情況沒有那么復(fù)雜:誰擁有代碼倉庫提交權(quán)限,誰就有最后的決策權(quán),,甚至是生殺大權(quán):所以 Linus Torvalds 才得以排除眾議堅(jiān)持 Linux 應(yīng)該使用 GPL-2.0 而非 3.0 的開源協(xié)議,;而 Dave Gamache 可以選擇從2014年開始不再維護(hù) skeleton,哪怕這個(gè)項(xiàng)目在 GitHub 上的收藏?cái)?shù)量已經(jīng)達(dá)到了 18.2k 次,。
但現(xiàn)實(shí)是作為項(xiàng)目的維護(hù)者,,你很難忽略社區(qū)發(fā)出的聲音?;蛘邷?zhǔn)確來說,,阻止社區(qū)發(fā)出聲音。當(dāng)我們承認(rèn)這個(gè)無法避免的事實(shí)之后問題就變成了,,應(yīng)該如何對待社區(qū)的這些聲音,。
讓我們看一個(gè)實(shí)際的例子。
prettier 是一個(gè)將前端代碼格式化的工具,,去年中旬開發(fā)者 Vadorequest 以 issue 的方式向社區(qū)提出了一則建議,,他認(rèn)為目前 pretttier 格式化過于追求格式美觀,,而忽略了代碼的可讀性,他希望工具在設(shè)計(jì)格式化規(guī)則時(shí),,能夠?qū)⒏袷交蟠a的可讀性也考慮其中,。
如果你是項(xiàng)目的維護(hù)者你會(huì)怎么看待這則建議?獨(dú)立來看它的目的只是改善愿景,,甚至不存在代碼改動(dòng)的成本,,采納也未嘗不可。但如果我們把它歸納到 feature request 的標(biāo)簽下整體看這一類需求的話,,恐怕盡善盡美滿足每一則提議是不現(xiàn)實(shí)的,,一方面因?yàn)椋ㄎ以谙乱还?jié)會(huì)談到)維護(hù)者的精力有限,另一方面有的建議在提出時(shí)并非是經(jīng)過深思熟慮的,,甚至不同建議之間當(dāng)中還會(huì)存在互相矛盾的情況,。這種體驗(yàn)和你作為 leader 在團(tuán)隊(duì)中進(jìn)行技術(shù)決策非常相似:在項(xiàng)目架構(gòu)演化過程中會(huì)面臨太多的誘惑和方向以供選擇,我相信每一個(gè)給出這些建議的人都是出自真心,,我也相信每一則建議都有它的道理,,但你才是最終為決策負(fù)責(zé)的人。
即便這樣的技術(shù)決策并非出自于個(gè)人之手,,但也只可能出自于人數(shù)有限的小團(tuán)體之中。因?yàn)榧w的決策成本太高,,它絕非是最佳實(shí)踐,。《團(tuán)隊(duì)協(xié)作的五大障礙》一書中指出的協(xié)作障礙之一就是欠缺投入,,而欠缺投入的其中一個(gè)最重要原因就是追求絕對一致,。回想你目前所在公司內(nèi)網(wǎng)上的熱門討論,,任何被提出的觀點(diǎn),,大到制度改革小到文化衫投票,反對聲音總是存在,。在處理這些問題時(shí)我的意見正如我上一段所說,,辨別聲音的分量比感知聲音的大小更重要,向結(jié)果邁進(jìn)比盡如人意更有意義,。請放心,,無論是這樣的團(tuán)體還是個(gè)人都不應(yīng)該是隨機(jī)挑選出來的,他們應(yīng)該符合某種資質(zhì),,這種資質(zhì)的合法性來源于多個(gè)方面,,有來自于對于業(yè)務(wù)知識(shí)的長年積累,也有來自于對技術(shù)的深刻見解,,這些沉淀有助于他們來把握架構(gòu)的發(fā)展方向,,并從容應(yīng)對業(yè)務(wù)上的變化,。
類似的觀點(diǎn)早在《人月神話》一書中就提出過,在書中“外科手術(shù)”一章中作者指出_“需要協(xié)作溝通的人員的數(shù)量影響著開發(fā)成本,,因?yàn)槌杀?的主要組成部分是相互的溝通和交流,,以及更正溝通不當(dāng)所引起的不良結(jié)果(系統(tǒng)調(diào)試)”_。在軟件應(yīng)該由盡可能少量人員開發(fā)的前提下,,作者認(rèn)為軟件開發(fā)的團(tuán)隊(duì)模式類似于外科手術(shù)的方式進(jìn)行組建,,由一人拆解問題,其余人負(fù)責(zé)實(shí)施,。當(dāng)觀點(diǎn)發(fā)生沖突時(shí),,由外科醫(yī)生單方面進(jìn)行統(tǒng)一。并且為了追求系統(tǒng)中的概念的完整性,,專制統(tǒng)治也是可取的,。
歸根結(jié)底,我的結(jié)論是技術(shù)決策不應(yīng)該是直接民主的,。蘇格拉底之所以否定雅典城邦實(shí)現(xiàn)的直接民主制度,,是因?yàn)樵谒J(rèn)為既然我們生病的時(shí)候會(huì)去找醫(yī)生看病,那為什么當(dāng)城邦的健康出現(xiàn)問題的時(shí)候,,卻會(huì)認(rèn)為應(yīng)當(dāng)求助于普通人的意見呢,?技術(shù)決策也是同理,對于開源社區(qū)而言,,核心維護(hù)團(tuán)隊(duì)或者個(gè)人擁有對于整個(gè)項(xiàng)目最完整的上下文,。長時(shí)間傾聽社區(qū)的聲音,使得他們對于項(xiàng)目的現(xiàn)狀,,消費(fèi)者的訴求有全面的了解,。在掌握更完整的信息的前提下,我相信他們理應(yīng)比個(gè)體做出更理性的決策,。
開源社區(qū)中剛好有一個(gè)概念描述了這類角色的存在:仁慈的獨(dú)裁者(Benevolent Dictators)或者是終身仁慈獨(dú)裁者( Benevolent Dictator For Life),,簡稱為BDFL。
顧名思義,,獨(dú)裁者一言九鼎,,他擁有對項(xiàng)目社區(qū)中爭議問題的最終決定權(quán)。你大可不必?fù)?dān)心他成為一名濫用權(quán)力的“暴君”,,因?yàn)橐环矫孢@個(gè)稱謂只是一個(gè)榮譽(yù)頭銜,,是對退居二線曾經(jīng)常年為開源社區(qū)付出努力的貢獻(xiàn)者的認(rèn)可(比如 Guido van Rossum 之于 Python);另一方面他并非是開源社區(qū)中唯一的決策者,,而是當(dāng)作解決爭議問題的終審裁判,。在問題觸達(dá)他之前,社區(qū)的公共事務(wù)通常由少數(shù)人組成的委員會(huì)負(fù)責(zé)解決,也就是我們熟知的 TSC (Technical Steering Committee),。
比如在 Node.js 的社區(qū)治理章程中,,就詳細(xì)說明了 nodejs/node 是由核心協(xié)作者(Core Collaborators)來維護(hù) 。任何一則 pull request 都需要兩位協(xié)作者的批準(zhǔn)才能合入到代碼中,。協(xié)作者負(fù)責(zé)社區(qū)的日常運(yùn)營,,例如貢獻(xiàn)代碼、完善文檔以及解決疑問等等,;其中一小部分人組成的 TSC 則負(fù)責(zé)決定技術(shù)的演化方向,,制定社區(qū)章程等更高層次的議題。
而開源項(xiàng)目 SciPy 的治理方式則是委員會(huì)(Steering Council)與獨(dú)裁者并存,。委員會(huì)的候選成員在過去的一年中對項(xiàng)目的貢獻(xiàn)必須有質(zhì)量和數(shù)量上的保證,,由現(xiàn)有委員會(huì)提名產(chǎn)生。委員會(huì)負(fù)責(zé)項(xiàng)目的日常運(yùn)營工作,,包括但不限于項(xiàng)目方向的制定,,社區(qū)問題的解決,文檔的更新等等,。而當(dāng)前的 BDFL Pauli Virtanen 則只在委員會(huì)處理問題發(fā)生“死鎖”時(shí)做出決策,。為了防止權(quán)力被濫用,,項(xiàng)目還鼓勵(lì)任何與 BDFL 意見相左的人 fork 一份屬于自己 SciPy 代碼庫,。
如果以 GitHub 誕生之日為一個(gè)起點(diǎn)開始算起,,開源社區(qū)至少已經(jīng)經(jīng)過了數(shù)十年的發(fā)展,其中很多實(shí)踐已經(jīng)相當(dāng)成熟了,。https://opensource.guide/ 是 GitHub 官方發(fā)布的一個(gè)站點(diǎn),,來指導(dǎo)大家如何參與和維護(hù)開源項(xiàng)目,上面描述幾種社區(qū)治理形態(tài)幾乎就是在 Leadership and Governance 一章中的全部了,。抽象看,運(yùn)營一個(gè)開源社區(qū)和運(yùn)營其他形態(tài)的實(shí)體社區(qū)(比如大學(xué)社團(tuán))需要解決的問題沒有太大不同,,你同樣要面臨拉新,,提高留存率,發(fā)展第二梯隊(duì)等問題,;甚至你還需要想方設(shè)法拉取贊助(對應(yīng)于給項(xiàng)目建立贊助頁面),,為社團(tuán)制定活動(dòng)規(guī)范(對應(yīng)于社區(qū)的 Code of Conduct)等等。
最后,,我認(rèn)為無需擔(dān)心開源社區(qū)中“掌權(quán)”的個(gè)人和小團(tuán)體會(huì)演變成僭主(一個(gè)人統(tǒng)治且為了私人利益)或者寡頭(少數(shù)人統(tǒng)治且為了私人利益),。因?yàn)樵谙乱还?jié)中我會(huì)談到,維護(hù)開源項(xiàng)目無利益可言:與社交網(wǎng)絡(luò)恰恰相反,,你無法將日益增長的“粉絲”流量兌現(xiàn),,它越受歡迎,你心力交瘁的感受越是強(qiáng)烈。
現(xiàn)在我們已經(jīng)回答了一個(gè)問題,,那就是在開源社區(qū)中應(yīng)該由誰說的算,。如果說這場歸宿是有關(guān)開源項(xiàng)目終點(diǎn)的話,別忘了我們還沒有回答另一個(gè)更關(guān)鍵的問題,,那就是開源項(xiàng)目的起點(diǎn)在哪:為什么要有開源項(xiàng)目,。
“Pay Me or Fork This”
如果一則頗受歡迎的開源項(xiàng)目的維護(hù)者突然宣布停止維護(hù)項(xiàng)目,你會(huì)作何感想,?我猜你第一反應(yīng)情緒大多是負(fù)面的:疑惑,、不解、失望,、擔(dān)心——至少你肯定不會(huì)為他感到高興,。
但為什么不呢?為什么他要長達(dá)數(shù)年的無償?shù)臑槌汕先f人貢獻(xiàn)出他的業(yè)余時(shí)間,?
首先我們要承認(rèn)一個(gè)這樣的事實(shí):絕大部分開源項(xiàng)目成立的初衷大都出自于程序員的個(gè)人需求,,比如愛好、學(xué)習(xí),、市面上還沒有這樣的輪子等等,,絕非為了什么遠(yuǎn)大的目標(biāo)。Linus Torvalds 創(chuàng)造 Linux 當(dāng)初的目的“只是想作為一個(gè)愛好而已”(just a hobby, won't be big and professional ),,他發(fā)布 Git 系統(tǒng)也只是“想用一些腳本來更高效的追蹤代碼”(some scripts to try to track things a whole lot faster),。甚至這兩者的命名都是極個(gè)人化的。
甚至有的人只是為了好玩——event-stream 在被曝出安全問題之后,,項(xiàng)目的原維護(hù)者 Dominic Tarr 對于他為什么創(chuàng)造和離開這個(gè)項(xiàng)目給出了這樣的解釋:
“
I didn't create this code for altruistic motivations, I created it for fun. I was learning, and learning is fun. I gave it away because it was easy to do so, and because sharing helps learning too.
”
“
If it's not fun anymore, you get literally nothing from maintaining a popular package.
”
在我個(gè)人代碼倉庫中,,收藏?cái)?shù)量排名前三的開源項(xiàng)目也都統(tǒng)統(tǒng)源自于我的個(gè)人需求:Node-Simple-Cache 是為了解決一個(gè)工作上的緩存模塊功能;search-trie-tree 只是突發(fā)奇想希望更高效的解決問題,;而 scrapy_douban 只是為了解決當(dāng)時(shí)個(gè)人想在豆瓣小組里找房源而豆瓣又不支持合并查找和排序的問題,。
還有另一個(gè)我們可能都沒有意識(shí)到乃至不愿意承認(rèn)的原因是:GitHub 還具有社交屬性,程序員都想通過這個(gè)平臺(tái)擴(kuò)大自己的影響力,。2019 年有一篇名為 《社會(huì)地位即服務(wù)》(Status as a Service)頗有意思的文章事無巨細(xì)的解釋了現(xiàn)代社交網(wǎng)絡(luò)背后運(yùn)作的原理,。文中圍繞的中心以及反復(fù)提及的出發(fā)點(diǎn)就是“對于地位的渴望是源自于人類內(nèi)心的本能”:
people are status-seeking monkeys, always trying to seek more of it in the most efficient way possible.
并非所有渠道和平臺(tái)提供的社交地位都值得被一視同仁,社交地位價(jià)值還和稀缺性有關(guān),,如果用戶不需要付出努力就能輕而易舉得到的話,,那么以這種方式收獲的虛擬地位一文不值。GitHub 自然很具有想達(dá)成這層目標(biāo)的潛質(zhì),,它對所有人開放但并非所有人都能從平臺(tái)中脫穎而出,。但它畢竟不是為“社交”而生,所以從來沒有想過解決社交網(wǎng)絡(luò)里最常見的通?。喝绾伪苊廒A者通吃,,如何解決蒸發(fā)冷卻效應(yīng)。
這樣的趨勢是不可逆的,web 1.0 到 2.0 的進(jìn)化就是最好的證明,。2.0 時(shí)代的網(wǎng)絡(luò)將曾經(jīng)的信息孤島緊密的連系在了一起,,將信息的流通的方式從單向變更為了四通八達(dá)。這正是《未來簡史》中描述的數(shù)字主義興起的里程碑:如果你體驗(yàn)沒有被分享,,沒有人看到那就是沒有價(jià)值的,。數(shù)據(jù)由此產(chǎn)生了異化,曾經(jīng)數(shù)據(jù)只是內(nèi)容的點(diǎn)綴,,而現(xiàn)在內(nèi)容是數(shù)字的附庸,。
以上狀態(tài)無論是對于傳統(tǒng)上內(nèi)容媒體還是開源項(xiàng)目都同樣成立。不知道你有沒有想過這樣的一個(gè)問題:如何衡量開源項(xiàng)目的價(jià)值,?我相信你第一時(shí)間想到的依然是各種各樣的數(shù)值:收藏?cái)?shù)量,、fork 數(shù)量、維護(hù)者解決 issue 的效率等等——所有這一切在項(xiàng)目 Github 主頁的 Insights 標(biāo)簽下全部都有體現(xiàn),,甚至還包括你想不到的依賴圖譜——然而有意思的地方在于以上指標(biāo)其實(shí)是圍繞項(xiàng)目生長于平臺(tái)的間接信息,,而項(xiàng)目本身比如代碼質(zhì)量和它能提供的業(yè)務(wù)價(jià)值卻因?yàn)闊o法被量化而被忽略。
事情比我們想象的還要復(fù)雜,。
2016年 Azer Ko?ulu 因?yàn)樗l(fā)布在 npm (JavaScript 的包管理平臺(tái))上名為 kik 的模塊與某個(gè)公司的注冊商標(biāo)相同,,而被律師要求從 npm 平臺(tái)上撤下(unpublish)。一怒之下他撤下了所有的發(fā)布在 npm 上的模塊,。其中包括一個(gè)名為 left-pad 的模塊,。雖然這個(gè)模塊只有17行代碼,但卻導(dǎo)致整個(gè)互聯(lián)網(wǎng)的JavaScript 開發(fā)工作陷入癱瘓,,因?yàn)橛幸恍O其重要的模塊比如 Babel.js(一款 JavaScript 代碼的編譯工具)對 left-pad 存在依賴,。以至于 npm 的 CTO 和創(chuàng)始人之一 Laurie Voss 不得不采取史無前例的手段來解決這個(gè)問題——恢復(fù)被撤下的 left-pad 0.0.3 版本。
我們應(yīng)該怎么衡量這個(gè)項(xiàng)目的價(jià)值,?這17行代碼顯然不是不可替代的,;收藏?cái)?shù)量?截止項(xiàng)目被歸檔( archived)累計(jì)收藏?cái)?shù)量才 1.2k 次,。但就它能帶來的破壞力而言卻是其他更大體量項(xiàng)目望其項(xiàng)背的,。
我同意指標(biāo)的價(jià)值,但是如果不參考維護(hù)團(tuán)隊(duì)的規(guī)模,,維護(hù)者能夠投入的資源,用絕對的數(shù)值來評判是有失公允的,??蛇@恰恰是這個(gè)網(wǎng)絡(luò)時(shí)代需要的:鑒于我們早已經(jīng)被海量的數(shù)據(jù)淹沒,鑒于我們的注意力早已被碾壓的七零八落,,降低消化知識(shí)的門檻,,以及把權(quán)力交接給算法和他者看上去是一個(gè)不錯(cuò)的選擇。
泛社交化是一把雙刃劍,一方面它降低了開源社區(qū)的準(zhǔn)入門檻,,給了更多好的開源項(xiàng)目嶄露頭角的機(jī)會(huì),;另一方面它也讓更多的噪音有了可乘之機(jī)。在 GitHub 出現(xiàn)之前,,mailing list 是社區(qū)主要的溝通方式,,但如果你在決定加入某個(gè) mailing list 之前有閱讀過官方社區(qū)的提供的 FAQ 的話,那么你的念頭很有可能會(huì)被打消:linux-kernal 的 FAQ 長度堪比一篇論文,;Apache 的 tips 甚至?xí)嬖V你應(yīng)該避免使用“你”這個(gè)單詞,,因?yàn)檫@會(huì)引起人的戒備心。更不要提社區(qū)中的 Code of Conduct 了,。這些規(guī)則或者說是儀式感天然的會(huì)屏蔽掉部分人群,。而到了 GitHub 時(shí)代當(dāng)準(zhǔn)入的成本幾乎為零了之后,人們甚至要被反復(fù)告知不要在社區(qū)中添加無意義“我也是”的留言,,這樣對解決問題沒有任何幫助,。
從根本上與社交網(wǎng)絡(luò)不同的是,維護(hù)一個(gè)受人矚目的開源項(xiàng)目的成本比發(fā)一次 twitter 的成本高多了,。一旦你的具有一定的影響力和知名度之后,,對項(xiàng)目的精力的投入便會(huì)產(chǎn)生邊際遞減效應(yīng)。
pouchdb 的維護(hù)者之一 Nolan Lawson 專門寫過一篇名為 _What it feels like to be an open-source maintainer_ 的文章來吐槽維護(hù)開源項(xiàng)目的體驗(yàn):
“
Outside your door stands a line of a few hundred people. They are patiently waiting for you to answer their questions, complaints, pull requests, and feature requests.
”
對他而言 GitHub 的消息通知只會(huì)給他帶來源源不斷的負(fù)面情緒,,光是每天閱讀這些消息就已經(jīng)讓他心力交瘁了,。在Dominic Tarr 的在此之前的解釋中,用他的親身經(jīng)歷給出了一個(gè)似乎能為所有開源項(xiàng)目維護(hù)者辯解為什么要離開的理由——因?yàn)樨?zé)任與收益不對等:
“
One time, I was working as a dishwasher in a resturant, and I made the mistake of being too competent, and I got promoted to cook. This was only a 50 cents an hour pay rise, but massively more responsibility. It didn't really feel worth it. Writing a popular module like this is like that times a million, and the pay rise is zero.
”
我猜你現(xiàn)在才開始意識(shí)到 GitHub 的功能迭代是有方向性的,,它在盡最大努力減輕項(xiàng)目維護(hù)者的負(fù)擔(dān),,所以我們看到 GitHub 上有了issue 模板,pull request 模板,,機(jī)器人,,持續(xù)集成工具等等。
那我們作為項(xiàng)目的消費(fèi)者又能為項(xiàng)目維護(hù)者做些什么呢,?或者在提每一個(gè) issue 之前先前往 StackOverflow 或者是現(xiàn)有的 issue 看有沒有相似的問題,;或者在提交 issue 的時(shí)候可以精心準(zhǔn)備好能夠復(fù)現(xiàn)問題的 demo 來縮減維護(hù)者的時(shí)間;也許在提交每一個(gè) pull request 之前現(xiàn)在本地運(yùn)行單元測試看能否通過,。但說實(shí)話無論你如何小心翼翼的用愛發(fā)電,,不如考慮另一個(gè)更有效的方式——錢。
不知出于什么樣的原因,,faker.js 的維護(hù)者 Marak 決定“不再免費(fèi)為世界500強(qiáng)公司工作了,,要么給他一份年薪六位數(shù)的合同,要么 fork 這個(gè)項(xiàng)目然后自己維護(hù)去”,。這個(gè)帖子的標(biāo)題就叫作 No more free work from Marak - Pay Me or Fork This,。
令人欣慰的是,,大家回帖一律對他的決定表示支持,并出謀劃策為提供他籌款方面的建議,。由此可見大眾的思維也在逐漸發(fā)生轉(zhuǎn)變,,越來越多的人意識(shí)到雖然開源代碼是免費(fèi)的,但是貢獻(xiàn)者的時(shí)間并不是,,他們理應(yīng)得到回報(bào),。在這個(gè)共識(shí)之下市面上出現(xiàn)越來越多的平臺(tái)為開源項(xiàng)目提供第三方服務(wù),比如 open collective,、 xs code 和 gitcoin 負(fù)責(zé)籌措資金,, Maintainer.io 和 tidelift 為項(xiàng)目提供咨詢和診斷。
這其中最著名的要數(shù) patreon,,Vue 作者尤雨溪的贊助頁面就托管在這個(gè)平臺(tái)上面,,他發(fā)起贊助的目的非常明確:幫助他全職全身心的投入開源項(xiàng)目 Vue 的開發(fā)中。贊助選項(xiàng)中最“昂貴”的選項(xiàng)名為 Platinum Sponsor,, 贊助金額為 2000 美元且每個(gè)月只提供三個(gè)名額,。這個(gè)級別的贊助機(jī)構(gòu)或者個(gè)人的名字能夠出現(xiàn)在 Vue 官網(wǎng)頁面的每一個(gè)文檔頁面上。以我的觀察這一欄的名額供不應(yīng)求,。
相當(dāng)長的一段時(shí)間內(nèi)我都對在開源項(xiàng)目網(wǎng)站上進(jìn)行商業(yè)露出的行為感到厭惡,,認(rèn)為這不過是將流量兌現(xiàn)的把戲罷了,但時(shí)至今日我才意識(shí)到這可能只不過是開源項(xiàng)目在做默默的掙扎而已,。
關(guān)于為什么以及如何給開源項(xiàng)目籌集資金在 opensource.guide 的 Getting Paid for Open Source Work 一章有很詳細(xì)的說明,,我不再贅述。從這個(gè)主題自成一章的規(guī)格來看它的重要性不言而喻,。金融手段雖然不是支持開源社區(qū)唯一的手段,,但絕對是有力的手段之一。
“Transphobic maintainer should be removed from project ”
以上內(nèi)容只不過是整個(gè)開源社區(qū)現(xiàn)狀的冰山一角,。正如本文開頭所說,,這篇文章目的并非是給大家一個(gè)結(jié)論,而是呈現(xiàn)給大家更多平時(shí)被忽略的事實(shí),。如果說對于前兩小節(jié)的內(nèi)容我還能做到夾敘夾議的話,,那么有些話題根本就是超出我討論能力范圍之外,比如說有關(guān)道德與社會(huì)公共議題,。
2015 年年中開源項(xiàng)目 opal 的核心團(tuán)隊(duì)成員之一 Elia Schito 在 twitter 上發(fā)表言論認(rèn)為跨性別者不過是“不愿面對現(xiàn)實(shí)(not accepting reality)”,。這則言論被開源社區(qū)的一位意見領(lǐng)袖 Coraline Ada Ehmke (她也是開源項(xiàng)目“參與者公約(Contributor Covenant)”的發(fā)起人)發(fā)現(xiàn)并在 opal 社區(qū)中發(fā)起討論,認(rèn)為這種對跨性別者仇視者應(yīng)該從核心團(tuán)隊(duì)中被移除(Transphobic maintainer should be removed from project),。而維護(hù)團(tuán)隊(duì)中的另一位成員 meh 堅(jiān)決不這么認(rèn)為,,他認(rèn)為技術(shù)是與道德無關(guān)的,如果你想把他替換掉,,你應(yīng)該比他貢獻(xiàn)的更多才有資格說這話,。至今 Elia 依然是 opal 核心團(tuán)隊(duì)的成員。
如果說上面這個(gè)例子離你太遠(yuǎn)的話,,我們不如看一個(gè)更實(shí)際的:2017 年 3月餓了么前端團(tuán)隊(duì)在知乎上發(fā)表了一篇名為《寫在 Element 一周年之際》的文章,,其中除了對 Element 前端類庫誕生一周年表示慶賀以外,還對他們眼中 iView 抄襲的行為表示了譴責(zé),。當(dāng)然正如 iView 團(tuán)隊(duì)在評論區(qū)回應(yīng)的,,他們并不認(rèn)可餓了么前端團(tuán)隊(duì)對于抄襲的指責(zé)。
我不敢對這些事件做任何的評價(jià),,這類議題已經(jīng)超越了開源社區(qū),,它們更加宏大,同時(shí)也更加危險(xiǎn),?;ヂ?lián)網(wǎng)并非是討論這些問題的最佳場所,我們也并非是討論這些問題的最佳人選,。我在此談?wù)撨@些話題的目的并非是想讓一種聲音壓倒一切,,而是想讓不同的聲音都能傳播的更遠(yuǎn)。
平克弗洛伊德樂隊(duì)(Pink Floyd)的概念音樂專輯《月之暗面》(Dark Side of the Moon)絕對可以算作歷史上最偉大的音樂專輯之一,,它至今依然保持著 Billborad 累計(jì)停留958周的最高記錄,。
樂隊(duì)的貝斯手兼主唱 Roger Waters 對于專輯標(biāo)題中月之暗面的解釋是:一方面它象征著我們都不曾親眼見過的地方,但是卻不能否認(rèn)它的存在,;另一方面它也代指我們每個(gè)人不為人知想對大眾隱藏的負(fù)面,,我們應(yīng)該學(xué)會(huì)駕馭這些負(fù)面而不是讓它們占據(jù)我們。
開源社區(qū)的暗面就在那里,,我們無法不視而不見,。