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

スロップは必ずしも未来ではない

概要

  • AI生成コンテンツ の氾濫と「slop」問題の台頭
  • 経済的インセンティブ による「良いコード」生成の必然性
  • AIコーディングツール 普及による開発現場の変化
  • 複雑化・品質低下 への懸念と現状分析
  • 将来的な市場原理 による「良いコード」への回帰予測

AI時代の「slop」と良いコードの経済的価値

  • 数年前から 「slop」 という言葉が、AIによる無価値なコンテンツ(画像・テキスト・スパム等)を指す用語として普及

  • Simon Willison がこの用語を広め、エンジニアリングコミュニティでは以前から流通

  • Greptileでは、 「slop」は未来の標準となるのか?プログラミングのベストプラクティスは消滅するのか?AIは今後も「良いコード」を書く必要があるのか? といった問いを検討

    • 結論:AIは経済的な理由で良いコードを書くようになる
    • 良いコードは 生成・保守コストが低い
    • AIモデル間の 競争が激化 しており、勝ち残るモデルは シンプルかつ保守性の高いコード で開発者の生産性を向上させる必要
    • 市場原理 が「slop」を長期的には排除

ソフトウェア開発現場の変革と課題

  • Node.jsの Ryan Dahl が「人間によるコーディングの時代は終わった」と発言
  • ソフトウェアの 平均的な複雑度が急上昇
  • Greptileの 2025 State of AI Codingレポート で、開発者1人当たりのコード行数が4,450行から7,839行に増加
    • PR(プルリクエスト)サイズも33%増
    • ファイルごとの変更量も20%増加
  • AIコーディングエージェント により、開発者はより多くのコードを短期間で出荷
  • しかし、 AI slop の本番環境投入が加速し、 品質低下・障害増加 が懸念
    • 2022年以降、システム障害が増加 (ベンダーステータスページ分析より)
  • Andrej Karpathy も「エージェントは抽象化を膨らませ、コード美学が損なわれ、コピペが多発」と指摘

良いコードと悪いコードの本質

  • John Ousterhout 著『A Philosophy of Software Design』によると、 複雑性が最大の敵
    • 良いコード: シンプルで理解しやすい・修正しやすい
    • 悪いコード: 文脈依存が強く、理解・修正が困難
  • この原則は AIエージェントにも当てはまる
    • 良いコードは 文脈把握が容易・修正も少ない行数で済む
    • トークン効率 の観点でも有利
    • 複雑なコードは トークン消費・計算コストが増大 し、スケールしない

今後の展望と経済的力学

  • AIコーディングの普及はまだ初期段階
  • 技術・競争の成熟とともに、 経済合理性がAIモデルを「良いコード」生成へと導く
  • 現在は「まずAIを動かす」フェーズであり、 最適化はこれから
  • AIコード生成が一般化すれば、市場競争により「良いコード」が必須となる
  • 開発者・企業の競争力維持のため、AIも高品質なコード生成を余儀なくされる

Hackerたちの意見

なんで新しい飛行機をロールス・ロイスのように丁寧に作る必要があるの?1970年代初頭、ケリー・ジョンソンと私はロサンゼルスで、ソ連の偉大な空力学者アレクサンドル・ツポレフと夕食を共にしたんだ。彼は言った。「君たちアメリカ人はロレックスの時計みたいに飛行機を作る。ナイトテーブルから落とすと、止まっちゃう。でも私たちは安い目覚まし時計みたいに作る。テーブルから落としても、ちゃんと起こしてくれる。」…彼が説明したのは、ソ連はひたすら耐久性を重視した機械を作っていて、ひどい天候や原始的な着陸場にも耐えられるようにしていたってこと。コスト削減のために、パイロットの安全さえも容赦なく犠牲にしていたんだ。私たちはコストを削減するために無慈悲である必要はないけど、シボレーで十分なのに高級モデルを作る必要はあるの?最初からちゃんと作ればいいけど、永遠に持つものを作る必要はないよ。 - ベン・リッチ(スカンクワークスより)

面白い話だけど、ソフトウェアの比喩としてはあまり良くないね。もし、誰でもすぐに安く飛行機を作れる技術があったら、航空工学の経験がない人でも飛ぶのは今よりずっと怖いことになるよ。航空業界の厳しい安全基準やメンテナンス基準には、ちゃんとした理由があるんだ。それを守らなかった場合に何が起こるか、私たちは見てきた。ソフトウェア業界に同じようなガードレールがないのは祝うべきことじゃない。良い開発プラクティスや規範を理解せず、あるいは気にせずに誰でもソフトウェアを作れる技術を解き放つのは、根本的に悪いアイデアだよ。

それから、ソフトウェアにおける「贅沢」が何かについて、みんなが意見が違うんだよね。

ソ連のエンジニアリングは雑じゃなかったよ。頑丈さ、ゆるい公差、シンプルさを考えて設計されてた。よく考えられたデザインだったんだ。同じように、安い目覚まし時計にもロレックスの時計と同じくらいの思考が入ってるか、むしろそれ以上かもしれない。エンジニアたちはただ異なる要求があっただけ。安くて精度の低い部品を信頼性を持って組み合わせるのは大変なんだ。ロレックスは楽だよ、すべての部品が高精度で作られていて、完璧にフィットするから。安い目覚まし時計は、何が出てくるかわからないから、あらゆる可能性の欠陥を考慮しなきゃいけない。予算内でそれ以上のものは得られないし、時計は時間を教えてくれなきゃいけないからね。ソフトウェアにおける平行線は、防御的プログラミングやフォールトトレランスなどだね。皮肉なことに、これはクリティカルなソフトウェアでは一般的な手法で、開発するのが最も高価なソフトウェアなんだ。雑とは真逆だよ。

人々は、特定の抽象レイヤーは自動化できるなら、そんなに手間をかけなくてもいいってことを受け入れる準備ができていないんだよね。今は、1つのクラスが汚れていても、そのクラスのAPIはクリーンであるべきっていう段階に来てる。もうクラスの内部をレビューする意味はないと思う。ほぼ確実に意図した通りに動くはずだから。次のステップはマイクロサービス自体だね。そのマイクロサービスのAPIはクリーンであるべきだけど、内部はどうでもいいかも。ここはまだ10%くらいだね。

パフォーマンスは重要じゃないの?もしあなたのAIがO(n)のアルゴリズムを使っているときに、O(log n)の実装があるとしたら?出力は「正しい」ままだよ。

「私に反対する人は、感情的に欠陥があるからだ。」

大体の開発者は2つのタイプに分かれると思う。1つは、ユーザーのために製品を作る手段としてコードを扱うタイプ。もう1つは、コード自体を自分の技術として扱い、製品はその技術を表現する手段に過ぎないタイプ。AIについて最も否定的なことを言う人たちは、だいたい後者のタイプで、AIが彼らのアートの大部分を自動化してしまうことで、前者の人たちが製品をより早く改善できるようになっている。個人的には、私は前者のタイプだね。誰もあなたのコードの良さで購入を決めることはない。一般の人々は、あなたの製品の能力と限界以外には興味がないから。もちろん、もし大きなバグをコードに入れちゃったら、それがユーザーに悪影響を与える結果になるけどね。それを踏まえて、後者のタイプの人たちにはリスペクトがあるよ。でも、彼らは実際にそのレベルの技術が役立つプロジェクトに向いていると思う(例えば、ミッションクリティカルなソフトウェアや、他の開発者が依存するライブラリなど)。この話をするのは、どのタイプのプロジェクトについて話しているのかがはっきりしていないと難しい気がする。

あなたの意見、特にその正直さには敬意を表するよ。そして同時に、いつかその考え方を持った誰かが書いたプロジェクトを維持しなければならない状況に追い込まれることを願っている。残酷だけど、残念ながら「他人の不幸は蜜の味」って本当にあるから、私も正直でいたい。もう「船を出してから質問する」プロジェクトには年を取りすぎたよ。

だいたい同意だな。AIに関する議論で混乱が生じるのは、「ソフトウェアエンジニアリング」がいろんなことを指すからだと思う。Next.jsのアプリとKubernetesのオペレーター、コンパイラなんかは全然違うしね。僕は、LLMコーディングが存在する前に複雑さの崖を越えたプロジェクトに関わったことがある。すでに長期的なユースケースを持つ顧客がいて、それを壊すわけにはいかないときは、かなり厄介になる。ユースケースは、実質的に改善できない技術的負債のゴルディアスの結び目に支えられているからね。一つのバグの問題じゃなくて、速度や信頼性の完全な崩壊が問題なんだけど、製品は成熟していて、まだ利益を上げているから、放棄して最初からやり直すのは現実的じゃない。技術的負債を急いで取り入れたことで、製品の人気が上がったけど、結局は行き止まりになっちゃった。バランスを取るのは難しいよね。多くのLLM生成プラットフォームも最終的にはこの罠にハマると思うけど、それには何年もかかるだろうね。

雑な技術設計は、バグや体験の不具合、そして不安定さとして現れることが多い。特にウェブサイトみたいなソフトウェアでは、少しの不具合は許容されることがある。セッションは比較的短いし、ユーザーはページをリロードすればいいからね。こういうコードベースの技術的厳密さはあまり高くないけど、まあ大丈夫だよね。でも、マルチプレイヤーゲームのサーバーやドライバーのように、問題に非常に敏感なソフトウェアもある。ここでは技術的厳密さが非常に重要で、一つのミスが壊滅的な結果を招くこともある。こういうソフトウェアには、自分のコードに誇りを持ちたい人が集まるんだ。なぜなら、品質が本当に大事だから。彼らはLLMに脅威を感じていると思う。LLMが彼らを上回るからではなく、LLMが(今のところ)悪い技術設計の決定を下すことで、高い厳密さのソフトウェアが最終的に壊れてしまうから。

これは、人々が「内向的」か「外向的」かで全てを決めるようになった時の話に似てるね。みんながこの極端に単純化された二分法に基づいて人生をどう生きるか決め始めた。コードが良ければ製品も良くなるものがある。ほとんどの製品は信頼性が求められるから、信頼性のあるコードがより良い製品を作るのは理にかなってると思う。それはコード職人であることではなく、良いプロダクトデザイナーであり、業界によっては良いビジネスマンであることでもある。あるいは、業界によっては、悪いコードが人々の生活を壊すことに無頓着でないことでもある。

誰もあなたのコードの良さに基づいて購入を決めたことはない。全くの間違いだ。 > 一般の人々は、あなたの製品の能力や限界以外には何も気にしない。これも間違い。人々は、製品が好きな理由がコードの良さにあるとは知らないかもしれないけど、バグがほとんどなくて、パフォーマンスが非常に良くて、作業を迅速に助けてくれるソフトウェアが好きなんだ。明らかに、製品の品質に深く関わっている人たちによって作られたもの(バグレポートを実際に読んで、問題をすぐに修正するような人たち)だよね。製品が存在する時間が長くなるほど、コードの品質が重要になってくる。多くの人が「5秒で出せ!」という執着を持っているのは、遅くて簡単なタスクをこなすのにギガバイトのメモリを使うゴミソフトウェアの行列を続けるだけだよ。どちらかの陣営を選ぶ必要はないと思う。ユーザーのために良い製品を作りたいなら、彼らのために作るコードも自分の作品として扱うべきだよ。高品質な仕事に代わるものはないから。

誰も生まれた時からコードの品質に気を使うわけじゃない。人々は、内部の品質(結束性、モジュール性、堅牢性)が外部の品質(正確性、速度、進化可能性)につながることを理解することで、クラフトに気を使うようになるんだ。コードの品質に気を使う人たちは、会社の金で絵を描きたいアーティストじゃない。彼らは、製品を出荷することに深く関わっていて、それが自分や同僚にとって快適な体験になるように気を使う人たちなんだ。そして、次の週には考えずにより良い決定ができるように、今日少し多くのことを考える成熟さも持っている。だから、ローンチの翌日の午前4時に緊急デバッグのために呼ばれるような問題が、本来なら適切に設計されていればあり得ないはずなんだ。 > 誰もあなたのコードの良さに基づいて購入を決めたことはない。通常、彼らは製品の内部を見ることはできないけど、外部から推測することはできる。今年も「雰囲気で作られたクソ製品」と呼ばれる製品をたくさん見てきたけど、オープンソースじゃなくてもね。でも、これはただの事実じゃない。コードの品質は多くの購入決定に影響を与える要素なんだ。オープンソース製品を買うときは、自分のチームがリポジトリをチェックするのが非常に一般的だよ。最初の5分で、適当に作られた明らかな兆候があれば、売上の可能性はかなり下がる。大きな取引では、ソースコードの検査は購入のためではなく投資の決定のためだったけど、緊急のAPI設計をするために個人的に雇われたこともあるよ。そうすれば、その会社が設計したものを持っていて、その設計が良いことを示せるからね。

この考えが繰り返されているのをよく見るけど、私は「コードを作ること」にこだわる人と「製品を作ること」にこだわる人の二項対立は受け入れられないな。私にとって、良いコードを作ることの全てのポイントは、細部に気を使って製品を作ることなんだ。これは切り離せないよ。コードや技術にこだわる人が、細部やデザイン、作り上げるものに対してもすごく気を使っている人に会ったことがない。私が見てきた限りでは、両者は同じ資質の異なる表現だと思う。

AIによるコーディング革命がより良いソフトウェアを生み出していないのは明らかだと思う。実際、今のソフトウェアは以前よりも脆弱に見える。コードの品質は絶対に重要だよね。素人には見えにくい品質だけど、丁寧に作られたプログラムを使うと、その違いを感じるよ。

面白いことに、俺は両方の気持ちがある気がする。時々はコードそのものや、その書き方に夢中になってる。コードが自分のやりたいことにぴったり合うのが見えると、実現するのがすごく楽しみになる。あのものを作りたい!でも他の時は、具体的に達成したいことがあるけど、それを実現するのにかかる時間を考えると憂鬱になる。どうやって実現するかは分かってるけど、どれだけのステップが必要で、どれだけのコンポーネントを作らなきゃいけないかも分かってるから、ただそれが憂鬱なんだ。欲しいものはあるけど、それを作るために時間をかけたくない。最近は、ずっとやりたかったことをたくさん作れてすごく楽しい。時間を正当化できなかったからね。AIに「必要なものを追加して」「以前は時間がもったいなかったエッジケースを処理して」って言う時間もあるし、めちゃくちゃ楽しいよ。だけど、やりたい楽しい部分を書くために立ち止まることもある。自分が楽しいと思う部分だけをコーディングすればいいから、最高だね。

誰もあなたのコードの良さで購入を決めたことなんてないよ。俺が購入を決めるときは、支払いがすぐに正しく通って、購入したものが適切な時間内に届くことを期待してる。これらはすべて、ソフトウェアの信頼性にかかってる。もしユーザーが購入が正しく実行されない匂いを嗅ぎ取ったら、金や商品がどこかに行ってしまったら、それは会社にとって死刑宣告だよ。業界は今、エージェントがあなたの代わりにこれを行うエージェンティックウェブを推進している。でも、基盤がぐちゃぐちゃで、不安定なモデルがその上に乗っかって幻覚を見たりミスをしたりするなら、それはただの大惨事のレシピだと思う。ミッションクリティカルなソフトウェアだけを2)のカテゴリに relegating するのは、日常のサービスにどれだけの信頼性が必要かという現実から逃げてると思う。

一方で、平均的なソフトウェアの複雑さは急激に増加しているよね。…統計によると、開発者はコーディングエージェントを使ってもっと多くのコードを出荷しているみたい。その結果はもう見えているかもね:ベンダーのステータスページの分析によると、2022年以降、障害が着実に増加していることが示唆されていて、ソフトウェアがより脆弱になっていることを示している。これが原因で大規模なAWSの障害も見たことがある。もっと悪化する可能性があるよ。数年後には、AIが修正できない大規模なインフラ障害が発生して、誰もそのコードを理解していないかもしれない。現在のAIコーダーは、プロンプトの履歴とコード自体以外に、何をしているのかの設計レベルの表現を持っていない。それが本質的に複雑さの増加につながるんだ。これはAIに固有のものではなく、今のAI駆動のコーディングのやり方の特性に過ぎない。AI駆動のコーディングプロジェクトで使われる中間形式として、役立つ設計表現に取り組んでいる人はいるのかな?「修理装置自体が修理を必要としている」 - E.M.フォースターの「機械が止まる」より、1909年。

私もこの開発を批判的に見ているけど、どうしてAIが最終的に問題を解決できないと考えるの?

これは本当に危機的な状況に向かってると思う。制約やボトルネックの不完全なシステムがあって、主要なボトルネックの一つ、新しいコードを追加するスピードを排除しちゃった。これで他の部分にすごく負担がかかると思う。業界はソフトウェアの複雑さの非線形コストについて、すぐに教訓を得ることになるだろうね。この記事の著者がシンプルさを強調しているのは嬉しい。特に彼らのビジネスの性質を考えるとね。「コードは重要じゃない」って考えを完全に受け入れる人たちは、痛い目にあうことになるよ。長期的には、これを助けるためのツールやモデルの進化がもっと出てくると思うし、すぐに大きな経済的インセンティブも生まれるだろう。でも今は、ダムが決壊したような感じで、本当の影響が現れるのを待ってる状態だね。

プロンプトの履歴も、開発者にプロセスへの信頼を与えるにはあまりにも弱いよね。もっとデザインの改善が必要だと思う。

経済的な面については同意するよ。クリーンなコードは、人間が書いたかAIが書いたかに関わらず、時間とお金を節約してくれる。その部分は変わらない。でも、モデルが自分たちだけでそこに到達するとは思わない。AIは、あなたが許可すれば、ずっと動作する混乱を生成し続けるよ。良いコードを書くためのプレッシャーは、実際に出てきたものをレビューして反発する開発者から来なきゃいけない。そのインセンティブはあるけど、誰かがそれに行動を起こさないと意味がないんだ。

そうだね、結局はユーザーの操縦(あるいはその欠如)に従うツールに過ぎないんだ。

AIを使わせると、一日中めちゃくちゃなものを生成するよ。良いコードを書くプレッシャーは、実際に出てきたものをレビューして反発する開発者から来なきゃダメだと思う。結局、また別の強化学習の形で車輪を再発明してるだけじゃない?俺はコーディングにLLMの助けを使わないけど、もしずっと「何をどうするか」「何をしないか」「どんな前提を持つか」を教え続けなきゃいけないなら、自分でその作業をやった方が脳を刺激できると思う。個人的には「うん、全部やってくれるよ、ただしどうやってやるか教えればね!」っていう話は根拠がない気がする。最も賢い人間を真似しても、バカを真似できるの?

これが真実だったことは一度もないよね。最高のプロセッサが勝ったことはある?ないよ、x86はゴミだし。最高のプログラミング言語が勝ったことは?ないよ(そもそも最高を選ぶことはできないし)。コンピュータ以外のほとんどの分野でも同じことが言えるよ、稀な例外を除いて。

著者がタイトルを更新したので、ここでも更新したよ。以前のタイトルは「良いコードはまだ勝つ」だったけど、「良いコード」というフレーズに基づいた表面的な議論が多すぎたからね。タイトルがそういう影響を与えるのは驚きだよ! (告白:『良いコードはまだ勝つ』は僕の提案だったんだ。確か、最初は「AIのスラップは未来か?」だったと思う。勝つこともあれば負けることもあるね。)

このサイトのモデレーターが、YC企業の人たちとどうやってHNタイトルを工夫してインタラクションを良くするかを話し合っているなんて、全然考えたことなかった。ほんとにおめでたいな、私。

経済的な観点は、著者たちが考えているほど単純じゃないよ。 mediocre なコードやひどいコードがたくさんある製品でも、失敗しているわけじゃないからね。悪い設計のソフトウェアアーキテクチャの最悪なところは、凍りついてどんどん技術的負債が増えていくことなんだ。これは必ずしも競争の問題じゃなくて、お金さえあればほぼどんなコードベースでも維持できるよ。

たとえお金があっても、そんな職場環境(コードベース自体や、その状態に至った文化)を我慢できる才能あるエンジニアを引きつけたり、維持したりするのは難しいかもしれない。彼らはしっかりとしたソフトウェアを作りたいけど、混乱に足を引っ張られているんだ。

特定の分野で最も成功したソフトウェアは、通常は最高のソフトウェアじゃない。この記事の著者たちは、存在しない世界に住んでいるんだ。クリーンコードは、何年も前に負けたよ。

付け加えたいのは、フロー状態でのコーディングが過小評価されているってこと。脳が変化や変数にピタッとハマると、AIを使うよりも全然違って、効率的なんだよね。

フロー状態でのコーディングはずっと評価されてきたけど、新しい技術に取って代わられちゃったね。脳はエージェント的なコーディングでも「パッとハマる」ことができるけど、もっと高い抽象レベルでやらなきゃいけないかも。もしかしたら「ハマる感覚」が違って、調整が必要になるかもしれないね。

フロー状態でのAIプロンプトもできるんだけど、あんまり話題になってない気がする。

何年も「複雑さ」について話してきたけど、ビジネスの人たちは全然理解してくれなかった。今やソフトウェア開発はほぼ完全に複雑さの管理になってるから、やっと彼らがソフトウェアエンジニアリングが何かを理解してくれることを願ってる。複雑さを減らせるエンジニアの価値をやっと認めてくれるといいな。ずっとソフトウェアアーキテクチャに興味があって、ソフトウェアアーキテクトになりたいって夢見てたけど、大学を卒業したらそのポジションは消えかけてたんだよね。