Goブログ

貢献ワークショップ

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

イベント概要

by Steve

GopherConのコミュニティデーの間、Goチームは2つのワークショップを開催し、参加者と一緒にGoプロジェクトへの最初の貢献を支援しました。これは、Goプロジェクトがこれまでに試みたことのない初めての試みでした。約140人の参加者と約35人のボランティアメンターがいました。メンターは、他人を助けることで温かい気持ちになっただけでなく、非常にスタイリッシュなGoメンターのトラッカーハットも受け取りました。北米、南米、アフリカ、ヨーロッパ、アジア、オーストラリアから、あらゆる年齢と経験レベルの貢献者が参加しました。それはまさに、GopherConで集まったGophersの世界的な努力でした。

ワークショップを実施した理由の1つは、貢献者エクスペリエンスの改善を強制するための機能として機能させることでした。「トラブルシューティング」セクションを追加することなど、貢献者ガイドを書き直し、Goへの貢献を可能にする開発環境のセットアッププロセスを自動化するツール`go-contrib-init`を構築しました。

ワークショップ自体では、「Goへの貢献」というプレゼンテーションと、イベント中に提示されたダッシュボード/スコアボードを開発しました。スコアボードは、全員が共同で目標を達成し、集団スコアを増加させることを促すように設計されました。参加者は、アカウントの登録、変更リスト(プルリクエストに似たCLとも呼ばれる)の作成、CLの修正、またはCLの送信などのアクションを実行すると、合計スコアに1、2、または3ポイントを追加しました。

今年はGopherConを欠席したBrad Fitzpatrickは、提出されたすべてのCLのレビューを待機していました。彼は非常に迅速にレビューを行ったため、多くの人が彼を自動化されたボットだと思っていました。内部的には、私たちのチームは、主に私たちが畏敬の念を抱き、少し嫉妬しているため、彼を「BradBot」と呼んでいます。

影響

ワークショップに参加した人々から、ワークショップから1週間以内に合計65個のCLが提出されました。これらのうち、44個は、Goプロジェクトのリポジトリに以前は貢献したことのない貢献者からのものでした。これらの貢献の半分(22個)は既にマージされています。他の多くは、今後の1.9リリースのためにフリーズ中であるため、コードベースの解凍を待っています。CLに加えて、多くの人がバグレポート、ガーデニングタスク、その他の種類の貢献という形でプロジェクトに貢献しました。

最も一般的な貢献の種類は、ドキュメントで使用されるサンプル関数でした。Goユーザー調査では、ドキュメントにサンプルが大幅に不足していることが明らかになりました。プレゼンテーションでは、ユーザーに好きなパッケージを見つけて例を追加するように求めました。Goプロジェクトでは、例はGoファイル(特定の名前付け)にコードとして記述され、`go doc`ツールはドキュメントと一緒に表示します。これは、フリーズ中にマージできるもの、ユーザーにとって非常に重要なもの、範囲が比較的狭い追加であるため、完璧な最初の貢献です。

追加された例の1つは、Goで最も広く使用されているインターフェースの1つであるStringerの作成です。CL 49270

例に加えて、多くの人が重要なバグ修正に貢献しました。

修正したいバグを念頭に置いて参加した人もいました。Nikhitaはissue #20786に取り組む準備ができており、CL 48871を提出した後、次のようにツイートしました。

素晴らしい改善がいくつか行われただけでなく、最も重要なことに、Goコアチームと広範なコミュニティメンバーとの間のギャップを狭めました。Goチームの多くの人は、コミュニティメンバーがGoプロジェクトについて彼らに物事を教えていると述べていました。コミュニティの人々(直接、そしてTwitterで)は、プロジェクトに参加することを歓迎されたと感じたと述べていました。

将来

イベントは期待をはるかに超える成功を収めました。GoチームマネージャーのSameer Ajmaniは、「貢献者ワークショップはGoチームにとって非常に楽しく教育的なものでした。ユーザーがプロセスの粗い部分に遭遇したときは身構え、ダッシュボードに表示されたときは祝福しました。グループスコアが1000に達したときの歓声は素晴らしかったです。」と述べています。

将来のイベント(ミートアップやカンファレンスなど)でこのワークショップの実施を容易にする方法を検討しています。最大の課題は、ユーザーがサポートされていると感じられるように十分なメンターシップを提供することです。このプロセスについてご意見やご協力いただける方は、ご連絡ください

イベントの参加者数名に、彼らの経験を以下に共有するように依頼しました。

私の貢献経験

by Cassandra

go-contribワークショップについて聞いたとき、私は非常に興奮し、その後非常に怖くなりました。Goチームのメンバーから参加を勧められたので、「まあ、いいか」と思いました。

部屋に入ると(正直に言うと、遅刻していたので部屋に飛び込んだ)、部屋がぎっしり詰まっているのを見て安心しました。Gopherキャップをかぶっている人を探しました。それは彼らが教師であることの主な指標でした。16個ある丸テーブルの1つに座り、2つの帽子と3つの帽子をかぶっていない人がいました。画面を表示して、準備万端でした…

Jess Frazelleが立ち上がり、プレゼンテーションを開始し、グループにリンクを提供して、フォローしやすくしました。

ざわめきは深い暗流から響き渡るメロディーへと成長し、人々はコンピューターをGoでセットアップし、先に進んでGOPATHが設定されていることを確認し、…待って、Gerritって?

私たちのほとんどは、Gerritについて少し紹介する必要がありました。私はそれが何であるか全く知らなかったのですが、幸いなことに便利なスライドがありました。Jessは、それがGitHubの代替物であり、少し高度なコードレビューツールがあると説明しました。その後、GitHubとGerritの用語を比較して、プロセスの理解を深めました。

さて、Goへの貢献者になる時が来ました。

さらにエキサイティングにするために、Goチームはゲームを設定しました。Gerritのスコアシステムに基づいて、グループで獲得できるポイント数を追跡できます。

自分の名前がボードに表示されるのを見て、全員の興奮を聞いていると、陶酔感を感じました。また、チームワークの感覚を呼び起こし、包容感と、Goコミュニティの真の一部であるという感覚につながりました。

6ステップで、約80人の部屋の人が1時間以内にGoへの貢献方法を学ぶことができました。これは偉業です!

予想していたほど難しくなく、完全な初心者にとって範囲外ではありませんでした。また、活発で具体的な方法でコミュニティ感と、Goへの貢献という輝かしいプロセスへの包含感を育みました。

個人的には、Goチーム、帽子をかぶったGopherメンター、そして一緒に参加してくれた皆さんに感謝したいと思います。GopherConで最も記憶に残る瞬間の1つとなりました。

私の貢献経験

by Matt

私は常にプログラミング言語を恐れていました。それは世界がコードを記述できるようにするコードです。その影響を考えると、私よりも賢い人が取り組むべきでしょう…しかし、その恐怖は克服すべきものでした。そこで、私のお気に入りの新しいプログラミング言語に貢献するためのワークショップに参加する機会が訪れたとき、私はどのように貢献できるかを見ることに興奮しました。1か月後、私は今、誰でも(そしてすべきです)Goに貢献できると確信しています。

Goへの貢献を0から2にするための非常に冗長な手順を次に示します。

セットアップ

GoのGerritの使用を考慮して、最初に環境を設定しました。Jess Frazzelleのガイドは、ステップをスキップしないための素晴らしい出発点です。

Goリポジトリをクローンすると、本当の楽しみが始まります。皮肉なことに、Goは`$GOPATH`の下ではハックしません。そのため、他のワークスペース(`~/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`を実行し、コントリビュートの準備ができているかどうかを確認できます。ただし、手順を追っている方は、まだ準備ができていません。

次に、Gerritコードレビューに参加するために`codereview`をインストールします。

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`の形式(descriptionは小文字で始まる)に一致したら、`git mail`を使用してGerritに送信しました。

この時点で覚えておくべき2つの重要な点があります。`git change`は`git commit --amend`のように機能するため、パッチを更新する必要がある場合は、`add`してから`change`を実行すると、すべて同じパッチにリンクされます。第二に、自分のGerritダッシュボードからいつでもパッチを確認できます。

何度かやり取りした後、公式にGoへのコントリビューションが完了しました!そして、Jaanaが正しければ、絵文字付きの最初のものかもしれません✌️。

本格的なコントリビューション

scratchリポジトリは楽しいですが、Goのパッケージの深みに入り込み、貢献できる方法はたくさんあります。この時点で、利用可能なパッケージを調べて、自分にとって興味深いものを見つけました。「調べて」というのは、パッケージのリストを見つける試みをし、その後、`go/src/`フォルダにある自分のソースコードを確認したという意味です。

regexへの愛と恐怖から、`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`関数と、いくつか役立つと思われるものを追加しました。そこから、Gerritに`git change`と`git mail`で送信します!

Steve Franciaが「未解決の課題を見つけて修正する」という課題を私に与えてくれたので、パッチに`QuoteMeta`のドキュメント変更を含めました。追加のスコープがあるため、しばらくの間公開される予定ですが、この場合はそれだけの価値があると思います。

すでに質問を聞いている声が聞こえてきそうです。どのように動作を確認しましたか?正直なところ、簡単ではありませんでした。`go test example_test.go -run QuoteMeta -v`を実行しても、$GOPATHの外で作業しているので機能しません。解決策を見つけるのに苦労していましたが、Kale BlakenshipがGoでのテストに関する素晴らしい記事を書いてくれました。これは後でブックマークしておきましょう。

完了したコントリビューションはこちらで見ることができます。私が皆さんにも見てほしいのは、コントリビューションの流れに簡単に参加できることです。私と同じように、小さなタイプミスやドキュメントの不足している例を見つけることで、`git codereview`ワークフローに慣れることができます。その後、未解決の課題、できれば今後のリリース用にタグ付けされたものを見つけて、試してみる準備ができます。どのようなことを選択するにしても、ぜひ挑戦してみてください。Goチームは、私たち全員が貢献することをどれだけ大切に思っているかを示してくれました。次の`git mail`が待ち遠しいです。

私のメンターシップ体験

by Dmitri

メンターとしてコントリビューションワークショップに参加することを楽しみにしていました。イベントへの期待は高く、開始前から素晴らしいアイデアだと思っていました。

私は2014年5月10日にGoへの最初の貢献をしました。コントリビュートしたいと思ってから実際に最初のCLを送信するまで、約4ヶ月かかったことを覚えています。プロセスを理解し、完全にコミットするのに、それだけの時間がかかりました。当時、私は経験豊富なソフトウェアエンジニアでした。それにもかかわらず、Goのコントリビューションプロセスは、私がすでに慣れていた他のすべてのプロセスとは異なり、そのため、威圧的に感じられました。しかし、よく文書化されていたので、時間を見つけて座って行うだけだとわかっていました。「未知」という要因が、私をためらわせていました。

数ヶ月後、「もう十分だ」と思い、次の週末の丸一日をプロセスを理解することに費やすことにしました。土曜日は一日中、一つのことに集中しました。それは、Goへの最初のCLを送信することです。コントリビューションガイドを開き、最初からすべての手順に従い始めました。1時間以内に完了しました。最初のCLを送信しました。驚くと同時にショックを受けました。驚いたのは、ついにGoに貢献を送信し、それが受け入れられたからです!ショックを受けたのは、なぜこんなに長く待つ必要があったのかということです。コントリビューションガイドの手順に従うのは非常に簡単で、プロセス全体が非常にスムーズに進みました。1時間以内に完了し、何も問題が起こらないと誰かが教えてくれていたら、もっと早く行っていたでしょう!

これがこのイベントにつながり、私がそれを素晴らしいアイデアだと思った理由です。Goに貢献したいと思っていたが、慣れない長く見えるプロセス(私が4ヶ月間そうであったように)に圧倒されていた人にとって、これは絶好の機会でした!イベントに参加することで、簡単にコミットできるだけでなく、Goチームと有益なボランティアのメンターが道案内をしてくれるからです。

イベントへの期待は既に高かったにもかかわらず、期待をはるかに上回るものでした。まず、Goチームは準備を万端にして、イベントをより一層楽しいものにするために多くの投資をしていました。コントリビューションの手順を簡単に説明する非常に楽しいプレゼンテーションがありました。イベント用のダッシュボードが作成され、成功裏に完了した手順ごとにポイントが付与され、グローバルスコアに反映されました。それにより、非常に協調的で社会的イベントとなりました!最後に、そして最も重要なのは、Brad FitzpatrickのようなGoチームメンバーが舞台裏で迅速にCLのレビューを手伝ってくれたことです!つまり、提出されたCLは迅速にレビューされ、具体的な次の手順が示されたため、誰もが前進してより多くのことを学ぶことができました。

当初、コントリビューションの手順は非常に簡単なので、イベントはやや退屈なものになるのではないかと予想していました。しかし、そうとは限りませんでした。そして、私はGoに関する専門知識を使って、予期せぬ場所で行き詰まった人を助けることができました。現実の世界は、エッジケースで溢れていることがわかりました。たとえば、誰かが個人用と仕事用の2つのgitメールアドレスを持っていました。仕事用のメールアドレスのCLAへの署名に遅延があったため、代わりに個人のメールアドレスを使用しようとしました。つまり、各コミットは正しいメールアドレスを使用するように修正する必要があり、ツールでは考慮されていませんでした。(幸いにも、コントリビューションガイドのトラブルシューティングセクションには、この問題に関する正確な説明があります!)他にも、複数Goインストールを持つことがやや珍しいため、一部の人が遭遇した微妙なミスや環境設定ミスがありました。場合によっては、godocが正しい標準ライブラリに変更を表示するために、GOROOT環境変数を一時的に明示的に設定する必要がありました(私はそれらの言葉を口にしたとき、Dave Cheneyがいないか確認するために冗談めかして肩越しに見ていました)。

全体として、私は数人の新しいGopherがGoへの最初の貢献をするのを監督しました。彼らはCLを送信し、レビューのフィードバックに応答し、編集を行い、全員が満足するまで繰り返し、最終的に最初のGoコントリビューションがmasterにマージされるのを見ました!彼らの笑顔を見るのは非常にやりがいがありました。なぜなら、最初の貢献をする喜びは、私自身も共感できるものだからです。彼らを助け、彼らが時々遭遇する難しい状況を説明することも素晴らしい経験でした。私の知る限り、私自身を含め、多くの幸せなGopherがイベントから帰っていきました!

イベントの写真

Sameer Ajmani & Steve Francia撮影

次の記事:Go 1.9がリリースされました
前の記事:コントリビューターサミット
ブログインデックス