VAX 只重三斤
我很多年前第一次看《Unix 编程艺术》(TAOUP), 看到附录里的《无根的根:无名师的 Unix 心传》。 当时完全没想到,这本正经谈 Unix 美学的书,附录居然塞了一堆禅宗故事。
其中有一篇叫 无名师的双路论。
故事开头很简单:无名师对学生们讲,Unix 传统里有两条很有名的“教义”:
- 一条是 McIlroy 那句被引用烂了的:“Do one thing well”,要你写的程序接口简单、行为一致;
- 另一条是 Thompson 的:“When in doubt, use brute force”,有疑惑就先穷举、先粗暴把问题干趴下。
学生 Nubi 很快就卡住了:这两条听起来不是有冲突吗? 最后他实在忍不住,问了一句:那什么才是正确的达摩道?
无名师给出的回答,就是这三句话:
当鹰飞翔时,它忘记爪子与地面相触?
当虎捕食时,它忘记腾空的一刻?
VAX 只重三斤!
第一次看到这里,我的内心只有四个字:你 TM 逗我。 大概隐约感觉到它想表达什么,但:
- VAX 是啥?
- 为什么要“三斤”?
- 这玩意跟写代码有半毛钱关系吗?
这些问题就这么在脑子里搁了很多年。直到最近借助 ChatGPT + 到处翻资料,才算完成了故事的最后一块拼图。
理解之后,这个故事还挺有意思。
VAX、麻三斤和程序员冷笑话
先把那句最奇怪的拎出来:VAX 只重三斤。
VAX 到底是啥?
简单说,VAX 是 DEC 在 70–90 年代卖的一条 32 位小型机系列,比如非常有名的 VAX-11/780。 这种机器是机柜级别的,动辄几百上千磅,机房里的铁疙瘩,绝对不是现在那种可以一只手拎起的“轻薄本”。
所以,“VAX 只重三斤”在字面上就是胡说八道,这一点是故意的。
那为什么偏偏是“三斤”?
“三斤”来自一个很有名的禅宗公案:洞山麻三斤。
经典版本大概是这样:
有僧人问洞山禅师:“如何是佛?” 洞山答:“麻三斤。”
这里的“麻”就是纺布用的麻纤维,有一种说法是:三斤麻大概够织一件僧衣, 对当时的人来说,是一个非常日常的单位。
这则公案的解读的方式有很多,这里只取我关心的一种:
佛不是一个可以在概念上能想明白的东西,
佛就在你眼前这堆很具体、很不起眼的麻里。
换句话说,当你拼命想抓住一个完美的抽象定义时, 禅师把你往现实里拽回来:别管“佛”是什么,先看看你眼前这“麻三斤”。
这一点倒是让我想到了 《禅与摩托车维修艺术》中的一句话:
佛陀或是耶稣坐在电脑和变速器的齿轮旁边修行会像坐在山顶和莲花座上一样自在。
如果情形不是如此,那无异于亵渎了佛陀——也就是亵渎了你自己。
当你做某件事的时候,一旦想要求快,就表示你再也不关心它,而想去做别的事。
ESR 在写 无根的根 的时候,很明显是在致敬这个梗:
“佛是什么?” → 换成了 “真正的 Unix 之道是什么?” “麻三斤” → 换成了 “VAX 三斤”。
于是,“VAX 只重三斤”就变成一个程序员味很浓的公案:
别再追问“哪条才是最终正确的教义”,答案就在你面前那台机子、那段代码本身。
鹰飞、虎跃和那台沉甸甸的 VAX
再回头看整句原话,其实是一连三个画面:
当鹰飞翔时,它忘记爪子与地面相触?
当虎捕食时,它忘记腾空的一刻?
VAX 只重三斤!
鹰飞时,不会低头看爪子
“忘记爪子与地面相触”,不是说鹰真的失忆了,而是说:
鹰在飞的时候,它整个存在就是“飞”,
不会在心里反复重播“刚离开地面的那一瞬间”。
对应到我们做事: 当你真的全身心投入一件事情时,你不会一直停在“起点那一刻”的自我分析上,而是整个过程自然往前走。
放到软件设计里就是: 别把每一个设计点都当成哲学思辨题。
很多时候你要看的是这条“飞行轨迹”是不是顺畅,而不是在某个节点上反复问: “这一点究竟更像 McIlroy 还是更像 Thompson?”
老虎扑食时,不在半空纠结姿势
“忘记腾空的一刻”也是同样的意思:
老虎捕食,是起跳、在空中、落地、咬住猎物的一整个过程,
它不会在空中想:“我现在是不是腾空姿势不够优雅?”
对工程师来说,这像是在提醒:
不要试图把一段流程拆成无数个“必须同时满足所有原则”的瞬间, 更重要的是整个动作有没有咬住“猎物”——把问题解决掉。
最后一锤:VAX 只重三斤
前面两个比喻还算好理解,到第三句突然抛出一句:“VAX 只重三斤!”
如果把禅宗公案那一套搬过来,这句话对我有两个方面的理解:
-
别再问“哪条原则才是 Unix 之道了”。
就像你问什么是佛,洞山说麻三斤。同样, 你问到底是 Do one thing well 重要,还是 When in doubt, use brute force 更正统”, 无名师给你指了指机房那台 VAX,说:它三斤重。
-
“三斤”的单位,来自现实世界,不来自哲学体系。
VAX 的真正重量,是机房里的铁疙瘩,是电费、噪音、制冷,是你那台机器上一堆运行中的进程。 你程序的“重量”,也是编译时间、运行时的内存占用、运维同事的抱怨、上线失败时的报警记录。
所以,这三个画面合在一起,对我的翻译是:
别在抽象原则里打转了。抬头看看你现在这只“鹰”和“虎”,再摸摸那台 VAX 的真实重量。道,就在这三样东西的当下状态里。
回到日常开发:这公案到底能帮我什么?
脱离项目场景讲这些,很容易变成“禅味鸡汤”。对我自己来说,它真正有用的地方大概是下面几种场景。
当我想要“唯一正确的架构答案”时
例子太多了:
- “到底要不要 Microservice?要不要 Domain-Driven Design?”
- “是 Hexagonal 更好,还是 Clean Architecture 更纯?”
- “这个功能到底应该是一个 service,还是一个专门的 module?”
以前我的惯性是:先追求一个理论上最正确的答案,然后再努力把现实往那套理论上凑。
现在看到类似争论,心里会多冒出来一句:
你现在问的是“佛是什么”,还是眼前这台 VAX 的重量?
然后就回到:
团队的经验、维护成本、上线时间线这些 现实约束, 以及这个功能在系统里的 具体位置:调用频率、风险、未来变化的可能性。
最后那个决定,往往就是那台 VAX 的当前重量。 只要它能飞得起、咬得住问题,我就不再纠结是不是完美符合某个流派的教义。
当我纠结“优雅小工具 vs 暴力方案”时
Unix 传统里那两条教义,其实就是两种老毛病的极端:
- 一种是疯狂追求 优雅的单一职责,结果边界条件一多,接口绕成麻花;
- 另一种是逢事就上 brute force,写出一坨巨大的脚本,谁也不敢动。
这则公案提醒我的是:
鹰飞的时候,就先让它好好飞;老虎扑上去的时候,就先保证咬得稳。
比如:
-
我只是要把一堆日志先粗略扫一遍,看有没有明显异常模式:
一开始就上数据平台 + DSL + 花式聚合,基本是给自己挖坑,写一个丑一点的 brute-force 脚本, 把肉眼看得见的问题先定位出来,反而更合适。
-
反过来,如果这是一个长期要复用的能力,比如统一的导入流水线:
这时就该收一收虎劲,多想想“Do one thing well”的边界,认真画清楚接口。
关键是:它们不是非黑即白的“对”和“错”,而是同一只老虎在不同时刻的动作。
当我在半空中怀疑自己时
做架构、做重构经常会有一种感觉:已经起跳了,但突然开始怀疑:
- “我是不是不该在这个时间点动这个模块?”
- “是不是应该再多做几份调研,再决定选型?”
这时候,“当虎捕食时,它忘记腾空的一刻”这句话对我很有用。
不是说要盲目自信,而是:
一旦确定要起跳,就不要在半空中耗尽全部注意力去后悔“起跳”本身。
更实际一点的提醒是:
起跳之前多想一步,把取消方案、回滚方案写清楚, 起跳之后,就把精力放在落地和收尾,而不是反复质疑“当初要不要起跳”。
写在最后:给未来自己的三句提示
把这些零散的理解压成几句以后自己能看得懂的话,大概是:
-
看不懂的“VAX 只重三斤”,其实是在嘲笑我自己的“原则洁癖”。
每次我纠结“到底谁才是真正的 Unix 之道 / 最佳实践”,都可以回想一下这句冷笑话。
-
下次考虑架构时,先问三个问题:
- 我们现在是在讨论“佛是什么”,还是这台 VAX 明天要不要下线?
- 对当前这只“鹰/虎”来说,最重要的是飞得优雅,还是咬得稳?
- 这次取舍决定,是不是已经足够考虑了“机器的重量”(硬件、团队、时限)?
-
如果实在想不明白,就去摸一摸“VAX 的机箱”。
在今天,它可能是一台云上的实例的账单、一份 SLO 报表、一堆告警记录。 先从这些很具体、“麻三斤”的东西开始,剩下的,交给时间和代码自己说话。
我想,等哪天我又开始被某个 纯洁的架构理想 洗脑的时候,希望能翻回这篇笔记, 提醒自己一句:别忘了那台据说“三斤”的 VAX。