Formatting an entire 25 million line codebase overnight: the rubyfmt story
https://stripe.dev/blog/formatting-an-entire-25-million-line-codebase-overnight-the-rubyfmt-story
Fable TalesとAnna MasonによるStripeのrubyfmtについての記事
Developer ProductivityチームがRust製のzero-configなautoformatterを世界最大のRubyコードベースに展開した話
rubyfmtの起源
2018年のRubyConfでの会話が発端
当初はRubyで実装され、ripperというパーサーを利用していた
zero-config・超高速・自動整形を目指したフォーマッターである
思想的にはgofmtやrustfmtと同系列
Rustへの書き直し
性能上の理由からRustへリライト
バイナリにRuby VM全体をリンクする構成を採った
Rubyの内部表現であるVALUEオブジェクトをRust側へ直接デシリアライズ
独自のserde deserializerを実装した
フォーマット時間の予算は1ファイルあたり100ms以下に設定
Prismパーサーへの移行
新しいPrismパーサーへ移行することでRuby VM依存を排除
バイナリからRuby VMを切り離せるようになった
配布やビルドの容易さが向上
Stripeへの展開戦略
段階的なopt-in方式でロールアウト
正しさの検証にはripper-tree diffingを用いた
フォーマット前後でASTが一致することを確認
ある土曜の朝に62,213ファイルを一括フォーマット
現在はStripeのRubyコードの100%がrubyfmtでフォーマットされている
成果
エンジニアからは「ほぼ見えない・摩擦のないフォーマット」との評
大規模コードベースへのツール展開における移行戦略の好例
StripeのRuby関連インフラ投資の一環
Sorbet(型チェッカー)やSelective Test Executionなどと並ぶ取り組み
関連
Sorbet
Selective Test Execution
gofmt
rustfmt
ripper
Prism