AI にコードを書かせる日々を送っているが、あんまりいっぱいごりごり書かせても実はあんまりうまくいかないよねという所感。
AIコード生成への3つのスタンス
AI 開発によりコード生成速度が上がったが、それに人間の心やレビューが追いついていない状況があるように感じる。
生成されたコードにどれくらい責任を持つべきか?という観点でもいくらかのポリシーがあるように思う。
- 生成されたコードは、テストが通っていれば内容はどうでもいいんだよ派
- おかしくなったら全部書き直せばいいんだから中身にこだわらなくていいんだよ派
- 中身も一行一行全部理解しないとダメだよ派
自分は3つ目の派閥であるが、しかし今後もっとモデルの性能が上がったりガワアプリのプロンプトが改善されたり、生成速度が何倍にもなったりした先には違う意見になるかもしれない。
バイブコーディングって言うけれども
コード生成の戦略も、バイブコーディングと呼ばれるような、テストや lint で一定のガードレールを引いた上であとは AI に生成を任せて大量にコードを作り出すやり方もあるし、Claude Code Action のようなものを引き合いに出せば、ややバイブコーディングよりは生成圧はマイルドなやり方もある。
バイブコーディングのようなやり方は、新規に何かを PoC 的に作り出すときにはとてもフィットする。数千行のコードがサクッと生成され、とりあえず動く。ちょっと気に食わないところがあればそれをまた AI に指示すれば直してもらえる。AI でのコーディング技術が登場する以前ではこういう体験は得られなかった。実際やってみるとおおーって感じになる。すごい。
なんだけど、これを継続してメンテナンスしていこうと思うと、すぐに AI だけの力では立ち行かなくなる。バイブコーディングしたときのコンテキストは失われ、なんとなく取り残されたドキュメントとコードをもとにして AI は続きを書こうと試みてくれる。しかし実際にやってみると既存の機能はぶっ壊れるし、ぶっ壊さないにしてもまあまあうまいコードが出てくるまでに大変な時間がかかったりする。ひどいときには既存のコードを消して「テスト通った!」みたいに言ってくることすらある。お前は俺か。インチキするな。
AI によるコード大量生産系のやり方は、既存の大きなコードベースがあるようなプロダクトには現状は適用が難しい。AI にコードを書かせるアプローチがまったく駄目かというとそうではなく、こういう土台の上ではプロンプトが重要になる。プロンプトを凝って、小さくコードを書かせる分には十分ワークする。しかしこれをやろうと思ったら、プロンプトを書く人間自身がしっかりとコードベースを理解している必要がある。設計原則や、アルゴリズムに詳しい必要がある。何を DRY にして何を DRY にしないかを選定できる必要がある。何が AI にフレンドリーで、何が AI にフレンドリーでないかを知っている必要がある。
バイブコーディングで大量にコードを生成した場合、コードを書かせた人間はどれくらいコードを理解しているだろうか。デッドコードがなくて、全部の行が必要であると言い切れるだけの理解をしているだろうか。書き捨てるコードならそんな理解をする必要もないのかもしれないが、しかし業務で「これはプロトタイプだから!真面目にやるときには書き直そうね!」って言って、それがしっかり書き直せたことがある人がどれだけいるというのか。意に反して、捨てたいコードが捨てられないなんてことはよくある話である。バイブコーディングして中身がてんでわからない状態のものを、このままメンテするしかない!みたいになったときに俺達は立ち向かうことができるだろうか。もっかい AI に書き直させればいい?そんなわけなくて、結局どこかで中身を理解した人間になる必要がある。
ゆっくりするしかない
個人プロジェクトでとりあえずちょっと作ってみよう、くらいのものであればバイブコーディングはとても良いと思う。しかしちょっとでも長くメンテする可能性があるものについては、そういう作り方をしないのが賢明だろうと思う。作り出したものを読んで理解すればいいじゃん?っていう論説もあるが、動く確信を持ちながら書き進めたコードと、ただ読んで理解したコードとでは、その理解には大きな差がある。ちょっとの量なら読んで完全理解できるかもしれないが、たとえば数千行のコードをほいっと渡されて、読んで理解するのにどんだけ掛かるだろうか。まあまあ時間をかけて読んだとして、そのコードへの理解が正しいという自信を持てるだろうか。責任持てる状態になるのかっていう話。
これは近道をする力を得ているように見せかけて、実は泥沼であるようにすら思える。AI に大きな裁量を任せて作業を任せたとして、任せた部分は自分の理解がすっぽ抜けるのである。理解をしなくてよいか、あるいはすでに完全に分かっている領域以外は AI に任せるべきでない。仮に任せたとして、うまく動いたとして、それはたまたまであるし、さらに機能を追加しようと思ったときにぐだった土台 (コードというか自分の理解がぐだっている) の上で戦わないといけないから早晩うまくいかなくなる。
最近、Claude Code が output-style として Learning モードというのを出してきた。これは Claude Code にコードを書かせているときに、Claude Code が「(TODO:Human)」みたいなコメントと共に、人間が書くための穴埋めクイズみたいのを残してくれる機能である。
この機能は、バイブコーディングのような AI にまかせてもりもりコードを量産するような機能とは明らかに趣が異なる。ちょっと立ち止まって、人間に学びの時間を与えてくれようという AI の粋なはからいである。知らんけど。でもまあ自分も言いたいのはこういうことである。もりもりコードを書かせることにだけ熱を上げるんではなくて、人間の理解も両輪で進めないと駄目だよ、と。
人間に大量のインプットをしたところで、即座に理解することはできない。マトリックスの世界のようにはいかない。つまりちゃんとみんなで遠くへ行くためには、ゆっくり理解しながら進むしかない。