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
1.6k
5
Share
Railsアプリと型検査 / Rails app and type checking
GENBA #1 〜RubyとRails開発の現場〜
https://timeedev.connpass.com/event/300473/
Takumi Shotoku
November 15, 2023
More Decks by Takumi Shotoku
See All by Takumi Shotoku
TypeProf 開発レポート 2026-05 / TypeProf Dev Report 2026-05
sinsoku
1
84
Automatically generating types by running tests
sinsoku
4
14k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
8
2.8k
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
300
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
340
"型"のあるRailsアプリケーション開発 / Typed Rails application development
sinsoku
10
3k
Let's get started with Ruby && Rails Tips
sinsoku
0
490
LTの敷居を下げる / Lower the threshold for LT
sinsoku
2
430
CircleCIの高速化🚀 / CircleCI faster
sinsoku
3
1.5k
Other Decks in Technology
See All in Technology
みんなの考えた最強のデータ基盤アーキテクチャ'26前期〜前夜祭〜ルーキーズ_資料_遠藤な
endonanana
0
350
Purview 勉強会報告 Microsoft Purview 入門しようとしてみた
masakichixo
1
420
AI 時代の Platform Engineering
recruitengineers
PRO
1
200
Claude Codeウェビナー資料 - AWSの最新機能をClaude Codeで高速に検証する
oshanqq
0
800
毎日の作業を Claude Code 経由にしたら、 ノウハウがコードになった
kossykinto
1
1.4k
2026-05-14 要件定義からソース管理まで!IBM Bob基礎ハンズオン
yutanonaka
0
160
PdM・Eng・QAで進めるAI駆動開発の現在地/aidd-with-pdm-eng-qa
shota_kusaba
0
240
AI-Assisted Contributions and Maintainer Load - PyCon US 2026
pauloxnet
1
150
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.6k
Terragrunt x Snowflake + dbt で作るマルチテナントなデータ基盤構築プラットフォーム
gak_t12
0
170
会社説明資料|株式会社ギークプラス ソフトウェア事業部
geekplus_tech
0
260
カオナビに Suspenseを導入するまで / The Road to Suspense at kaonavi
kaonavi
1
460
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
300
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
140
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.4k
Claude Code のすすめ
schroneko
67
220k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
230
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
180
A Soul's Torment
seathinner
6
2.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
Visualization
eitanlees
150
17k
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を導入して、触ってみましょう!💎