こんにちは、Wantedly で Web エンジニアをしている池田です。
弊社は RubyKaigi 2022をスポンサーしており、現地に5名のエンジニアが参加しています。先着でノベルティの Wantedly Handbook を配布しているのでもし興味があったらブースに遊びに行ってみてください。
自分はオンラインでの参加ですが、Types teaches success, what will we do? を聴講したのでこちらについて紹介させていただきます。
Types teaches success, what will we do?
RubyKaigi 公式ページ: https://rubykaigi.org/2022/presentations/fugakkbn.html#day1
このセッションは Ruby 3.0 で追加された静的型付けの紹介と、gem の rbs をまとめた gem_rbs_collection へのコントリビューションに関する発表でした。
型付けについて
まず初めに、型を使うことに対して次のようなフィードバックが得られることがメリットとして挙げられていました。
これらのフィードバックにより、開発者体験や開発効率の向上やバグを防ぐことができるとのことです。
自分自身、元々静的型付けがある世界の住人で Ruby を触り初めの頃は型周りで悩まされたので、この辺のメリットを享受できるようになるのは嬉しいですね。
gem_rbs_collection
次に、Ruby 3.0 では RBS/Steep が導入されたが実際はまだまだ使われていないという課題が紹介されました。一つの理由として、ちゃんと型が付いている gem が少ないことが挙げられています。
Ruby には、いろんな gem の型定義を集めた gem_rbs_collection があるとのことです (TypeScript でいう DefinitelyTypes)。しかし、RubyGems には 17万超の gem が登録されている一方で gem_rbs_collection には 44個 しか型定義がないとのことでした(0.025%)。
そこで gem_rbs_collection へのコントリビューションを行い、型が付いた gem を増やすことで既存プロジェクトへの型の導入障壁を取り除こうということですね。Wantedly でも既存のプロジェクトへの型付けを POC レベルでチャレンジしましたが、Rails 周りの型で苦労していた記憶があります。
gem_rbs_collection へのコントリビューション
ここからは実際に gem_rbs_collection にコントリビューションしていく方法について丁寧に紹介されました。
まず、すでに登録されている gem に対しての貢献と新規の gem(まだgem_rbs_collection に登録されていない gem)への貢献についてそれぞれどのような貢献ができるか提示されました。
前者は主に gem のアップデートに伴う型まわりの変更の追従(追加・修正)です。steep check というコマンドを実行し、エラーが出た場合は実装を見つつ型が間違っていそうなら修正していけば良いとのことでした。
後者は gem の型を新しく追加していくのですが、手動で型を書くだけでなく generator で自動生成する事もできるようです。
gem の型を追加するといっても全部の API を対応しないといけないの?という疑問に関してですが、公式の CONTRIBUTING.md にもあるとおり、主要な API や自分のプロジェクトで使っている部分を追加すればよいとのことでした。
Focus on examples available through the README or docs of the gem. Focus on the APIs your app is using.
https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md より
テストに関しても、すべての API について書くのは大変なのでプロジェクトで使っている部分などだけテスト書き、自動生成された部分はそのままコミットしてしまっても問題ないとおっしゃっていました。
そこそこ規模の大きい gem ではすべての API を対応するのはコストが大きく、コントリビューションのハードルが上がってしまいますが、一部だけの対応でもいいよとすることでハードルが大きく下がりそうですね。
また、手動生成と自動生成の使い分けについてですが、話者の方は「明確にこの API がほしいという場合は手動生成、プロジェクトで使っている gem で steep check を使ってみてたくさんエラーが出てしまった場合は網羅的に型生成してほしいので自動生成」のような使い分けを行っているとのことでした。
最後に Pull Request を作るときの注意点として以下の2つが挙げられていました。
- gem_rbs_collection がすべての gem をカバーしているわけではなく、標準ライブラリなど一部のライブラリの型は ruby/rbs にある
- 自動生成されるファイルのうち manifest.yml は特殊な場合にしか必要にならないので削除して良い
まとめ
今回の発表を通してプロジェクトに型付けをする人や貢献する人が増え、Ruby のエコシステムが発展していくと良いとのことです。
感想
Ruby 3.0 がでたときからずっと興味があった型付けですが、なかなか自分で対応を進めるということは行っていませんでした。これを機に、まずは社内のプロジェクトへの型付けをから始めてみたいなと思います!
貢献の方法など、これまでの例を挙げながら話していただいたので非常にわかりやすかったです。発表ありがとうございました!
RubyKaigi 2022 残り2日!
Wantedly から参加したエンジニアが他の記事をどんどん出していきます。そちらもぜひご覧ください!
#4 次のブログへ👇