0%

有这么一句话:想要成为什么样的人,就要和什么样的人在一起!实际上,你可能连自己想做什么样子的人都不清楚。

我们的生活总会在一定的时间内趋于平淡,每天重复着做着类似的事情,无论你是在上学,上班,或者其他?

说说大学吧。回顾我过去的大学四年,有人说算是很成功的了。每年都拿奖学金,参加过一些企业办的比赛(比如微软,英特尔)也拿了一些奖,去到Intel OTC实习了四个月,最后也乖乖地保了软院的研,在暑假期间你还参与了一些开源项目。一切看上去都是那样子的在人群中出类拔萃,甚至在朋友聊天中也经常会说我算是中大软件学院里面比较出色的那么几位了。

可实际上呢?上面那些话我说得自己都有点烦了。只有我自己知道自己究竟是有几斤几两。

我很少看书,基本上教材的东西到了只有在考试前几周记住了,考试后就忘记了。也许是我打从心底里觉得这些东西对我将来工作根本就没有什么用。但实际中呢?这样子的学习态度让我觉得很没有底气,特别是在面试的时候。我还记得面腾讯广研的笔试题目中有很多个题目是我压根就不会做的,在UC浏览器及小米的笔试中我是直接就被刷掉的。也许你会说,当时的笔试可是几百个人就挑十几二十个人的,可是你应该想想,为什么你成不了那些幸运儿,机会永远留给那些有准备的人,你觉得你准备好了吗?

我写不出好文章。曾经多少次想坚持写一些博客记录每天学习的内容,写过几次后发现很多东西都是流于形式的摘抄,过了一段时间又会忘记,并没有半点自己的思考,而自己却又不是个擅长思考的人。因为慢慢对自己的博客失去了信心,也就坚持不下放弃了自己的想法。

我懂得一些解决方法的思维方式。在解决问题上面嗅觉好像总能比其他人更灵敏些,解决问题的效率好像更高些。但是这些奇淫巧技在我看来并不能够让我成为一个难以替代的人物。在Chromium上解决过的问题(大都是些小问题)我能讲得头头是道,但是呢?在不在行的人看来这个是一件多么难以完成的事情啊,在我自己看来,这些只不过是个人,如果愿意花时间和精力去研究,也应该都能搞定的。

我并不是那么重要。脚伤了不能走路的这些日子,没有去实验室,除了一些小意外之外,实验室的工作依旧没有什么大问题,其他人也都是正常地过着每天的日子。曾经以为如果我离开实验室,那里会乱成一团。事实是?我好像有点自作多情和多余了,这个世界少了谁都能够正常的运转。

还有很多自我反省自我批评的话没有写下来,算了先。

好吧,到底你要的是什么?

一份好工作。目前对我来说最大的希望就是在毕业的时候能够找到一份不错的工作。经历过大三找实习的痛苦,我觉得应该要变得更加优秀,让工作主动来找你。也许我做到了,曾经收到了两份不错的面试邀请机会,感谢你们看得起啊!希望到我真正需要的时候能够有这样子的好机会!现在的我还是好好准备各种笔试和面试吧。正在逐步地养成每天刷一道leetcode上的题目的习惯,希望这个我能够坚持,刷完那140道题!

一份好心态。不会因为自己身上有很多乱七八糟的事情而失去做事情的热情。这个学期的确有很多事情:做了实验室助理的负责人,每月享受600RMB的待遇也要每天纠结各种实验室的琐事;找了研究生的导师也会给你分配任务做,好在最近顺利地解决了;自己想接着做Chromium上的开源Contribution;偶尔会有人发邮件来叫帮忙解决node-webkit上的问题,有一次还说要给100美刀(可惜我搞定之后他就压根忘记了的样子,好吧,我也不好意思要了);关于自己研究生想从事的方向现在还是一无所知,等等事情。当然也推掉了不少,对不起不少人啊。

一个好身体。身体是革命的本钱,深知我目前每天都对着电脑长达12+小时的习惯真的很不好,曾经有一次还因为对着电脑太长时间导致第二天起床的时候吐个半死而回不了家(那天本来是订好票准备回家的),最近还扭伤脚,流鼻血,经常肚子疼什么的。哎!要好好锻炼,注意休息,健康生活!

最后,做个好人吧。

好像少写了什么!

背景

今天早上才想起来,自己还欠着一件事情没有做完。很久在人人上之前看到过这样的一句话:

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设计方式就搞定了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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中查看,传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"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

Updates: 我觉得我应该感谢当时给我机会实习的Intel OTC以及那里的人!!在那里我开始了解各种开源协议(我还记得当时给我们讲课的可是英特尔首席开源科学家Fleming),听到各种高端的分享(印象最深的是一位韩国的工程师,Firefox的Developer),等等!!没有这些,我估计也没有什么机会参加上这种活动。