1
/
5

RubyKaigi 2022 参加記 #3 - Types teaches success, what will we do?(Day1)

Photo by JJ Ying on Unsplash

こんにちは、Wantedly で Web エンジニアをしている池田です。

弊社は RubyKaigi 2022をスポンサーしており、現地に5名のエンジニアが参加しています。先着でノベルティの Wantedly Handbook を配布しているのでもし興味があったらブースに遊びに行ってみてください。

WantedlyはRubyKaigi2022にプラチナプランとして協賛し、技術書と開発に役立つHandbookをブースでプレゼントしています #rubykaigi | Wantedly, Inc.
こんにちは!Wantedlyで技術イベント企画まわりを担当しています竹内みずき (@amanda__mt)です! いよいよ本日から3日間、 RubyKaigi 2022 が開催されますね!私たちはこの度プラチナスポンサーとして協賛させていただき、三重県現地にて参加する運びとなりました。 直近2年間はほぼすべてのカンファレンスやイベントがオンラインでの開催となり、今回は久しぶりの ...
https://www.wantedly.com/companies/wantedly/post_articles/430335

自分はオンラインでの参加ですが、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%)。

GitHub - ruby/gem_rbs_collection: A collection of RBS for gems.
Naming note: This repository was called gem_rbs before. We have renamed the repository to make it more clear that this is a collection of RBS files for gems. RBS is a standard type signature syntax for Ruby programs. This is a community managed collection
https://github.com/ruby/gem_rbs_collection

そこで 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 次のブログへ👇

RubyKaigi 2022 参加記 #4 - Tools for Providing rich user experience in debugger(Day 1) | Wantedly Engineer Blog
こんにちは!Wantedly でエンジニアをしている新谷です。RubyKaigi に参加すると自分の英語力のなさに痛感します。早くほんやくコンニャクできてほしい... 今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、Twitterをフォローしてくださった方には技術書や開発に役立つ Engineering Handbook をプレゼントしています! 本記事
https://www.wantedly.com/companies/wantedly/post_articles/430813
Wantedly, Inc.からお誘い
この話題に共感したら、メンバーと話してみませんか?
Wantedly, Inc.では一緒に働く仲間を募集しています
8 いいね!
8 いいね!

同じタグの記事

今週のランキング

池田 伊織さんにいいねを伝えよう
池田 伊織さんや会社があなたに興味を持つかも