GitHub CLIにコントリビュートした思い出

もうけっこう前のことになるが、GitHub CLI に新機能を追加するパッチを送信した。 pr create コマンドにおいて --body-file フラグを追加しファイルの中身をPull Requestの本文として入力可能にする、というものだった。

Add `pr create --body-file` flag by castaneai · Pull Request #3018 · cli/cli · GitHub

機能的にはひとつフラグを足して、フラグが指定されていた場合はファイルの中身を読み込む。 それだけなので技術的に難しい実装ではない。コード的にも20行増えるか程度である。

しかし、このようなごく小さい機能でも実際に本家に取り込んでもらおうとすると簡単にはいかない。

完全自作ではないソフトウェアの場合は既存のコードにならって同じようなやり方で実装したほうが一貫性が保たれるので、プロジェクト全体のやり方を理解し、既存コードを読む必要がある。これが結構時間がかかる。

多くの人が参加するオープンソースなソフトウェアでは、レビュアーの気持ちになってあまり巨大すぎず、素直で読みやすい変更を心がけることが重要だが それを常に意識しながら書くと(待てよ、この書き方は正直理解しづらいかもな…)といった感じで頻繁に心のなかでストップがかかって3行程度のコードを追加するだけでものすごく頭を使うし、時間もかかる。

他人に見られることを意識しながら書く、加えて「テストがないよ?」って突っ込まれるのも嫌なのでテストをしっかり書く。 すると自然にテストしやすいコードを書くにはどうすればいいか…と真剣に考える。 なかなかに重労働だが、こうやって必死に頭を使うことで良いソフトウェアを書く力はついていく感じがある。

この機能追加パッチを出したあと、レビュアーの方から "this is great!" と言ってもらえて取り込んでもらえる流れになった! が、このあと少し面白い流れになった。自分が書いたテストの実装がほぼ全部消されて別の実装に差し替えられた。

もともとは他のテストコードを真似してGitHub APIに対するリクエストと期待するレスポンスを一緒に記述してAPIモックが返したレスポンスを検査する というテストを追加したのだが、コミッターによりフラグのパースのみに重点を置いたテストに書き換えられていた。

これは「お前の実装がひどすぎるから全部消したわ」という意味ではなくて、このパッチをきっかけにレビュアーがフラグのテストはこうまとめたほうがきれいなのでは?という思いつきを得たのだと思っている。もしかしたら前々から(ここのテスト周りちょっときれいに書き直したいんだよな)と思われていたタイミングだったかもしれない。そのあたりはソフトウェアの歴史的な背景が絡んでくるので今回はじめてパッチを送った自分にはわからない。 が、自分が送ったパッチがきっかけで他の人の意識に新しい気付きが生じたのだとしたらとてもいい流れだと思えた。 オープンソースへ貢献の良いところは自分が欲しい機能が入る、だけではなくて、コミュニティ全体の意識に対して介入して周囲に影響を与えられる、というのも大きい。

CLIにひとつフラグを追加する、それだけでもすごく頭を使ったし、勉強になった。 オープンソースへ貢献するという行為はコンピューターにより詳しくなり技術力を高めるという意義もあるが、 同時にソフトウェアの開発とその後ろにある文化、思想、コミュニティのやり方を学ぶという面も持っていると実感できてよかった。

ちなみに送ったパッチがどうなったかというと テストが書き換えられたあとに無事にapprove & mergeされてv1.7.0のRelease Noteに名前を載せてもらえた 🎉

Release GitHub CLI 1.7.0 · cli/cli · GitHub