Contribution Workshop
9 Aug 2017
Tags: community

Steve Francia, Cassandra Salisbury, Matt Broberg, Dmitri Shuralyov

* Contribution Workshop

** Event Overview

by [[https://twitter.com/spf13][Steve]]

During the community day at GopherCon, the Go team held two workshops
where we worked with people to help them make their first contribution to the
Go project. This was the first time the Go project has ever attempted anything
like this. We had about 140 participants and about 35 people who volunteered as
mentors. Mentors not only received warm fuzzy feelings for helping others, but
also a very stylish Go Mentor trucker hat. We had contributors of all
ages and experience levels coming from North and South America, Africa, Europe,
Asia, and Australia. It was truly a worldwide effort of Gophers coming together
at GopherCon.

One of our reasons for running the workshop was for it to act as a forcing
function to make us improve our contributor experience. In preparation for the
workshop, we rewrote our contributor guide, including adding a "troubleshooting"
section and built a tool `go-contrib-init`, which automated the process of
setting up a development environment to be able to contribute to Go.

For the workshop itself, we developed a presentation _"Contributing_to_Go,"_
and a dashboard / scoreboard that was presented during the event. The
scoreboard was designed to encourage us all to work together towards a common
goal of seeing our collective score increase. Participants added 1, 2 or 3 points to
the total score when they performed actions like registering an account, making
a change list (also known as a CL, similar to a pull request),
amending a CL, or submitting a CL.

.image contributor-workshop/image17.png

Brad Fitzpatrick, who stayed home from GopherCon this year, was ready and
waiting to review all CLs submitted. He was so quick to review that many people
thought he was an automated bot. Internally our team is now calling him
"BradBot" mostly because we are in awe and a bit jealous.

.image contributor-workshop/image9.jpg
.image contributor-workshop/image6.png

*** Impact

We had a total of 65 CLs submitted from the people who participated in the
workshop (within a week of the workshop). Of these, 44 were from contributors
who had never previously contributed to any of the repos in the Go project.
Half (22) of these contributions were already merged. Many of the others are
waiting on the codebase to thaw as we are in the middle of a freeze for the
upcoming 1.9 release. In addition to CLs, many contributed to the project in
the form of bug reports,
[[https://golang.org/wiki/Gardening][gardening tasks]], and other types
of contributions.

The most common type of contribution was an example function to be used in the
documentation. The [[https://blog.golang.org/survey2016-results][Go User survey]]
identified that our documentation was significantly lacking examples. In the
presentation, we asked users to find a package they loved and to add an example. In
the Go project, examples are written as code in Go files
(with specific naming) and the `go`doc` tool displays them along side the documentation.
This is a perfect first contribution as it's something that can be merged
during a freeze, it's of critical importance to our users, and it's an addition
that has a relatively narrow scope.

One of the examples added is that of creating a Stringer, one of the more
widely used interfaces in Go.
[[https://golang.org/cl/49270/][CL 49270]]

In addition to examples, many people contributed critical bug fixes including:

- [[https://golang.org/cl/48988/][CL 48988]] fixing [[https://golang.org/issue/21029][issue #21029]]
- [[https://golang.org/cl/49050/][CL 49050]] fixing [[https://golang.org/issue/20054][issue #20054]]
- [[https://golang.org/cl/49031/][CL 49031]] fixing [[https://golang.org/issue/20166][issue #20166]]
- [[https://golang.org/cl/49170/][CL 49170]] fixing [[https://golang.org/issue/20877][issue #20877]]

Some people even surprised us by arriving with a bug in mind that they wanted
to fix. Nikhita arrived ready to tackle
[[https://golang.org/issue/20786][issue #20786]]
and she did submitting
[[https://golang.org/cl/48871/][CL 48871]],
after which she tweeted:

.image contributor-workshop/image19.png

Not only were some great improvements made, but most importantly, we narrowed
the gap between the core Go team and the broader community members. Many people
on the Go team remarked that the community members were teaching them things
about the Go project. People in the community (in person, and on Twitter)
remarked that felt welcome to participate in the project.

.image contributor-workshop/image12.png
.image contributor-workshop/image13.png
.image contributor-workshop/image3.png

*** Future

The event was successful well beyond our expectations. Sameer Ajmani, Go team
manager said, "The contributor workshop was incredibly fun and educational–for
the Go team.  We cringed as users hit the rough edges in our process, and
celebrated when they got up on the dashboard. The cheer when the group score
hit 1000 was awesome."

We are looking into ways to make this workshop easier to run for future events
(like meetups and conferences). Our biggest challenge is providing enough
mentorship so that users feel supported. If you have any ideas or would like to
help with this process please [[mailto:spf@golang.org][let me know]].

I've asked a few participants of the event to share their experiences below:

** My Contribution Experience

by [[https://twitter.com/cassandraoid][Cassandra]]

When I heard about the go-contrib workshop I was very excited and then I was
extremely intimidated. I was encouraged by a member of the Go team to
participate, so I thought what the heck.

As I walked into the room (let's be real, I ran into the room because I was
running late) I was pleased to see the room was jam-packed. I looked around for
people in Gopher caps, which was the main indicator they were teachers. I sat
down at one of the 16 round tables that had two hats and three non-hats.
Brought up my screen and was ready to roll…

Jess Frazelle stood up and started the presentation and provided the group with
[[https://docs.google.com/presentation/d/1ap2fycBSgoo-jCswhK9lqgCIFroE1pYpsXC1ffYBCq4/edit#slide=id.p][a link]]
to make it easy to follow.

.image contributor-workshop/image16.png

The murmurs grew from a deep undercurrent to a resounding melody of voices,
people were getting their computers set up with Go, they were skipping ahead to
make sure their GOPATH was set, and were… wait what's Gerrit?

Most of us had to get a little intro to Gerrit. I had no clue what it was, but
luckily there was a handy slide. Jess explained that it was an alternative to
GitHub with slightly more advanced code review tools. We then went through
GitHub vs Geritt terminology, so we had better understanding of the process.

.image contributor-workshop/image10.png

Ok, now it was time to become a **freaking** *Go* **contributor**.

To make this more exciting than it already is, the Go team set up a game where
we could track as a group how many points we could rack up based on the Gerrit
score system.

.image contributor-workshop/image7.png

Seeing your name pop up on the board and listening to everyone's excitement was
intoxicating. It also invoked a sense of teamwork that lead to a feeling of
inclusion and feeling like you were truly a part of the Go community.

.image contributor-workshop/image11.png

In 6 steps a room of around 80 people were able to learn how to contribute to
go within an hour. That's a feat!

It wasn't nearly as difficult as I anticipated and it wasn't out of scope for a
total newbie. It fostered a sense of community in an active and tangible way as
well as a sense of inclusion in the illustrious process of Go contributions.

I'd personally like to thank the Go Team, the Gopher mentors in hats, and my
fellow participants for making it one of my most memorable moments at
GopherCon.

** My Contribution Experience

by [[https://twitter.com/mjbrender][Matt]]

I've always found programming languages to be intimidating. It's the code that
enables me to write code. Surely smarter people than me should be working on
it. It feels too distant to touch and too significant for me to edit. So when
the opportunity to join a workshop to contribute to my new favorite programming
language came up, I was as excited to see how I could help. A month later, I'm
now certain that anyone and everyone can (and should) contribute back to Go.

Here are my very verbose steps to go from 0 to 2 contributions to Go:

*** The Setup

Given Go's use of Gerrit, I started by setting up my environment for it. [[https://docs.google.com/presentation/d/1ap2fycBSgoo-jCswhK9lqgCIFroE1pYpsXC1ffYBCq4/edit#slide=id.g1f953ef7df_0_9][Jess Frazzelle's guide]]
is a great place to start to not miss a step.

The real fun starts when you clone the Go repo. Ironically, you don't hack on
Go under `$GOPATH`, so I put it in my other workspace (which is ~/Develop).

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

Then install the helper tool, `go-contrib-init`:

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

Now you can run `go-contrib-init` from the folder we cloned above and see
whether or not we're ready to contribute. If you're following along you're
definitely not ready yet.

Next, install codereview so you can participate in a Gerrit code review:

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

This package includes `git change` and `git mail` which will replace your
normal workflow for `git commit` and `git push` respectively.

Okay, installations are out of the way. Now setup your [[https://go-review.googlesource.com/settings/#Profile][Gerrit account here]],
then [[https://go-review.googlesource.com/settings#Agreements][sign the CLA]] appropriate for
you (more on choosing a CLA here. For me it was a personal one for all Google
projects. You can see all CLAs you've signed at
[[https://cla.developers.google.com/clas][cla.developers.google.com/clas]]).

AND BAM. You're good (to go)! But where to contribute?

*** Contributing

In workshop sent us into the `scratch` repository, which is a safe place to
fool around in order to master the workflow:

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

First stop is to `cd` in and run `go-contrib-init` to make sure you're ready to contribute:

    go-contrib-init
    All good. Happy hacking!

From there, I made a folder, did a `git add -u` then took `git change` for a
spin. It has what the Go team call the "magic hash", which is the one line you
shouldn't touch. Other than that, it feels just like `git commit`. Once I got
the commit message matching the format of `package: description` (description
begins with a lowercase), I used `git mail` to send it over to Gerrit.

Two good to know things: `git change` also works like `git commit --amend`, so
if you need to update your patch you can `add` then `change` and it will all
link to the same patch. Secondly, you can always review your patch from your
[[https://go-review.googlesource.com/dashboard/][personal Gerrit dashboard]].

After a few back and forths, I officially had a contribute to Go! And if Jaana
is right, it might be the first with emojis :+1:.

.image contributor-workshop/image15.png
.image contributor-workshop/image23.png

*** Contributing, For Real

The scratch repo is fun and all, but there's a ton of ways to get into the
depths of Go's packages and give back. It's at this point where I cruised
around the many packages available to see what was available and interesting to
me. And by "cruised around" I mean attempted to find a list of packages, then
went to my source code to see what's around under the `go/src/` folder:

.image contributor-workshop/image22.png

I decided to see what I can do in the `regexp` package, maybe out of love and
fear of regex. Here's where I switched to the
[[https://godoc.org/regexp][website's view of the package]] (it's good to know
that each standard package can be found at https://godoc.org/$PACKAGENAME). In
there I noticed that QuoteMeta was missing the same level of detailed examples
other functions have (and I could use the practice using Gerrit).

.image contributor-workshop/image1.png

I started looking at `go/src/regexp` to try to find where to add examples and I
got lost pretty quickly. Lucky for me, Francesc was around that day. He walked
me through how all examples are actually in-line tests in a `example_test.go
file. They follow the format of test cases followed by "Output" commented out
and then the answers to the tests. For example:

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

Kind of cool, right?? I followed Francesc's lead and added a function
`ExampleQuoteMeta` and added a few I thought would be helpful. From there it's
a `git change` and `git mail` to Gerrit!

I have to say that Steve Francia challenged me to "find something that isn't an
open issue and fix it," so I included some documentation changes for QuoteMeta
in my patch. It's going to be open for a bit longer given the additional scope,
but I think it's worth it on this one.

I can hear your question already: how did I verify it worked? Well it wasn't
easy to be honest. Running `go test example_test.go -run QuoteMeta -v` won't do
it since we're working outside of our $GOPATH. I struggled to figure it out
until [[https://medium.com/@vCabbage/go-testing-standard-library-changes-1e9cbed11339][Kale Blakenship wrote this awesome post on testing in Go]].
Bookmark this one for later.

You can see my completed [[https://go-review.googlesource.com/c/49130/][contribution here]]. What I also hope you see is
how simple it is to get into the flow of contributing. If you're like me,
you'll be good finding a small typo or missing example in the docs to start to
get used to the `git codereview` workflow. After that, you'll be ready to find
an open issue, ideally one [[https://github.com/golang/go/milestones][tagged for an upcoming release]], and give it a go. No matter
what you choose to do, definitely go forth and do it. The Go team proved to me
just how much they care about helping us all contribute back. I can't wait for
my next `git mail`.

** My Mentorship Experience

by [[https://twitter.com/shurcooL][Dmitri]]

I was looking forward to participating in the Contribution Workshop event as a
mentor. I had high expectations for the event, and thought it was a great idea
before it started.

I made my first contribution to Go on May 10th, 2014. I remember it was about
four months from the moment I wanted to contribute, until that day, when I
actually sent my first CL. It took that long to build up the courage and fully
commit to figuring out the process. I was an experienced software engineer at
the time. Despite that, the Go contribution process felt alien—being unlike all
other processes I was already familiar with—and therefore seemed intimidating.
It was well documented though, so I knew it would be just a matter of finding
the time, sitting down, and doing it. The "unknown" factor kept me from giving
it a shot.

After a few months passed, I thought "enough is enough," and decided to
dedicate an entire day of an upcoming weekend to figuring out the process. I
set aside all of Saturday for doing one thing: sending my first CL to Go. I
opened up [[https://golang.org/doc/contribute.html][the Contribution Guide]]
and started following all the steps, from the very top. Within an hour, I was
done. I had send my first CL. I was both in awe and shock. In awe, because I
had finally sent a contribution to Go, and it was accepted! In shock, because,
why did I wait so long to finally do this? Following the steps in
[[https://golang.org/doc/contribute.html][the Contribution Guide]] was very
easy, and the entire process went completely smoothly. If only someone had told
me that I'd be done within an hour and nothing would go wrong, I would've done
it much sooner!

Which brings me to this event and why I thought it was such a good idea. For
anyone who ever wanted to contribute to Go, but felt daunted by the unfamiliar
and seemingly lengthy process (like I was during those four months), this was
their chance! Not only is it easy to commit to figuring it out by attending the
event, but also the Go team and helpful volunteer mentors would be there to
help you along the way.

Despite the already high expectations I had for the event, my expectations were
exceeded. For one, the Go team had prepared really well and invested a lot in
making the event that much more enjoyable for everyone. There was a very fun
presentation that went over all the contributing steps quickly. There was a
dashboard made for the event, where everyone's successfully completed steps
were rewarded with points towards a global score. That made it into a very
collaborative and social event! Finally, and most importantly, they were Go
team members like Brad Fitzpatrick behind the scenes, helping review CLs
promptly! That meant the CLs that were submitted received reviews quickly, with
actionable next steps, so everyone could move forward and learn more.

I originally anticipated the event to be somewhat dull, in that the
contribution steps are extremely simple to follow. However, I found that wasn't
always the case, and I was able to use my expertise in Go to help out people
who got stuck in various unexpected places. It turns out, the real world is
filled with edge cases. For instance, someone had two git emails, one personal
and another for work. There was a delay with signing the CLA for the work
email, so they tried to use their personal email instead. That meant each
commit had to be amended to use the right email, something the tools didn't
take into account. (Luckily, there is a troubleshooting section in the
contribution guide covering this exact issue!) There were other subtle mistakes
or environment misconfiguration that some people ran into, because having more
than one Go installation was a bit unusual. Sometimes, the GOROOT environment
variable had to be explicitly set, temporarily, to get godoc to show changes in
the right standard library (I was tongue-in-cheek looking over my shoulder to
check for Dave Cheney as I uttered those words).

Overall, I oversaw a few new gophers make their first Go contributions. They
sent the CLs, responded to review feedback, made edits, iterated until everyone
was happy, and eventually saw their first Go contributions get merged to
master! It was very rewarding to see the happiness on their faces, because the
joy of making one's first contribution is something I can relate to myself. It
was also great to be able to help them out, and explain tricky situations that
they sometimes found themselves. From what I can tell, many happy gophers
walked away from the event, myself included!

** Photos from the event

.image contributor-workshop/image2.jpg
.image contributor-workshop/image4.jpg
.image contributor-workshop/image5.jpg
.image contributor-workshop/image8.jpg
.image contributor-workshop/image14.jpg
.image contributor-workshop/image18.jpg
.image contributor-workshop/image20.jpg
.image contributor-workshop/image21.jpg

Photos by Sameer Ajmani & Steve Francia
