------------ 正文 ------------ 第一章 被优化的正确姿势 林默盯着HR王晓月那张职业微笑的脸,脑子里蹦出的第一个词是“底包”。 就像游戏开发里那些最基础的代码模块,可以被任何资源替换,删掉也不会影响主程序运行。他在这个项目组待了七年,从0到1搭起来的用户增长模型,现在成了别人PPT里的“团队成果”。而他这个底包,在完成历史使命后,正被礼貌而准确地卸载。 “林老师,公司不是针对您个人。”王晓月推过来一份A4纸,解约补偿金的数字精确到小数点后两位,“结构调整,您的岗位被优化了,这在大环境下很常见的。” 她用了“您”,像给手术刀涂上一层麻醉剂。 林默没看那份协议。他望向会议室的落地窗,48层之外是深圳湾的铅灰色海面。天要下雨了,云层积压得像服务器过载的内存,随时可能崩溃重启。他想起两年前,也是这间会议室,CEO拍着桌子说用户增长是公司的生命线,林默团队是心脏起搏器。现在起搏器耗电了,就该换新的。 “能问下原因吗?”林默听见自己的声音,平静得像在Debug一段别人的代码。 “主要是降本增效的考虑。您的职级P7,薪资成本较高,而目前增长部门需要更年轻的血液。”王晓月顿了顿,补上致命一击,“当然,您最近负责的‘星火计划’数据未达标,也是考核参考之一。” 林默想笑。星火计划,那个拍脑袋决定把用户画像从25-35岁下沉到18岁的神级项目。立项会上他列了八条风险预警,被VP一句“要拥抱变化”全堵了回来。现在数据烂了,锅要具体的人背。他忽然理解了为什么有些程序员会在注释里写“This is a temporary solution, please don't ask me why”——因为所有临时方案,都会变成永久债务,直到债务到期那天,清算的不是写代码的人,而是代码本身。 “签了这个,今天就能走?”林默拿起笔。 “流程上是的。您可以有半天时间整理私人物品。”王晓月似乎松了口气,谈判比预想中顺利。她见过太多崩溃、争吵、甚至下跪的员工,林默的沉默让她有点不安,又有点感激。 林默在纸上划下名字。最后一笔写完,他感觉身体里有什么东西断掉了,不是突然的剧痛,而是像用了七年的数据线,内部铜丝一根根耗损,终于在这一天,彻底失去了充电的功能。 他抱着纸箱走出会议室时,办公区静了一瞬。几十双眼睛像调试中的摄像头,齐刷刷对准他,又迅速移开。只有实习生小张憋红了脸,在Slack上给他发了条私信:“林哥,对不起,我昨天……把星火计划的复盘报告交了。” 林默没回。他站在自己的工位前,看着那盆绿萝。叶子有些黄了,他上周还说要换土,现在没必要了。电脑已经锁定,屏保是他和陈曦在厦门的合照,两个人在鼓浪屿的夕阳下笑得像个半成品——美好,但边缘有些毛糙,经不起放大细看。 他把绿萝留给小张,只带走了那半包苏打饼干。下楼时走的是消防通道,他不想在电梯里遇见熟人,更不想解释什么。48层楼,他一层层走下去,脚步声在楼道里产生延迟的回音,好像有另一个自己跟在后面,随时准备接管这具疲惫的身体。 出了春笋大厦,雨正好落下来。不是淅淅沥沥的那种,是深圳夏天特有的暴雨,直接倾倒,像老天爷在清空回收站。林默没躲,他站在雨里,看着对面的腾讯大厦,玻璃幕墙反射着灰蒙蒙的光。他想起刚来深圳那年,也是这样的雨天,他和陈曦挤在罗湖的城中村,阳台漏雨就用脸盆接着,两个人对着叮咚响的锅碗瓢盆大笑,说这就是他们的《雨中曲》。 现在他们搬进南山的高级公寓,有地暖有新风系统,下雨天可以关窗听雨,装作很有情调。但林默知道,有些东西在升级中丢失了,比如那种脸盆接雨也能笑出来的容错率。 手机在裤兜里震。他掏出来,用湿透的屏幕解锁,是陈曦。 “今晚还回来吃饭吗?给你炖了汤。” 配了张图,砂锅在灶台上咕嘟咕嘟,热气把镜头熏得模糊。林默能想象她踮脚拍照的样子,长发用抓夹随意挽着,围裙系在腰上,像那些短视频里贤惠的妻子。但现实中,她也是个28岁的女人,在广告公司做文案,天天被甲方折磨到崩溃,回家还要对着失业的男朋友炖汤。 林默打了几个字又删掉。回什么?说“我失业了”,还是说“我们分手吧”? 上个月陈曦提过回老家,说西安现在发展也不错,她可以申请调回去,林默也能找个不那么卷的工作。林默当时刚从医院出来,拿着轻度脂肪肝和心律不齐的诊断书,却在地铁口跟她说:“再给我半年,我能翻盘。” 现在盘翻了,扣着的全是他自己。 他把手机揣回去,雨水顺着指头缝流进去,屏幕暗了,像是替他做了决定。雨太大,他看不清路,就那么一直往前走,直到撞上一个烧烤摊的塑料雨棚。老板正在收摊,看他落汤鸡的样子,扔了条毛巾过来:“兄弟,躲躲雨吧,不收钱。” 林默坐在油腻腻的小板凳上,毛巾有股油烟和漂白粉混合的怪味。老板给他开了瓶啤酒,他没拒绝。冰凉的酒液滑进胃里,激起一层层暖意,像给断掉的电源线临时接了根铝箔。十二瓶下去,世界开始重影,但重影得不够彻底,他还能清晰地想起星火计划的数据报表,想起王晓月那个“底包”的微笑,想起陈曦炖汤时可能被热气熏红的眼睛。 手机又震了。林默摸出来,眯着眼看,是条陌生号码的短信,时间显示23:47。 “今日存档点已建立。回档指令:*#06#。” 他盯着这行字看了很久,每个字符都在视网膜上留下残影。哪个混蛋的恶作剧?还是他喝多了产生的幻觉?他回了两个字,打字都不利索:“你谁?” 几乎是秒回:“重要吗?你现在需要的不是我是谁,而是再来一次的机会。” 林默把屏幕按在额头上笑,笑得肩膀发抖。再来一次?重来什么?重来今天的羞辱,还是重来这七年的错误?他笑得眼泪出来,挥手让老板再拿酒,老板摆摆手说收摊了,最后两串腰花算送的。 他踉跄着起身,雨水把呕吐的冲动压下去。街上没什么车,他摸出打车软件,手滑点成了货拉拉。一辆五菱宏光停在面前,司机是个胖乎乎的中年人,嚼着槟榔问他:“哥们儿,拉货还是拉人?” “拉人。”林默拉开车门坐进去,把地址报给司机。车开得飞快,雨天路滑,司机还在跟他聊老家孩子的学费,说今年生意难做。林默嗯嗯啊啊地应着,眼皮打架,脑子里全是那条短信。 ——再来一次的机会。 如果真能再来一次,他绝对不会签那份协议,不会在星火计划的风险评估上妥协,不会把七年时间押注在一个可以随时替换的岗位上。他会……他会干什么呢?林默在醉意中想,他会在七年前就辞职,会在陈曦第一次说“我们回老家吧”时就答应,会…… 远光灯刺破夜色时,他正低头看手机。司机尖叫着踩刹车,但雨天路滑,五菱宏光像失控的代码,执行着无法中断的命令。林默抬起头,看见斑马线上站着陈曦。 她穿着那件他送的白T恤,手里提着保温饭盒,头发被雨雾沾湿贴在额头上。她应该是出来接他的,想给他一个惊喜,或者只是想确认他还能不能回来。她的眼睛在强光下睁得很大,但林默知道那不是惊恐,是疑惑——疑惑他为什么坐在一辆货拉拉的副驾驶上,为什么满身酒气,为什么把这一天过成了这个样子。 时间被拉长了,林默能看清每一滴雨水的轨迹,能数清陈曦有多少根头发被光打亮。他听见司机在喊,听见自己的心跳像过载的CPU风扇,听见手机在裤兜里发出最后的震动。 没有思考,没有权衡,没有程序员理性的if/else判断。他纯粹是本能地,用颤抖的手指在屏幕上按下了 “*#06#“ 。 不是拨号,不是发送,只是像输入解锁密码那样,六个字符,加一个井号。 世界在黑屏的瞬间重置。 ------------ 第二章 早餐的底包 林默在07:30的闹钟声里睁开眼,花了几秒钟确认天花板上那块像陕西地图的霉斑位置没变。枕边陈曦的呼吸很轻,她的头发散在枕头上,像一片安静的墨渍。林默没叫醒她,他轻轻下床,赤脚走在地板上,凉气从脚底板往上窜,让他确信这不是梦。 不是梦,但也许是疯。 他站在浴室镜子前,再次检查自己的身体——没有淤青,没有酒气,肝脏位置没有隐痛。昨晚的十二瓶青岛、烧烤摊的孜然味、货拉拉司机嘴里的槟榔气,全都被格式化掉了。只有记忆保留着,像硬盘坏道里侥幸没被擦除的数据。 这种感觉很怪异,像穿着别人的干净衣服,却知道自己埋汰过。 林默冲了个冷水澡,让理智回笼。作为程序员,他习惯用系统思维理解世界:如果人生是个进程,回档就是强制重启服务;重启后内存清空,但日志文件还在。可问题是,谁写的这个重启脚本?谁部署的?运维是谁? 他裹着浴巾出来,陈曦已经醒了,正抱着膝盖坐在床上看他。她的眼神带一丝刚睡醒的迷雾,但更多的是审视。 “你昨晚说梦话了。”她说。 林默擦头发的动作顿住:“说了什么?” “含混不清,就听见几个词。”陈曦下床,走进浴室,声音隔着门传出来,“什么‘重启’‘失败’‘别走’之类的。还喊我名字,挺大声。” 她挤牙膏,电动牙刷的嗡嗡声响起,像在林默心口振。他站在原地,忽然意识到一个漏洞:如果存档点建在06:00,那么06:00之后的所有行为都会被记录。而他昨晚在23:47收到的短信,是今天的他发的,还是昨天的他发的?时间线一旦分叉,因果律就成了递归函数,自己调用自己,直到栈溢出。 陈曦刷完牙出来,看他傻站着,伸手摸了摸他额头:“没发烧。怎么愣愣的?” 她的手凉凉的,带着牙膏的薄荷味。林默抓住那只手,握在手心里,像攥着一根救命稻草。他想告诉她,想从头说起,从HR王晓月的底包微笑说起,到货拉拉失控的远光灯,再到#06#那个荒谬的指令。但话到嘴边,他看见陈曦眼下的青黑——她为了那个该死的广告方案,连续两周凌晨两点才睡。 话就咽回去了。 “今天别加班了。”林默说,“请假吧,我陪你。” 陈曦笑了,抽回手去衣柜拿衣服:“你发什么神经,我今天要给客户提案。倒是你,不是九点半要跟HR谈话吗?穿正式点,别怂。” 她什么都知道。她从来什么都知道。 林默没反驳,他穿上最整齐的那件衬衫,把GitHub日志的事暂时封存。出门时陈曦塞给他一个三明治,面包片烤得焦脆,夹的火腿和生菜。林默咬了一口,味道很熟悉,但他想不起上次吃是什么时候。好像是很久以前,他还没升P7,他们还没搬到南山,陈曦还在朝九晚五,有心情给他做便当。 “别苦着脸。”陈曦踮脚亲他嘴角,“晚上给你炖汤。” 又是汤。林默心里咯噔一下,口腔里涌起一股铁锈味。他想起昨晚她提着保温饭盒站在斑马线上的样子,白T恤被车灯照得透明,像一张曝光过度的底片。 “别炖了。”他听见自己说,“今晚我们出去吃。” 陈曦挑眉:“太阳打西边出来了?你不是不爱外面的味精味吗?” “偶尔吃一次,没事。”林默把最后一口三明治咽下去,像咽下一枚定心丸。他得改变轨迹,哪怕只是微小的变量,也可能导致完全不同的结果集。 下楼时雨还没来,空气黏腻得像快过期的胶水。林默没坐地铁,他打了辆车,跟司机说自己赶时间。司机是个沉默的中年人,不像货拉拉的话痨,这让林默松了口气。他一路盯着窗外,看这座城市在早高峰里苏醒,像一台缓慢启动的巨型服务器,每个路口都是I/O阻塞。 到公司时,他故意绕开了正门,从货梯上去。他不想在电梯里遇到熟人,更不想提前被任何人截住。办公区已经有人了,保洁阿姨在擦拭会议室的玻璃,那股消毒水味让他想起医院太平间。他走到自己的工位,发现电脑还开着,屏保没锁——他昨晚走的匆忙,忘了按Win+L。 屏幕上是他没写完的周报,数据看板停在星火计划的转化率曲线,一条稳步下滑的红线,像心电图宣告死亡。林默坐下,没动鼠标,他盯着那条红线,脑子里在跑一个模拟:如果在这个时间点,他选择不重启项目,而是直接叫停;如果他在立项会上摔门而去;如果他在七年前的那次晋升答辩里,选择了另一家更小的公司—— 结果会不一样吗? “林哥,早啊。” 小张的声音把他拉回现实。实习生端着咖啡站在旁边,眼袋垂到颧骨,像两个未解决的Bug。林默记得他昨晚在Slack上发的道歉,说自己把复盘报告交了。当时林默没回,现在他抬起头,说:“没事,你做得对。” 小张愣住了,咖啡在杯里晃了一下:“啊?” “报告的事。”林默补充,“早晚要交的,不是你的问题。” 小张的嘴张成O型,像看到了开源代码里出现注释“此处逻辑请勿深究”。他磕磕巴巴:“可是……星火计划的数据……” “数据是我做的,责任在我。”林默说得平静,像在陈述别人的错误。他关掉周报页面,打开一个空白文档,开始写离职交接清单。小张站在旁边看了一会儿,有点手足无措,最后把咖啡放在他桌上,小声说:“林哥,保重。” 林默停下手里的键盘。他看了眼那杯咖啡,全糖美式,他以前的最爱。但现在他胃不好,陈曦不让他喝。他端起杯子,走到茶水间,倒掉,洗得干干净净,放回小张的工位,附一张便签:“谢谢,以后不用了。祝好。” 九点半,他准时出现在会议室3。王晓月已经在了,米色工装,职业微笑,像一段被封装好的欢迎组件。林默在她对面坐下,把那份解约协议推到桌子中间,说:“给我支笔。” 王晓月松了口气,递过来一支黑色签字笔。林默接过来,没签字,而是翻到协议的最后一页,在乙方签名栏的上方,用笔写下了一行小字: “本人不同意以上条款。” 然后他签了名,签得龙飞凤舞,像在对整个系统发起最后的请求。 王晓月脸色变了:“林老师,您这是……” “法律上,签字代表知悉,不代表同意。”林默把笔帽扣上,发出清脆的咔哒声,“我签字,是证明你们通知过我了。但我不同意,所以这份协议无效。咱们走仲裁吧,2N的赔偿,一分不能少。” 他站起来,看见王晓月的微笑出现了裂纹,像加载失败的JPEG。她可能没见过这种打法,大多数被优化的人都急着拿钱走人,害怕仲裁拖时间、耗精力、影响背调。但林默不怕,他现在有的是时间,至少今天有。 他抱着纸箱走出会议室,里面还是那台MacBook、三支笔、半包苏打饼干。重量是2.3公斤,补偿金的两倍。他想起陈曦的财务表格,突然觉得很值——这些年的青春,至少能换算成看得见的数字。 办公区的目光又如红外线般扫过来,这次林默没躲。他冲几个熟悉的同事点点头,把饼干分给邻座的小姑娘,把MacBook递给IT部的老王,说这是公司资产,请走报废流程。最后他抱起那盆绿萝,走到窗边,对它说:“你自由了。” 然后松手。 绿萝从48层坠落,在视野里变成个小绿点,消失在雨前的雾气里。没人尖叫,没人上前阻止,所有人都像被按了暂停键。林默转身,拍拍手上的土,对小张说:“帮我个忙,把纸箱寄到这个地址。”他写下家里的地址,转身离开。 电梯里只有他一个人。他看着镜面里的自己,那张脸还是28岁,但眼睛里有一种老人般的疲惫。他掏出手机,没有新短信,那个#06#的指令静静躺在已收信箱里,像一把没拔出来的钥匙。 地下车库,他走向自己的车。那辆二手卡罗拉,贷款还剩两年,贬值速度比他发际线还快。他拉开车门,坐进去,没急着启动。他需要时间思考,存档点的问题,陈曦的问题,以及接下来的问题。 手机震了,是陈曦。 “提案结束了,客户说再考虑。”她的声音听起来很平静,但林默能听出底下的失落,“晚上可能加班改方案,你先吃,别等我。” 林默想说别加班了,想说我们回家,想说那个保温饭盒你别带着。但出口的却是:“好,注意休息。” 电话挂断,他盯着屏幕,忽然想到一个测试方法。他打开地图,找到那个十字路口,调出街景。摄像头很清晰,能看清斑马线的纹理,能看清红绿灯的秒数。他把时间调到今晚23:47,预测模式下,那个时间点的车流量、人流量、甚至天气都显示出来。 一切都可计算,唯独缺少一个变量:货拉拉。 他无法预测一辆车的轨迹,无法预测司机的驾驶习惯,无法预测那0.01秒的刹车延迟。回档给了他再来的机会,却没给他上帝视角。他依旧是个困在时间循环里的底包,唯一的区别是,他知道自己会被替换。 雨终于落下来,砸在车顶,像密集的键盘敲击声。林默打开雨刮器,把世界刷成一片模糊。他驶出地库,没有回家,而是开向那个十字路口。他要在悲剧发生前,把地图刻在脑子里,每一个店铺、每一盏路灯、每一处遮挡视线的绿化树。 他要在这个循环里,找到不需要重启的最优解。 车停在路边,雨刷来回摆动。他看见对面的便利店24小时营业,看见药店门口有监控,看见斑马线尽头的摄像头编号:SZ-NS-0647。他记下这个数字,像记下一段关键的API接口。 手机震了,不是短信,是钉钉。小张发来消息:“林哥,你绿萝摔碎了,土撒了一地。保洁阿姨骂了半天。” 林默回:“让她骂,土里有我埋的U盘,备份了星火计划的所有决策邮件。她要是能拼起来,记得把数据导出来发我。” 小张回了一串省略号。 林默笑了,这是他今天第一个真心的笑。他把车开出停车位,准备绕路回家。在第一个路口等红灯时,他看见一辆五菱宏光从右转车道切过来,车身老旧,车漆斑驳。司机是个胖子,正在打电话,嘴上叼着烟。 不是昨晚那辆,不是昨晚那个司机。但相似度足够让林默的手心出汗。 他盯着那辆车,直到它消失在雨幕里。然后低头看手机,时间显示20:47。距离昨天那个致命时刻,还有三个小时。他还有机会改变路线,改变时间,改变一切。 但改变真的有用吗? 如果存档点每天都在06:00建立,那么他今天的所有努力,在明天都会成为被覆盖的历史。他救得了陈曦一次,救不了每一次。除非他找到触发车祸的底层逻辑,找到那个无法被覆盖的Bug。 雨刷器在挡风玻璃上划出规律的弧线,把世界分割成一次次刷新。林默忽然想起GitHub日志里那条备注:“当系统检测到重大失败时,自动建立当日存档点。” 重大失败。被优化不算,陈曦的死才算。 那么他的人生,是由谁来定义成功的? 手机在副驾驶座上亮起,是#06#的短信,但内容变了: “今日存档点已建立。剩余次数:1/1。提示:存档非永久,24小时后自动清除。” 林默盯着那行字,直到红灯变绿,直到后车按喇叭,直到雨刷把字迹刷成模糊的水痕。 他想起陈曦Excel表格里那个权重分配:他的心理健康占0.4。她现在是否也在某个存档点里,看着他一次次失败,一次次重启,却永远无法告诉他——她也困在循环里,只是她的循环没有指令,没有次数,只有等待。 林默把车停在路边,给陈曦打电话。 “怎么了?”她那边有键盘声,还有咖啡机的蒸汽声。 “我想问你个问题。”林默说,“如果一个人每天都要重来一遍今天,你会怎么劝他?” 电话那头静了很久,键盘声停了。陈曦的声音传过来,轻得像在怕吵醒谁: “我会告诉他,别急着重启。先想想,今天为什么会成为需要重来的今天。” 电话挂断,林默看着窗外的大雨,把那条短信又读了一遍。 存档非永久,24小时后自动清除。 他忽然明白,回档不是恩赐,是惩罚。惩罚那些不敢面对失败的人,惩罚那些以为时间可以像代码一样回滚的人。真正的存档点,永远在明天,而不是今天。 林默发动车子,调头,开向公司。他决定做一件昨晚绝对不敢做的事:把那个U盘,亲手交给CEO。 他要让今天,成为不需要重启的一天。 ------------ 第三章 孤注一掷的Bug 林默把车停回公司地库时,雨刷在挡风玻璃上划出最后一道水痕,像关闭程序时残留的日志。他看了眼手机,21:47,距离24小时的存档有效期只剩不到九个小时。如果陈曦说的是真的,如果#06#真是个惩罚懦夫的陷阱,那么他此刻正在做的,就是一场反向操作——把用来保命的回档机会,押注在一次毫无胜算的 confrontation 上。 他想起大二那年学操作系统,教授在讲台上说:“真正的健壮性,不是异常处理写得有多完美,而是系统在明知会崩溃时,依然选择不绕过那个Bug。”当时他觉得这是句废话,现在才明白,那叫尊严。 电梯上到48层需要48秒,林默在脑子里重构待会儿要说的话。不是道歉,不是控诉,是陈述。陈述一个底包在被替换前,最后能贡献的价值。U盘里的邮件链足够让VP喝一壶,但也能让CEO意识到,增长部门的心脏起搏器不是没电了,是装反了电极。 电梯门开,办公区比他想象的要空。加班的人已经去吃夜宵,没加班的早就润了。只有保洁阿姨还在擦那块被绿萝的土弄脏的地毯,看见他回来,眼皮都没抬:“小伙子,花盆得赔啊,物业规定。” “记我账上。”林默走过去,从她手里接过拖把,“阿姨您歇会儿,我来。” 阿姨愣住,像看到了一段自我执行的垃圾代码。林默没解释,他蹲在地上,一点点把散落的泥土拢进塑料袋。土很湿,有股腥气,像雨后树根的味道。他找到那个U盘时,它埋在土里最深处,金属外壳沾着泥,像个刚被挖出地下的时间胶囊。 他擦干净U盘,没往自己电脑上插。他走向CEO办公室,那扇常年紧闭的玻璃门,此刻亮着灯。他敲门,听见里面传来熟悉的声音:“进。” CEO叫周维,四十五岁,头发染得乌黑,发际线却诚实得很。他坐在升降桌后面,正用机械键盘回消息,那键盘声像机关枪,扫射着每一个提需求的人。看见林默,他停下手,没惊讶,反而有种“你终于来了”的疲惫。 “坐。”周维指了指沙发,是那种很难坐舒服的北欧风,像给员工的心理暗示:这里不欢迎你久留。 林默没坐,他站在桌前,把U盘放在一沓待签的文件上。U盘很小,像一粒药片,但足够让一具 corporate body 产生排异反应。 “里面有星火计划从立项到失败的全部邮件。”林默说,“包括立项会上VP说的‘要拥抱变化’,包括我发的八条风险预警,包括他最后甩锅时用的那份被篡改的数据报告原件。” 周维没动那个U盘,他盯着林默,像在审查一段可疑的提交记录:“你想干什么?劳动仲裁?媒体曝光?” “我想提醒你。”林默说,“增长部门下个月要推的‘燎原项目’,用的是和星火计划一模一样的逻辑。VP把名字改了,数据模型没改,风险点也没改。项目启动会在下周一,参会的是同一批人,决策的是同一个大脑。” 他顿了顿,补上一句:“到时候死的,也是同一批底包。” 周维的脸色变了,像服务器被注入了恶意脚本。他抓起U盘,插进电脑,屏幕的光映在他脸上,阴晴不定。林默没看他的屏幕,他看的是窗外,雨又开始下,比刚才更密,像要把整座城市冲刷成出厂设置。 “这些东西,你本可以拿去卖钱。”周维的声音从背后传来,“或者要挟公司,给你更好的补偿。” “我不卖。”林默说,“我要是不发出来,星火计划死的那七个月,就等于白死了。” 他指的是时间,也是指人。项目组七个月没休假,两个同事离了婚,一个得了甲亢。最后VP在复盘会上说,是执行层能力不足。那天散会后,林默在楼梯间听见一个小姑娘哭,说是不是我们真的很差劲。 周维拔出U盘,扔进抽屉里,动作带着一种事不关己的决绝:“东西我收下了。你的离职流程正常走,补偿按2N。但林默,别觉得这是什么英雄行为,你只是把一个更大的Bug,甩给了我。” “Bug需要暴露出来,才能修。”林默说。 “修了Bug,也要杀提交Bug的人。”周维站起身,比林默想象中要矮一些,“你知道吗?像你这号人,我在这个行业里见过太多了。有才华,有脾气,有底线。最后都变成了外包、自由职业者、或者回老家的失败者。因为系统不欢迎活体Bug,系统需要的是可替换的零件。” 他走到林默面前,拍了拍他的肩膀,像给一段废弃代码打上deprecated标签:“保重吧,年轻人。” 林默走出办公室时,听见身后键盘声又响起来,像什么都没发生。他回到工位,抱起纸箱,发现那三支笔被人动过,摆成了一个奇怪的图案,像某种警示符号。他看向四周,加班的同事陆续回来了,没人看他,但所有人都知道他去干了什么。 小张在Slack上给他发了个表情:👍。林默回了个👋。 他乘电梯下楼,这次没走消防通道。电梯里有几个面生的员工,在讨论今晚的欧洲杯。林默插不进去话,他也不想说。他抱着纸箱,像抱着自己七年的青春,轻飘飘的,没分量。 地库里,那辆二手卡罗拉还在原地。他拉开车门,把纸箱扔进后座,发现里面多了个东西——一盆新的绿萝,用塑料膜包着根,土是湿的,像刚移栽不久。 附了张便签,是陈曦的字迹:“旧的摔碎了,新的赔你。记得,别放窗边,它不喜欢阳光直射。” 林默捧着那盆绿萝,像捧着一盆源代码。他忽然明白,陈曦早就知道他会回来,也知道他会把那盆旧的摔下去。她甚至预判了他摔完之后,会需要一盆新的来填补心里的空。 他打电话给她,响了两声就接了。 “喂?”她那边很安静,没有键盘声,没有咖啡机声。 “你在哪儿?” “在家。”陈曦说,“提案改完了,客户说明天再说。我炖了汤,还热着。” 林默没说话,他听出她声音里的疲惫,那种熬了夜又想装出轻松的疲惫。他想起她那个Excel表格,备孕的权重占0.3,那意味着她其实做好了失业的准备,甚至做好了当妈的准备。 而他把一切都搞砸了。 “陈曦,”他说,“你是不是早就知道?” 电话那头沉默了很久,久到林默以为信号断了。然后她笑了,笑声里带着气音,像电流麦。 “知道什么?知道你今天会像个英雄一样去送死,还是知道你其实懦弱到连真相都不敢问我?” 林默攥紧手机,指节发白。他想反驳,想解释,想说他不是懦弱,是怕她担心。但话到嘴边,他想起凌晨三点那个烧烤摊,想起十二瓶啤酒,想起他连回她消息的勇气都没有。 “林默,”陈曦的声音软下来,像在用气声说话,“你记不记得,三年前你加班到胃出血,我送你去急诊。医生说你再晚来半小时,就得穿孔。你在病床上晕乎乎地跟我说,要是能重来,你一定不这么拼。” 她顿了顿,继续说:“我当时就想,如果能让你重来就好了。不是重来那次加班,是重来你整个人生。让你学会在第一次被PUA时就怼回去,在第一次背锅时就撂挑子,在第一次觉得‘我还能翻盘’时就收手。” 林默听着,喉咙里像塞了一团沾水的棉花。 “后来我翻你代码,看见你那个日志工具,我就想,能不能加个功能,让你每天都有一次反悔的机会。让你可以试错了就回滚,摔疼了就重来。但我不知道怎么实现,直到上周,你公司开始裁员,你连续三天说梦话,都在喊‘重启’‘回档’。” 她叹口气,像叹一口烟:“我就把那个项目翻出来,找了个做安全的朋友,用他的服务器搭了个自动化脚本。每天六点,它会检测你的生理数据——你手环不是一直开着睡眠监测吗?如果心率、血压、皮质醇水平超过阈值,就触发存档,发给你那条短信。” 林默看向自己的左手腕,那根旧红绳下面,戴着小米手环。他早忘了它的存在,像忘了自己还开着那么多没用的小程序。 “所以#06#是你设的?”他问。 “是我。”陈曦承认,“诺基亚时代的指令,你不会忘,也不会误触。但我没想到你真的会用它,也没想到……你真的会死。” 她说最后三个字时,声音抖了一下,像信号干扰。 林默想起车祸那0.01秒,他按指令时根本没犹豫。因为他知道,死了就什么都没了。但现在他意识到,他死了,陈曦还在。她会站在斑马线上,看着他被撞成一堆数据碎片,然后抱着那个保温饭盒回家,把汤倒掉,把锅洗好,把他的衣服打包,最后一个人回西安。 那才是她真正的存档点,没有次数限制,没有24小时有效期,只有无穷无尽的等待。 “你为什么不告诉我?”林默问。 “告诉你,你还会用吗?”陈曦反问,“你会想,反正有人给我兜底,再错一次也没关系。你会把回档当成一个习惯,把重启当成常态。最后你会忘记,有些错误是不该犯的,有些人是不该辜负的。” 她说得对。林默没法反驳。他现在已经尝到了那种诱惑:既然可以重来,为什么不在股市上梭哈?为什么不在职场上硬刚?为什么不在每个分岔路口都试一遍,直到选出最优解? 因为那样的人生,不是人生,是游戏攻略。 “那个短信平台,我租了三个月。”陈曦继续说,“三个月后,不管你能不能走出来,它都会停。我希望你在这九十天里,学会不依赖它,学会在没有存档的世界里,也能做出对的选择。” 林默听着,眼泪掉在绿萝的叶子上,像清晨的露水。他问自己,从什么时候开始,他需要女朋友为他写外挂,需要一段程序来教他做人? 从他把人生当成项目跑,把感情当成服务部署,把自己当成底包那天开始。 “陈曦,”他说,“对不起。” “别道歉了。”她打断他,“道歉是最没用的Debug手段。你现在要做的,是回家,喝汤,然后睡一觉。明天醒来,没有存档点,没有#06#,只有新的一天。” 林默抹了把脸,发动车子:“我二十分钟后到家。” “汤可能凉了。” “凉了就再热。”他说,“反正不用重启,也能重新加热。” 电话挂断,他再看那条短信,内容已经变了: “今日存档点已建立。剩余次数:1/1。提示:存档非永久,24小时后自动清除。警告:检测到用户尝试理解底层逻辑,是否继续?” 林默盯着那个“是否继续”,手指悬在屏幕上。 他想起周维说的,修了Bug也要杀提交Bug的人。现在他就是那个Bug,陈曦是提交者,#06#是触发机制。如果他选择继续,他就能知道全部真相:是谁的服务器在运行这个脚本,是谁在支付短信平台的费用,是谁在心率监测的阈值里,偷偷把“死亡”也设成了触发条件。 但他也知道,有些真相一旦揭开,就回不了头了。就像他今天把U盘交给周维,就像他摔碎那盆绿萝,就像他此刻选择回家,而不是去陈曦说的那个“做安全的朋友”那里,黑进服务器毁掉一切。 他最终按下“否”。 屏幕恢复成短信列表,#06#那条消息在顶端,像一个未关闭的网页标签。林默没删它,也没拉黑号码。他把它留在那里,提醒自己:你有重启的机会,但你不配再用。 车开出地库,雨小了一些。他路过那个十字路口时,刻意放慢车速。红绿灯在闪烁,摄像头在头顶静默,便利店还在营业,一切和他记忆里的一模一样。唯一不同的是,他没有喝酒,没有失控,没有让陈曦站在马路对面等他。 他提前打了个电话,让她在家,别出门。这个微小的变量,改变了整个函数的返回值。 回到家,陈曦果然在。她没炖汤,汤在砂锅里,她坐在沙发上,怀里抱着电脑,屏幕上是他那个GitHub项目。她听见开门声,抬头,眼睛里有红血丝,有泪痕,也有种释然。 “回来了?”她问。 “回来了。”林默说。 他走过去,把绿萝放在茶几上,坐在她身边。两个人都没说话,像刚跑完一场马拉松,累到不想解释。最后是陈曦先开口,声音哑哑的: “我那个朋友,说你的日志写得像诗。” “什么诗?” “绝望的诗。”她念给他听,“‘今天又是失败的一天,但我还活着。’‘星火计划死了,我的心率也死了。’‘如果可以重来,我想做一盆绿萝,不用思考,只需要光合作用。’” 林默不记得自己写过这些。也许是半夜三点,在酒精和绝望里,他把备忘录同步到了GitHub。那些文字像日志,也像遗书。 “我删了。”陈曦说,“太丧了,影响项目形象。” 林默笑出来,笑着笑着就哭了。他抱住她,把脸埋进她颈窝,闻着她身上淡淡的油烟味和洗发水味。这个味道没有回档,没有重启,只有真实。 “陈曦,”他闷声说,“明天我们回西安吧。” 她僵了一下,然后放松下来,拍拍他的背:“好。” “你不问为什么?” “不问。”她说,“反正明天,没有存档点,你说什么就是什么。” 林默没说话,他感受着她的体温,脑海里那个GitHub日志自动更新了一条: 【记录】2024-06-17 22:30:00,放弃使用#06#。原因:有比重来更重要的人。 这一行字,他没有打出来,但已经提交到了人生的主分支。 ------------ 第四章 西安没有存档点 林默在06:00整惊醒,像被系统定时任务唤醒的守护进程。他伸手摸手机,屏幕在黑暗中亮起,壁纸是陈曦在鼓浪屿眯眼笑的样子。没有短信,没有#06#,只有一条银行扣款通知:房贷还款成功,余额:¥1,247.30。 他盯着这个数字看了很久,直到眼睛发酸。这个数字意味着他失去了最后一点安全垫,像个裸奔的程序,再出任何异常都会直接崩溃。陈曦在旁边翻身,手搭在他腰上,温度真实得像编译时的内存地址,看得见,摸得着,无法回溯。 他轻轻下床,赤脚走到客厅,绿萝在茶几上耷拉着叶子,像没睡好的打工人。他给它浇了点水,水珠顺着叶脉滚下来,在台灯下折射出微弱的光。这盆新绿萝不会知道,昨天有一盆一模一样的,从48层自由落体,成了某个保洁阿姨骂娘的理由。 林默打开电脑,登录GitHub。那个叫“回档日志-2024-06-18“的仓库还在,但README.md文件变了。最后一行更新时间是凌晨三点,提交者ID是陈曦的邮箱。内容只有一句话: “今天没有存档点,只有选择。“ 他盯着这行字,像盯着一段没有注释的祖传代码。懂了,又没完全懂。底层逻辑被封装了,接口被隐藏了,能调用的只剩下自己的意志。这感觉让人焦虑,也让人踏实。 陈曦在卧室里喊他,声音带着刚睡醒的鼻音:“林默,你炖汤了吗?” 他愣了一下,才想起她说的汤是昨晚的梗。那个保温饭盒,那条斑马线,那辆货拉拉,都随着#06#的消失而成为了未发生的注释。但陈曦记得,她记得所有事,包括他醉驾,他重启,他死过一次。 “没炖。”他喊回去,“今天不喝汤,吃胡辣汤。” 他说的是西安的早餐,陈曦最爱吃的那家,在回民街某个巷子深处,店名用毛笔字写在木板上,没招牌,没外卖,没点评软件收录。他们三年前回去过年时吃过一次,陈曦说那是她活了二十八年,最接近童年味道的食物。 卧室里安静了几秒,然后传来她闷闷的声音:“好,我们去吃。” 林默听出那声音里的颤音,像一根绷紧的弦终于被松开。她以为他会忘记,会反悔,会继续抱着那个幻想中的重启按钮不撒手。但他没有,他比她自己还先接受了“今天没有存档点”这个事实。 他们去机场的路上,陈曦一直在用手机处理工作。甲方终于发了反馈,洋洋洒洒三十条修改意见,最后一条是:“还是第一版好,能改回去吗?”陈曦没骂人,她面无表情地回复:“好的,稍等。” 然后她把第一版文件拖进聊天框,点了发送。 林默瞥了一眼,说:“你脾气变好了。” “不是脾气好,是懒得生气了。”陈曦锁屏,看向车窗外,“反正明天没有存档点,今天生的气会跟着进棺材,不划算。” 她说得轻描淡写,但林默知道这是什么意思。当人生失去了撤销功能,每一次情绪都要计入成本,每一次冲动都要考虑折旧。这不是成熟,这是算明白了。 他们在机场过了安检,登机口显示屏上写着:深圳→西安,延误2小时。陈曦买了两杯美式,没要糖,没要奶,像两个准备受刑的人,提前适应生活的苦味。 “我们回去住哪儿?”林默问。他其实知道答案,但想听她亲口说,想确认这不是他昨晚醉酒后产生的幻觉。 “住我妈那套老房子,在交大南门。”陈曦喝了口咖啡,眉头皱成疙瘩,“七十平,两室一厅,没电梯,五楼。我妈说,爬楼当锻炼身体。” “她肯让我们住?” “她让我们回去,已经是天大的恩赐了。”陈曦苦笑,“你忘了?上次她打电话,你说‘深圳机会多,回去没出息’,她气得把电话挂了,三天没理我。” 林默想起来了。当时他是怎么说的?他说:“西安的互联网公司,连微服务都玩不明白,回去就是等死。”他那时候多狂啊,以为掌握了技术就掌握了命运,以为站在风口上,猪都能起飞。 现在猪摔下来了,才发现风口是别人租的,随时能关掉。 延误的广播响起时,林默的手机也响了。是个陌生号码,深圳本地。他盯着那串数字,像盯着一行待执行的命令,手指在接听键上悬停。 陈曦按住他的手:“别接。” “可能是快递。” “也可能是周维。”她眼神坚决,“你现在不是他们员工了,没义务接任何远程Debug的电话。” 林默没听她的,他按了接听。不是逞强,是想测试。测试没有存档点的世界里,他还有没有勇气接一个电话。 “林默吗?”是个陌生的男声,不是周维,不是VP,不是HR王晓月。声音很年轻,带着点金属质感,像变声器处理过。 “是我。” “别回西安。”对方说,“回来,来公司,现在。” 林默心跳漏了一拍:“你是谁?” “你看过《土拨鼠之日》吗?”对方没回答,反而抛了个问题,“比尔·默瑞被困在同一天,他尝试自杀、犯罪、放纵,最后发现唯一能跳出循环的方法,是让那一天变得完美——不是对他自己完美,是对所有人完美。” 林默攥紧手机,指节发白。他当然看过那部电影,那是每个程序员最爱的悖论片。但他不明白,这个来电者为什么在这时候提这个。 “你是谁?”他又问了一遍。 “你知道#06#是什么意思吗?”对方说,“诺基亚时代,它查IMEI。但在Linux系统里,它是强制注销当前进程的命令。你以为那是存档,其实是自杀。” 电话挂了。 林默僵在原地,耳边只剩忙音。陈曦看着他,眼神从疑惑变成担忧:“谁啊?” “不知道。”林默把手机递给她,呼吸有点乱,“但他说#06#不是存档,是自杀。” 陈曦的脸色变了。她抢过手机,回拨那个号码,机械女声提示:“您拨打的号码不存在。” 不存在。像那段幽灵代码,像那个只在06:00触发的逻辑,像所有无法复现的Bug,出现一次,永久消失。 广播在催登机了,陈曦拖着林默往廊桥走。他像个失去响应的进程,被她强行唤醒。直到坐在座位上,系好安全带,他才找回自己的声音: “那个系统,不是你写的,对吗?” 陈曦没看他,她盯着舷窗外忙碌的地勤人员,声音轻得像耳语:“我说是我写的,你才会信。你才会觉得,这一切还在掌控之中。” 飞机开始滑行,引擎的轰鸣淹没了一切对话。林默在巨大的噪音里,听见自己的心跳像调试时的断点,一次次触发,一次次暂停。他想起昨晚那个拥抱,想起她说的“今天没有存档点,只有选择”,想起她Excel表格里备孕的权重0.3。 所有线索串起来了,像一段被解开的哈希值。 陈曦说的“朋友”,不是做安全的,是做生物识别的。那个手环,不是检测睡眠质量,是检测死亡倾向。#06#不是存档指令,是紧急干预机制,当他潜意识里的绝望值超过临界点,系统会自动触发,把他的意识强行拉回当天早晨。 这不是时间回档,是意识拦截。他不是死了又活,他是根本没死成。 飞机离地瞬间,林默感到失重。他看向陈曦,她闭着眼,睫毛在抖。他忽然明白,她为什么那么累,为什么眼里总有红血丝,为什么她也在算错了就回不来的账。 因为她在维护这个系统。 “多久了?”他问,声音被引擎声撕得稀碎。 陈曦睁开眼,有泪滑下来,在失重里漂在脸上,像不会落地的雨。 “从你上次胃出血开始。”她说,“医生说你再这样下去,会死。我不相信,我觉得你只是需要一次重启。但我没想到,你会真的遇到车祸。我以为……我以为那只是你的噩梦。” 她泣不成声,像断了线的日志,再也写不下去。 林默抱住她,在狭小的经济舱座位里,在陌生人的侧目里,在生死和真相的夹缝里。他想起那个十字路口,想起那辆货拉拉,想起自己按下#06#时的决绝。 那不是重启,那是求救。 而他之所以还能求救,是因为陈曦在千里之外的服务器上,守着他的生命体征,守了整整一年。 空姐过来提醒他们系好安全带,林默松开手,给陈曦擦眼泪。他想说对不起,想说谢谢你,想说我们到了西安就把所有都删掉,过没有存档的生活。 但他最终说的,是:“汤还热着吗?” 陈曦噗嗤一声笑了,鼻涕泡都出来,狼狈得像刚上线的萌新。 “热着呢。”她说,“我妈用老式砂锅炖的,关火三个小时都烫嘴。” 飞机穿过云层,深圳在脚下变成一片发光的电路板。林默看着那片光,知道自己不会再回去了。不是逃避,是升级。从一个需要每天回档的底包,升级成一个能扛住错误的活人。 他打开手机,最后看了一眼那条#06#的短信。它还在,像一段被遗忘的注释,像一块不会被执行的废代码。他点了删除,系统提示:“此操作不可撤销。” 他点了确定。 屏幕清空的那一刻,他感到心脏某个地方也空了,但很快又被填满。那种感觉很奇怪,像卸载了杀毒软件,明知会有风险,却觉得电脑终于自由了。 陈曦靠在他肩上,睡着了。他闻到她头发上淡淡的油烟味,那是人间烟火的味道,是炖汤的味道,是家的味道。这种味道不会回档,不会消失,只会越炖越浓,浓到有一天,他们都忘了深圳有48层的高楼,忘了春笋大厦有会摔碎的绿萝,忘了#06#曾经是个救命指令。 飞机开始下降,西安的灯火在夜空中铺开,不如深圳密,但每一盏都像在等人。林默握紧陈曦的手,无声地说: 今天没有存档点,但今晚有胡辣汤。 这就够了。 ------------ 第五章 胡辣汤里的浮尘 飞机落地时膝盖震了一下,像重启失败的机械硬盘。林默跟着人流往舱门挪,才发觉自己双腿发麻,像在工位上坐了十个小时没挪窝。西安的空气混着潮土气和煤油味挤进机舱,把深圳那股子消毒水味冲得稀碎。他深吸一口,肺里像灌进了半个馒头,敦实,噎人,但落肚为安。 陈曦走路有点飘,毕竟在飞机上哭完就睡了,没睡好。她一手拖行李箱,一手挽着林默,指甲掐进他胳膊肉里,像怕他人间蒸发。出口接机的人群里,有个穿碎花裙的中年女人举着牌子,手写的“陈曦”两个字,墨迹没干透,洇成两团墨鱼汁。 那是陈曦她妈,李芳。林默三年没见过她,视频通话里她总说“小林又瘦了”,见面才发现是她自己胖了二十斤,坐下来像座弥勒佛,把机场大巴的单人座占成双人座。 “妈。”陈曦喊得有点心虚。 李芳没应声,上上下下打量林默,像在验收一段外包代码。末了才说:“黑了,也老相了。深圳太阳那么毒?” “不是太阳,是屏幕光。”林默答得老实。 李芳嗤笑一声,把目光转向陈曦:“行李就这些?” “就这些。”陈曦说,“剩下的,快递到付。” 她妈没再问,转过头去看窗外。西安的夜景像泼了墨的旧地图,路灯昏黄,街道宽阔,车开得慢悠悠,像在散步。林默记得深圳的车是蹿的,像生怕耽误服务器响应时间。这里的车不着急,人也就不着急。 老屋在交大南门一个家属院里,楼是九十年代的预制板房,外立面贴着白色小方块瓷砖,脏得发黄。楼道没灯,李芳打着手电筒往上爬,嘴里念叨:“五楼,当锻炼身体。” 林默想起陈曦在飞机上也是这么说的,母女俩的口头禅都能复用。他拎着两个箱子跟在后面,箱子轮子磕在台阶上,砰砰响,像敲鼓。鼓点敲到第三层,他听见楼上开门声,一个老头探出头:“小李啊,租客?” “女婿。”李芳说得干脆。 老头哦了一声,缩回去,门却没关严,留着条缝,透出一股熬中药的苦味。林默路过时瞄了一眼,屋里堆满纸箱,墙上挂着毛笔写的“厚德载物”,纸都脆了。 终于到了五楼,李芳开门,屋里一股霉味混着樟脑味扑出来,像打开了一个尘封的缓存文件夹。家具都是实木的,重,旧,但擦得锃亮。沙发上盖着白色钩花罩子,电风扇是铁的,吊在客厅中央,转起来嘎吱响。最扎眼的是电视柜上那台24寸的创维彩电,厚得像块砖头,遥控器套着塑料袋。 “你们住主卧,我睡小房间。”李芳把钥匙拍在茶几上,“厕所在阳台,热水器是太阳能的,阴天没热水。厨房煤气灶有点漏气,点火时先开窗。阳台的绿萝别浇水太勤,刚换的土。” 林默看向阳台,那里摆着一盆绿萝,比深圳那盆更蔫,像被优化过三轮的老员工。 “妈,你啥时候养的绿萝?”陈曦问。 “上周。有个老头送的,说你俩要回来,屋子里得有点活物。”李芳说得轻描淡写,转身进厨房开火,“先下点面,凑合吃。” 陈曦冲林默使眼色,意思是“别问,问就是相亲对象”。林默憋着笑,坐在沙发上,感觉屁股底下的弹簧抗议地哼了一声。他打开手机,信号从4G掉到3G,微信消息在转圈。深圳的那些群还在聊项目,聊期权,聊裁员,但他已经不在那些群的@列表里了。 这感觉不糟,反而像卸载了全家桶,手机内存一下子轻了。 面是手擀面,李芳自己和的面,切得粗细不均,像刚入门的产品经理画的原型图。浇头是西红柿炒蛋,蛋炒得很老,有焦边。林默吃得很香,比深圳任何一家网红餐厅的分子料理都香。他吃得额头冒汗,李芳坐在对面看着他,眼神软下来:“慢点,锅里还有。” “好吃。”林默说得真心实意。 李芳嘴角扯了一下,算是笑:“陈曦从小就好我这口。去年过年回来,还嫌我面煮得太软,说深圳人爱吃硬的。” “她嘴刁。”林默接话。 陈曦在桌底下踢他,他装作没感觉。 吃完面,李芳去小房间睡了,门一关,屋里静得能听见冰箱制冷的嗡嗡声。主卧的床是1.5米的,弹簧床垫,中间凹下去一块,像被人躺了二十年。床单是新的,蓝格子,但被套里塞的棉花是旧的,有股阳光晒过的味道。 陈曦躺上去,发出一声满足的叹息:“比深圳的床垫舒服。” “那是你心理作用。”林默说。 “不,是真的。”她侧过身,抱住他胳膊,“深圳那个床垫太贵,我睡着有压力,怕翻身都花钱。” 林默没说话。他知道她什么意思。深圳的一切都像在跑分,房租、工资、项目数据、KPI,每个数字都要最大化。而这里,老旧的家具、漏气的煤气灶、没热水的阴天,一切都是过时的、不合格的、但松弛的。 松弛到,你可以犯错,可以不用回档,可以睡到中午起,没人催你迭代。 夜里林默睡不着,床垫太软,陷进去像被代码抱住,挣脱不开。他轻手轻脚爬起来,去阳台抽烟。阳台没封,能看到半个西安的夜空,星星没几颗,月亮倒是很亮,像一块Debug时的断点。 李芳也在阳台,披着件衣服,坐在马扎上择菜。她没开灯,就着月光,动作很熟练。 “阿姨。”林默掐了烟。 李芳没抬头:“睡不着?” “嗯,认床。” “床是旧的,认什么认。”她把手里的青菜码整齐,“是心里有事吧。” 林默没否认,他靠在栏杆上,看楼下的梧桐树影。风一吹,影子晃得像鬼。 “陈曦说你辞职了,自己干。”李芳把菜放进篮子,“自己干,能挣着钱吗?” “不知道。”林默诚实地说。 “不知道你还敢回来?”她终于抬头,眼睛在月光下很亮,“深圳的房子不要了?贷款不还了?以后孩子喝西北风?” “孩子?”林默愣住。 “她Excel表里都算到备孕了,你以为我看不见?”李芳站起来,拍了拍他的肩膀,力气很大,像要把他钉在这栋楼里,“小林,陈曦跟你在一起八年,我没拦过。她想飞,我让她飞。现在她飞不动了,你要让她摔下来,我第一个不答应。” 她进屋了,留下林默和半篮子没择完的青菜。他坐下去,拿起菜,一根根撕掉老叶。他没干过这活,手指被菜汁染得发绿,像写了十年代码后终于碰了回泥土。 择完菜,他回屋,陈曦醒了,半眯着眼看他:“我妈为难你了?” “没,帮我上课呢。”林默躺下,抱住她,“她说备孕得先学会择菜。” 陈曦笑出声,把脸埋进他胸口,声音闷闷的:“她偷看我电脑了。” “那就让她看。”林默说,“反正以后没秘密了。” 他闭上眼,终于睡着了。没做梦,没回档,没24小时的有效期。只有黑暗,和黑暗里陈曦的呼吸声。 第二天他醒得晚,窗帘透进来的光昏黄,像老显示器的护眼模式。陈曦不在床上,厨房里传来油烟味,还有李芳的唠叨:“鸡蛋不能这么打,要顺时针,你逆时针搅,蛋黄都散了。” 他爬起来,洗漱,用阳台的太阳能热水器。水果然是凉的,他冲了个冷澡,冻得龇牙咧嘴,但脑子清醒。回到客厅,陈曦端着两碗胡辣汤出来,汤里漂着木耳、黄花、面筋,还有白胡椒的辛辣气。 “妈让楼下早餐店送的。”陈曦说,“她嫌我做得不正宗。” 林默喝了一口,烫得舌尖发麻,但味道很正。不是深圳那些改良版,是真胡辣汤,咸、辣、稠,喝完一脑门汗,像刚debug完一个祖传屎山。他喝完一碗,陈曦又给他添半碗,说:“留着肚子,中午吃凉皮。” 李芳坐在旁边,吃着白馒头,配咸菜。她看林默喝得香,脸上没表情,但眼神软得像化了的黄油。她忽然说:“我那个朋友,想请林默吃顿饭。” “哪个朋友?”陈曦警觉。 “送绿萝那个。”李芳说得理所当然,“他听说你是程序员,说他们公司系统老崩,想请你帮忙看看。” 林默和陈曦对视一眼,都从对方眼里看到了同一个词:来了。 这才是真正的西安。没有存档点,但有需求,有活干,有人情世故,有送绿萝就能牵出来的项目。你以为逃回了老家,其实只是个新地图,怪没刷完,任务列表还在。 “他什么公司?”林默问。 “物流公司,不大,就几十辆车。”李芳说,“但人家正经需要人,不给期权,给现金。” 林默笑了,笑得有点苦,又有点松快。他想起周维说的,系统不欢迎活体Bug,系统需要可替换的零件。现在他成了零件,但零件也有零件的好处——不用思考架构,不用背负愿景,只需要在指定的接口上,做好指定的事。 “行。”他说,“让他发需求文档吧,我先看看。” 李芳满意了,收拾碗筷进厨房,哼着秦腔,走调走得厉害。林默和陈曦坐在餐桌前,面前两碗空了的胡辣汤,碗底沉着一层胡椒末。 “你还真接啊?”陈曦小声问。 “不然呢?”林默反问,“回都回了,总得找个由由活着。” “由由”是西安话,意思是“理由”“盼头”。林默说得别扭,像刚学会的新 APIs。但陈曦听得懂,她把手覆在他手背上,说:“那咱们先约法三章。” “说。” “第一,不签合同,只口头协议。第二,不给源码,只给编译版。第三,”她顿了顿,指甲掐进他肉里,“不准再写存档功能,任何变种都不行。” 林默反手握住她,用力点头。他知道她怕什么,怕他一旦开始写代码,就会忍不住把“如果当年”写进注释,把“再给我一次机会”写成函数名,最后把整个系统都搞成后悔药。 “我保证。”他说,“这次只写删库跑路的脚本,不写存档。” 陈曦笑了,打了他一拳,像多年前他们在出租屋打闹那样。拳头落在肩上,不重,但真实。没有回档,没有undo,只有疼,和疼之后的笑。 林默的手机震了一下,是条新短信。他心口一紧,但很快松开——不是#06#,是银行发来的余额变动提醒:入账¥5,000.00,备注:周维。 下面还有一行小字:“U盘的尾款,税自己交。” 林默盯着那行字,像看一串加密的哈希值。周维没食言,2N的赔偿之外,还给了U盘的钱。但这钱怎么算?买断他的沉默?买断他的青春?还是买断他作为Bug的最后一点尊严? 他收了钱,没回消息,把短信转发给陈曦。她看了一眼,说:“收着吧,这是你应得的安葬费。” “安葬什么?” “安葬那个以为靠技术就能翻盘的林默。”她说得平静,“让他安息,我们好好活。” 林默没反驳,他端起空碗,去厨房洗。水龙头的水很凉,像深圳的暴雨,也像西安的清晨。他把碗冲干净,放回碗柜,动作很慢,像在执行一段没有`--force`参数的`git push`,每一行都要确认,每一步都不能反悔。 碗柜的门关上的声音很闷,像存档文件被彻底删除的回响。林默站在水槽前,看着窗外。五楼的高度正好能看到隔壁楼的阳台,那里也摆着一盆绿萝,叶子绿油油的,活得很好。 没有存档,没有重来,没有24小时的保质期。只有这盆绿萝,这碗胡辣汤,这个漏气的煤气灶,和身后那个打着哈欠说“中午吃凉皮”的女人。 这才是生活。Error无法避免,但可以选择怎么Handle。 他转身,对陈曦说:“下午我去见见那个送你绿萝的老头。” “干嘛?” “问问他,这花怎么养才能不黄。”林默擦手,“毕竟,以后没法回档了。” 陈曦愣了一下,然后笑得前仰后合,像听见了天底下最好笑的笑话。她笑出了眼泪,笑出了鼻涕,笑得拉着林默的手不放开。 那个笑声里,没有恐惧,没有后悔,只有终于卸载了杀毒软件后,裸奔的自由。 ------------ 第六章 绿萝也认床 林默见到老周那天,西安正下着他回来后的第一场像模像样的雨。不是深圳那种往死里砸的暴雨,是关中平原特有的小雨,细得像雾,绵得像老周递过来的名片——物流公司的总经理,名片却印着“货运信息咨询服务部”,地址在二环边一个汽配城,电话是座机。 老周就是送绿萝的那个“朋友”,今年六十二,退休前是交大的后勤处长,说话慢条斯理,每个字都带着拖堂的味道。他把林默领进办公室,其实是个铁皮房,夏天漏雨冬天漏风,墙上贴满褪色的运费表。电脑是个联想台式机,主机箱裂了条缝,用胶带缠着,开机要五分钟,风扇响得像要起飞。 “系统就是这东西,”老周拍了拍显示器,“能撑到现在,全靠司机师傅们记性好。” 林默凑近看,屏幕上是个DOS界面的程序,蓝底白字,光标在最后一行跳,像垂危病人的心电图。他试着输入个help,返回的是乱码。老周解释,这是2003年找学生做的,那时候他还是处长,手里管着十几辆校车。后来退休了,自己搞物流,把系统搬过来用,一直用到今天。 “二十年,没出过问题?”林默问。 “出过。”老周点了根烟,是那种五块钱的白沙,烟灰直接弹在地上,“去年有个司机把货拉错了,跑到延安才发现。系统里地址明明是汉中,他看成了汉口。我骂了他一顿,他说字太密,老花眼看不清。我说你咋不戴眼镜,他说戴了,系统字还是太小。” 林默没笑,他看着那行乱码,脑子里已经开始重构。这套系统没有注释,没有文档,没有版本号,像一段凭空出现的神话。但神话背后有活人:二十年来,几十个司机靠它养家,几百个客户靠它发货,几千条货运记录在它硬盘里生了根。 “我能改,”林默说,“但得花时间。而且改完可能得换新电脑,这老爷机跑不动。” “换呗。”老周吐出个烟圈,烟圈在铁皮房里不散,像挂了个虚拟的logo,“反正不着急,慢慢来。我们这种小公司,活干得慢点不丢人,活丢了才丢人。” 林默当晚就把主机箱搬回了家。李芳看见那台缠着胶带的古董,脸拉得比面条还长:“老周让你修这个?他咋不让你修他那辆破桑塔纳?” “桑塔纳我修不了,这个能。”林默把机箱搁在阳台,接上显示器,电源线插进拖线板。开机那一声“嘀”,像老牛犁地前的叹息。陈曦从卧室探头,看见蓝底白字的界面,乐了:“这啥?你儿子?” “我祖宗。”林默搬了个马扎坐下,开始敲键盘。他先做了个全盘镜像,生怕改错了把老周的饭碗砸掉。镜像做到凌晨两点,进度条卡在97%,他盯着那3%的剩余,眼皮打架,但又不敢合。没有存档点,没有#06#,错了就是错了,回不了头。 陈曦给他泡了杯茶,是自己炒的陕青,叶子大得像柳叶,泡开了满杯都是涩味。她坐在旁边,看他一行行敲代码,像看巫师念咒。她看不懂,但她知道这玩意儿现在比他们都重要——老周答应给三千块,预付一千五,够还下个月房贷的最低额度。 “要不先睡?”她问。 “你先睡,”林默盯着屏幕,“这进度条不等人。” “它不等你也不等,”陈曦把茶杯往他手里塞,“熬坏了,老周可不赔医药费。” 林默没接茶,他忽然想起什么,抓起手机看时间:02:47。这个数字让他后背发凉,昨晚那个神秘电话也是这个时间打来的,说#06#是自杀指令。他盯着手机,等它震,等它亮,等它跳出一条幽灵短信。 但手机没动静,只有个微信通知,是银行的自动还款成功提醒。他松了口气,又有些失落,像卸载了游戏才发现,自己想念的不是游戏,是游戏里的复活点。 进度条终于走完,他关机,搬着机箱回屋。陈曦已经睡了,缩在床的一侧,给他留了大半位置。他躺下时床垫塌陷,把她晃醒了。她迷迷糊糊翻过来,抱住他,闻到他身上的机油味和旧电脑味。 “你闻起来像老周。”她嘟囔。 “老周闻起来像二十年前的交大。”林默回。 “那你就是二十年前的程序员。”她笑,声音从鼻腔里出来,像撒娇,又像叹息,“还没被优化过的那种。” 林默闭上眼,脑子里全是那套DOS系统的代码。没有Git,没有版本控制,没有回滚,改错了就得用软盘重装。老周说,当年做这系统的大学生,现在在华为,P9,年薪百万。他让林默有问题随时问,但别问太多,人家忙。 林默没加那个P9的微信。他觉得自己没资格问,这不是技术问题,是生存问题。那个P9用二十年时间,把自己从一段DOS代码升级成微服务架构,而林默用了七年,把自己从主程序优化成了底包。 现在又回到DOS时代,像报应。 第二天他起得晚,李芳已经出门了,桌上留着早餐:两根油条,一碗豆浆,用搪瓷缸子装着,盖子是缺了口的碟子。豆浆面上结了一层膜,林默揭下来吃了,像吃一张没写代码的纸。 陈曦在客厅改方案,甲方又发新需求,要“有内涵的年轻感”。她骂了句脏话,把键盘敲得噼啪响。林默没打扰她,抱着机箱去阳台,继续干活。他发现阳台的绿萝有新叶子了,小小的,嫩黄的,像刚冒头的想法。 老周打电话来,问进度。林默说在改,老周说没事不急,然后补充了一句:“对了,有个客户要加急发一批货到成都,三十台冰箱,你看系统里能不能备注个‘易碎’?” 林默说能,挂了电话,打开代码,找到货物信息录入那块。DOS界面的字都是点阵的,放大就糊,缩小就看不清。他改了半天,终于加了个星号功能,在货物名前加,就能在打印的运单上标红。 他测试了一下,保存,编译,打包。每一步都像在走钢丝,没有Test环境,没有Rollback,错了就得给老周跪下。他做完时中午了,陈曦出来倒水,看见屏幕上红红的一片星号,乐了:“你这是给老周开外挂啊?” “不算外挂,”林默起身活动僵硬的脖子,“算补丁。” “补丁能挣钱吗?” “能,老周说这批冰箱运费四千,给我提十个点。” 陈曦算了算:“四百块,够吃四十碗胡辣汤。” “够吃八十碗,”林默纠正,“我算过了,楼下那家六块钱一碗,老周介绍的四块钱。” 陈曦白他一眼,进厨房热剩饭。林默跟着进去,发现煤气灶果然漏气,打火时“嗞嗞”响,火苗蹿得老高。他调了半天风门,终于稳住,陈曦在旁边看着,忽然说:“你说,老周那个系统,是不是也漏了二十年的气?” 林默没说话,他盯着那簇火苗,蓝中带黄,像一行跑了二十年的代码,随时可能爆栈。 下午老周开车过来取主机,开的是那辆破的桑塔纳2000,车门哐哐响。他看见新功能,高兴得直拍林默肩膀:“好小子,有当年那个P9的风范!” 林默没接茬,他问:“老周,你这系统跑了二十年,有没有想过,万一哪天它彻底死了怎么办?” 老周愣了愣,点了根白沙,烟灰还是弹在地上:“死了就死了呗。司机们记性都好,客户也熟,电话打一圈,货照样发。系统这东西,是给人用的,不是人给系统用的。” 他说得轻描淡写,林默却像被雷劈了。这句话他听过,在无数个需求评审会上,产品经理说“用户习惯就好”,技术负责人说“先上线再优化”,CEO说“数据会证明一切”。但没人说,系统死了,人还能活。 老周是第一个。 临走时,他留下那盆绿萝,说家里养不活,让林默继续伺候。林默没拒绝,他把绿萝放在阳台最亮的角落,心里默念:这回不摔你了,咱俩都认命。 晚上李芳回来,拎了块肉,说要包饺子。林默和陈曦打下手,三个人围在餐桌前,擀面皮的擀面皮,包馅的包馅,像三个合作开发的程序员,没人说话,但节奏默契。李芳忽然问:“老周那活儿,能长干吗?” “能,”林默说,“他没打算换人。” “那你们打算啥时候要孩子?” 擀面杖停在半空,陈曦的脸红到耳根。林默没慌,他说:“等这盆绿萝长出新叶子。” 李芳愣了愣,然后笑了,笑得眼角挤出两条鱼尾纹:“那得快着点,绿萝长得慢,但人老得快。” 饺子煮好时,雨又下了起来。这次不是雾,是真雨,打在窗户上啪啪响。林默端着碗去阳台,看见绿萝的新叶子在雨气里舒展,像伸了个懒腰。 他掏出手机,想拍张照,发给老周,或者发给陈曦。但他最终没拍,只是站着,让雨淋到身上,让叶子淋到雨。他想起在深圳最后一次淋雨,那次他按下了#06#,这次他没有。 因为没有存档点的人生,连淋雨都只有一次机会。 他进屋,关门,吃饺子。陈曦蘸醋,李芳蘸辣子,他什么也不蘸,就白口吃,觉得甜。不是饺子的甜,是活过来的甜。 夜里他做梦了,梦见自己还在深圳,48层,王晓月递过来协议,他签了字,然后走出会议室,没摔绿萝,没发邮件,没按#06#。他只是走到窗边,跳了下去。 梦醒时一身冷汗,陈曦在旁边打呼噜,像个小马达。他坐起来,看手机,时间显示03:47。不是02:47,也不是23:47。只是个普通的时间,没有任何指令在等待。 他躺下,重新睡着。这次没做梦,或者做了也忘了。 没有存档点的世界,连噩梦都只有一次。 ------------ 第七章 未寄出的U盘 林默在老周那台老爷机上敲下最后一行注释时,西安的知了正叫得凶。声音从阳台的纱窗缝里挤进来,像一万个线程同时请求阻塞,CPU温度飙升到90度。他合上笔记本,屏幕合上时“啪“的一声脆响,把趴在绿萝叶子上的一只金龟子惊飞了。 那只金龟子是三天前飞来的,当时林默正给老周改代码,它一头撞在显示器上,晕了半天。林默用湿纸巾把它包起来,放在窗台上,本来想等它缓过来就放生。结果它缓过来之后不走了,成了这盆绿萝的第一个用户,每天趴在叶子上啃灰,日子过得很佛系。 陈曦说它是福报,林默觉得它是Bug——一个无法复现、无法修复、也无法驱逐的Bug。就像现在,他每天早上六点还是会惊醒,伸手摸手机,摸半天才想起#06#已经删了,存档点没了,连噩梦都只有一次。 但身体的记忆还在。肌肉记忆,比任何硬盘都顽固。 老周下午三点过来取主机,开着他那辆桑塔纳,这回车门不哐哐响了,用胶带缠了两圈。他把车停在楼下,没熄火,发动机突突突地抖,整栋楼都在共振。李芳从厨房探头看了一眼,说:“老周又来了?上次我晾阳台的被单,被他车屁股的黑烟喷成灰的了。” 林默抱着机箱下楼,老周正在跟楼下下象棋的老头们递烟。白沙烟,五块一包,那些老头接过去,夹在耳朵上,不抽,像攒着当硬通货。老周看见林默,咧嘴笑,露出一颗镶了银边的假牙:“弄完了?” “弄完了。”林默把机箱放后备箱,用旧衣服垫着,“加了几个功能,你回去让师傅们试试,不行我再调。” 老周没急着走,他从车里拿出一瓶西凤酒,没包装,用矿泉水瓶装的,酒液黄得发稠:“我自己泡的,加了枸杞和人参,你拿回去喝。喝完晚上睡觉踏实,不会做那些乱七八糟的梦。” 林默心里咯噔一下,像被调试器断点命中。他接过酒,瓶子温热,是老周的体温。他问:“你怎么知道我做梦?” “陈曦说的。”老周拍拍他肩膀,像拍一个刚毕业的学生,“她说你半夜老惊醒,喊什么‘别重启’‘别回档’。我听着像在说股票,她说不是,是心理问题。” 心理问题。林默咀嚼这四个字,像嚼一颗没泡软的枸杞,苦,回甘,但咽不下去。他以为把#06#删了,把GitHub仓库锁了,把深圳的手机号注销了,那些破事就翻篇了。但陈曦记得,老周也记得,连楼下老头耳朵上夹的那根白沙烟,都像在提醒他:你逃回来了,但你的Bug没修。 老周上车要走,忽然又降下车窗:“对了,那个当年给我写系统的学生,死了。” 林默怔住:“死了?” “嗯,华为那个P9,去年猝死的。”老周说得平淡,像在报一个迟到的物流信息,“三十七岁,留下老婆孩子,还有一套没还完贷款的房子。公司给了抚恤金,但不多,因为算‘自愿加班’。” 他发动车子,黑烟又喷出来,把李芳刚晾的被单喷成灰的。车开走时,老头们还在下棋,象走田,马走日,每一步都慢,每一步都算。林默站在原地,手里攥着那瓶西凤酒,像攥着一段没有注释的代码,懂不了,又放不掉。 上楼时他走得很慢,五楼的高度让他喘。在深圳他从来不走楼梯,楼梯间是消防通道,是逃生用的,不是日常用的。但在西安,楼梯是生活的一部分,每天爬,每天喘,每天接受自己体力不行这个事实。 陈曦在改方案,甲方又发了新需求,要“年轻化的厚重感”。她骂了句脏话,把键盘敲得噼啪响,像要把键盘敲成西安鼓乐。林默把酒放桌上,她瞥一眼:“老周给的?” “嗯。” “别喝。”她说,“他泡的酒,老鼠都不敢喝。” “他说你告诉他的,我做梦的事。”林默拉过椅子,坐在她旁边,“你还跟他说什么了?” 陈曦停下敲键盘的手,屏幕上是一行没写完的标题:《关于品牌年轻化的深度思考——以Z世代为核心》。她盯着那行字,像在盯一个解不开的递归函数。 “我说你快死了。”她声音很轻,轻得像怕惊动什么,“我说你在深圳最后一个月,心率监测每天飙红,手环给你发过三次预警。我说你最后一次去公司,出门前亲了我一下,像交代后事。” 她转过脸,眼眶是红的,但没泪:“我说我得救你,不然我就得抱着你的骨灰盒回西安。我妈会骂我,说我当初不该让你去深圳。我也会骂我自己,骂我为什么没在第一次你说‘我累了’的时候,就让你辞职。” 林默没说话,他伸手想抱她,但她躲开了。她站起来,走到阳台,去看那盆绿萝。金龟子还在叶子上趴着,像睡着了一样。 “#06#不是我写的。”她忽然说。 林默的指尖凉了,像按在了死机的键盘上。 “是我找的人写的。”陈曦没回头,声音混在雨声里,听不清情绪,“你手环的数据,我导不出来,华为的用户协议里写了,健康数据属于用户隐私,除非本人授权。我找不到授权,就找了个黑客,黑进了华为的云服务器,拿到你的实时心率。” 她说得平静,像在陈述一段需求文档:“那个黑客说,你的数据很奇怪,每天凌晨三点到四点,心率会突然归零,持续三十秒,然后恢复正常。他问我你是不是每天凌晨都会心脏病发作,我说不是,是你每天凌晨都会死一次。” 林默想起那些梦,那些他以为是被#06#拉回现实的瞬间。原来不是拉回,是根本没有死。他的意识在车祸发生前被拦截了,被强制重启了。像Windows的蓝屏,崩溃了,自动恢复,用户还以为只是卡顿了一下。 “那个黑客,就是老周说的学生。”陈曦终于转过身,脸上全是泪,“他没死,他装死,是为了躲债。他欠了高利贷,给人写外挂,写了个人生回档的外挂,结果把自己套进去了。他找上我,说可以帮你,但条件是,让你也帮他一次。” 她走过来,从抽屉里拿出一个U盘,黑色的,金属壳,和林默摔碎绿萝那天交给周维的一模一样。 “这是备份。”她把U盘放在林默手心,“你交给周维那个,是空的。真正的邮件、数据、决策记录,都在这里面。黑客说,周维如果真敢动VP,这些就是证据。如果他不敢动,这些就是炸弹,随时能炸。” U盘很凉,像一块冰。林默攥着它,觉得手心被烙了个印。 “为什么要骗我?”他听见自己的声音,像从很远的地方传来,“为什么要让我以为,是你写的存档点?” “因为如果是黑客写的,你会去查,会去追问,会陷进去。”陈曦哭出声,像压抑了一年的情绪终于找到出口,“但如果是我写的,你会信,会依赖,会把它当成爱。林默,你这个人,只有被爱困住的时候,才肯停下来。” 她说得对。林默想,如果早知道是黑客,他会刨根问底,会把那个装死的P9挖出来,会重新打开GitHub,会再写一万行代码,去验证#06#的底层逻辑。他会陷入比死亡更深的循环——对技术的执念。 但现在他知道了,他没有那种执念了。他只想知道,那个黑客要什么。 “他要什么?”林默问。 “他要你回深圳。”陈曦抹了把泪,“他说只有你能修他写的那个外挂,他把自己困在循环里了,每天凌晨三点,他都会梦见自己猝死,然后惊醒,再睡,再梦,再醒。他需要你帮他关掉那个程序。” 林默没说话,他站起来,走到阳台。雨还在下,但小了,像代码跑完后的残余日志。他看着那盆绿萝,想起老周说,它不喜欢阳光直射。其实它喜欢的,只是有人在给它浇水,不管直射还是散射,只要有人管,它就能活。 他想起老周的那瓶酒,想起他说的“不会做那些乱七八糟的梦”。老周早就知道,他知道那个学生没死,知道#06#不是存档,知道林默被陈曦骗得团团转。 但老周什么都没说,他只是送了盆绿萝,泡了瓶酒,让林默自己选。 选回深圳,还是留在西安。选做救人于循环的英雄,还是做给物流公司修电脑的底包。 选相信技术能救命,还是相信人能。 林默转身,把U盘递给陈曦:“烧了。” “什么?” “烧了,或者扔了,别留。”他说,“那个黑客想活,就让他自己写代码救自己。我们救不了他,就像我们也救不了深圳那盆绿萝。” 陈曦没接,她看着他,像在确认他这句话是不是出自真心。林默没回避,他握住她的手,把U盘按在她掌心:“我想明白了。#06#不是惩罚,是拐杖。拄着拐杖走久了,忘了怎么自己站。现在拐杖扔了,我得自己学着走。” 他顿了顿,补上一句:“哪怕会摔,哪怕会疼,哪怕走不回深圳。” 陈曦攥紧U盘,眼泪又掉下来,但这次是笑的。她走到厨房,打开煤气灶,把U盘放在火苗上。塑料壳很快融化,金属片烧得发红,像一颗正在坍塌的星星。李芳被吵醒,出来骂:“大晚上烧啥呢?熏死人了!” “烧垃圾。”陈曦说,“二十年的垃圾。” U盘烧完,剩一小撮灰。陈曦打开窗户,让雨气吹进来,把灰吹散。灰落在绿萝的叶子上,金龟子被呛得飞走了,再也没回来。 林默站在她身后,抱住她,像抱住一个终于跑完所有测试用例的程序。她在他怀里发抖,不知道是哭的还是笑的。 “明天,”她闷声说,“我们去吃凉皮,去回民街,去钟楼。去所有你说没时间去的地方。” “好。” “然后回来,给老周写系统,给我改方案,给我妈择菜。” “好。” “然后,”她抬起头,眼睛亮得像刚通电的显示器,“我们要个孩子吧。不要什么权重,不要什么计划,就要个像金龟子一样,随便飞、随便活、随便犯错的孩子。” 林默笑了,笑得眼泪出来。他低头亲她,亲她的额头,亲她的眼睛,亲她脸上那层灰。他尝到了灰的味道,苦的,涩的,但回甘。 那是二十年代码烧成的灰,也是二十年人生炼成的糖。 窗外雨停了,月亮出来,照在绿萝上。叶子油亮,没黄,没蔫,活得很好。 没有存档点,没有重启,没有#06#。 只有月光,只有雨气,只有一碗没炖的汤,和一个终于敢说不回头的程序员。 ------------ 第八章 雨后的锅贴 陈曦怀孕的消息是老周先发现的。那天林默去他那儿送改好的系统,老周正蹲在铁皮房门口给桑塔纳换机油,看见他下车,拿油乎乎的手点了根烟:“你媳妇有了吧?” 林默愣住,手里攥着U盘像攥着个烫手的秘密:“你咋知道?” “脸。”老周吐出个烟圈,烟圈在汽配城的灰里不散,像给空气打了层补丁,“你脸上那股子随时准备回档的劲儿没了,换成了一种……”他琢磨半天词,“换成了一种‘算了就这样吧’的劲儿。” 林默没反驳,他最近确实经常“算了”。陈曦的Excel表格再没更新过,备孕那栏的权重从0.3变成了1.0,后面跟了个括号:(已达成,进入维护阶段)。她不再算每个月收支,不再算存款余额,不再算哪天够资格要孩子。她只是某天早上刷牙时忽然干呕,然后举着验孕棒出来,两条杠,像一段跑通的测试用例。 林默当时的反应不是激动,是恐慌。他第一反应是摸手机,想查查怀孕的头三个月要注意什么,有没有Bug,能不能回滚。陈曦把验孕棒塞他手里:“别查了,查了你也不信,信了也记不住。就当它是个Feature,咱们慢慢适配。” 那时他们回西安已经两个月。林默给老周的系统加了图形界面,老周给的钱够付三个月房贷,李芳的脸色因此好看了些,再也没提过“那个送绿萝的朋友”。她把阳台的绿萝搬进客厅,说孕妇不能吹穿堂风,但没说绿萝也不能。 林默于是每天给绿萝浇水,顺带跟它说话。说的都是废话,比如“今天陈曦没吐”“老周的桑塔纳又熄火了”“楼下老头下棋耍赖,把车横在过道上”。绿萝不回应,只是默默长新叶子,一片,两片,像在给这段没存档的日子打追踪标记。 陈曦的孕反来得凶猛,吐得昏天黑地,连胡辣汤的味道都闻不得。李芳急了,变着法儿做吃的,小米粥配咸菜,菠菜面配醋蒜,甚至拿出来了珍藏的榆钱,蒸了一锅榆钱饭。陈曦吃了一口,又吐了,吐完抱着马桶哭,说对不住孩子,对不住妈,对不住那锅榆钱。 林默蹲在旁边给她拍背,拍得手都麻了。他想起在深圳时,陈曦加班到胃疼,他也是这样拍,但那时候拍的是“同事”,现在拍的是“老婆”,很快还要拍“孩子他妈”。身份切换得太快,像没写迁移文档的直接上线,报错一堆,但他不敢回滚。 “要不……”他犹豫着开口,“要不我们去医院看看?” “不去。”陈曦吐得眼泪汪汪,“去了就要建档,要抽血,要B超,要听医生说‘一切正常’。可我不想听正常的,我想听‘你的孩子很坚强,不需要回档也能活’。” 林默没再劝,他知道她怕什么。她怕医院那些仪器,那些数据,那些“正常范围”。她怕一旦把怀孕这件事量化,就会忍不住算权重,算概率,算失败率。她怕算着算着,又忍不住想:要是能重来一次,是不是该等存款再多点,等林默工作再稳定点,等西安的房子再大一点? 可人生没有存档点,孩子也不会等你万事俱备。 老周的系统上线后,出了几次小问题。一次是司机把号输成了#,运单打印出来全乱码,客户拒收。一次是数据库满了,老周没备份,林默只能用手动删除十年前的旧记录,删得胆战心惊,像在给一个百岁老人做截肢手术。 每次出问题,老周都不急。他打电话过来,先问陈曦吐得还厉害吗,再问林默睡觉踏实吗,最后才说系统又抽风了。林默远程解决不了,就骑共享单车去汽配城,单程四公里,骑出一身汗。老周递给他一瓶冰峰,像递一杯救命药水,喝完继续修。 那天系统崩溃得彻底,连DOS界面都进不去了。林默抱着机箱回家,连夜重写引导程序,写到凌晨四点,眼睛都花了。陈曦起来上厕所,看见他屏幕上的蓝光,骂了句“作死”,然后给他泡了杯陕青,茶叶放多了,苦得像中药。 林默喝完茶,继续写。没了#06#,他反而更小心了,每写一行都要备份,每备份一次都要命名:boot_20240815_v1_final_final_really_final。陈曦看着那文件名,笑得肚子疼:“你这是对‘最终版’有什么执念?” “怕改错了,找不回来。”林默老实承认。 “错了就错了,”陈曦摸着还没显怀的肚子,“就像这孩子,来了就来了,没计划好也来了。错了也得养,也得爱,也得给他擦屁股。” 她说得自然,像在聊明天的天气。林默停下敲键盘的手,转过椅子看她。她穿着李芳的旧睡衣,身材还没走样,但脸圆了一圈,是幸福肥的那种圆。她站在门框里,像嵌在一个相框里,背后是客厅那盏昏黄的吸顶灯,前面是她自己,和一个小小的、还没成型的未来。 林默忽然觉得,老周说得对。他脸上那股子“算了就这样吧”的劲儿,不是颓废,是认命。认命不是认输,是认了“人生不能被Debug”这个事实,然后继续跑下去,哪怕跑出一堆Warning,也好过死循环。 系统修好时天亮了,林默没睡觉,他洗了个澡,换了件干净衣服,骑车去汽配城。老周还没开门,铁皮房上着锁,他坐在门口等,等得差点睡着。老周来的时候骑着三轮摩托,后面拉着一车西瓜,看见他,乐了:“哟,送媳妇回娘家啊?来得这么早。” “系统好了。”林默把U盘递过去,“这回加了自动备份,数据库满了会自己删最老的记录,删之前会弹窗让你确认。” 老周没收U盘,他指着那车西瓜:“先吃瓜,吃完再谈正事。” 两人坐在铁皮房门口,用拳头砸开西瓜,瓜瓤沙瓤,甜得齁人。老周吃得满脸汁水,像小孩。林默吃得慢,一口一口,像在品尝某种没有注释的甜。 “你媳妇快生了吧?”老周忽然问。 “还早,刚三个月。” “三个月好,三个月稳了。”老周吐出颗瓜子,精准地吐进三轮车的车斗里,“我老伴当年三个月的时候,还跟我跑货运,从西安到成都,三天来回。结果路上颠得太狠,流了。” 林默停住吃瓜的动作。 “后来就没再怀上。”老周说得轻描淡写,像在说别人的车坏了,“我那时候年轻,觉得没关系,车还能跑,货还能拉,钱还能挣。等老了才发现,车会报废,货会砸手里,钱也就能买个小铁皮房。但孩子不一样,孩子是那个……那个什么来着?” 他比划半天,没找到词。 “是存档点?”林默试探着说。 “对对对,存档点!”老周一拍大腿,“有了孩子,你才知道你那些破代码、破系统、破公司,都算个屁。你不敢死,不敢疯,不敢回档,就为了孩子得好好活。” 他说得对。林默想,他最近确实不敢死了。走路会看车,吃饭会注意营养均衡,连烟都戒了,因为陈曦说二手烟对胎儿不好。他以前觉得活着是为了跑通人生这个程序,现在觉得活着是为了别让运行中的程序崩溃。 因为程序里多了个新进程,优先级最高,关不掉,不能杀。 老周吃完瓜,拍拍屁股站起来,从三轮摩托座位底下摸出个信封,塞给林默:“这是尾款,三千。多出来的五百,是给孕妇的营养费,别嫌少。” 林默没推辞,他接了,说谢谢。老周摆摆手,骑着三轮突突突地走了,留下一地瓜子皮和半个没吃完的西瓜。林默盯着那半个瓜,想起陈曦最近爱吃酸的,不爱吃甜。他掏出手机,想问问她要不要带半个回去,但转念一想,还是算了。 没有存档点的人生,连问一句“你想吃啥”都得自己承担答案的重量。 他抱着西瓜上楼,李芳正在骂陈曦:“孕妇不能吃凉的,你嘴馋也不能这么馋!” 陈曦辩解:“我就吃一口。” “一口也不行!”李芳把西瓜没收,放进冰箱,“等会儿熬热汤喝。” 林默把半个西瓜搁桌上,说:“妈,老周给的,不吃浪费了。” 李芳瞪他一眼:“你就惯着她吧!” 话虽这么说,她还是把西瓜切了,分成小块,用微波炉打热了端出来。陈曦吃了一块,酸得皱眉,说:“什么玩意,西瓜都能做成热的。” 李芳得意:“热的好,热的不伤胃。” 林默没吃,他回阳台,看那盆绿萝。金龟子又飞回来了,趴在叶子上,一动不动。他伸手戳了戳它,它没反应,像死了一样。但仔细听,能听到它翅膀下的嗡鸣,很微弱,但确实在震。 它没死,只是在适应没有存档点的世界。错了不能重来,摔了不能回档,只能趴着,等伤好,等雨停,等下一阵风把自己吹到另一片叶子上。 林默也趴在栏杆上,看楼下的老头们下棋。他们还在下昨天那盘,棋局没动,像被谁按了暂停键。但仔细看,车挪了一步,马跳了一个日字,卒子过河了。 没有回档,但也没死局。每一步都算,每一步都错不了,因为错了就真输了。 他想起那个黑客,那个装死的P9,那个把自己困在循环里的人。他忽然明白,那人不是需要林默帮他修代码,是需要林默告诉他:怎么在没有#06#的世界里,承认自己会输,还敢继续下。 林默掏出手机,找到那个已经删掉的神秘号码。他记得最后一通电话里,那人说的《土拨鼠之日》。他说要让那一天完美,不是对自己完美,是对所有人完美。 现在林默懂了。完美不是不出错,是错了之后,还有人给你热西瓜,还有人让你修系统,还有人抱着马桶哭完,继续给你生孩子。 他打开短信,新建一条,收件人填了老周。他写:“系统好了,以后不会再崩。但记得备份,别再删了。” 发送。成功。 然后他把手机关机,取出SIM卡,用剪刀剪成两半。一半塞进绿萝的花盆,一半装进钱包。他对陈曦说:“明天我们去换个新号,西安本地的,套餐便宜,还送亲情号。” 陈曦正抱着垃圾桶吐,没空理他,只伸出一只手,比了个OK。 林默走过去,帮她拍背,拍得像给老周的系统写补丁,一下一下,有节奏,有温度。他想起在深圳最后一次拍她背,是在烧烤摊,她喝吐了,他拍得不耐烦,觉得耽误时间。 现在时间有的是,不存档也不会丢。他慢慢拍,慢慢等,等她吐完,漱漱口,抬起头,眼眶红着,嘴角还挂着水珠。 “男孩还是女孩?”他问。 “女孩。”她说得笃定,“像你,会写代码,但不会回档。” 林默笑了,笑得眼泪出来。他抱住她,抱住她肚子里那个小小的、倔强的、不会回档的女孩。 窗外,那盘没下完的棋局终于结束了。老头们吵起来,一个说“你赖皮”,一个说“你输不起”。棋盘被掀翻,棋子滚了一地,像被清空的日志文件,像被删除的U盘,像被剪断的SIM卡。 但明天,他们还会再来,重新摆盘,重新开局,重新算每一步。 没有存档,没有重来,只有新的棋局,和那个能把热西瓜做得理直气壮的李芳。 ------------ 第九章 没有注释的惊蛰 陈曦怀孕满四个月那天,西安下了场倒春寒。雨夹雪,米粒大的冰碴子砸在阳台的铁皮上,噼里啪啦像往代码里打断点。李芳说这叫“冻桃花”,把花苞都冻死了,今年交大的樱花肯定开得晚。她一边说一边把陈曦的秋裤从衣柜里翻出来,硬要她套上,说孕妇不能冻,冻出毛病来没有回档的地方修。 陈曦不肯穿,说秋裤显胖,甲方视频开会她能看见自己的双下巴。林默在旁边打圆场,说穿吧,双下巴是Feature,不是Bug,客户要的是“年轻化的厚重感”,厚重感不靠下巴靠啥?陈曦瞪他一眼,把秋裤扔他脸上,说:“那你穿,你厚重。” 林默真穿了,套在西裤里头,走路两条腿摩擦出沙沙声,像老桑塔纳的发动机。他下楼去给老周送系统更新的补丁包,老周看见他裤腿鼓囊囊的,乐了:“咋,媳妇儿把你棉裤也穿上了?” “秋裤。”林默纠正,“孕妇同款。” 老周笑得咳嗽,从三轮摩托后座摸出个保温杯,里面是泡胖大海的水,递给他喝。林默喝了一口,甜得发腻,像前端代码里没删的console.log,跑是能跑,就是膈应。老周说:“我那口子当年怀我儿子,也是四月,倒春寒,死活不穿棉裤,结果落了个老寒腿,现在天一阴就喊疼。你可得看好陈曦,别由着她性子。” 林默说好,心里却想,由着性子才是陈曦的性子。她要是肯听劝,当年就不会跟他去深圳,也就不会有#06#那一堆破事。但转念一想,她要是不去,他们也不会有现在这个被秋裤包裹着的、没回档可得的孩子。 他把补丁包给老周,老周没急着试,说他要先去拉一车西瓜,回来再测。林默问他为啥不先测,老周说:“系统这玩意儿,跟西瓜一样,熟不熟,得看时辰。时辰到了,自然甜。时辰不到,急也没用。” 他说得玄乎,林默却听懂了。这是老周的生存哲学:不赶时间,不求完美,不惦记重来。错了就改,坏了就修,修不好就换,换不起就扛着。扛到扛不动了,就死,死了就埋,埋了就完。 没有存档,没有循环,没有24小时的有效期。 林默回家时,陈曦果然没穿秋裤,蜷在沙发上跟甲方开视频会。她把电脑垫在肚子上,摄像头只照到半张脸,下巴藏在毛衣领子里,看着确实不显胖。但林默瞥见她脚背上的青筋,凸起来像网线,那是怀孕水肿的前兆。 他进厨房,把李芳炖的猪脚汤热了,盛出来晾着。汤表面浮着一层琥珀色的油,李芳说这叫“胶原蛋白”,喝了孩子皮肤白。林默用勺子撇油,撇了半天也撇不干净,干脆不撇了,油花也是花,有油有花,日子才算富足。 陈曦开完会,捧着肚子挪到餐桌前,看见猪脚汤就皱眉:“不想喝,腻。” “喝两口。”林默把勺子递她嘴边,“就两口,给老周个面子。他说了,不穿秋裤就得喝猪脚汤,二选一。” 陈曦扑哧笑了,抿了一口,立刻捂嘴往洗手间跑。林默跟过去,看她趴在马桶边干呕,吐不出东西,只有酸水。他学着李芳的样子,给她拍背,从上往下顺,顺了五分钟,她终于缓过来,瘫坐在地上,脸色白得像显示器没点亮。 “这日子啥时候是个头啊。”她有气无力地说,“吐了四个月,活像中了无限循环的毒。” 林默心里一紧,像被钩子勾住了旧伤。他把她扶起来,扶到沙发上,拿热毛巾给她擦脸。她闭着眼睛,睫毛湿成一绺一绺的,像被雨打湿的绿萝叶子。 “要不……”他犹豫着说,“要不咱们去医院看看?输个液,补点营养。” “不去。”陈曦睁开眼,眼神倔得像编译不过的代码,“去了医院,医生肯定说‘一切正常’。可我不想听正常的,我想听‘你的孩子很坚强,不需要回档也能活’。” 这是她第四次说这句话。每次吐完,她都说。像在念咒,像在许愿,像在提醒自己,也提醒林默:这个孩子,不是存档点养出来的,是吐出来的,是熬出来的,是喝猪脚汤喝出来的。 林默没再劝,他知道劝不动。他进厨房,把猪脚汤倒进保温杯,塞进冰箱。李芳回来肯定骂,骂就骂吧,骂也是一种日志记录,证明他们活过。 下午他去交大校园里散步,没目的,就是走走。校园里有很多梧桐树,叶子还没长全,枝桠像裸露的神经。他走到计算机系那栋楼,门口贴着考研喜报,红砖墙上有爬山虎,绿得像老周那瓶西凤酒。 他在楼前的长椅上坐下,看学生下课。有情侣牵手,有单身上课的抱着笔记本电脑,有教授模样的人骑着二八大杠,车筐里塞满讲义。一切都慢,慢得像在跑单线程程序,一次只做一件事,做完再做下一件。 他想起自己在深圳时,每天同时开八个窗口,回二十条钉钉,跑三个项目,还得抽空盯美股。那时候他觉得这叫高效,现在觉得这叫自杀。高效把生活切成了碎片,每一片都锋利,割得人生血肉模糊。 手机震了,是陈曦发来的消息,一张图片,是B超单。单子上黑乎乎的一团,像一团没格式化的硬盘,但中间有个小白点,心跳的形状。 消息文字只有三个字:“活了。” 林默盯着那张图,看了很久,久到夕阳把红砖墙染成金色,久到教授骑的二八大杠又回来了,久到他自己眼眶发热,像显示器烧屏。他回了个“嗯”,然后又回了一句:“别回档。” 陈曦回了个打人的表情。 他起身回家,经过回民街,买了半斤刚出锅的锅贴。锅贴皮煎得金黄,底脆得像调试成功的提示音,咬一口,韭菜汁烫嘴。他边走边吃,想起陈曦说想吃酸的,又折回去买了半斤酸汤水饺,汤里漂着虾皮和紫菜,酸得开胃。 到家时李芳正在骂陈曦,说她不该对着电脑太久,辐射把孩子照成傻子。陈曦顶嘴,说那是液晶屏,没辐射,李芳不信,说液晶也是电,有电就有辐射。林默进门,把锅贴和水饺放桌上,说:“妈,别骂了,再骂辐射更大。” 李芳瞪他:“你俩就合起伙来气我。” “不敢。”林默递上锅贴,“特意买的,刚出锅,您尝尝。” 李芳尝了一个,不骂了,转身进厨房给她自己热剩饭。陈曦冲林默眨眼,小声说:“还是锅贴好使,比#06#都管用。” 林默心里一咯噔,像被钩子又勾了一下。他坐下,吃饺子,酸汤冲得他额头冒汗。陈曦也吃,吃了两个就不吃了,说腻。她最近胃口像坐过山车,上一秒想吃,下一秒就想吐。林默也不勉强,他把剩下的饺子汤喝了,连汤带水喝个精光,像要把所有酸味都吞进肚子里,消化掉,变成自己的。 晚上他继续给老周写代码。系统稳定运行后,老周给他介绍了新活儿,给汽配城的其他商户做小程序,报价不高,但需求简单,就是展示商品和留电话。林默接了三个,每个收两千,够陈曦生完孩子的奶粉钱。 他写代码时,陈曦在旁边看育儿书。书是李芳从旧书摊上淘的,九十年代的版本,书页黄得发脆,上面画着怎么给婴儿洗澡的图,丑得像PPT手绘。陈曦看得认真,偶尔念出来:“洗澡水温37度,不能高不能低,高了烫,低了感冒,感冒了没回档……” 她说到“回档”时,自己都笑了。她把书放下,摸着肚子,对里面那个小白点说话:“听见没,你妈现在总拿这个词开玩笑,等你出来,不许学。” 林默停下敲键盘的手,转过来看她。她侧躺在沙发上,肚子还没隆起,但手放上去的姿势已经很熟练,像托着一个易碎的硬盘。他忽然想起老周老伴的老寒腿,想起老周说的那个没保住的胎,想起老周最后那句“孩子是存档点”。 他走过去,蹲在她身边,把手覆在她手背上。她的手温热,掌心有汗,像刚跑完一段长代码。他低声说:“对不起。” “又道歉。”陈曦闭眼,嘴角带笑,“不是跟你说,道歉是最没用的Debug手段吗?” “那什么有用?” “活着。”她说,“活过今天,再活过明天,再活过后天。活到他生下来,活到他会哭会笑会喊爸妈,活到我们都忘了#06#是什么东西。” 她顿了顿,补上一句:“活到我们都承认,自己不是程序,是人。” 林默没说话,他把头埋在她肚子上,听里面的声音。没有心跳,没有胎动,只有她腹腔的咕噜声,饿了。他笑起来,笑得眼泪出来,把她的睡衣打湿一片。 这时李芳从屋里出来,看见这一幕,没骂,没唠叨,只是轻轻说了句:“锅贴凉了,我给你俩热热。” 她进了厨房,开火,倒油,平底锅滋啦一声,把锅贴底重新煎脆。香味飘进客厅,混着阳台的绿萝味,混着陈曦身上的奶香味,混着林默指尖的机油味。 这就是生活。没有注释,没有文档,没有版本号。 只有锅贴凉了能再热,绿萝黄了能再养,孩子哭了能再哄,日子错了不能再重来。 但这样,也挺好。 ------------ 第十章 惊蛰后的未寄件 陈曦肚子显怀那天,西安下了场真正的春雨。不是倒春寒的冰碴子,是润物无声的牛毛雨,把交大南门的梧桐树浇得发亮,嫩叶在雨气里舒展,像刚被解放的线程。林默下楼扔垃圾,发现楼下下棋的老头们收起了棋盘,改在楼道里打拱猪,扑克牌甩得啪啪响,像在给雨声配节奏。 他扔完垃圾没上去,站在雨里抽了根烟。烟是陈曦怀孕后他偷偷买的,十块一包的白沙,老周同款。他抽得很省,一天三根,早中晚各一根,像在执行一个定时任务。烟雾混着雨气钻进肺里,凉得透彻,把心里那点燥火全浇灭了。 陈曦怀孕五个月,孕反好了些,但脾气见长。昨儿晚上因为林默把猪脚汤热过头了,她砸了碗,说“你连个汤都热不好,以后怎么带孩子?”林默没吭声,默默扫了碎片,又默默给自己盛了碗凉的喝了。最后陈曦哭,说对不起,不是我故意耍脾气,是孩子闹的。林默抱着她,像抱着一个随时会抛出异常的程序,不敢紧不敢松。 老周打电话来,说系统又出了个新问题。这次不是Bug,是需求——有个大客户要签合同,要求在系统里加电子签名功能。老周在电话里说得急,像赶着去投胎,林默听半天才听明白:人家嫌打印出来再签字太麻烦,想直接在手机上戳两下就完事。 “我不会。”林默说得老实,“那是区块链,是加密算法,是第三方SDK接入。我只会写DOS,写小程序,写点让打印机别卡纸的脚本。” 老周在电话那头沉默了几秒,忽然笑了:“那你学呗。学完了告诉我多少钱,我加钱。” “学废了咋办?” “废了再学,学到不废为止。”老周说得云淡风轻,“反正你又不能回档,一次学不会,就学两次。两次不会,就学十次。十次还不会……”他顿了顿,“十次还不会,你就不是干这行的料,趁早去交大门口摆摊卖凉皮。” 林默挂了电话,站在雨里笑。烟头烫到手了才反应过来,把烟屁股扔进垃圾桶,转身上楼。 陈曦正趴在餐桌上画思维导图,用彩笔,画得花花绿绿。林默凑近看,是“婴儿房布局v5.0”,从v1.0到v4.0都被她否了,理由是“没有考虑到孩子长到三岁后的可扩展性”。林默想说,三岁后的事谁说得准,说不定那时候他们早搬走了。但话到嘴边,他咽回去了。他知道陈曦在怕什么——她在怕一切不可控的东西,怕没有文档的未来,怕不能回滚的教育方案。 “老周让你学什么?”陈曦头也不抬,笔尖在“尿布台”和“书桌”之间画了个双向箭头。 “电子签名。”林默说,“加密的,我不会。” “那就学。”陈曦说得理所当然,“你当年学Python,学Go,学K8S,不都是现学的?那时候有回档吗?没有吧,不也学会了?” 她说得对,但那时候年轻。年轻的时候学东西快,错了就改,改废了重装,反正时间有的是。现在不行了,现在学新东西,脑子里像塞满了过期依赖包,装一个报错十个,报错十个就卡死,卡死了还找不到日志。 “我怕学不会。”林默说得小声,像在承认一个耻辱的Bug。 陈曦终于停了笔,抬起头看他。她最近脸圆了不少,双下巴看起来福相十足,眼睛倒还清亮,像刚擦过的显示器。 “学不会就学不会呗。”她说,“学不会,你就不是干这行的料,趁早去交大门口摆摊卖凉皮。” 她把老周的话原封不动还给他,一个字都不差。林默愣了愣,然后笑得前仰后合,笑到陈曦都怕了,怕他笑得动了胎气。他摆摆手,说没事,就是觉得好笑。老周和陈曦,一个六十岁,一个二十八岁,一个没读过书,一个读过太多书,但他们说的话,居然能完全一样。 因为生活的底层逻辑就是一样的:不会,就学。学不会,就认。认了,就干别的。干别的也干不好,就活差一点。活差一点,也总比死了强。 晚上林默没开电脑,他坐在阳台,把那瓶西凤酒拿出来了。老周送的,一直没喝。他拧开盖子,酒香混着药味冲出来,熏得绿萝叶子都颤了。他倒了一小盖,抿了一口,辣得龇牙咧嘴,像第一次跑通代码时的感觉——痛苦,但清晰。 陈曦出来,挺着肚子,像移动的服务器。她抢过酒瓶盖,也抿了一口,立刻吐出来:“什么玩意儿,给耗子喝得吧?” “老周说,喝了不做梦。” “你信?” “不信。”林默把瓶盖盖好,酒放回原处,“但想试试。” 两人并排坐在阳台的小马扎上,看对面楼的灯火。交大的学生宿舍十一点熄灯,现在十点五十,窗口还亮着一大片,像没关机的服务器集群。林默指着其中一扇窗,说:“我当年写代码,也爱熬夜到十一点,觉得那时候思路最清。现在不行了,十点就困,脑子像被垃圾回收机制清过一遍,干净得啥也不剩。” “那不挺好?”陈曦抱着肚子,像抱着一个待上线的项目,“干净点,装新东西。” 她肚子忽然动了一下,像有只小脚在里面踹。她“哎哟”一声,抓住林默的手按上去。他感觉到了,很轻,像蝴蝶扑翅膀,像键盘上不小心按到的触控板,像一段没有预期的输出。 “动了。”他说,声音抖得像第一次跑通Hello World。 “嗯,动了。”陈曦笑着说,“他也在适应,适应没有回档的环境。” 两人坐了很久,坐到宿舍楼一片一片地暗下去,像被优雅关闭的进程。最后只剩几盏灯,苟延残喘,像不愿意下线的开发者。林默站起来,伸懒腰,骨头咔咔响,像老旧的机械键盘。 “学吧。”他说,“电子签名,学不会就去卖凉皮。” 陈曦没回头,她在黑暗中数胎动,一下,两下,三下。她数得很慢,很认真,像在算一个不能出错的循环: for day in range(1, 365): if baby_kicks: live_one_more_day() else: panic_but_no_rollback() # 注释:没有存档,只能继续 第二天林默没去老周那儿,他去了交大图书馆。借了三本密码学的书,厚得像砖头,全是公式和证明。他坐在自习区,旁边是考研的学生,桌上堆着咖啡和红牛。他看着那些年轻的面孔,想起自己当年考研,也是这么过来的。但那时候心里没负担,考不上就调剂,调剂不上就工作,工作不行再考。总有退路,总有回档。 现在没有退路了。书看不懂,也得看。公式记不住,也得记。因为他要挣那三千块钱,要给陈曦买孕妇裤,要给未来的女儿买尿布。更重要的是,他要证明给自己看:没了#06#,他还能学新东西,还能跑通新程序,还能当个人。 中午他在食堂吃饭,刷陈曦的校园卡。卡里的余额显示12.50,他刷了份最便宜的素面,6块,剩下6.5,够明天再吃一顿。他端着面,找了个角落坐下,边吃边在笔记本上抄公式。抄到一半,手机震了,是条深圳号码发来的短信。 他盯着那串数字,手抖得筷子都拿不稳。号码没存名字,但他记得,那是周维的私人号。 短信内容很短,就一句话: “VP进去了,星火计划的数据,你备份了没?“ 林默看着那行字,像看着一行没有闭包的代码,悬在空中,执行不下去。他想起那个U盘,那个被陈曦烧掉的U盘,那些备份了又被删除的邮件。他想起自己抱着机箱去CEO办公室那天,想起摔碎的绿萝,想起按下的#06#。 他回了一个字:“没。“ 周维回得很快:“可惜了,本来能给你申请个专利。“ 林默笑了一下,笑得食堂的灯都晃了。他删了短信,删了号码,把手机揣回兜里,继续吃面。面凉了,坨了,像一段跑死了的进程。但他还是吃完了,连汤都喝了。 因为面凉了能热,人死了不能。没有存档点,就得把每一口饭都当成最后一口,把每一行代码都当成最后一行,把每一天都当成没有#06#的第一天。 他吃完,把碗送到回收处,走出食堂。雨还在下,但小了,像快要结束的日志输出。他骑车回家,路过回民街,买了半斤刚出锅的锅贴,还热着。上楼时他走得很慢,五楼的高度让他喘,但他没停。 陈曦在等他,挺着肚子,像等着一个迟到的API响应。他推门进去,把锅贴放桌上,说:“吃,还热。” 她吃了一个,烫得直吸气,然后说:“老周刚打电话,说电子签名不急,让你先学好怎么当爹。” 林默愣住。 陈曦又吃了一个,边吃边说:“他说他那系统,一天没电子签名,死不了。但你媳妇儿一天没你陪着,可能真会疯。” 林默坐下,吃锅贴,一口一个,烫得眼泪出来。他分不清是烫的,还是别的。他想起老周的三轮摩托,想起他老伴的老寒腿,想起他那个没保住的胎,想起他现在孤身一人住在汽配城。 老周什么都知道,但他什么都没说。他只是让林默自己学,自己选,自己认。 就像#06#从来不存在一样。 林默吃完最后一个锅贴,对陈曦说:“我去把SIM卡装回去。” “哪个SIM卡?” “深圳的那个。”他说,“我得给周维回个电话,告诉他,VP进去是好事,但别扯上我。我现在的项目,是电子签名,是给女儿赚尿布钱,不是给他擦屁股。” 陈曦没拦他,她看着他找出那张被剪成两半的卡,用胶带粘好,插进手机。开机,信号搜索,注册网络,一条未读短信弹出来,还是周维的: “猎头问我你联系方式,给不给?“ 林默回:“不给。“ 然后关机,拔卡,剪碎,扔进垃圾桶。这次剪得更碎,碎到拼都拼不起来。 他转身,对陈曦说:“项目跑通了。” “哪个项目?” “当爹的项目。”他蹲下来,把脸贴在她肚子上,“Commit了,Push了,没有Rollback,也没有#06#。跑不通也得跑,跑死了也得跑。” 陈曦摸着他的头发,像摸一个大号的金龟子。她轻声说:“那就跑吧,慢慢跑,不着急。反正日子还长,没有存档点,但有的是时间。” 窗外,宿舍楼最后一盏灯也灭了。整座城市陷入黑暗,像一台终于关机的电脑。但很快,天会亮,灯会再开,学生会去上课,老头会摆棋盘,老周会突突突地开着三轮摩托去拉西瓜。 而林默,会坐在阳台的小马扎上,给绿萝浇水,给陈曦拍背,给未出生的女儿讲她爸当年如何用#06#重启人生,最后发现,人生根本不需要重启。 只需要继续。 ------------ 第十一章 深圳寄来的反渗透膜 林默收到快递那天,西安正在经历一场不合时宜的沙尘暴。黄沙从北方漫过来,把天空刷成土黄色,像老旧的CRT显示器失焦。快递小哥戴着防毒面具似的N95,把包裹塞他怀里就跑,好像多待一秒都要被西安的黄土活埋。 包裹很轻,轻得像里面什么都没装。发件人地址写着深圳南山,具体门号模糊,像被热敏纸褪了色。林默站在楼道里,用钥匙划开胶带,里面是个密封袋,再打开,是片白色的薄膜,卷成筒状,像加厚版的保鲜膜。 附了张便签,字迹熟悉得让他手指发麻: “这是当年星火计划里,VP让供应商换掉的国产反渗透膜。原装的是美国货,他吃了30%的回扣。数据我备份了,膜我留了一片。交不交给经侦,你定。——小张“ 小张。那个实习生。那个在Slack上给他发“林哥对不起“的小张。那个他离职时把半包苏打饼干留给他的小张。 林默盯着那片膜,像盯着一段被注释掉的代码。它轻飘飘的,但数据很重。重到能把一个VP送进去,能把星火计划翻案,能把周维的“2N赔偿“变成“恶意欺诈赔偿“,能把林默自己从“被优化的底包“抬成“吹哨人“,拿到一笔不菲的奖金。 奖金。他脑子里跑出个数字,大概能有多少?五十万?一百万?够把西安这套老房子装修成智能家居,够给孩子报双语幼儿园,够让陈曦三年不上班专心带娃。 够买回深圳那段人生吗? 他问了自己三遍。第三遍时,陈曦从卧室出来,扶着门框,脸色比外面的天还黄。她最近孕吐卷土重来,吃什么吐什么,连锅贴的油味都闻不得。林默把膜藏身后,像藏一个不能让孕妇受刺激的秘密。 “什么东西?”她还是看见了,眼睛尖得像Debug工具。 “反渗透膜。”林默没撒谎,他学会了不撒谎,因为撒谎需要回档来圆,而他们没有。 “做什么用的?” “净水器的。”他继续撒谎,但只撒一半,“老周要给他家猫装个自动饮水机。” 陈曦没追问,她扶着墙往洗手间挪,挪到一半又折回来,盯着他的眼睛:“深圳寄来的?” 林默心里咯噔一下,像被写入了一个无法回避的日志。他点头。 “小张?” 他继续点头。陈曦的记性比他好,尤其对这些细节,她像人肉Git,每条commit都存着,随时能blame。 “他想让你举报?” “让我定。”林默把膜放回密封袋,袋子在他手里沙沙响,像数据流在低语。 陈曦沉默了很久,久到林默以为她又要吐。但她只是转身进了洗手间,门没关严,传来马桶冲水声。她出来时,脸上湿淋淋的,不知是刚洗了脸,还是偷偷哭了。 “你定吧。”她说,“反正现在回不了档,选了就得认。” 她回了卧室,门轻轻关上,像一次轻柔的merge,没有冲突,没有覆盖,只是把自己合进了另一个分支。 林默站在原地,手里攥着那片膜,攥出了汗。他想起小张那张脸,刚毕业的小孩,眼睛里有光,笑起来露虎牙。他走那天,小张在Slack上道歉,说把复盘报告交了。林默没回,因为回了也没用,报告只是压垮骆驼的最后一根稻草,骆驼早就死了。 但现在小张寄来了稻草的DNA鉴定报告,让他决定要不要把骆驼的死因昭告天下。 他打开电脑,想查一下“反渗透膜“相关的法律条款。但浏览器刚打开,他就关了。查什么?诈骗罪?受贿罪?商业秘密?这些他在深圳时天天挂在嘴边的词,现在听起来像另一个世界的语言。 西安的语言是“猪脚汤““锅贴““秋裤““绿萝“。是楼下老头骂棋友“你赖皮“,是李芳唠叨“辐射“,是老周说“时辰到了自然甜“。 不是“回扣“,不是“30%“,不是“经侦“。 他把膜塞进抽屉,跟老周的西凤酒放在一块。酒在左,膜在右,中间是一叠B超单,最新的那张显示胎儿大小:23周+5天。头围、腹围、股骨长,一串数字,精确到毫米。 但数字后面没注释。没有“if error then rollback“,没有“try except“,没有“//TODO: 等待优化“。 只有一行小字:胎儿发育未见异常。 未见异常,就是最好的结果。 第二天老周来拿补丁,看见林默脸色不对,问是不是系统又崩了。林默摇头,把反渗透膜的事说了。老周听完,没说话,点了根烟,烟灰还是弹在地上。 “小张啊,”他念叨,“那个小伙子我记着,来过一次汽配城,帮你搬机箱。话不多,手上蛮有劲儿。” “嗯。” “他寄这个,是想让你救命,还是想让你报仇?” 林默愣住,他从没从这个角度想过。他一直以为小张是想“讨回公道“,但老周说得对,公道讨回来,小张能活吗?他还能回那个大厂,拿P6的offer,在48层熬夜,等着下一次被优化? 或者,他只是想找个人,帮他按下#06#? “他有病。”老周说,“你们这代人,都有病。总想着回到过去,修改点什么,好像改了就能活得好。但回去改完了,现在的你,还是你吗?” 他掐了烟,用脚碾了碾,像在关闭一个无响应的进程:“我那系统二十年没备份,不是我不想备,是那时候没人教。后来我想备了,硬盘满了,删都删不动。现在我不备了,因为师傅们记性比硬盘好,客户也比系统可靠。你懂我意思吗?” 林默懂了。老周的意思是,有些东西,备份了也没用。比如那片膜,比如那份数据,比如那段被优化的青春。备份了,只会让人总想恢复,总想对比,总想问“如果当年“。 而“如果当年“,是比#06#更毒的毒药。 老周走后,林默给那片膜拍了张照,发给小张,附了一句话: “我定不了了。你定吧。反正选了就得认。“ 消息发送时,他心跳得很快,像在push一段可能引发灾难的代码。但很快,小张回信了,回信内容不是文字,是一张图片。 图片里,小张站在深圳湾的春笋大厦前,手里举着一个纸箱,箱子里是一盆绿萝。他笑得露虎牙,眼睛里有光,但光后面是疲惫,是血丝,是熬了三个大夜后的呆滞。 图片附了一句话: “我辞职了。带走了一盆绿萝。林哥,我想去西安,跟你干。“ 林默盯着那张图,看了很久。他放大了看绿萝的叶子,没黄,没蔫,活得很好。和小张的脸形成鲜明对比。 他想起自己离职那天,也带走过一盆绿萝,也摔碎了。但小张选择了带走,选择了养,选择了让一段被优化的代码,在另一个地方继续跑。 没有回档,没有#06#,只是换了个环境,换了个人养。 林默把图片给陈曦看,她正在吐,吐得只剩酸水。她接过手机,看了一眼,忽然不吐了,眼睛亮起来。 “让他来。”她说,“咱家阳台还能再放一盆绿萝。” 林默没说话,他走到阳台,看着自己的那盆。金龟子又回来了,趴在叶子上,啃灰。它啃得很慢,很专注,像在修复一个十年前的Bug。 他给小张回消息,只回了一个字: “来。“ 然后他把那片反渗透膜从抽屉里拿出来,用剪刀剪碎,比剪SIM卡还碎。碎片扔进马桶,冲掉,水声轰隆,像一段数据被彻底删除,无法恢复,无法追溯,无法回档。 中午李芳回来,看见他站在马桶边发呆,骂了句“神经”,然后开始炖汤。今天炖的是鲫鱼汤,奶白色的,李芳说对孩子脑子好,喝了聪明,不会写那些没用的代码。 林默想,不写代码也行,卖凉皮也行,摆摊也行。只要活得像金龟子,像绿萝,像老周的桑塔纳,像楼下那盘没下完的棋。 不需要完美,只需要在。 他坐下喝汤,汤很鲜,有腥味,但腥味也是真的。陈曦也喝,喝了一碗,没吐。她摸着肚子,对里面说:“听见没,你爸学会做选择了,不比你笨。” 林默喝完汤,去洗碗。水龙头的水很凉,像深圳的暴雨,也像西安的春雨。他洗完碗,把碗摞好,擦干手,走到客厅。 陈曦在沙发上睡着了,书摊在肚子上,是《婴儿房布局v5.0》。李芳在阳台晾衣服,哼着秦腔,走调走得厉害。阳光从窗户斜斜地照进来,照在绿萝上,照在金龟子上,照在林默的手上。 他张开手,手心是空的,没有U盘,没有膜,没有#06#。 只有掌纹,三条主线,一条事业,一条爱情,一条生命。 都没有回档。 他握拳,把空气攥在手心,像攥着一个没有注释的明日。他走回卧室,从床头柜里拿出那张B超单,最新那张,23周+5天。 他把它贴在显示器旁边,和绿萝并排。然后坐下,开机,打开IDE,开始学电子签名。 代码一行一行地写,没有try,没有except,没有rollback。 只有commit,只有push,只有live。 ------------ 第十二章 最后一行未注释的代码 小张到西安那天,雾霾重得能拧出水。他拖着一个28寸的行李箱,箱子上贴着深圳机场的安检标签,手里抱着那盆绿萝,叶子在灰扑扑的空气里蔫得像刚被优化的P7。林默在火车站接他,隔着出站口的人潮,一眼就看见那盆绿——它太显眼了,绿得太用力,像一段拼命证明自己还活着的代码。 “林哥。”小张喊他,声音被西安的风沙撕得稀碎。 林默没应,他盯着小张的脸。三个月不见,这孩子老了五岁。眼袋垂到颧骨,发际线往后退了一厘米,嘴角有两条法令纹的雏形——那是连续熬夜的面相,是48层写字楼养出来的蛊。唯独那双眼睛,还是亮的,像格式化后的硬盘,空空荡荡,但干净。 “来了?”林默接过箱子,沉得像装了一整块服务器主板。 “来了。”小张把绿萝递给他,“活得挺好,我没让它黄。” 林默接过花盆,手指碰到小张的手背,凉得像刚从机房出来。他想起自己离开深圳时,工位上的绿萝也是这个温度。原来它们都怕冷,怕没人浇水,怕被遗忘在角落。 出租车上,小张不说话,盯着窗外。西安的城墙在雾霾里若隐若现,像一段被注释掉的历史。他忽然开口:“林哥,你说这城墙,要是能回档到明朝,是不是就能挡住现在的雾霾?” 林默心里咯噔一下,像被钩子勾住了旧伤。他答:“挡得住外敌,挡不住内卷。” 小张笑了,露虎牙,但笑声是空的,像debug时打印出的null。 到家属院楼下,李芳正在跟收废品的老头讨价还价,卖一堆旧报纸。她瞥见小张,眼睛眯成一条缝:“哟,又来一个?” “妈,这是小张,我以前的同事。”林默介绍。 李芳上下打量,像验收一段外包代码:“眼神活泛,不像你,死气沉沉。住几天?” 小张愣住,他没想过要住几天。他以为来了就能干活,就能像在深圳那样,找个合租屋,昼夜颠倒地写代码,把命卖给下一个星火计划。 “住下吧。”陈曦在楼道口喊,她肚子已经显形,像揣着一个待发布的版本,“阳台还能再放一盆绿萝。” 她说话的时候,手撑着腰,腿微微叉开,是孕妇专用的站姿。小张看见她,眼睛里的光暗了暗,像看到了自己错过的某种可能性。他低声对林默说:“嫂子……看起来挺辛苦。” “不辛苦,”林默把行李箱往上提,“就是不能回档。” 小张的肩膀抖了一下,像被编译器警告吓到的萌新。 当晚,李芳做了一桌子菜,说是给深圳来的客人接风。小张吃得拘谨,筷子只敢夹眼前的土豆丝。陈曦看不下去,夹了块排骨放他碗里:“吃,吃饱了才有力气写代码。” 小张道谢,咬了一口,忽然不动了。他盯着那块排骨,像在盯着一段无法复现的Bug。过了很久,他才说:“我来之前,周维找过我。” 饭桌上安静了。林默停下筷子,陈曦没停,继续喝汤,但勺子磕在碗沿上,发出清脆的“叮”。 “他说VP的事,证据还不够。”小张说得慢,像在背需求文档,“反渗透膜只是物证,需要人证。他问我愿不愿意回去作证,指认VP当年怎么暗示供应商换膜,怎么吃回扣,怎么把锅甩给你。” 他抬起头,看林默:“我说我不知道。我什么都没听见,什么都没看见。我只是个实习生,我的工牌只能刷开公司的门,刷不开他们的嘴。” 林默没说话,他夹了根青菜,慢慢嚼。菜是陈曦用醋蒜拌的,酸,涩,回甘。他嚼完了,才说:“你做得对。” “对?”小张苦笑,“林哥,你也觉得我怂?” “不是怂,是活明白了。”林默放下筷子,正视他,“作证能怎样?VP进去了,公司赔你钱,你拿着钱再找个996的坑,再被优化一次?有意义吗?” 他顿了顿,补上一句:“你得先学会,怎么在没有#06#的世界里,承认自己会输,还敢继续下。” 小张没听懂,但陈曦听懂了。她喝汤的动作停了,勺子悬在半空,像被按了暂停键。她抬眼看林默,眼神里有种“你终于会说人话了”的欣慰。 吃完饭,小张主动洗碗。他洗得很慢,很仔细,像在修复一段遗留代码。李芳在旁边监工,时不时说一句“那盘子边儿没洗干净”“节水,别哗哗流”。小张都照做,不顶嘴,不解释,像个人肉CI/CD,接受所有Lint规则。 林默在阳台抽烟,陈曦跟出来,扶着栏杆看楼下。雨夹雪变成了纯雪,交大南门的梧桐树裹了层白,像戴了假发的程序员。 “小张不对劲。”陈曦说,手捂在肚子上,那里刚刚被踢了一脚。 “怎么不对劲?” “他行李箱里,除了衣服,全是药。”陈曦的声音压得很低,“我帮他放箱子的时候看见了,安眠药,抗抑郁的,还有一瓶没标签的,不知道是什么。” 林默的烟灰掉在绿萝叶子上,烫出一个焦黄的点。他没擦,那个点像一行没处理的error log,刺眼,但暂时不致命。 “他可能……还在循环里。”陈曦小声说,“不是#06#那种循环,是心理的。他走不出来,觉得深圳的一切都是自己的错。” 林默没说话。他知道那种循环,比代码里的死循环更可怕。死循环可以kill -9,心理的循环只能自己退出来,或者永远卡死。 晚上十点,小张睡了,在李芳收拾出来的小房间里,鼾声很重,像服务器过载的风扇。林默没睡,他坐在客厅,开着电脑,但没写代码。他在看那张B超单,23周+5天,现在已经24周+3天。数字在涨,像在svn commit,每一天都是新版本。 陈曦的肚子又动了,她抓住林默的手按上去,这次踢得很用力,像有个小脚丫在里面发脾气。 “她在抗议。”陈曦笑,“抗议你今晚没给她讲故事。” 林默愣住:“讲故事?” “育儿书上说的,爸爸的声音能让胎儿有安全感。”陈曦把一本旧书塞他手里,“你读,我听着。” 书是李芳淘来的,《睡前故事大全》,纸黄得发脆。林默翻开第一页,是《龟兔赛跑》。他读了一句“从前有只兔子”,就读不下去了。他想起自己就是那只兔子,在深圳跑得快,跑得急,跑着跑着就死了。 他换了个故事,是《愚公移山》。读得很慢,一字一顿,像在念需求文档。陈曦听着听着就睡着了,手还放在肚子上,像守护着一个不能回滚的版本。 林默读到“子子孙孙无穷匮也”,忽然停了。他想起小张,想起老周,想起周维,想起VP,想起所有在深圳跑过的人。他们都在移山,但山不是代码,是命。移不动,就得死。 他轻轻合上书,去小房间看小张。小张没盖被子,蜷缩着,像被异常捕获的线程。床头柜上摆着那瓶没标签的药,林默拿起来,借着月光看,瓶身是白色的,没有任何标识,像一段被混淆过的代码。 他拧开瓶盖,里面是白色的粉末。他倒了一点在手心,闻了闻,无味。他用舌尖舔了一下,苦,极苦,像报错信息的味道。 不是安眠药,不是抗抑郁药。是别的。 他放回去,没问,没惊动小张。他回到客厅,打开电脑,开始搜索“白色粉末 无味 极苦“。搜索结果跳出来的那一刻,他后背的汗毛全竖了起来。 那是一种植物碱,提取自某种绿萝的变种,微量可致幻,致幻效果极度真实——真实到让人以为自己回到了过去,修改了某个决策,然后“醒来“时,以为那是现实。 林默想起小张说的“循环“,想起他每天凌晨三点到四点的心率归零,想起他那句“我把绿萝养得很好“。 那不是比喻。那不是心理作用。 那是真的。小张在给自己下毒,用绿萝的毒,制造#06#的幻觉。 林默冲进小房间,摇醒小张。小张睁开眼,眼神涣散,像刚从某个存档点回来。 “你吃了多久?”林默吼,声音大得能把整栋楼的声控灯都震亮。 小张愣了几秒,笑了,笑得眼泪出来:“林哥,你发现了啊。” “多久?!” “从你走后。”小张说得轻松,“VP让我交复盘报告,我交了,但交之前,我听了你的话。” “我的话?” “你说,有些错误,不是代码的错,是人的错。人的错,代码修不了。”小张坐起来,眼神清明了些,“所以我没交真的报告,我交了一份假的,数据改过的,能把锅全甩你头上的那份。” 林默僵住,像被注入了死循环。 “VP很满意,给我提前转正,还给我加了薪。”小张继续说,“但我每晚都梦见你,梦见你站在48层,抱着绿萝,问我为什么。我回答不上来,我就按#06#,我想重来,想改报告,想救你。” 他指了指那瓶药:“这是我在网上买的,卖家说能‘回溯记忆’。我试了,真的管用。我每晚都吃,每晚都回到交报告那天,改数据,改决策,改来改去,发现改不动你离职的结局。” 他哭起来,像个跑不通代码的孩子:“林哥,我救不了你,我只能救我自己。所以我辞职了,把真的报告备份了,把绿萝带来了。我想在西安,重新开始,没有VP,没有星火,没有#06#。” 林默听着,手在抖。他不是因为愤怒,是因为恐惧。他恐惧的不是小张的下毒,是恐惧自己也差点走上这条路——如果陈曦没拦着,如果他没把那片反渗透膜烧掉,如果他还在深圳,他会不会也靠药物制造回档? 人会疯的。当技术解决不了问题,当#06#失效,当现实太痛,人就会自己造一个#06#。 他抱住小张,像抱住一年前的自己。 “你救了我。”他说,声音嘶哑,“你交的假报告,让我彻底死心,让我知道那地方不值得。你救了我,小张,你才是我的#06#。” 小张愣住,哭声停了。 林默松开他,把那瓶药拿起来,拧开瓶盖,倒进马桶。小张没拦,他看着白色的粉末被水冲走,像看着自己的循环被终结。 “以后别吃了。”林默说,“实在想重来,就熬着。熬到第二天,就是新的存档点。” 小张点头,点头的时候,眼泪又掉。但这次是清的,不是浊的。 陈曦站在门口,扶着门框,肚子挺着,像个巨大的感叹号。她看着这一幕,没说话,只是默默转身,去厨房热了猪脚汤。 她把汤端给小张,说:“喝,喝了就不做梦了。” 小张捧着碗,喝得很慢,每一口都像在提交一个commit。喝完,他说:“嫂子,对不起。” 陈曦笑了,笑得眼睛弯成月牙:“对不起什么?对不起你差点害了我们?还是对不起你差点害了自己?” 她坐下来,摸着自己的肚子,声音轻得像在说一个秘密:“这孩子,昨天在肚子里打嗝,打了十分钟。我吓坏了,以为他缺氧,要去医院。但后来不打了,安静了,像在说‘妈,我没事,就是练练肺活量’。” 她抬眼看小张,也看林默:“从那一刻起,我就知道,没有存档点的孩子,比谁都坚强。因为他知道,哭出来了,就不能收回去。踢疼了妈,就得自己受着。这才是人,这才是活。” 林默走过去,抱住她,也抱住她肚子里的孩子。他感到孩子在动,一下,两下,三下,像在用摩斯电码打一句话: “我是新的存档点,但我不会回档。“ 窗外,沙尘暴停了。月亮出来,照在绿萝上,照在金龟子上,照在小张的泪痕上。 老周半夜打电话来,说系统没事,但他老伴的老寒腿犯了,疼得睡不着。他问林默,你那瓶西凤酒还有吗?林默说,早扔了。 老周笑,说扔了好,扔了就睡踏实了。 电话挂断,林默站在阳台,看着对面交大的宿舍楼。最后一盏灯灭了,但很快,天会亮,学生会去上课,老头会摆棋盘,老周会突突突地开着三轮摩托去拉西瓜。 而他,会坐在小马扎上,给绿萝浇水,给陈曦拍背,给未出生的女儿讲故事。 故事的名字叫《今天没有存档点》。 ------------ 第十三章 产房的门不支持断点调试 小张在西安落下的第一个病根,是吃凉皮不加蒜。他说深圳待了三年,胃早被996熬成了钢化玻璃,碰不得刺激。李芳听了直翻白眼,说那你吃白吉馍总得就蒜吧?小张摇头,说馍太瓷实,怕消化不动。李芳当场摔了筷子,骂林默:“你招来的这什么少爷?蒜都不能吃,还能吃啥苦?” 林默没接茬,他正给陈曦捏小腿。她六个月了,肿得厉害,脚踝粗得像老周的桑塔纳轮胎,一按一个坑,半天不回弹。小张在旁边看着,小声说:“林哥,嫂子这……要不要去医院查查?我姐当时也肿,结果是妊娠高血压。” “查了。”林默手里没停,“医生说没事,就是孩子压的。让多泡脚,多捏腿,多躺着。” “那你还让她躺着改方案?”小张指了指卧室,陈曦正窝在被子里,电脑放肚子上,跟甲方视频。她的声音从门缝里钻出来:“这个Logo的年轻化,不是把字体调圆,是把态度调软……” 林默苦笑:“她不工作,会疯。” 小张不说话了,他明白那种疯。在深圳,他也是靠工作续命,靠需求文档填满时间,靠代码逃避现实。现在到了西安,没需求了,没代码了,他反而不知道怎么活了。他白天帮老周跑物流,晚上回来就看林默写程序,看着看着就睡着,梦里全是深圳48层的玻璃反光。 他带来的那盆绿萝,种在阳台的旧脸盆里,活得比在汽配城时还旺。李芳说那是“认了新主”,小张说是因为西安的土好,没深圳那么“卷”。 土不卷,但人卷。陈曦的甲方越来越变态,要求“在婴儿出生后三日内提交最终方案”,理由是“要蹭母婴市场的热度”。陈曦气得摔鼠标,骂:“我孩子哪天出来,还得先给方案让路?” 林默把鼠标捡起来,说:“要不咱不干了?反正老周那边活儿够。” “不干?”陈曦瞪他,“不干你养我?靠老周那三千块?” “三千块够吃凉皮。” “不够吃奶粉。”她摸着肚子,像摸一个无底的内存泄漏,“进口奶粉一罐四百,一个月四罐,一千六。纸尿裤一包一百五,一个月六包,九百。还有疫苗、体检、衣服、玩具……三千块够干啥?够你抽一个月的白沙烟?” 林默不吭声了,他算不过她。陈曦的Excel虽然很久没更新了,但数据还在脑子里跑着,随时能调出一张成本分析表,精确到小数点后两位,还能附上图表和趋势线。 他得挣钱。不光挣,还得挣得稳,挣得有可持续性,挣得没有#06#也能覆盖所有风险。 于是他开始接私活,不止老周的,还有老周介绍的汽配城商户,商户介绍的开发区小公司,小公司介绍的高校实验室。活儿越接越多,价格越压越低,低到陈曦都看不下去,说:“你这还不如回深圳卖命。” “卖命有回档,卖力气没有。”林默边敲代码边回,“我现在只卖力气,不卖命。” 小张在旁边听着,忽然说:“林哥,你那套电子签名的代码,能教我吗?我也想接活儿。” 林默停下键盘,转头看他。小张瘦了,西安的凉皮养不活他深圳的胃口,他吃得少,干得猛,老周都怕他累死在三轮摩托上。林默问过他,为什么要这么拼。小张说,怕闲下来,怕一闲就想起#06#,想起那片没寄出的反渗透膜,想起自己吃的那些药。 药停了,但瘾还在。那种随时可以逃回过去的瘾。 “教不了。”林默说,“电子签名需要学密码学,你数学不行。” 小张眼神暗了暗,像被拒绝了PR的 contributor。林默补了一句:“但你可以学别的。学做凉皮,学给绿萝浇水,学在沙尘暴天骑三轮不迷路。这些比代码难,也更有用。” 小张没听懂,但陈曦听懂了。她靠在卧室门框上,捧着肚子,像捧着一个即将上线的SaaS平台。她说:“小张,你知道你林哥为什么不敢教你吗?他怕把你教成下一个他。” “下一个他不好吗?”小张下意识反问。 “不好。”陈曦说得干脆,“下一个他,还会想着#06#,还会想着回深圳,还会想着那片反渗透膜能不能换一套房。但你,”她盯着小张的眼睛,“你不需要房,你需要把日子过下去,过到绿萝比你活得久,过到老周的三轮摩托报废,过到楼下老头下棋不再赖皮。” 小张张了张嘴,像想反驳,但找不到论点。他习惯了用代码逻辑思考,但陈曦这套逻辑没有if else,只有一句硬邦邦的while True: live()。无限循环,没有break。 林默继续敲代码,但手指有点抖。他想起自己教陈曦写代码那年,她刚转行做运营,想学SQL。他教了三遍,她还是把join写成jion,气得他摔键盘。她没哭,只是默默捡起来,用修正液把键盘上的字母O涂白,在旁边写了个小纸条:“这个不是零,是O”。 后来她再也没写错过。 他现在也在用同样的方法教自己:把#06#涂白,在旁边写上“今天的错误今天扛“。 晚上十点,老周打电话来,说有个急件要送,去咸阳机场,运费给两百加急费。小张在客厅打地铺,听见电话就爬起来,说我去。林默拦他,说别折腾了,沙尘暴天,路上危险。小张说,我不去才危险,闲着会疯。 他穿上外套就出门了,林默没拦。他知道拦不住,就像当年谁也拦不住他去深圳。 陈曦从卧室出来,看着被小张带上的门,忽然说:“他还会回来的。” “送个快递而已。” “不是。”她摸着肚子,那里刚刚被踢了一脚,狠的,“他会回来,但不会再走了。西安这地方,黏人。” 林默没说话,他走到阳台,看楼下。小张的身影在雪亮的防尘灯下越来越小,最后变成一个小黑点,消失在巷子口。那盆绿萝在风里晃了晃,像告别,也像迎接。 陈曦靠在他背上,肚子顶得他往前倾。她说:“我明天想去医院,做个全面检查。” “怎么了?” “没怎么,就是觉得……该打包上线了,得测一下性能。”她自嘲地笑,“产品经理当久了,说话都这味儿。” 林默心里一沉,像被push了一段有冲突的代码。他转身,抱住她,手放在她肚子上。孩子很安静,没踢,像在准备一次大的release。 “去吧,”他说,“我陪你去。” “不用,让小张陪我去。”陈曦说得轻松,“你在家改代码,老周那个电子签名,客户明晚就要。” 林默没坚持,他知道陈曦的用意。她想给小张找点事做,让他觉得自己有用,让他跟这个新世界建立连接,而不是总活在过去的循环里。 第二天一早,小张果然陪陈曦去了医院。林默在家写代码,写得昏天黑地,连水都忘了喝。中午李芳回来,拎了条活鱼,说要给陈曦炖汤。她问林默:“检查得咋样?” 林默一愣,才想起他们该回来了。他打电话,陈曦没接。打给小张,也没人接。他心里咯噔一下,像被注入了异常。 他冲到楼下,骑上自行车就往医院蹬。西安的沙尘暴停了,但路上全是泥,蹬得轮子打滑。他心里跑着一个循环:if phone_not_answered: panic()。没有except,没有finally,只有panic。 医院人很多,发热门诊排着长队,都是沙尘暴引起的呼吸道感染。他挤进产科,护士说陈曦在B超室。他冲进去,看见小张站在门口,脸白得像纸。 “怎么了?”林默抓住他胳膊,力气大得能捏碎骨头。 小张张了张嘴,没发出声,只是指了指门。门开了,陈曦扶着墙走出来,手里拿着一张新的B超单。她脸色正常,甚至有点红晕。 “你跑啥?”她问林默,“尿检尿不出来,憋了半天。” 林默愣在原地,像被刷新了缓存。他接过B超单,上面一行小字:羊水指数正常,胎儿心跳正常,胎盘位置正常。一切未见异常。 未见异常,就是最好的结果。 他腿一软,差点坐地上。陈曦踢他一脚,说:“出息。走,吃凉皮去,我饿了。” 小张跟在后面,脚步虚浮,像刚刚经历了一次生产部署,心惊胆战,但最终上线了。 他们坐在回民街最破的一个摊子上,老板是个老头,不用普通话,只说西安话。陈曦点了两份凉皮,多醋多辣子,还加了两根烤肠。小张也点了一份,但没加蒜。 凉皮端上来,陈曦吃得狼吞虎咽,像饿了三天。吃到一半,她忽然停了,摸着肚子说:“他动了。” “谁动了?”小张懵。 “孩子。”她说,“他也在吃,吃得很香。” 林默笑了,笑得眼泪出来。他夹起自己碗里的烤肠,放她碗里,说:“多吃点,吃饱了才有力气跑通明天。” 小张看着他们,手里的筷子悬在半空,像被按了断点的代码。过了很久,他才低下头,默默咬了一口凉皮,没加蒜,但吃得津津有味。 那一刻,林默知道,他回来了。 不是从深圳回来,是从那个有#06#的世界里,回来了。 ------------ 第十四章 产房的门是单向的 小张真正在西安扎下根,是半个月后的事了。那天老周的三轮摩托在二环上被交警扣了,理由是“排放超标,影响市容“。老周蹲在汽配城门口,一根接一根地抽白沙,烟灰落在新规宣传单上,把“环保“两个字烫穿了。小张一句话没说,骑上林默那辆吱呀作响的自行车,蹬了十公里去交警大队,磨了三个小时嘴皮子,最后交了三百罚款,把摩托领了回来。 回来路上风大,吹得他眼睛通红。老周拍着摩托坐垫说:“你小子,能处。“ 小张没笑,他只是摸了摸车把,像摸一个刚被保释的战友。那天晚上他主动加了蒜,吃了三碗凉皮,辣得满脸汗,对李芳说:“阿姨,这蒜真香。“ 李芳愣了愣,转头对林默说:“这孩子,终于活过来了。“ 活过来的标志很简单:他开始接受无法回滚的错误,比如被交警罚,比如蒜辣得胃痛,比如骑车蹬得大腿抽筋。这些错误在深圳是要被记进KPI的,在西安,它们只是日子的一部分,疼完就忘了,忘了就继续。 陈曦的反应却越来越剧烈。七个半月时,她的脚肿得穿不上鞋,只能趿拉着林默的拖鞋在地上蹭。她开始失眠,整夜整夜地翻身,像在执行一个找不到终止条件的while循环。李芳让她数羊,她数着数着就开始数需求文档的页数,数着数着就哭,说:“妈,我好想回深圳。“ 李芳骂她:“回去干啥?回去让那破公司再优化你一回?“ “不是。“陈曦哭得更凶,“我回去是想告诉自己,别回去了。“ 这话说得拗口,但林默听懂了。她是想站在深圳湾的48层,亲眼看一眼那个抱着纸箱的自己,然后对自己说:“你看,你活下来了,没回档也活下来了。“ 林默没让她去。他给她买了张深圳地铁的月卡,过期的那种,五块钱一张,当废品买的。陈曦把卡贴在床头,每天醒来摸一摸,像摸一个不能用的存档点。 八个月整那天,老周接了个大单——给交大校庆送一百个花篮,从咸阳的花圃拉,运费给两千,但要求凌晨四点送到,不能早不能晚,早了校门没开,晚了校领导要骂人。 小张主动请缨,说西安的路他熟了,闭着眼都能骑三轮。老周不放心,跟林默说:“你陪他去,就当产前锻炼。“ 凌晨两点,林默和小张骑着三轮摩托,突突突地穿梭在空无一人的西安街头。风很凉,像数据中心里的冷气,但没那么刺骨。小张把花篮用绳子绑得结结实实,说:“林哥,你怕吗?“ “怕什么?“ “怕送不到,怕送晚了,怕花蔫了,怕领导骂。“小张说得认真,像在列举一个测试用例的所有边界条件。 “怕有什么用?“林默扶着花篮,手指被麻绳勒得发白,“怕就能回档再跑一次?“ 小张没接话,过了很久,他说:“林哥,我停药之后,开始做新梦了。“ “什么梦?“ “梦见我没去深圳,留在西安,跟我爸学修自行车。梦见我娶了个本地姑娘,生了两个孩子,每天下班喝冰峰,周末去骊山遛娃。“小张的声音混在风里,听不真切,“梦见我老了,蹲在汽配城门口,跟老周一样,抽白沙,弹烟灰,看年轻人蹬三轮。“ 林默笑了:“这梦挺好的,比#06#真实。“ “是挺好,但醒来的时候,我特别难受。“小张顿了顿,“因为梦里没有代码,没有GitHub,没有48层的风景。我觉得我亏了,白活了。“ “那你觉得我现在亏吗?”林默问他,“白读了985,白干了七年,白写了那么多代码,最后回来蹬三轮、修老周的DOS系统?” 小张想了想,摇头:“你不亏。你有个嫂子,有盆绿萝,有个没出生的闺女,你还有老周的酒。你有……”他搜肠刮肚,“你有生活的error log,虽然报错,但系统还活着。” “活着就行。”林默拍拍他肩膀,像拍一段终于跑通的代码,“报错不可怕,可怕的是不跑了。” 三轮在校门口停下时,正好四点整。保安打着哈欠开门,看见一百个花篮,愣了:“这么多?不是说五十个吗?” 老周的电话打不通,林默只能硬着头皮卸货。小张爬上车,把花篮往下递,林默接了往地上摆。摆到第三十个时,他手机响了,是陈曦。 接起来,没声音,只有急促的呼吸,像拉警报。 “怎么了?”林默的心率瞬间飙到120。 “破水了。”陈曦的声音在抖,像快断线的网络请求,“我妈叫救护车了,你……你快点回来。” 电话断了。不是挂断,是信号丢失,像服务器突然宕机。 林默僵在原地,手里还抱着个花篮,花篮里的玫瑰被风吹得晃,像一堆红色的报错信息。小张跳下车,抢过花篮扔地上,吼:“走啊!愣着干啥!” 两人把三轮扔校门口,保安在后面追骂,他们听不见了。林默骑车往家蹬,腿软得像装满了空指针,蹬几下就跪在地上。小张把他拽起来,自己骑上三轮,说:“你坐后面,我拉你!” 凌晨四点二十,西安的街道空无一人。三轮摩托的突突声撕破寂静,像往日志文件里疯狂输出error。林默坐在车斗里,风把眼泪吹出来,他脑子里只有一个循环: if wife_not_ok: panic() if baby_not_ok: panic() if i_not_there: panic() 没有else,没有except,只有panic。 到家时救护车刚到,李芳扶着陈曦往外挪,陈曦的睡裤湿透了,滴滴答答往下淌。她看见林默,第一句话是:“你跑哪去了?花呢?” “扔了。”林默扶住她,手在抖,“不要花了,要你。” 陈曦打他,拳头软得像棉花:“你个废物,连花都护不住……”话没说完,她整个人往下坠,宫缩来了。 救护车司机是个胖大叔,见多了这场面,吼:“别磨蹭!上车!” 小张冲过来,把陈曦抱起来,抱得稳得像抱着一个不能宕机的生产数据库。林默跟在后面,腿软得爬不上车,是小张拽了他一把。 车门关上,警笛响起。林默握着陈曦的手,她的手冰凉,全是冷汗。他想起在深圳时,她发烧到39度,他也是这样握着,送她去医院。那时候他有车,有医保,有存款,有#06#做最后的保险。 现在他只有一辆被扔在校门口的三轮摩托,和一片没能送出去的反渗透膜。 “别怕。”他对陈曦说,声音抖得不像自己的,“咱不要回档,咱直接上线。” 陈曦疼得说不出话,只是掐他手心,指甲陷进肉里,像要把所有痛苦都转移给他。林默没躲,他承接了,像承接一段没有异常处理的代码,跑崩了也得硬扛。 到医院,产科大夫是个年轻姑娘,戴口罩,只露一双眼睛,冷静得像台服务器。她检查完,说:“开三指了,进产房。” 产房的门是单向的,只进不出,不支持断点调试。林默被拦在外面,护士说:“家属等着,有事会叫。” 门关上,红色“手术中“的灯亮起,像Linux终端的提示符,等待输入,但林默输入不了任何东西。他只能等,等一个return,等一个callback,等一个无法预知的result。 小张去买水,买吃的,买所有能买的东西。林默坐在长椅上,手里攥着那片反渗透膜的快递袋,攥得手心出汗,把快递单上的字迹洇开了。他看着单子上模糊的发件地址,忽然想起小张在火车上说的梦——梦见他没去深圳,留在西安修自行车。 那个梦不是假的。那个梦是另一个版本的人生,是没被注释掉的代码,是真实存在的平行宇宙。在那个宇宙里,小张没有这瓶药,没有这片膜,没有#06#。 在这个宇宙里,林默有。 他掏出手机,在记事本里敲下一行字: “if baby_alive: commit() else: panic_and_continue()“ 然后他点了保存,文件名是“today_no_rollback.md“。 产房里传来陈曦的叫声,撕心裂肺,像一段跑不通的代码在嘶吼。李芳坐在旁边,手里攥着一串佛珠,嘴里念念有词。小张回来,递上一瓶冰峰,林默没接,他说:“等结果。“ “什么结果?“ “编译结果。“林默盯着产房门,“看是pass,还是fail。“ 小张愣了愣,然后笑了,笑得眼泪出来:“林哥,你魔怔了。生孩子不是跑测试,没有pass fail,只有live die。“ “那就live。“林默说得咬牙切齿,像在对编译器下死命令,“必须live。“ 时间变得粘稠,像老周的西凤酒。林默分不清过了多久,十分钟,还是十小时。他只知道手机没电了,反渗透膜的快递单被攥成了纸浆,小张的冰峰喝完了,李芳的佛珠断了线,珠子滚了一地。 然后,门开了。 护士抱出个襁褓,说:“六斤四两,女孩。产妇出血有点多,但稳住了。“ 林默没先看孩子,他问:“陈曦呢?“ “观察室,醒了就能出来。“护士把孩子塞他怀里,“先抱抱你闺女,她等着验收呢。“ 那团小东西皱巴巴的,红通通的,像刚从GitLab里clone下来的初始项目,什么都没有,但充满希望。她闭着眼睛,睫毛湿哒哒的,小嘴无意识地咂动,像在找奶,也像在找代码里的第一行注释。 林默抱她,手抖得像第一次push到master分支。他低头,在她额头亲了一下,亲得小心翼翼,怕把她亲崩了。 “你好。“他小声说,“我是你爸,一个没有回档功能的程序员。“ 小东西没理他,她只是哭,哭得理直气壮,哭得毫不讲理。那哭声是新的,是原始的,是未经任何框架封装的生命本身。 林默想起#06#,想起那片反渗透膜,想起小张的循环,想起陈曦的Excel表,想起老周的老寒腿,想起李芳的佛珠,想起楼下那盘没下完的棋。 所有这些,都是为了这一声哭。 产房门又开了,陈曦被推出来,脸色白得像纸,但眼睛是亮的。她看着林默,又看着他怀里的孩子,张了张嘴,没发出声。 林默走过去,蹲在她床边,把孩子的小脸凑过去。她亲了一下,亲得用尽全身力气。 “长得像你。“她气若游丝,“丑。“ 林默笑了,笑得眼泪掉在孩子脸上,孩子哭得更凶。 李芳在旁边抹泪,说:“哭声响,好养活。” 小张站在角落,也抹泪,说:“上线了,没宕机。” 护士催:“让让,产妇要回病房。” 林默抱着孩子让开,忽然想起什么,问小张:“三轮摩托呢?” “还在校门口。”小张擦擦鼻子,“保安说要拖走。” “那就让它拖。”林默说,“咱有新座驾了。” 他举起怀里的闺女,像举起一个新项目,一个新版本,一个没有#06#,没有注释,也没有TODO的人生。 项目名称:小绿萝。 版本号:1.0.0。 发布状态:已上线,不可回滚。 ------------ 第十五章 小绿萝的第一声笑 小绿萝满月那天,西安下了一场夹带着槐花雨的春风。米粒大的白色花瓣落在阳台的绿萝上,金龟子趴在叶脉间啃食,像在给新生儿试吃辅食。李芳坚持要办满月酒,说孩子第一声笑必须在人堆里笑,笑给神明听,笑给祖先听,笑给楼下那个总骂“年轻人不生孩子“的居委会大妈听。 酒摆在楼下麻将馆,借了四张桌子,铺着李芳珍藏的塑料红毯,上面印着“囍“字,是九十年代她结婚时用的。来客七人:老周、小张、楼下三个下棋老头、收废品的老头、还有交大的退休教授——老周的棋友,顺道送了本《儿童心理学》当贺礼,书是盗版,错别字多得像没跑通的测试用例。 小绿萝被抱出来时,正闭着眼睡觉,脸蛋被红包裹得只剩个鼻子。老周凑过去看,假牙差点掉出来:“丑,真丑,像没画完的UML图。“ 陈曦刚出月子,脸还肿着,听了这话要撕他,被林默按住。他今天没抱孩子,一直抱着个纸箱,箱子用胶带封死,上面没写字。老周眼尖,问:“啥东西?还舍不得撒手?“ “深圳寄来的。“林默说得平淡,像在报一个废弃项目的依赖包,“小张的辞职补偿,还有公司托他转交的'奖杯'。“ 他把箱子放桌上,撕开胶带。里面没有奖杯,只有一盆绿萝,和当初摔碎的那盆一模一样,连塑料盆上的裂纹都复刻了。附了张卡片,是周维的字迹: “送给小绿萝。愿她的人生,不需要重启。“ 林默盯着那盆绿萝,手指悬在叶子上方,像悬在一个危险的API接口上。他没浇水,没说话,只是把卡片翻过来,背面是周维的另一句话: “VP判了八年,反渗透膜的事,我坐了三年。这是你欠我的。“ 不是“功劳“,不是“正义“,是“欠“。林默读了三遍,读出三种不同的编译错误:语法错、逻辑错、还是人心错? 陈曦凑过来看了一眼,冷笑出声:“他坐牢,是因为他自己也吃了回扣,别赖你。“她说得斩钉截铁,像在code review时指着一个明显的bug,“这盆绿萝,是物证,不是礼物。“ 她伸手要去砸,被林默拦住。他把绿萝抱起来,走到阳台,和自己的那盆并排放下。两盆绿萝,一盆是西安的土养的,一盆是深圳的水浇的,叶子挨在一起,像两个版本的代码在merge,没有冲突,只有共生。 “留着吧。“他轻声说,“给小绿萝当教材,告诉她什么是错误决策,什么是沉没成本,什么是不能回档的人生。“ 陈曦没再坚持,她转身去招呼客人,抱着孩子给老周看。老周不敢接,说手糙,怕划伤孩子嫩脸。陈曦硬塞给他,说:“你得抱,你抱了,她以后学编程不秃头。“ 老周笨拙地抱着,像抱着一个刚上线的生产环境,一动不敢动。小绿萝忽然睁眼了,黑眼珠滴溜溜转,盯着老周看了三秒,然后——笑了。 不是无意识的咧嘴,是笑了。嘴角上扬,眼睛弯成月牙,发出“咯“的一声,像调试成功的提示音。 满桌人都愣了。退休教授说:“这叫社会性微笑,说明她大脑发育得好。“ 老周说:“这叫识货,知道谁是大腿。“ 李芳说:“这叫神仙显灵,得给送子观音烧炷香。“ 林默没说话,他只是拿出手机,拍下了这一幕。照片里,老周的皱纹、小绿萝的嫩脸、绿萝的叶子、还有背景里模糊的“囍“字红毯,全都在焦内,没有虚化。保存,命名:Xiaolvluo_first_**ile_v1.0_no_rollback.jpg。 他盯着照片,忽然想起自己第一次跑通代码时的感觉——不是兴奋,是后怕。怕它下次跑不通,怕它隐藏了bug,怕它依赖的环境明天就崩。 但小绿萝的笑没有依赖,没有环境,没有版本控制。它就是笑,笑了就笑了,收不回去,也优化不了。 满月酒吃到一半,小张忽然站起来,说要敬大家一杯。他端起冰峰,像端一杯救命药水,声音发颤:“我……我到今天,才觉得活过来了。“ 没人笑他矫情。老周拍拍他肩膀,像拍一个新入职的司机:“活过来就好。活过来,才能给人当爹当妈当孙子。“ 他这话是冲小绿萝说的,但眼睛看着小张。小张点头,一口气灌了半瓶,呛得眼泪出来。他咳嗽着,对林默说:“林哥,我明天想去交大学学修电脑。不图挣钱,就图个手艺,能养活自己,也能……也能养盆绿萝。“ 林默说好,说完觉得不够,又补了一句:“别想回档的事,学废了,就学凉皮。“ 小张笑了,这次笑得实心实意,像一段终于跑通的代码,没有warning,没有error,只有干净的output。 酒散得早,小绿萝被抱回屋,陈曦累瘫在床上,纳头就睡。林默收拾残局,把“囍“字红毯卷起来,塑料膜沙沙响,像在执行一次最后的析构函数。他把周维那盆绿萝端到床头,对小绿萝说:“这是你周叔叔送的,他教你怎么在系统里活下来,但没教你怎么出来。“ 小绿萝睡了,嘴角还残留着笑,像在梦里修复了一个无法复现的bug。 林默躺下,陈曦翻身抱住他,含糊地问:“那盆绿萝,你真要留着?“ “留着。“他说,“当技术债。“ “技术债得还。“ “还不了。“林默亲了亲她额头,“但可以不还,只要系统还活着。“ 窗外,春风卷着槐花进窗,落在小绿萝的脸上,她皱了皱鼻子,像嫌弃,又像接纳。金龟子飞过来,落在她鼻尖,她没醒,只是打了个喷嚏,奶声奶气,像一句没写完的注释。 林默闭上眼,脑子里跑的不是代码,是一个无限循环: ```python while True: baby.cry() baby.laugh() baby.grow() 注释:没有break,没有return,没有*#06# 这才是真正的,活着的代码 ``` 他跑这个循环跑到天亮,没觉得累,只觉得踏实。因为这一次,他知道,循环不会崩,不会溢出,不会因为某个变量未定义而panic。 因为所有变量,都在怀里,都在身边,都在这盆绿萝的叶脉里,静静地,不可逆地,生长着。 (本章完)