Kaigi on Rails 2023に参加しました!
久しぶりに、オフラインのカンファレンスに参加したのですが、オンラインとは違って会場の雰囲気などもあって楽しいですね。
ここからは、カンファレンスで聞いた内容の感想を簡単に書いておきます。
所用で初日のみ参加だったため、初日のみになります。
ぜひ二日目も時間を見つけて資料など見たいと思います。
- Rails アプリの 5,000 件の N+1 問題と戦っている話
- 生きた Rails アプリケーションへの delegated types の導入
- Exceptional Rails
- 初めてのパフォーマンス改善〜君たちはどう計測す(はか)るか〜
- Simplicity on Rails
- 技術的負債の借り換え
- 定数参照のトラップとそれを回避するために行う2つのこと
- Rails Executor: フレームワークとあなたのコードとの境
Rails アプリの 5,000 件の N+1 問題と戦っている話
RailsといえばN+1、N+1といえばRailsといった感じがしますが、このN+1問題に関して、どのように対応しているかという話でした。
まず最初に includes
、 preload
、 eager_load
の使い分けについての話からスタート。
このあたりの解説があるのは初心者でも聞きやすそうですね。
実際にどう対処しているかという話では、gemを作って、適切な箇所に includes
を自動で仕込んでいけるようにするという、意欲的な対応をされていました。
社内で、 a_matsudaさんにより、バグ退治番長というトリアージ担当の提案があったという話も、業務で後回しになったり、中に浮いてしまったりする対応をどうするかの参考になりそうでしたね。
生きた Rails アプリケーションへの delegated types の導入
Rails 6.1 で導入された delegated types を実際のアプリケーションで使った話。
実際に使ってみた上でのメリデメや、既存テーブルに対しての適用も丁寧に話されていたので、自分たちが使うならどうだろうか?という判断の参考にもできそうでした。
大きなデメリットとして、「共通テーブルに外部キー制約をかけられない」というのは、覚えておいて損はなさそうでしたね。
Exceptional Rails
なんだかんだでなんとなくで使ってしまったり、気づかぬうちに使っていたりする例外まわりの話。
例外については、まず if
などの条件分岐にくらべ、以下のデメリットがある、と説明されていました。
・例外はフローが分かりづらい
・例外は遅い
逆に上記デメリットから、例外を使う場合は以下のようにすべき、という整理もされていました。
・いつ:早くrescueする => フローがわかりやすくなるため
・どのように:
・なるべく具体的に
・rescueする範囲を狭くする
なんとなく理解しているものの、言語化されると頭の中が再整理できてよいですね。
初めてのパフォーマンス改善〜君たちはどう計測す(はか)るか〜
パフォーマンス改善における、進め方についての話。
Ruby、Railsに関わらない内容で、一般論として見れる内容でした。
「diff には載らないような、調査した内容などもdescriptionに記載していた」という話は、descriptionを書く際に気をつけたいなと思いました。
Simplicity on Rails
いかにRDB、REST、Rubyでシンプルに実装をするかという話。
RDBでは、リソースエンティティとイベントエンティティを考える。
とくに重要なコンバージョンポイントになっていることも多いイベントエンティティ。
RESTは、イベントエンティティに対するCRUDとして定義する。 ただし、RDBに対応しない場合もある(例:sessions#new, #create, #destroy)
このあたり、イメージはできていても、改めて整理して理解しておくと良さそうですね。
技術的負債の借り換え
gem の update に関する話。
Ruby/RailsのEOLに間に合わせるために複数の gem の update が必要だったが、まともに対応していると間に合わない。
そんなときに、完璧ではないが、より早くより良い状態に置き換えるという方法で対応したということだったが、結構あるあるかも。。。
目の前のサービスや事業に関する開発に注力しているとどうしても gem の update が後回しになったりするので、そもそも早く対応しつつ、EOLといったリミットにどうやって間に合わせるかも考えていくのは大事ですね。
定数参照のトラップとそれを回避するために行う2つのこと
定数の参照が、意図せず名前空間として近いほうを参照してしまうことがあるという話。
個人的には、別ファイルの定数は基本的にルートから書くことが多いので、あまり発生したイメージが無かったり…
gemやVSCodeの拡張を作ってわかりやすくする対応をしているとのことでした。
Rails Executor: フレームワークとあなたのコードとの境
フレームワーク側から、アプリケーションのコードを呼び出す何らかのライブラリやコンポーネントを書く場合に使うExecutor / Reloader の話。
普通にRailsガイドにもあるので、ちゃんと知っておくべきですね…