DevinとGitHub Copilotエージェントで1人エンジニアチームを作りたい – もう少し使ってみた編

こんにちは。てぃろです。

以下の記事に引き続いて、AIエージェントを使ってもう少し開発をしてみたところ、さらにわかってきたことがあるのでまとめます。

ただしこれは、2025/5月末時点の情報です。AIはモデルとしての性能もさることながら、その周辺のサービスとしての機能も急速に成長するので、それに留意してご覧ください。

開発の条件は以下のとおりです。

  • 言語:Go言語
  • クラウド:GCP
  • IaC:terraform

また、今回はエンジニアチームとして人間のように振る舞ってほしいと思っているので、プロンプトにおいてもあえて抽象的な言い方を中心に試しています。具体的にどんなコマンドを打って、などという細かな言い回しはしないようにしています。

CIの結果を見てくれるDevinと見てくれないCopilotエージェント

直感に反して逆の結果でした。

Devinは自分でghコマンドを実行して結果のログを見てから次のことを進めますが、Copilotエージェントは結果を見ることなく予想でコードを修正していてトンチンカンなことをしていました。

プロンプトで「CIの結果を見て」などと入れてもだめで、ghコマンドを打つような気配もありませんでした。やはり具体的なコマンドを指定しないとだめなのかもしれません。

Goのバージョンを勝手に変えてくる(両エージェントとも)

Cloud Functionsで利用可能なGoのバージョンに関する知識が古いらしく、関係ない修正をしていてもなぜかGoのバージョンを1.22以下に落とそうとすることがありました。プロンプトで1.23のままにして、と言っても聞いてくれなかったりします。

今回は個人でとにかく作り始めたので、仕様やコーディングルールなどを定めていなかったのですが、エージェントを使う場合には必須の設定ですね。それでも聞いてくれるのかはちょっとわからない気もします。

最近だと、Claud Codeが進化していて、CLAUDE.mdなどのファイルを用意してインポートするとその設定の通りにAIの挙動を制御できるそうです。

そういった設定ですら雛形から完成品までAIで作成できると思うので、リポジトリ内に作成しておいて、コーディングを指定する際には必ずコンテキストに含めるようにするといいかもしれないですね。

Cloud Functionsの関数をローカルで動かしたいというとやたらとサーバーを立てたがる(Copilot)

Cloud Functionsで実行できるように作っている関数も、動作確認やたまの任意の実行をしたいときのためにローカルで動かせるようにしたいことがあります。

そこで一度雑に「ローカルで動かせるようにして。go run main.go で実行できるようにして」と指示してみたのですが、Cloud Functionsのハンドラはhttpに関する型の引数を持っているからか、サーバを起動してしまうような実装をしてきました。

それ自体は関数をよく見ていると言えるのですが、今回やりたかったこととは違ったのでイマイチな仕事でした。「サーバを立てないで」とつけてもだめで、もう少し具体的に「型を無視して」などと指示しないと伝わらないですね。もはやそこまで書くなら自分で書いたほうが早いまでありますが…。

CIが成功すればよいという指示では、とりあえずCIを成功させちゃう(Devin)

CIが成功するように直して、という指示だけだと、とりあえず成功するだけの修正をしてしまいます。つまり、肝心のエラーハンドリングをスキップするだけの修正をしてきます。

つまり、そのコードを入れた意図を汲み取ってくれておらず、その処理やユースケースとして特有のコードであるような場合に起こるようです。これは人に依頼しても似たようなことがたまに起こりますよね。

ということは、人に対しても同じであるように、そういうコードの意図をきちんと伝えることが必要だということで、プロンプトなどでコードの意図を伝える必要があるようです。現実的にはそのコード特有の話であればきちんとコメントを入れておくとかがいいかもしれないですね。

Goのファイル分割が見事だった(Copilot)

個人で開発しているコードだったので、Cloud Functionsの実装を1ファイルに全部詰め込んでいました。

でも少し長くなりすぎていたので、そろそろ分割したいなーと思っていたところ、雑にCopilotに分割してもらうように依頼しました。

そうすると、かなりうまく分割してくれました!関数ごとの役割を理解し、適切にファイル分けしてファイル名をシンプルに作成し、テストも同じように分けてくれました。

ただし、今回のケースは同一ディレクトリ内において1ファイルを複数ファイルに分けるということで少し簡単めな条件なのかと思います。これをさらにディレクトリに分けるとかパッケージを分割するとかが入ってくるとどうなるのかなと思います。

特に、ディレクトリを分けてしまうと、コード内でimportの参照パスが変わったりするので、それをいい感じに修正してほしいと期待しますね。たぶんできるんじゃないかなーと思いますけど、これはまだちゃんと試してないです。

最後に

AIエージェントを使っての開発で軽くやってみたことを紹介していきました。

なにをしてもらうにも、人間と同じようにコンテキストが非常に大事で、これを伝えることをサボると意図しないことをしはじめるというのは仕方ないことですね。AIエージェントを使う際には、これを意識してきっちりと意図を伝える方法を考えないといけないですが、人間と同様の言い方でもだめなので、AIエージェントに指示することに特化した指示文や自分のメンタルモデルを作っていかないといけないですね。

ただ、毎回プロンプトに前提条件も含めて細かなことを書きまくるのは時間も労力もかかる非常に面倒なことではあります。ここが理解のあるエンジニアの方に依頼するときには抽象的な言い方でよしなにやってくれるけど、まだ入って日の浅いエンジニアの方には懇切丁寧に話さないといけない、みたいな状況と同じなんですよね。

でもAIは人間と違って実際に時間をかけて経験しなくても、事前にコンテキストをインプットする方法がそれなりにありそうです。例えば、

  • リポジトリ内にコーディングルールを定めておき、AIの起動時には必ずそれを参照するようにプロンプトで指示する
  • ソースコードの中に、そのコードの意図を書いておき、AIの起動時には必ずそのコメントも加味するようにプロンプトで指示する

などでしょうか。結局プロンプトで参照することを強制はするのですが、それをAIの仕組みによっては毎回自分で打たなくても、テンプレートのようにそれを自動で打ち込むようなアプリも出てきているので、そういうものを整備することでより1人エンジニアチームに近づくのかなと思いました。

最近は、MCPサーバもかなり盛り上がっていますので、そのへんもうまく使うといいのかもしれません。