Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

“Rails × 型”での2年間を振り返る

a_fujisaki
October 10, 2024
1k

“Rails × 型”での2年間を振り返る

a_fujisaki

October 10, 2024
Tweet

Transcript

  1. 自己紹介 ❏ 藤崎 亮人 (a_fujisaki) ❏ @aki19035vc ❏ イタンジ株式会社 ❏

    不動産会社向けのSaaSを提供 ❏ 物件基盤の開発責任者 ❏ 主にバックエンド ❏ ほぼRails・たまにScala ❏ Rails × 型 の話が好き ❏ 学生の頃(2016年くらい)からEmacs使ってます
  2. 今日話すこと ❏ “Rails × 型”を2年間やってきた感想 ❏ 今どのような状態か ❏ 型を使うことでどんな良いことがあったか ❏

    型を使う上でどんな課題があったか ❏ 型を上手く使うためにどのような取り組みをしているか ❏ 今後の展望 ※ あくまで個人的な意見です
  3. 今どのような状態か ❏ 型がほぼ100%入っている ❏ rails new の直後に入れた ❏ steep check

    に1分30秒くらいかかる ❏ 型チェックをCIに組み込んでおり、通らないとマージできない ❏ 無視している警告は「未定義の定数チェック」だけ ❏ RailsはWeb APIだけ提供 ❏ Action Viewを使っていない
  4. $ 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
  5. 型を使うことでどんな良いことがあったか ❏ 単純な考慮漏れや実装ミスを型検査で検出できる ❏ 見落としがちなnilの可能性を確実に潰せる ❏ 2年間でNoMethod Errorは0件 ❏ インターフェースをシンプルに保つようになる

    ❏ 型が複雑になると型検査を通すのが大変になる ❏ なんでもできる便利関数を作らなくなる ❏ 「イミュータブル」を意識した実装になる ❏ ジュニアのメンバーには良いギプスになる
  6. 型を使う上でどんな課題があったか ❏ 慣れるまでは生産性が落ちる ❏ rbs, rbs_collection, rbs_rails, Steep … 何もわからん😭

    ❏ ライブラリの型が充実してない ❏ 使用しているgemの型が存在しない or 合ってもほぼuntyped ❏ untypedがあると型検査の精度が落ちる🥺 ❏ 型検査 (steep check) が遅い ❏ エラーが分かりづらい
  7. 型を上手く使うためにどのような取り組みをしているか ❏ 型に慣れていない場合、PR作成時には型を通さなくてもOKとする ❏ 実装がある程度固まったらペアプロで型を一緒に書く ❏ ライブラリの型がなかったら必要なものだけ手元で書く ❏ gemのソースコードを読みにいく必要がある ❏

    上手く動いたらrbs本体やgem_rbs_collectionにコミットして還元する ❏ steep check は並列で実行する (今は2並列が最適) ❏ 型検査に失敗したらSteepのエラーをちゃんと読む ❏ sendメソッドは使わないようにする ❏ 動的にメソッドを定義する場合、型のジェネレーターをセットで作る or 毎回頑張って型を手書きする