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

コードを書くことは決してボトルネックではなかった

概要

  • コードを書く作業 自体はソフトウェア開発の ボトルネック ではない
  • LLM の登場でコード生成速度が向上
  • 理解・レビュー・信頼 のコストは依然高い
  • チーム連携 や品質確保が重要な課題
  • 本質的な課題 は依然として解決されていない

コード作成のボトルネックは「書くこと」ではない

  • ソフトウェア開発における 本当のボトルネック は、コードレビューやナレッジ共有、テスト、デバッグ、コミュニケーションコスト
  • チケット管理や アジャイルの儀式 などのプロセスによる複雑化
  • これらのプロセスは 品質向上 のために設計されているが、実際には 開発スピードを遅くする要因
  • コードを書く作業自体は 比較的速い 工程

LLMによるコード生成の影響

  • LLM(大規模言語モデル) の普及で、動作するコードの生成が 簡単かつ高速
  • 新たなナラティブとして「 コードを書くことがボトルネック」という誤解が広がる
  • 実際には、 コード追加の限界コストはゼロに近づいている
  • しかし、 理解・テスト・信頼 のコストは これまで以上に高騰

LLMがもたらすワークロードの変化

  • LLMは 初期実装のスピードアップ には有効
  • その反面、 レビュー・統合・保守 の担当者への負担が増加
    • 作者が 十分に理解していないコード の提出
    • 慣例を逸脱 したパターンや未知の手法が混入
    • 副作用やエッジケース の見落とし
  • コード生成は容易になったが、 検証や理解はより複雑化

コピー&ペーストエンジニアリングの加速

  • 以前から存在した「 コピペエンジニアリング」の問題が LLMによって拡大
  • 生成されたコード手書きコード の区別がつきにくくなる
  • なぜその実装が選ばれたのか を理解しにくい状況

コード理解こそが最大のコスト

  • コードの最大コストは理解にある」という現実
  • LLMは 作成コスト を下げるが、 動作理由やバグ特定、保守性確保 の負担は減らない
  • レビュアーやメンター の負担増加

チームの信頼と共通認識の重要性

  • ソフトウェア開発は 共同作業 であり、 信頼関係と共通認識 が不可欠
  • コード生成速度が レビューや議論の速度を上回る と、 品質保証が形骸化
  • レビュアー・メンターへの 心理的・実務的な負担

LLMの限界と本質的な課題

  • プロトタイピングや自動化 の加速には価値あり
  • しかし、 明確な思考・丁寧なレビュー・設計力 の必要性はむしろ増大
  • コード作成コスト は下がったが、 チームで理解し合うコスト は依然高い
  • 真のボトルネック は変わらず、「コード理解と品質保証」に残存

Hackerたちの意見

LLMがなくても、ソフトウェア開発は市場の需要や資金によってボトルネックになってきてたよね。コードの不足じゃなくて。今のツールはすごくパワフルで、プログラミングそのものは二の次になってる。業界が始まった頃とは全然違うよ。ビル・ゲイツの話で、彼がコードを書く能力がすごく貴重だった頃のことがあるんだけど、ある会社がプログラマーを切実に探してて、彼とポール・アレンをティーンエイジャーの時に雇ったんだ。「だから、彼らはペナルティを払ってた…彼らは『子供だから気にしない』って言ってたんだよね。で、僕はそこに行ったんだけど、16歳だけど見た目は13歳くらいだった。彼らは僕たちを雇って、給料も払ってくれた。すごく面白いプロジェクトだったよ…僕がどれだけ早くコードを書けるかに彼らは驚いてた。」この話は、どれだけ変わったかを思い出させてくれるね。昔はコードを書くことがボトルネックだったけど、今は「どう作るか?」から「何を作るべきか、ビジネスになるのか?」に問題が移ってるんだ。

LLMがなくても、ソフトウェア開発は市場の需要や資金によってボトルネックになってきてたよね、コードの不足じゃなくて。 それは市場の需要だけだったと言っても信じられると思う。AIブーム前、マーク・アンドリーセンが言ってた主な不満は「良いアイデアを資金提供するよりも、もっと資本がある」ということだった。個人的には、現実とズレてると思うけど、彼はお金を持ってるけどアイデアがない人だから、信頼できる第一手の情報源だね。

ちょっと脱線するけど…この種の問題は「AIの影響」の見積もりにとても関連してると思う。効率を過大評価する傾向があるよね…それは、私たちにとって重要だったマージンでの中心的な役割のせいだと思う。でも、経済は複雑な方法でボトルネックになっている。市場の需要やお金など、100倍のコードが使えるものだとは明らかじゃない。

そうだよね、みんな知ってることだよ。LLMは現実的にレビューできないような悪いコードをたくさん書くし、ジュニアから提出されたコードが全然意味不明なこともあった。なんでそうしたのか聞くと、「わからない、LLMがやったから」とか言うし。新しいトレンドは、メンテナンスにたくさんのノイズとオーバーヘッドを生んでるだけだよ。LLMを受け入れるなら、レビューやメンテナンスにもLLMを使うしかないけど、そうするとややこしいスパゲッティになるだろうね。でも、重要なのはほとんどのビジネスにとって、品質はあまり重要じゃないってこと。使い捨てのLLMコードで十分だし、もしそれがダメなら、必要だと思うまでLLMを追加すればいいんだ。

最近の例としては、若くて野心的だけど経験のないインターンを指導していることがある。彼らは、以前は1週間(または2週間)で書いていたのと同じ量のコードを1日で作り出したんだ。でも、いくつかのことが僕の仕事を以前よりも難しくした。 - レビュー中、彼らは自分のコードについて深く考えていなかったから、僕のコメントがしばしば彼らの頭を超えてしまった。議論の代わりに「いい指摘、直すね」みたいな返事が来ることが多かった(これもLLMを思い出させる)。 - 些細な問題にかける時間がほとんどゼロに近くなって、残りの問題はもっと微妙で、見つけて説明するのに時間がかかるものになった。 - 多くのバグは新しい種類のもので、コードは正しいことをしているように見えるけど、実際には全く機能しなかったり、通常そのレベルの「仕上がり」ではあり得ないほど壊れていたりする。パターンマッチングの崩壊が「オーガニック」なコードと比べて、オーバーヘッドを大きくした。何十年もコードをレビューしたり、Stack Overflowの質問に答えたりしてきた経験があれば、バグだけでなく、著者がどうやってそこにたどり着いたのか、そして今後同じことを避けるためにどう助けるかを特定することができる。 - 簡単だけど悪い(非効率的、間違ってる、違法、見た目が悪い…)解決策は話し合うのに良いけど、LLMを使ったジュニア開発者は、もっと複雑なものを作り出すことが多くて、いろんな面で悪いことになることがある。少し壊れたPRを徐々に成長させて、デザインや他の考慮事項を考えながら、最終レビューの準備が整うまで高品質にするという文化は、同じようには機能しない。 - 元のPRの問題を直す代わりに、最初のレビューに対する返事として全く異なるアプローチが来ることが多かった。また、しばしば新しく微妙な方法で壊れていた。これが、シニア開発者がジュニアの著者よりもこれらのPRにずっと多くの時間を費やすような努力の逆転を引き起こした。ジュニア開発者は(おそらく)もっと生産的で有能だと感じるだろうけど、彼らの仕事に対する反応は、最終的にはシニア開発者からの通常の熱意や励ましが欠けてしまうことが多い。こういう問題にどう対処すればいいんだろう?最初にうまくいったのは、常に多くの(合格する)テストを要求することだったけど、結局これらのテストも同じような問題に悩まされることになる。

コードは正しいことをしているように見えるけど、実際には全く機能しなかったり、通常そのレベルの「仕上がり」ではあり得ないほど壊れていたりする。 それが理解できない。彼らが書いたコードをテストしない(手動でさえ)なら、それはLLMの問題じゃなくてプロセスの問題だよ。彼らは、レビューのためにPRが準備できているとはどういうことかを教わっていない。ここではLLMは関係ない。

中期的には、実際に機能やバグ修正を設計するために労力をかけたことを示すために、作業を上流にシフトする必要があると思う。シニアエンジニアやプロダクトマネージャーが機能をスコープしデザインし、IC開発者(簡単な作業のためのジュニアも含む)がそれを実装し、シニアエンジニアがコードレビューに参加するというメンタルモデルは、常に持っていたものだけど、変える必要があると思う。今のところ、特定の機能をどうデザインすべきか考えられないジュニアエンジニアがチームにいることの価値が見えない。以前はコードベースや新しい技術を理解しようと必死に時間を費やしていたジュニアエンジニアは、その時間を使ってその機能が全体の中でどうフィットするか、エッジケースを考え、機能のデザインを提案することに使うべきだと思う。そういう仕事を任せられないジュニアエンジニアも多いし、正直言って今は雇えるとは思えない。短期的には、プルリクエストが完全であることを確認するために、この追加の注意義務を伝える必要があると思う。そうしないと、作業の非対称性が生まれるし、そのインターンやジュニアがどれだけそれを尊重しているかで評価すべきだと思う。

これは教育の同じ問題に似ていて、評価のために書かれた資料を消費する時間を減らさなければならないという答えになると思う。効果的なコードレビューはもっと継続的になり、チェックインや説明を求めることがもっと必要になるだろう。「あなたのコードを全部読んでフィードバックをあげる」というスタート地点ではなくて。今のテキストの出力速度を考えると、それは持続可能ではない。AIは採用においても同じ問題を引き起こす。知識の見かけを生み出すからだ。私たちがその知識を評価する者として抱える問題は、知識に対する他のインターフェースが言語しかないことだ。ある意味、これは存在する最古の哲学的問題に似ている。ソクラテスは、真実ではなく言語や議論に関心を持つ人々、すなわちソフィストに対して異常なほどの時間を費やしていた。今、私たちはその同じ問題を、産業規模で抱えている。テストについてのあなたの指摘に関しては、最初は自動テストに焦点を当てず(もちろん最終的にはそれを持つべきだけど)、実際にコードを実行しながら説明してもらうことを求めるべきだと思う。それがもっと良いテストになる。「どう機能するのか見せて、説明して。」

大企業でちょっとジュニアなチームを持ってる。みんな「バイブプラン」をすることが多くて、コードを書くよりもそっちが重要だよ。 - プロダクトをもっと考え抜く必要がある。本当に明確にできているか確認して。みんなそれぞれのプロセスがあるけど、ラバーダッキングや批評、作業をフェーズに分けて、それをタスクに分ける感じ(やるべき仕事、ビジネス要件ドキュメント、ドメイン駆動設計、UXライティングのプロダクトレキシコンドキュメント、あらゆる資料) - ツールやフィードバックループの設定を優先すること(コード品質ツールは必須)。計画中に決めたことを強制するためのカスタムルールも含まれる。これに時間をかければ、みんなの生活がずっと良くなるよ。 - すごく詳細な計画を立てて、エージェントが「IVI」する(自動リンティング、単一テスト、テストスイート、手動評価)ことが多い。できるだけ多く、かつ多様な自動フィードバック信号を設定する。 —- 2〜4時間計画と文書化をしてから、「1ストーリーポイント」くらいの小さな「PRD」をたくさん印刷する。完了の明確な定義がある。こうすることで、ジムに行ったり、会議をしたり、1〜2時間手を離しても大丈夫になる。 —-

いいこと言ったね。私も同じような経験があるけど、自分でこのツールを使っている視点からだよ。確かに、今は何千行ものコードを比較的早く生成できるけど、実際にそのコードをレビューして、ちゃんと動くか確認したり、バグを直したり、セキュリティの問題を探したり、リファクタリングしたり、コードを簡素化したり削除したりするのが大変なんだ。自分でコードを書く方が、ずっと生産的だと感じることが多いし、簡単なオートコンプリートのタスクにはLLMを頼る感じかな。経験の浅い人とコミュニケーションを取らなきゃいけない場合、さらにLLMに翻訳する必要があるから、もっと難しくなると思う。こういうツールが生産性を上げてるって言ってる人の大半は、こういったタスクをまるっとスキップしてるか、最初からやる気がないんじゃないかな。そうなると、コードの品質を維持するのは、実際に気にしている少数の人たちに負担がかかることになって、今はその量がすごく増えてる。残念ながら、そういう人たちはしばしば「うるさい人」や「細かいことを気にする人」として見られて、無駄にPRをブロックすることもある。でも、実際にはユーザーに届ける製品を気にしている人たちなんだよね。これを改善する提案はないけど、状況が悪化するだけだという厳しい見通しを持ってる。業界はLLMの使い方だけを学んだソフトウェア開発者で溢れ続けるし、こういうツールを作ってる会社は、同じようなマーケティングの嘘を広め続けるだろうから、盛り上がりを作って、結果的に自分たちの評価を上げるんだ。

なんか面白いね、これが他のML駆動のツールの使い方と似てるのは。例えば、電子工学なんかでは、経験豊富なエンジニアでも理解するのがほぼ不可能な解決策があるし。

  • 多くのバグは新しいタイプのもので、コードは正しいことをしているように見えるけど、実際には全く動かないか、あるいはそのレベルの「仕上げ」がされているコードよりもずっと壊れていることが多かった。これを聞いて、以前の雇用主が別の国のチームに契約した25万ドルのソフトウェアプロジェクトを思い出したよ。表面的には、特に仕様書をチェックすれば、すべて揃っているように見えたけど、実際にはまとまりがなかった。彼らは仕様書を超えて一秒もかけず、仕様から「当然に」導かれる常識的なことが全くなかった。結局、そのプロジェクトはすぐに廃棄された。今やLLMを使えば、こういう作業は基本的に無料で自動化できるようになった。

「お前は明らかにそれを書いてないだろ、やり直せ」って答えるのは選択肢じゃないのかな?そうなると、AIの未来に向かう会社の進行を妨げる恐竜になっちゃうから?

みんなはこういう問題にどう対処してるんだろう?諦めて、ゴミみたいなPRを承認して、プロダクションで爆発するのを待つ。そして、会社がAIを活用した労働力の恩恵を受けるのを見ながら、静かに別の仕事やキャリアを探してるって感じかな。

「書いた後にチャットボットにコードレビューを頼む」っていうのがいいパターンだと思う。受け入れるものには慎重にならなきゃいけないけど、整理したり、考えもしなかったケースを見つけたりするのが得意なんだよね。君のコメントを読んでて、ジュニアがこのパターンで結構トラブルに巻き込まれる可能性があるなって思った。

プロの環境では、100%同意するよ、ノートもいらない。LLMが私を最も助けてくれたのは、実はサイドプロジェクトなんだ。そこでは、コードを書くことが絶対的なボトルネックで、ちょっとしたアプリを作るために必要な時間を確保できない(いや、実際にはやりたくないのが本音だけど)んだ。

著者には反対だな。ビッグテックや企業の視点から見ると、コードはボトルネックではなかったかもしれない。でも、スタートアップの視点から見ると、厳密な計画が必要だった。リソースが限られているから、機能を生み出すのがボトルネックになっていたんだ。小さなチームでは調整のオーバーヘッドがないし、アイデアやビジョンが明確だから、すでに話し合って合意したものを作るのが簡単なんだ。私の考えとしては、AIやLLMの有用性のような広いテーマを議論する時は、一般化しない方がいいと思う。コードはある人にとってはボトルネックだったけど、他の人にはそうじゃなかった。

私が見てきたのはまさにこれで、LLMは小さくて優秀な開発チームに最も力を与えるんだ。良いアウトプットを得るためには高い能力が必要で、大きなチームは調整のオーバーヘッドがあって遅くなっちゃう。LLMは、もともと優秀だった小さなチームをさらにパワーアップさせるんだよね。

コーディングを学んだとき、何かを動かすためにはすごく努力が必要だった。スペルミスを直した後にすぐに動くコードを書くことができるようになるまで、何年もかかったよ。今は、何をやっているのか全く分からない同僚がいるけど、AIが動くコードを提供してくれる…その間に、コーディングの基準や言語、フレームワークが私が追いつく暇もないほど早く変わっていく。私はいつもシンプルで、理解しやすく、変更や削除、書き直しが簡単なコードが好きだった。そういうコードを書くことや扱うことは本当に満足感がある。でも、誰もコードなんて気にしないよね。むしろ、ほとんどの人が評価しない残酷な抽象芸術のようなものだ。

CSSを書くのとプロっぽいデザインを考えるのが大きなボトルネックだったんだ。今はそのタスクをLLMに任せてる。最近、クライアントのプロジェクトに取り組み始めたんだけど、フロントエンドのUIを作るためにデザイナーを雇う予定だったんだ。そしたら、GeminiがすごくいいUIを生成できることがわかった。デザイナーにデザインを提供してもらうのを待たなくて済むから、時間をかなり節約できてる。コスト削減も嬉しいしね。コーディングはまだボトルネックだけど、クライアントはコードを書くのにまだ私の助けが必要なんだ。将来的には、プログラマーじゃない人も自分でプロダクトを作れるようになるはず。

ちょっと興味深いのは、これとは逆のこと。次の10年で何が勝つのか?私の意見では、ユーザーの期待が今やすごく高いから、ウェブサイトやアプリ、認証、決済統合、カスタマーサポートのフォーラムやチャットを作る必要があるんだ。これはビジネスを前に進めるための足がかりを作るため。技術的じゃない人にとっては、これが問題になるのがわかる。誰もそんなことをやるために人を雇おうとは思わないし、すごく高くつくからね。AIはエンジニアのためのものじゃなくて、コードを理解していない人たちにとっての「十分良い」ものなんだ。お金がどこに投資されるか、消費者が何を好むかにも大きく依存する。今のAIコーディングの波は、効率を改善しようと他の領域に変わっていくと思うよ。

今朝、この問題について「いやだ」と枕に向かって何度も言って目が覚めた。進む道は二つある。 - 私たちのようにLLMにコードを小分けに生成させて、それを脳が速く分析して処理できるようにするけど、LLMはますます良いコードを生成するように最適化されてきてるから、時間の無駄に思える。「LLMは数ヶ月後にそれを書き直すだけだし。」 - それとも、私たちの中には仕事を失う人もいて、コードはよく考えられているように見えるけど、実際はそうじゃないという悪い状況に陥る。ここ数ヶ月、成功したケースもあれば、重要なものでは美しいクソに頭を抱えたこともあって、私の態度は揺れ動いてきた。経験は(多すぎるくらい)あるし、未来を考慮した「十分良い」明確なコードの組み合わせでやってきた。人を信じることとシナリオを疑うことも大事だと思ってる。でも、この状況は私を疲弊させてる。開発者たちは、指導できないものに指導されていて、でもそれが実際には必要ない。私が解雇されたら、二つの道のうちの一つか両方を選ぶことになるだろう。1. LLMを使い続けて、家族を養って bills を払う何かを作り出せることを願う。そしてまた別の仕事に就いて解雇される。2. 理由を必要としない手作業の仕事をする。遅くて信頼できない神経発達の人を受け入れてくれる仕事があればいいけど、実際にはそんなのはないと思う。私は以前に #2 に近いところまで行ったことがある。大切なものはほとんどが自分の機能に依存していることを学んだ。神様に頼ることはできるけど、それ以上は自分次第なんだ。そして、これらのLLMやその後に続くものは同じことをするけど、他の人の人生の穴を埋めることはできない。たとえ私がクソみたいな人間でもね。だから、LLMは私たちの無意味な欲望やニーズを解き明かしながら、謎めいたコードを書いているのかもしれない。私たちが仕事を失うかもしれないし、ゆっくりとそれなりのコードを作り続けるかもしれない。それはどうでもいいことだ。大事なのは、自分自身でいること、そしてベストを尽くすこと。

私はビジネスソフトウェアの開発に携わってる。すごく重要な側面は要件の収集と定義だと思う。これには、ビジネスユーザーとのコミュニケーションが含まれていて、彼らの問題やニーズを理解することが求められる。そして、実際のソフトウェアがそれを解決しているかどうかを確認することもね。これらすべてには、ドメイン知識、コミュニケーション、調整スキルが必要なんだ。