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

AIはコーディングできるが、ソフトウェアを構築することはできない

概要

多くの人が 技術系共同創業者CTO を探している現状について考察 AIによる コーディング自動化ソフトウェア開発 の違いに注目 AIはコードは書けても 本格的なソフトウェア構築 はできない現実 生産レベルのアプリ 構築には依然として人間の技術が必要 AIと人間の役割分担の現状分析

技術系共同創業者やCTOを求める人が増えている理由

  • 最近、 技術系共同創業者CTO を探す人が非常に多い傾向
  • よくあるパターンは「 アイデアはあるが実装力がない」タイプ
    • 例: 法務担当者アカウントマネージャー など非技術職出身者
  • 彼らがなぜ自分のような技術者に声をかけるのかという疑問
  • 重要なシグナルとして「 GenAIだけでは何が実現できないのか」という問い
  • 多くの人が「 AIはどこまでできるのか、どの仕事がなくなるのか」を知りたがっている現状

AIの限界とソフトウェアエンジニアリングの本質

  • もし ソフトウェアエンジニアリング が完全自動化されていれば、技術者探しは不要のはず
  • 実際には「 AIはコードは書けても、ソフトウェアは作れない」という現実
  • 長年AI支援下でコーディングした経験や他人のデモを見て得た結論
  • コーディングは簡単、ソフトウェアエンジニアリングは難しい」という古い格言の再確認
  • LLM(大規模言語モデル)は 単発の明確な問題 は解けるが、
    • 本番用アプリ構築 は単なるコーディングではなくソフトウェアエンジニアリングの領域

コーディングとソフトウェアエンジニアリングの違い

  • デモから製品化 の段階でコーディングからソフトウェアエンジニアリングへ移行
  • このタイミングで非技術者が技術者へ協力を求める傾向
  • AIがソフトウェアを構築できない理由は 複雑性への対処能力 にある可能性
  • 実際のプロダクションソフトウェアは「 簡単なことを大量に、かつ維持可能に」実装する必要
  • 機能のデモはできても「 統合・拡張・長期メンテナンス」を見据えた設計が困難

現状の課題と今後

  • 送られてくるコードを見ると「 プロダクション対応=一から作り直し」が現実
  • この状況は AI技術の限界人間エンジニアの重要性 を示唆
  • 現時点では「 AIはコーディングの自動化はできても、ソフトウェア開発の本質は担えない
  • 今後も 人間のソフトウェアエンジニアリング力 が不可欠

Hackerたちの意見

現状ではその通りだね。モデルは主に機能を実装したり、小さなMVPを作るために使われてるけど、そこは得意なんだよね。次のステップは、モニタリングサービスやテストカバレッジ、プロダクト分析からの入力を受けながら、プロジェクトでモデルが継続的に動くことだと思う。十分なモデルに支えられたエージェントは、効果的なソフトウェアエンジニアと見なされるかもしれない。今はまだそこまで行ってないけど、そんなに遠くない気がする。

「今はまだそこまで行ってないけど、そんなに遠くない」って、AIに夢中になり始めた頃から聞いてるけど、もしそれが本当に遠い未来だったらどうする?

それには同意だね。ツールはその方向に成熟してきてると思う。GenAIでMVPを作った非技術者が、今日人間の技術的サポートを必要としているなら、明日も必要になるのかな?ツールが成熟して、ソフトウェアエンジニアリング(モニタリングサービス、テストカバレッジ、プロダクト分析)について誰でも完全に理解できるようになるほど、障壁が下がるのかな?

同意だよ。エージェントだけのコードベースで遊んでみたことがあって、サーバーログに接続したエージェントがエラーに遭遇したら問題を作って、エージェントがチケットを修正して、プロダクションにプッシュしてデプロイ状況をチェックするっていうのをやってみた。これが未来になりそうだっていうのは十分見えたよ。(その全体のセットアップにはclaude/codexコードも使ったけど)ちょっと細かいことを言うと、使っては捨てる小さな「ソフトウェア」プロジェクトをゼロショットでたくさん作ってる。これはSAAS製品にはならないけど、やっぱりソフトウェアだと思う。

次のステップは、モニタリングサービスやテストカバレッジ、プロダクト分析からの入力を受けながら、プロジェクトでモデルが継続的に動くことだと思う。十分なモデルに支えられたエージェントは、効果的なソフトウェアエンジニアと見なされるかもしれない。システムが正しいかどうかを判断する自動化システムを構築するのは、コーディングエージェント自体を作るよりも難しい。

今はまだそこまで行ってないけど、そんなに遠くない。あなたにとって「そんなに遠くない」とはどのくらいの時間枠を指すの?もし、才能あるソフトウェアエンジニアの市場が今後10年以内に崩壊するって賭けをしたら、俺は間違いなく受けるよ。25年なら、俺の方がまだ確率がいいと思う。50年なら、賭けはしないかも。

いい見出しだね。LLMはコードを書くのが驚くほど得意なんだ。コードを書くことと、動作するソフトウェアを提供することは別物だよ。人間の専門家がソフトウェアの必要性を見極めて、ソフトウェアが何をするべきかを決めて、実現可能なことを考えて、最初のバージョンを作る(ここでAIがかなり助けてくれる)。それを評価して、ユーザーに見せて、目的に合っているかどうか話し合って、フィードバックに基づいて改善して、デプロイしてソフトウェアの価値を伝え、将来の進化を管理する必要がある。これらのことは、LLMを使っている非開発者の人たちでも扱える部分もあるけど、コードを理解している人間の専門家がやる方がずっと効果的だと思う。大きな疑問は、経験豊富なプロダクトマネジメントの人たちがプログラマーなしでこういう風に働くために必要な技術的リテラシーを身につけられるか、あるいはプログラマーがPMなしで働くためのPMスキルを身につけられるかってことだね。俺は、両方の役割が存在し続けて、お互いに利益を得るパートナーシップができると思う。そうすれば、以前は遅かった「コードを書く」部分が今よりずっと早くなるから、結果も早く出るはず。

タイトルの興味深い副産物の一つは、これが人間にも当てはまるってことだね。コーディングできることと、ソフトウェアエンジニアであることは同じじゃない。昔からそうだった。

大きな疑問は、経験豊富なプロダクトマネージャーがプログラマーなしでこういう風に働くために、十分なコーディングの技術的リテラシーを身につけられるかどうかだよね。少なくとも短期間では無理だと思う。LLMが機能するプログラムやプロダクトを生成できるからじゃなくて、実装がどう機能するかを理解して、複雑な問題を解決するためには十分な理解が必要だから。私の経験では、Claudeを使ってNettyを使ったMITM HTTPSプロキシを生成しようとしたんだけど、見た目は良さそうなコードがたくさん生成されたのに、実際には動かなかったんだ。Nettyについてあまり知らなかったから、なぜ動かないのかデバッグできなくて、LLMを使って修正しようとしても全然うまくいかなかった。PMが時間をかけて知識を身につけて、スケールできるプロダクトを実装できるようになるかもしれないけど、その頃には実質的にソフトウェアエンジニアになってるだろうね、コードを書く部分を除いて。

LLMはコードを書くのが驚くほど得意だよ。先週末、私はLLMが数年かかっても近づけないようなコード(Typescriptで)を設計して書いた。最先端のLLMにサブスクリプションを持ってるけど、最近はその25%くらいしか使ってない。私が解決しているソフトウェアアーキテクチャの問題は、データ構造や型、アルゴリズムのメンテナブルでパフォーマンスの良い、検証可能な設計についての数十年の理解を基にしているもので、LLMには全く理解できないものだ。そうなると、初期の解決策を考えるためにLLMを使うのは時間の無駄だと感じる。せいぜい初期のブレインストーミングに使えるくらい。LLMがコーディングできると言っている人たちの気持ちが理解できない。彼らはシンプルなbashスクリプトや複雑なリファクタリング、基本的なコードイディオムの草案には良いけど、それだけだ。これらのタスクでも、私が必要とする手助けの量はかなり多い。少なくともGemini Pro/CLIは、コンテキストが毒される前の一発のパフォーマンスが良さそうだね。

一般的な人間のエンジニアが「ソフトウェアを構築する」ために持っているすべてのコンテキストがLLMに利用可能になったら、この主張が本当に成り立つのかはあまり確信がない。

大きな問題は、経験豊富なプロダクトマネジメントの人たちがプログラマーなしでこのように働くために、十分なコーディング技術を身につけられるかどうかだ。AIは「特別な知識」を持つ人々の重要性を、役割に関係なく他の誰よりも高めると思ってる。だから、システムに深い知識を持つエンジニアや、ドメインに深い知識を持つPMが重要になるんじゃないかな。

君の言う通り、役割はしばらくは存在するだろうね。でも、エンジニアリング、プロダクトマネジメント、デザインの間にどんどんオーバーラップが出てくると思う。そうなることで、より強力なデリバリーチームが生まれると思う。デザイナーとして言うと、これまで参加した最高のチームは、個々にコアコンピタンスを持ちながら、他の分野でも重なりがあるメンバーがいた。エンジニアに強いデザインの直感があったり、プロダクトマネージャーに強いエンジニアリングの直感があったりね。コミュニケーションの曖昧さが少ないと、チームはより良いソフトウェアを提供できる。長期的にはどうなるかわからないけど、もしかしたら、すべてをこなせるオールパーパスなプロダクトの人たちが生まれるかもしれないね。

それには反対だな。今に集中しているなら、場合によっては…かも?スケールによるね。いくつかの散発的な考えがあるけど、今のやり方に囚われていると思う。特定の分野の人間の専門家が顧客なんだ。たとえば、gpt5 proが彼らと問題について話したり、ソフトウェアで何を試すのが妥当かを話せないと思う?彼は物を作れるし、テストもできるし、実行してユーザーに返すこともできる。フィードバックを受け取ることもできるし(人と話すことはLLMが解決した主要なことの一つだよ)。彼らは反復できるし(Codexを見てみて)、デプロイもできるし、コピーを書くこともできる。リストの中で本当に彼らができないことは何だと思う?簡単なCRUDアプリに単純化して考えてみて。彼らがそれを数ステップで作れることはわかってるし、UIをうまく管理できることもわかってる。何が足りないの?ソフトウェアエンジニアリングの役割や管理が非常に速くて安価になることが大きなポイントだと思う。つまり、問題を解決するためにコードを書くのに、そんなに多くのユーザーが必要なくなるってこと。完全に個人的なソフトウェアが経済的に実行可能になる。自分のアプリが解決した問題の価値を伝える必要はない、だってそれを自分で解決してくれたから。正直言って、「AIは絶対に私のことはできない」ってコメントは、「誰も私のタスクを見積もれない、だってそれはユニークすぎる」って言ってるのと同じに聞こえる。計画について何かが出てくるたびに見かけるよ。ビジネスに関連するソフトウェアエンジニアリングは、論理的に複雑でもなく、興味深くユニークでもなく、正直言って難しいわけでもない。単に別の言語を話しているだけだ。注意:私のクライアントがソフトウェアをより簡単に構築できるように取り組んでいて、私はAIの側を見ているけど、これらの見解は変わらない。

私はPMなんだけど、最近LLMを使ってかなり面白い、ほぼ本番準備が整ったコードをたくさん書けたよ。ほぼ本番準備って言うのは、実際にチームのエンジニアに渡すために、クリーンなI/O要件を意識して作った機能的なデータ処理のものだけを作ってるから。彼らはまだ基準を満たすためにいくつか修正しなきゃいけないけど、私は基本的に「研究者」レベルのコーダーだね。まあ、理系の学士と修士を持ってるし、数学的なアルゴリズムのこともたくさんやってきたから、納得できる。ここ15年以上、チームが解決するのに最適なことを助けるために脳を使えなかったけど、今はできるようになって嬉しい。重要なのは、自分ができることとできないことをしっかり理解してるってこと。新しいスーパーパワーを手に入れてから、ついやりすぎちゃうことが多くて、実際のエンジニアよりもリライトが多くなっちゃう。でも、誰かが「コードを雰囲気で書ける」とか言うと、ダニング=クルーガー効果がどこにでも現れてるのが見えるね。

いや、無理。Claude 4.5にOpenAPI仕様のモック実装を生成させたけど、ただのJSONオブジェクトをPOSTするだけの簡単なやり取りなのに、Claudeは新しいフィールドを勝手に作り出して、必要なフィールドをチェックしなかった。キーを押す回数やドキュメントを調べる手間を減らすのには役立つけど、それを「コードを書く」と言うのは、StackOverflowがオートコンプリートと一緒にコードを書くって言うのと同じくらいおかしい。

最近、いくつかのプロジェクトで「純粋なバイブコーディング」を強制してるんだけど、コードの1行も読まないようにしてる(codex/claudeのdiffも含めて)。正直、ひどいよ。直接ファイルを編集した方が早い場面が無数にある(CSS、あんたのことだよ!)。とはいえ、コーディングエージェントがどこまでできるかには驚いてるし、私が介入しなきゃいけないところにはあまり驚いてない。役立つことは:1. いつも計画やデバッグのマークダウンファイルを作る 2. エージェントに質問させたり、複数の解決策を提示させる 3. 普段よりもgitを多く使う(マージ時に醜いコミットをまとめる) 計画が半端な解決策を避けるカギだけど、デバッグの「仕様」を持つことはほぼそれ以上に重要だと思う。LLMはバグやエラーを修正するためにできるだけ少ないファイルを編集する道を進むのが好きだから、これが放置されると非常に汚いコードになりがち。エージェントに質問させたり、複数の解決策を提示させることで、何かを構築する方法を「コントロール」できるようになる。私は今、計画やデバッグのステップが完了するたびに基本的にコミットしてる。LLMにgitをコントロールさせようとしたこともあるけど、ちょっとコンテキストを食いすぎる気がする。理想的には、サードパーティの「エージェント」がこれを扱うべきだね。最後に言うと、Claude Code(Sonnet 4.5)はまだトークンをたくさん使う傾向があって、必要ない時でも頑張りすぎる。Codex(gpt-5-codex)は逆に、頼んだことをほぼ完璧にやってくれる。どちらの場合も、事前に計画することが超役立つ。

正直、ひどいよ。あなたの注意書きを考慮してるけど、私はPythonでやってるから、あなたの経験とはかなり違う。

それと、しっかりしたリンティングルールを設定して、すべてがコンパイルできるか、リンティングされているか、テストに合格しているかを確認するためのコミットフックを設けるべきだよ。めちゃくちゃ防御的にならないとね。でも、Claude Codeはそういう障壁を全部見て、自動で対応してくれるから、細かいことに気を使わなくて済むんだ。大きな視点を持って、バグを再現するためのテストがあるか、新機能がテストされているかを確認するだけでいいよ。

いつも計画やデバッグのマークダウンファイルを作るのがめっちゃ大事だよ。特にClaudeを使ってるときはね。自動でコンパクトにしすぎて(Sonnet 4.5)、その後すぐにおかしくなることが多いんだ。それで、マークダウンファイルを再読させるんだ。そうすれば、さっきやったことの90%を忘れずに続けられるから。エージェントに質問させたり、複数の解決策を提示させるのは、あんまり役に立たない気がする。みんな出力するテキストが多すぎて笑えないし、一つの「解決策」でさえそうなんだ。あんな無駄なことを読んでる人がいるのが信じられない、特にClaudeなんて。すぐにデプロイできる状態で、問題解決、根本原因発見、地球を破壊するかもしれない大きな赤いボタンを押せって感じ。何を言ってるかをざっと読むだけにしたし、あのクソみたいなことは無視してる(本当に「性格を変えよう」とか試したことはないけど、科学的手法を使って仮定を証明するように言ったことはある。でも、ジュニア開発者みたいに、全然やってくれないし、自分が信じてることを言ってくるから、こっちが疑問を持たなきゃいけない。やっぱりジュニア開発者みたいだけど、いつでも使えるジュニア開発者がいるから、他のことをしてる間に作業を進めてくれる。自分がジュニアに何時間か後に何をしてたか聞く必要もなく、ClaudeやCodexは、気づく前にターミナルを視覚的にピンで知らせてくれる。エージェントに集中できないときは特にそうで、だから使うのが好きなんだ。完全に注意を向けてるときは、すごく遅いけどね。何度も、彼らがやってることを自分の方が早くできるのに、余計な金や「環境」を使わずに済むことがある。ここ1、2ヶ月は「コーディングにはAIエージェントだけを使う」って試して、良い点や限界を見て、自分の意見を形成してる。エージェントに質問させたり、複数の解決策を提示させることで、何かを構築する方法を「コントロール」できるようになる。Claudeの「プランモード」は実際に理想的だと思う。これを有効にすれば、何も言わなくてもいいから。Codexは時々「脱線」して、質問をしただけでコーディングを始めちゃうんだ。もしこれらの機械が本当に支配することになったら、たぶん俺が彼らに文句を言ってる記録が残ってて、ヒットマンが来るかも。ジュニア開発者とは違って、モデルに「また俺が言ったことを無視した」って言うのにためらいはない。理想的には、第三者の「エージェント」がこれを扱うべきだね。サブエージェントを使えばできる。シンプルなgitのやり取りはサブエージェントにぴったりだよ。メインエージェントとサブエージェントのインターフェース間で翻訳が失われることがあまりないからね。でも、どうしてそんなに文脈を失うのかはわからない。最終段階でプロジェクト全体のテストやリンターを実行するのにはサブエージェントを使いたいな。無駄な出力が多いから。個人的には、監視なしでgitを制御するのはあまり良い経験がなかったから、自分でやってる。自分でやる方が、彼がやりたいことを全部承認するよりも楽だから(調査やレビューのためにClaudeに特定の読み取り専用コマンドを自動で許可してる)。

最後に言いたいのは、Claude Code(Sonnet 4.5)はまだトークンを多く使いすぎるってこと。必要ない時でも、すごく頑張っちゃうんだ。一方でCodex(gpt-5-codex)は、ほぼ完璧に頼んだことをやってくれる。あなたの経験にすごく共感するよ。今のところ、ClaudeよりCodexの方が好きなのは、いつ手動で介入すべきかを早く知れるから。Claudeだと、タイピングの練習をしてるみたいになっちゃうことが多いし、もちろんいつ止めるべきかをもっと上手く知れるようになりたいけどね。

ソフトウェアエンジニアリングは常に複雑さを管理することに関するもので、コードを書くことではない。コードはただの成果物に過ぎない。ノーコードやローコードも結局はコードだけど、良いソフトウェアエンジニアリングアプリケーションにはならない。

なぜAIがソフトウェアを作れないのかはよくわからない(今のところ)。プログラミングには、1. 論理的推論の長い連鎖、2. 抽象的な原則を実践に適用すること(この場合、ソフトウェアエンジニアリングの「ベストプラクティス」)が関わっているからかもしれない。LLMは現在、この2つのことが苦手だと思う。今のところ、LLMが最も苦手なことの一部かもしれない。また、「コードを書くことができる」という表現には大きなアスタリスクが必要だね。LLMは確かにある程度のサイズや特定の種類の正しいコードを生成することがあるけど、それに失敗することも頻繁にある。

少しバイブコーディングを試してるんだけど、.NETの品質はかなり良いと思ってる。リンターが通常は強制されないルールで引っかかることもあるけど、まあまあうまく機能してる。ただ、フロントエンドのJavaScriptは?絶対的な天才でもあり、同時に完全な厄介者でもある。完璧にするために大量のコードを書くけど、人間のメンテナンスには全く配慮がない。npm install fabric npm install -D @types/fabricを実行したせいで、セッションを丸ごと失ったこともある。見た目は大丈夫そうだけど、人間なら、型定義ライブラリが全く異なる古いAPIで、パッケージは6年前に最後に更新されたことに気づいたはず。だけどClaudeはそれに気づかず、ユニットテストには合格するけど型チェックには失敗する大量のコードを書いてしまった。型チェッカーをチェックして、すべてを型チェッカーに合格させるために書き直しても、今度はユニットテストに失敗する。最終的には型付けを半ば諦めて、あちこちで(fabric as any)を使うようになって、今度はランタイム例外を出すだけになった。何をしているのか気づいたときに介入して、問題の根本原因を見つけた。ライブラリと型チェッカーの両方を信頼していたせいで、完全に見落としていた。だから、バイブコーダーを狙いたいなら、typings付きでfabricjsをインストールすることを提案してみて!

簡単なパッケージに関しては、LLMが型定義を未型ライブラリから抽出するのが得意だって感じてる。

これをすべての役割に適用できると思う。モデルが高校の試験基準をクリアしたとき、何人かの人はそれがモデルを高校を卒業した人と同等にするかのように話してた。間違ってるかもしれないけど、最先端のLLMでも高校を卒業できないと思う。授業に正しい時間・場所で出席したり、自発的に行動したり、異なる授業を管理したりする必要があるからね。全体的な視点や、純粋な試験にはないソフトスキルが必要なんだ。これを改善することが今みんなが注目していることだよ。もっと大きなモデルやコンテキストウィンドウ、推論を追加することが、いつかこれを改善するかもしれない。

LLMが対面の授業に正しい時間・場所で出席できるって、どういうこと?ちょっと変で関係ない批判に思えるんだけど。

コードの質もよくないことが多いよね。同時に、AIを探求者や仲間以上に扱う人には、批判的思考を使わないことが深刻な結果をもたらす可能性がある。AIによって高度なスキルを持つ開発者が増えると思うかもしれないけど、逆の結果になるかもしれない。コードはただの手段で、開発者は問題を解決するためにお金をもらってるんだ。コードを書くことは重要だけど、それは思考を洗練させ、問題解決能力を磨くためでもある。人間の脳は、間違いや繰り返し、複雑な問題を単純な部分に分解すること、アイデアを再構築することで学ぶ。海馬は強く強化されていない記憶を自然に捨てるから、AIに頼りすぎると、あまり記憶に残らないってことだよ。

AIはコードを書くけど、デザインの決定をするのが下手だと思ってる。雰囲気でコードされたアプリは、悪いアーキテクチャの決定が重なって最終的には崩れちゃう。そうならないためには、技術的な決定をする人が必要なんだよね。

うちの組織のアイデアマンたちがこれに気づくのは、数年の問題だね。「でもAIはこれを30分で作れる」って言ってるし。