Slide 1

Slide 1 text

“Rails × 型”での2年間を振り返る Roppongi.rb#23 <2024-10-09> @aki19035vc

Slide 2

Slide 2 text

自己紹介 ❏ 藤崎 亮人 (a_fujisaki) ❏ @aki19035vc ❏ イタンジ株式会社 ❏ 不動産会社向けのSaaSを提供 ❏ 物件基盤の開発責任者 ❏ 主にバックエンド ❏ ほぼRails・たまにScala ❏ Rails × 型 の話が好き ❏ 学生の頃(2016年くらい)からEmacs使ってます

Slide 3

Slide 3 text

今日話すこと ❏ “Rails × 型”を2年間やってきた感想 ❏ 今どのような状態か ❏ 型を使うことでどんな良いことがあったか ❏ 型を使う上でどんな課題があったか ❏ 型を上手く使うためにどのような取り組みをしているか ❏ 今後の展望 ※ あくまで個人的な意見です

Slide 4

Slide 4 text

今どのような状態か ❏ 型がほぼ100%入っている ❏ rails new の直後に入れた ❏ steep check に1分30秒くらいかかる ❏ 型チェックをCIに組み込んでおり、通らないとマージできない ❏ 無視している警告は「未定義の定数チェック」だけ ❏ RailsはWeb APIだけ提供 ❏ Action Viewを使っていない

Slide 5

Slide 5 text

$ rails stats +----------------------+--------+--------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+--------+--------+---------+---------+-----+-------+ | Controllers | 745 | 492 | 28 | 67 | 2 | 5 | | Jobs | 297 | 170 | 11 | 19 | 1 | 6 | | Models | 18131 | 12031 | 382 | 917 | 2 | 11 | | Libraries | 5634 | 4125 | 41 | 87 | 2 | 45 | | Libs | 397 | 225 | 6 | 22 | 3 | 8 | | Serializers | 4382 | 2998 | 164 | 204 | 1 | 12 | | Validators | 1671 | 846 | 163 | 55 | 0 | 13 | | Batches | 99 | 62 | 3 | 8 | 2 | 5 | | Usecases | 12167 | 8281 | 226 | 676 | 2 | 10 | +----------------------+--------+--------+---------+---------+-----+-------+ | Total | 43523 | 29230 | 1024 | 2055 | 2 | 12 | +----------------------+--------+--------+---------+---------+-----+-------+ Code LOC: 29230 Test LOC: 0 Code to Test Ratio: 1:0.0

Slide 6

Slide 6 text

型を使うことでどんな良いことがあったか ❏ 単純な考慮漏れや実装ミスを型検査で検出できる ❏ 見落としがちなnilの可能性を確実に潰せる ❏ 2年間でNoMethod Errorは0件 ❏ インターフェースをシンプルに保つようになる ❏ 型が複雑になると型検査を通すのが大変になる ❏ なんでもできる便利関数を作らなくなる ❏ 「イミュータブル」を意識した実装になる ❏ ジュニアのメンバーには良いギプスになる

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

型を使う上でどんな課題があったか ❏ 慣れるまでは生産性が落ちる ❏ rbs, rbs_collection, rbs_rails, Steep … 何もわからん😭 ❏ ライブラリの型が充実してない ❏ 使用しているgemの型が存在しない or 合ってもほぼuntyped ❏ untypedがあると型検査の精度が落ちる🥺 ❏ 型検査 (steep check) が遅い ❏ エラーが分かりづらい

Slide 10

Slide 10 text

型を上手く使うためにどのような取り組みをしているか ❏ 型に慣れていない場合、PR作成時には型を通さなくてもOKとする ❏ 実装がある程度固まったらペアプロで型を一緒に書く ❏ ライブラリの型がなかったら必要なものだけ手元で書く ❏ gemのソースコードを読みにいく必要がある ❏ 上手く動いたらrbs本体やgem_rbs_collectionにコミットして還元する ❏ steep check は並列で実行する (今は2並列が最適) ❏ 型検査に失敗したらSteepのエラーをちゃんと読む ❏ sendメソッドは使わないようにする ❏ 動的にメソッドを定義する場合、型のジェネレーターをセットで作る or 毎回頑張って型を手書きする

Slide 11

Slide 11 text

今後の展望 ❏ rbs-inlineを入れる ❏ 今はYARDも書いているが、完全に置き換える予定 ❏ 既存のrbsファイルからrbs-inlineコメントを自動で挿入するスクリプトを作る ❏ 型が入っていないRailsアプリケーションに型を入れる ❏ 型がない前提で書かれたコードにどうやって型を入れるか ❏ 型を書く習慣の無いチームにどうやって浸透させていくか