What is Pay Me to Learn——Google Summer of Code 2013

zhchbin發表於2013-10-17

原文連結:http://zhchbin.github.io/2013/10/17/what-is-pay-me-to-learn/

背景

今天早上才想起來,自己還欠著一件事情沒有做完。很久在人人上之前看到過這樣的一句話:

I dropped out of college after Google SoC, because I had work that paid me to learn.

然後就在微博上大發感慨說:“突發奇想:等我搞定Google Summer of Code(不管最終結果如何),我就寫一篇文章:什麼叫做pay me to learn!”,事實上,估計我寫的東西沒有多少人會看。不過既然說了就要做到!好吧,接下來將寫一下以下幾點:

  1. Google Summer of Code簡介
  2. 我怎麼就能被選上呢?
  3. 在參加GSoC的過程中我做了什麼事情?
  4. 我學到了什麼呢?

Google Summer of Code簡介

Google從2005年其就開始舉辦這樣的全球性活動,簡單地用一句話概括一下,就是Google出錢給學生為開源專案寫程式碼,而這個專案是在學生暑假期間舉行,被選擇上併成功完成的學生最終能夠獲得5000美刀的獎金。當然,Google的這個專案最想得到的是:提供給學生機會參與到真實的軟體開發中,在專案結束後能夠有所收穫,並且還能繼續投入到開源中,為開源社群做貢獻。Google提供的是一個平臺,在這上面開源專案可以找到對可能對專案發展有幫助的學生,學生可以申請參與到某個開源專案中。以上是我個人的一點理解,當然,也只有Google這樣的公司才能耗費如此大的財力和物力做這樣的意件事情,每年150+個開源專案, 1000+遍佈世界的學生,這得花多少錢。哈哈,雖然對於大公司來說這個是小錢啊。

更詳細官方的介紹還是要自己去官網上了解啊,這裡提供一個傳送門

我怎麼就能被選上呢?

當時我正大四下學期,從Intel實習結束回來的我還在努力地為node-webkit寫著程式碼,每天查郵件,查issue,寫程式碼的生活雖然很枯燥,但在解決問題及與人交流的過程中也學到不少。看著一個開源專案從1000+ star慢慢地增長到Github C++排名前幾的過程對於我來說也算是一件值得驕傲的事情,儘管我只是一個默默無聞的貢獻者。也就在這個過程中,在微博上看到了GSoC的宣傳微博,頓時就覺得我應該可以去申請參與這樣的一個事情。吸引我的另外一點當然還是錢的問題,畢竟那可以用來支付我研究生的一年的學費和生活費了。

看到可以申請的開源專案公佈的時候,我有點失望的是node-webkit沒有去申請。抱著一點點的希望,我掃了一遍那個列表,當發現有Chromium的時候有點欣喜。但同時我也在懷疑自己有沒有機會。補充點點背景知識,node-webkit是一個將chromium和node.js整合在一起的App執行環境,也就是說,對於Chromium這麼大的一個專案,我是有一點點....點點基礎的。於是我就開始準備寫申請。在chromium-dev的郵件列表中可以找到要求的大概是什麼傳送門?簡簡單單的幾句話就完了,而且好像也沒有多少人關注。

照著要求,我就開始挑些比較簡單的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檔案就有了我的名字和郵箱!

而我具體寫的申請是在chrome的extensions/apps中加入全域性快捷鍵的支援,發出去之後一直沒有收到回覆,所以我就覺得應該還做點什麼事情的。幸運的事情是我看到了Chromium的Issue List中有人提到了相應的需求但是沒有被實現,於是我就果斷地發了一封郵件給了提需求的Google的工程師。他幫我把郵件轉發給了另外一個感興趣的組,當時我收到回覆的時候真心感動得哭了!也就在他的幫助下,我覺得我應該能夠被選中了!哈哈。

就這個樣子,我就成了luck dog.

在參加GSoC的過程中我做了什麼事情?

這一部分估計是一個很長很長的過程。在這期間,其實我每週都會記錄下大概做了什麼事情並給我的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

相關文章