爲開源社區作貢獻

在過去的一年多時間裏,我很幸運地爲兩個開源項目貢獻了幾千行代碼。在node-webkit的提交記錄中,我有34個Commits,在Chromium中,用了六個月的時間也提交了30+個Commits,能夠說對如何加入開源社區有一點點的本身的見解了。寫這篇博客的目的是爲了記錄下個人經驗,但願能夠鼓勵更多像我同樣但願爲開源項目作貢獻的學生參與到本身喜歡的開源社區中。說真的,花時間參與一個優秀的開源項目,將你大學期間自學的一些東西應用於實踐中,還能接觸到你在大學課堂上幾乎不可能學到的知識,比起爲了拿多那麼點分數而努力完成做業值多了。node

我爲何會花費這麼多精力在這個事情上?git

第一點:「大學裏時間太多,爲了避免像周圍其餘同窗同樣虛度,作一些有意義的事情,就開始參與 Chromium 了。」 這句話是我發郵件感謝方覺【0】在我第一次提交代碼時指導我解決問題的時候他回覆個人。參與開源社區就是一個頗有意義的事情。當你做爲一個開源項目成長的見證者和貢獻者,當其餘人談到這個項目的時候,難道不會當心臟稍微激動一下嗎?補充一下背景:node-webkit,目前在Github上有7000+的Star的一個C++項目,我在它只有幾百個Star就接觸到,而且貢獻了上千行代碼。github

第二點:幫人家解決問題是一種能力,也是一種樂趣。在node-webkit的issue list中,有人說這個問題:@zhchbin能解決,還專門發郵件給我讓我幫忙看看,而後還說要給我100美刀做爲Bounty的時候,我很開心。並非由於解決問題了可以獲得他說的100美刀,而是人家信任你,以爲你有能力去幫助他們解決問題。在Chromium的Issue List中,每當我看到人家給個人代碼提交回復一個thanks/awesome的時候,我也會暗喜的,畢竟這些人都是Google的軟件工程師,他們在承認你作出的努力。web

第三點:學到的總會比付出的翻倍。在作開源項目的過程當中,每解決一個問題就會學習到該問題相關領域的知識,好比在這段時間內我接觸到了Win32 API/GTK+/X11等。還能夠體驗到如何與其餘人協同工做。Chromium上的Reviewer總能給我一些啓發,他能夠在代碼的層次上直接教你正確的寫代碼方式以及如何寫出其餘人也看得懂的代碼!在這段期間,我知道了測試代碼的重要性,知道了代碼風格的重要性。chrome

還有很多點,這裏就先不廢話了。瀏覽器

我聽過很多人想要爲開源項目作貢獻,卻老是被開源項目的門檻嚇跑了。的確,我以爲我真正弄懂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/

相關文章
相關標籤/搜索