在過去的一年多時間裡,我很幸運地為兩個開源專案貢獻了幾千行程式碼。在node-webkit的提交記錄中,我有34個Commits,在Chromium中,用了六個月的時間也提交了30+個Commits,可以說對如何加入開源社群有一點點的自己的看法了。寫這篇部落格的目的是為了記錄下我的經驗,希望可以鼓勵更多像我一樣希望為開源專案做貢獻的學生參與到自己喜歡的開源社群中。說真的,花時間參與一個優秀的開源專案,將你大學期間自學的一些東西應用於實踐中,還能接觸到你在大學課堂上幾乎不可能學到的知識,比起為了拿多那麼點分數而努力完成作業值多了。
我為什麼會花費這麼多精力在這個事情上?
第一點:“大學裡時間太多,為了不像周圍其他同學一樣虛度,做一些有意義的事情,就開始參與 Chromium 了。” 這句話是我發郵件感謝方覺【0】在我第一次提交程式碼時指導我解決問題的時候他回覆我的。參與開源社群就是一個很有意義的事情。當你作為一個開源專案成長的見證者和貢獻者,當其他人談到這個專案的時候,難道不會小心臟稍微激動一下嗎?補充一下背景:node-webkit,目前在Github上有7000+的Star的一個C++專案,我在它只有幾百個Star就接觸到,並且貢獻了上千行程式碼。
第二點:幫人家解決問題是一種能力,也是一種樂趣。在node-webkit的issue list中,有人說這個問題:@zhchbin能解決,還專門發郵件給我讓我幫忙看看,然後還說要給我100美刀作為Bounty的時候,我很開心。並不是因為解決問題了能夠得到他說的100美刀,而是人家信任你,覺得你有能力去幫助他們解決問題。在Chromium的Issue List中,每當我看到人家給我的程式碼提交回復一個thanks/awesome的時候,我也會暗喜的,畢竟這些人都是Google的軟體工程師,他們在認可你做出的努力。
第三點:學到的總會比付出的翻倍。在做開源專案的過程中,每解決一個問題就會學習到該問題相關領域的知識,比如在這段時間內我接觸到了Win32 API/GTK+/X11等。還可以體驗到如何與其他人協同工作。Chromium上的Reviewer總能給我一些啟發,他可以在程式碼的層次上直接教你正確的寫程式碼方式以及如何寫出其他人也看得懂的程式碼!在這段期間,我知道了測試程式碼的重要性,知道了程式碼風格的重要性。
還有不少點,這裡就先不廢話了。
我聽過不少人想要為開源專案做貢獻,卻總是被開源專案的門檻嚇跑了。的確,我覺得我真正弄懂node-webkit程式碼的時候是我決定轉去Chromium社群的時候,那個時候我已經為node-webkit寫了兩個多月(IIRC)。而就算我有為node-webkit寫過程式碼的經驗,在進入Chromium社群的時候也是遇到了很大的困難。接下來,我就寫一下,在我看來,應該怎麼樣子加入一個開源社群,以為Chromium貢獻程式碼為例子。
第一:感性地認識Chromium,瞭解原始碼目錄結構。應該知道Google Chrome瀏覽器就是依託Chromium這個開源專案的,在每個Chrome瀏覽器中你都能找到這麼一句話:“Google Chrome is made possible by the Chromium open source project and other open source software.”。其實我這裡想講的是編譯並執行。在大中華區域網中拉下幾個G的程式碼是個煎熬的過程,而且隨時都會斷掉然後那個倉庫的程式碼就只能重新下載了。在Chromium的網站中就能夠找到如何在各個平臺下編譯的指導。簡單地說:就是安裝必要的開發庫,用gclient下載原始碼並且gyp產生相應的工程檔案(gclient sync),編譯(推薦使用ninja)。
第二:閱讀相關文件,瞭解Chromium的整體架構。這裡說的相關文件是比較坑爹的,文件那麼多。其實要耐心,文件你肯定一開始是看不懂的,比如這篇入門必看文件之:Chrome的多程式架構。
第三:到Chromium的Issue List上找一些問題看,在你本地編譯出來的Chrome上重現該問題,嘗試想想怎麼解決,或者看人家怎麼解決。上面的問題很多,我這裡分享一個我自己看的Issue的標籤:Cr-Platform-Apps Hotlist-GoodFirstBug Cr-Platform-Extensions Cr-Platform-Extensions-API Cr-Platform-Apps-AppLauncher Cr-Platform-Apps-Container 都是關於Chrome Extension/Packaged App的,用gmail登入後在 Subscriptions頁面中填入這些個標籤,在工作日每天你就能收到30+份郵件。這些標籤是基於我之前做過一些瀏覽器的外掛和應用,對這個東西還是知道點門路的情況的。因此我很多程式碼提交都是集中在Chrome Extension/Packaged App APIs上的。
第四:程式碼搜尋工具:https://code.google.com/p/chromium/codesearch 這個工具太好用,也太重要了!當你在看人家的程式碼時,可以利用這個工具找到具體的程式碼實現,而且通常情況下要好好閱讀相關程式碼的註釋。
第五:分享一點我解決問題的思路,基於對程式碼的熟悉程度才能解決的問題這個我沒法怎麼分享經驗。這裡想說的其實是如何在如此龐大的專案中定位到需要修改的程式碼的地方。在遇到程式Crash的時候(經常是空指標的情況),我們其實可以利用gdb(在Linux上),VS2010中Attach to Process的功能(在Windows上)得到程式奔潰的時候的呼叫棧,然後利用上面的程式碼搜尋工具就可以找到相應的程式碼了。接下來,就是認真讀懂相關的程式碼,用你的聰明才智想出一個合理的解決方法。如果遇到的問題是chrome://settings/類似URL頁面(這些頁面都是採用HTML/CSS/JS實現的,webui)中的,那就可以用F12調出開發工具,找到頁面元素的ID值,然後還是在上面的搜尋工具中查詢相關的程式碼。
......
第N:相信自己。上面講的那些東西,無非是為了引出最後這個點。如果你真的感興趣,相信自己,堅持,加油。
“這個事情如果不是我去完成,那麼還有誰會去做呢?“
【0】: 在第一次提交程式碼到Chromium上的時候認識的,當時多虧了他的指導啊,感謝。
原文連結:http://zhchbin.github.io/2013/12/08/contribute-to-open-source-project/