giftee Tech Blog

ギフティの開発を支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信しています。

OSS コミットゴルフのすすめ

この記事は、 ギフティ Advent Calendar 2024 最終日の記事です。皆さん、今年もお疲れ様でした!


ところで、皆さんは「OSS コミットゴルフ」という競技をご存知でしょうか?おそらく聞いたことがないと思います。なぜなら私が編み出した競技だからです。

この記事では、まず OSS コミットゴルフという最新eスポーツの概要について説明したあと、私のこれまでの成績や、ちょっとしたコツ等を紹介していきます。

OSS コミットゴルフとは?

OSS コミットゴルフとは、一言でいうと「なるべく少ないコミット行数で、なるべくスター数の多いリポジトリのコミッターになる」ことを目指す競技です。下記のスコア計算式が最も高い人が優勝となります。

(コントリビュートしたリポジトリの GitHub Star 数の総和) / (マージされた行数の総和)

ここで、分母が「マージされた行数」であることに注意です。PR を出しただけではカウントされません。

もしかしたらルールに荒削りな部分があるかもしれませんが、ルールのアップデートが比較的容易なのがeスポーツのいいところなので、まずはこのルールでしばらく様子を見てみようと思います。

私の成績

ここからは、参考記録として私 megane42 の現在のスコアを見ていこうと思います。私よりも高いスコアを持っていたら、かなり自信を持っていいですよ。

Shot 1: flyerhzm/bullet

github.com

- Star: 7117
- Line: 2
- Total: 7117 / 2 = 3558

この PR は、Rails で N+1 を検出するときによく使う bullet gem のドキュメントに typo があったので修正したものです。些細な修正ですが、手元で gem を試すときは README のサンプルコードをコピーして動作確認することも多いと思うので、この修正が誰かの助けになっていたらいいなと思っています。

この競技において、typo の修正はかなりの強行動として知られています。

余談ですが、この PR は作成してから驚くほど早くマージされたことを覚えています。今タイムスタンプを見たら 2 分で approve されていました。

Shot 2: PokeAPI/pokeapi

github.com

- Star: 4414
- Line: 4
- Total: 11531 / 6 = 1921 (前打比: -1637)

この PR は、ポケモンのあらゆるデータを REST API / GraphQL で提供することを目指している PokeAPI において、わざ名の typo があったので修正したものです。やはり typo の修正はお手軽強行動です。

コントリビュートしたのにスコアが下がっているのが少し気になりますが、もう少し様子を見てみようと思います。

Shot 3: carrierwaveuploader/carrierwave

github.com

- Star: 8781
- Line: 6
- Total: 20312 / 12 = 1692 (前打比: -229)

この PR は、Rails 等でファイルアップロードを扱いたくなったときによく使う carrierwave gem の config 周りにバグがあったので、それを修正したものです。業務中に carrierwave を触っていてバグを踏んだのですが、たまたま原因がスムーズに特定できたので、すぐに PR を出すことができました。

メンテナにとって読みやすい PR description を書くことは、この競技において非常に重要です。なぜなら、マージされないとスコアとして計上できないからです。前の 2 打とは違って、今回はコードの修正なので、変更の背景をより詳しく説明する必要がありました。自分は英語にあまり自信がなかったので、再現手順・期待する挙動・実際の挙動をコードで書いたり、関連する issue を添えたりして、なるべく英作文力に依存しない方法で明確に意図が伝わるように工夫しました。

Shot 4: notiz-dev/nestjs-prisma

github.com

- Star: 599
- Line: 83
- Total: 20911 / 95 = 220 (前打比: -1472)

この PR は、NestJS で Prisma を扱う際に便利な機能を提供してくれるライブラリに対して、機能の追加を行ったものです。Prisma のエラーメッセージがそのまま NestJS のレスポンスに使われてしまうことを防ぐために、Prisma の各エラーコードごとに任意のエラーメッセージを定義できるようにしました。これも、業務中に挙動が気になったことがきっかけでした。コードを読んでみると、思ったより簡単に対応できそうだったので、無事 PR を出すことができました。

今回も英語で長い文章を書くのではなく、新機能の実際の利用例や実行結果を添えて、PR の意義が明確に伝わるように工夫しています。また、この機能の追加によって既存ユーザーのコードが壊れてはいけないので、後方互換性を保つことも意識していました。

これまでの 3 打とは違って「機能追加」であることもあり、コードの修正行が非常に多くなってしまい、スコアが大幅に低下してしまいました。

プレイした感想

ルールがおかしいです。1 度でも大きめのコミットをした瞬間にスコアが大幅に悪化します。2 打目でスコアが下がった時点で気付くべきでした。

あと、GitHub Star の数は日々変わるので、時間が経つにつれてスコアが変わるのも意味不明です。

OSS コミットのコツ

ルールはおかしかったですが、プレイを通じて学んだこともあります。「OSS コミュニティから Take するだけでなく Give もしたい」と思っていた私のような人向けの、OSS コミットのコツのようなものです。

1 つ目のコツは、「ドキュメントの修正」というコミットの仕方があることを知っておくことです。OSS コミットは、何も画期的な新機能を作ったり、難しいバグを直したりすることだけではありません。typo を直したり、新機能に追従できていないドキュメントを補ったりすることは、メンテナにとってもユーザーにとっても価値のあることだと思います。

2 つ目のコツは、OSS のコードを、自分の業務の担当プロダクトのコードの一部だと認識することです。OSS のコードは、空から降ってくる贈り物ではありません。業務中に OSS を使っていて気になるところがあったら、自分で修正できるのです(もちろん、独善的な修正は reject されると思いますが)。この認識を持っておくと、業務中にコントリビュートチャンスを見つける機会が増えるはずです。

3 つ目のコツは、ローカルで OSS のコードを書き換えることを恐れないことです。OSS が気になる挙動を示したら、インストールされているフォルダを探して printf デバッグしてみましょう。Ruby のようなインタプリタ言語だとそれが特に容易です。困ったらインストールし直せばいいだけなので、どんどん書き換えてみましょう。OSS リポジトリ内を git grep したり、テストコードを読んだりするのも、情報収集の手段としておすすめです。

まとめ

OSS コミットゴルフの紹介をしました。私の PR の例を見て、「あ、OSS コミットってこれくらい小さな PR でもいいんだ」と感じてくれれば嬉しいです。ほんの 1 行の修正でも、サンプルコードの typo を直しただけでも、ちゃんと価値があれば立派な貢献です。OSS コミュニティへの貢献の第一歩として、 OSS コミットゴルフから始めてみませんか?

余談

私が OSS に貢献したいと思うようになったのはここ最近の話ではなく、10 年近く前の、新卒の頃からそんなことを思っていました。当時の職場の先輩が OSS 活動を頻繁に行っている人だったので、その先輩との 1on1 の場で OSS への興味を伝えたところ、先輩からはこんな言葉が返ってきました。

「OSS をやりたい」って言う人って結構見かけるんだけど、そういう人って結局やらないイメージがあるんだよね。本当にやる人は、その日からもう何か始めてるというか...

その日、私は初めて GitHub のアカウントを作ったのでした。