原文連接:http://zhchbin.github.io/2013/10/17/what-is-pay-me-to-learn/node
今天早上纔想起來,本身還欠着一件事情沒有作完。好久在人人上以前看到過這樣的一句話:linux
I dropped out of college after Google SoC, because I had work that paid me to learn.git
而後就在微博上大發感慨說:「突發奇想:等我搞定Google Summer of Code(無論最終結果如何),我就寫一篇文章:什麼叫作pay me to learn!」,事實上,估計我寫的東西沒有多少人會看。不過既然說了就要作到!好吧,接下來將寫一下如下幾點:github
Google從2005年其就開始舉辦這樣的全球性活動,簡單地用一句話歸納一下,就是Google出錢給學生爲開源項目寫代碼,而這個項目是在學生暑假期間舉行,被選擇上併成功完成的學生最終可以得到5000美刀
的獎金。固然,Google的這個項目最想獲得的是:提供給學生機會參與到真實的軟件開發中,在項目結束後可以有所收穫,而且還能繼續投入到開源中,爲開源社區作貢獻。Google提供的是一個平臺,在這上面開源項目能夠找到對可能對項目發展有幫助的學生,學生能夠申請參與到某個開源項目中。以上是我我的的一點理解,固然,也只有Google這樣的公司才能耗費如此大的財力和物力作這樣的意件事情,每一年150+個開源項目, 1000+遍及世界的學生,這得花多少錢。哈哈,雖然對於大公司來講這個是小錢啊。web
更詳細官方的介紹仍是要本身去官網上了解啊,這裏提供一個傳送門。chrome
當時我正大四下學期,從Intel
實習結束回來的我還在努力地爲node-webkit寫着代碼,天天查郵件,查issue,寫代碼的生活雖然很枯燥,但在解決問題及與人交流的過程當中也學到很多。看着一個開源項目從1000+ star
慢慢地增加到Github C++排名前幾的過程對於我來講也算是一件值得驕傲的事情,儘管我只是一個默默無聞的貢獻者。也就在這個過程當中,在微博上看到了GSoC的宣傳微博,頓時就以爲我應該能夠去申請參與這樣的一個事情。吸引個人另一點固然仍是錢的問題,畢竟那能夠用來支付我研究生的一年的學費和生活費了。json
看到能夠申請的開源項目公佈的時候,我有點失望的是node-webkit沒有去申請。抱着一點點的但願,我掃了一遍那個列表,當發現有Chromium的時候有點欣喜。但同時我也在懷疑本身有沒有機會。補充點點背景知識,node-webkit是一個將chromium和node.js整合在一塊兒的App運行環境,也就是說,對於Chromium這麼大的一個項目,我是有一點點....點點基礎的。因而我就開始準備寫申請。在chromium-dev的郵件列表中能夠找到要求的大概是什麼傳送門?簡簡單單的幾句話就完了,並且好像也沒有多少人關注。windows
照着要求,我就開始挑些比較簡單的Bug。我第一個選擇的bug是Issue 148463:Report an error when chrome.app.window.create is called with a URL that doesn't exist. 看上去很簡單解決嘛,直接加個代碼檢查文件是否存在不就OK了。可是問題遠沒有想象中的簡單,當時我還不知道這樣的一個操做是很耗費時間的IO過程,就算文件存在也不必定可以被加載等等問題。具體細節有興趣的話能夠看看當時我用我蹩腳的英文寫的記錄,傳送門。設計模式
在第一個Bug未能解決後,堅哥建議我去看一下他發現的一個問題。Issue 159302: Extension icon doesn't refresh after reload the extension in chrome://extensions. 雖然一開始很順利的解決,可是reviewer不贊同這樣子的作法。通過一段曲折的過程,最終仍是我解決的。中間的過程就忽略吧。而我第一個成功提交到chromium代碼樹中的是一個關於Content Shell的Tooltips在windows上不可以顯示出來的問題,在提交的過程當中仍是遇到了一些小問題,不一樣平臺下的文件換行符真是害死人啊,好在當時方覺給了點Tips!在這裏順便再次感謝。哈哈,從這個commit開始,源代碼目錄下的Author文件就有了個人名字和郵箱!api
而我具體寫的申請是在chrome的extensions/apps中加入全局快捷鍵的支持,發出去以後一直沒有收到回覆,因此我就以爲應該還作點什麼事情的。幸運的事情是我看到了Chromium的Issue List中有人提到了相應的需求可是沒有被實現,因而我就果斷地發了一封郵件給了提需求的Google的工程師。他幫我把郵件轉發給了另一個感興趣的組,當時我收到回覆的時候真心感動得哭了!也就在他的幫助下,我以爲我應該可以被選中了!哈哈。
就這個樣子,我就成了luck dog.
這一部分估計是一個很長很長的過程。在這期間,其實我每週都會記錄下大概作了什麼事情並給個人Mentor彙報工做,仍是用的蹩腳的英文,感興趣能夠到這裏閱讀。總結成一句話就是,我在不斷地找我可以解決的問題,寫代碼解決問題,測試,提交,照着reviewer的意見修改直到可以獲得他們的LGTM
。
第一個我比較滿意的Change List是解決了Chrome Packaged App在多屏幕下的問題,具體的Bug是這個樣子的,當電腦中外接了一個顯示屏,將App的窗口拖到另一個顯示器上,關閉該窗口,斷開顯示器以後,窗口就無法從新在主屏幕上出現了。雖然一開始不知道從哪裏下手,面對代碼如此龐大的一個項目,可是慢慢地在嘗試的過程當中,我發現出現這個問題的緣由是Chrome記錄下了上一次窗口關閉的位置,當顯示區域改變的時候,位置並無跟着更新。通過一番思索以後,我以爲應該能夠也記錄下窗口的所在的屏幕大小,而後在建立窗口的時候去檢查是否發生了改變,若是變了,就作一些調整窗口位置的操做,使得窗口可以在顯示屏中出現。事實上,這個作法被接受了!!最終代碼由@scheib幫我提交進去了。
第二件比較OK的事情就是利用X11的API將Ubuntu Unity Window Manager下GTK+沒有了窗口的最小化事件。這個好像是Unity的一個Bug,也有多是人家故意的。作法其實很簡單,就是經過給窗口添加了一個Event Filter的函數,獲取對應窗口屬性,檢查他是否有相應的最小化時應該有屬性,而後將這個事件傳遞給應用窗口就能夠順利解決了!
其實在這期間我解決的問題很多,但都是相似的這種小問題,不過解決起來挺有挑戰性的!每當解決一個問題的時候就可以學到該問題相關領域的知識。
接下來仍是講講個人Proposal的事情。由於我要添加的是一個新的功能,因此得通過必定的流程,具體流程。一開始我也沒有考慮到什麼問題,以爲採用如下的API設計方式就搞定了。
namespace globalHotKeys {
...
interface Functions {
// Register a global hot key.
static void register(HotKey hotKey);
// Unregister a global hot key.
static void unregister(HotKey hotKey);
// Gets an array of all the global hot keys.
static void getAll(optional GetAllCallback callback);
};
...
};
實際上,這樣子的設計根本就不可能被接受,由於這樣子的設計方式給開發者過高的權限,Extension/App能夠隨時的修改全局快捷鍵。通過一段時間的討論後,@Finnur建議從擴展chrome.commands入手,由於chrome.commands提供了chrome在有焦點的狀況下的快捷鍵,能夠共有很多代碼。因而乎,最終的設計變成了以下所示。具體討論的過程能夠到相應的API Proposal中查看,傳送門
{
"name" : "my extension",
...
"commands": {
"toggle-feature-foo": {
"suggested_key": {
"default": "Ctrl+Shift+Y",
"mac": "Command+Shift+Y"
},
"description": "Toggle feature foo",
"global": true ← default: false
}
},
...
}
在提議這個的過程當中,我還接觸到了Google的一位應該是PM的人,因爲Chrome中NPAPI在2014年其就要被淘汰了以及在Packaged App中不支持NPAPI,而某個功能又須要可以檢測到多媒體鍵的按鍵信息。好比說下一首,上一首,中止等多媒體鍵。因此,個人API Proposal也擴展成了如今這個樣子,可以讓chrome.commands支持多媒體鍵。雖然這個Proposal在最近纔有代碼上的進展,對於我本身來講,可以參與到這樣子的一個過程,看着本身的想法正在一步步地實現中,有點小驕傲的說!!
關於這個功能的具體實現過程,有我在linux平臺上的實現哦,有興趣瀏覽一下代碼的能夠看看這裏. 但願這個功能可以早點被你們所用啊!!
我以爲不少人都會不知道我上面那一段是在胡扯些什麼。算了,不詳細介紹上面的細節,要證實能參加GSoC的學生仍是有點料的。
在前一段時間GSoC 2013就不知不覺地結束了,也就在這個時候,我意識到了這麼有意義的三個月就Over了。打從內心以爲我提交了的代碼根本不值那5000美刀,相反地,是Google給我了這些錢,讓我去學習。Google給我機會去參與到真實的軟件開發過程當中。每次想到本身的代碼可以經過Chrome這個產品被全世界那麼多人使用到,以爲本身花了那麼大的精力也值得啊。
哦,好像忘記了什麼?在這個過程當中,我以爲個人C++水平提升不少,這樣子的實踐機會比起學院裏的那些做業來得有效多了。在這個過程當中,我好像學了些HTML/CSS/JavaScript。在這個過程當中,我掌握了一些Win32下的API。在這個過程當中,我學習了GTK+,X11等,雖然沒有深刻學習,但會用。我還知道了不少在學校裏學不到的東西,好比老師會告訴你測試很重要,但卻不會提供給你機會去實踐在一個具體問題下應該怎麼設計來得合理。又好比老師會跟你講設計模式多麼多麼重要,但卻又不會給你實際的應用機會,有的只是相似於《大話設計模式》那本書上的例子。再好比老師會跟你講語言的知識點,但卻不多跟你強調代碼風格的重要性,等等。
若是有一天,畢業論文可以變成:你在某個被你們所承認的開源社區中作出多少貢獻。
最後,我也不說開源怎麼怎麼了,推薦閱讀兩篇文章:什麼是開源精神 和OPEN SOURCE MADE ME THE MAN I AM。