开源:没那么可怕!
已发表: 2022-03-11以下是在 Toptal 女性开发者奖学金推出之前发布的。
作为开发人员,跟上最新的技术趋势是令人兴奋和具有挑战性的。 每天,新的语言、框架和设备都会吸引我们的注意力,并在聚会、论坛和聊天中激发对话。 然而,我们的开发者社区是由人组成的,而不是工具,探索它的社会政治方面是很有趣的(因为没有更好的词;如今,“社会”往往与社交网络相关联)。
在 Toptal,我们最近就女性为开源做出了多少贡献以及可能阻止她们做出更多贡献的原因进行了一些有趣的对话,因此我们对此事进行了调查。 在与 Breanden Beneschott 和 Bozhidar Batsov 进行了对话后,我想知道:Bozhidar 是 GitHub 上的顶级开源贡献者之一。 我在哪里? 如果你今天查看我的公共 GitHub 帐户,它主要是我在课堂上为我的学生使用的小型测试项目。 它们是半生不熟的,绝对不能代表我的技能或专业知识。 (你必须相信我的话。)如果有人考虑根据他们在该帐户中找到的内容来雇用我,我想我将很难谋生。 尽管如此,我从事专业开发人员已有 20 多年了,在我的日常工作中,我使用的开源软件比我想记得的要多。 随着时间的推移,我已经破解了 Linux 内核以使其满足某些特定需求,调整了我购买的每台路由器和 NAS,耐心地在 Raspberry Pi 等待列表中等待了几个月,才拿到它,并获得了我自制的家庭电话。我喜欢。 尽管如此,这些调整和测试都没有进入我的 GitHub 以成为开源。 此外,除了修复 Tomcat 的第一个版本中的一个错误之外,我从未为开源项目做出过贡献。 很好奇,不是吗?
你可能认为这只是缺乏时间或兴趣,但我知道事实并非如此。 至于我的个人项目,我可能认为没有人会对我所做的事情真正感兴趣,但大多数情况下,只是将我的作品发表在那里,让每个人都可以看到并为子孙后代的想法让我很害怕。 虽然你总是可以从 GitHub 上删除一个个人项目,但在你尝试为一个广泛可用的开源项目做出贡献的那一天,没有回头路。 如果我的代码不够好怎么办? 如果我没有正确理解问题怎么办? 如果我的拉取请求被拒绝怎么办? 如果人们拖钓我怎么办?
与开发人员朋友(主要是女性)进行了一轮快速通话,很快就说服了我,我不是唯一一个遇到这个问题的人,但对于工程师来说,没有问题,只有解决方案,对吧?
这是一个需要解决的重要问题,因为为开源项目做出贡献可以产生巨大的影响:
- 在您的职业生涯中:许多客户在决定雇用您之前会查看您的社交一切; 您的 GitHub 帐户和您的 LinkedIn 简历以及您的 Facebook 和 Twitter 个人资料都位居榜首。 你应该明智地使用它们。
- 对于您的技术技能:检查由其他开发人员编写的代码库,通常是非常好的开发人员,可以教给您很多东西。 从写得不好的代码库中提取意义的能力同样会挑战并教会你很多东西。
- 对于您的软技能:开源软件是一个协作过程,几乎所有有趣的项目都是由团队构建的。 学习通过每个人都使用的工具与其他开发人员合作,融入团队,高效沟通,这将使您成为一名出色的开发人员,而不仅仅是一个熟练的开发人员。
- 对于社区:您为开源项目做出的每一点贡献都很重要。 您贡献的越多越好,但即使在翻译中修正一个小错字也会使最终产品更好。
- 对于您的网络:您可以向公司发送数百份简历,但没有什么比拥有具有个人关系的同事更有效的了。 积极参与开源项目将确保您结识人们并获得他们的尊重,并且您的声誉将会增长,这对于任何专业人士来说都是无价的。
这是我与这种恐惧作斗争的个人小旅程。 发表这篇文章是旅程本身的一部分。 我写这篇文章是希望任何被阻止写博客文章的人,或者害怕做出哪怕是很小的贡献的人,最终都会看到,它并没有那么可怕。 此外,它旨在帮助任何愿意为开源做出贡献但不知道从哪里开始的人,所以我将从基础开始。
什么是开源软件,我在哪里可以找到它?
开源软件,简称 OSS,是任何随其源代码一起发布的软件,并包含一个允许您对其进行修改和重新分发的许可证。 它可以在任何地方交付:在网站上、通过邮件列表或猫头鹰。 最常见的场景,也是我们感兴趣的场景,是代码库维护在协作存储库上。 在这里,我们专注于 GitHub,但还有其他选项,例如 SourceForge 和 Bitbucket。 GitHub 非常友好,拥有庞大的用户群,可以用于任何类型的代码,并且可以与您使用的任何开发环境配合使用。 重要的是,它也被广泛用于非开源项目。 您的下一个客户项目很可能会在那里托管,因此知道如何使用它本身就是一项有用的技能。
如果我不知道如何编码怎么办?
如果您正在阅读本文,您可能想学习如何编码。 您可以在几个免费和付费网站上找到精彩的课程。 你应该选择一种语言来学习; 如果您没有偏好,请使用 JavaScript。 您已经拥有了在 Web 浏览器上启动所需的一切,它是使用最广泛、最畅销的技能之一。 我个人最喜欢的是 Python,它同时用于 Web 开发和科学应用程序。 我也有个人最喜欢的初学者课程,Udacity 上的“计算机科学入门”。 我喜欢它,因为它是一门动手实践的课程,您可以边学习边做项目。 您还可以在 Coursera、可汗学院和 PluralSight 上找到其他几门课程。
如果我不知道 Git 怎么办?
如前所述,了解 Git 很重要,因此,参加 Git 课程。 即使你已经使用 Git 一段时间了,也要这样做; 在你真正研究它之前,你不会知道你对 Git 的了解有多少。 如果您不能自信地解释rebase命令的作用,请执行此操作。 即使错误的变基不会吓到你,也要这样做。 我在 Code School 上采用了完整的 Git 路径,但同样,您可以探索其他站点以获取更多选项。
如何在 GitHub 上选择项目?
您可能在日常开发中使用了一些 OSS。 选择一个熟悉的框架是一个很好的起点; 您已经熟悉这些功能以及框架的工作原理。 当你深入到源代码中,你会学到更多,你会更清楚地理解它的逻辑。 如果有您特别喜欢的技术或工具,请查找提及它的项目,或该工具的项目本身。 作为最后的手段,您可以查看 GitHub Showcases 上的项目,然后从选择您感兴趣的类别开始。
例如,在 GitHub 的搜索中快速搜索“Raspberry”会显示超过 17,000 个存储库。 很容易迷路,所以找一个有良好社区和良好问题跟踪的项目。 选择项目时,请检查以下数量:
- 贡献者:针对十个以上的贡献者。 这应该确保项目有足够的兴趣,而不仅仅是一个小团队的努力。 如果您是 OSS 新手,或者不太熟练,请将您的搜索限制在最多有 50 个贡献者的项目; 更大的社区意味着更大的代码库和更复杂的项目。
- 提交:选择至少有一千次提交的项目,并且最近的活动不超过一周。 一个已经闲置一个月或更长时间的项目在 OSS 术语中是陈旧和陈旧的,您可能不会很快得到任何响应。 日常活动是健康项目的标志。
- 问题:问题是未解决的问题、已报告的错误或要求实施的功能。 它们将为您提供一个起点,并且是衡量项目兴趣的良好指标。
另外,找出项目的主要语言是什么; 您可以在项目主页面的顶部栏中看到语言统计信息。 花一些时间阅读讨论的语气,看看评论是多么友好和有教养。 有些项目因其激进的社区而臭名昭著,因此它们可能不是正确的起点。

我选择了 ScyllaDB,一个列式数据存储项目,因为我对数据很着迷——任何与性能相关的东西。 我从未使用过它,但我希望能够深入研究它的代码库。 使用我知道的工具可能会更简单,但我将此视为挑战和学习新事物的机会。 其余的,它完全符合要求。 它有 18 个贡献者,6.5k 次提交(最近一次是在撰写本文时 23 小时前),178 个未解决的问题,并且看起来很活跃。
现在我该怎么做?
首先,克隆存储库并在您的机器上安装软件以了解其移动部件。 然后,开始阅读这些问题。 一旦你觉得准备好了,看看你是否可以在你的机器上重现这个问题,然后开始分析是什么让软件行为不端。
另一种方法是找到可以自己改进或修改的东西。 例如,您可能注意到错字或未对齐的字体。 我选择修复一个小错误,特别是脚本文档中使用的错误变量名。
它看起来很小,但是错误的文档比没有文档要糟糕得多。 用户将安装 ScyllaDB 并按照安装步骤进行操作,他们将盲目地依赖该脚本中编写的内容,最终会感到沮丧。 这对我的能力来说是完美的,修复它需要我遵循整个过程,并熟悉代码库。 错误修复很无聊,但它是找到进入项目的方式的一个很好的开始。
创建分叉
这可能是微不足道的,但目前,对于 ScyllaDB 项目,我是 Ms.Nobody; 让我在没有监督的情况下更改他们的代码是有风险的。 我需要做的是在我自己的 GitHub 帐户中创建一个“fork”。 这是我的 ScyllaDB 分支。 这是我自己的游乐场,我可以访问所有代码,并且可以根据需要修改文件。 如果我想创建自己的 ScyllaDB 版本并对其进行调整以完成与最初目的完全不同的事情,我可以在这里进行。 创建分叉很简单; 转到项目的主页并单击“fork”按钮。 一点都不可怕。
是时候修复错误了
现在,是时候在您的计算机上测试代码并进行必要的修改了。 首先,确保你已经在你的机器上安装了 Git 客户端。 然后,将您的 SSH 公钥添加到 GitHub,并确保它已由您的 ssh-agent 加载。 在本地获取代码很简单; 只需使用指向你的 fork 的git clone命令,而不是主分支:
git clone [email protected]:acbellini/scylla.git到目前为止,您应该已经在主分支上测试了项目,因此您将在本地构建代码并以相同的方式对其进行测试。 请记住,您必须分叉您的项目所依赖的任何其他 GitHub 项目,因为引用是相对的。 就我而言,我不得不分叉 seastar、scylla-ami 和 scylla-swagger-ui。
我需要修复的bug比较简单; conf/scylla.yaml中的文档提到了三个可配置的目录:一个用于数据文件,一个用于提交日志,一个显然未使用,用于缓存,所有这些都默认为$CASSANDRA_HOME的某个子目录:
深入研究代码,它表明默认值是不同的,正如我开始的问题 #372 中所述,不应使用$CASSANDRA_HOME 。 我通过使用几个不同的设置测试代码、从配置文件中删除设置并检查使用了哪些目录来验证我的假设。 一旦确信一切都是正确的,我可以添加、提交和推送修改后的文件:
git add conf/scylla.yaml git commit -m 'Correct default directories values in conf/scylla.yaml #372' git push请注意,我在提交消息中引入了问题编号,前面有一个哈希。 这将告诉 GitHub 自动将我的代码链接到问题本身。
另一个需要注意的重要事情是,当我查看代码时,我意识到第三个目录,即缓存的目录,实际上并没有使用。 很容易走得太远并删除此设置本身,或添加未使用的注释,但这将超出问题 #372 的范围,并且提交与此不严格相关的任何内容都是错误的问题。 您必须使您的更改集中并仅限于手头的任务。
至此,代码已修复,位于 GitHub 上,位于我的私人分支中。 这就是可怕的部分出现的地方:要求 ScyllaDB 人员接受我的代码。 这称为拉取请求。
最后一步:拉取请求
我喜欢直接从 GitHub 上的 Web 界面创建拉取请求。 我发现它比尝试从命令行执行它更直观和防错。 创建拉取请求所需要做的就是单击分支名称旁边的绿色小按钮:
请注意,评论是由 GitHub 自动计算的。 我的分支现在有一个新的提交,但是自从创建我的分叉后,主存储库中还有 14 个提交,所以我将单击左侧的绿色图标。
幸运的是,我的单个提交与其他 14 个提交没有冲突,所以 GitHub 通知我我很高兴。 我不需要添加任何其他评论或消息。 提交消息虽然很短,但说明了一切:我的代码更改做了什么以及它与什么相关。 当我单击最后一个按钮以确认我的请求时,我想知道几天前我发现如此可怕的是什么。 现在没有怪物在向我咆哮,地狱之火似乎也没有燃烧。 老实说,这并不可怕。 在不太可能的情况下,我弄错了,我的修复将不会被接受,就是这样。
如果您现在检查问题详细信息,您可以看到 GitHub 自动添加了一条注释,说明有一个拉取请求引用了此问题。 这就是提交消息中#372 的神奇之处。 这将有助于避免其他人浪费时间来修复已经修复的问题。
最后的笔记
现在我正在等待我的拉取请求被接受,当发生这种情况时我会收到通知。 请记住,这可能需要几天甚至几周的时间; 有人必须审查我的代码,测试它是否按描述工作,修复问题,并最终确保它不会对其余代码的功能产生不利影响(阅读:创建新错误)。 所有这些都需要一些人的时间,所以请耐心等待。 最后,当我的拉取请求被接受时,ScyllaDB 将多一个贡献者,少一个问题,我将有我的第一个 OSS 贡献。 现在,您也可以尝试一下。 毕竟,它一点也不可怕。
