Loading... # 生活在平面国的程序员 # 一、概述 ## 1. 文章简介 ### A. 标题 The programmers who live in Flatland(生活在平面国的程序员) ### B. 发布时间 2025 年 11 月 24 日 ### C. 来源 Red Planet Labs 博客 ### D. 作者 Nathan Marz(Clojure 专家、Rama 框架创始人) ## 2. 核心隐喻 文章借用 Edwin Abbott 的经典小说《Flatland:A Romance of Many Dimensions》中的概念:二维世界的居民无法理解第三维度的存在。作者将此隐喻延伸到编程领域——许多程序员受限于自己的"维度",无法理解更强大的编程抽象。 ## 3. 文章主旨 大多数程序员生活在"编程平面国"中,他们无法理解 Lisp/Clojure 宏(macros)所代表的更高维度的编程能力。这并非因为宏没有价值,而是因为他们缺乏理解这种抽象所需的"表征机制"。 # 二、背景故事:Paul Graham 与 Lisp ## 1. Beating the Averages 2001 年,Paul Graham 发表著名文章《Beating the Averages》,核心论点包括: ### A. Lisp 的根本优势 - Lisp 比其他语言本质上更强大 - 宏(macros)是 Lisp 的核心区分能力 - Viaweb 使用 Lisp 构建了竞争对手无法实现的功能 ### B. 作者的亲身体验 Nathan Marz 受这篇文章影响,过去 15 年一直将 Clojure 作为主要编程语言。他证实 Paul Graham 关于宏的描述"绝对正确"。 ## 2. 现实困境 ### A. 采用率极低 - Lisp/Clojure 全球使用比例极小(Stack Overflow 调查显示约 2.6%) - 与其巨大的优势不成正比 ### B. 常见误解 - "生态系统"障碍:对 Common Lisp 有效,但 Clojure 可与 Java 生态系统互操作 - "括号很怪"的直观反应 - 括号的感知成本从未与 Clojure 的巨大收益进行权衡 ### C. Blub Paradox Paul Graham 提出的"Blub 悖论"试图解释这种脱节,本文从另一个角度补充这个解释。 # 三、编程的维度 ## 1. 两类抽象 ### A. 自动化抽象 大多数程序员使用的抽象属于此类: - 将一组操作打包在一个名称后面 - 函数是经典例子:接受输入,产生输出 - 只需要了解函数的规格和性能特征 ### B. 维度扩展抽象 罕见的抽象类型: - 扩展编程本身的代数 - 改变基本概念和概念间关系的种类 - 创造新的"维度" ## 2. Lisp/Clojure 宏的维度之力 ### A. 语言的自我组合 源于语言的统一性,使语言能够自我组合: - 编译时逻辑可以像运行时一样执行 - 使用相同的函数和技术 - 语法树可以被操纵和转换 ### B. 语义控制 实现对代码语义本身的控制: - 宏不仅仅是语法糖 - 它们改变了代码的结构和含义 - 可以创造全新的控制结构 ### C. 编译时的轻松操纵 effortless compile-time manipulation 是一个新的编程维度: - 编译时代码生成变得简单 - 元编程成为一等公民 - 运行时和编译时的界限变得模糊 ## 3. Flatland 隐喻 ```mermaid graph LR subgraph Flatland["2D 平面国"] F1[三角形] F2[正方形] F3[圆形] end subgraph Spaceland["3D 空间国"] S[球体] end S -.-> F1 S -.-> F2 S -.-> F3 ```  在 Flatland 中,正方形无法理解第三维度,因为他只能以 2D 思考。同样,你无法理解新的编程维度,因为你不知道如何在该维度中思考。你没有"表征机制"来理解新维度提供的东西。 2D 程序员可能会得出 3D 概念客观上错误的结论——这不是因为他们理解了它,而是因为他们试图将其扁平化到自己的坐标系中。 # 四、学习新维度 ## 1. 说服的局限性 你不能用 3D 论据说服 2D 的人。这就像在 Flatland 中,球体无法让正方形理解"上"和"下"的含义。 ## 2. 隐喻的断裂点 然而,这正是隐喻失效的地方: - 你的大脑永远无法理解 4D 空间 - 但你的大脑可以适应新的编程维度 ## 3. Lisp 学习曲线 采用 Lisp/Clojure 的人通常描述相似的经历: ```mermaid graph LR A[不适感] --> B[一系列清晰时刻] B --> C[无法回头的顿悟] C --> D[新维度的思维方式] ```  ### A. 第一阶段:不适感 - 语法看起来"奇怪" - 编程范式不同 - 需要改变思维习惯 ### B. 第二阶段:清晰时刻 - 逐渐理解宏的威力 - 开始看到代码抽象的新可能性 - 意识到之前方法的局限性 ### C. 第三阶段:无法回头 - 新维度的思维成为自然 - 回到旧语言感觉受限 - 理解了什么是真正的编程抽象 ## 4. 突破认知偏见 需要的只是: - 好奇心 - 理解最好的编程思想有时无法立即被欣赏 - 识别自己的认知偏见 认识到这种偏见足以打破它,这是作为程序员成长的最好方式之一。 # 五、社区讨论与反馈 ## 1. Valerie Kim:Laws of Form 的类比 ### A. 稀有抽象的概念 文章中关于"稀有抽象"的论述让她想起 George Spencer-Brown 的《Laws of Form》(1969)。 ### B. 形式系统的维度扩展 即使是最简单的形式系统(一个符号、两个规则、约一个值),在引入"重新进入"(re-entry)的自指扩展后,也能获得全新的维度: - 类似于引入虚数 i 作为 x = -1/x 的解 - 宏本质上是自指的 - 它们提供了引入新区分(概念)的强大方式 ## 2. ao:实用主义的质疑 ### A. 维护成本论点 - 实际程序在其生命周期中经常被修改 - 修改的成本和速度很重要 - 宏像"魔法":难以快速理解 ### B. Blub 语言的优势 - 可能更冗长,但显式 - 更容易找到替代开发者 - 更快地进行更改 ### C. 维度的代价 第三维度需要很多时间,用户并不总是愿意为此付费。这就像大多数人通勤使用道路车辆而不是飞机。 ### D. Viaweb 的后续 据互联网消息,Yahoo 在长期维护中将 Viaweb 从 Lisp 迁移到主流技术栈。 ## 3. Nathan Marz 的回应 ### A. "魔法"与"难以理解"的误解 这是混淆了糟糕的使用与思想本身: - 可以用宏写出糟糕的代码,就像任何语言构造一样 - 宏确实能让你写出更糟糕的代码 - 但这不是反对宏的论据,你可以选择不写糟糕的代码 ### B. 宏的使用原则 Lisp 中有句俗话:"宏的第一条规则是不要使用宏": - 绝对正确 - 除非需要,否则不应使用 - 当你使用它们时,你在做任何其他语言构造都无法很好完成的事情 ### C. Specter 项目示例 一个项目中的关键宏实现了: - 极具表现力的抽象 - 难以匹配的性能 - 即使是手写优化代码也难以匹敌 ### D. 知情决策的缺失 - 确实有少数程序员理解 Lisp/Clojure 并做出知情决定不使用它们 - 但大多数程序员没有花时间真正理解它们的益处 - 只有约 2.6% 的开发者使用 Lisp 或 Clojure - 作者怀疑甚至不到 5% 的程序员真正理解 Lisp/Clojure 足以做出知情决定 ### E. 团队入职经验 在 Red Planet Labs 的亲身经验: - 如果大型 Clojure 代码库编写良好,让开发者入职不是问题 - 即使是新学习 Clojure 的开发者也能适应 - 有调整期,但任何大型代码库都有调整期 - 当学习新的编程范式时,调整期可能更强烈,但这是值得的 - Clojure 中的开发速度高于其他语言,因为能够构建更好的核心抽象 - 宏是重要因素,Clojure 对不可变性的强调也是 # 六、结论 ## 1. 选择权 最终,生活在 Flatland 是一个选择。 ## 2. 关键时刻 选择出现在你注意到自己对不熟悉思想的本能退缩时,当你感觉到"这没有意义"和"也许我还没有概念来理解它"之间的张力时。 ## 3. 定义时刻 你在那一刻做的事情定义了你是留在 Flatland 还是走出它。 ## 4. 更广泛的启示 宏不是唯一具有这种维度转移品质的伟大编程思想: - 函数式编程的概念 - 类型系统的抽象 - 并发模型 - 领域特定语言(DSL) 每一个伟大的编程思想都可能遇到同样的"Flatland 效应"。关键在于保持开放的心态,认识到自己的认知局限,并愿意投入时间去理解新的维度。 *** ## 参考资料 1. [The programmers who live in Flatland - Red Planet Labs Blog](https://blog.redplanetlabs.com/2025/11/24/the-programmers-who-live-in-flatland/) 最后修改:2026 年 03 月 20 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏