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

バイブコーディングはバスファクターをゼロにする

概要

  • 本記事は筆者個人の意見であり、雇用主の立場を代表しない主張
  • “Bus factor”という知識継承リスクの概念を解説
  • ChatGPT登場後、知識管理がAI依存になった現状を批判
  • LLM生成コードのリスクと“vibe coding”の問題点を指摘
  • 知識の断絶による“Bus factor 0”の危険性を強調

AI時代の“Bus factor”と知識継承リスク

  • 本記事およびウェブサイト上の意見は 筆者個人の見解雇用主の意見 ではない
  • 本記事は 2025年8月のHackerNews で議論、 コメント参照推奨
  • “Bus factor”は チームから主要メンバーが失われたときプロジェクト知識が消失するリスク指標
    • 例: データベースバックアップ復元 を知る人が3人なら Bus factorは3
  • 人類は 知識継承のためドキュメント・教育・引き継ぎ など多様な手段を開発
  • しかし 2022年11月30日ChatGPT公開 で状況が一変
    • “AI first”時代の到来、 知識管理の人間離れ が進行

“AI first”時代の知識喪失とvibe coding

  • “AI first”は 人間が二番手 になるどころか、 知識管理から人間が消失
  • プログラミング分野では LLMによるコード生成 が常態化
    • コード理解や知識保持 を避ける風潮、 “vibe coding” の流行
  • LLM生成コードの 品質問題vibe codingの欠陥 は別議論
  • 重要なのは、 コードの読み解きどんなに良いコードでも難解
  • LLM以前は メンターやドキュメント など、 最低限の知識継承 が期待可能
  • 現在は LLMが生成した不完全なコード と、 その説明を同じLLMに頼る状況
    • 初期設計や意図を誰も知らないコード の保守・改修・脆弱性対応の困難
  • ユーザー視点でも 誰も構造や理由を知らないソフトウェア への個人情報投入リスク

“Bus factor 0”時代の危険性と結論

  • “Bus factor 0”を生む vibe coding本質的に破綻
  • 唯一の例外は 100%正確なAIコード生成100%正確なプロンプト が実現した場合のみ
  • vibe codingに不安 がある場合は、 プログラミング学習アドバイス記事カテゴリ 参照推奨

Hackerたちの意見

記事ではAI生成コードの潜在的な問題がたくさん挙げられてるけど、解決策が今あるのか、これから出てくるのかを考えることは全くないね。- LLMが登場する前は、チームがちゃんと調査してれば、新しいコードベースに取り組むときはいつでも助けが得られたもんだ。著者はレガシーコードに関わったことがないのかな?- (あ、初期の執筆プロセスについてはすっかり忘れちゃってるみたいだけど)。著者はこれが解決できるとは思ってないのかな?- バスファクターがゼロになる状況を生むから、バイブコーディングは根本的に欠陥がある。つまり、AIが100%正確なコードを100%の確率で生成できて、100%正確なプロンプトが与えられるまではね。なんで100%の正確さが常に必要なんだろう?人間は常に100%正確じゃないのに、私たちは彼らにコードを任せてるのに。

うん、この記事はちょっと単純化しすぎだと思った。私は共有所有のコードベースで働いてるけど、時には自分のブランチで作業してるときに元の著者に連絡できないこともある。少なくともパートナーがいろんなことを説明してくれるのはすごく助かる。もしかしたらOPは人間がいない世界を想像してるのかもしれないけど、人間がいないっていうのは、私たちのチームが時々直面する現実の問題だよ。

なんで100%の正確さが常に必要なんだろう?前にも言ったけど、もう一度言うね:反AI派の人たち、AIユーザーじゃなくて、AIが魔法の万能薬だと思ってる人たちが多い。なんか、論理エラーを捕まえられないから静的型付けに反対する人たちを思い出す。

こんにちは、著者です。コメントありがとう。最初のポイントには同意するよ。AIが将来的にそのギャップを埋めるかもしれないけど、その頃にはかなりのダメージがすでに発生してると思う。LLMの推論の記憶についてだけど、将来的に解決できたとしても、元の生成に関連するアーティファクトを失ったコードがすでにあるんだ。全体的に、AIが「常に学習している」とか言われてるけど、新しいモデルがリリースされるまで実際には何も新しいことを学んでないと思う。> なんで100%の正確さが常に必要なんだろう?人間は常に100%正確じゃないのに、私たちは彼らにコードを任せてるよね。確かにそうだけど、人間がコードを書くことはバスファクターが0になるわけじゃないから、問題が何かを理解して対処するのが簡単だよね。もし上記の他のギャップが解決されれば、これも部分的に解消されると思う。

過去にレガシーコードベースを掘り下げているときに、AIツールがあればよかったな。「そのperlファイルの著者に聞けばいいじゃん」。確かに、最後に編集されたのは97年で、著者は今や地域マネージャーだし、会議を予約すればいいのかな…?

残念ながら、企業の仕組みはバスファクターが0に収束してきてる。私は今まで、重要なサブシステムの知識を持っているのが自分だけのチームに何度も所属してきたけど、他の人に教えようとすると無駄だった。主に「コスト削減策」で解雇されるから。高プロファイルのオペレーションを扱ってるときに、もうやめたくなるくらいのこともあった。それが続けば、システム全体が長期間動かなくなるところだった。正直、多くのエンジニアと話してると、たくさんの企業がこんな風に運営してるみたいだ。AIが組織の知識の喪失を加速させて、システムの急速な劣化を引き起こすことになると思ってる。

私の予想?AI企業は、開発者やそのマネージャーを引きつけるために無料プランと月額20ドルプランを維持すると思う。月額200ドルのプランも用意して、より大きなコンテキストウィンドウで、より大きなコードベースで効果的に作業できるようにするんじゃないかな。でも、大規模なプロジェクトを持つ企業は、いずれもっと大きなコンテキストウィンドウが必要になるから、それが突然年間20万ドル/開発者のサブスクリプションになると思う。「組織的知識」とコンテキストウィンドウの間には、かなりの相関関係があると思う。

この記事はコードだけからどれだけ意図を読み取れるかを過小評価してると思う。コメントがなくてもね。人間(そしてLLMも、人間の生産物の統計的合成だと思うけど)はかなり予測可能だよ。同じ問題に対して同じ解決策を取る傾向があるから、どうやって解決されたかは、なぜ、誰が、いつ解決したかを教えてくれる。確かに、今は多くの知識が隠れてしまってるけど、高い従業員の離職率がある組織でも同じことが言えるよね。

この記事はコードだけからどれだけ意図を読み取れるかを過小評価してると思う。それはスケールに関係してるね。私はArduinoのコードを読むのにほとんど困ったことがない。でも、一般的なArduinoの限界は32kBの(コンパイルされた)コードだから、数週間から数ヶ月の努力が必要だったり、場合によっては不可能だったりする。数カ国語で書かれた100以上の相互依存するマイクロサービスがあるプラットフォームを理解するのは、私にはかなり大変だ。もしかしたら、そのすべてに非常に熟練した経験豊富なアーキテクトがいて、包括的なAPIスタイルやドキュメントを要求していたのかもしれない。でも、もしそれが全部バイブコーディングで、私に責任を押し付けられたら?私はやめるよ。

記事は、コードだけからどれだけ意図を読み取れるかを過小評価してると思う。コメントがなくてもね。確かに、人間の思考プロセスは、どのように物事を進めるかのいくつかの可能性に埋め込まれるけど、それでもプロセスだし、知識のある人がいるのとは比べ物にならないくらい劣ってる。リバースエンジニアリングは、これまで必要な時にしか行われてこなかった。(まあ、特にレガシーコードベースではみんなやってるけど、生産性には全然良くない。) > 人間(そしてLLMも、統計的に人間の成果を合成してるから、強くそう思う)って結構予測可能だよね。括弧内には同意できないな。それがLLMコードの一番の特徴だと思う:コードには確かに意図が埋め込まれてるけど、それは色んな意図がごちゃ混ぜになってる。小さなスニペットからはあまり推測できないよ。そのスニペットの意図は、全く別の元のコードベースに関連してた可能性が高いから。それがLLMを育てるための堆肥の山になってるんだ。LLMのコードベースを理解するのは実際には難しい。意図が読者を混乱させるから。テキストと同じように、生成されたものが人間が書いたものと同じ意味だと暗黙のうちに思い込んじゃうけど、そうじゃないんだよね。

LLMを使ってレビューされていない大量のコードを生成してるなら、それは間違ってるし、プロジェクトは一度でもアーキテクチャ的に間違った道に進んだら、維持不可能になる運命だよ。LLMが得意なのは、例えばこんな状況:* これを適用したい - バン、半日分の作業が2分で完了。* テストデータとユニットテストの骨組みを設定したい - バン、半日分の作業が2分で完了(注意:LLMをスタート地点として使うのはいいけど、実際のテストケースを生成するのは慎重にレビューしないとダメだよ。すごくバカなAI生成のユニットテストを見たことがあるから)。* SQLite DBに保存して、別のバックエンドAPIを持つビジュアルウェブエディタが欲しい - バン、3日分の作業が2分で完了。* 複雑すぎて賢い正規表現ではできない大規模なコードベースに対して、繰り返しの変更を適用したい - バン、以前は絶対にやらなかった作業が2分で完了。難しい問題を解決する必要はなくて、LLMを使って生産性を大幅に向上させることができる。単にヤクを剃るだけでいいんだ。時間の節約にならなくても、無限の雑務に疲れ果てることなく、興味のある問題に集中できるようになるよ。

中間的なアプローチもあって、AIにPRレビューを生成させて、それを手動でレビューするっていう方法もあるよね。だから、君が出した2分のコード(実際にはCCを使うと5〜10分くらいかかるけど)をレビューするのにさらに1時間か3時間かかるし、マージする前に5〜10回のコミットが必要になるかもしれない。私は10,000〜20,000行、約100ファイルのプロジェクトでこれを成功させたことがあるけど、完全にLLM生成で、私のフィードバックもたくさん入れてて、うまくいってるよ。実装する機能の4/5は、私が提供した仕様にかなり近い形で実現できてるし、作業の大部分はリファクタリングだね。でも、うまくいかない時は、一日がかりになることもある。全体的には、たぶん3〜5倍のスピードアップにはなってると思う。ただ、もっと大きなプロジェクトでやるのはちょっと自信がないかな…そうなると、モジュールに分ける方が魅力的に見えてくる。

LLMを使って未レビューのコードを大量に出力してるなら、それは間違ってるよ。 > ばむ、数日分の作業が2分で終わった。 これはちょっと誤解を招く表現だね。なぜなら、その2分にはレビューにかかる時間が含まれてないし(実際にはその時間を大幅に超える)、そうなると最初の段落で言ってる「間違ってる」状況に陥ることになるから。

  • 複雑すぎて賢い正規表現では対応できない大規模なコードベースに対して、繰り返しの変更を適用したいなら、ばむ、今まで絶対にやろうとしなかった作業が2分で終わると思う。 君は無邪気にそう思うかもしれないし、私もそう思ったけど、いくつかの有名なモデルでテストした結果、最終的にはどれも「怠惰」になって、時には無関係な変更を加えたり、コンテキストが溜まるにつれて悪化していく。小さなトイ例では完璧にこなすけど、より多くのコードにスケールアップして繰り返しの変更が必要になると、エラーが積み重なっていく。エージェンティックループは状況を改善するけど、そうなると2分で終わるわけじゃなくて、何ができてないかを見つけるためにレビューしなきゃいけないし、終わるまでN回やり直しを指示しなきゃいけない。LLMに変更を加えるプログラムを書かせる方が、ずっと信頼性が高いよ。

スキャフォールディングは、LLMが素晴らしく機能するもう一つの分野だね。フレームワークXYZを使って新しいプロジェクトを作りたいんだけど、どうやってセットアップするかは覚えてない。だって、一度しかやったことないから。クラスをフレームワークから継承する方法も分からないし、通常は同じプロジェクト内の別のクラスからコピーするだけだから。ボットにスタートコードを書いてもらって、そこから進めればいいだけなんだ。悲しいことに、多くのユースケースではLLMは全く必要ない。こんなことにLLMが必要なの?コード例のデータベースをダウンロードして、サイドバーに表示される検索エンジンに接続して、「新しいプロジェクトXYZ」や「新しいクラスXYZ.foo」と入力すれば必要なスニペットが見つかるのに。多くのNPMフレームワークには新しいプロジェクトを始めるためのセットアップスクリプトがあるけど、その後はほぼGoogleを使わざるを得ない。ローカルファイル検索で簡単に解決できる問題がこれほど長い間無視されていて、唯一の解決策が非効率的なものになっているのは本当におかしいよね。

私のお気に入りの一つ - データAPIを切り替えたいけど、2つの異なるサービスを移植する時間がないから、ここのドキュメントを見て。バン!終わり。

このアイデアの精神は好きだけど、もっとたくさんあるよね。プロのコーダーやスキルのある人たちが他に選択肢があるって言ってるけど、「技術的に未熟」な人から「初心者コーダー」までのサブ例もたくさんあるじゃん。彼らは今、私たちなしでもできることがいっぱいあるんだよ。「誰かに$100/h払って試してもらう必要がある頭の中のアイデア」から、「ユーザーが3分で使えるものに変わって、仮想だけど存在しない$100/hの人を泣かせる」みたいに。あなたのコメントが言ってるより、役割のテクスチャーはもっと豊かなんだよ。今、何が可能かを知ってしまったら、メンテナンスがどうかなんて誰も気にしないし、それは未来のメンテナンスの心配より1000倍大事だよ。人々はこのステップに到達するまでに何年もかけてきたのに、今は誰かが3分で簡単にやっちゃうんだから。

面白いのは、あなたが挙げたものをソフトウェア開発とはあまり呼べないってこと。 「テストの出発点」を除けば、ほとんどが一つのプログラミング言語やAPIから別のものに翻訳するだけだよ。確かに役に立つけど、「プログラミングの未来」って感じではないね。それに、ほとんどの「基本的な」モデルが得意そうなことばかりだから、「考える」モデルはお金の無駄だと思う。プログラマーの視点から見ると生産性の向上はかなり大きいけど、雇用者の視点からはどれくらいの影響があるのかは分からないな。これって市場投入までの時間を大幅に短縮するのかな?

まだこのアイデアを練ってるところだけど、最近LLMが「最初のものを捨てるのを手伝ってくれてる」感じがするんだ。LLMを使って何かの初動を得て、ほぼ動くまで繰り返し改善して、最後に変なLLM的な部分を容赦なく取り除くって感じ。特に、何もデザインされていない単調な作業では、ただの変換やボイラープレートだからね。

あなたのコメントには賛成だけど、最近私を笑わせてくれたことをシェアしたいな。クラウドにユニットテストを書いてもらったんだけど、レビューしたらちゃんとしてて、実際に私が書いたテスト対象のコードにバグを見つけてくれたんだ。これを指摘したら、クラウドはユニットテストを通すためにバグを修正するんじゃなくて、単に失敗するユニットテストを実行しないことにしたんだよ、笑えるよね!でも、そうだね、LLMは要件やアーキテクチャを定義したり、要件に基づいて仕様を書くのは得意じゃない。コードの外にあまり影響を持たない、コンパクトで小さな要求には強いけどね。

人工知能って、全然賢くないけど、単調で繰り返しのある非クリエイティブなタスクには半分役立つって感じだね。誰がそんなことを思ったんだろう。

前提と結論には同意するけど、20年近くソフトウェアを書いたり、適応させたり、提供したりしてきた中で、同じ状況に何度も直面したことがある。聞く人もいないし、ソフトウェア開発に少しでも詳しい人は半年前に辞めちゃった。ソフトウェアが書かれてから半分のプロセスが変わってしまったし、それを担当していた人たちも辞めてしまった。だから、LLMがこのプロセスを加速させることには同意するけど、私の意見では新しい問題というわけではなく、既存の問題がもっとひどくなっただけだね。でも、こういう考え方を見るのは嬉しいよ。

著者は、バスファクターが0ということが実際にはどういう意味なのか、そしてそれに至る過程を無視しているように思う。定義の説明は最初にあるけど、知識が失われるだけだよね。バスファクターがゼロでも問題ない会社って、必要な専門知識に対して経済的なメリットを支払う気がないってこと。人間がAIと競争する経済的な需要はゼロだし、AIは得意なことを圧倒的なコスト差でやるから、マーケティングの欺瞞やコミュニケーションの混乱が予測可能な結果を招くんだ。需要と経済的利益がゼロになったらどうなる?最初に知識に投資してもリターンがない。誰もその分野に入らず、誰も学ばない。これはお金を印刷して成り立つ経済にとってかなり危険だよね。今は問題がないかもしれないけど、次の四半期には間違いなく問題が出てくる。キャリア開発のパイプラインは何年もかかるから、ゼロから始めると、時間差を考えるとゼロになるんだ(それは何年もかかる)。経済的なインセンティブがない状態が約2年続くと、優秀な人材を失うことになる。そこからは、10年のデッドラインに向かってゆっくりと進むことになり、その後は壊滅的な損失が発生する。地元のコミュニティカレッジの学長と面白い話をする機会があったんだけど、需要がないからコンピュータサイエンス関連のプログラムのセクション数を減らさざるを得なかったらしい。入門コースでは、18セクションに対して専攻を宣言したのは13人で、ほとんどの学生がAIの懸念やキャリア開発のパイプラインの欠如を理由に挙げていた。プロセスを修正するために、どんなに高い値段を払っても専門知識がないとどうなる?すべてをビジネスから追い出して、半分考える非知覚的な奴隷を使った結果だよ。供給がなければ需要もない。外部の要因で供給が無限になると、需要も生まれない。必要はあっても、需要ではない。これが2022年に始まったことなんだ。優秀な人材が再スキルをしているけど、低い能力の人材も溢れている。経済の基盤をいじると悪いことが起こるし、それは時間差で現れるから、後から反応するのが難しい。何が必要なんだろう?いつかは、戦場でトリアージをしなければならない危機が訪れるだろう。責任者たちは、変化をもたらす可能性があったときにこの話を聞きたがらなかったんだ。

ここには本当に重要なポイントがあって、それを意識することが大事なんだけど、私たちはこのツールやワークフローの始まりにいるだけで、これらの問題は解決できると思う。正直、LLMを使ってコードを書く手助けをしようとしてるけど、成功はまちまちだ。でも、彼らが得意なこともあれば、苦手なこともあるのは明らかだね。彼らが得意なのは、たくさんのテキストを生成することだし、他にも重要な点は、非常に粘り強くて徹底的であること。たくさんのコードを生成するのはリスクになることもあるけど、LLMは徹底的なコメントやドキュメント、README、ADRの更新を求めてもイライラしないから、彼らは「喜んで」自分がやったことや「なぜ」そうしたのかを文書化してくれる。もちろん、できる限りの正確さでね。だから、適切な指導と構造があれば、LLM生成のコードベースは、何年も後に人間や将来のLLMが冷静に受け入れやすくなるかもしれない。素晴らしいドキュメントがあるからね。

ここには本当に重要なポイントがあって、それを意識することが大事なんだけど、私たちはこのツールやワークフローの終わりにいるわけで、これらの問題は解決できない。

問題は、私たちの脳があまり使わない情報にカロリーを費やすのが好きじゃないってこと。何かから離れれば離れるほど、理解度や記憶力が落ちるんだ。だから、たとえコードを振り返っていなくても、変更をすべて見直そうとしても、スキルが衰えていく。エンジニアがマネジメントに入ると、役割に必要な新しいスキルにはすごく優秀になるけど、技術的な問題を解決するのがかなり無能になっちゃうのをよく見るよね。運転の自動化でレベル2からレベル5に進むのが難しい理由も似てる。私たちはプロセスに部分的に関与するようには設計されていないから、すぐに注意力を失ったり、怠けたり、機械を盲目的に信頼したりする。機械が100%信頼できるならそれでもいいけど、実際はそうじゃないことは分かってる。

バスファクターは、LLM生成コードの前から問題だった。多くの企業は、1人以上の個人が理解したり貢献したりできるように仕事を構成していない。私が見つけたのは、企業が複数の賢い個人でしっかり構成されていると、出力の期待がどんどん上がっていって、結局は本当に知るべきことが多すぎるってこと。これを回避するには、コードベースを移動させたり、プロセスのスピードをトレードオフしたりする良いエンジニアリングマネジメントが必要だよね。私もこれを試みたけど、時にはスピードを求めるステークホルダーからのプレッシャーが大きすぎて、完璧にはできないこともある。恥ずかしい宣伝だけど、こういう風に構築するCTOとしての回顧録を書いている本を更新したんだ。価格を選べるようにしたから($0でも可)、HNでの恥ずかしい宣伝を少しでも減らせると思うよ:https://ctoretrospective.gumroad.com/l/own-your-system 誰も完璧な答えを持っているわけじゃないけど、LLM構築のシステムは、eLanceやUpwork、Fiverrで10人の異なる人が作ったシステムとそれほど違わないから、原則は同じだと思う。

そう、これはまさに金魚の問題だね。必要な仕事が可能な範囲に広がっていくけど、勧められることや良いことではない。私が見た「解決策」は、プロセスにスピードバンプをたくさん置くことだけど、結局みんな怠けて、最後の瞬間に何かを届けるだけで、追加の時間を使って何かを磨くことはない。

バスファクターは確かにLLMの前から問題だったし、実際、これはずっと使われてきた専門用語だよ。TFAが主張しているのは、これまでバスファクターがゼロに向かう傾向がなかったということ。以前は、最悪でも1だったけど(もちろん時にはゼロもあったけど)、今はTFAが言うには、意識しているかどうかに関わらずゼロを目指しているということだね。

最近、すごくごちゃごちゃしたコードベースのチームに参加したんだ。開発者はもういなくて、メンテナンスしている人たちもコードの大部分を理解していなかった。バスファクターは実質ゼロだった。驚いたのは、AIがどれだけ役に立ったかってこと。コードを理解するだけじゃなく、その背後にある意図を推測するのにも役立って、デバッグがすごく早くなった。コードから直接ドキュメントを生成し始めたんだ。私にとっては大きな勝利だった。コードが真実の源だから。開発者のドキュメントや共有知識は、偏見や選択的記憶、「中国の噂」問題が多いけど、コードは嘘をつかない。ただ解釈が必要なだけ。AIを使ってノイズを切り抜け、コードが自分を説明できるようにするのは、プラスに感じたよ。

マネージャーとして、チームにルールを設けようと思ってるんだ。どのリポジトリのREADMEも、二度と古くなってはいけないっていうルール。すべての開発者がClaude Codeに既存のREADMEを読ませて、現在のコードを理解させて、PRでの変更を読んで、必要に応じてREADMEを更新するのがほぼ trivial であるべきだと思う。これが完璧だとは言わないし、エンジニアがその要約が意味を持つか確認する必要があるのは確かだけど(それは必要だし、最終的には人間が変更に責任を持つからね)、でも、私たち全員がよくやる典型的な怠惰さが、READMEが古くなる理由として排除されるべきだと思う。

プロジェクトの基盤が全てだよ。LLMは過剰設計に敏感なんだ。LLMは良いコードと悪いコードについて意見を持ってない。悪いコードを見せて、その上に機能を追加するように頼むと、もっと悪いコードが生成されるよ… なんとか動くかもしれないけど、バグが多くてセキュリティホールもある可能性が高い。LLMに与えるコンテキストが不要な複雑さを含んでいると、LLMはそれを望んでいると仮定して、さらに複雑なものを生成するんだ。私はClaude Codeを悪いコードベースと良いコードベースの両方で試したけど、違いは明らかだった。最初に気づくのは、不要な複雑さのない良いコードベースでは、特定の機能やプロンプトに対して生成されるコードがかなり少ないこと。出力をレビューするのがすごく簡単で、信頼性も高い。悪い過剰設計のコードベースでは、Claude Codeはレビューが難しい複雑なコードを生成する… 同じサイズの機能でもね。それに、しばしば間違っていて、コードが動かないことも多い。何もしていないコードを追加することも多いし、「これを変えたから、これで問題が解決するはず…」って言うけど、テストすると問題はまだ残ってる。悪いコーダーは、問題を解決するためにClaudeにもっと頼んでしまうかもしれないけど、Claudeはさらに混乱を重ねていくんだ。最終的には、全体を再構築するように頼まなきゃいけなくなって、あまりにも複雑になって、Claude自身も自分のコードを理解できなくなっちゃう。これがバスファクター0になる理由だよ。Claudeは自分が何をしているのか分からなくても、喜んでコードを生成し続けるんだ。あなたのコードがメンテナンス不可能で拡張不可能だって教えてくれることは絶対にないよ。世界で最悪のコードベースを見せたら、世界で最悪のコーダーに適応しちゃうからね。