Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Railsアプリと型検査 / Rails app and type checking
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takumi Shotoku
November 15, 2023
Technology
1.7k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
150
Automatically generating types by running tests
sinsoku
4
19k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
8
2.9k
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
320
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
360
"型"のあるRailsアプリケーション開発 / Typed Rails application development
sinsoku
11
3.1k
Let's get started with Ruby && Rails Tips
sinsoku
0
520
LTの敷居を下げる / Lower the threshold for LT
sinsoku
2
450
CircleCIの高速化🚀 / CircleCI faster
sinsoku
3
1.6k
Other Decks in Technology
See All in Technology
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
150
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
750
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
110
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
310
事業課題から技術的負債に向き合う
sansantech
PRO
2
2.4k
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
190
AIエージェント時代のPlatform as a Product —— テックリードがPdMとして回す発見・導入・計測 / Platform as a Product in the AI Agent Era
toshi0607
0
190
ほんとうの信頼性はヒーローが死んでからはじまる / True reliability begins after the hero dies
vtryo
0
120
AI Agent入門〜今更聞けないAgentの話〜
hiromimaganuma
0
120
AI coding 整合正規方法
philipz
0
550
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
160
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
100
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Prompt Engineering for Job Search
mfonobong
0
460
How to make the Groovebox
asonas
2
2.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Technical Leadership for Architectural Decision Making
baasie
3
580
A better future with KSS
kneath
240
18k
Faster Mobile Websites
deanohume
310
32k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Agile that works and the tools we love
rasmusluckow
331
22k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
GitHub's CSS Performance
jonrohan
1033
470k
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を導入して、触ってみましょう!💎