【導(dǎo)讀】:作者 Vincent Voyer 用親身經(jīng)歷鼓勵(lì)大家從事開源活動(dòng):他在 Nodejs 源碼里改了兩個(gè)字符,解決了內(nèi)存泄漏,信心大增;沒找到合適的圖片 lazy load 的庫,自己動(dòng)手做,竟被印度電商巨頭的網(wǎng)站用上了,信心倍增。 今年我做了一次演講,內(nèi)容是如何讓我們的開源項(xiàng)目獲得其他人的貢獻(xiàn),比如提問、寫文檔或者更新代碼,從而打造一個(gè)成功的開源項(xiàng)目。在這次演講結(jié)束后,我得到了這樣的反饋:“你展示了如何開發(fā)一個(gè)成功的開源項(xiàng)目,但是我應(yīng)該怎樣開始一個(gè)開源項(xiàng)目呢?”。本文便是來回答這個(gè)問題的。文章闡述了如何開始貢獻(xiàn)開源代碼以及如何創(chuàng)建自己的開源項(xiàng)目。 本文分享的知識(shí)是基于我們的工作經(jīng)驗(yàn):在 Algolia 工作時(shí),我們發(fā)布和維護(hù)了許多成功的開源項(xiàng)目,它們都經(jīng)過了長時(shí)間的檢驗(yàn)。同時(shí),我也花了很多時(shí)間來練習(xí)和創(chuàng)建自己的開源項(xiàng)目。 開始我們的開源項(xiàng)目之旅吧我職業(yè)生涯的關(guān)鍵時(shí)刻是六年前我在 Fasterize(一家做網(wǎng)站應(yīng)用加速的公司)工作的時(shí)候。在 Node.js 工作進(jìn)程中,我們遇到了一個(gè)很嚴(yán)重的內(nèi)存泄漏問題。除了 Node.js 源碼庫,我們找遍了所有可能引發(fā)這個(gè)問題的地方,結(jié)果一無所獲。我們的臨時(shí)解決辦法是每天重啟這些工作進(jìn)程(這會(huì)使內(nèi)存使用量歸零),但是我們知道這不是一個(gè)優(yōu)雅的解決辦法,所以我想從整體考慮問題。 當(dāng)我的聯(lián)合創(chuàng)始人 Stéphane 建議我檢查一下 Node.js 的源碼時(shí),我?guī)缀跣α顺鰜?。我想:“如果?bug,很可能來自我們自己的代碼,而不是來自于創(chuàng)造革命性服務(wù)器端框架的開發(fā)人員代碼。但是,我還是會(huì)看一下的”。兩天之后,我提交的 2 個(gè)字符的改動(dòng)被合并到了 Node.js 的源碼中,修復(fù)了 http 層的 bug,解決了內(nèi)存泄漏問題。 這次的舉動(dòng)給予了我足夠大的信心。http.js 文件的其他 30 個(gè)代碼貢獻(xiàn)者都是我崇拜的人,比如 isaacs(npm 的創(chuàng)造者)—— 這使我明白了不管是誰寫的代碼,都可能會(huì)有瑕疵。 在使用開源項(xiàng)目的時(shí)候,你是否遇到了 bug?嘗試查閱源碼,不要停留在本地的代碼上。你的答案會(huì)使其他人收益,引導(dǎo)著你去給更多的開源項(xiàng)目做貢獻(xiàn)。閱讀其他人的代碼,也許不能馬上解決你的問題,而且需要花費(fèi)很長時(shí)間才能理解源碼,但是你會(huì)學(xué)到新的模塊,新的語法以及編碼的不同技巧,這些都會(huì)促使你成為一名出色的開發(fā)者。 抓住貢獻(xiàn)開源項(xiàng)目的機(jī)會(huì)Node.js 源碼倉庫的第一個(gè)貢獻(xiàn)標(biāo)簽 “我沒有好想法”,這是那些想為開源做貢獻(xiàn),但又自認(rèn)為沒有好的點(diǎn)子或項(xiàng)目來分享的開發(fā)者通常會(huì)抱怨的一點(diǎn)。那么,我會(huì)說:沒關(guān)系。為開源做貢獻(xiàn)的機(jī)會(huì)有很多。許多項(xiàng)目已經(jīng)開始通過分類或標(biāo)簽列出那些優(yōu)秀的首次貢獻(xiàn)者。 你可以通過瀏覽這些網(wǎng)站獲得一些開源靈感:Open Source Friday,First Timers Only,Your First PR, CodeTriage,24 Pull Requests,Up For Grabs, Contributor-ninja 和 First Contributions。 創(chuàng)建一些工具創(chuàng)建工具是幫助他人的一種很好的方式,而且不用考慮太多復(fù)雜的問題或 API 設(shè)計(jì)。你可以開發(fā)一個(gè)你最喜歡的框架或平臺(tái)的模板。你可以將從許多博客上學(xué)到的知識(shí)和工具集中到一個(gè)項(xiàng)目中進(jìn)行很好的詮釋,并做好隨時(shí)更新和發(fā)布新特性的準(zhǔn)備。create-react-app 是這種開源工具的一個(gè)優(yōu)秀案例. 在 GitHub 上有 5 萬 8 千多個(gè)開源模板倉庫,開發(fā)一個(gè)這樣的項(xiàng)目比較容易而且受歡迎。 今天,你也可以開發(fā) Atom 和 Visual Studio Code 的純 JavaScript 插件,比如我們開發(fā)了 Atom 自動(dòng)補(bǔ)全模塊導(dǎo)入的插件。那些 Atom 或 Sublime Text 中的優(yōu)秀插件是不是還沒有出現(xiàn)在你喜歡的編輯器中?趕快去開發(fā)一個(gè)吧。 最后,你也可以為 webpack 或 babel 開發(fā)插件,用于解決 JavaScript 技術(shù)棧的特殊用例。 好消息是,很多平臺(tái)都會(huì)告訴你如何去創(chuàng)建和發(fā)布插件,所以你不用花費(fèi)太多的時(shí)間去思考怎么下手。 成為新的維護(hù)者當(dāng)你在 GitHub 上瀏覽項(xiàng)目時(shí),你也許會(huì)發(fā)現(xiàn)和使用那些創(chuàng)建者不再維護(hù)的項(xiàng)目。雖然它們有價(jià)值,但還有很多創(chuàng)建者沒有回答的 issues 和 pull requests 。這時(shí)你會(huì)怎么做?
我建議你兩者都做。前者有助于推進(jìn)你自己的項(xiàng)目,而后者對(duì)你自己和社區(qū)都有好處。 你會(huì)問,那么如何成為一個(gè)新的維護(hù)者呢?向創(chuàng)建者發(fā)一封郵件或推特,說:“你好,我想繼續(xù)維護(hù)這個(gè)項(xiàng)目,你覺得可以嗎?”這種方式通常效果不錯(cuò)。這是開始你自己的開源項(xiàng)目的好辦法,因?yàn)檫@個(gè)項(xiàng)目已有很多人知曉和受益。 成為新維護(hù)者的推特消息示例 創(chuàng)建你自己的開源項(xiàng)目創(chuàng)建自己的開源項(xiàng)目最好的方式是尋找那些至今還沒有很好的解決方案的問題。如果你發(fā)現(xiàn)你在網(wǎng)上沒有找到能解決你問題的特定的庫,那么這正是去開發(fā)一個(gè)開源庫的好時(shí)機(jī)。 下面是我職業(yè)生涯中另一個(gè)關(guān)鍵點(diǎn)。在 Fasterize 工作時(shí),我們的網(wǎng)站性能加速器需要一個(gè)快速、輕量級(jí)的圖片延遲加載庫 —— 不是一個(gè) jQuery 插件,而是一個(gè)單獨(dú)的項(xiàng)目,它必須能嵌入所有瀏覽器的所有網(wǎng)站并正常工作。我花了數(shù)個(gè)小時(shí)在網(wǎng)上搜索已經(jīng)存在的優(yōu)秀的開源庫,可是最終沒有找到合適的。所以我說道:“完蛋了。我不能找到一個(gè)完美的開源庫,我們的工作沒法開展了?!?/span> 對(duì)于這種情況,Stéphane 回復(fù)說:“那么,我們自己來創(chuàng)造一個(gè)吧”。嗯..好吧!我將 StackOverflow 上的一段答案復(fù)制粘貼到了我的 JS 文件中,就這樣開始了我自己的開源項(xiàng)目之旅。最終,我創(chuàng)建了一個(gè)圖片延遲加載的庫,它被像 Flipkart.com(每月大約 2 億的訪問量,在印度排名第 9)這樣的網(wǎng)站使用著。有了這次成功經(jīng)歷之后,我便無時(shí)不刻關(guān)注著開源項(xiàng)目。我突然意識(shí)到,開源項(xiàng)目可以成為我程序員職業(yè)生涯的另一部分,而不是僅有傳奇人物和能力超群的程序員才能做開源項(xiàng)目。 一個(gè)沒有好的解決方案的問題:可以嘗試以重用的方式解決它! 時(shí)間點(diǎn)很重要。如果你不打算創(chuàng)造一個(gè)可重用的庫,而是在自己的項(xiàng)目中寫一些只適用于你系統(tǒng)的代碼,那么你便錯(cuò)失了一次機(jī)會(huì)。在某個(gè)時(shí)刻,其他人會(huì)開發(fā)出你之前可能有機(jī)會(huì)做出的項(xiàng)目。所以與其被他人搶先一步,你應(yīng)該盡快從你的項(xiàng)目中抽離和發(fā)布可重用的模塊。 發(fā)布,宣傳和分享為了確保任何想使用你的模塊的開發(fā)者能確切地找到你的開源項(xiàng)目,你需要做到以下幾點(diǎn):
向大家展示你的新項(xiàng)目不要害怕向網(wǎng)站投稿;只要你真的相信自己的項(xiàng)目是有價(jià)值的,那些網(wǎng)站從來不嫌文章太多。通常,技術(shù)社區(qū)都是十分歡迎大家投稿分享的! 要有耐心,不要怕迭代在“虛榮指標(biāo)”(stars 數(shù)和下載數(shù)量)方面,有些項(xiàng)目在第一天會(huì)迅速飆升,但是很快會(huì)停止增長。而其他人,在他們準(zhǔn)備好登上 Hacker News 首頁之前,也許需要等上一年。你要相信,你的項(xiàng)目在某一時(shí)刻會(huì)被他人所注意到,如果沒有,那么你也學(xué)到了一件事情:這個(gè)項(xiàng)目可能只對(duì)你有價(jià)值 —— 這為你下一個(gè)項(xiàng)目的成功做了鋪墊。 我有許多 0 個(gè) stars 的項(xiàng)目(比如 mocha-browse),但是我從來不沮喪,因?yàn)槲覜]有很高的期待。在開始做一個(gè)項(xiàng)目時(shí),我總是這么想:我發(fā)現(xiàn)了一個(gè)問題,我用我自認(rèn)為最好的方式解決了它,也許有的人會(huì)使用我的方法,也許沒有。這不是什么大不了的事情。 一個(gè)解決方案,兩個(gè)項(xiàng)目這是我做開源項(xiàng)目最喜歡的部分之一。2015 年,在 Algolia 工作時(shí),我們嘗試尋找單元測試的解決方案,暫停了為 React UI 庫 InstantSearch.js 編寫 React 組件時(shí)用 JSX 輸出 html 。 由于 JSX 會(huì)被轉(zhuǎn)換成函數(shù)調(diào)用,當(dāng)時(shí)我們的解決方案是寫成這樣expect( 為了解決這個(gè)問題,我們創(chuàng)造了 algolia/expect-jsx,它可以在單元測試中輸出對(duì)比 JSX 字符串,而不是輸出無法閱讀的對(duì)象。輸入輸出的測試會(huì)使用相同的語義。我們并沒有就此停止。我們從代碼中又提煉開發(fā)出了另一個(gè)庫,并最終發(fā)布了兩個(gè)開源庫,而不是一個(gè):
反饋和貢獻(xiàn)圖中有許多 issues。其實(shí)這只是為了好看而使用的假數(shù)字?? 一旦你開始收到反饋和貢獻(xiàn)代碼,你要以一種開放和樂觀的心態(tài)去面對(duì)它們。你會(huì)得到熱情的反饋,但也會(huì)有負(fù)面的評(píng)論。記住,與用戶的任何互動(dòng)都是可以看作一種對(duì)于項(xiàng)目的貢獻(xiàn),即使有些看起來像是在抱怨。 首先,用文字來表達(dá)意圖和語氣不是那么的容易。“這很奇怪…”也許會(huì)被你解讀成:這很棒/這實(shí)在是很糟糕/我不理解/我很開心/我很沮喪。詢問更多的細(xì)節(jié),嘗試重新解讀這個(gè)問題,來更好地理解問題的根源。 避免抱怨的一些建議:
總結(jié)感謝閱讀,我希望你們能夠喜歡這篇文章,并幫助你們創(chuàng)建開源項(xiàng)目。貢獻(xiàn)開源代碼是拓展技能的好辦法,并不是每個(gè)開發(fā)者都需要有這種經(jīng)歷,但是這是一個(gè)讓你快速進(jìn)步的好機(jī)會(huì)。 我很期待你的第一個(gè)或下一個(gè)開源項(xiàng)目。記得在推特上 @vvoyer,我會(huì)很樂意給你的項(xiàng)目提出建議。 如果你喜歡開源項(xiàng)目,同時(shí)想在工作中去貢獻(xiàn)開源代碼而不是在你的空閑時(shí)間,Algolia 有相應(yīng)的 JavaScript 開源項(xiàng)目研發(fā)的職位。 你可能會(huì)喜歡的其他資源: (資源無法添加外鏈)
|
|