Go 博客

贡献研讨会

Steve Francia, Cassandra Salisbury, Matt Broberg, and Dmitri Shuralyov
2017 年 8 月 9 日

活动概述

作者:Steve

在 GopherCon 的社区日期间,Go 团队举办了两次研讨会,我们与人们一起帮助他们首次为 Go 项目做出贡献。这是 Go 项目首次尝试这样的活动。我们有大约 140 名参与者和大约 35 名志愿者导师。导师们不仅因帮助他人而感到心情舒畅,还获得了一顶非常时尚的 Go 导师卡车帽。我们有来自北美、南美、非洲、欧洲、亚洲和澳大利亚的各个年龄段和经验水平的贡献者。这确实是 Gophers 在 GopherCon 汇聚的全球性努力。

我们举办研讨会的原因之一是希望它能作为一种强制手段,促使我们改进贡献者体验。为准备研讨会,我们重写了贡献者指南,包括增加了一个“故障排除”部分,并构建了一个名为 go-contrib-init 的工具,该工具自动化了设置开发环境以贡献 Go 的过程。

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

Brad Fitzpatrick 今年缺席了 GopherCon,但他已准备就绪,等待审查所有提交的 CL。他审查的速度如此之快,以至于许多人认为他是一个自动机器人。在内部,我们的团队称他为“BradBot”,主要是因为我们敬畏且有点嫉妒。

影响

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

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

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

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

有些人甚至通过带着他们想要修复的错误来到现场,让我们感到惊喜。Nikhita 准备好解决 issue #20786,并且她确实提交了 CL 48871,之后她发推说:

不仅取得了一些了不起的改进,更重要的是,我们缩小了 Go 核心团队与更广泛社区成员之间的差距。Go 团队的许多人都表示,社区成员教会了他们关于 Go 项目的一些东西。社区中的人们(亲自或在 Twitter 上)表示,他们感到欢迎参与该项目。

未来

本次活动取得了超出我们预期的成功。Go 团队经理 Sameer Ajmani 表示:“贡献者研讨会对 Go 团队来说非常有趣且富有教育意义。我们看到用户在使用我们的流程时遇到了困难,并在他们在仪表板上取得进展时欢呼。当小组分数达到 1000 时,全场的欢呼声非常棒。”

我们正在研究如何使本次研讨会更容易在未来的活动(如见面会和会议)中举办。我们最大的挑战是提供足够的指导,让用户感到受到支持。如果您有任何想法或想在此过程中提供帮助,请告知我

我已邀请几位活动参与者分享他们的体验,如下文所示。

我的贡献体验

作者:Cassandra

当我听说 go-contrib 研讨会时,我非常兴奋,然后感到非常畏惧。我被 Go 团队的一名成员鼓励参加,所以我想“有什么大不了的”。

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

Jess Frazelle 起身开始演示,并向大家提供了链接,方便大家跟随。

低语声从深沉的潜流变成了响亮的旋律,人们正在设置 Go 环境,他们跳到前面确保 GOPATH 设置正确,并且……等等,Gerrit 是什么?

我们大多数人都需要对 Gerrit 有一点介绍。我不知道它是什么,但幸运的是,有一张很有用的幻灯片。Jess 解释说,它是 GitHub 的一个替代品,具有更高级的代码审查工具。然后我们学习了 GitHub 和 Gerrit 的术语,以便更好地理解过程。

好的,现在是成为一名**该死的 Go 贡献者**的时候了。

为了让这次体验比已经很令人兴奋的更刺激,Go 团队设置了一个游戏,我们可以根据 Gerrit 的评分系统集体跟踪我们能获得多少分数。

看到自己的名字出现在记分板上,并听到大家的兴奋之情是令人陶醉的。它还唤起了一种团队合作感,带来了一种归属感,让我们觉得自己是 Go 社区真正的一份子。

在 6 个步骤中,房间里的约 80 人在不到一个小时的时间里学会了如何为 Go 做出贡献。这是一项壮举!

它不像我预期的那么难,对于完全的新手来说也并非超出范围。它以一种积极而有形的方式培养了社区感,同时也让我们感觉到被纳入了 Go 贡献的辉煌过程。

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

我的贡献体验

作者:Matt

我一直觉得编程语言很吓人。正是代码使世界能够编写代码。考虑到其影响力,肯定有比我更聪明的人在从事这项工作……但这种恐惧是需要克服的。因此,当有机会参加一个为我最喜欢的编程语言做出贡献的研讨会时,我很高兴能看到我能如何提供帮助。一个月后,我现在确信任何人(和每个人)都可以(也应该)为 Go 做贡献。

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

设置

鉴于 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)。

搞定!您已经准备就绪(可以出发)!但要为哪里做出贡献呢?

Contributing

在研讨会上,他们将我们引导到 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 说得对,这可能是第一个包含表情符号的贡献 ✌️。

真正地贡献

scratch 存储库很有趣,但是有很多方法可以深入 Go 的包并回馈。此时,我浏览了许多可用的包,看看有什么可用且对我来说很有趣。所谓“浏览”,我是指尝试找到一个包列表,然后查看源代码,看看 go/src/ 文件夹下有什么。

我决定看看我在 regexp 包中能做什么,也许是出于对 regex 的热爱和恐惧。在这里,我切换到了该包的网站视图(要知道,每个标准包都可以在 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

我一直很期待作为导师参加贡献者研讨会。我对这次活动寄予厚望,并在它开始之前就认为这是一个很棒的主意。

我第一次为 Go 做出贡献是在 2014 年 5 月 10 日。我记得从我想贡献的那一刻起,直到我实际发送我的第一个 CL,大约花了四个月时间。花了这么长时间才建立起勇气并全力投入去弄清楚这个过程。当时我是一名经验丰富的软件工程师。尽管如此,Go 的贡献过程仍然感觉很陌生——与我当时熟悉的所有其他过程都不同——因此似乎令人生畏。但是,它有很好的文档记录,所以我知道这只是找到时间,坐下来,然后去做的问题。“未知”因素阻止了我尝试。

几个月过去了,我想“受够了”,并决定将一个即将到来的周末的一整天都用于弄清楚这个过程。我把整个星期六都用于做一件事:将我的第一个 CL 发送到 Go。我打开了贡献指南,并从头开始遵循所有步骤。不到一个小时,我就完成了。我发出了我的第一个 CL。我既敬畏又震惊。敬畏是因为我终于为 Go 贡献了一份力量,而且它被接受了!震惊是因为,为什么我等了这么久才最终去做这件事?遵循贡献指南中的步骤非常简单,整个过程都进行得很顺利。如果有人告诉我,我会在一个小时内完成,而且一切都会顺利,我早就去做了!

这就引出了这次活动,以及为什么我认为它是一个好主意。对于任何曾经想为 Go 做出贡献,但又对不熟悉且看似冗长的过程感到畏惧(就像我那四个月那样)的人来说,这就是他们的机会!参加活动不仅可以轻松地投入其中,还可以获得 Go 团队和乐于助人的志愿者导师的帮助。

尽管我对活动已经抱有很高的期望,但我的期望还是得到了超额满足。首先,Go 团队准备得非常充分,并投入了大量精力使活动对每个人来说都更加愉快。有一个非常有趣的演示文稿,简要介绍了所有贡献步骤。为活动制作了一个仪表板,其中每个人的成功完成的步骤都将获得积分,计入全球总分。这使其成为一个非常协作和社交化的活动!最后,也是最重要的,后台有 Brad Fitzpatrick 这样的 Go 团队成员,他们及时帮助审查 CL!这意味着提交的 CL 得到了快速的审查,并有可行的后续步骤,以便每个人都能继续前进并学到更多。

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

总的来说,我监督了几位新的 Gophers 首次为 Go 做出贡献。他们发送了 CL,响应了审查反馈,进行了编辑,进行了迭代,直到每个人都满意,并最终看到了他们的第一个 Go 贡献被合并到 master!看到他们脸上的幸福感非常有回报,因为做出第一次贡献的喜悦是我自己也能体会到的。能够帮助他们,并解释他们有时遇到的棘手情况,这也很好。据我所知,许多快乐的 Gophers 离开了活动,包括我自己!

活动照片

照片由 Sameer Ajmani & Steve Francia 拍摄

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