Go 博客
贡献者工坊
活动概览¶
作者: Steve
在 GopherCon 的社区日期间,Go 团队举办了两次工坊,与大家一起工作,帮助他们向 Go 项目提交首次贡献。这是 Go 项目首次尝试此类活动。我们有大约 140 名参与者和大约 35 名志愿者担任导师。导师不仅因帮助他人而感到温暖和欣慰,还获得了一顶非常时尚的 Go 导师卡车帽。我们有来自北美和南美、非洲、欧洲、亚洲和澳大利亚的各个年龄段和经验水平的贡献者。这确实是世界各地的 Gophers 在 GopherCon 齐聚一堂的全球性努力。
举办此次工坊的原因之一是希望它成为一种推动力,促使我们改进贡献者体验。为了准备工坊,我们重写了贡献者指南,包括增加了“故障排除”部分,并构建了一个工具 go-contrib-init
,该工具自动化了设置能够为 Go 贡献的开发环境的过程。
对于工坊本身,我们开发了一个演示文稿 “Contributing to Go”,以及一个在活动期间展示的仪表板/记分板。记分板旨在鼓励大家共同努力,朝着提高集体得分的共同目标前进。参与者在执行注册账户、创建变更列表(也称为 CL,类似于 pull request)、修改 CL 或提交 CL 等操作时,会为总得分增加 1、2 或 3 分。

Brad Fitzpatrick 今年没有参加 GopherCon,但他随时准备并等待审查所有提交的 CL。他审查得如此之快,以至于许多人认为他是一个自动化机器人。在我们团队内部,现在都称他为“BradBot”,主要是因为我们既敬畏又有点嫉妒。


影响¶
参加工坊的人员总共提交了 65 个 CL(在工坊结束一周内)。其中,有 44 个来自此前从未对 Go 项目中任何仓库贡献过的贡献者。这些贡献中有一半(22 个)已经合并。许多其他的正在等待代码库解冻,因为我们正处于即将发布的 1.9 版本的冻结期。除了 CL 外,许多人还通过 bug 报告、代码维护任务 以及其他类型的贡献为项目做出了贡献。
最常见的贡献类型是用于文档中的示例函数。Go 用户调查发现我们的文档显著缺乏示例。在演示中,我们要求用户找到他们喜欢的包并添加示例。在 Go 项目中,示例以 Go 文件中的代码形式编写(具有特定的命名),并且 go doc
工具会将它们与文档一起显示。这是一个完美的首次贡献,因为它可以在冻结期间合并,对我们的用户至关重要,而且它的范围相对较窄。
添加的示例之一是关于创建 Stringer,它是 Go 中更广泛使用的接口之一。CL 49270
除了示例之外,许多人还贡献了关键的 bug 修复,包括
有些人甚至让我们感到惊讶,他们是带着想要修复的 bug 来的。Nikhita 到场时已经准备好解决 issue #20786,她确实提交了 CL 48871,之后她在 Twitter 上发文说

不仅做出了一些重大的改进,更重要的是,我们缩小了核心 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 导师以及我的各位伙伴,是他们让这成为了我在 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 change
和 git mail
,它们将分别取代你通常的 git commit
和 git 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 说得没错,这可能是第一个包含 emoji 的贡献 ✌️。


真正开始贡献¶
练习仓库很有趣,但这只是小试牛刀,有很多深入 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 change
和 git mail
发送给 Gerrit!
我必须说,Steve Francia 挑战我“找一个不是公开 issue 的问题并修复它”,所以我将一些 QuoteMeta
的文档修改包含在了我的补丁中。考虑到范围扩大,这个补丁会开放更长时间,但我认为这很值得。
我仿佛已经听到你的问题了:我怎么验证它是否有效?老实说,这并不容易。运行 go test example_test.go -run QuoteMeta -v
是行不通的,因为我们在 $GOPATH 之外工作。我一直努力摸索,直到 Kale Blakenship 写了一篇关于 Go 中测试的精彩文章 才搞明白。请把这篇文章收藏起来,以后会用到。
你可以在这里看到我的完整贡献。我还希望你看到的是,进入贡献流程是多么简单。如果你像我一样,你可能会擅长在文档中找到小的拼写错误或缺失的示例,以此来熟悉 git codereview
工作流程。之后,你就可以着手解决一个公开的 issue,最好是标记为即将发布版本的 issue,然后尝试解决它。无论你选择做什么,一定要去尝试。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 贡献被合并到了 master 分支!看到他们脸上的快乐,真是非常有成就感,因为做出第一个贡献的喜悦是我自己也能感同身受的。能够帮助他们,解释他们有时遇到的棘手情况,也非常棒。据我所知,许多开心的 gopher 离开了活动现场,包括我自己!
活动照片¶








摄影:Sameer Ajmani & Steve Francia
下一篇文章:Go 1.9 已发布
上一篇文章:贡献者峰会
博客索引