世界を動かす技術を、日本語で。

AIコーディングの罠

概要

  • ソフトウェア開発は 問題解決 中心の知的作業
  • AIによるコーディングは スピード重視 だが、 本質的な課題 が残る
  • テックリードのジレンマと AIエージェント管理 の類似性
  • ベストプラクティス の重要性とAI時代の新たな運用法
  • 人間とAIの 協調による持続可能な開発 体制の確立

ソフトウェア開発の本質とAI時代の変化

  • ソフトウェア開発は コーディング だけでなく、ドメイン理解や要件整理、設計、テスト、デバッグなど幅広い作業の集合体
  • コーディング自体は 全体作業のごく一部、多くの時間は思考や設計に費やされる
  • AI駆動型コーディング(例:Claude Code)は コード生成の速度 が圧倒的
  • しかしAIは アプリケーション全体の文脈保持 が困難で、人間によるレビューや統合が不可欠
  • AIが生成したコードの 事後的な理解・修正作業 に多くの時間を取られる現実

AIコーディングの現実と課題

  • マーケティングでは「 10倍速く」と謳われるが、実際の生産性向上は 約10%程度
  • AIが 単純作業を高速でこなす 一方、人間はバグ修正やテスト、ドキュメント作成、インフラ対応など 地味な作業 に追われる
  • 開発者が本来好きな「コーディング」に 割ける時間が減少

テックリードのジレンマとAIエージェントの管理

  • テックリードは チーム全体の技術的成果 に責任を持つ役割
  • 経験豊富なリードが 難易度の高い作業を独占 すると、チームの成長が阻害され、 知識の属人化・疲弊・離職リスク が高まる
  • チーム全体の学習・成長と 納期・品質のバランス を取る「第三の道」が必要
    • 実践例 :「Learn. Deliver. Have fun.」というシンプルなモットー
  • コードレビュー、インクリメンタルデリバリー、モジュール設計、テスト駆動開発、ペアプログラミング、ドキュメント整備、CIなど ベストプラクティス の重要性

AIエージェントを“超高速ジュニアエンジニア”として活用

  • LLM(大規模言語モデル)は ジュニアエンジニアの超高速版
  • LLMは 思考や学習能力がなく、モデルやプロンプト工夫のみで進化
  • エンジニアは 品質(Quality)速度(Velocity) の両面で成長するが、LLMは速度特化
  • 短期納品重視の「Vibe coding」は 小規模・試作向き、複雑な本番開発には 限界

持続可能なAIコーディング運用のための新しい開発プレイブック

  • AIは 設計・一貫性・保守性 を考慮せず無限にコードを生成
  • 人間が テックリード的役割 でAIを管理し、構造・基準・プロセスを提供する必要
  • AIを開発ライフサイクル全体に組み込む運用が重要
    • 仕様策定: 要件分析・エッジケース検討
    • ドキュメント: 事前生成・レビューによる再利用性強化
    • モジュール設計: 文脈範囲の制御・理解性向上
    • テスト駆動開発: 事前テストケース生成で品質担保
    • コーディング標準: ハウススタイル徹底・ベストプラクティス適用
    • モニタリング: ログ分析や洞察抽出の高速化
  • ソフトウェア開発は コードを書くこと以上の総合技術 であり、AIとの協働で スケーラブルな開発体制 の実現が可能

Hackerたちの意見

いい投稿だけど、ここには2つの誤解があるよ。まず、LLMを使ってコーディングする熟練エンジニアも、ソースコードを書く前に考えたり、議論したり、ぼーっとしたりしてるんだ。実際、俺はもっともっと考えて、いろんなデザインをバランスさせたり、全体の方向性を把握したりしてる。これが、LLMエージェントにちゃんとしたものを作らせるために必要なことだからね。でも、今はその考えや計画が設計書に記録されて、整理されるようになった。これは、LLMエージェントがなかった頃には全然できなかったことだよ。俺の最初のプロンプトは「まだコードを書くな」から始まることが多い。次に、LLMが学べないジュニア開発者みたいだっていう考え。まず、そうじゃない。初期の開発者は人間だけど、LLMはツールだからね。でも、もっと一般的な議論として、初期の開発者と一緒に働くことには価値があるけど、LLMにはそれがないっていうのは違うと思う。LLMは学んでないかもしれないけど、俺は学んでる。今は3ヶ月前よりもずっと効果的にこのツールを使えてる。俺たちは、LLMから良いプロダクトを引き出す方法を見つける初期段階にいると思う。これは明らかに価値があるよ。

私の最初のプロンプトのほとんどは「まだコードを書くな」で始まる。 俺はまず行動計画を聞くのが好きなんだ。実際に編集やファイルに触れる前に、何をするつもりかを知りたい。

LLMは何も学んでいないかもしれないけど、俺は学んでいる それに関しては、個人的には彼らが実際にインタラクトから学んでくれたらいいなと思う。ユーザーの視点からすると、俺がやりたいのは、これまでLLMが学んだことをファイルに「保存」できること。後でそれを復元して、LLMにその内容を「再学習」させることができるようにしたい。今はさまざまなフロントエンドUIでこれができるけど、俺が求めている重要な部分は、a) この「再学習」が現在のコンテキストウィンドウに影響を与えないこと(正直言うと、この概念自体がなくなってほしいけど、それは別の話)と、b) 情報を失うようなロスのある再学習でないこと。いくつかの解決策はあるけど、根本的な問題へのバンドエイドに過ぎない。例えば、これまでの議論を要約して再スタートすることはできるけど、明らかにそれはロスのあるメモリ圧縮に過ぎない(人間が同じことをできるのは気にしない、LLMはコンピュータ上で動いているソフトウェアだから)。あるいは、RAGのようなものを使うこともできるけど、AFAIKこれは「プロンプトトリガー」によって機能する。つまり、あなたの「現在の」インタラクションを通じてのみ、知識がそこにあっても、今やっていることがそのインデックスをトリガーしないと、LLMはそれに気づかない。俺が求めているのは、例えば、LLMにfooという関数がmooオブジェクトをバーフィズするために使われることを伝えた後、さらにそのコンテキストの長さを超えて他のことを伝え、議論を保存して、次の日に復元し、さらに他のことを伝えた後、スプラファーに参加する方法を尋ねたら、前回のセッションからmooオブジェクトやバーフィゼーションについて何も言っていなくても、スプラファーに参加するにはバーフィズされたmooオブジェクトに変換すればいいと教えてくれること。 (それに、こういったメモリの保存/読み込みは明示的であるべきだと思う。クリーンスレートから始めたいからで、これは技術の限界を回避するためではない)

まだコードを書くな。笑 俺もいつもそうしてる。これは、再現する前に何をしているのか理解するために、いい方法だと思う。コードを書くのは好きじゃないけど、問題解決や論理、統合の部分は大好きなんだ。

どうやって良い製品を作るか考えてるんだね。今のところ、明確な前提デザイン以外に何を考えた?

まず、LLMを使ってコーディングする熟練エンジニアも、ソースコードを作り始める前に考えたり話し合ったり、ぼーっとしたりするんだよね。そう、考える時間は全体のソフトウェア納品において重要な部分だから、コーディングの部分を早めても全体の生産性や労働要求が劇的に変わるわけじゃないんだ。

自己管理ができる人間は少ないよね。これがほとんどの反AI記事のポイントみたいで、私も同意する。

私の最初のプロンプトのほとんどは「まだコードを書かないでください。」から始まる。IntelliJではすべての変更を承認しなきゃいけないから、このプロンプトは必要ないんだ。承認なしで勝手に変更するYOLOモードがあるけど、私はそれを使ったことがない。誰か使ってる人いるのかな。

「LLMはツールだよ。ツールってのは、事前に期待通りの仕事を高確率でこなすって分かってるか、明らかに失敗する(低確率で)って分かるもの。LLMの場合、信頼できるタスクはほとんどないし、失敗の仕方も分からない。成功を報告しながら失敗することもあるし、人間でもツールでもない動き方をする。LLMは、バグだらけのコンパイラみたいで、間違ったコードを出力しながらも成功を報告することが多すぎる。バグの場所が分からないから、唯一できることは、別の構文で同じようにプログラムを書いて、バグを引き起こさないことを願うこと。それはプログラマーがよく使うツールじゃないよ。こんなコンパイラで作業するスキルは身につくけど、そのスキルがどれだけ移転可能か、持続可能かは不明だね。もしLLMが一部の人が信じるほど大きく早く進化するなら、バグのあるコンパイラが修正されるのを待った方がいいかも。今よりも少ないスキルで同じ結果が得られるようになるだろうし。」

各段階にコーディングアシスタントを含める例があったらいいなと思う。エージェントを各段階にどう組み込むか?Googleでのエージェントとの成功したコラボレーションについての投稿を見たことがあるけど、そこではデザインに合意するために人間同士でたくさんの前準備があって、その後エージェントと一緒にプロジェクトの一部を構築し、徹底的なテストスイートを確保している。各段階でエージェントを含めることは「コンテキストエンジニアリング」を意味するのかな?これは、次のトークンを生成するためのコンテキストを提供するために、各段階でLLMを使用する際にもっとテキストやアセットを投入することになるの?このレベルの段階的開発をエージェントの重みや「理解」に組み込むために、何かもっと深いことができるのかな?これに関する確立されたプロセスはもうあるのかな? - 仕様 - ドキュメンテーション - モジュラーデザイン - テスト駆動開発 - コーディングスタンダード - 監視と内省

あなたのビジネス、コードベース、またはロードマップに関する深い知識が不足している だから、彼らにコンテキストを与えてあげて。Clineのメモリーバンクアプローチが好きだな。https://docs.cline.bot/prompting/cline-memory-bank これにはアーキテクチャ、進捗、ロードマップなどが含まれてる。俺のもっと複雑なプロジェクトの中には、これだけで3万トークン使うものもあるよ。メモリーバンクは既存のドキュメントや、モデルに伝えたことから構築されてる。コンテキストが多すぎるとモデルが悪化することもあるけど、全体的には妥当なトレードオフだと思う。俺のコーディングスタイルやアーキテクチャの決定をかなりうまく維持してくれるしね。各セッションでは、コードを生成する前にPlanモードを使って、満足できるデザインに到達することをおすすめするよ。

テクノロジーが人を怠けさせるっていう考えに依存しないアンチAIの意見を見てみたいな。LLMを使ってコードを生成する際には、計画-構築-テスト-反省のループが同じくらい重要だって、真剣にこの技術を使ったことがある人なら知ってるよね。考えなしにビルドを進めると、すぐに崩れちゃうからね。でも、そのループを適用すれば、俺が個人的に楽しんでいる部分、つまりビルドのアーキテクチャを考えたり、結果の体験をテストしたりする時間が増える。 > LLMがすべての楽しい、簡単な作業を超高速でこなしている間、俺たちは感謝されないタスクを残される これは、AIがある程度のマスタリーを達成したすべての業界で見られる意見の対立の根源だと思う。物理的な作業の体験を楽しむ人と、精神的な作業の体験を楽しむ人の間に分かれがある。考えることが一番好きな部分なら、AIを使えば、コンセプトからトラブルシューティングまで、ほぼすべての時間をそこに費やすことができるよ。でも、実際にやること、タイピングしたり、ノブや設定をいじったりするのが好きなら、AIは良い部分を奪うだけだよね。

俺の意見は、デバッグは書くよりも難しいから、書かずにデバッグするよりは、最初から書いた方がいいってことだね。

テクノロジーが人を怠けさせるっていう考えに依存しない反AIの意見が見てみたいな。この記事はそのアイデアでちょっとズレてるけど、AIによるコーディングが生成するコードの深い理解を奪うっていう指摘は、AIコーディングに対する有効で重要な批判だと思う。ソフトウェアエンジニアの主な仕事はコードを作ることじゃなくて、機能するソフトウェアシステムを作ることなんだよね。それにとって一番大事なのは、コードがどう動くかの「メンタルモデル」と、そのドメインに対する専門知識。コードはそのメンタルモデルの派生物に過ぎない。大きなプロジェクトになると、著者としての理解度には及ばないし、読者としての理解も限界がある。ソフトウェアのメンタルモデルを構築しないことには他にも影響があるよ。構文レベルでの推論には限界があって、LLMベースのコーディングエージェントはそれを超えるのが難しいみたい。

テクノロジーが人を怠けさせるっていう考えに依存しない反AIの意見が見てみたいな。私の意見だけど、たまにClineを使ってコーディングするけど、最近は手でコーディングすることが多い。理由はシンプルで、AIツールを使うと大抵はコードを書く代わりにプロンプトを書くことになるから。こう考えてるんだ。プロンプトを書く時間と推論時間が、手でコードを書く時間より短ければ、AIを使うことが多い。でもこれはリファクタリングのタスクの時だけで、そこでのボトルネックは指が打つ速さだと思ってる。ほとんどの他の問題ではこうなる:手動で10分かかるタスクをAIに頼むと、プロンプトを作って実行するまでに8分かかる。確かにそのタスクで2分の節約にはなるけど、AIが間違えなければの話ね。もし再度プロンプトを作り直したり、手動で修正する必要が出てきたら、結局そのタスクにかかる時間は10〜12分になっちゃう。最良のシナリオは、AIクレジットを使ったのに時間の節約がゼロだったってこと。最悪の場合は、AIクレジットを使った上に、タスクが遅くなったってこと。今ではいろんなタスクでこの計算をしていて、大抵は手でやる方が「安全」だと感じてる、コードの出力に関しても、タスクにかかる時間に関してもね。

「もし考える部分が一番好きなら、AIを使えば、コンセプトからトラブルシューティングまで、ほぼ全ての時間をそこに費やすことができるよ。でも、この議論はちょっと薄っぺらくなってきたね。毎日何度も、少し言い換えられて目にするよ。『何年も『練習』をしてこなかったら、考えることがどれだけうまくいくと思う?』って返すと、いつも沈黙か、話がズレるんだよね。だから、もちろん『考える』部分に集中し続けていいけど、十分な『行動』がないと、考えはどんどん浅くなっていくよ。」

@shredprez あなたのプロフィールにあるウェブサイトは、AI駆動の製品を販売してるみたいだね。「Claude、Cursor、またはVS Codeで何でもデザイン」って。次回は免責事項を残すといいかも。今の半端なAI製品が成功することに利害関係があるみたいだね。

まあ、私個人としては、LLMや似たような機械学習アプリケーションがメンタルの敏捷性に悪影響を与えるという主張をしたことはないんだけどね。今までの主張には以下のようなものがあるよ。 — どんなクリエイティブな作品もLLMの産物だと言えるようになると(今や新しいアーティストやコピーライターにとって現実の話)、人間が完全にオリジナルなクリエイティブな作品を作る動機が大きく減ってしまって、創造性や革新性に悪影響を及ぼす。 — 結果が手段を正当化するわけではない、という一般的な哲学的議論。大規模な知的財産の盗用は、この新しい機械学習の波の初期において重要な役割を果たしていて、基本的には海賊行為だよ。力のある者や富裕層が、私たち一般人に対して利益のために行っていることなんだから。(彼らはトレーニング用にオリジナル作品のライセンスを取得するお金はあったはずなのに、法的な曖昧さを利用してスクレイピングや悪用を選んだ。) — LLMが情報へのアクセスを仲介するという考えにみんなが慣れてしまうと、不平等が増す(この技術を支配する人たちやその投資家がより裕福で影響力を持つようになり、逆にその犠牲者である大多数の人々は富のスケールで下がってしまったり、仕事を失ったりする)ことが多い。 — 人間性が薄まる。人間らしく振る舞うことで、私たちは他者に人間らしさを示し、彼らから人道的な扱いを受けるに値する。もし人間と全く同じように歩いたり話したりする存在が一般的になったら、私たちがその存在に対して非人道的に接することが、他の人間同士の扱いにも影響するんじゃないかな。 — ボットのトラフィックが人間のトラフィックを圧倒するようになって、オープンなオンラインコミュニティを運営するのが難しくなってきてる。(これもLLM自体に対する批判ではなく、大企業や国家がどのようにLLMを訓練し運用しているかに関するものだよ。普通の人が自分でホスティングしようとしても、こんな規模で混乱を引き起こす技術的な能力はないだろうし。) これは私が思いつく限りのことだね。

AIを使えば、コンセプトからトラブルシューティングまで、ほぼすべての時間をそこに費やすことができる。 それは違うよ!インタラクティブなIDE AIを使っていると、AIを正しい方向に保つために時間を使ったり、元のタスクが何かを思い出させたりすることになる。エージェントを使っているなら、中間的な思考や計画をすべて委任しているわけで、残るのはインターンでもできるような具体的な要件を書く作業だけど、これは「ソフトウェアエンジニア」よりも「ビジネスアナリスト」に近いよね。

アセンブリやマシン言語でコーディングできない人が増えてるって文句言ってる人たちみたいだね。新しいコンパイル言語とか…現代の厳密に型付けされた言語を使う人たちも。新しい型安全な言語とか… NANDゲートを回路基板に配線してた頃からコーディングしてる私としては、新しいやり方には賛成だけど、間違いや行き止まりもたくさん出てくるだろうね。どんな大きな進歩にもそういうのはつきものだから。

結局のところ、エンジニアはプログラムに何をさせたいのかを正確に指定しなきゃいけないのが問題だと思う。Pythonでも英語でもできるけど、最終的には同じ動作を得るために同じ情報を入力しなきゃいけない。LLMがこれを少し効率的にしてくれるかもしれないけど、英語でも曖昧さなく正確に指定するのは非常に難しい(場合によってはPythonよりも難しいこともある)。

私の経験では、コーディング作業の「物理的」な経験が、ソフトウェアデザインのメカニクスやトレードオフ、落とし穴、一般的なデザインの風景などを理解するために必要なんだ。作業の「メンタル」な部分をきれいに分けることはできないと思う。コードを反復して書くことで、メンタルモデルが構築されるし、単にコードをレビューするだけでは得られない、もっと表面的なレベルでしか得られないことだと思う。

私の経験ではそうじゃないな。プロンプトを出す前に考える時間がまだ多いし、AIが書いたコードを使う前にレビューする時間もかかる。罠に感じることはないよ。むしろ、すごく経験豊富なペアプログラマーがいる感じ。IDEに統合してないから、他の人とは使い方が違うかもしれない。前はGoogleやStack Overflowを使ってたのと同じように使ってる。

最近のMeta/FAIRの論文「CWM: An Open-Weights LLM for Research on Code Generation with World Models」を読んだ人いる?これは、単なるトークンや位置情報に依存せず、モデルにより良い「コーディング」の理解を与えようとしているみたいで、「素晴らしいけど予測不可能なジュニアエンジニア」コーディングエージェントのコーディング能力を向上させることを目指しているみたい。- https://ai.meta.com/research/publications/cwm-an-open-weight...

「この図(共感した!):伝統的なコーディング: [考える & コーディング ....................... | 修正] AI支援コーディング: [コーディング | 考える & 修正 ................ ] は、AIがほぼ独占的に、すでに考えられた構造の既知のターゲットコードを書くのを速めるために使われるワークフローを示唆してる。考える過程での(コーディングではない)ブレインストーミングとしても使われるかもしれないね。」

「考える部分は同じだけど、修正は違うと思う。自分が書いたものを修正するのは、他の誰か(またはAI)が書いたものを修正するよりずっと簡単だよ。コードのメンタルモデルがないから、デバッグやリファクタリングで最も重要な部分が欠けてるんだ。」

「AIコーディング以外でも、AIを使って要件や仕様書を作成することで、すごく価値を感じてるよ。私にとっての鍵は、AIにこのシステムや機能がどう動くべきかを『インタビュー』してもらうこと。プロセスの中で、面白いエッジケースについて考えさせられる質問をよくしてくれるんだ。最初にその機能やシステムについての文脈を提供することで、つまらない質問から始まらないようにしてる。約45分後には、十分な考察をして、実際にペンを取る準備ができたと感じることが多いよ。これをもとに、仕様を要約して文書を作成してもらうんだ。もし気が向けばAIを手放す良いタイミングかもしれないけど、それでも価値を得られるよ。」

「この投稿はかなり詳しいけど、一つ重要な問題を見落としてると思う。他人のコードを読むと、自分が書いた時ほど思考に統合できないってこと。だから『AIジュニア』を指導することは、仕事をするより成長が少ないんだよね。特に、ほとんどが修正作業の場合は。」

「この記事が言いたいことは分かるけど、うまく伝わってない部分があると思う。Casey Muratoriのこの素晴らしい意見に似てるんだ。プログラミングを学習ベースのマインドセットで行うと、AIは本質的に役に立たないってこと。個人的には、AIのコード生成は、学ぶ意図が全くない一回限りの使い捨てコードに最も役立つと感じてる。学びが最大化されるスペクトラムの反対側は、AIが私のためにコードを生成しないところだと思う。『AI駆動エンジニアリング』のアプローチが役立つ人もいるだろうけど、少なくとも私には、AIのコーディングブロックを自分でコードを書くことに置き換える方がずっと楽しいし、最終的に何かを届けるのが持続可能だと思うよ。」[1] https://youtu.be/apREl0KmTdQ?t=4751 (関連セクションは約5分間)