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