灣區(qū)日?qǐng)?bào)·第857期
作為一名開源項(xiàng)目的維護(hù)者是一種什么樣的體驗(yàn)
原文鏈接
by zzq
數(shù)百人站在你家門口简卧,耐心地等你去解決他們地問(wèn)題屠橄,抱怨族跛,合并代碼請(qǐng)求,新功能請(qǐng)求锐墙。
你想去幫助他們所有人礁哄,但是你現(xiàn)在正在推遲∠保可能你今天工作不順利桐绒,或者你累了,或者你只是想和家人朋友享受一個(gè)周末之拨。
如果你去看一眼github上的通知茉继,它總會(huì)提醒你有多少人在等。
當(dāng)你安排出一些空閑時(shí)間蚀乔,開門迎接第一位等待的人烁竭。這些人都是很好心的,他們嘗試使用你的項(xiàng)目但對(duì)API有些困惑吉挣,他們已經(jīng)把代碼帖在Github評(píng)論里颖变,但他們忘了或者是不知道怎么去格式化代碼,所以他們的代碼真的是一團(tuán)亂听想,難以閱讀。
幸運(yùn)的是马胧,你編輯他們的評(píng)論來(lái)添加一個(gè)代碼塊汉买,代碼很好的格式化了,但仍然有一大堆代碼要去讀佩脊。
然而蛙粘,他們對(duì)問(wèn)題的描述難以理解⊥茫可能這個(gè)人的母語(yǔ)不是英語(yǔ)出牧,或者他們不擅長(zhǎng)通過(guò)文字進(jìn)行交流,你也不確定是什么原因歇盼。無(wú)論如何舔痕,你艱難地去理解他們所寫的段落。
看到后面還有上百人在排隊(duì)等候,你有些不耐煩了伯复。你可以花費(fèi)半小時(shí)去理解這個(gè)人的代碼慨代,或者你可以僅僅瀏覽以下然后給出一些教程和文檔的鏈接,這很可能無(wú)法解決他們的問(wèn)題啸如。你也可以興奮的告訴他們?nèi)L試以下StackOverflow或者Slack的Channel侍匙。
下一個(gè)人皺著眉頭。說(shuō)出一大堆的抱怨話叮雳,他們覺得由于你的某個(gè)API沒有按照公布的方式工作而浪費(fèi)了他們生命中的兩個(gè)小時(shí)想暗。他們的風(fēng)涼話讓你想你心里不爽。
你沒有在這個(gè)人身上浪費(fèi)很多時(shí)間帘不。你說(shuō):“這是一個(gè)開源項(xiàng)目说莫,都是志愿者在維護(hù)。如果代碼里有bug厌均,請(qǐng)?zhí)峤灰粋€(gè)可再現(xiàn)的測(cè)試用例或者一個(gè)pull request唬滑。
下一個(gè)人遇到了一個(gè)很常見的錯(cuò)誤。你知道之前已經(jīng)見過(guò)這種錯(cuò)誤好幾次了棺弊,但是想不起來(lái)解決方法在哪里晶密。StackOverflow?wiki模她?郵件列表稻艰?Google了一番之后,你貼出了個(gè)鏈接侈净,關(guān)閉了這個(gè)問(wèn)題尊勿。
下一位是一個(gè)普通的代碼貢獻(xiàn)者。你是通過(guò)各種社區(qū)論壇和兄弟項(xiàng)目認(rèn)出他們的名字的畜侦。他們遇到了一個(gè)難解的問(wèn)題元扔,發(fā)送了一個(gè)代碼合并的請(qǐng)求來(lái)解決這個(gè)問(wèn)題。不幸的是這個(gè)問(wèn)題很復(fù)雜旋膳,他們的Pull Request用了不少篇幅來(lái)解釋這個(gè)問(wèn)題澎语。
你再一次瞄了一眼排隊(duì)等候的人。你知道這個(gè)人在他們的解決方法里做了很多工作验懊,可能是一個(gè)合理的解決方案把擅羞。測(cè)試用例通過(guò)了,所以你冒險(xiǎn)合并了這段代碼义图。
然而减俏,你之前曾上過(guò)這樣的當(dāng)。當(dāng)時(shí)你沒有仔細(xì)評(píng)估就合并了一個(gè)Pull Request碱工,最后由于一些你沒有考慮到的問(wèn)題而引發(fā)一個(gè)小災(zāi)難娃承。通過(guò)了測(cè)試奏夫,但可能導(dǎo)致性能下降十分之一〔莼郏或許它可能導(dǎo)致內(nèi)存泄露桶蛔。可能這個(gè)Pull Request使得API看起來(lái)更加復(fù)雜從而對(duì)新使用者造成很多困擾漫谷。
如果現(xiàn)在合并這個(gè)PR(Pull Request)仔雷,明天可能會(huì)遇到更多的問(wèn)題,因?yàn)槟憧赡転榱私鉀Q某一個(gè)人的問(wèn)題而破壞了別人的工作流舔示。把這個(gè)問(wèn)題先擱置在這碟婆,以后有時(shí)間了再解決。
下一個(gè)排隊(duì)的人發(fā)現(xiàn)了一個(gè)新BUG惕稻,你知道這BUG在另一個(gè)兄弟項(xiàng)目中頁(yè)存在竖共。他們說(shuō)這個(gè)BUG阻止了他們發(fā)布APP。你知道這是個(gè)大問(wèn)題俺祠,但只是其中的一個(gè)公给,所以你現(xiàn)在沒有時(shí)間解決它。
你回答說(shuō)這開起來(lái)確實(shí)是一個(gè)問(wèn)題蜘渣,也許開辟一個(gè)新倉(cāng)庫(kù)更合適淌铐。所以你關(guān)閉了這個(gè)問(wèn)題并把它拷貝到另一個(gè)倉(cāng)庫(kù)里,添加了一條評(píng)論告訴他們應(yīng)該仔細(xì)檢查哪部分代碼來(lái)修復(fù)bug蔫缸。你不確定他們是否真的會(huì)按照你說(shuō)的做腿准。然而,大部分都沒有這么做拾碌。
下一個(gè)人僅僅問(wèn)了“現(xiàn)在是什么情況吐葱?”。你不知道他們到底在說(shuō)什么校翔,所以仔細(xì)看了以下上下文弟跑。他們?cè)趃ithub上的一個(gè)項(xiàng)目中評(píng)論了一個(gè)長(zhǎng)期存在的Bug,很多人不同意這個(gè)問(wèn)題的解決方案防症,因此引發(fā)了很多討論窖认。
在這個(gè)特殊的問(wèn)題上有超過(guò)20條評(píng)論,看完所有評(píng)論會(huì)消耗很多時(shí)間告希,所以你僅僅回復(fù)了“對(duì)不起,這個(gè)問(wèn)題存在有一段時(shí)間了烧给,但還沒有人解決它燕偶。我們正在努力解決問(wèn)題,要是有人解決了給我們發(fā)個(gè)代碼合并請(qǐng)求會(huì)是一個(gè)好的開始础嫡。
下一位的問(wèn)題比較簡(jiǎn)單指么。除了這個(gè)倉(cāng)庫(kù)有一些古怪的測(cè)試數(shù)據(jù)酝惧。這些測(cè)試失敗的原因看起來(lái)很不真實(shí),所以你必須重新運(yùn)行來(lái)測(cè)試以下伯诬。你提醒自己等數(shù)據(jù)測(cè)試完成后再回過(guò)頭來(lái)仔細(xì)看看晚唇。
下一個(gè)人往那個(gè)很活躍的倉(cāng)庫(kù)上提出了代碼合并請(qǐng)求,另一個(gè)維護(hù)者正在寫反饋盗似,你大概瀏覽了一下哩陕,由于對(duì)另一位維護(hù)者比較信任,所以把這個(gè)問(wèn)題設(shè)置為已讀赫舒,繼續(xù)往下看悍及。
下一個(gè)人似乎遇到一個(gè)BUG,這個(gè)BUG你以前沒見過(guò)接癌。不幸的是心赶,他們提供的數(shù)據(jù)不充足:用的什么瀏覽器?Node的版本是哪個(gè)缺猛?用的項(xiàng)目的哪個(gè)版本缨叫?他們?cè)陂_發(fā)中使用了哪些代碼?你要求他們明確以下這些信息并關(guān)閉了這個(gè)標(biāo)簽頁(yè)荔燎。
** The constant stream **
過(guò)了一會(huì)兒耻姥,你大概瀏覽了一二十個(gè)這樣的人。后面仍然有超過(guò)一百人湖雹。但是現(xiàn)在你覺得累了咏闪,每個(gè)人要么是發(fā)抱怨,提問(wèn)題摔吏,要么是要求完善該項(xiàng)目鸽嫂。
從某種意義上來(lái)說(shuō),Github的通知功能展示的永遠(yuǎn)都是你項(xiàng)目的消極的一面征讲。當(dāng)他們對(duì)你的工作感到滿意的時(shí)候就不會(huì)新建一個(gè)issue或者request据某。他們只有在發(fā)現(xiàn)不足之處的時(shí)候才會(huì)這么做。即使你只花一點(diǎn)實(shí)踐來(lái)瀏覽這些通知诗箍,它也可能是你心理上和感情上感到疲憊癣籽。
你的伴侶注意到每當(dāng)做完這些工作的時(shí)候都會(huì)變得脾氣暴躁。你可能發(fā)現(xiàn)自己毫無(wú)理由的沖她發(fā)火滤祖,僅僅是因?yàn)槟阕约盒那椴缓每昀恰!叭绻鲞@些開源項(xiàng)目使你生氣匠童,為什么還要做呢埂材?”她問(wèn)。這時(shí)候你無(wú)法回答汤求。
你可以休息以下了俏险。事實(shí)上這使你自找的严拒。過(guò)去,你為了自己的身心健康會(huì)從Github銷聲匿跡一兩周竖独。但是你知道那樣做的結(jié)果就是現(xiàn)在的狀況:好幾百人排隊(duì)等候裤唠。
如果你僅僅保留Github通知里的最上面那些通知,可能就會(huì)只有20-30個(gè)issue需要處理了莹痢。然而你卻讓他們積累了起來(lái)种蘸,導(dǎo)致現(xiàn)在已經(jīng)有好幾百個(gè)了,你覺得很有愧疚感格二。
過(guò)去劈彪,出于這樣或那樣的原因,你從來(lái)不讓issue累積起來(lái)顶猜〔着可能偶爾會(huì)見到一個(gè)issue被放置了幾個(gè)月都沒處理。你再次去處理的時(shí)候提出issue的那個(gè)不再回復(fù)你了长窄,或者他們說(shuō)他們用其他項(xiàng)目替代了你的項(xiàng)目從而解決了問(wèn)題滔吠。那種感覺讓你覺得很糟,但是你也理解他們的難處挠日。
你從經(jīng)驗(yàn)中得知對(duì)付陳舊的issue最實(shí)用的方法是告訴他們“我把舊的issue關(guān)了疮绷,如果你還沒有解決這個(gè)問(wèn)題請(qǐng)?jiān)匍_一個(gè)issue或者提供更詳細(xì)的信息”。通常他們不再回復(fù)嚣潜。有時(shí)候會(huì)回復(fù)也只是很生氣的表達(dá)他們等了這么長(zhǎng)時(shí)間冬骚。
所以現(xiàn)在你處理Github的通知更加勤奮了,數(shù)百人在排隊(duì)等候懂算,你渴望有一天排隊(duì)的人減少到100以內(nèi)只冻,或者一打,甚至是神話般的0计技。所以你奮力前進(jìn)喜德。
吸引新的代碼貢獻(xiàn)者
就這樣處理了足夠多的issue,即使你真的到達(dá)了那個(gè)“零點(diǎn)”(即要處理的通知為零個(gè))垮媒,你仍然還有一堆Bug沒有解決舍悯,還有很多代碼合并請(qǐng)求。加標(biāo)簽可以有些幫助睡雇,比如給issue加上“需要新的版本”萌衬、“有測(cè)試案例”或者“添加第一個(gè)補(bǔ)丁”∷В“添加第一個(gè)補(bǔ)丁”這個(gè)標(biāo)簽很有用秕豫,因?yàn)樗?jīng)常會(huì)吸引新的貢獻(xiàn)者。
然而抗愁,你注意到吸引新貢獻(xiàn)者的那些issue都是簡(jiǎn)單的問(wèn)題馁蒂,處理這些問(wèn)題并且解釋它耗費(fèi)的時(shí)間比你自己去解決所花費(fèi)的時(shí)間更多。你明知是這樣卻還添加那些標(biāo)簽蜘腌,因?yàn)楫?dāng)你聽到別人說(shuō)這是他第一次為開源項(xiàng)目做貢獻(xiàn)時(shí)你的心里十分高興沫屡。
你知道他們很可能會(huì)提供反饋信息。一般這些人不會(huì)成為長(zhǎng)期貢獻(xiàn)者或代碼維護(hù)者撮珠。你不知道這樣做是否正確沮脖,或許這樣做會(huì)吸引到一些真正的維護(hù)者來(lái)減輕你的負(fù)擔(dān)。
你有一個(gè)項(xiàng)目是可以自維護(hù)的芯急。你已經(jīng)好幾年沒碰它的勺届,但仍然有一群維護(hù)者來(lái)處理issue和PR。你非常感謝那些代碼維護(hù)者娶耍。但你找不到方法在這個(gè)項(xiàng)目上吸引到代碼維護(hù)者免姿, whereas other projects wind up as your responsibility and yours alone(怎么理解?)
向前看
你不愿意去創(chuàng)建新的項(xiàng)目了榕酒,因?yàn)槟阒肋@只會(huì)增加你維護(hù)代碼的負(fù)擔(dān)胚膊。事實(shí)上,這里有一個(gè)有悖常情的現(xiàn)象想鹰,你越成功紊婉,就會(huì)受到github通知的更多懲罰。
你仍然可以回憶起創(chuàng)造的興奮辑舷,東拼西湊寫個(gè)項(xiàng)目并解決了之前沒有被解決的問(wèn)題時(shí)的喜悅之情喻犁。但是現(xiàn)在你根據(jù)經(jīng)驗(yàn)知道任何一個(gè)新的項(xiàng)目都會(huì)偷走你維護(hù)舊項(xiàng)目的時(shí)間。你有時(shí)候頁(yè)考慮是否把某個(gè)舊項(xiàng)目正式標(biāo)記為“不推薦使用”或者“不再維護(hù)”何缓。
你不知道在自己崩潰之前還能撐多久肢础。從跟那些以做開源項(xiàng)目為全職工作朋友聊天中,你知道把開源項(xiàng)目作為全職工作會(huì)允許你在某個(gè)項(xiàng)目上投入更多時(shí)間歌殃,你也考慮了這件事乔妈,但是這并不會(huì)給你很多幫助,因?yàn)槟阌袔资畟€(gè)開源項(xiàng)目競(jìng)爭(zhēng)你的時(shí)間氓皱。
你最渴望的是有更多項(xiàng)目可以自維護(hù)路召。你盡量按照規(guī)范:詳細(xì)的配置說(shuō)明,代碼風(fēng)格波材,對(duì)那些提交優(yōu)質(zhì)PR的貢獻(xiàn)者更多的權(quán)限股淡。為每個(gè)項(xiàng)目做這些事情是挺累人的,也許是我不夠勤奮吧廷区。
你知道開源更多的被認(rèn)為是特權(quán)白人的排他性俱樂部唯灵,你對(duì)這感到遺憾,擔(dān)心自己在解決這件問(wèn)題上做的不夠隙轻。
更重要的是埠帕,你感到愧疚:你明知道自己可以幫助一些人解決問(wèn)題垢揩,但是你卻讓問(wèn)題擱置數(shù)月然后關(guān)閉了它。你知道有些人是第一次對(duì)開源項(xiàng)目做貢獻(xiàn)但是你卻沒有回復(fù)他敛瓷,這樣你可能就會(huì)打擊了他對(duì)開源的熱情叁巨,這也讓你感到愧疚。你對(duì)自己做的事感到愧疚呐籽,沒做的事也感到愧疚锋勺,因?yàn)槟銢]有招募新人來(lái)分享你這愧疚的體驗(yàn)。
** 總結(jié)以下吧 **
我以上所述都是基于我個(gè)人的真實(shí)經(jīng)歷狡蝶。我說(shuō)的并不代表所有從事開源軟件事業(yè)的人的心聲庶橱,但代表了和我有相同感受的人。
我從事開源事業(yè)大概七年了贪惹,也不愿意這樣抱怨苏章,因?yàn)槲覔?dān)心這會(huì)被認(rèn)為是夸張的抱怨。畢竟這些都是我自找的馍乙,我本可以隨時(shí)離開Github布近,我對(duì)別人沒有任何該履行的義務(wù)。
或許我還應(yīng)該感到愉快呢丝格?我在開源軟件方面的工作給了我現(xiàn)在在社區(qū)的地位撑瞧。我獲得了在大會(huì)上發(fā)言的機(jī)會(huì)。Twitter上有數(shù)千粉絲显蝌,他們贊同并捍衛(wèi)我的的觀點(diǎn)预伺。可以說(shuō)我之所以能在微軟公司有一份工作曼尊,都要?dú)w功于我在開源方面的工作酬诀。我到底是在抱怨誰(shuí)呢?
然而骆撇,我只要一些和我有相似感受的人都已經(jīng)爆發(fā)了瞒御。之前他們都是熱心的合并代碼,解決問(wèn)題神郊,在博客上寫關(guān)于他們項(xiàng)目的文章肴裙,但是有一天他們突然消失了,你再也找不到他們了涌乳。對(duì)于這些人蜻懦,我甚至懶得去在他們的代碼倉(cāng)庫(kù)里新建一個(gè)issue,因?yàn)槲抑浪麄兛隙ú粫?huì)回復(fù)夕晓。我不是在指責(zé)他們宛乃,我只是擔(dān)心自己有天也會(huì)和他們一樣離開github。
我已經(jīng)采取一些對(duì)我友好的措施了。我不使用Github通知的接口而是用郵件過(guò)濾器征炼,所以能對(duì)這些通知根據(jù)項(xiàng)目(不維護(hù)的項(xiàng)目被忽略)或通知的類型(我曾發(fā)表過(guò)評(píng)論的具有較高的優(yōu)先級(jí))進(jìn)行分類析既。郵件也能支持離線工作和把所有東西集中起來(lái)。
對(duì)那些我已經(jīng)停止維護(hù)的項(xiàng)目的問(wèn)題的郵件我都標(biāo)記為藍(lán)色(但是一般我仍然會(huì)每一個(gè)查看一次)谆奥,并且不予回復(fù)渡贾。我忽略博客的評(píng)論,StackOverflow的上回答的回復(fù)以及郵件列表里的問(wèn)題雄右。我甚至對(duì)那些我覺得其他人已經(jīng)維護(hù)的不錯(cuò)的項(xiàng)目取消關(guān)注。
讓我感到沮喪的一個(gè)原因是解決這些issue消耗了我維護(hù)項(xiàng)目的時(shí)間纺讲。換句話說(shuō)擂仍,雖然我經(jīng)常僅僅回復(fù)“對(duì)不起我現(xiàn)在沒時(shí)間處理這個(gè)問(wèn)題”,但這些回復(fù)也消耗掉我放在開源項(xiàng)目上的時(shí)間熬甚。
issue模板逢渔,GreenKeeper, travis_retry, Sauce Labs, 有這么多針對(duì)開源項(xiàng)目的技術(shù)解決方案乡括,我很感謝他們肃廓。如果沒有這些自動(dòng)化工具我不能專心工作。從某種意義上來(lái)說(shuō)你對(duì)一個(gè)issue提出反對(duì)诲泌,它造成的更多的是社交問(wèn)題而不是技術(shù)問(wèn)題盲赊。一個(gè)人這么做還不會(huì)怎么樣。我甚至還不是npm前100維護(hù)者就已經(jīng)感覺到自己被壓榨敷扫。不能想象那些前100維護(hù)者的感受哀蘑。
我甚至告訴我的妻子,等我們有了孩子葵第,我從開源界退出绘迁。我不能想像自己如何能邊做開源邊撫養(yǎng)家庭。我猜測(cè)這最終會(huì)解決我的問(wèn)題:唯一的選擇卒密。我希望它能以一種正面的方式到來(lái)缀台,就像開啟人生的新篇章,而不是以一種消極的方式哮奇,比如突然粗魯?shù)谋l(fā)了膛腐。
** 結(jié)束語(yǔ) **
如果你已經(jīng)讀到這里了并且對(duì)困擾開源社區(qū)的問(wèn)題和解決方案感興趣,你可能會(huì)更想讀一下Nadia Eghbal所寫的一篇文章Roads and Bridges屏镊。這可能是最這個(gè)問(wèn)題最透徹的分析了依疼。
我樂于接受大家的建議,雖然我知道我很不情愿在我的開源項(xiàng)目中把金錢和勞動(dòng)力混為一談(可能是一些愚蠢的理想主義的原因)而芥。但是我發(fā)現(xiàn)在其它項(xiàng)目中這方法很有用律罢。
希望大家理解,雖然我上面表達(dá)了很多負(fù)面情緒,我仍然覺得開源是我人生中有價(jià)值的加分误辑,我一點(diǎn)都不后悔沧踏。但我仍然希望這篇文章能讓大家知道成為自己成功的受害者的感受,以及被所有未完成工作拖累的感受巾钉。
如果我能從開源中學(xué)到一點(diǎn)東西的話翘狱,那就是:你做的工作越多,你得到的工作就越多砰苍。我覺得這個(gè)問(wèn)題現(xiàn)在還沒有解決方案潦匈。
** 全文完(2017.3.16) **
不完善之處日后抽空修改,翻譯不得當(dāng)?shù)牡胤秸?qǐng)指正并多多海涵