7.4 《兰亭集序》的启示
📚 本文内容摘自本人的开源书《从沙子到车辙 - 一个工程师的理解》
🔗 在线阅读/下载:from-sand-to-ruts
bash
git clone https://github.com/Lularible/from-sand-to-ruts
⭐ 如果对您有帮助,欢迎 Star 支持,也欢迎通过 GitHub Issues 交流讨论。
公元 353 年,会稽山阴
东晋永和九年,暮春三月初三。
王羲之和 41 位友人在会稽山阴的兰亭聚会。那天是上巳节------古人临水沐浴、祛除不祥的节日。他们沿着一条蜿蜒的曲水而坐,把酒觞放在水面上任其顺流漂下。酒觞停在谁面前,谁就要赋诗一首。做不出来的,罚酒三斗。
那天他们一共写了 37 首诗。王羲之喝了酒,有些微醺。他环顾四周------天朗气清,惠风和畅。崇山峻岭之间,茂密的竹林在微风中发出沙沙的声音。溪水清澈,映照着上面的天空和飘过的白云。身边是朋友们吟诗清谈的声音。
但就在这样一个美好的时刻------王羲之突然感到一阵深切的悲伤。
这帮人今天在这里欢聚------吟诗、饮酒、感叹天地之大、万物之盛------但总有一天,这些人都会死去。曲水还在,山还在,天上的云还在------人已经不在了。今天的欢愉,在后人眼里,就是一堆古老名字和遥远往事。今天在场的人有 41 个------几百年后,谁还记得他们的名字?谁还记得他们今天写下的诗句?
这份偶然涌上的悲伤,他不是把它推到一边。他没有说"算了,不想这个了,继续喝酒"。他让这份悲伤停留了下来。然后他拿起笔------用的是一管鼠须笔,写的是一张蚕茧纸------把此时此刻心里的一切,全都写了下来。
这就是《兰亭集序》。中国书法艺术的巅峰------但今天我们不是来谈书法的。我们是来谈文字的。谈一个微醺的书法家在 1670 年前的一个春日午后,对着一群朋友和一道小溪,写下的一段让千百年后的人读到会沉默的独白。
那段让人沉默的话
全文最震撼的一段,出现在后半部:
"每览昔人兴感之由,若合一契,未尝不临文嗟悼,不能喻之于怀。固知一死生为虚诞,齐彭殇为妄作。后之视今,亦犹今之视昔。悲夫!故列叙时人,录其所述,虽世殊事异,所以兴怀,其致一也。后之览者,亦将有感于斯文。"
翻译成白话:
"我每次读到前人有感而发的文字,就像是有一片符契相合------我完全懂他们。我不禁对着这些文字感叹悲伤,心里堵得说不出为什么。我知道,把生和死等同看待是虚荒的,把长寿和短命等同看待是荒诞的。后人看今天,就像今天我们看过去一样。可叹啊!所以我一一把今天在场的人和他们的诗记录下来。虽然时代会变、事情会变,但引发人感怀的那个根源,是一样的。以后读到这篇文章的人,也会被它触动吧。"
你读到这里,是不是也安静了几秒?
这里面有四层含义,每一层都穿越时间击中你。
第一层:"每览昔人兴感之由,若合一契"------他和古人之间有心灵相通。他读陶渊明、读屈原、读《诗经》里那些不知名的作者------他懂他们。不是因为他是天才,而是因为他是一个活着的人,有同样的喜怒哀乐。前辈的困惑,他也有。前辈的叹息,他心里也在响。这就是你读两弹一星回忆录时的感觉------你不认识邓稼先,但你看他在辐射中走向未爆弹头的记录时,你的心跳加快了。这就是"若合一契"。
第二层:"固知一死生为虚诞,齐彭殇为妄作"------他不相信"生死一样、无所谓"那种话。死亡是真实的。失去是真实的。被遗忘是真实的。如果一切都无所谓------你今天为什么要把 CAN 报文的时序 margin 算到 3ns?因为你在乎。因为"无所谓"是懒惰的话,"重要"才是真相。
第三层:"后之视今,亦犹今之视昔"------这是一个穿越时空的镜像。今天你看古人,感叹他们艰苦。将来后人看你,也会同样感叹。这句话我们上一章引用过了------它是对的。但它还有一个更深的意思:你和古人是在同一条链上的。 你和邓稼先、和王淦昌、和郭永怀------你们不是不同的时代的人。你们是同一个接力赛里的不同棒次。他的思考流过你的脑海,你的思考会流过下一个人的脑海。链条环环相扣,而"若合一契"就是环与环之间的扣合。
第四层:"后之览者,亦将有感于斯文"------这是整个《兰亭集序》最核心的动作。王羲之不只是感叹。他做了 一件事。他把感悟转化为记录。他知道自己会死,但他也知道------如果他把此时的感受写下来,未来某一天,会有一个人读到这些文字,而这个人会懂他。
1670 年前的某一天,一个微醺的书法家在写最后一句话的时候,对着自己墨迹未干的字,心里想的可能是:"我不知道你是谁。你不会认识我。但你会懂我。"
而今天,你读到这句话的时候------王羲之在你这里成功了。
"列叙时人,录其所述"------工程师的兰亭
王羲之不只是感叹。他做了 一件事。他把那天到场的 41 个人一一列了出来,把他们的诗抄录了下来。他知道这些诗也许不是唐诗宋词级别的不朽名作------但那不重要。重要的是他记录了。
"列叙时人,录其所述"------这八个字,是《兰亭集序》里最被低估的工程动作。王羲之没有让这场聚会只活在参与者的记忆里(记忆会模糊、人会死),他把它变成了文字------可传递、可复制、可跨越时间的文字。
对于工程师来说,"列叙时人,录其所述"意味着什么?
意味着你项目结束后写的 Lessons Learned。你记录了这次设计中的错误假设------"我们假设 CAN 总线负载永远低于 40%,但在冬季冷启动时,大量 ECU 同时上线导致负载瞬间冲到 85%"。你记录了修正方案------"把周期性报文按优先级分三批延迟 50ms 交错发送"。你记录了决策依据------"选择加延迟而不是加节点,因为加节点需要硬件改动,而项目已经冻结了 BOM。"你在写这份文档的时候,对面没有人。但你是在对一年后的自己说话,是在对这个项目下一代的维护工程师说话。
意味着你出完生产事故后写的 8D 报告。D4(根本原因分析)------你不是在写文档,你是在对一年后的自己说:不要重新分析一遍。D6(永久纠正措施)------你不是在填表格,你是在对未来的工程师说:这个雷我已经排掉了,你不要再踩。你没有在写"报告"------你在写"信"。给未来的同事的信。
意味着你代码里的注释 。// 此处必须禁用全局中断,因为在中断中会修改 shared_flag,主循环中会读取------不对齐会导致数据竞争的无声损坏。这个 bug 花了我们 4 天排查。 后面接手这段代码的人,看到这行注释,会沉默两秒。然后心里说一句:谢谢。你不会知道他叫什么名字。他也不会知道你的。但那不重要------你在乎的只是"他不要像我一样在这里花 4 天。"
意味着你写的技术博客。你整理了调试 CAN 总线 Bus-Off 的完整流程------从检查终端电阻到用示波器看 ACK bit 到确认 Bus-off Recovery 的寄存器配置------你花了一个周末写了出来。你不知道谁会看。但你知道,这个世界上一定有另一个工程师在某个深夜对着同样的问题挠头。你的文章会出现在他的搜索结果里。他会点开。他会读。他会得救。
那个凌晨 3 点的交接日志
我做良率工程师的时候,每天都要写"passdown log"------交接日志。一个白班工程师和一个夜班工程师在下午 5:30 交接。你写的日志被夜班工程师接着看,夜班工程师写的日志被第二天早上的你接着看。
一开始我觉得这很烦。我为什么要花 30 分钟写一篇日志?我直接跟他对接口头说两句不就完了?后来有一次------我记得很清楚------某个周五下午快下班的时候,有一批急货在 final inspection 被卡住了,需要 SEM review。我说取样切割的位置是面板单元(34, 52) 那颗 fail 的单元,切片方向是沿 Y 轴从电极 pad #12 往中心切,切到大约有源层以上 2μm 停下来看 TEM。我在 passdown log 里写了这些,还在白板画了取样位置示意图,拍了照片贴在日志里,然后下班了。
周一早上回来,夜班工程师的日志里写着:"按你的位置切了,缺陷找到了------栅绝缘层 pin hole。TEM 倍数 200k,缺陷直径约 45nm。图像已上传到共享文件夹。良率影响评估:同一批基板的相邻单元抽样 SEM review 结果全部 clean,确认是随机缺陷。"
读到这里的时候,我心里有一种特别奇怪的感觉。一个我不认识的人------我们从未同时出现在产线里------靠着我在纸上留下的文字和一张白板上的图,在凌晨 3 点独立完成了一次精准的 SEM 缺陷定位。他不需要我在场。他甚至不需要见过我。我的思考顺着一段文字注入了他的大脑,然后他的手接着我的手指完成了切片。
那一刻我就懂了:"列叙时人,录其所述"不是一个文学修辞。它是工程运作的基础协议。你就是靠着这个协议,让你的大脑不用永远绑在你的身体上。
接力链:从图灵到你,从你到下一个
工程不是一代人的事。工程是接力赛。
你看到的任何一段代码、任何一个通信协议、任何一颗芯片------它们不是你凭空造出来的。它们的前面,是一条很长很长的链条。而这条链条上,每个节点都留下过自己的"记录"------
图灵 1936 年写了一篇论文:《论可计算数及其在判定问题上的应用》。36 页纸。定义了"可计算"的边界。没有这篇论文,就没有"计算机程序"这个概念。在论文中,他描述了一种"通用机"------能够读取任何机器描述的纸带并在其上进行计算。你现在写的每一行 C 代码,在编译成 ARM 机器码之后,都仍然在图灵定义的那个抽象框架内运行。图灵 1936 年的 36 页纸------就是你栈底的基础。这是接力链的第一棒。
冯·诺依曼 1945 年写了一份 101 页的报告:《关于 EDVAC 的报告草稿》。在这份草稿里,他定义了程序和数据共享同一片内存的架构------程序不再是在墙上插跳线或者换纸带,而是和数据一样存储在地址空间里。你的 S32K144 的 ARM Cortex-M 内核,其取指---译码---执行---写回的流水线底层,仍然遵循这份 101 页报告的架构原则。他留下了记录。这是接力链的第二棒。
肖克利、巴丁、布拉顿 1947 年在贝尔实验室的实验室记录本上写下了点接触晶体管的实验数据。1948 年他们公开发表。从此固态电子学诞生------从真空管到晶体管的跨越,让计算机从一栋楼缩小到一个房间。今天你的 MCU 里那几十亿个 FinFET------追溯到最原始的祖先,就是贝尔实验室工作台上那根戳在锗晶体上的金探针。他们留下了记录。这是第三棒。
基尔比 1958 年在德州仪器的实验室记录本上画下了第一块集成电路的草图------五个元件集成在一片锗晶体上。同一年,诺伊斯 独立发明了基于硅平面工艺的集成电路。从此所有元件可以做在同一片硅上------连线不需要人工焊接,而是在硅芯片上用光刻+金属沉积一步形成。他们留下了记录。这是第四棒。
博世 CAN 总线设计团队 1986 年在 SAE 大会上发布了 CAN 协议的白皮书。他们在论文里解释了多主优先级仲裁机制、非破坏性冲突检测、错误帧的设计理由。博世将CAN IP核授权给英特尔,后者在1987年推出了82C200 CAN控制器芯片。今天,你车上每个 ECU 都在用这个协议------它的帧结构、它的位时序、它的五种错误检测机制,全部是博世那些工程师在 80 年代定义好的。他们留下了记录。这是第 N 棒。
AUTOSAR 标准制定者------几百个来自不同 Tier-1 和 OEM 的工程师------花了超过十年时间争吵、妥协、迭代,最终形成一个让不同厂家的软件能在同一个 ECU 上运行的标准框架。他们用几十万页的技术规范、ARXML schema、BSW 模块的配置参数------留下了记录。
你读到他们的记录,你被启发了,你在他们的基础上做设计。然后你留下了你自己的记录------你的 Lessons Learned、你的注释、你的博客、你的书。然后下一个工程师读到你的记录,被启发,继续往前。
这就是接力链。 链上的每一个节点都做了同一件事:把他们的思考过程记录下来,用文字传递给后面的人。链条不会断------除非有人不记录。
工程界里的"兰亭"
《兰亭集序》在工程世界里有很多远亲。你可能认识它们:
IETF RFC 文档。 从 1969 年的 RFC 1(定义了"主机软件"的概念)到今天超过 9000 篇 RFC------每一篇都是某个工程师或某个小组在某个时间点对"这个问题应该怎么解决"的思考记录。RFC 793------Jon Postel 在 1981 年写下的 TCP 协议规范------85 页。定义了三次握手、滑动窗口、慢启动、拥塞控制。全世界的网络栈都依据这篇文档实现 TCP。Jon Postel 在 1998 年去世了,但 RFC 793 还在。你手机里每一次 HTTPS 请求的底层------TLS 在 TCP 上,TCP 依据 RFC 793。这个人的思考在你们之间没有断过。这就是他的"兰亭"。
有的 RFC 成了互联网的基石。有的被废弃了------上面标注着 "Obsoleted by..."。有的充满了幽默------RFC 1149:"IP over Avian Carriers"(用信鸽传输 IP 数据报),是一篇愚人节玩笑,但它是一篇 RFC,它被记录了。而且 2001 年真有人实现了它------在 Linux 上跑了 9 次 ping,信鸽传输距离约 3km,丢包率 55%。这种"写了就有人做"的互动------也是"后之览者,亦将有感于斯文"。
Linus Torvalds 的第一封 Usenet 帖子。 1991 年 8 月 25 日,一个芬兰大学生在 comp.os.minix 新闻组发了这样一段:"Hello everybody out there using minix --- I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu)..." 这是他当时真实的感受------他觉得自己在做一个"业余爱好"。他不知道 30 年后,这个"爱好"会运行在全球 96% 的服务器和 80% 的手机上。这封帖子到今天还在讨论列表的档案里------一个 22 岁的年轻人怯生生的、诚实的、没有包装的声音。这是他的"兰亭"。
BSD man pages。 每一个 Unix 命令背后,都有一篇 man page。man 2 open 告诉你 open() 系统调用的所有参数、返回值、错误码。你不认识写它的人------但他告诉你 O_CREAT | O_EXCL 可以原子性地创建一个文件。你读到的时候,这个人在几十年前写的文字,正在帮助今天的你解决一个问题。
《Code: The Hidden Language of Computer Hardware and Software》------Charles Petzold。 一本用通俗语言从摩斯电码讲到计算机架构的神作。Petzold 没有发明任何新技术------他只是把已有的知识用他的方式重新讲述 了一遍。但他做得如此之好,以至于二十年后的工程师还在推荐这本书给新人。他留下的不是新知识------而是一种新的理解方式。这也是一种记录------不是记录"什么",而是记录"怎么理解"。
你不需要写出 RFC 那样的东西。你不需要像 Linus 一样有被互联网永存的第一封帖子。你不需要像 Petzold 一样写一本传世经典。
你可以只是------把你踩过的坑写在一份内部的 Wiki 上。把你的 debug 思路写在一行注释里。把你的设计决策写在一份 Decision Record 里。把你的经验录成一段 15 分钟的内部分享视频。把你通宵排查一个 CAN Error Passive 问题的全过程写成一个三页的 PDF,放在团队的共享文件夹里。
你留下的任何东西------是对前人工作的延续,是对后人工作的馈赠。 你以为你写的只是一份普通的文档。但实际上------你写的是一封写给未来的信。收信人你不认识。但这一天一定会到来:某个人在某个深夜,面对某个问题,点开了你留下的记录。他会读完。他会沉默几秒。然后他会继续你的工作------因为你替他省下了他最宝贵的东西:时间。
困惑不会过时,代码会
你有时会觉得:我写的代码不值得记录。未来会有更强的工程师写出更好的代码。我的设计经验不值一提------未来有更好的芯片和工具。我的知识体系不值一提------知识在持续更新。
但你的困惑不会过时。
有限资源下的权衡、实时系统的时间分配、安全合规和实际性能的矛盾、硬件限制和算法理想的冲突------这些不是"这个时代的 bug"。它们是工程实践的永恒主题。2020 年代有,2050 年代也会有,2200 年代依然会有。因为只要工程存在------只要人用有限的工具去解决无限的需求------困惑和权衡就永远不会消失。
你现在写下一份文档,记录你在 128KB SRAM 里如何分配 CAN 缓冲区和校准数据区的策略。50 年后,某个工程师面对的是一个量子计算接口和传统 ECUM 混合架构下的实时性分析问题。你看------问题完全不同。但他的困惑和你是一样的:"空间不够,时间太紧------我怎么在有限资源里做到最优?"
他读到你的文档,不会被"128KB"这个数字绊住------他看到了你的权衡思维。你面对的是物理 SRAM 容量,他面对的是量子态的相干时间------但你们面对稀缺资源做出的判断:优先级排序、边界条件测试、最坏情况分析、安全余量的保留------这些思维方式,是可以跨越时间传递的。
困惑穿越时间的能力比代码强。困惑是工程的通用语言。
反过来想------你今天在工作中写下的任何东西,是不是也要面对同一个心态?"我这破代码有什么好记录的?""我这个 bug 的排查过程太 low 了,不好意思写出来。"但五十年后的人不会在乎你的代码优不优雅。他们在乎的是------你在你的时代、用你的工具、面对你的困惑------你是怎么思考的。你的权衡、你的尝试、你在有限信息下做出的判断------这些东西是穿越时间的。当年图灵的论文用今天的标准看,里面的数学记号都显得古朴------但"可计算性"这个概念穿越了 90 年。不是他写得漂亮------是他记录了自己真实的思考。你也一样。
你不只是一个人在写代码
你写代码的时候,你不是一个人在写。
你站在图灵 的抽象上------是他给了你"可计算性"这个概念。你站在冯·诺依曼 的架构上------是他定义了程序和数据共享同一片内存。你站在肖克利 的 PN 结上------没有他的点接触晶体管,你连这颗 MCU 的硅基础都不存在。你站在博世 CAN 总线设计团队 的肩膀上------他们 1986 年定义了那个多主优先级仲裁协议,你才不用自己设计车内通信协议。你站在 AUTOSAR 标准制定者的共识上------几百个工程师吵了十几年才定下来的模板,你直接用。你站在你的前辈和导师的调试笔记上------他们踩过的坑替你省下了无数个小时。
所有历史上影响过这个领域的人,都在你的背后。
当你也加入这个接力------当你记录、当你写文档、当你写书、当你录视频教程、当你在 Stack Overflow 上回帖------你就从"使用者"变成了"贡献者"。你的名字也许会消失,但你留下的记录,会变成后来的工程师探索问题时点亮的一盏灯。
你留下的文字,会比你的 ECU 寿命更长。你写的书、你写的注释、你写的 Wiki------会在你离开之后继续帮助别人。
这就是"不朽"的工程含义。不是身体不灭------是思想沿着文字传播,在别人的大脑中重生。
王羲之在 1670 年前写下"后之览者,亦将有感于斯文"。他做到了------你今天读到这句话,被击中了。那么你也一样------你留下你的"兰亭"。后之览者,亦将有感于斯文。
本篇小结
今天我们做了一件事:从王羲之的《兰亭集序》里,读出了工程师最深的宿命和最高的荣耀。
关键结论:
- "后之视今,亦犹今之视昔"------你和邓稼先、和冯·诺依曼、和图灵,不是不同时代的人,是同一个接力赛里的不同棒次。
- "列叙时人,录其所述"是工程世界最被低估的工程动作:你的Lessons Learned、你的注释、你的交接日志------每一份记录都是写给未来的信。
- 困惑不会过时,代码会------但你的权衡思维可以跨越时间传递:你留下的不是完美的代码,是在有限资源下做最优决策的思考过程。
全书到了最后一站。从沙子到芯片,从芯片到车辙,从车辙到你。这条路,你已经在上路了。
【下集预告】
全书到了最后一站。从沙子到芯片,从芯片到车辙,从车辙到你。我们走了七大部分、几十章节的路------最后,回到你身上。这条路,你已经在上路了。