English Version and 本文在微软学术合作官方微信公众号上的推送
大家好,我来自中国科学技术大学,又名 iBug。今天我给大家介绍一下关于参与开源项目的一些经验和技巧。
1. 什么是开源软件
开源软件 (Open-Source Software) 指的是源代码在可以自由获取的软件。开源软件的源代码都附带一个开源协议,规定了源代码使用者必须遵守的代码使用方式,常见的开源协议有 GPL, MIT, Apache 2.0, BSD 协议等。不同协议对代码使用者的要求也不一样,例如 GPL 协议要求所有衍生作品以相同协议继续开源,而 MIT 协议则允许任意形式的使用,但是原作者不承担任何责任。同时,公开的源代码使得任何人都可以参与项目并作出贡献,为项目添砖加瓦。
开源软件最初的动机是分享知识。软件的设计方式,编程技巧等都属于知识,因此最早的人通过分享它们的源代码来交流这些知识。在一个开源软件的模型中,每一个用户都是这个社区中的一份子,因为每个用户都可以参与开源软件的开发与维护、协助测试和审计代码,或者参与围绕开源软件的讨论。于是,开源软件就有了一种独特的公开合作模型,而丰富的文档、教程和讨论记录也给想要学习或参与的人提供了充足的资料。
那么,人们为什么选择开源软件呢?
第一点,开源软件都是经过很好的审计的。相比专有软件,开源软件的审计不是由一个封闭的团队完成的,而是任何人都可以参与的,每个人都可以审计所有开源软件的代码。这使得开源软件非常透明,而具有安全经验的人参与合作也能带来安全性的加成。
第二点,开源软件都有一个围绕它的社区,因此开源软件不会轻易被抛弃。通常开源软件都是由围绕它的社区维护的,因此开源软件都是持久的。同样,因为有各种各样的人参与开源项目的维护,相关的资料和信息也能得到及时的更新,另外,由于源代码是开放的,因此任何人都可以通过自己编译源代码来获得可以运行的程序,这大大降低了软件的使用成本。(当然这种说法也不绝对,例如 NGINX 软件就有偿出售它的升级版,NGINX Plus)
上面这张图中就有不少大家耳熟能详的开源软件,例如 TensorFlow 机器学习框架,Windows 计算器,LibreOffice 办公套件和 Debian GNU/Linux 操作系统等。可以看出,开源软件在我们的生产和生活中无处不在。
2. 我参与开源项目的经历
这是我的 GitHub 用户页面,首页固定的 6 个仓库分别是
- TetrisAI: 一个带自动游玩 AI 的俄罗斯方块游戏,使用 C 语言写成
- SmokeDetector: 这个将在后面介绍
- PyReversi: 一个图形界面的黑白棋游戏,带有 AI 可提供人机对战,使用 Python 和 PyQt5 写成
- CGadgets 和 vbsGadgets: 我的一些杂七杂八的小程序,分别用 C 和 VBScript 写成
- OJSangbox: 我的《新生研讨课》作品,使用 chroot, rlimits 等技术实现的一个在线代码评测后端
这是我的 Stack Overflow 用户页面,我也会偶尔在 Stack Overflow 上也经常参与公开的问答活动。到目前为止,我一共在上面提出了 100 多个问题,撰写了 800 多个回答,积累了 2.2 万的声望值。我最常回答的几个标签是 C++, C, Python 等。
我的第一次参与经历
我第一次参与开源项目是在 markondej/fm_transmitter 中。当时我使用这个项目在我自己的树莓派上建了一个 FM 广播电台,想循环播放音乐。折腾了一会之后,我发现这个程序的循环播放参数没有正常工作,于是我就观察调试代码,发现一个条件判断的逻辑弄反了,我就把它改正了,重新编译了一下,确认这个问题被修复了。
当时我的舍友就在旁边,他看到我修复了一个开源项目的 bug,就过来一步步教我,先 fork 的那个仓库,然后把我的修改推到了我的仓库上,并从我的仓库向上游开启了我的第一个 PR。两天之后,作者回复 Thanks for your help,并把我的 PR 合并进了主线。
我最主要的参与经历
上面那张图列出来的开源软件的图标中,想必最右下角的那个应该没有人知道。那个图标是 Charcoal-SE 团队的,该团队的主要项目是 SmokeDetector,一个帮助清理 Stack Exchange 网站上垃圾信息的聊天机器人。
我在 2017 年 12 月发现 SmokeDetector 这个机器人,并经人介绍后找到了 Charcoal HQ 聊天室。
然后我就进到了那个聊天室,每天跟他们一起讨论,也看着 SmokeDetector 的输出来投票删除垃圾信息。过了大半个月,在 2018 年 1 月,Charcoal HQ 里的其他人发现这个机器人有个 bug,我就主动提出来要看看,并把它修复了,提交了我在这个项目中第一个修改了代码的 PR (#1441)。从那开始,我就努力学习研究 SmokeDetector 的代码,并不断地提交各种修复和改进。到了 3 月份,Charcoal 团队的主要维护者把我加到了他们网站上列出的“主要开发者名单”;又到了 6 月,我获得了 SmokeDetector 的直接推送权限,意味着他们认为我对项目已经有了足够的了解,可以直接维护这个项目了。
从 SmokeDetector 项目,我开始了横向扩展,寻找其他我感兴趣的项目,给它们交 PR。其中几个项目,比如 metasmoke,SmokeDetector 的一个网页信息面板,是一个利用 Ruby on Rails 开发的 web 应用程序;还有 Charcoal 团队的网站,挂在 GitHub Pages 上;另外,利用 GitHub Pages,我也搭建了我自己的网站,并给我当时使用的那个主题也交了一个 PR。
我做过的其他贡献
我对开源项目的其他形式的贡献,也包括了一系列的 Issues。比如
- 安卓系统的 Root 框架 Magisk,我提交了一个建议来改进它的安装脚本,这个建议随后被采纳
- wtfpython,一个收集了各种 Python 语言的有趣细节的文档,我指出了一处错误;
- BaiduPCS-Go,一个百度网盘的命令行客户端,我反馈了一个 bug;
- 我还在我熟悉的仓库里开了几个简单的 issue,让更多人能借 Hacktoberfest 这个机会来参与开源项目
另外,我还在其他一系列项目的讨论列表,以及 Stack Overflow 上参与讨论,并利用我掌握的知识来帮助别人。
我自己的最高 ★ 仓库是 pac,它起源于一个讨论。大家对于软件的一项功能有比较强烈的需求,我就自己编写了一份这个软件的配置文件,实现了那个功能,并开了这个仓库,把我编写的配置文件分享给了大家。截至本文编写时,它已经被点了 22 颗星。当然有一点,这个星星数量不表示这个项目的复杂度或技术深度,而是表示有更多人认为这个仓库对他们有帮助。这个仓库的 Issue 看板也积累了一些提问,我都一一予以回答了。
我学到了什么
在我参与开源项目的过程中,我觉得我学到的最主要的内容就是团队协作的技巧。例如,版本管理工具 Git 的使用、统一的代码风格和良好的文档注释的意义、持续整合 (Continuous Integration, CI) 的意义与使用,以及与人交流沟通的技巧等。
3. 参与开源项目的方法与技巧
在参与开源项目之前,首先要理解一点,开源项目是一个【项目】,所以参与方式是多种多样的。
- 对于开源软件来说,最容易想到的方式自然是提交代码,比如 bug 修复、功能改进,或者代码中的测试项目;
- 另一个,为项目完善文档和教程等也是一种非常有价值的贡献;
- 同时,将项目资料翻译成其他语言可以帮助更多人参与进来。Transifex 是一个有名的开放协作翻译的平台,很多软件和网站都在利用它给用户提供参与翻译的机会;
- 最后,如果你对前面几项都不感兴趣,你也可以为项目贡献一些周边资料,例如为其他用户解答问题,为项目反馈问题或提出建议等。
这些都是开源项目常见的参与方式。
那么,在参与开源项目的过程中,我们能为自己收获什么?
- 最直接的,你获得了参与真实项目的实践经验;
- 其次,你在项目中可以锻炼技能,也可以学到新的技能;
- 参与开源项目的过程中,你可以学习到各种各样的宝贵知识;
- 你可以很容易地向别人展示你的成果,就像我前面展示的一样;
-
由于上面那个原因,参与开源项目的经历可以使你在人群中脱颖而出。很显然,如果你面对的 HR 或导师能够真真实实地看到你的作品或劳动成果,那么你就更容易获得他们给的机会。
例如,我能得到今天在这里演讲的机会,就是因为我参与各种开源项目的经历,主办方可以真实看到并做出评价。
参与开源项目能得到的收获看起来很诱人对不对?那么下面我就介绍一下具体的参与方式。
发现自己的长处
在准备参与之前,第一件事是看看自己擅长哪方面的事,有哪方面的技能。比如说,你很擅长将你的想法转化成代码;或者你擅长折腾软件,找出意想不到的 bug;或者你擅长把复杂的东西解释清楚;或者你对艺术和设计有自己独到的见解;或者你去过西方的很多国家,精通八国语言;或者你对于某些东西有不错的了解,能够帮助别人答疑解惑……
找到自己的兴趣
其次,你要找到一个你感兴趣的项目来参与。寻找的方向也有几种,比如
- 你日常使用的软件;
- 某天你意外看到的一个有趣的项目,比如 GitHub 首页右边栏随机推送的三个项目;
- 网络上还会时不时的有一些号召大家参与开源项目的活动,比如 Hacktoberfest,以及另一个长期举行的 Up For Grabs;
- 如果你有一个好点子,你也可以自己开始一个新项目。
如果你决定加入一个现有项目的话,我建议先对这个项目做一些背景调查。
- 首先最重要的一点,开源软件一定要有协议。同时由于开源项目的开放特性,如果有一份行为准则,那就更好了;
- 其次你要判断项目的活跃程度,比如最近一次提交时间,以及项目维护者的提交频率;
- 如果项目有一个活跃的社区,那绝对是一个加分项。活跃的社区通常会产生大量的 Issues 和 Pull Requests,所以这些活动你可以考虑也检查一下;
- 最后,一个友好的社区和交流环境会让人在参与的过程中感到舒适。
高效沟通
在你参与项目的过程中,发生的最频繁的事件就是与其他人交流。为了提升交流效率,有几点值得注意:
- 你应该自己做足够的研究,例如提问时不要问 “怎么写 1+1 的代码”,而 “1+1 为什么出来 3” 甚至都可能是个好点的问题;
- 如果你真的要问 “1+1 为什么出来 3” 这样的问题,那么你最好能提供足够的信息让别人可以判断你的问题出在哪。同样对于其他讨论,也要确保别人有足够信息来复现你说的内容;
- 在保证信息完整的时候尽可能保持简练,比如 “这个 1+1 等于 3 的代码是我下午在码头搬完砖后去星巴克喝咖啡的时候写的” 这样的信息最好就别提供了
:)
- 对于公开的项目,最好能够保证讨论也是在公开的环境下进行的,除非有特别的保密需求,例如反馈安全方面的漏洞;
- 如果你的观点和其他人不一致,请尊重他们。
提交你的贡献之后
当你提交了你的贡献之后,就是等待项目的维护者来检查和进行下一步处理了。这里也有几种情况
- 没人理你,你的 Issue 或 PR 就那么挂在那里。这时候要么多等一会,要么再检查一下这个项目,是不是还在活跃维护的状态;
- 如果有人对你的贡献提出了改进意见,说明你的提交有人来花时间看过了。你应该尊重别人,尽早响应别人提出的意见;
- 也许有时候,项目维护者或者社区不认可你的提交,这时候也不要气馁,看看别人给出的评价和理由,作为自己的经验;
- 如果你的贡献被采纳了,那么祝贺你。
后记
不论你是第一次参与开源项目,还是一位经验丰富的老手,希望你能够再接再厉,把开源的精神继续发扬光大。
Leave a comment