$30 off During Our Annual Pro Sale. View Details »
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
4
12k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
8
2.6k
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
280
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
320
"型"のある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
2
410
CircleCIの高速化🚀 / CircleCI faster
sinsoku
3
1.5k
💎のつくりかた 2023 / How to make gems 2023
sinsoku
2
450
Other Decks in Technology
See All in Technology
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
400
生成AIを利用するだけでなく、投資できる組織へ / Becoming an Organization That Invests in GenAI
kaminashi
0
110
AIエージェント開発と活用を加速するワークフロー自動生成への挑戦
shibuiwilliam
4
280
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.7k
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
500
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
380
ウェルネス SaaS × AI、1,000万ユーザーを支える 業界特化 AI プロダクト開発への道のり
hacomono
PRO
0
140
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
260
Python 3.14 Overview
lycorptech_jp
PRO
1
120
コンテキスト情報を活用し個社最適化されたAI Agentを実現する4つのポイント
kworkdev
PRO
1
1.6k
生成AI時代におけるグローバル戦略思考
taka_aki
0
200
Microsoft Agent 365 についてゆっくりじっくり理解する!
skmkzyk
0
380
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Building an army of robots
kneath
306
46k
BBQ
matthewcrist
89
9.9k
[SF Ruby Conf 2025] Rails X
palkan
0
540
For a Future-Friendly Web
brad_frost
180
10k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Done Done
chrislema
186
16k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Language of Interfaces
destraynor
162
25k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
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を導入して、触ってみましょう!💎