第三大难题

Hacker News Top 新闻

摘要

文章将“树映射”(即将一般图表示为层次结构的挑战)视为计算机科学中的第三大难题,与命名事物和缓存失效并列,并探讨了它在文件系统、写作、架构和生物学中的体现。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/17 00:43

# 第三个难题 来源:https://mmapped.blog/posts/48-the-third-hard-problem ✑2026-02-28glasperlenspiel (https://mmapped.blog/notes/glasperlenspiel.html)编程 (https://mmapped.blog/notes/programming.html) --- - 空间、树与网络 (https://mmapped.blog/posts/48-the-third-hard-problem#spaces-trees-webs) - 文件系统 (https://mmapped.blog/posts/48-the-third-hard-problem#file-systems) - 写作 (https://mmapped.blog/posts/48-the-third-hard-problem#writing) - 架构 (https://mmapped.blog/posts/48-the-third-hard-problem#architecture) - 生物学 (https://mmapped.blog/posts/48-the-third-hard-problem#biology) - 结论 (https://mmapped.blog/posts/48-the-third-hard-problem#conclusion) --- 根据一个经典笑话 (https://martinfowler.com/bliki/TwoHardThings.html) —— 出自菲尔·卡尔顿 (https://www.karlton.org/karlton/) 之口 —— 计算机科学只有两个难题:命名和缓存失效。它们之所以难,是因为没有算法能解决:好的命名需要同理心和理解力,而缓存失效需要系统思维和仔细分析。本文描述了另一个这样的问题,它无处不在又难以察觉,却鲜有人注意:将一般图映射到层次结构上。我称之为**树映射**。 ## 空间、树与网络 (https://mmapped.blog/posts/48-the-third-hard-problem#spaces-trees-webs) 我们的大脑进化得异常擅长处理物理空间。我们可以凭直觉在陌生城市中定位,还能画出几十年前去过的地方的精确地图。自然,我们希望在生活的方方面面都利用这种能力。 物理空间的一个核心特征是它的层次化和局部化结构。我们将每一小块空间视为自包含的,且只与邻近部分交互,这使得我们能够以层次化的视角看待世界:物体形成集合,这些集合可以作为一个整体来理解 —— 粒子构成原子,原子构成分子,分子构成物体,以此类推,直到星系和超星系团。 层次结构对我们来说如此自然,以至于它们成为我们主要的组织工具。我们将事物和想法分类到标记的盒子中,再将它们放入更大的盒子中。这适用于一次只能在一个地方的物理对象。然而,想法和信息却抵制分类法。它们形成复杂的**网络**,穿透僵化的边界。 树 (https://en.wikipedia.org/wiki/Tree_(abstract_data_type)) 将层次结构形式化;它们是计算机科学中使用最广泛的结构之一。树与空间密切相关,是通用的空间组织者:B树组织数据库中有序的键空间,k-d树 (https://en.wikipedia.org/wiki/K-d_tree) 在图形学中切割多维空间,抽象语法树在编译器中组织线性标记序列。 ⊕ 解析是一个空间组织问题,因为它需要用语法角色标记标记序列。 但尽管树非常有用,它们无法直接模拟网络。因此,**树映射** 是一个问题,需要将网络嵌入到树中,同时扭曲网络结构。 让我们看几个例子。 ### 文件系统 (https://mmapped.blog/posts/48-the-third-hard-problem#file-systems) > 数字世界因此让我们超越了现实世界组织事物的最基本规则:与其让每样东西都有一个固定位置,不如让事物可以同时被分配到多个位置。 大卫·温伯格,《万物皆杂》 想象一下,你收到了牙医的账单。你会怎么归档它?放在一个通用的“archive”文件夹里?还是放在更具体的“medical”文件夹里?放在“XXXX年税务”项目文件夹里,以备未来报税时使用?还是复制一份,然后同时选择所有选项? 在 Dropbox 和 Google Drive 的时代,这个问题似乎毫无意义。然而,维多利亚时代的绅士们可能也思考过同样的问题,就像我们整理虚拟文件时一样。我们最先进的分布式系统的面向用户设计,继承了物理世界的大部分限制。 操作系统也面临同样的困境:文件应该按所属应用程序组织,还是按类型组织?Windows 和 macOS 传统上偏好前者,将应用程序打包成(大部分)自包含的包。大多数 Linux 系统则采用后一种方法,所以当你安装一个软件包时,它的碎片会散落在文件系统的各个地方:库文件放到 `/usr/lib`,文档放到 `/usr/man`,配置放到 `/etc/`,等等。 这种选择伴随着权衡:拆分包简化了工具(`man` 只需要查看少数几个位置),并支持复用,但使软件管理变得复杂。在 Linux 上打包和安装现代应用程序的痛苦,催生了受 macOS 启发的包格式,如 Snap (https://snapcraft.io/docs) 和 Flatpak (https://flatpak.org/)。 如果你曾经尝试组织一个非平凡的代码仓库,你可能遇到过同样的问题。现代项目包含用不同语言实现的组件,例如,前端用 TypeScript,后端用 Rust。你可以按组件分组文件(`/acme/payments/index.ts` 和 `/acme/payments/main.rs`),或者按语言分组(`/acme/ts/payments.ts` 和 `/acme/rs/payments.rs`)。 ⊕ 组织代码仓库的两种常见方式:按组件(左)或按实现语言(右)。 按组件切分对人来说更容易,因为它反映了组织架构 (https://en.wikipedia.org/wiki/Conway%27s_law),但大多数工具不支持这种设置,迫使采用以技术为中心的方法。Google 和其他一些工程组织咬紧牙关,按项目组织仓库(`/search`、`/shopping`、`/maps`),同时开发了大量与语言无关的构建工具。Google 的 Blaze (https://news.ycombinator.com/item?id=9257000) 是首批此类工具之一。它启发了 Pants (https://www.pantsbuild.org/)、Buck (https://buck.build/) 和 Please (https://please.build/),后来作为 Bazel (https://bazel.build/) 开源。 然而,这些困境大多是自找的。数字文件系统没有内在理由要成为装满文件夹的书架的拟物化。有几个项目尝试过类似网络的文件系统(例如 BeFS (https://en.wikipedia.org/wiki/Be_File_System) 和 WinFS (https://en.wikipedia.org/wiki/WinFS)),但都没有对现状产生重大影响。不过,随着标签和链接通过网络服务进入公众意识,文件系统可能会效仿,并随时间演变成网络。 ### 写作 (https://mmapped.blog/posts/48-the-third-hard-problem#writing) > 作家的目标是将思想网络编码成一个单词字符串,使用短语树。 史蒂芬·平克,《风格感觉》 书籍是层次结构的缩影:它们有章节,章节包含段落,段落由句子组成,句子由单词构成,单词由字母组成,全部整齐地分成编号的页面。然而,我们在这些页面上表达的想法绝非线性或层次化的。 许多故事看起来是线性的:讲述者按事件发生的顺序描述事件,章节边界标志着场景变化和时间跳跃。但每个故事背后都有一个思想网络。将这个网络解开成一串单词,并在另一个头脑中重建网络,是每个作家的原始挣扎。 > 写作很容易。你只需要盯着一张白纸,直到血珠从额头滴落。 吉恩·福勒 在小说中,**网络** 涉及人物之间的关系,以及读者应该与他们建立的情感联系。最好的小说利用媒介的局限性来发挥优势,以最能引起读者困惑和参与的顺序呈现事件。它的最终目标是提供连接点并组装完整网络的乐趣。 然而,当底层网络变得密集和抽象时,作家的任务变得艰巨,读者的任务也是如此。数学教科书就是一个完美的例子。数学可能看起来像乐高积木塔,简单概念在底层,复杂性逐渐增加至顶层。的确,从欧几里得的《几何原本》 (https://en.wikipedia.org/wiki/Euclid%27s_Elements) 开始的每个连贯的数学演示都遵循这种模式。然而,基础块的选择往往是任意的。当你了解数学概念如何与其他所有概念相关联时,它们会改变形状并获得细微差别。我记得在完成实分析 (https://en.wikipedia.org/wiki/Real_analysis) 课程几个月后醒来,意识到我终于**理解**了极限 (https://en.wikipedia.org/wiki/Limit_(mathematics)),这要归功于我当时正在上的常微分方程 (https://en.wikipedia.org/wiki/Ordinary_differential_equation) 课程。甚至我对自然数的理解也随着我每读一本教科书而改变。概念的选择和呈现顺序塑造了读者的体验,所以没有两本数学书有相同的目录。 下次你坐在空白的设计文档前不知道从何下手时,对自己宽容一些。你正在解决一个难题。 ### 架构 (https://mmapped.blog/posts/48-the-third-hard-problem#architecture) > 人造城市的构成单元总是组织成一棵树。 克里斯托弗·亚历山大,《城市不是树》 ⊕ 莱维敦(左,公共领域,来源:Wikipedia (https://commons.wikimedia.org/wiki/File:LevittownPA.jpg))和锡耶纳(右,版权 Vyacheslav Argenberg (https://www.vascoplanet.com/),遵循 CC BY 4.0 协议 (https://creativecommons.org/licenses/by/4.0/deed.en))。 在他 1965 年的文章《城市不是树》 (https://www.patternlanguage.com/archive/cityisnotatree.html) 中,建筑师兼数学家克里斯托弗·亚历山大观察到设计城市与自然生长城市之间的区别,将莱维敦和昌迪加尔归类为设计城市,将锡耶纳和京都归类为自然生长城市。他认为人造城市感觉压抑,缺乏一种给自然城市带来生机和舒适感的秘密成分。 根据克里斯托弗·亚历山大的观点,差异在于支撑城市设计的数学结构。人造城市被组织成树:它们由孤立的社区组成,每个社区都有一个住宅区、一所学校和一座购物中心,外加一些分隔的专业区域,例如文化中心和工业区。相反,自然城市具有半格 (https://en.wikipedia.org/wiki/Semilattice) 结构,这使更丰富的互动得以涌现。在自然城市中,生活各方面的界限是模糊的。工作、休闲和娱乐重合且相互作用。 城市设计是一个树映射问题,需要将人类关系的半格嵌入到特定地形中。不存在规范的映射,因此克里斯托弗·亚历山大自然无法提供一个通用蓝图来设计一个自然城市。 > 你现在无疑想知道一个半格但不是树的城市是什么样子。我必须承认我还没能向你展示平面图或草图。仅仅演示重叠是不够的——重叠必须是正确的重叠。 克里斯托弗·亚历山大,《城市不是树》 换句话说,自然城市在将人类生活的网络布置在街区和建筑的层次结构中时,保留了更深层的连接。没有算法能告诉你这些连接是什么。 ### 生物学 (https://mmapped.blog/posts/48-the-third-hard-problem#biology) 生物分类学 (https://en.wikipedia.org/wiki/Taxonomy_(biology)) 是一门对生物体进行分类的学科。它始于形态学分类学,基于容易观察到的特征,例如动物是否有脊椎或是否哺乳。这种方法容易出错,因为有用的特征常常在生命树的远支上独立演化 (https://en.wikipedia.org/wiki/Convergent_evolution)。 例如,头足类动物的眼睛 (https://en.wikipedia.org/wiki/Cephalopod_eye) 与脊椎动物的眼睛惊人地相似,尽管它们的共同祖先可能更像一条带有感光点的盲虫。如果相机式眼睛 (https://en.wikipedia.org/wiki/Eye#Spherical_lens_eye) 定义一个生物类群,那么它的成员将是一个奇怪的群体。 历史上充满了实际错误分类的案例。真菌曾被归类为植物,直到 20 世纪中期它们被单独列为一个界。鳄鱼和鸟类曾属于姐妹纲(*爬行纲* 和 *鸟纲*),尽管鳄鱼与鸟类的关系比与其他爬行动物更密切。 形态学分类学是树映射的另一个例子,因为特征集合形成概念 (https://en.wikipedia.org/wiki/Formal_concept_analysis),而它们的包含关系形成的图比树更通用(格 (https://en.wikipedia.org/wiki/Lattice_(order)))。豪尔赫·路易斯·博尔赫斯在他的文章《约翰·威尔金斯的分析语言》 (https://www.crockford.com/wilkins.html) 中嘲笑了这样的分类法,他引用了一部虚构的中国古代百科全书《天朝仁学广览》: > 动物分为:(a) 属于皇帝的 (b) 防腐的 (c) 驯养的 (d) 乳猪 (e) 海妖 (f) 神话的 (g) 流浪狗 (h) 包含在本分类中的 (i) 发疯般颤抖的 (j) 不可数的 (k) 用极细的骆驼毛笔画出来的 (l) 等等 (m) 刚刚打破花瓶的 (n) 从远处看起来像苍蝇的 豪尔赫·路易斯·博尔赫斯,《约翰·威尔金斯的分析语言》 分支分类学 (https://en.wikipedia.org/wiki/Cladistics) 是一种现代系统,基于共同祖先和遗传学对生物进行分类。尽管由于水平基因转移 (https://en.wikipedia.org/wiki/Horizontal_gene_transfer),这种映射并不完美,但它比传统分类更准确、更具揭示性,因为它保留了现有的连接,而不是强加人为的连接。 ## 结论 (https://mmapped.blog/posts/48-the-third-hard-problem#conclusion) 既然你知道了这个问题,你就能轻易发现它无处不在。它潜伏在数据库建模挑战中(说的就是你,MongoDB),导致了面向对象类层次结构的消亡,并构成了与 Rust 借用检查器斗争的基础(对象所有权图是树,但对象交互是网络)。它对你的 `node_modules` 目录大小和你的食谱布局负有责任。 应对树映射的主要策略是保持意识。我们本能地趋向层次结构,常常没有注意到自己正在做出选择。我们必须停下来问:哪个网络正在被扁平化?哪些链接被牺牲了?而且最重要的是,目标媒介一开始必须是树吗?

相似文章

超级马里奥比你想的更具数学性

MIT Technology Review

麻省理工学院硬度小组的研究证明,超级马里奥关卡可能无法判定,意味着没有任何计算机程序总能确定马里奥能否到达城堡,将超级马里奥置于最难复杂度类别中。

斩断戈耳狄俄斯毛线团

Lobsters Hottest

作者反思了为其 Intertwingler 应用服务器解决复杂依赖关系图的挑战,旨在实现密集超媒体以减少过多的读写需求,同时批评人工智能生成过多内容。

面向组合几何极值问题的几何感知MCTS

arXiv cs.AI

本文提出了一种几何感知的蒙特卡洛树搜索框架,用于在n×n网格上求解极值组合几何问题,在六个测试问题中的五个上取得了新的最佳已知结果,包括对No-Three-in-Line问题的改进。