在过去的一年多时间里,我很幸运地为两个开源项目贡献了几千行代码。在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/