Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Railsアプリと型検査 / Rails app and type checking
Search
Takumi Shotoku
November 15, 2023
Technology
5
1.6k
Railsアプリと型検査 / Rails app and type checking
GENBA #1 〜RubyとRails開発の現場〜
https://timeedev.connpass.com/event/300473/
Takumi Shotoku
November 15, 2023
Tweet
Share
More Decks by Takumi Shotoku
See All by Takumi Shotoku
Automatically generating types by running tests
sinsoku
3
11k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
8
2.6k
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
270
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
310
"型"のあるRailsアプリケーション開発 / Typed Rails application development
sinsoku
10
2.9k
Let's get started with Ruby && Rails Tips
sinsoku
0
460
LTの敷居を下げる / Lower the threshold for LT
sinsoku
1
390
CircleCIの高速化🚀 / CircleCI faster
sinsoku
3
1.5k
💎のつくりかた 2023 / How to make gems 2023
sinsoku
2
430
Other Decks in Technology
See All in Technology
Open Table Format (OTF) が必要になった背景とその機能 (2025.10.28)
simosako
1
180
AI-Readyを目指した非構造化データのメダリオンアーキテクチャ
r_miura
1
320
Azure Well-Architected Framework入門
tomokusaba
1
130
Dylib Hijacking on macOS: Dead or Alive?
patrickwardle
0
470
CREが作る自己解決サイクルSlackワークフローに組み込んだAIによる社内ヘルプデスク改革 #cre_meetup
bengo4com
0
330
IoTLT@ストラタシスジャパン_20251021
norioikedo
0
140
様々なファイルシステム
sat
PRO
0
240
AI AgentをLangflowでサクッと作って、1日働かせてみた!
yano13
1
160
クラウドとリアルの融合により、製造業はどう変わるのか?〜クラスメソッドの製造業への取組と共に〜
hamadakoji
0
420
ヘンリー会社紹介資料(エンジニア向け) / company deck for engineer
henryofficial
0
380
アウトプットから始めるOSSコントリビューション 〜eslint-plugin-vueの場合〜 #vuefes
bengo4com
3
1.8k
QA業務を変える(!?)AIを併用した不具合分析の実践
ma2ri
0
140
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
GitHub's CSS Performance
jonrohan
1032
470k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
A designer walks into a library…
pauljervisheath
209
24k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
Visualization
eitanlees
149
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
YesSQL, Process and Tooling at Scale
rocio
173
15k
Product Roadmaps are Hard
iamctodd
PRO
55
11k
The Language of Interfaces
destraynor
162
25k
Navigating Team Friction
lara
190
15k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
130k
Transcript
2023/11/15 正徳巧 Railsアプリと型検査 @sinsoku @sinsoku_listy
自己紹介 • 名前: 正徳 巧(aka: 神速) • 部署: CTO室 •
入社月: 2022年11月(社歴1年) • 好きな言語: 🦀Rust, 💎Ruby • Rails歴: 8年くらい @sinsoku @sinsoku_listy
タイミーの実績 スキマ バイト No.1 ※203年10月時点 ※1 [調査方法]デスクリサーチ及びヒアリング調査 [調査期間]2021年2月8日~22日 [調査概要]スキマバイトアプリ サービスの実態調査 [調査対象]2020年12月までにサービスを開始しているスキマバイトアプリ10サービス
[調査実施]株式会社ショッ パーズアイ ※2 [出典]AppStoreライフスタイルカテゴリーランキング(2021年5月時点) 3 累計求人案件数 ・ダウンロード数 ※1 ※2 導入事業者数 66,000企業 ワーカー数 600万人
興味を持った人は橋本環奈さんのCMをどうぞ 📦「タイミー CM」 で検索
目次 • RBSの基本 • 弊社の導入事例を紹介 • 型検査の課題
1 RBSの基本
RBSとは Rubyで型を定義するための言語。
RBSとは • 拡張子は `*.rbs` で sig/ ディレクトリに置く ◦ つまりRubyとは別ファイル •
主な利用方法は2つ ◦ 型検査 ◦ 入力補完
型検査(Steep) RBSの定義に違反しているコードを検出するツール。
型検査(Steep)の実行例 RBS Ruby
型検査(Steep)の実行例 Rubyを実行する前にエラーに気づくことができる
入力補完(VS Code)の実行例 `soutaro.steep-vscode` の拡張で入力補完が賢くなる
入力補完(IRB) IRB v1.9.0(2023-11-11)でRBSを使った入力補完がサポートされました
入力補完(IRB)の実行例 入力補完でRBSが使用される
2 弊社の導入事例を紹介
RBSの導入を検討(2023-05) • ⭐RubyKaigi 2023、メドピアのブログで意欲が高まる ◦ Railsプロジェクトへの「頑張らない型導入」のすすめ ◦ https://tech.medpeer.co.jp/entry/2023-small-rbs-introduce • 🐤RBSの導入を試したら容易だった
◦ 型検査エラーを無視する ◦ `rbs prototype rb` でRBSを生成する • ❤型は重要なところをだけYARDで書きたい ◦ 弊社の開発者は誰も `*.rbs` を手書きしたくなかった ◦ YARD -> RBS が実現できることが分かった • ⛏RBSは書かずに生成するので、Gitでは管理しない 💪本番影響もないので、試しに導入を進めてみた
RBS + Steepを導入 1. rbs_rails, steep をGemfileに追加する。
RBS + Steepを導入 2. Steepfileを追加し、既存の型検査エラーは無視する。
RBS + Steepを導入 3. `rbs_collection.yaml` を作成する
RBS + Steepを導入 4. RBSを生成するRakeタスクを追加する。
RBS + Steepを導入
RBS + Steepを導入 5. `.gitignore` でディレクトリを無視する
RBS + Steepを導入 6. RBSの定義エラーを回避するために最小限の型を書く
この時点でできること • `bin/rails rbs:setup` を実行すると sig/ にRBSが生成される ◦ クラスやメソッドに対応する型定義が生成される ◦
メソッドの戻り値のほとんどは untyped になる • steep check は実行できる ◦ 型検査エラーはほぼ全てを無効化 ◦ RBSの定義エラーを検出するため、 CIで `steep validate && steep check` は実行する • 入力補完で型を活用できる状態になっている ◦ 開発者は `bin/rails rbs:setup` を実行すれば良い ⭐RBSを1行も書かなくても入力補完に型を使用できる
Sordを導入 1. sordをGemfileに追加する
Sordを導入 2. Rakeタスクでsordも実行する
RBS + Sord の導入が完了 • `bin/rails rbs:setup` を実行するとRBSが生成される ◦ YARDを書くと
sig/sord/generated.rbs に反映 ◦ YARD以外は sig/prototype/**/*.rbs に反映 ◦ ActiveRecordのメソッドは sig/rbs_rails/app/models/*.rbs に反映 • RubyMineやVS Codeだと入力補完が良くなる(らしい) ◦ 私はVimユーザーで、実はあまり詳しくない 🙈 ◦ 懇親会で弊社の開発者を捕まえて聞いて欲しい 👀
既知の課題や検討事項 • 😅`bin/rails rbs:setup` を実行するのが面倒 ◦ コード書いたら自動的に反映されて欲しい ◦ ただ、差分更新するには Rakeタスクの実装を見直す必要がある
• ⏳RBSの生成に時間がかかる ◦ 約40秒 ◦ 削除して再生成しているため無駄がある • 🎃 sig/app.rbs が手書き • 🤔 ksss/orthoses への移行を検討 ◦ sord は1ファイルだけど orthoses-yard は複数ファイルに出力できる ◦ 差分更新には都合が良い 🍻この辺りの話を聞きたい人は懇親会で声かけて
3 型検査の課題
🔥型検査の課題 • gemの型定義が少ない ◦ gem_rbs_collection には一部gemの型しか存在しない ◦ 型が不十分なので、型検査の精度が悪い • 型検査エラーを部分的に無視できない
◦ rubocop_todo.yml みたいなものが作れない ◦ 段階的な導入が難しい
💣弊社での型検査のエラー数 型定義の不足や誤検知で多数のエラーが検知される
😇まだ誤検知が多い validate メソッドは使えるはずだけど、エラーになってしまう。 我々のRBSの定義ミスなのか、それともRBSやSteepのバグなのか。
👻型検査で見つけたコード例 ※ 上記は説明用のコードで、実際のプロダクトコードとは異なります。
✅まとめ • RBSで入力補完が賢くなる ◦ 既に実用的な状況になっている • Railsアプリ開発で型検査を使う ◦ 現状はまだ実用的とは言い難い ◦
今後の開発に期待 OSSコントリビュートチャンス🌱 ぜひ明日からRBSを導入して、触ってみましょう!💎