4月18日から20日まで、RubyKaigi 2019が開催されました。2日目のキーノートではnagachikaさんが登壇し、「All bugfixes are incompatibilities」というタイトルで発表しました。
nagachikaさんはCRubyのコミッターであり、安定版(現在は2.6)のメンテナーです。ruby trunk changesというブログの運営もしています。また、Fukuoka.rbのファウンダーでもあります。
nagachikaさんが発表中に述べていることですが、今回の発表内容は「将来Rubyの安定版メンテナーになる人のための申し送り事項」と言うべきものとなっています。 安定版の概要から始まり、いくつかの失敗事例を紹介し、最後にモチベーションの話をして終わる、という流れで進行しました。
安定版ブランチのメンテナーとは
はじめに、安定版ブランチのメンテナーについて、次のように説明がありました。
- trunkからのコミットをメンテナンス対象のブランチにバックポートするのがメンテナーの主な仕事
- そのためにRedmineのクローズ済issueをウォッチしている
- メンテナーの担当はスライド式となっており、各安定版につき一人のメンテナーがいる
- 一人が同時に2つ以上のブランチをメンテナンスするのは時間的に厳しい
安定版が存在する理由としては、そもそもユーザーが新しいRubyを欲しがっていることや、リリースが機能拡張のモチベーションとなっていることを挙げています。
安定版ブランチメンテナーになるには
世代交代も必要であるとして「安定版のメンテナーを求めている」と述べた上で、メンテナーになるために必要なものを列挙しました。
- 広く浅い理解
- 継続的な活動
- メンテナンス方針の理解
この「メンテナンス方針」とはなんなのか、さらに掘り下げた説明が行われました。それによると、次の事柄を指しているとのことです。
- バグ修正はバックポート
- 新機能はバックポートしない
- バックポートするかしないかの判断が重要
バックポートする判断の難しさを示す具体例として、IO.read
がコマンドを実行できてしまう事例を挙げました。具体的には、IO
を継承するFile
クラスのread
メソッドでも任意のコマンドが実行できてしまい、これはさすがに意図に反するものでした。そこで2.5で警告、2.6で禁止となったのですが、これはバグ修正と非互換性のグレーゾーンであると解説しました。
失敗から学ぶ
メンテナーになってからの様々な「失敗事例」についても紹介がありました。発表中取り上げた事柄の中から、筆者の印象に残った「必須キーワード引数の件」と「FIFOをloadする件」を紹介します。
必須キーワード引数でカッコがないとエラーになった
カッコがないと必須キーワード引数でSyntaxError
になるというバグがありました。なぜリリース前に見つからなかったのか不思議なバグでしたが、こちらを直すと同じコロンを使っているハッシュリテラルが壊れてしまいました。 必須キーワード引数のエラーはそもそも誰も使っていない、というより新しすぎて使いようがないものなので、すでに利用者がいるハッシュリテラルのバグのほうが重大ではないのか、でも必須キーワード引数のバグを直さないという選択肢もない……というジレンマがあったそうです。
FIFOをloadしようとするとプロセスがブロックする
FIFOをloadするとプロセスがブロックするというバグがありました。Kernel#open
メソッドを修正することで、この問題は解決したのですが、代償としてYAMLが遅くなってしまいました。ここから得られる教訓としては、誰もしないことについての修正はバックポートしてはいけない、ということでした。
メンテナーとしてのモチベーションは「安定したRubyを届けたい」
最後に、メンテナーのモチベーションは「最高のRubyを作る!」というより「安定したRubyを届けたい」という想いである、という話で発表を締めくくりました。
いちRubyユーザーとして、nagachikaさんのこの考えには非常に心打たれるものがありました。わたしたちが普段Rubyを普通に使えているのも、nagachikaさんをはじめとするメンテナーさらにはコミッターの皆さんのおかげだと、改めて感謝しました。
nagachikaさんの発表は普段わたしたちが意識することのない、縁の下の力持ちであるメンテナーについて光を当てたという意味でとても意義があったと思います。 「ソフトウェアは人が作っている」という当たり前の事実を改めて教えてくれる、素晴らしいキーノートでした。
(写真提供=RubyKaigi 2019)