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.5k
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
2
3.5k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
8
2.1k
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
230
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
270
"型"のあるRailsアプリケーション開発 / Typed Rails application development
sinsoku
10
2.7k
Let's get started with Ruby && Rails Tips
sinsoku
0
410
LTの敷居を下げる / Lower the threshold for LT
sinsoku
1
360
CircleCIの高速化🚀 / CircleCI faster
sinsoku
3
1.4k
💎のつくりかた 2023 / How to make gems 2023
sinsoku
2
380
Other Decks in Technology
See All in Technology
ここはMCPの夜明けまえ
nwiizo
29
11k
AWS全冠芸人が見た世界 ~資格取得より大切なこと~
masakiokuda
5
6.4k
サーバレス、コンテナ、データベース特化型機能をご紹介。CloudWatch をもっと使いこなそう!
o11yfes2023
0
180
4/16/25 - SFJug - Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
2
120
AI AgentOps LT大会(2025/04/16) Algomatic伊藤発表資料
kosukeito
0
150
Spring Bootで実装とインフラをこれでもかと分離するための試み
shintanimoto
7
870
生成AIによるCloud Native基盤構築の可能性と実践的ガードレールの敷設について
nwiizo
7
1.1k
Writing Ruby Scripts with TypeProf
mame
0
280
YOLOv10~v12
tenten0727
4
970
SDカードフォレンジック
su3158
1
630
AI Agentを「期待通り」に動かすために:設計アプローチの模索と現在地
kworkdev
PRO
2
470
Would you THINK such a demonstration interesting ?
shumpei3
1
230
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
23
2.6k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Embracing the Ebb and Flow
colly
85
4.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
47
2.7k
How to Ace a Technical Interview
jacobian
276
23k
Site-Speed That Sticks
csswizardry
5
500
Into the Great Unknown - MozCon
thekraken
37
1.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
RailsConf 2023
tenderlove
30
1.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
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を導入して、触ってみましょう!💎