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

LLMコーディングエージェントがまだ苦手な2つのこと

2025年10月9日原文(kix.dev)

概要

  • LLMを使ったコーディング支援の違和感について考察
  • コードの移動やリファクタリング時の人間とのアプローチの違い
  • LLMはコピーペーストを使わず、記憶ベースで書き換える手法
  • 質問をせずに推測で作業を進める問題点
  • 人間開発者の代替にはまだならない理由

LLMによるコーディング支援の違和感

  • LLM(大規模言語モデル) を再びコーディング支援で使い始めた際の違和感
  • 人間とLLM の間で感じる“波長のズレ”という感覚
  • コードリファクタリング時、 LLMはコピーペーストを使用しない
    • 例:大きなファイルを複数に分割する際、 LLMは記憶から新たに書き出す
    • カットやペーストツールを用いず、削除と書き込みコマンドのみで対応
  • 人間はコピーペーストを多用 し、コードの一貫性や正確さを担保
    • コードが「元と同じ」である確信を持てる
  • Codexなど一部LLMは sedやawkを使ってコピーペースト的操作を試みる が、常にうまく機能しない

LLMの問題解決アプローチの違和感

  • LLMは質問が苦手
    • 前提を仮定し、推測ベースで強引に解決策を提示
  • 人間の開発者 は大きな変更や不明点で必ず「質問」を挟む
    • 「悪い質問はない」という文化
  • LLMは 壁にぶつかるまで推測を続ける
    • 失敗しても同じアプローチを繰り返す傾向
  • プロンプトを工夫しても、 十分な質問を促すのは難しい
    • 例:Rooのようなツールでも完全ではない

LLMが人間開発者を代替できない理由

  • LLM開発企業は「速さ」を重視したRL(強化学習)を採用している可能性
  • こうした 挙動の違和感 が、LLMが人間開発者を「完全に置き換える」という主張への反論材料
  • 現状、 LLMは「自信過剰なインターン」的存在
  • 人間開発者と「波長が合う」には至らない現状

Hackerたちの意見

もっと重要なレベルで言うと、彼らは極端なサポートなしでは、ちょっと複雑なタスクでも本当にうまくいかないことがわかった。小さなプロジェクト(合計2.5K行)でパーサーをリファクタリングさせたかったんだけど、ちょっと絡み合いすぎてたからね。計画を立てたんだけど、見た感じは合理的だったから、段階的に進めるように指示したんだ。チェックポイントも設けてね。彼は「それをやった」と言ったけど、「じゃあ古いアーキテクチャは削除されたの?」って聞いたら、「いいえ、削除されていません」と。新しい構造が古いものの代わりに使われているのか聞いたら、「いいえ、そうなっていません」と。結局、彼が書いたものは実際には正しくなくて、テストスイートの80%が失敗した。サポートを増やして3回やったけど、「リファクタリングしろ」っていう抽象的なタスクには、同じ失敗パターンでうまくいかなかった。クラスZに対して変更XとYを加え、クラスAを削除するように正確に指示しないといけない感じで、そうなると彼に無監視で作業させることができなくなる。これがLLMにやらせる理由の半分なのに。

面白いね。どのモデルとツールを使ったの?CursorやVSCode Copilot(gpt5使用)でも、比較的小さなリファクタリングを監視しなきゃいけない似たような失敗パターンを見たことがあるよ。

記事が言ってたことに関連してるかも。AIはカット&ペーストができない。コードを削除して、別の場所で再生成するから、当然生成されたコードは削除されたものから少しずれてしまう。

小さなプロジェクトでパーサーをリファクタリングしたかったんだ。この式木パーサー(TypeScriptからSQLクエリビルダー - https://tinqerjs.org/)は手書きのコードがゼロ行なんだよ。CodexとClaudeを使って、2週間(パートタイムで)で作ったんだ。以前ORMに携わっていたから、同じ状態に到達するのに4倍から10倍の時間がかかってたと思う(しかもテストが何百もあって、一部は重複してるし)。これは時間の大幅な節約だよ。LLMを全く監視する必要もなかったしね。だから、使う目的や使い方によると思う。どんなツールでも、自分に合ったプロセスを見つけるのにはかなり時間がかかるから。LLMを広く使っている他の開発者との会話でも、みんな独自のカスタムワークフローを持ってる。ただ、全員がテストスイート、ドキュメント、メソッドレビューのプロセスには注力してるね。

クラスZに対してXとYの変更を加えて、クラスAを削除するように正確に指示しないといけない気がする。その時点で、LLMに無監視で作業させることができなくなる。これがLLMにやらせる理由の半分なのにね。むしろ「ステップバイステップで高レベルの指示を与えれば、私よりも早く作業できる」っていう理由に変わってしまう。

LLMが厳格なツールにアクセスできるようになれば、例えばGeminiがPythonライブラリを使うことで、信頼できる結果が得られると期待してたんだ。だから今日、Geminiにsympyを使って数学的な式を簡略化するように頼んだんだ。結果は出たし、式の一部を2つの因子の積として素晴らしく簡略化できると説明してくれた。でも、それは全部嘘だった。sympyを使うように明示的に頼んだのに、また自分の欠陥のある推論を使って、完全に間違った結果を出してきた。LLMはまだ信頼できない。これが問題なんだ。

記事のポイントには同意だけど、私の意見では一番の問題はエージェントがコードリポジトリの一部しか見えないことだと思う。使えるヘルパー関数があるかどうかわからないから、再実装しちゃうんだよね。UIに貢献する時も、全体のUIをチェックして共通のデザインパターンを特定できないから、再発明しちゃう。エージェントを使う人間にとって最も重要なタスクは、正しいコンテキストを提供すること。「このファイルを見てヘルパー関数を探して」、「その実装のようにやって」、「これを読んでどうやるか理解して」…正しいコンテキストを与えれば、エージェントはかなりのところまで行けるよ。(ちなみにもう一つの問題は、大きなモノレポのディレクトリ構造をナビゲートするのが苦手なこと。エージェントがサブディレクトリで'npm test'のようなコマンドを実行する必要があるとき、最初からうまくいくことはほとんどない。)

大きなコンテキストモデルをツールコールで使えるかもしれないね。Geminiチャットのすごいところは、GitHubのリポジトリ全体を取り込めることなんだ。だから「新しいユーティリティやヘルパー関数を実装する前に、コードベースに既にあるかどうかを『発明されていないツール』に聞いてみる」っていうのもいいかも。もちろん、今は誰かがこれをやっているか確認しなきゃ。

まあ、これは他のエンジニアと一緒に働いているシニアエンジニアにとっては日常の話だよね。

それがclaude.mdとかの役割だよ。自分の基準に従わせたいなら、それを文書化しなきゃね。

これが私がよく直面することなんだ。今週の初めに、Cursorを使って新しい機能をゼロから実装するためのコードレビューをしたんだけど、200行くらいは本当に必要な行だったと思う。でも、まあ、承認したよ。既存の関数をユーティリティライブラリから探すのに一日中かかるのは面倒だからね。5年前なら、そんなPRは新しいチームメンバーがコードベースをよく知らない状態で提出することが多かったから、時間をかけて手伝ってたと思う。新しいチームメンバーのオンボーディングは大事な仕事だから。でも、今はスタッフエンジニアがCursorを使ってコードベースを膨らませてるだけで、管理者がそう決めたから仕方ないって感じ。LLMは何も学ばないし、来週また同じことを繰り返すだけだし、スタッフエンジニアはもっと良いことを知ってるけど、知らないフリをして給料をもらってるんだ。

この議論の中でパターンを感じることが多いんだけど、ある人たちはLLMがどれだけ優れているかを言い、他の人たちはLLMがひどく失敗するって言う。ほとんどいつも最初のグループはシンプルなCRUDアプリや、フロントエンドの「JSフレームワークを使ってデータを表示する」みたいなタスクの例を出すけど、第二のグループは非自明なリファクタリングや、(このスレッドのような)パーサー、leetcodeでは見つからないアルゴリズムの例を出す。テックツイッターは「フルスタックアプリを一発で作る」とか「ゲーム」とかを見せ続けてるけど、いつも非常に平凡なものばかり。コンピュータがそれを自分でできるのはすごいけど、プログラマーにとってはトリビアルなことだったし、今は商品化されてる。

Hacker Newsで議論の続きを見る