Go 博客

贡献研讨会

Steve Francia、Cassandra Salisbury、Matt Broberg 和 Dmitri Shuralyov
2017 年 8 月 9 日

活动概述

by Steve

在 GopherCon 社区日,Go 团队举办了两个研讨会,我们与人们合作,帮助他们对 Go 项目做出首次贡献。这是 Go 项目首次尝试类似的事情。我们有大约 140 名参与者,大约 35 人自愿担任导师。导师不仅获得了帮助他人的温暖模糊的感觉,还获得了一顶非常时尚的 Go 导师卡车帽。我们有来自北美、南美、非洲、欧洲、亚洲和澳大利亚的各年龄段和经验水平的贡献者。这确实是全球范围内 Gopher 在 GopherCon 上齐聚一堂的努力。

我们举办研讨会的理由之一是,它可以作为一项强制性功能,让我们改进贡献者体验。在准备研讨会时,我们重写了贡献者指南,包括添加“故障排除”部分,并构建了一个工具 go-contrib-init,它自动化了设置开发环境以能够为 Go 做出贡献的过程。

对于研讨会本身,我们开发了一个演示文稿“贡献 Go”,以及一个在活动期间展示的仪表板/计分板。计分板旨在鼓励我们所有人共同努力,朝着看到我们的集体得分增加的目标前进。当参与者执行注册帐户、创建变更列表(也称为 CL,类似于拉取请求)、修改 CL 或提交 CL 等操作时,他们会在总得分中添加 1、2 或 3 分。

Brad Fitzpatrick 今年没有参加 GopherCon,但他已经准备好审查所有提交的 CL。他审查的速度非常快,以至于许多人认为他是一个自动机器人。在内部,我们的团队现在称他为“BradBot”,主要是因为我们对他敬畏,而且有点嫉妒。

影响

我们总共收到了 65 个来自参加研讨会的人员提交的 CL(在研讨会后一周内)。其中,44 个来自之前从未为 Go 项目中任何存储库做出过贡献的贡献者。其中一半(22 个)的贡献已合并。许多其他的正在等待代码库解冻,因为我们正处于即将发布的 1.9 版本的冻结期。除了 CL,许多人还以错误报告、园艺任务和其他类型的贡献的形式为项目做出了贡献。

最常见的贡献类型是用于文档的示例函数。Go 用户调查 发现我们的文档缺乏示例。在演示文稿中,我们要求用户找到他们喜欢的软件包并添加一个示例。在 Go 项目中,示例以 Go 文件中的代码形式编写(具有特定命名),go doc 工具会将它们与文档一起显示。这是一种完美的首次贡献,因为它是在冻结期间可以合并的内容,对我们的用户至关重要,并且它是一个范围相对狭窄的补充。

添加的示例之一是创建 Stringer,这是 Go 中最广泛使用的接口之一。 CL 49270

除了示例之外,许多人还贡献了关键的错误修复,包括

有些人甚至出乎意料地带着他们想修复的错误来参加活动。Nikhita 带着解决 问题 #20786 的准备而来,她确实提交了 CL 48871,之后她在推特上写道

不仅进行了一些重大的改进,但最重要的是,我们缩小了 Go 核心团队与更广泛的社区成员之间的差距。Go 团队的许多人都指出,社区成员正在向他们传授关于 Go 项目的知识。社区中的人们(无论是在现场还是在 Twitter 上)都表示,他们感到很乐意参与该项目。

未来

该活动的成功远远超出了我们的预期。Go 团队经理 Sameer Ajmani 表示:“贡献者研讨会对于 Go 团队来说非常有趣和具有教育意义。当用户遇到我们流程中的粗糙边缘时,我们感到畏缩,而当他们登上仪表板时,我们感到高兴。当小组得分达到 1000 分时,欢呼声真是太棒了。”

我们正在研究如何使这个研讨会更容易在未来的活动(如聚会和会议)中运行。我们最大的挑战是提供足够的指导,让用户感到受到支持。如果您有任何想法或想帮助我们完成此流程,请 告知我

我已经邀请了几位活动参与者在下面分享他们的体验

我的贡献体验

by Cassandra

当我听说 go-contrib 研讨会时,我非常兴奋,然后又非常害怕。Go 团队的一名成员鼓励我参加,所以我心想,管它呢。

当我走进房间(说真的,我跑进房间了,因为我迟到了)时,我很高兴看到房间里挤满了人。我环顾四周,寻找戴着 Gopher 帽的人,那是他们作为老师的主要标志。我坐在 16 张圆桌中的一张桌子旁,那里有两顶帽子和三个没有帽子的人。打开我的屏幕,准备开始…

Jess Frazelle 站了起来,开始了演示文稿,并为小组提供了 一个链接,以便于他们进行跟踪。

低声细语从一个深沉的暗流发展到一个响亮的声音旋律,人们正在用 Go 设置他们的计算机,他们跳过前面,确保他们的 GOPATH 已设置,并且正在… 等等,什么是 Gerrit?

我们中的大多数人不得不简单了解一下 Gerrit。我完全不知道它是什么,但幸运的是,有一张方便的幻灯片。Jess 解释说,它是 GitHub 的替代品,具有略微更高级的代码审查工具。然后我们一起学习了 GitHub 与 Gerrit 的术语,以便我们更好地理解流程。

好了,现在该成为一名真正的 Go 贡献者了。

为了让这件事变得更加令人兴奋,Go 团队设置了一个游戏,我们可以通过 Gerrit 评分系统跟踪作为一个团队可以获得多少积分。

看到你的名字出现在排行榜上,听到大家兴奋的声音,令人陶醉。它还引发了一种团队精神,让人感觉自己融入其中,感觉自己确实是 Go 社区的一部分。

在一个小时内,大约 80 人的房间能够通过 6 步学习如何为 Go 做出贡献。真是不可思议!

它并没有我预期的那样难,对于新手来说也并非遥不可及。它以一种积极和切实的方式培养了社区感,以及对 Go 贡献这一光荣过程的归属感。

我个人要感谢 Go 团队、戴着帽子的 Gopher 导师以及我的其他参与者,感谢他们让它成为我在 GopherCon 上最难忘的时刻之一。

我的贡献体验

by Matt

我一直觉得编程语言很吓人。它就是代码,使世界能够编写代码。考虑到它的影响力,肯定比我聪明的人应该在做这件事… 但这种恐惧是需要克服的。所以,当有机会参加一个研讨会,为我新喜欢的编程语言做出贡献时,我很兴奋地想知道我如何才能帮助大家。一个月后,我现在确信,任何人都可以(也应该)为 Go 做出贡献。

以下是我从 0 到对 Go 做出 2 次贡献的非常详细的步骤

设置

鉴于 Go 使用 Gerrit,我首先为它设置了环境。 Jess Frazzelle 的指南 是一个很好的起点,避免遗漏任何步骤。

当你克隆 Go 存储库时,真正的乐趣就开始了。具有讽刺意味的是,你不会在 $GOPATH 下对 Go 进行黑客攻击,所以我把它放在我的另一个工作区(即 ~/Develop)中。

cd $DEV # That's my source code folder outside of $GOPATH
git clone --depth 1 https://go.googlesource.com/go

然后安装方便的助手工具 go-contrib-init

go get -u golang.org/x/tools/cmd/go-contrib-init

现在,你可以从我们上面克隆的 go/ 文件夹中运行 go-contrib-init,看看你是否准备好做出贡献。但如果你正在按照我的步骤操作,请稍等,你还没有准备好。

接下来,安装 codereview,这样你就可以参与 Gerrit 代码审查

go get -u golang.org/x/review/git-codereview

此包包括 git changegit mail,它们将分别替换你通常的 git commitgit push 工作流程。

好了,安装已经完成了。现在设置你的 Gerrit 帐户,然后 签署适用于你的 CLA(我签署了适用于所有 Google 项目的个人 CLA,但请根据你的情况选择合适的选项。你可以在 cla.developers.google.com/clas 上查看你签署的所有 CLA)。

然后你就没问题了!但是在哪里贡献呢?

贡献

在研讨会上,他们让我们进入 scratch 存储库,这是一个安全的地方,方便我们练习工作流程

cd $(go env GOPATH)/src/golang.org/x
git clone --depth 1 [[https://go.googlesource.com/scratch][go.googlesource.com/scratch]]

第一步是 cd 进入并运行 go-contrib-init,确保你已准备好做出贡献

go-contrib-init
All good. Happy hacking!

从那里,我创建了一个以我的 GitHub 帐户命名的文件夹,执行了 git add -u,然后尝试了 git change。 它有一个哈希值来跟踪你的工作,这是你唯一不应该触碰的行。 除此之外,它感觉就像 git commit 一样。 一旦我的提交信息符合 package: description 的格式(描述以小写字母开头),我使用 git mail 将其发送到 Gerrit。

这里有两个需要注意的地方:git change 也像 git commit --amend 一样工作,所以如果你需要更新你的补丁,你可以 add 然后 change,它会全部链接到同一个补丁。 其次,你始终可以从你的 个人 Gerrit 仪表板 查看你的补丁。

经过几次来回,我终于对 Go 做出了贡献! 而且如果 Jaana 说得对,这可能是第一个包含表情符号的贡献 ✌️。

真正的贡献

这个临时仓库很有趣,但是有很多方法可以深入 Go 的包并回馈社区。 在这里,我开始浏览许多可用的包,看看哪些对我来说有趣。 当我说“浏览”时,我的意思是尝试查找包列表,然后转到我的源代码以查看 go/src/ 文件夹下有什么。

我决定看看我在 regexp 包中能做什么,也许是因为我对正则表达式又爱又怕。 这里我切换到了 网站对该包的视图(了解每个标准包都可以通过 https://godoc.org/$PACKAGENAME 找到)。 在里面,我注意到 QuoteMeta 缺少其他函数具有的相同级别的详细示例(而且我可以使用 Gerrit 进行练习)。

我开始查看 go/src/regexp,试图找到添加示例的位置,但我很快就迷路了。 幸运的是,Francesc 那天就在附近。 他指导我了解所有示例实际上是如何在 example_test.go 文件中的行内测试。 它们遵循测试用例的格式,然后是“Output”注释,最后是测试的答案。 例如

func ExampleRegexp_FindString() {
    re := regexp.MustCompile("fo.?")
    fmt.Printf("%q\n", re.FindString("seafood"))
    fmt.Printf("%q\n", re.FindString("meat"))
    // Output:
    // "foo"
    // ""
}

很酷,对吧? 我跟着 Francesc 的指导,添加了一个名为 ExampleQuoteMeta 的函数,并添加了一些我认为有帮助的函数。 从那里,它就是一个 git changegit mail 到 Gerrit 的过程!

我不得不承认,Steve Francia 向我挑战,要求我“找到一个不是公开问题并修复它”,所以我在我的补丁中包含了一些关于 QuoteMeta 的文档更改。 由于范围扩大,它将会开放更长时间,但我认为这对于这个补丁来说是值得的。

我已经可以听到你的问题了:我怎么验证它是否有效? 说实话,这并不容易。 运行 go test example_test.go -run QuoteMeta -v 不会起作用,因为我们在 $GOPATH 之外工作。 我一直努力解决这个问题,直到 Kale Blakenship 写了这篇关于 Go 中测试的精彩文章。 收藏起来以后再看。

你可以在这里看到我的完成的 贡献。 我也希望你能看到参与贡献的流程是多么简单。 如果你像我一样,你会擅长在文档中找到一个小错误或缺少的示例,从而开始熟悉 git codereview 工作流程。 之后,你就可以找到一个开放的问题,最好是 标记为即将发布版本 的问题,并尝试一下。 无论你选择做什么,都要去做。 Go 团队向我证明了他们对帮助我们所有人回馈社区的重视程度。 我迫不及待地等待着我的下一个 git mail

我的导师经历

作者:Dmitri

我一直期待作为导师参加贡献研讨会活动。 我对这次活动抱有很高的期望,并且在它开始之前就认为这是一个好主意。

我在 2014 年 5 月 10 日对 Go 做出了我的第一个贡献。 我记得从我想要贡献的那一刻起,直到那一天,我实际上发送了我的第一个 CL,已经过去了大约四个月。 花了那么长时间才鼓起勇气并完全致力于弄清楚这个过程。 那时候我是一名经验丰富的软件工程师。 尽管如此,Go 的贡献过程让我觉得陌生——与我熟悉的所有其他过程都不一样——因此似乎很吓人。 虽然它有很好的文档记录,但我知道这只是一个时间问题,只要找个时间坐下来做就行了。 “未知”因素一直阻止我尝试。

过了几个月后,我心想“够了”,决定在即将到来的周末的某一天,专门花一整天时间来弄清楚这个过程。 我把整个星期六都留出来做一件事:向 Go 发送我的第一个 CL。 我打开了 贡献指南,并开始按照所有步骤一步步进行。 一个小时后,我就完成了。 我发送了我的第一个 CL。 我既敬畏又震惊。 敬畏,因为我终于向 Go 做出了贡献,而且它被接受了! 震惊,因为我为什么要等那么久才开始做这件事? 按照 贡献指南 中的步骤非常容易,整个过程非常顺利。 如果有人告诉我我只需要一个小时就能完成,而且不会出错,我早就开始做了!

这让我想到这个活动,以及为什么我认为它是一个好主意。 对于那些曾经想要为 Go 做贡献,但被陌生的、看似漫长的过程所吓倒的人(就像我在那四个月里一样),这是一个机会! 不仅可以通过参加活动来轻松地做出承诺,而且 Go 团队和乐于助人的志愿者导师也会在那里帮助你一路走来。

尽管我对这次活动已经抱有很高的期望,但我的期望还是超出了预期。 首先,Go 团队已经做好了充分的准备,并投入了大量资金来让这次活动对每个人来说更加愉快。 有一个非常有趣的演示,快速概述了所有贡献步骤。 为了这次活动,他们创建了一个仪表板,每个成功完成的步骤都会获得积分,从而获得全球排名。 这让它成为一个非常合作和社交的活动! 最后,也是最重要的,他们就像 Brad Fitzpatrick 这样的 Go 团队成员,在幕后帮助快速审核 CL! 这意味着提交的 CL 可以快速获得审核,并提供可操作的下一步措施,因此每个人都可以继续前进并学到更多。

我最初预计这次活动会有些沉闷,因为贡献步骤非常容易遵循。 然而,我发现情况并非总是如此,我能够利用自己在 Go 方面的专业知识来帮助那些在各种意想不到的地方卡住的人。 事实证明,现实世界充满了边缘情况。 例如,有个人有两个 git 邮箱,一个是个人邮箱,另一个是工作邮箱。 使用工作邮箱签署 CLA 时出现延迟,因此他们尝试使用个人邮箱。 这意味着每个提交都必须进行修改,以便使用正确的邮箱,而工具却没有考虑到这一点。(幸运的是,贡献指南的故障排除部分涵盖了这个问题!) 有些人遇到了其他细微的错误或环境配置错误,因为拥有多个 Go 安装程序有点不寻常。 有时候,必须明确设置 GOROOT 环境变量,以临时的方式,才能使 godoc 显示标准库中的更改(我一边说这些话,一边偷偷地向后看看,确认 Dave Cheney 不在附近)。

总的来说,我见证了一些新 gopher 做出了他们的第一个 Go 贡献。 他们发送了 CL,回复了审核反馈,进行了编辑,反复修改,直到所有人都满意,最终看到了他们的第一个 Go 贡献被合并到主分支! 看到他们脸上洋溢着幸福的表情,我感到非常欣慰,因为做出第一个贡献的喜悦是我自己可以理解的。 能够帮助他们并解释他们有时遇到的棘手情况,也是一件很棒的事情。 从我所了解的情况来看,包括我在内,许多快乐的 gopher 从这次活动中受益!

活动照片

照片由 Sameer Ajmani 和 Steve Francia 拍摄

下一篇文章:Go 1.9 发布
上一篇文章:贡献者峰会
博客索引