
【开源生态60问】——如何开始为一个开源项目做贡献?
开源软件正在改变世界。从操作系统(如 Linux)、浏览器(如 Firefox)、编程语言(如 Python),到日常使用的工具,许多都是来自全球开发者的协作成果。对初学者而言,首次参与开源既令人期待又充满未知:该如何开始?需要多高的技术水平?是否必须写代码?本文将以简单的方式,带你迈出贡献开源的第一步。
1. 参与开源的意义
首先是通过参与开源,能够更好的掌握软件开发方面的技能。软件是近百年发展最快的技术之一,特别是随着智能手机与平板电脑的普及,软件技术更是渗透到了我们生活的各个方面。学会编程,并不意味着要去建立一个复杂的系统。其实写个报表的计算公式或者做一个小动画也可以是一种编程的体验。而开源社区,则是学习软件开发最好的学校。在开源社区里,有大量热心的程序员,他们乐于分享自已对技术的理解、心得,他们通过各自的行动扩大自已的影响力,在协助别人的同时不断加深自己对技术的理解程度和实践能力。而新的社区加入者也可以在与社区互动的过程中找到自己技术与精神的导师(Mentor)。
通常,我们在求职的时候,总要提交自己的个人简历。而开源社区的贡献历程,则是更有说服力,也更加透明可信的简历。越来越多的开发者会在简历中标注自己的GitHub/Gitee账号,就是这样一种趋势。而如果你是Apache项目或者Linux内核项目的贡献者,甚至是维护者,那么找到一份好工作,简直易如反掌。
除了以上两种比较功利的目的,还有两种不那么功利的目的。一方面是在社区里结交更多的朋友,另一方面则是通过贡献社区,创造全新的功能,而获得心理上的满足感。也有很多朋友,原本是抱着功利的目的来到社区,却收获了更大的快乐与荣誉。
2. 贡献的多种形式
也许有人会认为,要给开源做贡献,就必须先学会写代码。其实还有很多种贡献开源的类型,如下表所示。
表4-1:贡献开源的类型
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
除了编写代码之外,社区还需要做大量的文档编写、完善、翻译等工作,有不少开源项目代码本身写得不错,文档却一塌糊涂,如果有人能够帮助他们完善文档,他们都会非常感激。如果你还有不错的审美,能够做一些视觉设计,就更是社区最紧缺的人才,有太多的开源软件,UI/UE都亟待改进。
作为一个开源软件的普通用户,在使用的过程中遇到问题,及时、准确、完整的提交缺陷报告(Bug Report)也是非常重要的社区贡献。
另外,在一个I人积聚的地方,如果你正好是一个E人,乐于分享,善于交流,喜欢组织线上线下的活动,甚至能登台演讲,那就更好了。社区的发展,离不开社区支持与运营的贡献。
总之,你不能完全不懂技术,但是也不必成为写代码的高手,就能够加入社区,并且为社区做出贡献。
3. 需要的基本技能
虽然不需要成为编程高手,但是基本的技能还是需要掌握的。
(1) Git版本控制,现在几乎所有的开源项目,都会托管在GitHub、GitLab、Gitee或者类似的代码托管平台上。这些平台无一例外的,都使用Git来管理代码版本。所以,理解什么是版本、版本控制工具、仓库、分支与提交、Fork与发起合并请求(Pull Request)都是必须掌握的基本功。推荐学习《Pro Git》中文版,这个免费的电子书在线就能够搜到。
(2) 代码托管平台,熟悉GitHub/GitLab/Gitee的基本操作,其实非常简单,而且这些平台的操作都是大同小异,只需要学一遍就行。
(3) 阅读能力+耐心,开源社区都比较强调自助,你来到一个社区,首先是尽量阅读文档,尝试自己理解并运行那个软件,只有确实遇到困难,再去求助。而不是在社区里反复提交一些早已被回答过无数遍的问题。
(4) 沟通能力,又是一个软技能,学习礼貌、清晰、有条理的提问,有理有节的回答问题,非常重要。特别需要注意:提问前先查阅文档和历史讨论记录;清晰描述问题或改动目的,避免模糊表达;保持礼貌,尊重不同意见;理解维护者多为志愿者,耐心等待回复。无论你出于什么样的目的:仅仅是一次性的贡献,亦或是永久性的加入社区,都得和他人进行沟通和交往,这是你要在开源圈发展必须修炼的技能。
4. 寻找适合新手的开源项目
选择一个开源软件,首先要明确的,是自己的动力何在。是出于兴趣?还是出于工作需要?比如,有人对于搜索引擎特别感兴趣,想了解搜索引擎是怎么做出来的?那么首先可以考虑先寻找一些专业的书籍,来了解一些关键的知识点。如果对于某一领域的知识点,缺乏必要的了解,可能完全无法理解一个项目里的代码。在掌握初步的知识以后,自然可以去找Lucene、Sphinx来学习。也可能是出于工作需要,比如平时是用PHP开发Web应用,已经在用某一个常见的PHP框架了,希望能够对这个框架有一个深入的学习了解,甚至希望横向地比较多个不同的PHP Web框架,这些都是非常清晰的目的。自然在学习的过程中,不太会迷失方向。
比较危险的一种,是听说某某项目很有名气,甚至是为了将来找工作比较容易,就贸然一头扎进某个项目中去了。怀有这种学习目的的人,往往会选择到那种很庞大,也很成熟的项目,打开文件夹一看,成百上千的源文件,根本无法看完,一下子就懵了,再就是颓了。心想自己大概不是学软件开发的料吧~~
优先选择能够独立运行的项目
开源的项目有很多种类,能够独立运行的项目,当然很多。但是也有不少项目,是其他开源项目的插件、类库、扩展包之类的东西,这些在一开始接触开源的时候,最好不要涉猎,因为理解他们,可能会需要理解他们背后的那个庞然大物,往往会遭遇很多难解的细节,一不小心,就进行不下去了。
当然,还有一类项目,他们虽然是独立运行,但是想要让他们独立运行成功,还得安装、配置很多其他的依赖项目,这个往往会让初学者特别绝望,搞了一个礼拜,居然这个项目都还没有运行起来...
所以,小的、能够独立运行的、不依赖于太多其他项目的开源项目,可以优先选择。
PS. 在Docker出现以后,运行一个项目,往往只需要一行简单的命令。在Github上,也能找到很多demo项目,或者是docker-compose.yml文件,这些是很好的入手点。
选择活跃的项目
项目的活跃程度,包括两个部分,一个是开发者提交新代码的频繁程度。另一个是在社区中对于这个项目的讨论热烈程度。提交代码越是活跃,提交的人越多,越能证明这个项目是很有价值的,也证明这个项目是值得你花精力去学习的。而项目在社区讨论的热烈程度,则能够确保当你遇到问题的时候,能够搜索到别人的答案,或者你自己提问以后,能够有人热心回答你。
当然,活跃程度都是相对的,如果你真的对一个项目感兴趣,可以直接试着给这个项目的作者发邮件,提问题。大多数开发者都会很高兴有人关注他的项目,也会通常会热心的回答你的问题的。
判断代码质量
并非所有的开源项目,都是高手写的,都值得你去学习。事实上,有很多垃圾开源项目,代码仔细一看,写得真是一塌糊涂。所以,试着阅读一下这个项目的代码。至于如何判断一个项目的代码质量,之前我在知乎回答过一个类似的问题“如何让自己写的代码易维护?”,推荐各位朋友参考一下。当然,更加推荐的,是阅读《Clean Code》一书,非常好的一本介绍如何提高代码质量的书。
搜索技巧
在 GitHub 上搜索标签:is:issue is:open label:"good first issue"(新手任务)或 label:"help wanted"(急需帮助)。通常能够找到不少对于新手友好的任务,但是这些任务所属的项目是不是适合你,还得通过前面的几条来判断。
5. 第一次贡献的完整流程
以在GitHub上,为某个项目修复文档错别字为例,在动手执行下面的八个步骤之前,还要确保你的机器上,已经正确安装了Git客户端。
-
Fork 仓库:在该项目的主页点击 "Fork",复制到你的账户。
-
克隆到本地:运行命令
git clonehttps://github.com/你的用户名/项目名.git。 -
创建新分支:执行
git checkout -b fix-typo-readme建立修改分支。fix-typr-readme是你为这个分支起的名字。 -
修改内容:用文本编辑器修正文件(如 README.md)。
-
提交更改:依次运行
git add README.md和git commit -m "修复README中的拼写错误"。 -
推送分支:使用
git push origin fix-typo-readme同步到远程仓库。 -
发起合并请求:在 GitHub 点击 "Compare & pull request",描述修改内容。若关联已有问题,注明 "Fixes #问题编号"。
-
响应反馈:根据维护者建议调整代码,直至合并完成。
在GitHub上有一个著名的开源项目,特别能够帮助那些想要做出自己的第一次开源贡献的朋友,名字就叫:first-contributions。
6. 其他帮助新手入门的资源
-
MunGell/awesome-for-beginners:一个包含各种编程语言和技术的初学者友好项目列表,访问 https://github.com/MunGell/awesome-for-beginners。
-
First Timers Only:帮助新手参与开源项目的网站,提供指导和项目列表,访问 https://www.firsttimersonly.com/。
-
HelloGitHub:一个专注于分享 GitHub 上有趣、入门级开源项目的社区,特别适合中国用户,访问 https://hellogithub.com/。
-
如何选择(并贡献)第一个开源项目:GitHub官方搜集的适合新手入门的项目,访问 https://github.com/collections/choosing-projects
-
按照语言/领域推荐
表4-2:适合新手的开源项目
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7. 开始行动
参与开源无需一步到位,一次微小的改进就能成为社区一员。与其瞻前顾后,不如轻松一跃。开源世界始终向所有愿意参与的人开放。每一次贡献都在推动技术进步,祝你的开源之旅顺利启程!
转载自 庄表伟 阅读思考与生活 【开源生态60问】——如何开始为一个开源项目做贡献?


