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

誰も全体のシステムがどのように機能しているかを知らない

概要

  • Twitterの衰退 により LinkedInの台頭 が注目される現状
  • 技術的理解の限界 について、複数の専門家の意見を紹介
  • 「自分の使う技術をどこまで理解すべきか」 という根本的な問い
  • AIやフレームワークの普及 が理解の断絶をさらに拡大
  • 複雑な技術システム に対する人間の知識の本質的な限界

Twitterの衰退とLinkedInの台頭

  • Twitterの衰退 による LinkedInの新たな社会的役割 の拡大
  • 技術分野の 有識者たちの議論 がLinkedIn上で活発化
  • Simon Wardley、Adam Jacob、Bruce Perens、Louis Bucciarelli らの重要な発言の紹介

技術を「理解する」とは何か

  • 技術リテラシーの測定 に関する疑問
  • 電話の仕組みシステムの物理的・論理的構造 への無知
  • 自分は本当にこの技術を理解しているのか」という不安
  • 複数レイヤーにまたがる知識 (物理、アルゴリズム、運用、経済、規制など)の必要性
  • 誰も全てを理解していない という現実

技術面接と知識の限界

  • 技術面接 で「 どこまで知っているか」を探る手法
  • Brendan Gregg による「知識の限界に直面した時の反応」評価
  • 「全てを理解できる人はいない」 という前提

主要論者の主張まとめ

  • Wardley
    • 理解せずに構築する危険性 の指摘
    • 「魔法」フレームワーク (例:Ruby on Rails)が仕組みを隠蔽
  • Jacob
    • AIの普及 がソフトウェア開発のあり方を変革
    • 利便性とリスクのバランス を評価
  • Perens
    • 複雑な現代システム の中で既に理解の断絶が起きている現状
    • 根本的に誤ったメンタルモデル の蔓延
  • Bucciarelli
    • システムの複雑性 ゆえに「全体を理解する人間はいない」と指摘
    • 部分的理解しか持ちえない という技術の本質

技術的複雑性と人間の限界

  • AIの進化 が「理解の断絶」をさらに拡大
  • しかし「 全体を知ることの不可能性」は以前から存在
  • 複雑な技術社会 における知識の本質的な限界
  • 部分的理解実用的運用 とのバランスが今後も課題

Hackerたちの意見

実際にはそんな風にはいかないよね。「みんながどうやって物事が動いてるのか知らない」っていうのが問題じゃないと思う。人は料理の細かい化学や物理のメカニズムを理解しなくても、自分の食べ物を作ることができたから。でも、基本を理解しなくなるのは問題だよね。たとえば、店で用意された卵を買うだけで、自分で卵を焼くことができなくなるとしたら、それは全然違う無知だし、もっと危険だよ。農業企業が小麦や肉を生産するのは問題ないかもしれないけど、もし企業がみんなのために標準化された料理を作り始めたら、それって本当に同じことなのか?それは良い進化なのか、そうじゃないのか?ここが議論のポイントだね。

ほとんどの人は狩りをしたり、火を起こしたり、食べ物を育てたりする方法を知らないよね。もし全てのスーパーやレストランが長期間食べ物を売り切れたら、人々は飢え死にするだろう。でも、実際にはそんなことは起こらない。なぜなら、スーパーやレストランがたくさんあって、供給チェーンもいろんな場所から調達しているから、冗長で分散型の性質があるから問題にならないんだ。だから、自分で食べ物を作るのも同じこと。結局、ロボットやフードレプリケーターが十分にあれば、食べ物を作る方法を知っていることは関係なくなるよ。壊れても、どこかに必ず見つけられるからね。(注:まだそこには至っていないけど)

どの時点で「大丈夫」と「心配」の境界線が引かれるの?君が言ったのは君の視点からのものだと思うけど、みんなが同意するわけじゃないし、主観的だよね。

それは全然違う無知で、もっと危険だよ。なんで?テフロンパンで卵を焼く方法を知らない方が危険なの?それとも石の上で薪の火で焼く方法を知らない方が危険なの?前者を知っていて後者を知らないのは許されるの?テフロン業者に依存しないために、材料科学を理解する必要があるの?

ここで主張されているつながりは、すぐに崩れちゃうな。CPUの命令、キャッシュ、メモリアクセスなどは、議論され、テストされ、強化され、文書化されているレベルが、最近使われているLLM生成のコードとは桁違いなんだ。基本的なコンピュータの抽象化は、そんなに漏れやすくもないし、明日リファクタリングが必要なほどでもないよ。

AIがこの状況を悪化させるだろう。私はAIに懐疑的な方だけど、この記事の結論は正しいとは思わない。LLMが私たちのためにできることは、正反対なんだ。彼らはほぼすべてのことについて訓練されているから、AIに電話がどうやって動くのか、ブラウザにURLを入力するとどうなるのかを尋ねれば、実際に答えて詳しく説明してくれる(それは論文サイズのテキストになるけど)。正確さや幻覚を除けば、電話がどう動くのか全く知らない人間よりも、はるかに優れているよ。人間の脳は「自分が知らないことを知らない」という領域にかなりのギャップがあるけど、言語モデルは非常に広範な知識を持っていて、ある意味で優れている。ただし、コストが高くて電力を大量に消費するけどね。まあ、技術的な詳細は置いといて。LLMは知識の機械で、すべてのレベルで人間の言語で説明されている限り、すべてのことについて知っているのが得意なんだ。LLMは私たちの知識を、以前は不可能だった方法で統合してくれる。推論やコード生成はあまり得意じゃないけど、ほぼ何にでも答えるのが得意なんだ。

これには多くの層があるけど、私が気になるのは一つのプログラミングスタイルだ。上の層(製品が存在する理由やシステムの目標)も下の層(実際にその動作を実装する方法)も理解していない状態。過去には多くの開発者がビジネスケースをほとんど理解していなかったけど、少なくともコードに翻訳する方法は理解していて、ビジネスに対して圧力をかけることができた。でも今は、コードがどう動くかを知っている必要すらないみたい!議論は、「それは他の誰かの心配だ」という薄い潤滑油の上で浮かんで、チケットからチケットへと幸せに滑っていくことのようだ。目標も成果も理解していない。テストがグリーンでボタンが送信されれば、ミッション完了!Claudeを使っていると、状況認識がどんどん薄れていくのを感じる。どんなコードも見なくなる開発スタイルが明らかになってきた。私の英語の指示は、何の成長も残さない。上に戻すために何も学べないし、下に何があるのかも知らない。私が存在する理由は何?

開発者の平均在職期間は長い間2.5年だったし、チームを変える開発者も多かった。AIが登場する前から、多くの開発者は自分がメンテナンスするために呼ばれたコードがどう動くかを理解していなかった。 > 私の英語の指示は、何の成長も残さない。私は何も学ばず、下に何があるのかも知らない。私はなぜ存在するべきなのか?Claudeコードを使うときは、何をどうするかを更新するマークダウンファイルを維持するように言ってみて。単に「$yをやれ」じゃなくて、「$xのために$yをやる必要がある」とかね。マークダウンファイルが更新されれば、それが記録されて、エージェントが正しいコードを出して変更を加えることがあるよ。考えてもみなかったユースケースもね。そしたら「なぜ$yをしたの?」って聞けるし、予想外でも、ああ、正しかったんだなってなる。 > 私はなぜ存在するべきなのか?それは間違った質問で、正しい質問は「なぜ私の雇用主は私に給料を払っているのか?」だよ。雇用主は、明確に定義された要件を働くコードに変えるために給料を払っている。お金を稼ぐためか、あるいはお金を節約するためにね。もしあなたが中堅のチケットテイカーなら、それがあなたの役割だよ。タイトルに関係なく、誰もあなたがforループを使うかwhileループを使うかなんて気にしない。高いレベルでは、あなたは自分の$n年の経験を使って、より曖昧で影響力のある大規模なプロジェクトを、期限通りに、予算内で、要件を満たす実装に変える責任がある。LLMが登場する前は、自分のコーディング、チームを組むこと、そしてディレクターやCTOに「これは社内でやるべきことじゃない」と伝えることが求められた。今は、そのリソースの間にコーディングエージェントが加わっている。いずれにせよ、チケットテイカー以上の立場の私は、まずコードの行を見ていないだろう。機能要件と非機能要件を満たしているかをテストして、主にホットスポット、つまり同時実行の問題、セキュリティの問題、そして明らかなスケーラビリティの問題を見て、実際のトラフィック、ウェブリクエストやETLジョブのトランザクションで叩く前に確認するんだ。パールを握りしめる前に言っておくけど、私は80年代にアセンブリを趣味で始めて、キャリアの最初の15年はC言語で複数のメインフレームやPC、後にはWindows CEデバイスでビットをいじってたんだ。

もっと「ハンズオフ」じゃなくて、小さな編集を最適化するClaudeコードが欲しいな。例えば、IDEに座って、いくつかの行を選択して、(例えば)Caps Lockを押して音声をアクティブにして、何を調整すべきかを短く言うと、それが次の調整のためにステージされる感じ。例えば「ここに新しいユースケースが必要だから、yをする関数を作ろう」とか。 [関数が現れる] いいね、オブジェクトをそれに接続する必要があるね [クラスを指さす] [LLMが言語サーバーを通じてコードパスを遡って見つけて、情報を渡す] そのUXの主な障害は、応答の速度だと思う。音声認識はほぼ瞬時だけど、その後のコーディングプロンプトは良くなるまでに少し時間がかかるからね。そんなインタラクティブなアプローチは、スピードがあればもっと良く感じるだろうな。残念ながら、誰もLLMのためにマウスと音声の組み合わせをターゲットにしていないみたいだ。これは、さまざまなタイピング関連の問題を抱える人々にとっても素晴らしいアクセシビリティツールになるだろう。

理想的なシナリオでは、従業員が交換可能であることが望ましい。組織全体を人質に取るような、代替不可能な個人は必要ないからね。そういう個人から自分を守る方法の一つは、全てのメンバーが他の人の役割を取れるだけの知識を持つことを確保することだ。少しのトレーニングの後でもね。問題は、高いレベルの能力と透明性を維持するのは非常にコストがかかることだ。もう一つの解決策は、組織が完全に混乱していて、誰も何をしているのかわからない状態になることだ。そうすると、組織は非効率的になるけど、その非効率は全体の観点から見ると安く済むかもしれない。

皮肉なことに、「オーナーシップ」はよくある管理の話題だけど、実際にオーナーシップを取ろうとすると、アクセスの壁や情報不足、一般的な「君はここで何をしているの?」というメンタリティにぶつかる。確かに、一人の人間が全てを知っているわけではないけど、大企業は特に、あなたに何の可視性も与えたがらないように見える。締切を与えられて、残業して必死に間に合わせようとしているのに、その締切があなたが招待されていない会議で延長されたことを発見するのは特にイライラする。さらに悪いことに、「彼は今すごく頑張っているから、元の締切に間に合えば予定よりも早く進むし、間に合わなければ余裕がある」というような暗い管理手法を使っていることもある。もし私が管理の道具として使われることが期待されているなら、私は自分の職務をその通りにこなすだけで、さらに何かをするつもりはない。もしオーナーシップが期待されているなら、少なくともクールな子たちのテーブルに座って、何か関連することを言う機会が必要だよね。

なんか不思議なんだけど、Claudeを使うことで、実際にやろうとしてることにもっと集中できる気がする。プログラミングの30年間、ずっと「ヤクシェービング」に時間を費やしてたんだ… ボイラープレートの設定とか、いつもやらなきゃいけない基本機能の追加、サポートシステムの設定とかね。Claudeを使うと、そういうことがすごく早く終わるから、実際にやりたいことに集中できるし、だからこそ、自分が大事にしてるコア機能を頭の中に保てるんだ。他のプロジェクトで共通する部分をやるために、コアで新しい部分を脇に置く必要がなくなる。

まぁ、正直言うと、もう何年も前からその状況にはいたよね(依存関係地獄)。そういう場合、LLMは実際に物事を改善する可能性が高いと思う。自分自身としては、ある程度何が起こってるかを知りたいけど、抽象化も大事だと思ってる。自分みたいな人間は商業的にはあまり意味がないかもしれないけど、それはもうかなり前からそうだったんだよね。

確かに私はソフトウェア開発者じゃないから、私が扱うものはもっとシンプルなことが多い。でも、「全体がどう動いているかを知っている」と認められている人たちは、その区別を得るために努力してきたと思う。必ずしも実際にどう動いているかを知っているわけじゃなくて、1. 必要に応じて調査して物事がどう動いているかを見つけ出す能力と興味がある人たち。彼らは物事がどう動いているかに興味を持っている。私の場合、数学や物理など、自分の分野の「接着剤」に関してはかなり有能だと思う。2. 知識のギャップを埋めるために必要なときに即興で答えを出せる能力があること。問題を解決するために、何が理解される必要がないかを決めることもできる。

依存関係のツリーが実際に一番厄介なところだよね。普通のNode.jsプロジェクトって、800以上の間接依存関係を引っ張ってくるんだ。それぞれが独自のリリースサイクルや破壊的変更のポリシーを持ってる。チームの誰もがその内部の動きなんて理解してないけど、それはまあいいとして、誰かが破壊的変更を出したり、APIを非推奨にしたり、サポート終了になったりすると大変だよね。anon291のインターフェースの安定性についてのコメントはその通りだと思う。CPUのマイクロアーキテクチャを理解する必要がないのは、1990年のx86命令が今でも動くから。2023年のReactコンポーネントライブラリは、次のメジャーバージョンで生き残るかわからない。インターフェースが安定していてよく文書化されているときは、「誰も全体のシステムがどう動いてるか知らない」問題は管理可能だけど、インターフェース自体が変わり続けているときは本当に危険だよね。気づいたのは、チームが自分たちの依存関係がEOLに近づいているか、バージョンに既知の脆弱性があるかを追跡すらしていないこと。知識のギャップは「これがどう動くか」だけじゃなくて、「私が依存しているものはまだアクティブにメンテナンスされているのか、そして私がスキップした過去3回のリリースで何が変わったのか?」ってことなんだ。これが毎週人々を悩ませる運用上の問題なんだよね。

「気づいたのは、チームが自分たちの依存関係がEOLに近づいているか、バージョンに既知の脆弱性があるかを追跡すらしていないことだ。できれば、何らかのSBOM/SCAタイプのツールにアウトソースして監視していることを願ってる。」こう言ったけど、AIが何かに手を出す前に、古い依存関係地獄にハマってしまって、新しいバージョンを統合することができず、他の問題が何百も発生して失敗の連鎖に繋がるプロジェクトをたくさん見てきた。

これは複雑な技術の根本的な性質です:私たちのこれらのシステムに対する知識は、せいぜい部分的なものです。そう、AIはこの状況を悪化させるでしょう。でも、これは私たちが長い間直面してきた状況です。それがOKというわけではありません。これは、柱が劣化し始めた部屋に閉じ込められているようなもので、誰かがハンマーを持ってきてそれを叩き始めたときに、あなたの反応が「まあ、状況は悪いし、さらに悪化するだけだけど、屋根がまだ落ちてきてないから何もしないでおこう」って感じです。状況が耐えられないなら、正しい行動はそれを修正しようとすることであって、無視することではありません。

この記事は、どう動いているのか知らずに抽象化を使っている人々についてのものです。これは問題ない。これが進歩の方法です。でも、誰かがその抽象化を設計した(例えば、Wifiドライバ、プロセッサ、トランジスタ)ことを忘れないでください。彼らはそれが機能することを確認し、上の層にインターフェースを提供しました。完全にコーディングエージェントによって書かれたソフトウェアはただの別の抽象化だと言えるかもしれませんが、この記事はその点をあまり強調していないので、何を伝えたいのかよくわかりません。「私は自分のwifiドライバを理解していないから、自分のコードを理解する必要はない」というのは、有効な主張には聞こえません。

この記事は、どう動いているのか知らずに抽象化を使っている人々についてのものです。これは問題ない。これが進歩の方法です。大きな問題は、今やほとんどの人が抽象化を作ることができない実際のリスクが存在することです。確かに、巨人の肩に乗るのはいいけど、IAの前はほとんどの人が余分な作業をして頭を使っていました。誰もが抽象化を作り、「偶発的な複雑さ」を隠すのは良いけれど、「必要な複雑さ」に対処して、実際に仕事をしたと言えるべきだと思う。もしそれがただのバカなパイプでしかないなら…

「ブラウザのアドレスバーにURLを入力してエンターを押すと何が起こるの?」いろんなレベル(例えば、HTTP、DNS、TCP、IPなど)で話せるけど、実際に全てのレベルを理解してる人っているのかな? 要約すると、割り込み、802.11ax変調方式、QAM、メモリモデル、ガーベジコレクション、フィールド効果トランジスタ… まぁ、ある程度は理解できるよ。多分、俺は少数派で、いろんな職業を経てきたし、ちょっと自閉症も入ってるかも。最初のキャリアは、アメリカ海軍の潜水艦の核電子技術者/原子炉オペレーターだった。そこでの訓練では、電子理論やトラブルシューティング、修理を教わったんだけど、「これが電子だ」と始まり、「これでVMEbus [0] Motorola 68000ベースのシステムをコンポーネントレベルまでトラブルシュートできる」と終わるんだ。後にその学校に戻って教えたこともあって、68000の訓練カリキュラムをIntel 386を使うように書き直したんだ(進歩だよね?)。さらに、すべての潜水艦乗組員は資格を得る前に口頭試験を受ける必要があって、そういう質問はすごく一般的なんだ。例えば、「私は海水の一滴です。あなたのラックのライトをどうやって点けるの?」ってね。その質問に答えるためには、(記憶から)たくさんのシステムを描いて、それらをつなげて、正しいバルブ番号や電気バスを説明しながら、ボードメンバーが興味を持つような様々なトピックに深入りしていくんだ。もしどこかに書いてあったり、導き出せるものであれば、それは全て対象になる。TFAのブレンダン・グレッグの知識の限界を探る話のように、ボードメンバーはあなたが知らないことを見つけるまで止まらない。そうなったら、そのことを調べて、戻ってくる必要がある。俺がテックの世界に入った時も、この考え方を適用した。知らないことがあったら、調べる。ドキュメントを読んだり、マニュアルページを見たり、仮定をテストしたり、いじったり、実験したり。これが何年も役立ってきたし、事件やトラブルシューティングの時に、ランダムに見える知識が浮かび上がってくることもある。全部は覚えてないけど、ソースのドキュメントを見つけて記憶をリフレッシュするのには十分覚えてるよ。0: https://en.wikipedia.org/wiki/VMEbus

理解の度合いは色々あるよね。例えば、ウェブ開発者としてはブラウザやOSIネットワークスタックを知ってる(理論的には、いろんな調整があるけど)。それから、電子機器についても知識があったりするけど、無線の部分は全く別の世界で、全然違う考え方が必要なんだ(アナログ波)。それで、深い穴にハマるのがすごく長くて広くなっちゃうんだよね(無線はそれ自体が大きな世界だから)。

確かに、下のレイヤーがどう動いているか、つまりコンパイルされたコードが詳細にどう実行されるかはいつも知っているわけじゃない。でも、コンパイラを使うのに十分なメンタルモデルは持ってるし、コンパイラの作者たちがちゃんとやってることを信じてる。結果がしっかりテストされていることもね。40年以上、いろんな言語を使ってきたけど、それは素晴らしい賭けだと思ってる。でも、自分のコードがどう動くかは理解してる。下のレイヤーを理解していないことと、自分が責任を持つレイヤーを理解していないことには大きな違いがあるんだ。