Slide 1

Slide 1 text

福岡Rubyist会議05 Shia@STORES 型を書かないRuby開発への挑戦

Slide 2

Slide 2 text

SIM SANGYONG (@shia) - STORES株式会社 - GitHub: @riseshia - X: @riseshia 自己紹介 2

Slide 3

Slide 3 text

質問です 3 Rubyで型を書きたいですか?

Slide 4

Slide 4 text

お気持ち 4 型を書きたくない!!

Slide 5

Slide 5 text

正確なお気持ち 5 Ruby では型を書きたくない!!

Slide 6

Slide 6 text

そしてただのワガママ 6 Ruby では型を書きたくない!! でも型情報はちょっとほしい

Slide 7

Slide 7 text

Ruby 型マップ 7 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 提供される情報の品質

Slide 8

Slide 8 text

Ruby 型マップ 8 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 型宣言が前提。方向が違う 提供される情報の品質

Slide 9

Slide 9 text

Ruby 型マップ 9 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 丁寧な推論 大規模アプリだと少々重い gem は rbs 書いてね 提供される情報の品質

Slide 10

Slide 10 text

Ruby 型マップ 10 型宣言依存度 Ruby LSP Guessed type typeprof solargraph 欲しいアプローチは近いが Hash/Array が情報不足 あと ruby-lsp と機能重複... Steep / Sorbet 提供される情報の品質

Slide 11

Slide 11 text

Ruby 型マップ 11 型宣言依存度 Ruby LSP Guessed type typeprof solargraph 変数名ベースの単純推測のみ 提供される情報の品質 Steep / Sorbet

Slide 12

Slide 12 text

Ruby 型マップ 12 型宣言依存度 Ruby LSP Guessed type typeprof solargraph この辺の何かがほしい 提供される情報の品質 Steep / Sorbet

Slide 13

Slide 13 text

推論の精度を落とし 自分が書く型の必要性を減らす・速度を得る 欲しいもの 13

Slide 14

Slide 14 text

- 推論された型が複雑なら untyped に - A or B or C or D… -> untyped でいいでしょう! - Hash / Array に Structural Typing サポート - ヒューリスティックに依存する どうやって? 14

Slide 15

Slide 15 text

Structural Typing - Hash 15

Slide 16

Slide 16 text

Structural Typing - Array 16

Slide 17

Slide 17 text

Duck Typing を信じる 17 通常の Duck Typing: 「これらのメソッドに応答できるなら、OK」 🦆 quack できるなら → アヒル type-guessr: 「これらのメソッドが呼ばれたなら、このクラスのはず」 🦆 quack が呼ばれた → きっとアヒル

Slide 18

Slide 18 text

Duck Typing を信じる 18

Slide 19

Slide 19 text

Duck Typing を信じる 19

Slide 20

Slide 20 text

Duck Typing を信じる 20

Slide 21

Slide 21 text

対象: LOC 100k 以上の Rails プロジェクト三つ 変数に送ったメソッド一覧から、変数(レシーバ)の型がわかる比率 => 10~20% Duck Typing を信じる - そんな〜うまくいくんですか? 21

Slide 22

Slide 22 text

Duck Typing を信じる in type-guessr 22

Slide 23

Slide 23 text

- ruby-lsp の UX にそのまま溶け込める - 適切に実装すれば hover, autocompletion, 定義ジャンプが「型 がわかれば」自動で効く - ruby-lsp-rails, ruby-lsp-mongoid 等が ruby-lsp に登録する DSL 由来のメソッド一覧をそのまま活用できる - Duck typing ヒューリスティックではめっちゃ大事 設計 - Impl as ruby-lsp add on 23

Slide 24

Slide 24 text

設計 - How to infer - Duck typing によるクラス推定を頑張る - 自明なものを頑張る(e.g. Hoge.new) - あとは型情報を使って伝播していく - 型推論の結果が一定以上複雑になったら精度を落とす 24

Slide 25

Slide 25 text

- 十分小さいアプリでは価値が出にくい (メソッド名の一意性に依存) - ActiveRecord とかが大変扱いづらい... - 速度が遅い問題 - ruby-lsp のインデッシングを待つ必要がある - 推論が重い - Diagnostic 出しづらい問題 - ヒューリスティックを混ぜたことでどう出すべきかという悩み Limitation 25

Slide 26

Slide 26 text

今色々いじりまくっており unstable ですが どうぞお試しください (そしてフィードバックがあると喜びます) bundle add type-gusser -g=’development’ https://github.com/riseshia/type-guessr 最後に 26