為React項(xiàng)目工作四年后,我理解了企業(yè)開源的真諦
對(duì)企業(yè)而言,發(fā)布和維護(hù)開源項(xiàng)目都是需要耗費(fèi)大量心力的。在為 React(一款由 Facebook 開發(fā)的知名開源 JS 庫(kù))工作四年后我對(duì)此深有體會(huì)。我最開始只是一名外部貢獻(xiàn)者,加入 React 團(tuán)隊(duì)后,又從工程師做起,最終升為團(tuán)隊(duì)管理。和大多數(shù)的 Facebook 開源項(xiàng)目一樣,React 起初只是為內(nèi)部使用而開發(fā)的,見識(shí)到它在簡(jiǎn)化 UI 代碼的開發(fā)和維護(hù)上的作用后,我們決定將它與全世界分享。
事實(shí)證明,React 是 Facebook 的一次令人難以置信的成功,而這成功背后也隱藏了巨大的挑戰(zhàn)。舉例來說,盡管 React 非常受歡迎,但它仍處于一個(gè)競(jìng)爭(zhēng)激烈的領(lǐng)域,這使得我們?cè)陂_發(fā)新版本時(shí)需要小心再小心。
我們盡量不去做重大改動(dòng),原因很明顯,人們沒有時(shí)間或者不愿去適應(yīng)一個(gè)變更太快的產(chǎn)品,甚至可能會(huì)一氣之下改用其他競(jìng)品。但反過來想,如果我們固步自封,那么 React 將會(huì)落后于其他更新潮,更有創(chuàng)新性的產(chǎn)品。React 會(huì)像它的前輩們一樣,被后浪拍死在沙灘上。
龐大的用戶群體也讓我們?cè)谧龀鋈魏螞Q定時(shí)都會(huì)收到反對(duì)的聲音。在你規(guī)模還很小的時(shí)候,你可以取悅?cè)魏稳?,一旦你?guī)模做大,滿足所有人就變成了不可能 的任務(wù)。這一現(xiàn)象并不僅局限于 OSS(開源軟件)。這就意味著,在準(zhǔn)備更新版本時(shí),我們同樣需要仔細(xì)考慮我們的溝通策略。在 2018 年 10 月的 React 大會(huì)上公布 React Hooks 之前,我們特意避免公開發(fā)表任何 React Hooks 的消息。這是因?yàn)槲覀儞?dān)心在只有部分設(shè)計(jì)的情況下,可能會(huì)讓用戶錯(cuò)誤理解我們的設(shè)計(jì)。于是我們?cè)谥钡巾?xiàng)目完善后才將它公布于世。一個(gè)項(xiàng)目越是受歡迎,就越難在不刺激到用戶的情況下實(shí)驗(yàn)新想法。
當(dāng) React 還是個(gè)剛出生的小嬰兒時(shí),大多數(shù)的用戶都是出于個(gè)人喜好選擇了它。而在它幾乎算是行業(yè)標(biāo)準(zhǔn)的現(xiàn)在,很多人用 React 是因?yàn)闆]得選,可能是因?yàn)閳F(tuán)隊(duì)中有人在用,也可能是授課教授選擇了它,而這類用戶往往都并不了解 React 的獨(dú)特優(yōu)勢(shì)。因此,更多的新用戶都會(huì)帶著挑剔的眼光看待 React,期待著新的補(bǔ)丁出現(xiàn)。React 的用戶群之大,相關(guān)文章之多,讓新用戶(有時(shí)甚至?xí)欣嫌脩簦┰谡規(guī)椭鷷r(shí)都摸不清楚哪些資源才是可信的。當(dāng)然,所有資料的貢獻(xiàn)者都是好心的,但這并不能保證這些資源都是高質(zhì)量的。
很多公司都指望通過發(fā)布一個(gè)任何人都可貢獻(xiàn)代碼的開源軟件來吃紅利,但就據(jù)我所知,這種做法實(shí)際幾乎從未成功過。回應(yīng)問題,回答使用問題,仔細(xì)規(guī)劃新版本發(fā)布的時(shí)間線,這些都要花時(shí)間來做。哪怕是代碼貢獻(xiàn),這個(gè)被譽(yù)為能讓企業(yè)開源的決策收獲可觀回報(bào)的大獎(jiǎng),也總是盛名難副。新的貢獻(xiàn)者既不像核心團(tuán)隊(duì)一樣對(duì)現(xiàn)有代碼了如指掌,也不像他們那樣對(duì)項(xiàng)目的遠(yuǎn)大愿景有著清晰的認(rèn)知。外部貢獻(xiàn)者的代碼總要經(jīng)過修改才能使用,即使是一些較為優(yōu)秀的拉取請(qǐng)求也是要過幾輪審查的,對(duì)審查者而言,你永遠(yuǎn)無法確定貢獻(xiàn)者會(huì)不會(huì)更新,以及何時(shí)才會(huì)更新。這種情況下,通常還是自己寫程序比較快。
此外,絕大多數(shù)的拉取請(qǐng)求都只是順手做的貢獻(xiàn)。某人在做某項(xiàng)目時(shí),發(fā)現(xiàn)了他們正在使用的某開源工具的一個(gè) bug 或者限制,于是他們提交一個(gè)小補(bǔ)丁,覆蓋了他們所遇到的獨(dú)特情況。通常這類的貢獻(xiàn)者是不會(huì)做回頭客的,而肯回來幫忙的都是好人。在幫忙的過程中,他們會(huì)逐漸了解你,了解你項(xiàng)目版本間的微妙差異,他們對(duì)項(xiàng)目的可靠性和長(zhǎng)期的成功有了個(gè)人的投入。在 React 中,我們對(duì)新的貢獻(xiàn)者總是很友善,希望他們或許會(huì)回來繼續(xù)幫忙。但無論我們對(duì)他們有多么歡迎,鮮少有人會(huì)有精力或意愿繼續(xù)貢獻(xiàn)代碼,這可以理解,每個(gè)人都有他們各自的生活,而有意義的貢獻(xiàn)是需要花費(fèi)時(shí)間的。
以上提及的困難點(diǎn)都是成功項(xiàng)目才會(huì)遇到的,但開源項(xiàng)目難免會(huì)失敗。原因有很多,可能是這個(gè)項(xiàng)目解決的問題太過小眾、不常見,或者是它針對(duì)的問題已經(jīng)有了個(gè)更好的解決方案。開源項(xiàng)目的創(chuàng)建者也許無法證明自己項(xiàng)目的實(shí)用價(jià)值,或者是沒有提供足夠的文檔,尤其是沒有對(duì)新用戶的指引。項(xiàng)目可能需要復(fù)雜的設(shè)置或者前置基礎(chǔ)架構(gòu)環(huán)境,也可能是用某種小眾的編程語言寫的,或者是由于其他技術(shù)原因?qū)е铝瞬患嫒輪栴}。即使某個(gè)項(xiàng)目一開始看起來前途無量,但如果 bug 不斷或者面對(duì)一些常見問題沒有好的答案,人們也會(huì)無情地拋棄它。同樣,隨著時(shí)間的推移,項(xiàng)目負(fù)責(zé)方做出了一些重大的負(fù)面改動(dòng),或者其他有害項(xiàng)目的決策,人們也會(huì)對(duì)這個(gè)項(xiàng)目失去信任。忽略 OSS 社區(qū)也會(huì)讓項(xiàng)目受到影響:這里說的不重視可以小到問題管理,大到項(xiàng)目的未來方向。
誠(chéng)然,項(xiàng)目的成功會(huì)帶來高昂的維護(hù)成本,失敗的可能性也不容小覷,但處理得當(dāng)?shù)拈_源項(xiàng)目也會(huì)帶來巨大的價(jià)值。
1. 開始之前
文檔以及代碼質(zhì)量
有些開源帶來的好處甚至在項(xiàng)目宣發(fā)之前就已經(jīng)體現(xiàn)出來了。準(zhǔn)備將某項(xiàng)目開源會(huì)迫使人們清理代碼、劃出清晰的 API 邊界、讓項(xiàng)目在現(xiàn)有環(huán)境和公司之外實(shí)際可用,這樣維護(hù)起來會(huì)更方便,日后如果需要重構(gòu)也會(huì)容易很多。開源同樣是個(gè)讓人認(rèn)真寫軟件運(yùn)行文檔的好時(shí)機(jī),哪怕這個(gè)項(xiàng)目只是在公司內(nèi)部使用,好的文檔對(duì)新入職的員工而言也是個(gè)很好的資源。隨著使用項(xiàng)目的人增加,外部的人 也會(huì)開始幫忙寫入門指南。到后來,只要是軟件使用相關(guān),只有你想不到,沒有你找不到的問題和其解決方式,就像 React 的社區(qū)做到的一樣。
2. 擴(kuò)展之后
大多數(shù)開源軟件的好處會(huì)隨著項(xiàng)目的受歡迎程度擴(kuò)大而增長(zhǎng)。成功的開源項(xiàng)目往往擁有多功能的基礎(chǔ)架構(gòu),和可以重復(fù)利用的核心構(gòu)件。項(xiàng)目越是不針對(duì)具體業(yè)務(wù),他人越會(huì)覺得這個(gè)項(xiàng)目有用,項(xiàng)目作者也就越不用擔(dān)心會(huì)泄露公司機(jī)密。
工程品牌
無論是名不見經(jīng)傳的小公司還是五百?gòu)?qiáng)科技公司,開源項(xiàng)目都可以提升工程部門的品牌聲譽(yù)。2013 年 Facebook 發(fā)布 React 時(shí),很多人對(duì)此都不屑一顧,“Facebook 的工程建議?他們連自己在干什么都不知道!”?,F(xiàn)在,隨著 React 和其他開源項(xiàng)目的出現(xiàn),F(xiàn)acebook 作為前端工程領(lǐng)域的領(lǐng)軍者已經(jīng)得到了廣泛的認(rèn)可。這在招聘方面是一大助力:在我任職期間,面試過的許多工程師應(yīng)試者都說過,他們想要加入 Facebook,是因?yàn)檫@里是 React 的發(fā)源地。無論公司規(guī)模大小,發(fā)布高質(zhì)量項(xiàng)目不僅可以炫技,還能吸引到新人加入。
提升可靠性
他人在使用你的軟件時(shí)會(huì)遇到 bug,遇到你沒見過的邊緣情況。多數(shù)情況下,這些 bug 被發(fā)現(xiàn)都是遲早的事,而隨著使用人數(shù)的增多,你也就有更多的機(jī)會(huì)發(fā)現(xiàn)并修復(fù)這些 bug(免費(fèi)的質(zhì)量保證?。<幢?Facebook 擁有上千名使用 React Alpha 版的開發(fā)人員,并在每個(gè)新版本公開前發(fā)現(xiàn)了大多數(shù)的 bug,外部 bug 報(bào)告里仍然不斷有新的問題匯報(bào)進(jìn)來。
投資于員工
發(fā)布開源軟件的最大內(nèi)部擁躉之一,通常都是希望能回饋廣大編程社區(qū)的員工個(gè)人。他們借此得到了在日常工作中做公益的機(jī)會(huì),也得以圍繞工作打出個(gè)人的招牌。開源項(xiàng)目也可以讓他們的工作更為充實(shí),如果一個(gè)項(xiàng)目的受益人不僅是公司,那么人們就更容易發(fā)自內(nèi)心地關(guān)注它。
另外,項(xiàng)目得到推廣后,關(guān)于它的知識(shí)也會(huì)變得更有價(jià)值。公司內(nèi)使用開源項(xiàng)目的員工會(huì)收獲可轉(zhuǎn)移的技能,而不是針對(duì)專有系統(tǒng)的小眾技巧。擁有開源項(xiàng)目使用經(jīng)歷的員工在轉(zhuǎn)職后上崗會(huì)更快。和行業(yè)大眾割裂的專有基礎(chǔ)架構(gòu)只會(huì)變成負(fù)擔(dān),而開源則可以幫你避免這種情況。其他項(xiàng)目的同行們會(huì)在軟件兼容性上向你看齊,日后使用這些軟件時(shí),集成工作也會(huì)大大減少。
技術(shù)上的自知之明
最后,開源中最重要的好處之一:將你的基礎(chǔ)架構(gòu)作為獨(dú)立項(xiàng)目發(fā)布,有助于你了解自己技術(shù)棧的真實(shí)水平。如果你的公司是以專有技術(shù)為基礎(chǔ),那么對(duì)自己程序的盲目自信更像是一種冒險(xiǎn),直接用另一款現(xiàn)有的替代品可能效果會(huì)更好。讓項(xiàng)目在公司之外憑借其自身優(yōu)點(diǎn)進(jìn)行競(jìng)爭(zhēng),會(huì)幫助你看到更現(xiàn)實(shí)的情況(亞馬遜 大概是這種策略在大規(guī)模背景下應(yīng)用的最著名的例子)。如果基礎(chǔ)架構(gòu)的某部分能夠憑借自身獲得成功,那這就說明你前進(jìn)的道路是正確的。
3. 值得嗎?
如果你所在公司搭建的某款軟件對(duì)業(yè)務(wù)有較強(qiáng)的針對(duì)性,那么將其開源的可能性就不會(huì)太高。事實(shí)上,如果潛在用戶看不到它的價(jià)值,那么這款軟件基本就是無用的。但如果開發(fā)的工具泛用性較高,即便它并不完美,開源也可以被列為認(rèn)真考量的事項(xiàng)。明確的維護(hù)承諾也很重要,如果你能夠保證長(zhǎng)期維護(hù),用戶會(huì)感激不盡的。反之,如果只是一次性的代碼發(fā)布,雖然也會(huì)有幫助,但要記得提前告訴大家!
有了開放源碼,你就能得到你所投入的東西。它可以幫助推動(dòng)行業(yè)發(fā)展,使你的公司受益,并激勵(lì)當(dāng)前和未來的員工——雖然這需要時(shí)間和努力。如果條件合適,它是值得的。
開放源碼會(huì)讓你的付出有所回報(bào),會(huì)幫助推動(dòng)行業(yè)發(fā)展,使你的公司受益,激勵(lì)當(dāng)前和未來的員工——盡管這些都需要付出時(shí)間和精力,但如果條件合適,你會(huì)發(fā)現(xiàn)這些付出都是值得的。
























