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