AI だけで作る開発者の危険な幻想
英語からの翻訳です。原文は English.
「動けばいい」という罠
Claude Code、Cursor、GitHub Copilot のような道具のおかげで、手で書くよりずっと速く機能を出せます。私も毎日使っています。ただ、プロンプトを書く人がプロセスから降りてしまうパターンを、オープンソースでも企業のコードベースでも見かけます。
こういう流れです。AI を、雇った以上は正しくやってくれる相手として扱います。プロンプトを書き、結果をコピーし、デプロイします。コンパイルが通れば出します。
そうやって、トラックが通るほどの穴が空きます。作者自身が「全部 AI が書いた」と言っていた Web UI のいくつかで、ブラウザ側だけの認証、検証されていないファイルパス、制限のないシェルアクセスを見つけました。鍵を横に貼ったまま閉めたドアです。
AI はターボ付きの新人
1 分に 1,000 語打てて、存在するライブラリを全部知っている新人を想像してください。そこに性質を 2 つ足します。
何がセキュリティ問題なのか、誰かに言われない限り分かりません。そして、知らないことを知らないと言いません。自信満々に間違った答えを出します。
その人に、誰も読まないまま本番へ出させますか。もちろん違います。
AI だけで進めるプロジェクトは、まさにそれをやっています。モデルは目の前の課題を解くのは得意ですが、あなたが想定していないリクエストが来たときに何が起きるかを考える理由がありません。../../ を含むパスパラメータは、頼んだタスクの一部ではないので最初から視界に入りません。
バグを育てるループ
いちばんよく見る失敗はコンテキストループです。AI にバグを渡します。コードが返ってきます。まだ失敗します。エラーを貼り返すと「修正版」が返ってきます。
5 回ほど繰り返すと動くものにはなります。同時に、症状を 1 つずつ潰したパッチの山ができ、モデルは最初にあったシステムの形を失っています。エラーメッセージに合わせてコードを曲げている状態で、設計に合わせていません。
脆弱性はここで入ります。テストを緑にする勢いで、権限チェックが消えます。邪魔だったので入力検証が消えます。環境変数が面倒だったので鍵が直書きされます。みんなが「やっと通ったテスト」を見ているので、誰も気づきません。
AI を本当に使う方法
答えは AI を減らすことではありません。椅子に留まることです。あなたが責任を持つエンジニアで、AI は一緒に作業している相手です。
説明できないコードは受け取らない
AI が書いたブロックが理解できないなら、そこで止めます。1 行ずつ説明させます。それでも安全だと言えないなら、安全ではないとみなします。この 1 つのルールで、被害のほとんどは着地前に止まります。
結果に突っ込む
雑に書いた同僚に話すように話します。
- 「このリファクタで CSRF トークンを消してる。なぜ消す必要があった?」
- 「この入力ハンドラは XSS に弱そう。サニタイズして書き直して」
- 「ここで
dangerouslySetInnerHTMLを使ってる。もっと安全な方法はある?」
最後のひとつは声に出して言う価値があります。モデルは前回使ったパターンを繰り返すからです。問題に名前を付けるだけで、次のパスで良い答えが返ってくることがよくあります。
差分を読む
最後のファイルだけを読まないでください。何が変わったかを読みます。
別の片付けをしながら権限チェックを消していませんか。正常系に必要なかったからと検証の呼び出しを落としていませんか。モデルはコンテキストウィンドウの中で動いていて、2 時間前に置いた制約を静かに忘れます。何が建物を出ていったか分かるのは差分だけです。
チェックはチャットの外に置く
モデルはテストが通ると信じ込ませられます。あなたの CI は違います。認証と認可はコードとパイプラインの中に置き、エージェントにそれを満たさせるべきです。入力検証は、データが届く境界に置きます。覚えていてくれるはずのプロンプトに置くのではありません。
まとめ
AI は強いエンジニアをずっと速くし、雑なプロセスをより速く壊します。今すぐ出してどうなるか見たいのが意図なら、モデルはそれを手伝います。持ちこたえるものを出したいのが意図なら、それも手伝います。どちらでも意図はあなたのものです。
運転するのはあなたです。AI は地図を読み、出口についてあなたと議論します。その議論が役に立つ部分です。