第十三章 · 第 181 天
Day 175。北京西郊,慈安临终关怀医院,七楼七床。下午四点。
陈守仁老人躺在床上,77 岁,肺癌晚期。
他床头摆着一台 ThinkPad T420——上世纪某年代的旧机型,键盘已经磨得发白。屏幕上开着两个窗口——左边一个 agent observability 仪表盘,显示当前调用模型 Lyra-Curator,本月已用 token 432 万,折合 0.43 元;右边一个文本编辑器,标题栏写"陈守仁 · 1985-2026 · 代码遗产 · 第七次草稿"。
Lyra-Curator 是一个去年下半年才上线的行业专用 agent,专门服务"代码遗产"这一新兴方向——它的工作流程很简单:把一个开发者一生的 commit 历史拉进来,逐个 commit 询问开发者本人"是否保留 / 是否注明出处 / 是否撤回"。它的训练语料据说包含了过去三十年所有已 archived 的 GitHub repo 加上若干本计算机出版业的口述史。它不会代替开发者做决定,它只问。
林行坐在床边的椅子上。他穿志愿者制服。他面前的小桌上摊着一个笔记本——他自己的——上面记着他过去六个晚上和陈守仁老人的对话摘要。
陈守仁已经讲到第六晚。
"林行,"老人说,"今天我想讲我第一次被 cc 的事。"
林行点头。
"那是 1989 年。"老人说,"我刚 40 岁。我在芬兰一个大学的邮件列表里贴了一段补丁——是给 GNU make 的——我当时不知道接收的人是谁。三天之后,有一封回邮,cc 了大概八个人,其中一个签名只有四个字母:LINUS。"
林行知道这四个字母是谁。
"我那时候没意识到。"老人说,"我以为只是某个芬兰研究生。我回他一句'thanks for the review',就过去了。后来过了三年我才知道——那是 Linus Torvalds。"
"你后悔吗。" 林行问。
"后悔什么。" 老人笑了一下,"后悔没多说几句?——不后悔。我那时候说的就是该说的。技术评审里,'thanks for the review'是最重的一句话。多了反而轻。"
林行把这一段记在笔记本上。
老人闭上眼,休息了大概一分钟。Lyra-Curator 弹出一个对话框——
是否保留 commit 7a3f29c?(1991 年 3 月 · 47 行 · GNU make 补丁) 检测到该段代码与公开 K&R 教材第 4 章范例重合 73%。建议:删除或注明引用。
老人睁眼,看了三秒。"删掉。" 他说,"那一段我当年抄了 K&R。我没注明。我那时候不懂。今天补不上,就删掉。"
Lyra-Curator 删掉了。屏幕上显示:剩余待审 commits: 1,847。
林行问:"老师,您这一辈子写过多少行代码?"
老人想了想:"大概 80 万行。"
"现在选下来,有多少。" 林行问。
"两万一千。" 老人说,"里面有四千行,是我自己写的。剩下的一万七,是我给别人 review 过的——我留着,因为 review 的过程比代码本身更值得记住。"
林行把这一句也记下来。
老人闭眼又躺了一会儿。然后他睁眼,声音有点喘。
"林行,你以前是工程师。" 他说,"你跟我说一件事——你 review 别人代码的时候,最重要的是什么。"
林行想了一下。"耐心。"他说,"我以前以为是技术,后来我以为是经验。我现在觉得是耐心。耐心是一种相信对方比表面看起来想得更多的能力。"
老人笑了一下。"你这一句,很像 Linus 1989 年那一封 cc。"
林行没说话。
"我那一封 cc 我后来翻出来过。" 老人说,"Linus 当时写了七行。第一行说'this is a good patch'。第二行到第六行是他对那七行补丁的逐行评论,他每一行都说'我看见了你为什么这么写'。第七行是'thanks for thinking about this'——感谢我想过这件事,而不是感谢我交了这件事。"
林行那一刻把笔记本合上。他这一夜不再记。他想用耳朵听完这一段。
老人接着说:"那七行评论改变了我。我那一年 40 岁,在国内做开源算异类,我以为我做的事没人看。Linus 那七行让我明白——有人比我更早就看见我为什么这么写。这一辈子,我后来 review 别人的 PR,都试着学他那七行。我做不到他那么好,但我每次都试。"
老人停了一下。
"你今天问我'最重要的是什么',我答你——"老人说,"是看见对方为什么这么写。这一句,是 Linus 教我的。我现在告诉你。"
林行点头。他没说"谢谢",因为老人讲的事比"谢谢"重。
他在心里默念:"thanks for thinking about this."
第六晚九点二十一分。老人忽然睁眼,声音比平时低半档。
"林行,"他说,"今天你帮我问一个问题。"
"您说。"林行说。
老人想了大概十七秒。然后他说:
"代码会被记住吗。"
林行没立刻答。他想起 Day 0 那一夜,他把 last-real-code.md 这个文件保存的那一刻;他想起 Day 1 Claude Code 那句"祝薛野下一份代码也能被人看见";他想起 Day 70 Manus 朗读 stripe-go README 最后那行 thanks。
他答:"会的。"
老人闭眼。
然后他又睁开眼,问最后一个问题:
"代码遗产法案……过了吗?"
林行说:"还没。但我会等到它过。"
老人那一刻,几乎是笑着的。他没说话。他闭上眼,把右手从被子里伸出来,放在 ThinkPad 的键盘边缘上——那个位置,左手食指能按到 'F' 键的位置。这是他四十年来,无数次起手敲代码前的姿势。
林行看着那只手,没动。
老人睡着了。
Day 181 早晨六点零八分。陈守仁老人去世。
护士长白阿姨打电话叫林行到的时候,林行已经在医院后院的长椅上坐了一个晚上——他昨晚没回家。他守着病房窗户外面的一棵老海棠,从凌晨两点坐到天亮。海棠开得正盛,粉白的花在凌晨四点的灯光下看上去像一张不动的照片。
妻子知道,妻子今天给他发的早安微信只有四个字:"在你那。"
林行进病房,默立两分钟。然后他走到 ThinkPad 前,把右边那个文本编辑器打开。剩余待审 commits: 0。
屏幕底部 Lyra-Curator 的 agent observability 仪表盘还在工作——它显示老人在最后一夜调用了 11 次 Lyra-Curator,每一次都是几行代码的"删除"或"保留"判断,每一次的延迟都在 200 毫秒以内,每一次的成本都精确到 0.0001 元。仪表盘最底下是一行总计:"陈守仁 · 一生代码遗产 · 已完成审定。"
林行把那行字读了三遍。
然后他把 ThinkPad 慢慢合上。他没拔电源——他想让它再亮着一会儿,因为这台机器陪了老人四十年。
老人的右手还放在键盘边缘 'F' 键的位置。林行用左手轻轻把那只手从键盘上挪下来,放回被子里。手很凉,但骨节还很硬——像一个一辈子用键盘的人,最后留给这世界的最后一份触感证据。
林行打开一个新的文件,文件名 obituary.md,他用过去六十天练讣告的方式,写了大概 22 分钟。
他没用任何 V5 类工具起草。他用自己的右手食指和中指,一行一行打字。他打字的方式很慢——大约每分钟 80 字——他知道自己慢,但他这一刻想慢。
讣告全文不到三百字。他没列老人的学历、没列发表论文、没列贡献过的开源项目清单——这些 Lyra-Curator 已经替老人选过一遍。讣告里他只写老人讲过的几件具体的事:1989 年的那封 cc;1991 年那段被老人主动删除的 K&R 引用;老人这一夜亲手敲下的最后 11 次"保留 / 删除"判断;还有老人临终前的那个问题——"代码会被记住吗"。
写完,他读了三遍。
他给讣告落款。落款的格式他想了很久。
他想过用"敬挽"。他想过用"沉痛悼念"。他想过完全不落款,留白。他最终都没用。
最后他在最末尾加了一行:
代码语:final commit。
他保存。
他把这份讣告发给陈老师远在国外的女儿——女儿三年前出国,这次没赶回来——同时抄送给医院、抄送给陈老师指定的两个开源基金会、抄送给衡安(陆衡上个月加入了那两个基金会的董事)。
他还抄送了一个人:沈知微。他想让他妻子看一眼这份讣告。
发送之前,他停了三秒。他犹豫了一下,在抄送栏又加了一个人——姜禾。他没解释为什么。他只是加了。
发送。
发送之后他坐在床边的椅子上没动,大概有六分钟。窗外北京春天的早晨光线开始一点点变厚——从凌晨四点的薄白,转到早晨六点的淡金。海棠的花瓣在风里有一两片开始往下掉。
他这一刻想起一个十二年前的早晨——他和沈知微刚结婚不久,他们租在五道口一个老房子里。那天早上他下楼买豆浆,扫码 3 块 8,系统提示他有一张优惠券,实付 3 块 7。他没用——他懒——他回家把这件事跟沈知微说,沈知微正煎蛋,她头也没回,说"一毛钱在我们家是什么"。当时他没接话。
今天他想接话。他在心里替十二年前那个早晨的自己,慢慢答了一句:
一毛钱是一次决定,看是谁的家。
林行走出医院的时候是早上七点零四分。北京春天的清晨光线很薄,空气里有一点早樱花瓣被昨晚的雨打下来后的甜。他在医院门口的路边长椅坐下,把手机摸出来。
他打开备忘录。
Day 0、Day 14、Day 21、Day 35、Day 70、Day 90、Day 110、Day 130——一条一条往下翻。最末是空白的 Day 181。
他在 Day 181 那条下面打字:
水位线之外,也下雨。但是是不一样的雨。
他保存。
他把手机收起来。他没立刻起身。他坐在长椅上又坐了大概十分钟。
七点二十一分,他的手机震了一下。微信。是姜禾。
姜禾的消息只有两行:
林老师,你那篇讣告我读了。 我从你的 skill 里学到东西。
林行盯着这两行看了一会儿。
他没立刻回。他想起姜禾在咖啡馆那天把那杯耶加雪菲推给他的样子。他想起 798 后台那一杯热水。他想起他妻子早饭桌上嚼着煎蛋说"水位线"的样子。他想起陈守仁老人的右手食指搭在键盘边缘的位置。
他回:
姜老师,我从你的 skill 里也学到东西。 我妻子让我谢谢你那杯热水。我没告诉她那是你递的——她不用知道。她只知道有人当晚递了一杯热水给我。
他发送。锁屏。
他起身,沿着医院门口的辅路走。一辆早班的洒水车从他身边开过,车头喷出来的水雾在他左肩上湿了一小片。他没擦。
他想起六个月前在公司楼下那个雨夜,他走出大堂时也是肩膀湿了。那一夜的水是凉的,带着初冬的硬度。今天的水是软的,带着春天的甜。
走到地铁口,他停了一下。
他把手机摸出来,翻到 Day 0 那条——"Day 0。"——他看了三秒。然后他往下翻,翻过 Day 14、Day 21、Day 35、Day 70、Day 90、Day 110、Day 130,翻到 Day 181。他在 Day 181 那条下面又新加了一行:
——但不是同一种雨,也不是同一个人。
他保存。
他想起六个月前,沈知微在 Day 0 那条下面替他加的那一行:"一毛钱是一次决定,看是谁的家。" 这一行,他这六个月里读过无数遍。他从来没解释过,妻子也从来没问。
他这一刻在心里替这一行注释了一句:
这是水位线之下的人,替水位线之上的人留的。
他把手机塞回口袋。
他走下台阶。
身后,北京春天早上七点半的天光,慢慢从浅灰转成淡金。他没有回头。
他知道他不需要回头。
地铁来了。门开了一秒,又关上。林行进了车厢。车厢里有一个老人——大约八十岁——坐在门旁的位子上,膝上摆着一台用了很多年的旧 ThinkPad。他在用屏幕上一个文本编辑器,一个字一个字慢慢打字。林行没去看他打的是什么。林行只是看见,老人的右手食指,搭在键盘的 'F' 键边上。
林行选了一个离老人三个座位的地方坐下。
地铁启动。轨道发出那种从初冬听到春天的声音——金属和橡胶之间,熟悉的、不变的频率。
林行闭上眼。
他后来想,那是他这一生听过的、最像水位线本身的声音——不是水的声音,也不是水之外的声音,是水正在做决定的声音。
(第十三章 · 完) (全书 · 完)