
2026/05/14 22:00
第三つのハード・プロブレム
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
本文で扱われている核心的課題は「ツリーマッピング」であり、複雑な情報のネットワークを硬直した階層に強制する際に、元々の接続が必ず歪んでしまうという困難な問題である。ツリーはデータベースの B ツリーやコンパイラのアブストラクト・シンタックスツリーなどの形式的構造を通じて物理空間を表現することには自然に適応しているが、重要なリンクを犠牲にして思想的な微妙さを捉えられないことが多い。組織化と複雑さの間にあるこの緊張関係を管理するためには、開発者がツリーベースのモデルを採用する際に、どの関係性を平坦化するか、あるいは捨てるかを意図的に決定せねばならない。この必要性は、生物学が単純な特性からクラディスティクスへ移行した歴史的変化、文学による都市計画への人工性の批判、そして Google の Bazel ビルドシステムのような工学上のジレンマなどによって示される。現在の影響範囲にはデータベースモデリング、Rust の借用チェックアロガの論理、
node_modules などのディレクトリレイアウトが含まれる。今後、この分野はノード間のリンクをどのように削除するかについて決断を下すことで、構造的秩序と情報の複雑さのバランスを目指していく。究極的には、より優れた戦略により、業界はデータを構造化するプロセスにおいて重要な関係を失うことなく膨大なデータを整理することが可能となる。本文
✑ 2026 年 2 月 28 日 glasperlenspiel プログラミング
スペース、ツリー、そしてウェブ
ファイルシステム | 書き込み | 建築 | 生物学 | 結論
フィル・カルトンの名を冠した古典的なジョークによれば、コンピュータサイエンスにおいて最も困難な問題は二つしかないという。それらは「名前をつけること」と「キャッシュの無効化」である。なぜなら、これらに算法によって解を得ることは不可能だからだ。優れた名称は共感と理解から生まれ、キャッシュの無効化にはシステム全体の視点と慎重な分析を要する。本稿では、もう一つの同様な問題を取り上げる。それは広範囲に及ぶのにかつくすしく見えながら、いまだによく認識されていない問題であり、「一般グラフを階層構造にマッピングすること」である。私はこれを「ツリーマッピング(tree mapping)」と呼ぶ。
スペース、ツリー、そしてウェブ
人間の脳は物理的スペースを取り扱う点において、驚くほど優れて進化したものである。私たちは未知の都市で直感的に方位を確立でき、数十年前に訪れた場所の正確な地図を描き出すことができる。当然のことながら、私たちはこの能力を生活のあらゆる側面で活かしたいと考えている。物理的スペースの決定論的特徴の一つは、その階層的かつ局所的な構造にある。私たちは各々の空間部分を自己完結的なものとして知覚し、近隣の部分との相互作用のみを認めるため、世界を階層的に捉えることができる:粒子から原子へ、原子から分子へ、分子から生物体へ、そして天まで続くように、銀河や超団塊へと至る。階層性は私たちにとってあまりに自然なものであり、それが支配的な整理ツールとなった。私たちは事物や考え事をラベル付けされた箱へ分類し、それらをさらに大きな箱の中に入れる。これは同時に一つの場所しか在ることができない物理的物体に対しては有効であるが、アイデアや情報はそのような階層的分類(タクソノミー)に抵抗する。むしろ、それは堅牢な境界を貫く複雑なウェブ構造を形成するのである。ツリーは階層性を形式化するものであり、コンピュータサイエンスで最も広く用いられる構造の一つである。ツリーはスペースと密接に関連しており、普遍的な空間整理装置として機能する:データベースでは B ツリーが順序付けられたキー空間を整理し、グラフィックスでは k-d ツリーが高次空間を区切り、コンパイラでは抽象構文木(AST)が線形的なトークン列を整理する。
解析は、トークン列に構文的役割を付与する必要があるという点で、一種の空間整理の問題である。
しかしながら、ツリーがいかに有用であっても、ウェブを直接モデル化することはできない。したがって、ウェブ構造を歪めながらそれをツリーの中に埋め込むという課題が「ツリーマッピング」となり、その例をいくつか検討してみよう。
ファイルシステム
デジタル世界はこうして、現実世界を整理する最も根本的なルール——つまり「すべてのものに固有の場所があること」——を超えることを可能にした。代わるに足るのは、「複数の場所に同時に割り当てられるべきである」という考え方だ(デイヴィッド・ワインベルガー『すべては雑多なもの』より)。
歯科医から請求書が届いたと想像してみてほしい。これをどう归档するか?一般的なアーカイブフォルダに入れるか、より具体的な「医療」フォルダに入れるか、将来の所得税申告用の「XXXX 年度 税務プロジェクト」フォルダに入れるか、それとも複製して一度にすべての選択肢を取るか?この問いはドロップボックスやグーグルドライブのようなクラウドストレージが普及した今日では議論の余地をなさそうだが、 викtoria らんの紳士たちが手紙を整理する際にも同様の悩みを抱えていただろう。私たちもまた、バーチャルな紙を整理する際に同じような問いを投げかけているのである。私たちの最先端の分散システムのユーザー向け設計には、物理世界に由来するほとんど全ての制約が継承されている。オペレーティングシステムもまた同じジレンマに向き合わねばならない:ファイルは、それに関連するアプリケーションによって整理すべきか、それともタイプによって整理すべきか?Windows や macOS は伝統的に前者を好み、アプリケーションを(ほぼ)自己完結型のバンドルとして配布してきた。一方、大多数の Linux システムは後者のアプローチを採用しており、パッケージをインストールした際、その断片がファイルシステムに散在するようになる:ライブラリは
/usr/lib へ、ドキュメントは /usr/man へ、設定情報は /etc/ へと分散配置される。この選択にはトレードオフが存在する:パッケージを細分化することはツールの運用を容易にし(man ページが見つかる場所が限られる)、再利用性を高めるが、ソフトウェア管理を複雑化する。現代のアプリケーションのパッケージ化とインストールに伴う苦労は、macOS スタイルのバンドル形式(Snap や Flatpak など)の開発へとつながった。あなたが非自明なコードリポジトリを整理しようとした経験があるなら、おそらく同様の問題に出会ったことだろう。現代のプロジェクトでは、フロントエンドに TypeScript、バックエンドに Rust といったように複数の言語で実装されたコンポーネントが存在するため、ファイルをコンポーネント単位(/acme/payments/index.ts と /acme/payments/main.rs のように)または言語別(acme/ts/payments.ts と acme/rs/payments.rs のように)にグループ化するという選択が迫られる。
コードリポジトリを整理する二つの一般的な方法:
- コンポーネント単位による整理(左)
- 実装言語別による整理(右)
コンポーネント単位での切り分けは人間にとって容易で、組織構造そのものを反映するが、多くのツールはこの設定をサポートせず、結果として技術中心主義的なアプローチを強制してしまう。グーグルを含む少数のエンジニアリング組織は困難を乗り越え、プロジェクト単位(
/search、/shopping、/maps など)でリポジトリを整理し、その過程で言語に依存しないビルドツールの叢生を開発した(グーグルの Blaze は最初のそうしたツールの一つであり、Pants や Buck、Please を刺激し、後に Bazel としてオープンソース化された)。
しかし、これらのジレンマは大半が自業自得である。デジタルファイルシステムが棚に積まれたフォルダのようなスキューモーフ(skeuomorph)にならなければならないという内発的な理由は存在しない。いくつかのプロジェクト(BeFS や WinFS など)がウェブ様式のファイルシステムを試しに行ったが、いずれも現状に変革をもたらすことはできなかった。ただし、タグやリンクといった概念がウェブサービスを通じて一般意識に浸透してくるにつれ、ファイルシステムもそれに追随し、やがて時間とともに「ウェブ」として進化していくかもしれない。
書き込み
作家の目標は、表現すべき考え事のウェブを、構文ツリーを用いて言葉の列へと符号化することである(スティーブン・ピンカー『スタイル感覚』より)。
本は階層性の頂点に立つ:章があり、その中に段落があり、段落には文章があり、文章には言葉があり、言葉は文字からなり、すべて番号が付けられた整然と区切られたページへと切り分けられている。にもかかわらず、これらの頁上に表現される考え事は、決して直線的でも階層的でもなくある。多くの物語は線形的に書かれている:話者は事件を起こった順に記述し、章の境界で場面の変化や時間飛躍を示す。しかし、物語の背後には常に考え事のウェブが存在する。そのウェブを言葉の列へと解きほぐし、別の心のなかで再び同じウェブを再現させることは、あらゆる作家が直面する原初的な苦闘なのである。「書き込むのは簡単だ。ただ真っ白な紙にじっと見つめていけば、やがて額には血の滴が集まる」(ジーン・フォラー)。
創作小説においては、このウェブは登場人物間の関係性や、読者がそれらと築くべき感情的つながりを含んでいる。優れた小説は媒体の限界を利点に変え、最も謎めき且つ読者を惹きつける順序で事件を提示する。その究極の目標は、点を繋ぎ、完全なウェブを組み立てる喜びを読者に届けることにある。しかし、基盤となるウェブが密かで抽象的になればなるほど、作家と読者の両方の負担は増大する。数学入門書はその完璧な例である。数学は単純な概念を基礎に置き、階段を追うにつれ複雑さが高まっていくレゴブロックの塔のように見えるかもしれない。実際、エウクリッド『要素』から始まる一貫した数学の提示はこのパターンに従う。しかしながら、基礎となるブロックの選択はしばしば恣意的である。数学的対象は、他のすべてとの関係性を知る過程で形状を変え、ニュアンスを得ていく(私は微分方程式の授業を受けていた頃、実解析の授業を終えて数ヶ月後に覚醒し、「ついに極限の意味を理解した」と気づいたのを覚えており、また自然数の理解も読む教科書によって毎回変化しているように思える)。アイデアの選択とその提示順序は読者の体験を形作るため、どの数学書の目次も異なるのである。次に空の設計ドキュメントに向き合い、どこから手を付けていいかわからないときこそ、自分自身に優しくしよう。あなたは難しい問題に取り組んでいるのだ。
建築
人工的な都市を構成する単位は常にツリーの形態へと整理される(クリストファー・アレクザンダー『都市は木ではない』より)。
レヴィットタウンのパノラマ像(左、パブリックドメイン、出典:Wikipedia)とシエナの像(右、著作権 Vyacheslav Argenberg、CC BY 4.0 ライセンスより)。
建築家かつ数学者のクリストファー・アレクザンダーは 1965 年の論文『都市は木ではない』の中で、設計された都市と自然発生した都市の間にある違いを観察し、レヴィットタウンやチャンドイガルを設計された例、シエナや京都を自然発生型の例として分類した。彼は人工的な都市が窒息しており、生活感や安らぎをもたらす「秘密の成分」が欠如していると論じる。アレクザンダーによれば、この差異は都市設計を支える数学的構造の違いに由来する:人工的な都市はツリー構造で組織化されており、各々は隔離された近隣区域を持ち、それぞれに住宅複合体、学校、ショッピングモールといったものを有し、さらに文化センターや工業地区のような区画化された専門領域がいくつか付帯している。一方、自然発生型の都市は半格子(semilattice)構造を持ち、それによりより充実した相互作用が生じる。自然発生型の都市では、生活の側面間の境界が曖昧となる:仕事、余暇、遊戯が重なり合い、相互に作用する。都市設計とは、人間関係の半格子を特定の地形へと埋め込むというツリーマッピングの問題であり、canonical なマッピングが存在しないため、クリストファー・アレクザンダーが自然発生型都市のための普遍的な設計図を提供できなかったのも当然である。あなたが今、「半格子だが木ではない都市」はどのような外観を呈するかと疑問を抱くに違いない。
「私はまだあなたに計画やスケッチを示すことはできません。単に重なり合いを実演するだけでは不十分です。それは正しい重なり合いである必要があります。」(クリストファー・アレクザンダー『都市は木ではない』より)
つまり、自然発生型の都市は街区や建物の階層の中に人間生活のウェブを展開させながら、より深いつながりを保存するのである。これらのつながりが何かを算法が教えてくれるわけではない。
生物学
生物分類学は生きている生物を分類する分野である。それは形態学的分類学から始まり、動物に背骨があるかどうかや幼体への哺乳など、容易に観察できる特徴に基づいていた。このアプローチは誤謬の可能性がある:有用な形質が生命樹の遠く離れた枝で独立して進化するからである。例えば、頭足類の目は脊椎動物の目と驚くほど類似しているが、その共通祖先はおそらく光受容斑点を持つ盲獣のようなものであった。カメラ型眼を生物群の定義に用いれば、その成員は奇妙な集団となるだろう。歴史には実際の誤分類で満ち溢れている。菌類は 20 世紀半ばに独立の界を与えられるまで植物として分類されていた。カメレオンや鳥類はかつて兄弟分類群(両生類と鳥類)に属したが、実際にはカメレオンの方が他の爬虫類よりも鳥類に近い。形態学的分類学もまたツリーマッピングの一つである:形質の集合が概念を形成し、それらの所属関係は樹より一般なグラフ(格子)となるからである。
ホセ・ルイス・ボルヘスは論文『ジョン・ウィルキンスの分析言語』の中で、架空の古代中国百科事典『慈悲の知的館』からの引用を用いて、そのような分類体系を皮肉った:
- (a) 皇帝に属する動物
- (b) 製菓された動物
- (c) 訓練された動物
- (d) モルモット
- (e) シレノイド
- (f) 伝説上の動物
- (g) 迷犬
- (h) この分類に含まれる動物
- (i) はしゃぐ動物
- (j) 数えられない動物
- (k) 非常に細かいウサギの毛筆で描かれた動物
- (l) などなど
- (m) お椀を割ったばかりの動物
- (n) から見て蚊に見える動物
(ホセ・ルイス・ボルヘス『ジョン・ウィルキンスの分析言語』より)
クラディスティクスは現代の分類体系であり、共通祖先と遺伝子に基づいて生物を分類する。水平転移による不完全性はあるが、既存のつながりを保持するため、人為的なつながりを強制する伝統的な分類よりも正確で示唆に富むのである。
結論
あなたがこの問題について知った今、あちこちに存在するものを見つけることは難しくなくなる。それはデータベースモデリングの課題( MongoDB にこそ見られる)に潜み、オブジェクト指向のクラス階層を脅かし、Rust の借 Checker との葛藤の根底にある。また、
node_modules ディレクトリの内容や、コンプブックの配置にも責任を持つ。ツリーマッピングへの主な対処法は「意図的であること」だ。私たちは階層性への依存が本能として働くため、選択を行っていることに気付きがちではない。一旦立ち止まって問わねばならない:どのようなウェブがフラット化されているのか?どのリンクが犠牲になったのか?そして最も重要なのは、そのターゲット媒体はそもそもツリーであるべきなのだろうか?