| # Contribution Workshop | |
| 9 Aug 2017 | |
| Tags: community | |
| Summary: The Go contributor workshop trained new contributors at GopherCon. | |
| Steve Francia | |
| Cassandra Salisbury | |
| Matt Broberg | |
| Dmitri Shuralyov | |
| ## Event Overview | |
| by [Steve](https://twitter.com/spf13) | |
| 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, | |
| [gardening tasks](https://golang.org/wiki/Gardening), and other types | |
| of contributions. | |
| The most common type of contribution was an example function to be used in the | |
| documentation. The [Go User survey](https://blog.golang.org/survey2016-results) | |
| 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. | |
| [CL 49270](https://golang.org/cl/49270/) | |
| In addition to examples, many people contributed critical bug fixes including: | |
| - [CL 48988](https://golang.org/cl/48988/) fixing [issue #21029](https://golang.org/issue/21029) | |
| - [CL 49050](https://golang.org/cl/49050/) fixing [issue #20054](https://golang.org/issue/20054) | |
| - [CL 49031](https://golang.org/cl/49031/) fixing [issue #20166](https://golang.org/issue/20166) | |
| - [CL 49170](https://golang.org/cl/49170/) fixing [issue #20877](https://golang.org/issue/20877) | |
| Some people even surprised us by arriving with a bug in mind that they wanted | |
| to fix. Nikhita arrived ready to tackle | |
| [issue #20786](https://golang.org/issue/20786) | |
| and she did submitting | |
| [CL 48871](https://golang.org/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 [let me know](mailto:spf@golang.org). | |
| I've asked a few participants of the event to share their experiences below: | |
| ## My Contribution Experience | |
| by [Cassandra](https://twitter.com/cassandraoid) | |
| 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 | |
| [a link](https://docs.google.com/presentation/d/1ap2fycBSgoo-jCswhK9lqgCIFroE1pYpsXC1ffYBCq4/edit#slide=id.p) | |
| 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 [Matt](https://twitter.com/mbbroberg) | |
| I've always found programming languages to be intimidating. It's the code that | |
| enables the world to write code. Given the impact, surely smarter people than | |
| me should be working on it... but that fear was something to overcome. So when | |
| the opportunity to join a workshop to contribute to my new favorite programming | |
| language came up, I was excite to see how I could and 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. [Jess Frazzelle's guide](https://docs.google.com/presentation/d/1ap2fycBSgoo-jCswhK9lqgCIFroE1pYpsXC1ffYBCq4/edit#slide=id.g1f953ef7df_0_9) | |
| 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 handy dandy 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 `go/` folder we cloned above and see | |
| whether or not we're ready to contribute. But hold on if you're following along, | |
| you're not ready just 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 of `git commit` and `git push` respectively. | |
| Okay, installations are out of the way. Now setup your [Gerrit account here](https://go-review.googlesource.com/settings/#Profile), | |
| then [sign the CLA](https://go-review.googlesource.com/settings#Agreements) appropriate for | |
| you (I signed a personal one for all Google projects, but choose the right option for you. | |
| You can see all CLAs you've signed at [cla.developers.google.com/clas](https://cla.developers.google.com/clas)). | |
| AND BAM. You're good (to go)! But where to contribute? | |
| ### Contributing | |
| In the workshop, they 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 named after my GitHub account, did a `git add -u` | |
| then took `git change` for a spin. It has a hash that keeps track of your work, | |
| 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 notes to take at this point: `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 | |
| [personal Gerrit dashboard](https://go-review.googlesource.com/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 ✌️. | |
| .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 | |
| [website's view of the package](https://godoc.org/regexp) (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](https://twitter.com/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 [Kale Blakenship wrote this awesome post on testing in Go](https://medium.com/@vCabbage/go-testing-standard-library-changes-1e9cbed11339). | |
| Bookmark this one for later. | |
| You can see my completed [contribution here](https://go-review.googlesource.com/c/49130/). 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 at 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 [tagged for an upcoming release](https://github.com/golang/go/milestones), 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 [Dmitri](https://twitter.com/dmitshur) | |
| 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 [the Contribution Guide](https://golang.org/doc/contribute.html) | |
| 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 | |
| [the Contribution Guide](https://golang.org/doc/contribute.html) 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 |