あまり考えがまとまっていないのですが、書いてる途中にもいろいろ変化が出てきていつまでも完結しないので適当に書き出しておきます。来月にはもう別の考えになってそうです。
ほぼGitHub Copilot、補助でDevinです。趣味でClineを使うこともあります。Cursorは意図的に使ってません。Claude Codeはまだ手を出していません。
GitHub Copilot
なんだかんだで安定しています。Agentモード + Claude 3.7 Sonnet で結構な量のコードを書いています。
この記事を書き始めた時はAgentモードやNESの動作がまだ微妙でEditのほうが安定しているよねというような内容にしていたのですが、いつのまにかAgentモードで十分書けるようになっていたので、今はほぼAgentモードしか使っていません。NESも有効にしています。
ただしテスト結果のコンソール出力をちゃんと読んでくれないとかは相変わらずです。
Devin
縁があって使わせてもらっています。
Agentモードと同様の存在なのですが、モデルが違うせいか、Agentモードよりはコンテキストを読んでくれるし、生成内容はあまり外さない印象…でしたが、たまに無限ループします。
Devinのメリット
外部タスクなのでVSCodeを占領されないというメリットが一番大きいです。うまく使えると並行作業ができます。
テストの作成やコードレビューなどを中心に行ってもらっています。
注意点
あまり実行速度は早くないし、そこそこフィードバックを要求されるので、それなりに大きなタスクを要求したいところなのですが、大きなタスクだと失敗しがちなので、小さいタスクが複数ある状態で1つずつやってもらう、みたいなのがいいと思います。
テストコードの生成に関してだけ言えば、既存のファイルを修正させるより新規でファイルを作らせたほうが得意そうな印象です。
安くはないので個人開発ではあまり使う必要がないですが、チーム開発であればknowledgeの蓄積がしやすいのでチーム開発向きだと思います。
あとリモート環境になるので、環境セットアップがやや面倒です。ミドルウェア分離などが適切に行われている必要があります。
Cline
Clineは新規プロジェクトでどうにかできないか試行錯誤しています。
AIに適したアーキテクチャで作ると結構すんなり作ってくれるので、全体を整えるのに使ってみたりしています。
こちらは自腹なので最近はあまり触っていませんが、いいお題があればもっと試してみたいと思います。
AIが書きやすいコード
上から下に読めるコードは大体書きやすいです。したがって宣言的なIaCのコードやGitHub Actions、Dockerfileやシェルスクリプトといった1ファイルで完結するものにはかなり強い印象があります。
「知っていれば書けるけど知っているための量が多い」ような分野はほぼAIに任せていいと思います。知識量で戦う時代はよほどの専門家でなければ終わったと思います。
あと特にClaudeではコンテキストが長くなると爆発するので、なるべく内容は絞ってあげるのが良いです。
AIに頼りすぎると自分のコードではなくなってしまう問題
当たり前ですが、AIにずっと書かせていると、自分のコードではなくなっていくので、自分の思考力が低下していくのを感じます。
特に出力がいまいちな場合は、プロンプトを試行錯誤させるより、自分で直接書いたほうが理解もできるようになるので、AIに任せないようにしています。
そもそもコードがわからない人がAIに全任せすると無意味な時間を過ごすことになります。「最悪自分が手直ししてどうにかできる」状態は維持するようにしましょう。
ドキュメント生成させる
AIにコードからドキュメントを生成させると、「なんかそれっぽいことを言っているけど頭に入ってこない」内容が生成されがちな気がします。OSSのリファレンスには良いかもしれませんが、業務コードだと背景などを理解して書く必要があるせいか、いまいち肝心なところに触れてない印象になります。とはいえ理解の補助にはなります。
人間が本当は何が知りたいのかをAIは当然ながら理解できないので、プロンプトでそこまで書ければいいですが、そうでなければなんか全体を網羅しているけどよくわからないなとなりがちです。issueなどと連動させるとうまいいくかもしれませんが、手元のプロジェクトがそのあたりにフレンドリーなものではないのでちょっとわかりません。
コードレビュー
Devinにコードレビューをさせていますが、概ね見ておいたほうがいいところが網羅されてとても良いです。テストの漏れやTODO残しなどもちゃんとキャッチアップしてくれます。やっておいて損はないです。
ただしDevinは仕様を知らない(プロジェクトによっては仕様まで理解してくれるかも)ので、仕様そのものが正しいかどうかは人間が判断する必要があります。
とにかく型とlintとスキーマが重要
AIコーディングではガードレールが最重要です。私もこれまで何度もlintの重要性について語ってきましたが、AIコーディングでは必須条件になります。
ただし型が強いと言ってもRustは苦手で、これは恐らく上から下に読んだだけでそれを理解するのが難しい言語だからではないかと思います。同様の理由でゲームプログラミング系や非同期処理なんかもまだまだ難しいと思います。
「非同期処理が難しい」や「上から下に読むだけで理解できる」という点を見ると、偶然かどうかは知りませんが近年のReact界隈の対応はそういう方向に進んでいるので、これもAIとの親和性が高いと言えます。
スキーマも重要で、入出力の定義があらかじめ決まっていればそこから脱線することが減るので、なるべく「決まったところを埋めていく」ような開発スタイルになっていることが望ましいです。
人間にも言えることですが、とにかく「個人の判断を最小限にする」ことが重要です。誰が書いても同じような結果になるプログラミング環境を用意しましょう。
まとめ
AIコーディングなしではもう開発が回らないですが、過信しないようにするのと、ガードレール整備(いわゆるrulesも含む)が重要かと思います。