原文连接: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。