ログインページは正しくレンダリングされ、REST APIは200 OKを返した。SaaSボイラープレートは、リンターエラーを一つも出さずに立ち上がった。かつては1週間かかっていた作業を、わずか午後のひとときで終えてしまったのだ。AIコーディングアシスタントはソフトウェア開発のあり方を完全に変え、機能の実装はエンジニアリングというよりも、メニューから注文する作業のように感じられるようになった。その利便性は本物だ。しかし、そこには後になって、通常は最も状況が深刻な時にのみ現れる代償が伴う。開発者たちはこの罠をVibe Codingと呼び始めているが、その名前はこの問題を完璧に捉えている。
コピー&ペーストのループ
実際のループは次のようなものだ。チャットウィンドウにカーソルを置き、平易な英語で機能を説明する。すると、コードのブロックが瞬時に表示される。それをハイライトしてコピーし、エディタに戻って貼り付けて保存する。ターミナルにはエラーが出ない。ブラウザには正しいレイアウトが表示される。変更をコミットし、次のチケットを開く。ロジックを追跡するための立ち止まりはなかった。インポートされた依存関係の確認もなかった。そのサードパーティ製ライブラリが本当に必要なのか、あるいは標準ライブラリのツールで十分なのかという疑問も抱かなかった。ワークフローは単に「聞き、コピーし、貼り付け、実行する」だけだ。表面が正しく見えれば、その深部も正しいものだと決めつけてしまう。これは、意味のある意味でのコーディングではない。マニュアルを読まずに、既製品のパーツを組み立てているだけだ。あらゆる近道がそうであるように、これは「うまくいかなくなる瞬間」が来るまでは機能し続ける。
最悪のタイミングで制御を失う
バグが本番環境で発生したとき、その対応を迫られるのはAIではなく、あなたのデスクだ。午前2時、チャットボットはあなたのオブザーバビリティ・プラットフォームにログインしていない。ログインしているのはあなただ。もし出荷したコードを一度も読んでいないのであれば、その失敗の原因を論理的に考えることはできない。理解していないファイルをgrepして、学んだことのないロジックを修正しようと奔走することになるだろう。その感覚は、ひどく混乱を招くものだ。自ら構造を書き上げる開発者は、システムのメンタルマップを構築している。彼らはどこに危険な箇所があり、どの前提条件がシステムを支えているのかを知っている。Vibe Codingは、そのマップを消し去ってしまう。あなたはブラックボックスのオペレーターになってしまうのだ。構文は正しく、デモはクライアントを感動させたかもしれないが、そのシステムは真にあなたのものとは言えない。オーナーシップには理解が必要であり、理解には時間がかかる。そのステップを飛ばしても、コストがなくなるわけではない。ただ、最も高くつく瞬間にそのコストが転嫁されるだけなのだ。
「動くコード」は「安全なコード」ではない
AIモデルは、学習データに見られるパターンに基づいて回答を生成する。それらのパターンには、時代遅れで安全でない例が大量に含まれている。あなたが貼り付けたログイン関数は、学習データのスナップショットが古いフォーラムの断片を好んでいたために、ソルト付きのスローハッシュではなく、高速で時代遅れのハッシュを使用してパスワードを保存しているかもしれない。APIエンドポイントは、あなたが単純な例を求めたためにモデルがそれに従い、ユーザー入力を生のSQL文字列に直接結合しているかもしれない。データベースの認証情報がクライアント側のJavaScriptに漏洩してしまうかもしれない。それは、AIがあなたがバックエンドのルートではなくサーバーレス・フロントエンドを構築していることを知らなかったために起こり得る。
入力バリデーションの欠如もよくあることだ。生成されたフォームハンドラーは、ユーザーが礼儀正しいことを前提としており、データをスタックの深層に渡す前に、文字列の長さ、数値の範囲、またはファイル形式をチェックしない。認証チェックは、適切なサーバー側の検証なしにクライアント側のトークンに依存しているかもしれず、誤った安心感を生み出す。AIは、学習データにレガシーなStack Overflowの回答が含まれていたために、HttpOnlyやSecureフラグのないセッションクッキーを生成するかもしれない。これらの問題は、デモの間は目に見えない。アプリは動作し、ユーザーはログインし、データは流れる。しかし、攻撃者にとっては、たった一つの守られていない入り口があれば十分なのだ。セキュリティの観点からAIの出力をレビューすることは、パラノイアではない。それはプロフェッショナルなソフトウェア開発における最低限の基準である。
不整合という税金
コードベースは一つの物語でもある。それは新しいチームメンバーに、物事がどのように行われるべきかを教える。Vibe Codingは、そのナラティブを、互いに矛盾する十数もの方言へと断片化させてしまう。昨日構築した機能は、明示的なステート・リデューサーを持つReactの関数型フックを使用している。しかし、今日作成した機能は、少し異なるプロンプトから生成されたために、モデルが古いパターンをデフォルトとして選択した結果、クラスコンポーネントが混入している。APIレイヤーは、OpenAPIで生成されたスタブと、手書きのルートハンドラーの間で揺れ動く。命名規則はcamelCaseとsnake_caseの間で漂流する。エラーハンドリングはあるファイルでは消え去り、別のファイルでは冗長なネストされたtry-catchブロックとして現れる。
数週間が経つと、プロジェクトは考古学的な発掘作業のようになってしまいます。隣接するAI生成モジュールがどのような前提条件に基づいているのかが分からないため、一つのモジュールを安全に変更することすらできなくなります。リファクタリングは、遅くてリスクの高い「モグラ叩き」へと変貌します。システムはコンパイルこそ通るものの、もはや一貫性を失っています。メンテナンス性は、無数に貼り付けられたスニペットによって、じわじわと死にゆくのです。
AIを教師に変える
真の学習は、出力に対して問いを投げかけることで起こります。AIを、「コードを書くのは早いが、コードレビューを必要とするシニアデベロッパー」のように扱いましょう。なぜその木の探索において、反復(iteration)ではなく再帰(recursion)を選んだのかを尋ねてください。エッジケースをより適切に処理できる、よりメモリ効率の良い方法はないかと問いかけてください。入力がnullの場合、ネットワークリクエストがタイムアウトした場合、あるいは2人のユーザーが同時にその関数を実行した場合に何が起こるのかを聞いてください。ジュニアチームメイトのプルリクエストをレビューするかのように、一行ずつロジックを説明させるのです。
モデルに自身の選択を正当化させることで、自分自身もそれを理解せざるを得なくなります。これにより、関係性は完全に逆転します。AIはオートパイロットではなく、チューター(家庭教師)になるのです。目標は、自分自身でコードを一切書かないことではありません。たとえアシスタントが最初のバージョンを作成したとしても、自分が完全に理解しているコードだけをリリースすることなのです。
今、本当に重要となるスキル
文法を書くことの価値は、日に日に低下しています。読み解き、推論することは...
