Amazon Q Developer の「/dev」で Q 自身にビルド&テストをさせてからコードの提案をしてもらう
いわさです。
先日 Amazon Q Developer がついに日本語に対応しましたね。
私は最近社内開発時に Amazon Q Developer をできるだけ使用するようにしておりまして、色々良さそうな使い方を探っているところです。
特に/devによる機能開発をよく使っています。
/devはエディタ上のコード提案や、チャットベースでのコードブロックの提案とは異なり、リクエストした内容に従ってワークスペースやコンテキストを解釈し、既存コードに変更を反映したり、新しいモジュールの作成を行ってくれる機能です。
先日の Amazon Q Developer に日本語サポート時にこの機能も日本語をサポートしました。
チャットと異なり応答メッセージは英語なのですが、コード生成時の変更サマリを見てみると指示した日本語をしっかり認識してくれています。

動かないコードを提案されることがある
とても便利な機能で私は最近毎日のように/devのお世話になっているのですが、提案してもらったコードをまぁ良さそうだなと思って反映すると、予期せぬ動きをしていたり、そもそもシンタックスエラーが発生していたりビルドに失敗したりすることがあります。

API を追加するコードの提案

ビルドエラーが発生するようになってしまった
プルリクエストのレビューとかもそうだと思うのですが、前提としてコンパイルエラーが出なかったり、ユニットテストに成功していたり、ある程度の品質は前提とした上でコードを取り込むかどうか判断したいですよね。
devfile.yaml を使ってにコード提案前にビルドやテストをさせる
デフォルトだと Amazon Q はテストなどしてくれません。
が、devfile.yamlというファイルをプロジェクトのルートフォルダに用意しておくことで、提案前の修正案を考えたタイミングで Q Developer が開発環境でビルドやテストをしてくれます。すごい。
Q Developer は分離された開発環境を用意してビルドとテストを行い、コードに問題があるようであればコード提案をせずにもう一度修正してテストをしてくれます。
最大 3 回まで繰り返し、問題がなくなった時点でようやく利用者へコードの提案をしてくれるようになります。
devfile.yaml を生成する
前述のとおりdevfile.yamlを渡すことで、Q Developer がそれを検出してテストをしてくれるようになります。
用意する方法ですが上記ドキュメントのように手動でファイルを用意することも出来ますし、/dev機能を使った時にdevfile.yamlが存在していなければ生成させることも出来ます。
/devでコード提案された際、通常は提案されたコードで完了していれば「No, thanks」を、追加の修正が必要な場合は「Yes, I have another task」を選択すると思いますが、「Generate devfile to build code」という選択肢があります。スルーしてました。

上記のボタンを押すと、追加のタスクとして devfile.yaml を Q Developer が自動生成してくれます。

/devの他のコード生成と同じで、「こんなのでどうですか?」と聞いてくるので内容を確認して Accept することでコードに反映がされます。

今回 .NET の最小プロジェクトで試してみたのですが、ファイル内容な次のようになっていました。restoreしてbuildしてtestしてます。なるほど、良いと思いますね。
schemaVersion: 2.0.0
components:
- name: dev
container:
image: public.ecr.aws/aws-mde/universal-image:latest
commands:
- id: install-build
exec:
component: dev
commandLine: "dotnet restore && dotnet build"
- id: test
exec:
component: dev
commandLine: "dotnet test"
devfile.yaml がある状態で /dev を使う
devfile.yamlがルートに配置されていると、あとは/dev実行時に自動で使ってくれます。試してみましょう。
Q Developer が「devfile.yaml を使ってビルドとテストしていいか?」と聞いてきますので許可しましょう。

そうすると一見通常どおりリクエストに従ってコードを考えてくれているのですが、コードの検討をした段階でdotnet restore && dotnet buildをしようとしています。devfile.yamlの内容に従ってますね。この時点ではまだ利用者へのコード提案はされていません。

で、ビルドしたところどうやら問題に気がついたようですね。
追加のコード修正をしようとしているようです。

そのサイクルを何度か繰り返し、最終的にはビルドが成功したコードを提案してくれました。
今回はテストコードを含んでいなかったのですが、テストコードが含まれていればエラーが出ないような修正をしてくれるものと思われます。

ただ、提案されたコードを見るとbinやらobjやら含まれており、自動生成系のコードやオブジェクトはいらんなという感じはします。まぁでもローカルでリストアやビルドすれば作られるし、コードとして管理されるかは.gitignoreなど次第なので、まぁあっても良いのかな...

さいごに
本日は Amazon Q Developer の「/dev」で Q 自身にビルド&テストをさせてからコードの提案をしてもらうdevfile.yamlを試してみました。
今回はテストコードがなかったのでプロジェクトリストアとビルドだけだったのですが、非常におもしろい機能ですね。
トライ&エラーをするのでその分コード生成までの時間が長くはなるのですが、テストコードがあればコード品質を保ちながらコード生成できそうです。






