AIコーディングエージェント所感
こういうものは、過渡期の情報(感想)も残しておくことに歴史的な価値があると思ったので書いておく
モデル
Claude 3.7 Sonnet, Claude 3.5 Sonnet, GPT-4oぐらい
他のモデルでは、1ファイル内でのリファクタリングだとか単純なタスクじゃないと厳しい
Copilot Agentモードで使おうがRoo Codeで使おうがこれは変わらない
感覚的には、ChatGPTが出た頃の3.5系と4系の違い
3.5は勢いよく返事してくれるが、どうも信頼度は低いし、すぐ忘れるし、真っ当に生成させるなら4じゃないとダメだなあってなってた感じ
Claude 3.7 Sonnetで、数百円~千円/hぐらいは平気で消費する
これをどう捉えるかは人によるとも思うが、少なくとも僕が同じ量のコードを数百円/hで書いたり消したりしたいかと言われたら、したくない量(したくてもできない量でもある)を出してくる
この、消すとか捨てるというのもポイントで、試行回数を圧倒的に増やせるということ
元々、人間が書いたとしても掛けた時間は価値とは関係ないと主張しているのだが、生成させた場合はより一層捨てることに気を使わなくて済む
で、どうせ数ヶ月~1年もすればもっと安くなる
(まだ)任せ切るような感じではない
これも、ChatGPTに文章生成させるのと似たような感じか
叩き台を出してもらって、適当に叩く
ただし、叩き台に足るレベルを出してくれるのが、Claude 3.7 Sonnetだけって感じ
他のモデルだと「うーんわかるけどそういうことじゃないんだよなー 普通にバグってるし」みたいな気持ちで、直すか、普通にrejectする感じ
ちっちゃい変更は普通に自分でやればいい
自分がイメージできないものを作らせるのは難しい
結局自分でもドキュメントとか読み込む
ただ、何から知っておくべきかが分かりやすくはなる
あと、とりあえずどこまで知っておくべきか
自分で開発していると、ドキュメントを読んでいる時間は当然アウトプットが止まる
けど、後で必要になりそうな情報ってのは普通に多いので、止め時を判断するのと実際にそこで止めるのは案外難しい
AIに投げられる場合、とりあえず必要と思われるところまで読んで情報を渡せば、その後に自分が引き続き読んでインプットしていても同時に実装が進む
逆に、創造性を発揮できるほど活用できるということな気もして、これは結構希望でもあるし、より一層ガチンコな勝負になるということでもある
こうなるといよいよ「何を作るか」「どう作るか」が重要になってくる。
これから基本的に、「物理的に実現可能ならどんなものでも作れる」時代に突入する。
これまではどんな企画者も一緒に働くプログラマの限界を考慮しなければならなかったが、そのリミッターが外れる。
つまり、ますます企画が重要になる。
その企画の根幹を支えるのが、教養だ。
言いたいことは大体清水さんが言ってくれる、流石だ
"適した言葉"を知っているかということが現状では結構大事であり、それはまさに教養だと思った
Cursorが"今後プリフェッチなども検討できます"みたいなことを言ってきた時に、プリフェッチという言葉を知っている人はその概念含めて頭にあるし指示もしやすいが、知らない人はその言葉を学ぶまでに回り道も発生するんだろうなと思った
レビューはボトルネックではない
という気持ちで臨みましょう
無限にやり続けてしまう
ちょっとハマって考えながらコーヒーでも淹れるかあ、みたいな時間が無い
投げて返して投げて返してのラリーが早く、AIの方を暇にさせたくない
Acceptをほぼ手動でやっている(自動承認の設定をほぼしていない)からというのもあると思う
プラクティス的なもの
ある程度実装が増えたほうが問題が少なくなる傾向がある
現状の実装を読み込むので、情報量が増える
型推論とか静的な解析に近いものを感じる
今はまだある程度まで、だと思う
ある程度の規模を超えたところから発生した問題
コードの重複
同じフォルダや同じファイル内にあるコードですら確認せずに重複したコードを書き始める
エラー修正のループ
エラー1発生 → 直す → エラー2発生 → 直す → 再度エラー1発生 → 直す → 再度エラー2発生 → ...以下ループ
モックを複雑にし過ぎる
先に設計させてからコードを書かせる
Roo CodeとかにはArchitectモードとかあって、それは使ったほうがいい
必要な情報とかも要求してくれるので、ドキュメントとか渡しやすい
早めにログを仕込む(仕込ませる)
問題発生時にログがあるとデバッグしやすいのは人間もAIも同じ
指示としては、Loggerを使って適切にレベル分けをしたログを挿入するようにしてください、とか?
ログを仕込む適切な場所と適切なレベルを考えることをサボったままここまで来てしまった僕よりはとても上手くやってくれる
早めに仕込んでおけば既存コードと一貫性を持たせるためにログも入れてくれやすくなるはず
タスクの最後とかこまめにリファクタリングさせる
コードの追加は得意だが、明らかに使わなくなったコードでもよく放置される
要らんコードで混乱するのは人間もAIも同じ
次回以降のタスクで使わないコードを読み込むトークンの消費も抑えられるし、一石二鳥
1ファイルが長くされがち
1つのファイルが1000行とかになると、それだけでコンテキストウィンドウが消費されて変更の精度が明らかに落ちる
ファイルの分割、適切な責務分担を随時行う
新機能を使ってみたい人との相性は悪い
僕なんかはベータ版どころかアルファ版でも使ってみたくなってしまう質なのだが、これはすこぶる相性が悪い
まだモデルが学習してないシンタックスなどは、せっかく新しい書き方に直しても、隙あらば間違いだと思われて元に戻されてしまう
逆に言えば枯れた書き方が得意とも言えるのだが、この辺りが"開発"とは何かという心とのせめぎ合いになるのではないか
開発とは本質的に不確実なことであり、分かり切ったことをすることは開発なのか否か、という……
起きたこと
SwiftUI(Swift)のアプリを作らせた
僕はSwiftにはあんまり詳しくない
最初に、圧倒的量が生成されるし、ちゃんと動くので結構びっくりする
機能追加とかガンガンできる
この時には、あんまりレビューしてない
自分が詳しくないというのもあるし、追っつかない速度で生成されてるし、割と大丈夫そうなコードに見えるから
ある程度の規模になってきた時に、問題が解決しづらいことが増えてくる
Xcodeを使ってるのもあって、エラーとかログをコピペして渡してやることも多い
このぐらいで、同じところでエラー出やすかったりして、ちょっとずつ僕もコードの全貌を把握してくる
重複してそうだなあとかそういうのも見えてくる
リファクタリングとかをし始めたのもこのぐらい
無駄なコードとか重複があると、コンテキストウィンドウを消費しちゃうのでよろしくないのだ
開始時よりも明らかに開発速度が落ちている
なかなかエラーが解決しないことも増えるので、デバッガとかも使って、自分もデバッグに参加するようになる
テストがfailした時などに、実装とテストどっちを直すが微妙
こっちで教えてあげた方が良い