この記事は、Thoughtworks の技術者たちがソフトウェア開発における生成 AI の探究を記録している martinfowler.com の「Exploring Gen AI」シリーズの一編であり、サービステンプレートにまつわる問題から出発している。サービステンプレートは、組織の最新のコーディングパターンと標準を常に備えた手本となることを意図したものだが、チームがテンプレートからサービスを一度インスタンス化してしまうと、その後のテンプレートの更新をそのサービスに反映させるのは手間がかかる。著者は生成 AI がこれを助けられるかを問い、リファレンスアプリケーションの前段に置いた Model Context Protocol サーバーを基盤とする実験について報告している。
実験は 2 つの部分から成る。リファレンスアプリケーションを、コーディングアシスタントが作業の拠り所とするコードサンプルの提供元として使う部分と、次にそれを使って、既存のコードベースがリファレンスからドリフトしている箇所を見つけて解消する部分である。後者は、記事が コードパターンのドリフト検出 と呼ぶ手法である。
要点
- 求める出力の例を LLM に与えると結果が良くなる。著者はこれを確立されたプロンプティングの実践と呼んでおり、few-shot プロンプティングやインコンテキスト学習としても知られている。
- 自然言語の Markdown プロンプトファイルの中にコードサンプルを書くのは手間がかかるうえ、それらがコンパイルできるか、互いに一貫しているかを確かめる手段がない。サービステンプレートのように、コンパイルして実行できるリファレンスアプリケーションにサンプルを置いておけば、コンパイル可能で一貫したサンプルを AI に与えるのがずっと容易になる。著者の実験では、MCP サーバーによって、Spring Boot の Web アプリケーションのリポジトリ、サービス、コントローラーの各クラスについて、そのようなサンプルにコーディングアシスタントがアクセスできるようにした。
- AI を使ったかどうかにかかわらず、テンプレートから生成され、その後拡張・保守されたコードベースは、リファレンスアプリケーションからドリフトしていくことが多い。
- リファレンスアプリケーションの git コミットを同じ MCP サーバー経由で公開し、まずリファレンスにおける実際の変更を探すようエージェントに求めることで、著者はエージェントが探すドリフトの範囲を絞り込むことができた。この手順を踏まずに、リファレンスのコントローラーと既存のコントローラーを単純に比較するよう AI に求めると、無関係な比較が大量に生じた。著者は、コミットによる範囲の絞り込みが良い効果をもたらしたと報告しているが、これはリファレンスのコントローラーにロガーと
log.debug文を追加するという、意図的に単純にしたテスト用の変更でのことである。 - プロセスは 2 段階で進められた。AI はまずドリフトレポートを作成し、著者はそれをレビュー・編集して無関係な指摘を取り除いた。そのうえで AI に、レポートが特定したギャップを解消するコードを書かせた。
- ロガーの追加やロギングフレームワークの切り替えのような単純な変更であれば、OpenRewrite のような codemod ツールで決定論的に行える。著者は、AI に手を伸ばす前にそれを検討すべきだと述べている。AI が新たな価値をもたらすのは、ドリフトの解消に、正規表現ベースの codemod レシピでは対応できないほど動的なコーディングが必要な場合であり、例えば、標準化されていない多種多様なログメッセージを構造化された形式に変換するといったケースである。
背景
記事はこれを、著者が以前に書いたより大きな実験から派生した、著者自身による 1 つの実験として提示している。その知見は、何らかの計測ではなく、その実験と 1 つの単純な例に基づいている。例として使われた MCP サーバーは、その以前の記事に付随するリポジトリで公開されている。