Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Taming Large Codebases with Kiro: Lessons from a 58K-LoC Rust Migration

2025年09月24日に「Dev.to」が公開したITニュース「Taming Large Codebases with Kiro: Lessons from a 58K-LoC Rust Migration」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

AIアシスタントKiroが、PostgreSQLの膨大なC言語コードをRust言語に移行する大規模プロジェクトを実施した。Kiroは複雑な問題を分解し、コード整理や重複防止のガイドラインを適用。結果、約5.8万行のRustコードで動作するPostgreSQLサーバーとクライアントを構築した。ビルド時間短縮やデバッグ効率向上などの成果を上げた。

ITニュース解説

大規模なプログラムを開発する際、膨大な量のコードを管理することは、たとえ熟練したエンジニアであっても大きな課題となる。最近ではAIアシスタントが小さなタスクをこなすのは得意になったが、数百万行にもなる巨大なコードベースの全体像を把握し、効率的に開発を進めることにはまだ苦労することが多い。Kiroは、そのような大規模なコードベースをAIの力を借りて効率的に管理し、開発を進めるためのツールである。この記事では、Kiroを使って、既存の非常に大規模なソフトウェアを新しいプログラミング言語であるRustに移行するという挑戦的なプロジェクトがどのように進められたか、そしてそこから得られた教訓を説明する。

Kiroの能力を試すために選ばれたのは、世界中で広く使われているデータベース管理システムであるPostgreSQLだった。PostgreSQLはC言語で書かれており、そのコード量は150万行にも及ぶ。これをRustという別の言語で再実装することを目指したのだ。このプロジェクトでKiroと連携したのは、Anthropicが開発したClaude Sonnet 4という大規模言語モデルである。Claude Sonnet 4の学習データにはPostgreSQLのオープンソースリポジトリが多く含まれていたため、Kiroはコードベースの構造をある程度理解した状態で作業を開始できたという利点があった。最終的に、Kiroは58,478行のRustコードを生成し、PostgreSQLサーバーとクライアントの核となる「UPSERT」(挿入または更新)機能を持つバージョンを構築することに成功した。これは、C言語の既存コードのすべてをRustに置き換える完全な移行ではないものの、大規模なソフトウェアの特定機能をAIアシスタントが再実装できることを示す大きな成果である。

Kiroがこのような複雑なプロジェクトに取り組む際には、いくつかの専用ツール「MCP Server」を組み合わせて使用した。特に重要だったのは、「sequential-thinking」と「git-repo-research」である。「sequential-thinking」は、複雑な移行作業の仕様を小さなステップに分解し、反復的に思考を重ねながら問題を解決する能力を持つ。これは、一直線に進むのではなく、途中で見つかった課題に応じて考え方を見直したり、別の方法を試したりすることで、依存関係や例外ケースを系統的に処理することを可能にした。「git-repo-research」は、GitHub上のリポジトリを検索したり、特定のファイルにアクセスしたりする機能がある。これにより、KiroはPostgreSQLの既存コードベースから設計パターンや実装戦略を学び、自身の開発に活かすことができた。

大規模なコードベースをAIアシスタントに任せるにあたり、開発者はKiroを効率的にガイドするための3つの重要な原則を設定した。その一つが「可視性(Visibility)」である。「Kiroがそれを見なければ、それは起こらなかったことになる」という考え方で、AIがシステムの内部状態、特にテストの結果を正確に把握できるようにすることが極めて重要だった。Kiroがプログラムのテストを実行する際、シェル(コマンドを実行する環境)の連携に問題があると、テストが実際には失敗していても、Kiroはコマンドが成功したと誤解してしまうことがあった。これを解決するため、「2>&1 | tee compilation_errors.log」のようなコマンドが使われた。これは、通常画面に表示されるエラーメッセージ(標準エラー出力)を通常の出力(標準出力)にまとめ、さらにその内容を画面と同時に「compilation_errors.log」というファイルにも記録するというテクニックである。これにより、Kiroはログファイルを分析することで、テストが実際に失敗したのか、あるいはコンパイルエラーが発生したのかを正確に確認できるようになった。この工夫が、Kiroが架空の「成功したテスト」をデバッグするために無駄な時間を費やすことを防ぎ、デバッグの効率を大幅に向上させた。

二つ目の原則は「整理(Organization)」である。「すべてのファイルには置き場所がある」という考え方で、コードベースが散らかるのを防ぐためのルールが設けられた。大規模なプロジェクトでは、たくさんのファイルが作られるため、どこに何があるか分からなくなりがちである。Kiroには、プロジェクトのルートディレクトリに直接ファイルを作成することを禁じ、ドキュメントは「docs/{spec-name}/」に、検証スクリプトは「scripts/verification/{spec-name}/」に、一時的なテストファイルは「crates/{crate}/tests/temp/」のように、明確に決められた場所に置くように指示された。また、ファイル名には「{spec-name}」のような接頭辞を付け、どの仕様に関連するものかを明確にした。一時的なファイルやログファイルは、使用後すぐに削除するか、「tempfile」というクレート(Rustのライブラリ)を使って本当に一時的なファイルを生成し、自動で削除されるようにした。これにより、Kiroが作成するファイルが秩序だって管理され、コードベースが混沌と化すのを防ぐことができた。

三つ目の原則は「効率性(Efficiency)」である。「コードを書く前に検索する」というもので、同じ機能を何度も作成する無駄を避けるための重要な指針である。新しい機能を実装する前に、Kiroは「rg "fn.*storage.*persist" --type rust」のようなコマンドを使って、コードベース全体を検索し、似たような関数や構造体、あるいは関連する実装が既に存在しないかを確認するように指示された。これにより、既存の機能を再利用したり、他の開発者が作ったものと重複するコードを書いたりするのを防ぐことができる。Rust言語特有のルールとして、複数のモジュール(クレート)で構成されるプロジェクトでは、「rustc」コマンドを直接使うのではなく、「cargo build --workspace」のように、「cargo」コマンドを適切に使うことが強調された。これにより、依存関係が自動的に解決され、プロジェクト全体のビルドがスムーズに行われる。また、テストも「cargo test --workspace」で全体を、「cargo test --package postgres-storage」で特定のモジュールだけを実行するなど、効率的なワークフローが確立された。さらに、「.gitignore」ファイルを使って、ビルド生成物やログファイル、一時ファイルなど、バージョン管理システムに含める必要のないファイルを適切に除外することで、リポジトリの清潔さを保つ努力も行われた。

Kiroの作業をさらに効率化するため、いくつかの自動化された「エージェントフック」も導入された。例えば、タスク完了後には「tokei --output json」というコマンドが自動的に実行され、現在のコードの行数統計(Lines of Code, LoC)を取得し、その情報を「README.md」ファイルに自動で更新するように設定された。これにより、プロジェクトの進捗状況やコードベースの規模が常に最新の状態に保たれた。その他のKiroを効率的に使うためのヒントとして、Kiroのプロジェクトディレクトリを移動すると過去のセッション履歴が失われるため、重要なセッションはタスクの要約として保存することが推奨された。また、cargoコマンドは常にプロジェクトのワークスペースルートから実行し、重複するビルドディレクトリが作成されるのを防ぐべきだとされた。Kiroが出力する情報が多すぎるとAIアシスタントのコンテキスト(作業記憶)がすぐに埋まってしまうため、テストの出力を最小限に抑えたり、--no-cli-pagerオプションを使ってAWS CLIのようなコマンドが大量の対話式出力を生成しないようにしたりする工夫も重要だとされた。

最終的にRustで構築されたPostgreSQLサーバーとクライアントは、実際に機能するかどうかを検証された。開発された./target/release/postgres-serverを起動し、./target/release/psqlクライアントを使ってデータベース操作を行った。具体的には、「CREATE TABLE」でテーブルを作成し、「INSERT」でレコードを挿入、その後「SELECT」でデータが正しく入っているかを確認した。さらに「UPDATE」でレコードを更新し、再び「SELECT」で変更が反映されているかを検証した。これらのテストはすべて成功し、Rustで実装されたPostgreSQLクライアントが、基本的なデータベース操作、特にUPSERT機能を含む更新処理を問題なく実行できることが証明された。サーバーを再起動して更新が永続化されることも確認され、Kiroが生成したコードが実際に動作する安定したデータベース機能を提供していることが示された。

このKiroを使った大規模なコード移行プロジェクトは、具体的な数値でその効果が示されている。例えば、targetディレクトリのようなビルド生成物をリポジトリから除外することで、リポジトリのサイズを削減できた。適切なワークスペース構造を採用したことで、ビルド時間は15%高速化された。最も顕著な成果の一つは、テストが失敗しているにもかかわらずAIが「成功した」と誤解するような偽陽性(false-positive)のテスト結果が80%も減少したことである。これは「可視性」の原則が大きく貢献した結果である。さらに、新しいコードを書く前に既存のコードを検索する習慣を徹底したことで、開発された関数の23%が既存の実装を再利用できたという。これらの数値は、Kiroが大規模なソフトウェア開発において、AIの能力を最大限に引き出し、効率的で高品質なコードを生成するための強力なツールであることを明確に示している。

関連コンテンツ

関連IT用語