开源社区参与之感想

Page content

最近几个月里,我向OpenSSL、Linux kernel和Rizin三个开源社区提交了Pull Request,其中大部分都被接受。对OpenSSL和Linux kernel社区贡献的代码主要是对一些bug的修补;由于Rizin仍处在开发的初期,对Rizin贡献的代码则主要涉及到一些新功能的开发。这篇博客主要聊一聊参与这些开源社区的感想。

工作方式(GitHub)

Linux kernel在GitHub上有仓库,但不接受代码提交。对kernel的提交需要向邮件列表发送邮件,这儿有一篇详细的说明。OpenSSL和Rizin均可通过GitHub贡献代码,这也是我使用比较多的方式,因此对这个流程可以说一说。

从提交什么代码开始

作为一个项目的newbie,可以从下面几个方向开始贡献代码。看一看文档:文档是对程序的说明,然而,很多开发者却懒得写文档、忘记更新文档。因此你可以查找文档中的错别字、语法错误,或者是与现有代码库实现不符合的地方进行提交。这样,也可以增加对项目的了解,为以后的代码提交做准备。自己寻找bug:通过静态分析(如静态分析工具、人工审计代码)或者动态分析(如模糊测试)找到确实存在的bug后,可以发起Pull Request将补丁提交到项目。看一看issue的标签:在项目的Issues页面中,有一些issue带有类似“help wanted”、“good first issue”的标签,它们都是开发者希望你进行贡献的补丁或功能。看一看milestone:在项目的Issues和Pull Requests页面的右侧有一个Milestones按钮,点击后可以看到项目的下一个版本规划并期待开发的功能。你可以参与到对这些功能的开发中。

提交代码的流程

在GitHub上向开源项目提交代码的流程大致是 (1) fork项目到自己的账户下,(2) 将自己账户下的项目clone到本地,(3) 在本地项目上开启一个新的分支(假设为分支A)并进行更改,(4) 将更改推送到自己的远程仓库,(5) 向开源项目提起Pull Request,申请将自己的分支A合并到项目主分支。这个流程在网上有很多教程,在此不再赘述。

不过,在这个基本的流程之外,有一些点需要注意。首先,你需要注意代码提交的规范。开源项目一般会对代码的格式有固定的要求,有一些还可能要求签署一些协议,又或者是如何同时更新文档,这些都会在项目的某个readme文件中说明,在提交前可以阅读一遍。其次,GitHub上托管的项目往往会有一些自动化测试(Continuous Integration)来保证你提交的代码不会造成什么问题,如果有问题要进行修改来保证代码可以被接受。修改代码的方式仍是在本地修改分支A的代码,然后推送到远程仓库,你的Pull Request页面会自动同步分支A上新的commit。在对分支A的进行修改并推送时,使用--fixup进行commit可以方便维护者对你的多个commit进行合并;使用--amend可以修改上次的commit。这是两个很有用的选项,可以自行搜索如何使用。

我得到了什么

在贡献代码时,要对项目中的代码进行浏览与理解,这一个过程极大的提高了我审计代码的能力。并且,项目中很多代码写的很漂亮,看上去是一种享受。除此之外,向开源社区贡献代码可以带给我心理的满足:想到自己的代码被合并到开源项目上被其他设备运行,岂不快哉?开源运动是一个伟大的运动,改变了人们传统的索取与给予的方式。能够通过向开源项目贡献代码的方式参与开源运动,岂不快哉?