マルチPaxosエンジンの構築:AI生成Rust 10万行から得た教訓

スクラッチから本番レベルの分散システムを構築しようとする野望は、膨大なボイラープレートと、並行環境での正確性を保証する極めて困難な作業によってしばしば阻まれます。しかし、Azure の Replicated State Library(RSL)—マルチPaxos コンセンサスエンジン—の近代化に関する最近のプロジェクトは、AI コーディングエージェントが技術的厳密さを犠牲にせずに開発サイクルを劇的に加速できることを示しています。

AI ツール群を活用することで、開発者は数週間で 130,000 行以上の Rust コードを実装し、パフォーマンスを 23K から 300K オペレーション/秒へと最適化しました。このプロジェクトは、スケールでの「バイブコーディング」の事例研究であり、ハイレベルなアーキテクチャ指針と AI 主導の実装を融合させたものです。

課題:レガシーバックボーンの近代化

Azure の RSL は、10 年以上にわたり多くの Azure サービスのレプリケーションの中核として機能してきました。堅牢ではあるものの、現在のクラウドデータセンターで標準となっているハードウェア機能への対応が不足していました。具体的に、本プロジェクトは次の 3 つの重要なギャップを埋めることを目指しました。

  1. パイプライン化の欠如:元の RSL では、投票が飛行中の間に新しいリクエストがブロックされ、レイテンシが増大していました。
  2. NVM 未対応:不揮発性メモリ(NVM)への対応がないため、コミット時間が必要以上に長くなっていました。
  3. ハードウェア認識の限定:システムは RDMA(Remote Direct Memory Access)に最適化されておらず、現在の Azure 環境では広く普及しています。

AI 加速ワークフロー

この規模の生産性を実現するために、開発者は CLI ベースのエージェント(主に Claude CodeCodex CLI)を組み合わせ、VS Code で差分確認や軽微な編集を行いました。ワークフローは、硬直した文書中心のアプローチから「軽量スペック駆動開発」モデルへとシフトしました。

軽量スペック駆動開発(SDD)

コードとすぐに食い違う膨大な要件・設計文書を維持する代わりに、開発者はよりアジャイルなプロセスを採用しました。

  • Specification(仕様)spec-kit などのツールを使って、ユーザーストーリーと受け入れ基準を含むスペック Markdown を生成します。
  • Clarification(明確化)/clarify コマンドで AI に自己批評を促し、欠落しているエッジケースや代替実装パスを提案させます。
  • Planning(計画):作業を単一のユーザーストーリーに分割します。これは、AI エージェントがコンテキストを失わずに効果的に管理できる「甘いスポット」と著者が位置付けています。

正確性の確保:コードコントラクト

AI 支援コーディングにおける最大のハードルの一つは、生成コードが「ブラックボックス」になることです。これに対抗するため、プロジェクトは コードコントラクト—重要関数の事前条件、事後条件、そして不変条件—を導入しました。

これらのコントラクトは三層防御として機能します。

  1. AI 生成コントラクト:GPT‑5 High などの高性能モデルがコントラクト自体を書きます。
  2. ターゲットテスト:AI がコントラクトで定義された事後条件を刺激する具体的テストケースを生成します。
  3. プロパティベーステスト:コントラクトをプロパティベーステストに変換し、ランダム入力空間を探索して深層かつ微妙なバグを発見します。

この手法は、AI が生成したコントラクトが微妙な Paxos の安全性違反を検出したときにその価値を証明しました。もしこの違反が見逃されていれば、深刻なレプリケーション整合性問題につながしていたでしょう。

積極的なパフォーマンスチューニング

正確性が確立した後、開発者は 3 週間にわたってパフォーマンスエンジニアリングに取り組みました。AI はコードを書くだけでなく、閉ループ最適化サイクルにおけるデータアナリストとしても活躍しました。

  • Instrumentation(計測):AI が全コードパスのレイテンシ指標を計測します。
  • Analysis(分析):AI が Python スクリプトを書き、トレースログを解析し、ボトルネックを特定するために分位点を算出します。
  • Optimization(最適化):AI が最適化案(割り当ての最小化、ゼロコピー技術、非同期オーバーヘッドの除去など)を提案・実装します。
  • Verification(検証):パフォーマンスを再測定し、改善効果を検証します。

この反復プロセスにより、スループットは約 23K ops/sec から約 300K ops/sec へと単一ノートPC上で大幅に向上しました。

批判的視点と反論

生産性向上は驚異的ですが、プロジェクトは AI 生成 Rust の品質について開発者コミュニティ内で大きな議論を呼び起こしました。

「AI スロップ」への懸念

批判者の中には、元の RSL ライブラリがわずか 36K 行の C++ であったのに対し、AI が生成した Rust バージョンが 130K 行に達したことを指摘し、簡潔さの欠如「スロップ」 の可能性を指摘する声があります。

"Rust はもっと表現力が高く簡潔であるべきです。にもかかわらず AI が 130k LoC を生成しました。誰もこのコードがどう動くか理解できず、実際に動作するかどうかも判断できません。"

イディオマティック Rust の問題

もう一つの共通批判は、AI が Rust の borrow checker と格闘する際に非慣用的なコードを書きがちである点です。コンパイラを通すために、AI エージェントは過剰な .clone() 呼び出しや Arc<Mutex<...>> での過剰ラップに走ります。

"LLM は目標まで一直線に進む。問題:コードがコンパイルしない。解決策:もっと clone() を使う"

このことは、AI が 安全性(コードがコンパイルしテストを通過する)を達成できても、活性度効率性 の面で、borrow checker エラーを解決するために必要なアーキテクチャ的思考を回避している可能性を示唆しています。

将来展望

本プロジェクトは、より自律的な AI エージェントのビジョンで締めくくられます。著者は、AI がエンドツーエンドのユーザーストーリー実行、コントラクトからテストへの全工程自動化、そして人間の介入なしにパフォーマンス実験を実施できる未来を描いています。業界が「バイブコーディング」へと移行する中で、アーキテクトの役割はコード行を書くだけから、システムの制約・コントラクト・目標を定義することへとシフトします。

Sources