同事月薪竟比我多,我离职跳槽对手公司上班一周,前主管发来消息

楔子

那张工资条就躺在茶水间台面上,陈昊的名字后面跟着一个数字——两万六。林文远盯着它,像盯着一道解不开的方程式。他把手里的杯子轻轻放下,没有倒水,转身离开。回到工位,他打开项目台账,一个个模块往后翻,那些加班到凌晨的夜晚、那些他独立扛下的核心代码,全在这上面。他拿出手机给周晴回了条消息,说产检的事他记着。然后他翻到方姐的对话窗口,打了一行字,删掉,又打一行。最后发出去的只有五个字:方姐,方便吗。

第一章 茶水间里的数字

林文远在工位上坐了整整十分钟,手指一直搭在鼠标上没有动过。

屏幕上那份项目台账从去年九月排到今年三月,一共十四个模块,他一个人经手的占了九个。其中支付通道的异步回调、订单状态的分布式锁、还有那套他熬了三个通宵才重构完的缓存穿透方案,都在表格里明明白白写着他的名字。他又打开邮箱,把去年第四季度到今年第一季度的加班申请翻出来一条一条数。四十七次。这个数字跳进眼睛里的时候,他感觉后槽牙咬得有些发紧。

茶水间里那张工资条上的数字还刻在他脑子里。两万六。陈昊和他同一天入职,同一个职级,同一个产品线,甚至连工位都是背靠背。可他每个月打到卡里的是一万八。八千的差距,够他给周晴订三个月的月子中心,或者把现在那辆开了七年的旧车换掉。

“文远,发什么呆呢?”

陈昊的声音从背后冒出来,一只手拍在他肩膀上。林文远下意识把台账页面切到需求文档,回过头扯了扯嘴角:“没什么,在看支付模块的异常日志。”

陈昊拉开椅子坐下来,顺手把一杯奶茶搁在桌上,吸管上还挂着水珠:“那个不是早稳定了吗?方姐昨天还说你处理得漂亮。对了,你上次说的那个缓存方案,我看了,逻辑挺清晰的。”

林文远看着奶茶杯子上的冷凝水一点点滑下来,突然问了一句:“你那个方案后来改了多少?”

“没大改,就调了几个参数。”陈昊吸了一口奶茶,语气随意得很,“方姐说先上线跑着,后面有问题再迭代。哎,你最近看房了吗?我上周去看了城南那个新盘,学区不错,就是首付压力有点大。”

“还没看。”林文远的声音很平。

“也是,你孩子快生了嘛,先顾眼前。”陈昊又吸了一大口奶茶,完全没注意到林文远眼底那层薄薄的血丝,“不过我跟你说,那个盘真的可以,你咬咬牙搞一套,以后孩子上学方便。我那边销售说下个月还要涨。”

林文远没接话,手指在键盘上敲了几下,把日志文件翻到上个月那一页。支付模块第三次紧急重启的记录还在上面,凌晨两点四十一分。那天陈昊的电话打不通,方姐在群里@了他三遍,他爬起来连上热点,用手机热点改完的代码。事后周会上方姐说了一句“团队协作很重要”,就翻过去了。

陈昊喝完奶茶走了,留下一桌面的水渍和一个被揉扁的纸杯。

林文远把纸杯扔进垃圾桶,手机震了一下。周晴的来电,屏幕上跳着她的名字,后面跟着一颗红色的心。

“老公,明天上午产检你记得吧?医生说这次要空腹抽血,我有点紧张。”

他站起来走到楼梯间,压低声音:“记着呢,我八点准时到楼下接你。”

“你是不是没睡好?声音听着不对劲。”

“昨天看代码看得晚了点。”林文远靠在消防门旁边,用手捏了捏眉心,“你别操心我,管好你自己,今天胎动正常吗?”

“正常,踢了我三回,特别有劲。”周晴笑了,声音软下来,“老公,李姐说她们医院无痛分娩要提前预约,我想着咱们要不先把定金交了?两万左右。”

两万。

林文远看着楼道里那盏忽明忽暗的声控灯,顿了一下才说:“交,明天产检完咱俩就去交。”

“那你别太拼了,项目是做不完的。”

“知道。”

挂了电话,他在楼梯间又站了一会儿,然后给方姐发了一条消息:方姐,方便的话想跟您聊聊薪资这块。

消息发出去之后他把手机揣进口袋,回去接着看日志。四十分钟后方姐回了五个字:明天面聊吧。

第二天下午两点,林文远在方姐办公室的沙发上坐下来。方姐给他倒了杯水,坐在对面那把黑色皮椅上,表情和气得很。

“文远,你进公司三年多,工作态度我一直是认可的。”方姐双手交叉放在桌上,“但薪资这块公司有制度,年底统一评估,你现在提这个时间节点上不太合适。”

“方姐,我去年绩效是A,上半年独自扛了支付模块的重构,下半年的缓存方案也是我独立完成的。我算了算,同岗同级的薪资基准线应该在两万三左右,我目前是一万八,差得有点多。”

方姐的笑容没变:“薪资是保密的,你从哪里看到基准线这个说法的?”

林文远没有回答这个问题,只是说:“我的诉求很简单,调到正常的基准区间。”

“这样,”方姐拿起笔在便签上写了一个数,“我帮你争取一下,年底普调的时候加两千,怎么样?你也知道,现在大环境不好,有份稳定的工作已经不错了。”

两千。加完之后还是两万,比陈昊的起步价高不出一根手指头。

林文远从方姐办公室出来的时候,走廊尽头的窗户外面正下着小雨。他站在窗前看了很久,口袋里的手机又震了。这次是猎聘的推送,一条面试邀约,公司名称写着“星辰科技”,职位是高级产品经理,薪资范围三万到四万。

他点开那条推送看了两遍,通讯录里赵总的头像就躺在推荐联系人那一栏。半年前在一次行业沙龙上交换过名片,之后再没联系过。

回到工位,他把那条推送截了图,存进一个加密文件夹。文件夹的名字是他随手打的三个字母:LZH。然后他打开和周晴的对话窗口,打字:产检完去吃你上次说的那家粤菜?

周晴秒回了一个开心的表情。

林文远关掉对话框,目光又落在项目台账那个页面上。九个模块,四十七次加班,连续三个季度绩效A。他慢慢把台账关掉,点开了猎聘的简历编辑页面。

工作经历那一栏写得满满当当,他一个字一个字往下看,最后把光标停在最后一段项目描述后面,按下回车,新起了一行。

茶水间那张工资条的画面又浮上来,两万六的数字清晰得像刻在视网膜上。他深吸一口气,在简历里敲下第一行字:具备从零到一搭建支付体系的全流程经验,主导过三次亿元级交易量的系统重构。

写完这行字,他把简历保存好,没有投递。

窗外雨还在下,楼下的车流汇成一条缓慢移动的光带。林文远拿起杯子想去接水,走到茶水间门口又停住了。他转身折回工位,从抽屉里翻出一包放了很久的茶叶,捏了一撮丢进杯子里,用凉水冲开。茶叶沉在杯底,半天浮不上来,就像他此刻的心情,一点点往下坠,却始终没有落到底。

第二章 没有对比就没有伤害

林文远把工资条的事压在心底,照常上班。周会定在周三上午十点,他提前五分钟进了会议室,把上周的系统故障复盘报告投在大屏上。

方姐踩着高跟鞋进来,扫了一眼屏幕:“文远,报告先放一放,今天先过一下客户那边的进展。”

林文远点了下头,把PPT翻到最后一页,退回座位。陈昊坐在他斜对面,正跟旁边的测试组长低声说笑,手里转着一支签字笔。

方姐在主位坐下,开场白很简洁:“上周五晚上支付模块出了一次线上故障,用户投诉了十几单,好在处理及时,没有扩散。这件事我要重点表扬一下陈昊。”

林文远的手指在键盘上顿住了。

“陈昊第一时间跟客户那边的技术负责人做了沟通,把对方情绪稳住了,争取到了两个小时的缓冲时间。”方姐环顾一圈,“这种临场反应能力,大家都要学。”

会议室里有人点头。陈昊微微笑了笑,说了句“应该的”。

方姐接着说:“当然,故障最终是文远这边定位修复的,团队协作嘛,各司其职。文远,你回头把故障根因整理一份文档,抄送给客户那边,让他们放心。”

团队协作。

林文远看着自己屏幕上那份标着凌晨三点四十分修改时间的复盘文档,点了点头:“好。”

方姐的表扬会持续了四十分钟,陈昊被点名三次,林文远一次。散会时陈昊拍了拍他的肩膀:“文远,周五晚上有空没?咱俩好久没单独吃饭了。”

“行。”林文远收拾笔记本。

“那就老地方,七点。”

周五晚上,那家开在公司楼下的湘菜馆依旧嘈杂。陈昊点了三个菜,要了两瓶啤酒,给林文远倒了一杯。

“上周五那个故障,你几点走的?”陈昊夹了一筷子小炒肉。

“没走,搞到早上六点。”

陈昊啧了一声:“你也太拼了。其实当时跟客户说一声‘正在排查’就行了,何必通宵。”

“加密那块逻辑出了兼容问题,不修完早上流量一上来就雪崩。”

“行行行,技术的事我不懂。”陈昊举起杯子跟他碰了一下,“说点别的,我最近在看房。”

林文远喝了一口酒。

“西城区那个新开的盘,双学区,从幼儿园到初中全包。昨天去看了样板间,一百二十平,总价四百多万。”陈昊掏出手机翻照片给他看,“首付我凑一凑差不多,月供一万五,咬咬牙能扛。”

“你一个人扛一万五?”

“女朋友公积金也能用上,两个人加起来差不多。”陈昊收回手机,压低声音,“我跟你说,这房子再不买就没了,销售说下个月开盘要涨。文远,你跟嫂子也该看看了,你孩子快出生了吧?”

“嗯,下个月。”

“那更得抓紧了。”

林文远夹了一块剁椒鱼头,辣得舌尖发麻。他想起上个月跟周晴算过账,两人手头的存款加上双方父母凑的,勉强够一套小两居的首付。学区房,想都没敢想。

陈昊把话题转到了公司的八卦上,谁跟谁在项目里斗得厉害,哪个部门又空降了一个领导。林文远听着,偶尔应两声。

手机在口袋里震了一下,他掏出来看,是一条猎聘的站内信。

“林先生您好,星辰科技赵总通过平台向您发出面试邀约,职位为高级产品经理,薪资范围35K-40K,是否接受?”

他盯着屏幕,拇指悬在“接受”上面。

“看什么呢?”陈昊凑过来。

林文远锁了屏塞回口袋:“广告。”

那天晚上回家,周晴已经睡了。林文远轻手轻脚洗了澡,躺在床上翻来覆去。枕头底下的手机屏幕亮了又暗,暗了又亮。那条站内信还挂在消息列表最顶端。

他点开赵总的头像,个人资料页上写着“星辰科技 副总裁”,签名是“用技术改变支付”。

凌晨两点,他把手机塞回枕头底下,闭上眼睛。一个小时后他坐起来,靠在床头,删掉了那条站内信。屏幕暗下去的一瞬间,黑暗中只剩空调指示灯的一点绿光。

身后传来窸窸窣窣的响动,周晴翻了个身,手搭在他腰上:“怎么了?”

“没事,喝水。”

“你最近老失眠。”周晴的声音带着困意,“是不是项目压力太大了?”

“有点,过阵子就好了。”

周晴没再追问,手在他背上轻轻拍了两下,又睡了过去。林文远听着她均匀的呼吸声,在黑暗中睁着眼睛躺到天亮。晨光从窗帘缝里透进来的时候,他轻手轻脚下了床,在客厅打开电脑,翻出那个加密文件夹。LZH,三个字母和昨天一样安静地躺在那里。

他点进去,简历还在,项目经历最后一行依然空白。

第二天到公司,林文远刚坐下,方姐从工位旁经过,敲了敲他的隔板:“文远,昨天让你整理的故障文档,客户那边催了,上午能发出去吗?”

“十点前。”

“好,发完抄送陈昊一份,后续对接让他跟。”

林文远嗯了一声,打开文档从头到尾改了一遍措辞,把“凌晨三点定位到问题”改成“团队紧急排查后锁定根因”。光标停在发送键上,他盯着收件人栏里陈昊的名字看了几秒,按了下去。

中午去茶水间热饭,碰上隔壁组的测试主管老赵。老赵端着杯子,靠在饮水机边上压低了声音:“文远,你那个通宵的事我听说了。方姐这么处理,你心里有数就行。”

林文远笑了笑没接话。

“陈昊那小子,来公司才一年半,职级跟你一样,你知道他上个月调薪了多少吗?”

“不知道。”

老赵伸出两根手指晃了晃。林文远手里的饭盒盖差点没拿稳。

“两成?”

“两成半。”老赵喝了口水,“客户对接那边给的反馈好,方姐给他争取的。我就跟你提一嘴,你自己心里有个底。”

下午林文远回到座位,打开系统里的调薪记录。自己的名字后面,上一次调薪是十四个月以前,涨幅百分之七。他关掉页面,靠在椅背上,盯着天花板上的消防喷淋头看了很久。

下班前周晴发来消息,说晚上想吃酸汤鱼,让他路过超市带一包酸菜。林文远回了个“好”字,关掉对话框的时候,目光扫过猎聘APP的图标。他长按图标,拖进了卸载区域,手机弹出一个确认框。

“卸载猎聘?”

他的拇指停在“确认”上方,办公室的灯在头顶嗡地响了一声。

小刘从隔壁探过头来:“文远哥,还不走?”

“马上。”

他把图标拖回了桌面,锁屏,收拾东西下班。超市的酸菜货架前,他站了足足五分钟,手里那包酸菜的包装袋被他捏得起了褶皱。手机在兜里又震了一下,还是猎聘的推送,星辰科技赵总再次发来消息:“林先生,看到您查看了资料页,方便的话明天上午通个电话?”

他删掉推送,把酸菜丢进购物篮,走向收银台。

第三章 最后一根稻草

林文远是被键盘声吵醒的。凌晨两点四十分,卧室门缝透进一缕冷白的光,周晴的呼吸声均匀而绵长。他轻手轻脚走出去,看见电脑屏幕亮着,周晴坐在他的椅子上,正在翻他的工作邮箱。

“你怎么起来了?”

周晴回过头,眼睛红红的:“腰酸,睡不着,想看看你是不是又在加班。结果看到这个——”

她让开屏幕。邮件已经打开了,发件人陈昊,收件人方姐,抄送林文远。时间显示晚上十一点五十二分,主题是《关于支付模块架构调整的说明》。正文写得客气而简短:为了更好地响应业务需求,现对支付模块核心逻辑进行优化,主要改动包括加密算法升级与路由策略调整,原方案中部分冗余设计予以简化。

附件是一个压缩包,林文远点开,里面是修改后的技术文档和流程图。他翻到加密模块那一页,原本三层校验的架构被压成两层,密钥轮换周期从二十四小时改成了七十二小时。他往下翻,路由策略里原先的灰度发布机制被删掉了,改成了全量切换。

“这个改动会影响什么?”周晴凑过来。

“短时间看不出来。”林文远滚动鼠标,声音很平,“加密层少了一道,相当于门锁从三把变成两把。轮换周期拉长,等于同一把钥匙用三天。灰度发布删了,如果新版本有问题,所有用户一起崩。”

周晴沉默了一会儿:“你跟方姐说了吗?”

“说了。上星期就说了。”

“她怎么讲?”

林文远关掉文档:“她说别太较真,陈昊跟客户那边沟通得好,改动是为了提升响应速度。还让我多花点时间陪你。”

周晴的手扶上后腰,怀孕八个月后她走路像一只小心翼翼的企鹅。她看着林文远的侧脸,灯光下他眼角的细纹比半年前深了不少:“你那个项目,不是从零到一都是你搭的?”

“署名是团队。”

第二天上午的部门例会,方姐站在投影幕布前,手里的激光笔点在支付模块的架构图上:“这一块,陈昊花了两周时间优化,得到了客户方的高度认可。文远之前的基础打得不错,但后续的迭代思路还是需要年轻人来冲一冲。”

会议室里七八双眼睛齐刷刷看向林文远,又齐刷刷转回屏幕。陈昊坐在对面,脸上挂着礼貌的微笑,笔记本上画满了客户对接的时间线。

林文远翻开自己面前的资料夹。里面是他三个月前做的完整技术方案,一百一十七页。他翻到第五十六页,上面写着“灰度发布机制——确保线上问题影响面可控”。激光笔的红点从那一页上滑过去,像一滴擦不干净的血迹。

散会后,方姐叫住他:“文远,来我办公室一趟。”

方姐的办公室不大,窗台上摆着一排绿萝,其中一盆的叶子开始发黄。她从抽屉里拿出一个文件夹:“你最近家里事多,周晴又快生了。支付模块日常维护的活我打算让陈昊多担一些,你集中精力把手里那份产品规划做完。”

“方姐,加密层从三层降到两层——”

“这个我看了。”方姐打断他,端起保温杯喝了一口,“技术上我不如你懂,但陈昊跟客户那边的关系维护做得确实好。上个月客户还专门发了感谢信,点名表扬他。公司现在需要这种能直接产生业绩的人,你明白我的意思。”

林文远站着没动。

“还有,”方姐把文件夹合上,推到桌角,“你上个月加班时长全部门第一,人事那边找我谈过,说要注意员工身心健康。你回去也想想,是不是该调整一下工作节奏。”

“我加班是因为——”

“我知道,项目赶。但你看,地球离了谁都转,对吧?”方姐笑了笑,嘴角的弧度像刀削出来的,“回去干活吧,规划下周五要交。”

林文远从办公室出来,在走廊尽头站了半分钟。饮水机旁边的白板上写着本月优秀员工,陈昊的名字用红笔圈着。他掏出手机,翻到昨晚那条猎聘推送。赵总的头像是一个戴眼镜的中年男人,笑容温和。他点进对话框,打了四个字:“赵总您好。”

删掉。

又打:“方便电话沟通。”

还是删掉。

最后他走进消防楼梯,拨了过去:“赵总,我是林文远,方便的话明天上午见一面。”

电话那头的声音很热情:“好,明天十点,我公司楼下有家咖啡馆,我把地址发你。”

那天下午林文远提前两小时下班,陪周晴去医院做例行产检。B超室外的走廊里,周晴攥着他的手,指甲掐进他的掌心。医生做完检查,把探头放回架子上,语气平淡地说:“宫颈管有点短,有早产迹象。回去多躺着,别累着。如果下周复查还是这样,建议提前住院。”

“需要准备什么?”林文远问。

“押金先准备两万吧,多退少补。”

回家的路上两人都没说话。快走到小区门口时周晴松开他的手,从包里拿出手机,点开银行APP看了一眼余额:“我们活期还有四万三。”

“够。”

“文远,”周晴把手机收起来,看着他,“你上次说那个猎头找你的公司,叫什么来着?”

“星辰科技。”

“去吧。”周晴的声音很轻,手又放进他的掌心,“别因为我和孩子捆住自己。你在这个公司,已经没什么可留恋的了。”

林文远低下头,看见周晴的鞋带松了。他蹲下去,把鞋带系好,站起来时眼眶有点发烫:“明天上午我去见他们副总。”

夜里周晴睡着了,林文远坐在阳台上,手机屏幕的光映在他脸上。他翻到陈昊发的那封邮件,重新点开附件。加密模块的改动文档里写着一行备注:“原方案中的密钥同步逻辑已废弃,新方案采用简化模式。”他把这句话截图,存进一个新建的文件夹,命名为“备份”。

然后他打开猎聘,把那份空着项目经历的简历填完整。最后一行敲完最后一个句号时,阳台外面的天开始泛灰蓝色。楼下早餐铺的蒸笼掀开,一团白气升起来。他把简历保存,给赵总发了一条消息:“明天见。”

消息发出去的瞬间,卧室里传来周晴翻身的声音,接着是轻轻的一声闷哼。林文远走进屋,看见她皱着眉头捂着肚子。

“又疼了?”

“一阵一阵的。”周晴撑着坐起来,额头上浮着一层细汗,“没事,医生说可能是假性宫缩。”

林文远把枕头垫在她腰后,用手机查了一遍住院押金的缴纳流程。查完他看了一眼时间,六点十七分。离和赵总约的十点还有三个多小时。他打开衣柜找了一件平整的衬衫,袖子上的褶皱怎么抚也抚不平。

周晴靠在床头看着他:“那件灰的更好。”

他换了一件。出门前周晴叫住他:“谈完给我发消息。”

“好。”

“不管成不成,今晚我们吃顿好的。”

林文远回头笑了一下,关上门。走廊里声控灯没有亮。他站在黑暗里,听见门内传来轻轻的一声叹息,像秋天的树叶落进水里。手机在兜里震了一下,赵总发来咖啡馆的定位,紧接着又补了一句:“我看了你的简历,项目经历写得克制了。见面聊。”

他把手机揣好,走进电梯。电梯下行的时候,他靠着轿厢壁,忽然想起入职原公司那天方姐说的话:“好好干,公司不会亏待你。”电梯到一楼,门打开,外面下着小雨。林文远撑开伞,迈步走进雨里。皮鞋踩在水洼上,水花溅起来打湿了裤脚,他没有回头。

第四章 一杯美式的邀约

林文远推开咖啡馆的玻璃门,窗边的赵总已经站起来招手。他比照片上瘦一些,藏青色衬衫的领口敞着一颗扣子,面前摆着两杯美式,其中一杯杯壁上凝着细密的水珠,显然已经等了一会儿。

“坐。不知道你喝什么,先点了美式,不喜欢可以换。”赵总把纸巾盒往他那边推了推。

林文远道了谢,坐下来。咖啡的苦香混着烘焙间的暖风涌过来,他握了握纸杯,直接开口:“赵总在消息里说我的简历写克制了,我想听听您的判断。”

赵总笑了一声,摘下眼镜用衣角慢慢擦着:“星辰去年做企业级支付网关,卡在清算模块的延迟上。业内能把这套底层事务模型讲透的人不多。”他重新戴上眼镜,目光落定,“你三年前写的那篇关于多点同步回滚的论文,我让技术总监打印出来,团队学了两个月。原作者在对面公司被一个做客户关系的人压着,这事我想都不敢想。”

林文远没有接这个话茬。他用拇指摩挲着杯沿,忽然问:“贵司目前清算引擎用的是自研还是开源改造?故障恢复的RTO目标定在多少?”

赵总愣了一瞬,随即笑意从眼底漫上来:“自研,上一代开源方案踩过大坑,我们重写了内核。RTO目标三十秒,目前实测四十七秒,卡在跨机房数据一致性上。你这个问题,比薪资谈判更让我高兴。”

“所以您想挖的不是一个产品经理。”林文远说。

“我想挖的是一颗脑子。能把三年前论文里的架构思路真正跑起来的人,全行业不超过两只手。”赵总竖起两根手指,又补了一根,“月薪三万二,带五人团队,项目分红按税后利润百分之三起算。年底如果网关如期上线,另有期权池的份额,具体数字可以让HR单独谈。”

这个条件比林文远预想的要高。他沉默了片刻,手指在手机屏幕上无意识地滑动,点开了一个加密文档,又迅速关掉。茶水间那张工资条的数字在脑海里一闪而过——两万六。他比陈昊多出来的那八千块钱,原来只值对面公司一杯美式的时间。

“赵总,我还想确认一件事。”他抬起头,“团队里的资深工程师,如果资历比我老,怎么处理人事关系?”

“你定技术方案,谁不服,拿数据说服。数据说不服,让他来找我。”赵总把凉了的咖啡推到一边,“我只看结果。内部的墙,我替你拆。”

林文远伸出手:“下周一能入职吗?”

赵总握住他的手,用了用力:“手续办完随时来。我让HR今晚把offer发你邮箱。”

从咖啡馆出来,雨已经停了。林文远站在写字楼门口的台阶上,手机里有赵总刚发来的电子名片,抬头是星辰科技副总裁,下面一行小字备注:技术委员会主任。他盯着那几个字看了几秒,把名片存进通讯录,然后拨通了周晴的电话。

“谈完了?”

“嗯。月薪三万二,带团队,有分红。”

电话那头安静了两秒,然后周晴说:“医生让下周住院,押金我算过了,能凑上。你想动就动,我支持。”

“你不问别的?”

“问什么?你做了这么多年,什么水平我清楚。”她顿了顿,声音里带着笑,“晚上吃火锅吧,我馋了。医生说我得趁现在多吃点,后面要忌口。”

“好。”

林文远收起手机,拦了一辆出租车。回公司的路上他靠着后座,窗外的行道树一棵棵往后倒。他把赵总要的那两个架构问题又在脑子里过了一遍,忽然意识到赵总回答时提到了一个关键细节——他们重写内核时废弃的恰恰是原公司现在还在用的同步模式。也就是说,对方看中的不仅是他脑子里的论文,还有他踩过的坑。这个人情和算计各占一半的邀约,反而让他踏实。

下午两点,林文远回到工位。他打开电脑,把那个名为“备份”的文件夹拷进U盘,又把桌面上几个私人文档清理干净。旁边的实习生探过头来:“林哥,下午的评审会你去吗?”

“去。”他把U盘拔出来揣进口袋,“最后一回了。”

评审会上方姐照例主持,陈昊汇报支付模块的进度。林文远坐在长桌最远端,全程没有发言。散会时方姐叫住他:“小林,支付模块的测试用例你帮陈昊看一下,他那边人手紧。”

“方姐,下班前我给你答复。”

方姐多看了他一眼,转身走了。林文远回到工位,打开人事系统的离职申请页面,填了姓名工号,离职原因一栏写了四个字:个人发展。提交之前他犹豫了几秒,把光标移到“是否愿意接受挽留”的选项上,点了“否”。

流程走到方姐审批时已经是下午五点五十分。林文远站在她办公室门外,透过百叶窗看见她正在打电话,笑得露出后槽牙。他敲了敲门。

方姐抬头,笑容收了一半:“进来。什么事?”

“离职申请提交了,需要您审批。”

方姐的手指在鼠标上停住。办公室里的空调嗡嗡响着,把桌上的便签纸吹起一角。她盯着屏幕看了几秒,然后抬起头,嘴角动了动,只说了三个字:“想好了?”

“想好了。”

方姐点下审批通过,屏幕上弹出一个对话框,她看都没看就关了。“交接期一个月,支付模块的文档你负责整理给陈昊。”她把眼镜摘下来擦着,不看他,“猎头费公司白花了。”

林文远没说谢谢,也没说再见。他走出办公室,走廊尽头挂着项目倒计时的白板,红色的数字写着“距上线还有三十七天”。他在白板前站了一会儿,从笔槽里抽出一支记号笔,在角落里画了一个小小的问号,然后把笔帽盖好,放回原处。

回到家时周晴正坐在沙发上看母婴用品。林文远把U盘插进家里的电脑,打开那个加密文档,在“密钥同步逻辑废弃”那行字后面加了一行备注:低并发下无异常,高并发压测将出现脏读。写完他把文档重新加密,拖进一个新文件夹,命名为“交接”。

周晴端着热牛奶走过来,看了一眼屏幕上的文件夹名,什么也没问,把杯子放在他手边。

“产检押金的事,”林文远说,“新房补的公积金下周到账,加上我下个月预支的工资,够了。”

“我知道。”周晴坐回沙发上,翻开一本育儿指南,“你去忙你的。”

林文远关掉电脑,坐到她旁边。窗外邻居家的灯光透过纱帘落在地板上,一格一格的,像梯子。周晴翻了一页书,指着一段文字念出声:“新生儿第一周每天要睡二十个小时。”

“那岂不是跟我以前加班差不多。”

周晴拿书拍了他一下:“你能有他乖?”

他笑了一声,把脸埋进沙发靠垫里。手机亮了一下,赵总发来offer邮件,正文第一行写着:“欢迎加入星辰。你的工位靠窗。”附件里的薪资数字在屏幕上发着温润的白光,像一枚刚剥开的煮鸡蛋。

周晴靠过来看了一眼,伸手把手机屏幕按灭:“睡觉,明天还要去办社保转移。”

林文远把手机放在床头柜上,躺在黑暗里。周晴的呼吸很快平稳下来,一只手搭在他的小臂上,掌心微温。他在心里默默过了两遍下周要做的事,最后想起方姐那三个字——想好了?

他的确想好了。

第五章 入职新战场

林文远到星辰科技报到那天,前台领着他穿过开放式办公区,玻璃幕墙外的天际线笔直地铺开,比他原公司的视野开阔了不止一个量级。赵总在门口等着,拍了拍他的肩膀:“你的工位靠窗,团队五个人,下午开个见面会。”

工位上摆着一台新笔记本,屏幕贴着保护膜,键盘缝隙里没有一粒灰。林文远放下包,先把电脑开了机。系统是全新的,开发环境需要从零配置,他花了半小时把基础框架拉起来,然后打开赵总发来的项目文档。文档一共七个章节,他翻到架构图那页停住了,手指在触控板上慢慢滑动,把图放大到百分之两百。核心链路用的是异步消息队列,但消费端做了三层缓冲,这样的设计在低并发下看不出问题,高并发时会增加不必要的延迟。

他拿过桌上的便签纸,把问题节点画了下来,标上预估的延迟数值。

“新来的?”

对面工位站起来一个戴黑框眼镜的男人,工牌上写着“许波,高级开发”。许波盯着林文远的屏幕看了两秒,语气不冷不热:“文档是上个月刚更新的,赵总亲自审过。”

“架构整体很稳,”林文远把便签纸反过来,推到许波那边,“但这个三级缓冲,有没有压测数据支撑?”

许波把便签纸拿起来看了几眼,又放回去:“压测环境还没搭好,目前用的是理论值。”

“理论值的模型参考了哪个版本的内核?”林文远问得随意,但手指已经在键盘上敲出几个关键词,调出一份公开的技术白皮书,翻到第四十七页。“你看这个延迟曲线,如果消费端做三层缓冲,峰值会往后移零点三秒,用户侧能感知到。”

许波没接话,表情淡了几分,转身坐回工位。旁边的测试员凑过来小声说:“许波是项目组资历最老的,之前架构他参与了设计,你刚来就提意见,他心里不太舒服。”

林文远点点头,没再多说,继续翻文档。他把七个章节全部过完,在笔记本上列出一张问题清单,一共三条,三级缓冲那条排在第三。第二天上午,赵总召集项目组开进度会。许波先汇报了开发进度,各项指标按计划推进。轮到林文远发言时,他没有直接提缓冲的事,而是问了一句:“咱们的压测环境哪天能就绪?”

“下周三,”许波说,“硬件刚到货。”

“来得及。”林文远把问题清单推到桌子中央,第一条是接口鉴权可以简化两步,第二条是日志上报的采样率偏低会影响排查效率,第三条才是缓冲。“前两条改起来不费时间,第三条建议压测跑完再定,数据说话。”

赵总靠在椅背上,手指交叠:“许波,你觉得呢?”

许波沉默了几秒,把清单拿过去仔细看了一遍,抬头时表情松动了些:“前两条我下午就改,第三条等压测数据出来再议。”

散会后,林文远回到工位,把问题清单的电子版同步到团队共享盘,标注了预估工时和影响范围。下午许波改完前两条,在群里发了一条消息:“接口鉴权已简化,日志采样率调高,第三条待定。”末尾加了一句:“感谢新同事的建议。”

不算热情,但比昨天好。

第三天和第四天,林文远把新项目的支付网关代码通读了一遍。他发现一个隐藏的时序问题,在特定并发条件下会导致订单状态回写错位,虽然概率极低,一旦触发就是资损级别。他把触发路径和复现步骤整理成一份五页的报告,附上模拟跑出来的日志截图,发给了许波。十分钟后许波直接走到他工位旁边,手里攥着打印出来的报告:“这个路径你是怎么跑出来的?”

“把单测的并发数调高,随机种子换了几组,第四组触发了。”

许波拉过旁边一把椅子坐下来,把报告摊在桌上:“我看看你的测试脚本。”

两人对着屏幕调了一个多小时,许波临走时说了句“我改天请你吃饭”,语气比之前热络了不少。周五下午,赵总路过林文远的工位,扫了一眼他屏幕上刚跑完的性能监控图表,什么都没说,只在他桌上放了一罐咖啡。

林文远拿起咖啡罐,罐身上贴着张便签,赵总的字迹很潦草:“压测数据出来再聊,先按你的思路走。”

他把便签撕下来贴在显示器边框上,手机震了一下。前公司的实习生发来微信,问林哥你最近怎么样,随后发来一张截图,是原部门的大群聊天记录。陈昊在群里说:“文远外面有更好的机会,祝福他。”底下陆续跟了几条“祝好”,也有几条没有昵称的私聊被截图过来,其中一条写着:“方姐在周会上说他走之前没把支付模块的隐患交代清楚。”

林文远盯着那行字看了几秒,把手机翻扣在桌上。他没有回复实习生,也没有点开任何截图。过了一会儿,他拿起手机对着自己的新工位拍了一张照片。屏幕亮着,代码编辑器开着五六个标签页,桌上的绿萝是行政今天刚配的,叶子油亮。照片发给周晴,附了四个字:“一切顺利。”

周晴回得很快,是一个竖起大拇指的表情。后面跟着一句:“晚上想吃什么?”

“你做什么我吃什么。”他把手机收好,重新面对屏幕。许波在群里发了条消息:“压测环境提前到周一,设备已经上架,欢迎大家来看第一轮数据。”

林文远打了两个字发出去:“收到。”

窗外天色暗下来,办公区的灯自动调亮了一档。他把今天跑完的监控图表归档到“w1”文件夹里——这是入职第一周的记录。图表曲线在屏幕上安静地延伸着,三级缓冲的延迟峰值被他用红圈标了出来,旁边写着两个字:待验。

手机又震了一下。林文远低头看,是方姐的微信头像亮了起来,消息只有一行字:“文远,新工作还适应吗?”

他没有立刻点开。手指悬在屏幕上方停了片刻,最终把手机放到键盘旁边,继续看屏幕上的曲线。过了几分钟,他才拿起手机,几乎是同时,方姐的第二条消息跟了进来:“支付模块有个参数,陈昊说对不上,你方便的话帮忙看看?”

林文远把手机立在显示器前面,看着那两条消息并排躺在对话框里。办公区的空调送着恒温的风,吹得他额前的头发微微晃动。他打了几个字又删掉,重新打了一行,发送出去,然后把手机调成静音,翻扣回桌上。

屏幕上,许波刚上传了新一版的架构图,他在群里点开看了看。三级缓冲的设计已经被修改成了两层,底层加了一个异步确认机制,和他第一周提出的方案基本一致。底下许波留言:“按这个版本跑周一压测,有异议的现在提。”

林文远在输入框里打了一个“没问题”,发送。然后把那张监控图表拖进演示文件夹,命名:“压测预案”。

窗外城市的灯火次第亮起来,像一条条被拉长的数据流,安静而有序。

第六章 前主管的第一条消息

通话记录里最后一个电话是陈昊打来的,三天前,响了两声就挂断,林文远没有回拨。

他把手机翻了个面,屏幕朝下扣在键盘右侧。许波从工位隔板后面探出头来:“林哥,网关那块压测脚本我看你调了一版,采样点是不是太密了?”

“高频接口用全采样,低频走抽稀,不然日志量撑不住。”林文远推开椅子站起来,走到许波屏幕前,用手指点了点他开着的监控面板,“阈值别卡太死,留百分之十五的抖动空间。”

许波点头,在代码里敲了两行注释。这时林文远桌上的手机嗡了一声,他走回去翻开,方姐的头像亮着。消息很短:“文远,新工作还适应吗?”

光标在输入框里跳了几下。他打了“还行”两个字,拇指悬在发送键上停了停,删掉,重新输入:“在跟新项目,挺顺利的。”

方姐回得很快:“那就好。你做事一向踏实,到哪儿都吃得开。”紧跟着一句,“支付模块这边有个参数,陈昊说对不上,你方便的时候帮忙看一眼?”

林文远盯着“陈昊说对不上”这几个字看了两秒。那个参数是加密链路里的盐值偏移量,每次版本升级必须同步更新密钥索引表。他在原公司时把对应逻辑写进了部署手册第十七页,附录里有全量索引对照。陈昊改过方案之后,手册大概早就废了。

他打开电脑上的个人文档,找到离职前备份的部署手册,翻到第十七页,截了图。截图裁剪到只保留参数说明部分,隐去了公司名称和系统代号,发给了方姐。

“索引表在配置文件第十二行,偏移量取十六进制转十进制,跟密钥版本号做异或。”他附了这行字。

方姐回了一个合掌的表情,后面跟了句:“还是你清楚。”

林文远没有回复。他把手机放回桌面,屏幕上许波刚提交了压测脚本的新版本,他点开diff对比,逐行看改动过的采样逻辑。两分钟后又一条消息弹出来,是方姐:“文远,下周你有空回来一趟吗?不用很久,半天就行,帮我们看看整体链路,最近跑起来总觉得不对劲。”

他拿起手机,指腹在屏幕上滑动了一下对话框。原公司那间会议室的样子在脑子里闪过去——白板上还留着他画的架构分层图,大概已经被擦掉了。

“方姐,新项目正好在压测攻坚期,实在抽不开身。”他打完这行字,停了一拍,又补了一句,“参数照我说的方法改,应该能跑通。”

发送。

方姐回了一个“好”,后面跟着一个句号。没有多余的客套。

林文远把手机调成静音模式,翻扣在桌上。许波拿着打印出来的脚本走过来,往他桌上一放:“采样逻辑我重写了,你帮我扫一眼。”他接过纸质脚本,用铅笔在几个分支判断旁边画了圈:“这里的异常捕获嵌套太深,拆出来单独处理,不然日志会把真实报错吞掉。”

许波凑过来看了一眼,点头去改。林文远拿起那罐赵总给的咖啡,拉开拉环喝了一口,凉了,但味道还在。他转头看窗外,对面写字楼的灯光连成一片,像无数条并行运行的数据流。

手机屏幕亮了一下,他从玻璃反光里看到是方姐发来的消息,但没去翻。再亮一下,又暗下去。

五分钟后,赵总端着杯子从走廊那头走过来,在他工位旁边站定,目光扫过他桌上翻扣的手机,又落在他屏幕上开着的压测报告。赵总没问谁发的消息,只喝了一口茶,说:“有些领导,看人只看汇报,不看代码。”

林文远抬头看他。

“你以前的领导,”赵总用杯盖撇了撇浮沫,“不太懂技术。她要是懂,当初就不会让你走。”

说完他拍了拍林文远的椅背,端着杯子走回自己办公室。门关上,留下一句话在空气里:“周一压测,你主讲。”

林文远低头看屏幕。许波发来新一版脚本,群里跟了一串“收到”。他把手机翻过来,屏幕上有两条未读消息,都来自方姐。第一条是“那你先忙项目”,第二条隔了十分钟:“文远,手册第十七页那份索引表,是最终版本吗?”

他打字:“是。”

想了想,又加了一句:“部署时记得先跑校验脚本,别直接热更。”

发完他把手机设成勿扰模式,丢进抽屉里。屏幕上,压测环境的资源池已经扩容到十二个节点,曲线在监控面板里平稳延伸。林文远在群里敲了一行字:“周日晚上跑一次基准,周一早上八点正式开压。”

发完他靠在椅背上,左手边是那罐喝了一半的咖啡,右手边是许波新交上来的脚本打印稿。办公区的灯光又调亮了一档,把他的影子投在地面上,椅脚和桌腿的影子交错在一起,像一组被反复调优过的参数,稳定,收敛,指向明确。

抽屉里手机又震了两下。林文远没动,继续对着屏幕上那条压测曲线的拐点做标注。许波从旁边探过头来:“林哥,周日基准跑几轮?”

“先跑三轮,看抖动区间稳不稳定。”他拿铅笔在打印稿边缘写了个数字,“第三轮之后加一次故障注入,模拟单节点掉线。”

许波记下来,转身回自己工位。林文远这才拉开抽屉,屏幕上方姐的头像右上角挂着三条未读。第一条是图片,拍的是配置文件第十二行,红框圈出了那个偏移量字段。第二条是文字:“按你说的方法改了,陈昊那边验证通过了。”第三条隔了将近半小时,语气明显犹豫:“文远,其实还有个事。链路整体跑起来总在并发环节报超时,陈昊查了两天没定位到根因。你要是这周哪天晚上有空,远程帮我看一眼也行,不占你白天时间。”

他盯着“陈昊查了两天”这几个字,眼前浮现出原公司那间开放办公区的样子。那个位置原本坐着他,现在大概换了人。方姐发来的截图里,配置文件底部的版本号还是他离职前定的,陈昊只改了上层封装,核心链路几乎照搬。

他打字:“方姐,竞业期还没过,远程连内网不合适。”

发完把手机重新丢回抽屉,这次连翻扣都省了。屏幕上许波提交了新一轮脚本,群里弹出一串通过。他点开赵总上午转来的那份架构评审意见,逐条往下看,铅笔在指间转了一圈。窗外夜色沉下来,对面写字楼的灯一盏接一盏灭掉。他拿起那罐咖啡,罐身已经彻底凉透,最后一口倒进嘴里,苦涩从舌根漫上来,精神反而清明了几分。

第七章 参数之外

周一清晨七点四十,林文远到得比平时早。办公区只开了半边灯,保洁阿姨刚拖过地,空气里飘着一股淡淡的消毒水味。他放下背包,先去茶水间接了杯热水,回来时发现许波已经坐在工位上啃包子,屏幕上开着他昨晚提交的第三轮压测报告。

“早啊林哥。”许波嘴里含混不清,伸手把报告里几处标红的异常点放大,“第三轮故障注入那部分我还没细看,单节点掉线之后的重试逻辑有点怪。”

林文远把水杯搁在桌上,俯身看了几秒:“重试间隔写死了,没做退避。你之前那版脚本里这个参数是动态算的,怎么打包的时候又固化了?”

许波愣了一下,切到提交记录里翻找。林文远没催促,坐下来打开自己的邮箱。收件箱第一封是赵总昨晚十一点多发来的,标题只有两个字:奖金。正文里是一张截图,财务系统里的打款记录,金额栏显示的数字让他多看了一眼。项目预分红,提前发放,备注栏写着“第一阶段激励”。

他算了算,转两万给周晴之后还能剩下一笔。周晴昨天刚做完产检,医生让她接下来每周都去一次,打车费、营养费、待产包,样样都在涨。他点开转账界面,输入金额,备注写了四个字:安心待产。

周晴回消息很快,一个笑脸表情,跟着一行字:“你那边项目是不是快上线了?别老惦记家里,我好着呢。”

林文远回她:“今天压测,晚上可能要加会儿班。”

“加吧,我让妈过来陪我。”

他放下手机,许波那边已经找到了问题:“打包脚本里这个变量被覆盖了,我重新打个包。”

“嗯,重试退避加上,第三轮报告重跑一遍再发。”林文远拿起铅笔,在纸质报告上把故障注入那一段勾出来,“这里也补个注释,写清楚为什么选这个退避算法。以后换人维护不用猜。”

许波应了一声,键盘敲得飞快。林文远把报告翻到最后一页,赵总在评审意见栏里批注了一行字:架构韧性取决于最薄弱的那个环节,测试不是找麻烦,是找命门。他在旁边用铅笔打了个勾,合上报告。

午休时间,办公区安静下来,有人拉下遮光帘,有人趴在桌上补觉。林文远没睡,端着杯子站在窗边,对面写字楼的玻璃幕墙映着正午的白光,晃得人有点眯眼。他掏出手机,拇指在屏幕上滑了几下,点进了原公司的公众号。

最新一条推送是昨天发的,标题写着:支付模块完成重大升级,交易链路稳定性提升百分之四十。配图是团队合影,方姐站在中间,陈昊在她右手边,比着大拇指。通稿正文里洋洋洒洒列了七八个人的名字,技术负责人一栏写着陈昊。翻到最底下,鸣谢名单里也没有林文远三个字。

他退出公众号,把手机锁屏。杯里的水已经凉了,他一口喝完,回到工位。抽屉里另一部旧手机亮着,是离职时没上交的工作号,他偶尔会开机看一下有没有遗漏的信息。屏幕上方姐昨晚十点多发来的那条“陈昊查了两天没定位到根因”还挂在对话框里,他没回。

正要把旧手机塞回去,屏幕又亮了一下。陈昊的私聊弹出来,就一句话:“林哥,你在的时候那些方案真香,现在用着确实稳。”

林文远看着这句话,手指在输入框上方停了几秒。他想起离职那天整理工位,把电脑里所有技术文档按模块分好类,打包拷进移动硬盘,删掉本地副本之前还特意在共享盘里留了一份目录索引。当时他想的是,走了也别给人留烂摊子。

他打字回陈昊:“好好用。”

发完他把旧手机关机,塞回抽屉最里面。新电脑的屏幕上,许波重新提交的第三轮压测报告已经发到群里,数据曲线比之前平滑了很多。他点开报告,拖到故障注入那一段,退避算法生效了,重试间隔从固定三百毫秒变成了指数递增,抖动区间收缩到可接受范围。他在群里回了个通过。

许波凑过来:“林哥,周日基准跑完,周一正式压测要提前准备什么?”

“把监控面板权限开给运维组,提前一天做链路检查,重点看缓存穿透和连接池打满的情况。”林文远拿过一张便签纸,画了个简易拓扑图,“这三个节点之间的网络延迟要压到二十毫秒以内,超了就说明有问题。”

许波把便签纸拍下来存进手机。林文远拉开左手边的抽屉找铅笔刀,余光扫到那个旧手机安静地躺在角落里,黑着屏。他顿了一下,没有去碰它。

下班前,赵总从办公室出来,绕到他工位旁边看了一眼屏幕上的压测数据,点点头,什么也没说就走了。临出门时又回头,扔下一句:“奖金收到没?”

“收到了。”

“项目上线之后还有第二笔。”赵总按了电梯按钮,门开了,他走进去,又探头出来补了一句,“你那个前东家,最近公众号发得挺勤。”

林文远没接话。赵总笑了一下,电梯门合上。

他坐回工位,把压测报告的附件重新整理了一遍,在文档末尾加了一行备注:故障注入场景下的缓存穿透风险待评估,建议上线前完成针对性修补。附上自己整理的那份缓存预热方案,参数调优建议写了三页。

保存,上传到项目共享盘。

他靠在椅背上,办公区的灯自动调暗了一档,只剩他这一侧还亮着。窗外车流的光带蜿蜒流过,红白相间,像一条实时刷新的事务日志。他拿起手机看了一眼,周晴发来一张照片,是家里阳台上新添的婴儿床,木头栏杆上挂了一串手工折的小星星。她配文:“今天到的,我装的。”

林文远放大照片看了很久。然后他关掉电脑,拿起背包,把桌上那张画了拓扑图的便签纸对折塞进口袋。电梯下行的时候,他给周晴回了三个字:“明天我装。”

出大楼,风灌进衣领,他缩了缩脖子,把背包带子紧了紧。手机震了一下,旧工作号收到一条短信,来自一个陌生号码,内容只有一句话:文档里第十七页那个偏移量,和第二十三页的校验位是绑定的,改一个就必须改另一个,方姐不知道。他没存这个号码,也不想存。把短信左滑删除,屏幕暗下去,映出身后写字楼连片的灯火。

他走到地铁站口,回头看了一眼。那些亮着的窗户里,有一扇曾经是他的工位。如今那盏灯亮着,但照的是别人的键盘。他收回目光,刷卡进站,身影被扶梯缓缓载入地下。口袋里那张便签纸的边角蹭着手指,他摸了一下,没掏出来。

列车进站的风掀动衣摆,他迈步上车,找了个靠门的位置站定。玻璃门映出他的脸,平静,清醒,像一组刚刚收敛的参数,稳稳锁定在设定的目标值上。手机在口袋里又震了一下。他没看。车厢摇晃着驶入隧道,窗外变成一片纯粹的黑暗,只有速度感和方向感还真实地贴在皮肤上。

第八章 凌晨三点的电话

手机在枕头边震动时,林文远的手先于意识伸了过去。屏幕亮得刺眼,方姐的名字跳动着,时间是凌晨两点五十一分。他翻了个身,周晴呼吸均匀,肚子隆起如一座安稳的山丘。他按掉来电,把手机翻扣在床头柜上。

不到十秒,又震了。

他抓起手机走进客厅,赤脚踩在微凉的地砖上。“喂。”

“文远,支付模块出事了。”方姐的声音沙哑,背景里有人急促敲键盘,“凌晨一点开始,交易成功率从百分之九十九点七掉到不到六成,现在还在往下走。我们查了两小时,定位不到根因。”

“两天前陈昊不是说他能处理?”

“他说是缓存配置的问题,改完更糟了。”方姐停顿了一拍,语气里有什么东西裂开了,“文远,你走之前留的索引文档我翻遍了,但这个加密逻辑模块的注释太简略……”

电话那头突然炸出一个声音,是陈昊。“方姐,我说了不是我改的,那版方案本来就是那样——”

方姐捂住听筒的动作通过闷响传过来。林文远靠在沙发扶手上,客厅没开灯,窗外路灯的光斜斜切进来,照出茶几上周晴白天折的那罐星星。他等了三秒。

“方姐,远程协助可以。”他说,“但我需要陈昊书面确认,这套技术方案由谁主导、由谁修改。写清楚,发我邮箱。”

电话那头安静了。客厅冰箱的压缩机嗡地启动,像一声叹息。

“文远,现在系统在流血,每一分钟都是钱……”

“方姐,我十五分钟能定位问题,给你们临时方案撑到早上。但那封确认邮件如果不发,我挂了这通电话就睡觉。”

沉默持续了六秒。背景音里有人在喊“又掉了三个百分点”。方姐的声音像从牙缝里挤出来的:“好,我现在让他发。”

“我等着。”

挂了电话,林文远没有开灯。他走进书房,打开那台旧笔记本。屏幕上灰尘在路灯的余晖里浮游,键盘缝隙里还卡着一粒当年工位旁边绿植掉下的枯叶。他等邮件的时候打开终端,通过方姐之前给的一个临时只读账号连上了原公司的监控系统。三条最高优先级告警在滚动刷新,全指向支付网关的加密握手环节。他扫了一眼时间戳曲线,脑子里那个十七页的偏移量和二十三页的校验位像两颗扣子一样咔嗒扣上了。

邮件到了。陈昊的书面确认写得很简短,核心意思就是“方案主体框架由林文远搭建,加密模块后期由陈昊调整参数以适配新版风控接口”。一句话把自己摘干净的同时,把方姐的授意痕迹也抹掉了。林文远冷笑了一声,截图保存,然后把目光收回到告警上。

他拨通方姐的电话。“看到邮件了。你让陈昊把加密握手第二阶段的超时阈值从八百毫秒临时调到三千毫秒,同时把连接池的溢出保护打开。”

“就……这么简单?”

“根因是十七页那个偏移量被改了之后,校验位没跟着变,每一次握手要重试五次才能通过,连接池被占满。调超时只是续命,让重试不要在高峰期叠加成风暴。但你们得马上准备降级方案,把非核心交易走异步队列。”

电话那头方姐在复述给陈昊。林文远听见陈昊说“调三千也太夸张了”,方姐压低声音回了句什么,随后键盘声噼里啪啦响起来。

“文远,你在听吗?”

“在。”

“改好了……交易成功率在回升。百分之七十四……八十一……九十三了。”

方姐长出一口气,那声音像是肺里绷了一整夜的弦突然松了。“文远,谢谢你。真的。”

“邮件我已经存了。”林文远说,“明天白天你们把偏移量和校验位的逻辑对齐,源码在共享盘第三层的归档目录里。以后改任何一个参数,记得成对改。”

他顿了顿,补了一句:“陈昊知道这个规则,我交接文档里写过。”

这句话像一根针落在安静的房间里。方姐没接。

“我挂了。”林文远说完按了红色按钮。

屏幕暗下去。他没立刻站起来,手指在触控板上划了一下,把那封确认邮件拖进一个新建文件夹,取名为“归档-项目-存证”。这是他在新公司养成的习惯,任何口头沟通都要落到文字上。他从书房出来时顺手关了笔记本,客厅还是没开灯,但周晴站在卧室门口,一只手撑着后腰,睡眼蒙眬地看着他。

“几点了?”她声音软软的。

“快四点了。处理了点旧事。”

“前公司的?”

“嗯。搞定了,快回去躺着。”

周晴没动,走过来把额头抵在他肩膀上,蹭了两下。“你身上凉。”

“刚从书房出来,没穿外套。”

她抬起头看他一眼,没问细节,只是伸手把他的领子翻正。“明天还要上班,再睡会儿。”

林文远扶她回卧室躺下,自己坐在床沿。窗外天际线灰蒙蒙的,还没亮透。手机屏幕又闪了一下,是方姐的微信,三个字:谢谢你。他看了一眼,把手机翻扣回去,拉起被子一角盖住周晴露在外面的脚踝。

没有回复。

天亮之后,他比平时早起了二十分钟。洗漱时镜子里的人眼睛有血丝,但精神清醒。他给周晴热了牛奶放在床头,留了张便签:今天中午我去超市买菜,晚上做你上周说想吃的那个番茄牛腩。出门前他把旧手机从抽屉里取出来,开机,方姐那条“谢谢你”下面紧跟着陈昊半夜发来的一条消息:“林哥,方姐让我跟你说,那个文档能不能先别往外发。”

他看完,把旧手机再次关机,这次放进了背包内层。地铁上他收到赵总的语音,简短一句:“听说你昨晚帮老东家救了个火?中午来我办公室一趟。”

林文远回了个“好”。列车驶出隧道,晨光涌进车窗,落在他摊开的笔记本上。他把便签纸从口袋里掏出来,翻到背面,昨晚画的拓扑图还在,空白处不知什么时候被他顺手写了一句:“所有成功的降级都是临时方案,真正的修复永远在源头。”

他把便签纸夹进笔记本,合上。车载广播报出下一站站名,他看了一眼时间,距离公司还有四站路。背包内层那台旧手机沉默地贴着背脊,像一颗已经倒计时的旧雷,但他知道引线攥在自己手里。车厢在轨道接缝处轻轻晃了一下,他伸手扶住吊环,目光穿过玻璃窗投向远处逐渐清晰的楼群轮廓,那里有一扇窗属于他现在的工位,也有一扇窗属于他离开的过去。两扇窗都在早晨的阳光里亮着,但他清楚哪一扇该推开。

第九章 两万与八千的距离

林文远把旧手机塞回背包,拎着菜推开家门时,周晴正靠在沙发上看育儿视频。她抬头看他手里的购物袋,笑了笑:“番茄牛腩,你还真记得。”

“你说过的话我都记得。”他换了鞋,把袋子拎进厨房。

周晴撑着沙发扶手站起来,肚子已经很明显了,走路时一只手总是习惯性地托在腰后。她慢慢挪到厨房门口,靠着门框看他洗番茄。

“昨晚那个事,”她开口,语气随意但目光落在他脸上,“你还没跟我说清楚。前公司到底出什么问题了?”

林文远把番茄放在砧板上,拿刀的动作停了半拍。“支付模块的加密逻辑出了点乱子,他们改了一个参数,没同步改校验位。高峰期撑不住,我帮忙调了一下。”

“就调了一下?”

“调完还得改源码逻辑,不然还会再犯。”他把番茄切成块,刀落在砧板上发出均匀的笃笃声,“我让他们自己去看交接文档,第三层归档目录里有。”

周晴沉默了几秒,手无意识地在肚子上画圈。“你离职都半个多月了,他们自己搞出来的问题,为什么还要找你?”

“找我是因为陈昊改的东西他自己都说不清楚。”林文远放下刀,转过身看她,手在围裙上擦了擦,“不过我没白帮。远程协助,他们该欠我这个人情。”

“人情能当饭吃?”周晴的声音很轻,但每个字都敲得清楚,“文远,你以前在那个公司,加班最多,背锅最多,最后连工资都比别人少八千。现在走了,半夜还得爬起来给他们救火。你告诉我,你图什么?”

林文远走过去,牵起她的手往客厅带。“先坐下,我跟你算笔账。”

两人在沙发上坐定。周晴侧着身子,一只手搭在扶手上,眼睛一眨不眨地盯着他。

“我在那边月薪一万八,”林文远竖起一根手指,“陈昊同岗同级,两万六。我走之前方姐说给我争取调薪,最多能到两万三。你知道两万三是什么概念吗?是陈昊的起步价。我干了四年,最好的结果就是够到别人刚入职的水平。”

周晴的眉眼微微蹙起来。“所以你当时走,不全是因为气不过?”

“气肯定有。”他坦诚地点头,“但我算过。跳到这里,三万二,加项目分红。上个月我梳理出那个性能瓶颈,赵总说往后的项目奖金系数会往上调。昨晚那个火,我知道他们搞不定,但我也让他们知道,我搞定了值多少钱。”

周晴伸手覆上他的手背,掌心温热。“我不希望你为了钱委屈自己。你在那边累死累活,工资没涨多少,背地里还要被方姐拿‘陪家人’当理由把项目划给别人。那种委屈,再多钱我也不要你受。”

“所以我没回去。”他反握住她的手,拇指在她手背上轻轻蹭了两下,“我帮他们调那一下,是职业底线。参数不对会出大事,用户的钱不能出问题。但回去——那是另一回事。”

周晴靠过来,把脸贴在他肩膀上,头发蹭着他的下巴。“你做事有分寸,我知道。就是半夜被叫起来,我心疼。”

“以后不会了。”他说这话时语气笃定,像是把一颗钉子敲进了木头里。

第二天中午,赵总把他叫进办公室。赵总的办公桌收拾得很干净,只有一台笔记本电脑和一只白瓷杯,杯里泡着枸杞。他示意林文远坐,开门见山:“昨晚的事我听说了。方姐在那个圈子里的口碑怎么样,你比我清楚。她半夜找你,说明什么?说明你当初在那边埋的坑,他们自己填不上。”

林文远没接话,只是点了点头。

赵总把笔记本转过来,屏幕上是一份项目分红细则表。“我跟你交个底。你入职前谈的分红比例是一个点,现在我给你加到两个点。条件是——以后下班时间,旧公司的电话,能少接就少接。你现在的精力应该放在我们这边的架构上。我不介意你念旧情,但我更看重你把新仗打好。”

“一个点变成两个点?”林文远确认了一遍数字。

“对。你上个月梳理出来的那个瓶颈,给项目省了至少二十万的服务器扩容预算。这一个点是你应得的。”赵总端起杯子喝了一口,“另外,方姐那边如果再来找你,你可以直接推给我。说你在新项目上有保密协议,不方便对外提供技术咨询。这话你不好说,我来说。”

林文远看着屏幕上的数字,心里有根弦被轻轻拨了一下。不是为钱——两万八也好,三万二也好,这些数字在他脑子里排过太多次,已经构不成情绪的波澜。他真正在意的是赵总最后那句话。一个老板愿意替员工挡掉旧公司的纠缠,这不是钱能买到的尊重。

“赵总,协议我签字。”他停顿了一下,“但我有个请求。”

“你说。”

“旧公司那边如果再出问题,我还是会建议他们怎么做。这是我的职业习惯——看到参数配置错了,不说出来,难受。但我可以保证,不占用工作时间,也不泄露这边的任何东西。您要觉得不行,我可以把建议写成行业通用案例发在技术社区,让他们自己找。”

赵总盯着他看了两秒,忽然笑了。“你这个人,有意思。行,我答应你。但你要答应我一件事——下半年那个金融客户的项目,你得给我拿下来。”

“没问题。”

林文远回到工位时,桌上多了一份打印文件,是赵总让助理送来的修改后的分红协议,上面已经签好了赵总的名字。他翻到最后一页,从抽屉里取出自己的签字笔,笔尖悬在签名栏上方停了一瞬。

旧公司的方姐这时又发来一条微信,屏幕亮在手机顶端:“文远,白天有空吗?陈昊说那个源码逻辑对不齐,想再请教你半小时。”

他没有点开那条消息。笔尖落在纸上,一笔一划写下自己的名字。签完,他把协议合上放在桌面右上角。手机屏幕暗下去,那条消息沉进了通知栏,像一颗被按回水底的浮标。

他拧开桌上的台灯,翻开新项目的架构文档。屏幕上密密麻麻的接口定义和时序图铺展开来,他握着鼠标开始逐行梳理。午后的办公室安静得只剩下键盘敲击声和中央空调低沉的嗡鸣,窗外天色明净,照进来的光落在协议封面上,把“分红比例百分之二”那行字映得格外清晰。

旧手机在背包里震动了一下,又一下。他拉开拉链看了一眼,方姐的来电,未接。他把背包拉链合上,目光重新回到屏幕上那行尚未完成的代码,手指落在键盘上,清脆的敲击声盖过了背包深处最后一声震动。

第十章 陈昊的坦白

陈昊约的地方是一家巷子深处的烧烤店,门脸不起眼,里头却坐得满满当当。林文远到的时候,陈昊已经点好了一桌串,两瓶啤酒摆在中间,瓶身上凝着一层细密的水珠。

“坐。”陈昊把菜单推过来,“还想吃啥自己加。”

“这些够了。”林文远拉开椅子坐下,目光扫过陈昊的脸。比上次见瘦了一圈,下颌线条硬了几分,眼底下挂着两片淡青。他没问怎么了,拿起一串羊肉慢慢吃。

头二十分钟聊的都是闲事。陈昊说起公司楼下新开的面馆味道不正宗,说起最近迷上了钓鱼,又说起大学同学谁谁谁去了大厂年薪多少。林文远应着,偶尔笑一声,啤酒只抿了两口。他知道陈昊不是单纯来叙旧的,但他不急。有些话,得等人自己说出口。

第二瓶酒见底的时候,陈昊把竹签往盘子里一搁,手指在桌面上来回刮了两下。

“文远,”他开口时嗓子有点哑,“支付模块的事,我得跟你说清楚。”

林文远放下手里的杯子,没接话,只是看着他。

“方姐当时跟我说……”陈昊深吸一口气,把目光从桌面上抬起来,“她说,你那个方案太稳了,稳到看不出个人亮点。她说我要想晋升,得在方案里体现自己的思路,不能全盘照搬别人的东西。”

“所以你改了加密逻辑?”

“我只动了非核心的部分。”陈昊的语速快了起来,“真的,核心算法我没碰。我就把密钥轮换的周期缩短了,加了一层自定义的校验规则。方姐说这样可以对外说是我的独立优化——我那时候……”

他停下来,抓起酒瓶想倒,发现已经空了。林文远把自己那瓶没怎么动的推过去。陈昊愣了一下,接过来直接对着瓶口灌了一大口。

“你那时候想晋升,我理解。”林文远的声音很平,“但缩密钥轮换周期,跟你后来改的并发参数是两回事。”

陈昊的酒瓶停在嘴边。

“你改了并发上限。”林文远说得很轻,但每个字都咬得清楚,“数据库连接池的默认配置被你调过。为什么?”

烧烤店里人声嘈杂,隔壁桌在划拳,服务员端着托盘在人缝里侧身挤过。陈昊的喉结滚了一下,把酒瓶慢慢放回桌面。

“方姐说,压测报告的数据要好看。连接池拉高能过更多并发,报表上比你的保守配置漂亮。”

“然后呢?”

“然后……”陈昊的目光开始躲闪,“然后她又找了个外包团队做了一次架构评审,那帮人说调高连接池没问题,我就签了。”

林文远没有再说话。他靠在椅背上,视线越过陈昊的肩膀,落在后厨门口那团蒸汽里。脑子里飞速转着——连接池拉高,密钥轮换缩短,自定义校验层,这三样东西单独看都还行,叠在一起……

“现在系统每隔几天就要重启一次。”陈昊终于说到了正题,声音压得很低,像是怕被邻桌听见,“方姐找了三家外包,人家看完架构方案都说接不了。有一家做技术评估的直接说——这系统在跑钢丝,一旦真的出问题,连回滚的余地都没有。”

“你刚才说自定义校验层。”林文远的身子往前倾了倾,“校验逻辑是你写的?”

“我写了框架,具体规则是外包填的。”

“规则文档还在吗?”

“在是还在,但是……”陈昊的脸上掠过一丝极不自然的神色,像有什么东西梗在喉咙口说不出来,“算了,不说这个了。我今天找你,就是想当面说声对不起。当初那个方案是你熬了三个晚上做出来的,我把它改得面目全非,你肯定恨我。”

“我不恨你。”林文远说得很慢,“我气过,但谈不上恨。你只是听了不该听的话。”

陈昊张了张嘴,眼眶忽然有点泛红。他偏过头,用袖子蹭了一下脸,再转回来时挤出一个笑。“你这人就是这样,什么事都替别人想好了理由。可我自己知道,那会儿就是昏了头。晋升公示贴出来那天,方姐拍着我肩膀说‘小陈有想法’,我站在公告栏前面,心里比谁都虚。”

两人沉默了一阵。隔壁桌换了人,划拳的换成了带小孩的一家三口,小孩拿着烤玉米在座位上扭来扭去。林文远拿起最后一串鸡翅,咬了一口,已经凉了。

“连接池调高之后,有没有做过完整的回归测试?”

“做过一轮,没跑完就停了。方姐说赶上线,先上再说。”

“先上再说。”林文远重复了一遍这四个字,语调里没什么情绪,但陈昊听出了里面的分量。

“你觉得会出大事?”陈昊问。

“高并发场景下,连接池和密钥轮换频率必须匹配。”林文远用竹签在桌面上比划,“你这里拉高了连接数,那里又缩短了轮换周期,再加上一层自定义校验,相当于三个人共用一个水龙头,还要求同时出水温度恒定。不出问题只是运气好,交易量还没上去。”

陈昊的脸色白了几分。

“但我刚才问你自定义校验规则文档的时候,你为什么那个表情?”

“没什么。”陈昊摇头太快,像是早就准备好了这个回答,“就是觉得那文档写得太乱了,拿不出手。”

林文远看了他几秒钟,没再追问。他把最后一截鸡翅吃完,拿纸巾擦了擦手,起身去前台把账结了。陈昊要抢,被他一只手按回座位上。

“下次你请。”他说。

走出烧烤店时夜风带着凉意扑过来,吹散了身上的油烟味。林文远站在巷口等车,回头看了一眼,陈昊还坐在原位,透过玻璃窗看见他回头,摆了摆手。那手势软绵绵的,没什么力气。

回家的地铁上,林文远靠着车厢壁闭着眼,脑子里却在反复推演。连接池、密钥轮换、自定义校验层——这三样东西的叠加效应远不止陈昊说的那么轻描淡写。他想到一种可能,又觉得不至于,可那个念头一旦冒出来,就像一根细刺扎在指腹里,越拨越深。

到家时周晴已经睡了,卧室门虚掩着,透出一线暖黄的光。他在书房坐下,打开电脑,在空白文档上画了一张简易的架构图。三处改动的位置被他用不一样的颜色标出来,然后在旁边列了一组公式,计算并发场景下的资源竞争概率。

算到第三遍时,他的手指停在键盘上没再动。屏幕上那行数字明明白白:一旦并发量达到某个阈值,密钥轮换线程会和连接池释放线程争夺同一把锁,而自定义校验层没有做线程隔离——整套系统会在毫秒级内陷入死锁。不是渐进的性能下降,是瞬间全面停摆。

他靠在椅背上,盯着天花板看了很久。文档最上方还贴着赵总那份分红协议的扫描件,文件名是“签字确认版”。他移动鼠标,把那个文件拖进了桌面上的“工作”文件夹,然后回到架构图窗口,在死锁预测的那行公式旁边,打了一个问号。

要不要现在告诉方姐?

他想了三分钟。然后关掉文档,起身去厨房倒了一杯温水,站在阳台上喝完了。夜风从半开的窗缝里挤进来,带着楼下花坛里桂花的底味。他掏出手机看了一眼,方姐下午那条微信还悬在通知栏里,最后一句是“陈昊说那个源码逻辑对不齐,想再请教你半小时”。

他把那条消息往左一划,点了“标为已读”。屏幕暗下去,阳台外的城市灯火在里面映出一个小小的、模糊的倒影。

第十一章 方姐登门

方姐是周六下午来的。

林文远刚把阳台上的花浇了半壶水,手机就响了。方姐的声音还是老样子,不疾不徐,像在会议室里安排工作周报:“文远,我在你们小区门口,朋友送了点水果,顺路给你带一篮。你方便下来拿一下吗?”

顺路。从她家到这儿坐地铁要四十分钟,中间换乘两次。林文远没有拆穿,说了句“我下来接您”,挂了电话。他看了一眼卧室方向,周晴正在午睡,最近她总是睡不够,医生说临产前这是正常的。他轻手轻脚换了鞋,把门带上。

方姐站在小区侧门的梧桐树下,左手提着一个红色的水果篮,右手拎着一盒看着就不便宜的补品。她穿了件驼色针织开衫,妆容照旧一丝不苟,但眼下的细纹被粉底液卡出了浅浅的痕迹。看见林文远,她先笑:“这边绿化挺好,我看还有塑胶跑道,你平时跑步吗?”

“偶尔跑。”林文远接过水果篮,分量不轻,里面有车厘子和山竹。“方姐,上去坐坐吧。外面风大。”

方姐迟疑了半秒,点了头。

进门之后,林文远给她倒了杯温水,自己坐在单人沙发上,把主位让了出来。方姐四下看了看客厅,茶几上摊着几本育儿指南,墙角立着一个还没拆封的婴儿床包装箱,空气里有淡淡的消毒水味道。

“家里挺好的,收拾得利索。”方姐端起杯子喝了一口,“周晴呢?”

“在休息,就不叫她了,最近她容易累。”

“应该的,应该的。”方姐把杯子放下,手指在杯沿上摩挲了一圈。客厅里安静了几秒,只有冰箱压缩机嗡嗡的底噪。

“文远,我就直说了吧。”方姐把包放在膝盖上,坐正了身子,“原公司那边,赵总走之后项目乱了一阵,现在支付模块这块一直在补人。我的意思是,能不能请你回来做技术顾问,不用全职,每周来两个半天就行,月薪两万八。”

林文远没接话,低头看着自己放在膝盖上的手。两万八。比他在的时候多了整整一万,比陈昊当时也多两千。这个数字本身就很说明问题——方姐不是不知道他的价值,她一直都知道,只是以前不愿意给。

“顾问的形式,不坐班,时间你自己安排。”方姐补了一句,“主要是支付模块的一些遗留问题,你比谁都清楚,别人接手确实吃力。”

“方姐。”林文远抬起头,语气平静,“支付模块的并发测试做了没有?”

方姐的表情变了。那种变化很微妙,嘴角的笑意没来得及收回去,眉心却先皱了起来,像两张不同指令的纸条同时贴在她脸上。她愣了两秒,说:“你在的时候不是好好的吗?上线之后一直没出大问题,陈昊也一直在盯着。”

“陈昊盯的是业务逻辑,他不懂底层。”林文远的声音不高,但每个字都落得很稳,“那个模块的加密逻辑有个死锁。密钥轮换线程和连接池释放线程会争同一把锁,自定义校验层没有做线程隔离。第一次真正上量的并发压测就会暴露,只要交易量到六位数以上,系统会在毫秒级全面停摆。”

方姐的脸色一点点白下去。她张了张嘴,像是想用一句“不可能”把这句话顶回去,但没说出来。她放在膝盖上的手不自觉地攥紧了包带,指节发白。

“你那时候……怎么没提?”她的声音比刚才低了许多。

“我提过。”林文远说,“方案评审会那天,我写了三页的风险说明附在技术文档后面。但那次会议的重点是陈昊的客户沟通方案,我的文档排在最后一个,你说时间不够,让大家自己看。”

方姐的嘴唇动了动,没发出声音。客厅里安静得能听见卧室方向传来周晴翻身的细微响动。

“那个风险说明,现在还在共享盘里,名字叫‘支付模块压测风险预判-林文远’。”林文远没有用质问的语气,只是在陈述一个事实,“方姐,你现在请我回去当顾问,两万八也好,三万也好,解决不了根本问题。那个死锁不是我写出来的,我得说明白——是后来改架构的时候引入的。要修它,得先回滚三处改动,再做回归测试,前后至少两个月。”

方姐把包带攥了又攥,忽然松开手,像下了一个很大的决心。“文远,你能不能……先帮我们看一眼,就看一下。我不要求你马上答复我,哪怕给我一个方向。”

她的声音里带上了某种林文远很少从她身上听到的东西。着急,但又强行压着,像锅盖下面已经沸了的水。他想起三年前刚进公司那会儿,方姐手把手教他写第一份立项报告,晚上加班还请他吃过一碗牛肉面。那时候的她还不会说“你在的时候不是好好的”这种话。

“方向我可以给你。”林文远说,“第一,立刻停止所有压测和灰度发布。第二,把陈昊改的那三处架构变更写成文档发给我,我帮你们标出来问题在哪。但顾问的事,方姐,我不回去了。”

“文远——”

“我现在有自己的项目要带,也有家人要陪。”他说得很慢,但语气像一扇关上的门,没有留缝隙,“您把变更文档整理好发我邮箱,我抽空看完给你们一个修复路径。费用的事不用提,就当是同事一场。”

方姐坐在沙发上,腰背比进门时塌了一截。她沉默了很久,最后从包里摸出一张名片放在茶几上,名片背面用圆珠笔写了一行字——是她私人的邮箱地址。

“那……我等你的消息。”她站起来,拿起包,走到玄关时回头看了一眼那篮水果,“车厘子别放太久,周晴现在吃正好。”

林文远送她到楼下,看着她上了出租车。车子汇入主路时尾灯闪了两下,像某种迟疑的信号。他站在原地,手插进口袋,摸到了那张名片的一角,硌着指腹。

上楼推开门,周晴已经醒了,靠在卧室门框上,睡眼惺忪地看着他。“有人来了?”

“方姐,送了点水果。”

“她来干嘛?”周晴走过来,从篮子里捏了一颗车厘子放进嘴里,“嗯,挺甜的。”

“想让我回去做技术顾问,月薪两万八。”林文远把那张名片从口袋里掏出来,放在玄关的置物架上。

周晴嚼车厘子的动作停了一下,然后继续嚼完,咽下去。“你怎么说的?”

“我说不回去,但可以给一份修复路径。”他走到她身边,把手轻轻搭在她后腰上,“免费的。”

周晴偏头看了他一眼,嘴角弯了弯。“亏了。”

“嗯,亏了。”他也笑了,“但睡得着觉。”

窗外梧桐叶被风翻动,哗啦啦响成一片。茶几上那张名片的边角翘着,背面的圆珠笔字迹在午后的光线里泛着淡淡的蓝。林文远扶着周晴在沙发上坐下,自己去厨房洗了一盘车厘子端过来。她挑了一颗最大的塞进他嘴里,酸甜的汁水在牙齿间炸开。

手机屏幕亮了一下,是陈昊发来的消息:“方姐找你了吧?她刚回办公室,脸色特别差。”

林文远把手机翻了个面扣在茶几上,没回。周晴靠在他肩膀上,温热的呼吸拂过他的衣领。窗外桂花香从纱窗缝隙里渗进来,和车厘子的甜味混在一起,像这个秋天最后一点不着急的时光。

第十二章 一张纸的份量

第二天上午十点,方姐比约定时间早到了半小时。这回她手里多了一个牛皮纸文件袋,鼓鼓囊囊的,放在茶几上时发出纸张摩擦的闷响。林文远给她倒了杯温水,她没喝,直接把文件袋解开,抽出三页装订好的A4纸。

“公司法务连夜拟的。”方姐把文件推过来,手指按在纸面上,“你看看,主要就是技术协助协议的框架,具体条款可以商量。”

林文远接过来,逐字逐句看得很慢。协议核心内容有两条:一是聘请他担任“外部技术顾问”,服务周期三个月,按月支付酬劳,总金额五万元;二是要求他对“协助过程中知悉的支付模块相关技术细节”承担保密义务,不得向第三方披露,包括但不限于现雇主、行业媒体、技术社区。

他的目光在第二条上停了停。措辞很讲究,用的是“知悉”,而不是“修复”——等于说他不光是修,连看一眼的资格都被框进了封口协议里。

“方姐,这个保密义务的范围太大了。”他把第二页翻过去,指着最后一段,“支付模块的底层架构是我在职期间主导设计的,按行业惯例,我对自己原创的技术方案享有署名权和合理引用权。这份协议等于让我放弃对自身工作成果的基本权利。”

方姐的指尖在膝盖上敲了两下,语气软下来:“文远,这是法务的模板,我特意让他们加了一条——顾问费之外,公司额外支付两万元作为‘技术咨询专项补贴’,加起来七万。你就当帮老东家一个忙,签个字,把参数给我们标出来就行。”

林文远翻到最后一页。签名栏上方有三行备注,其中一行写着“本协议不构成劳动关系认定依据”,另一行写着“乙方确认所提供的技术指导为独立咨询服务”。他的目光往下移,突然停住了。

最后一页背面粘了一张纸,用回形针别着。他翻过来一看,是一张空白推荐信,抬头印着原公司的logo,落款处已经盖好了公章,只差填写推荐内容和被推荐人姓名。

“这是……”他抬头看方姐。

方姐端起水杯喝了一口,终于露出了进门以来第一个松弛的笑。“你签了协议,这封推荐信我帮你写。你知道的,文远,行业里背书很重要。你在新公司刚起步,有一个前东家的高层推荐,以后不管是内部晋升还是外部机会,都是加分项。尤其你们那行,圈子小,口碑传得快。”

她把水杯放下,声音放得更轻了些:“而且你想想,支付模块的修复思路是你首创的,将来要是有同行遇到类似问题,你总不能一个个免费讲吧?有了这封推荐信,你在行业里的专业形象就立起来了。七万块钱,加上我亲自给你写推荐,这个诚意,放在外面是找不到的。”

林文远把推荐信翻回正面,对着那张空白表格看了几秒。表格分五栏:被推荐人姓名、职务、推荐事由、具体评价、推荐人签名。每一个空格都是空的,像一条没写地址的信封,谁都能往里塞东西。

他把推荐信放回最后一页,连同协议一起推回方姐面前。

“方姐,推荐信我收下你的好意,协议我不能签。”

方姐的笑容僵了一瞬。

“加密逻辑的核心参数,我在离职文档里标注过。”林文远的语气很平,“文档的修订记录能看到,最后一版是我走之前三天上传的,路径在共享盘‘项目归档-支付模块-技术说明’下面。文件名就叫‘加密逻辑参数与风险预警-林文远’。如果陈昊改架构之前看过这份文档,他不会踩进死锁陷阱。”

方姐的眉心拧成一个结。“你的意思是……陈昊没看?”

“我不知道他看没看。”林文远摇头,“我只是陈述一个事实:那份文档存在,里面写清楚了哪些参数不能动、哪几个并发场景必须回归测试。如果现在要修,不需要我签字,也不需要什么保密协议。打开文档,找到我标红的三个参数,回滚到原始值,做一次全链路压测,问题就能定位。”

方姐沉默了好一会儿,手指反复摩挲着协议纸的边缘,像是要把它搓出毛边来。她终于开口,声音压得很低:“文远,公司的情况比你想象的复杂。陈昊现在说……当初改方案是经过你同意的。”

林文远没有立刻接话。客厅里安静得能听到窗外风穿过梧桐枝桠的簌簌声。过了一会儿,他站起身,走到书房,从抽屉里翻出一个旧U盘,插在笔记本电脑上。屏幕亮起来,他打开一个文件夹,里面是十几份版本归档文件,每一份都有精确到秒的时间戳。

“方姐,你过来看。”他把屏幕转了个方向。

方姐犹豫了一下,还是走过来。屏幕上是一封邮件截图,发送时间是去年十一月十七日晚上十一点四十三分,收件人是方姐本人,抄送陈昊,主题是“支付模块V2.3架构变更风险评估”。正文只有三行字:附件是变更后的回归测试报告,三项高风险项未通过,建议暂缓发版。附件列表里赫然列着那份“加密逻辑参数与风险预警”文档。

“这封邮件你收到了。”林文远的声音没有起伏,“如果陈昊说是我同意的,你可以查这封邮件的回复记录。方姐,你当时没有回。”

方姐盯着屏幕,脸上的血色一点点褪下去。她张了张嘴,手指无意识地攥住了沙发扶手,指节泛白。她显然记得那封邮件,或者至少记得那个时间点——项目赶着上线,陈昊的客户演示迫在眉睫,所有的压力都压在她身上。

“我……”她只说了一个字,就停住了。

“所以这份协议我不能签。”林文远把U盘拔下来,合上电脑,“参数就在文档里,谁都能看。你让陈昊自己打开看一遍,如果他还看不懂,我可以免费讲十分钟。但推荐信也好,顾问费也好,方姐,这些东西买不走我对自己工作成果的判断权。”

他走到玄关,把门拉开。楼道里的穿堂风吹进来,带走了客厅里沉闷的空气。

方姐慢慢站起来,把协议和推荐信收进文件袋。她的动作很慢,像是每一个折纸的动作都在消耗力气。走到门口时,她停下脚步,侧过脸看了林文远一眼。

“你变了。”她说。声音很轻,没有指责的意味,倒像是某种复杂的感慨,像是确认一件她不愿承认的事。

林文远没有接话。方姐等了两秒,见他没反应,便低头走进电梯。电梯门合上的瞬间,他看到她抬手抹了一下眼角。

关上门,林文远靠在门板上长长吐了口气。胸口没有他预想中的畅快,也没有愧疚。周晴从卧室走出来,手里拿着一件他的外套。“她走了?”

“走了。”

“协议没签?”

“没签。”

周晴把外套递给他,什么也没问。她转身去厨房,端出一碗刚热好的小米粥放在餐桌上。粥面上飘着几粒枸杞,红得透亮。林文远坐下来,舀了一勺送进嘴里,温热的米汤从喉咙滑进胃里,熨帖得让人想叹气。

手机屏幕亮了。赵总发来一条微信,只有一句话:“下周三方案评审,你主讲。团队那边如果有不配合的,直接来找我。”

林文远回了一个“收到”,把手机扣在桌上。他抬头看见周晴正歪着头看他,眼神里有一种安静的笃定。

“看什么?”

“看我老公。”周晴走过来,从背后环住他的脖子,下巴搁在他肩上,“没签就对了。那点钱,买不走你的本事。”

窗外梧桐叶落了满地,被风卷着打着旋儿,在柏油路面上发出细碎的沙沙声。阳光从云层后面透出来,在客厅地板上铺了一层暖融融的金色。林文远拍了拍周晴环在他脖子上的手,把最后一口小米粥喝完。

碗底干干净净,能照见人影。

第十三章 压测警报

压测警报是在周四下午三点十七分拉响的。

林文远正在新公司的会议室里和技术团队过一份接口文档,手机屏幕朝下扣在桌面上,震了三下。他没动。又震了两下,然后是连续不断的震动,像一只被困住的蜂在玻璃板上扑腾。坐在对面的老周抬眼看了看他,林文远微微摇头,把文档翻到下一页。

会开到五点结束。他拿起手机,锁屏界面上叠了十一条微信预览,全部来自一个叫“支付系统应急群”的群聊。这个群他本该在离职当天就退出的,但陈昊后来把他又拉了回去,理由是“万一有历史遗留问题可以请教”。他当时没多想就点了同意,现在看着屏幕上那些跳动的消息,忽然觉得这个“万一”来得有点太快了。

他没有点开群聊,先划到了陈昊的私聊窗口。最新一条消息是下午四点零九分发的,只有八个字:方姐被上面骂哭了。上一条是语音,转文字后显示“压测脚本跑了两分四十七秒就全面死锁了,现在整个测试环境起不来”。再往上翻,是陈昊连发的三条:“你那个文档里写的加密参数到底原始值是多少”“方姐说联系不上你”“文远,兄弟,回个话”。

林文远锁了屏,把手机装进口袋。他走到工位,收拾了笔记本和充电器,跟团队里还在加班的小刘打了声招呼,坐电梯下到地下二层。停车场里空荡荡的,日光灯发出嗡嗡的低鸣。他在驾驶座上坐了一会儿,没发动车子,只是看着挡风玻璃上自己的倒影。

他问自己:你在干什么?

答案很清晰——他什么都没干,这恰恰是他此刻最该做的事。可他脑子里已经开始运转了。三分钟全面死锁,测试环境起不来,这意味着加密逻辑的参数偏移量已经超出了线程池的容错阈值。陈昊当初把迭代轮次从十六轮砍到八轮,又把超时阈值从三秒调到了八百毫秒。当时他在邮件里写得很清楚:八百毫秒在高并发场景下会导致密钥协商超时,进而触发死锁链。方姐没回那封邮件,陈昊在评审会上当着他的面说“测试环境跑得好好的”。

现在测试环境挂了。

他发动车子,空调吹出的冷风扑在脸上。开到小区楼下时他没有立刻熄火,从副驾的公文包里摸出一张A4纸和一支签字笔,垫在方向盘上开始写。

方案一:参数回滚。最直接,也最安全。把迭代轮次恢复到十六轮,超时阈值改回三秒,全链路压测跑一遍,问题应该能在半小时内定位。代价是吞吐量会下降约百分之十五,但交易成功率能拉回百分之九十九点五以上。他写了一个关键词:立即可用。

方案二:异步降级。保留现有参数,在加密模块前加一层消息队列做削峰填谷,把同步调用改成异步消费。这个方案能维持吞吐量,但改造量大,至少需要三天。而且有一个前提——线程池的堆积策略必须从“拒绝”改为“阻塞等待”,否则消息队列本身会成为新的瓶颈。他在这里画了个星号,旁边标注:需要验证。

方案三:密钥轮换提速。把固定时间窗口的密钥池从四个扩到十六个,以降低单个密钥的协商压力。这个方案不用改代码逻辑,只需调整配置,半小时能上线。但它治标不治本,流量再翻一倍还会死锁。他写了个备注:最多撑两次营销活动。

三个方案写完,A4纸已经用了大半面。他盯着字迹看了十几秒,把纸折了两折,塞进公文包的内层夹袋。熄火,上楼。

推开家门的时候,周晴正靠在沙发上,一只手撑着腰,另一只手攥着手机。她的脸色有点发白,看到他进来,扯了扯嘴角算是笑了一下。“你回来了。”

“怎么了?”林文远把公文包放在玄关柜上,快步走过去。

“胎动有点频繁。”周晴把手机放下,另一只手在肚子上轻轻抚着,“从下午开始就一直踢,刚才数了一下,一小时动了快二十次。”

林文远蹲下来,把手贴在她隆起的腹部。掌心下传来一阵轻微的蠕动,像小鱼在很深的水底翻身。隔了几秒又是一下,比刚才更有力,顶得他的手掌微微弹起。

“去医院。”他站起来就要拿外套。

“等一下。”周晴拉住他的手腕,“我先给产检医生打个电话问问。你别急。”

电话接通后周晴简单说了情况,对面医生问了几个问题,最后说胎动频繁在这个孕周属于正常波动,但建议今晚左侧卧位多休息,如果伴随腹痛或者见红再立刻去急诊。周晴挂了电话,冲林文远点点头:“医生说没事,先观察。”

林文远在她身边坐下,手没有从她肚子上移开。周晴侧过头看他:“你今天回来脸色不对,公司那边怎么了?”

他犹豫了一瞬,还是说了:“原公司支付系统压测死锁了,整个测试环境瘫痪。”

周晴没有立刻接话。她的手覆在他的手背上,掌心温热。“方姐找你了?”

“群里发了语音,陈昊私聊我。我没回。”

“你想到办法了?”

林文远沉默了两秒。“三个方案。都写在一张纸上了。”

周晴看着他的眼睛,目光很平静。“那张纸现在在哪?”

“公文包里。”

“那就让它待在公文包里。”周晴把他的手掌按在自己肚子上,里面又动了一下,这次很轻,像是翻了个身,“文远,你听。她动得多欢。你女儿在提醒你,今晚你哪儿都不用去,就在家待着。”

林文远反手握住她的手。掌心贴掌心,能感觉到彼此的温度。他想起下午在会议室里手机震动的那十几秒,想起地下停车场里在方向盘上写方案的自己,又想起此刻掌心里那个微小而确定的跳动。他忽然觉得那张A4纸上的三个方案不再像鱼刺一样卡在喉咙里了。它们还在,但它们可以等。

“我去把那张纸锁起来。”他站起来,从公文包里取出那张折好的A4纸,走进书房,拉开最下面那层抽屉,把纸放进去,又拿钥匙拧了两圈。抽屉里还有那个装着版本归档文件的旧U盘,和那封邮件的打印稿。他看了它们一眼,关上抽屉,把钥匙放在书架最上层的文件夹后面。

回到客厅时,周晴已经侧躺在沙发上了,按照医生的嘱咐左侧卧位。林文远在她面前蹲下来,额头抵着她的额头。

“给赵总发个消息,说下周方案评审的文档我明天交。”周晴闭着眼睛说。

“你怎么知道我在想这个?”

“因为方案评审是你的正事,原公司那边是别人的事。”周晴睁开一只眼看他,“你分得清。”

他笑了。这是今天他第一次笑。窗外夜色已经完全沉下来了,远处高架上流动的车灯在窗帘缝隙里拉出一道道橙红色的光带,又迅速消失。手机又震了一下,他没看。茶几上周晴喝了一半的温水还冒着若有若无的热气,电视柜上摆着他们上周刚买的一对婴儿小袜子,一只蓝色一只黄色,叠在一起像两朵安静的花。

他在心里默默过了一遍三个方案的优先级,然后把它们推到脑海最深处。今晚只有一件事:守着这娘俩。

第十四章 赵总的远见

林文远是被手机闹钟叫醒的。他睁开眼,发现自己不知道什么时候在沙发上睡着了,身上盖着一条薄毯。周晴已经坐起来了,靠在沙发另一头,手里拿着他的手机,正对着屏幕皱眉。

“赵总给你发了消息。”她把手机递过来,“六点四十发的,那会儿你刚睡着没一会儿。”

林文远揉了揉脸,接过手机。赵总的消息很短:明天上午十点,来我办公室一趟,有件事跟你聊聊。

他回了一个“好的”。周晴已经站起来往厨房走,拖鞋踩在地板上发出细碎的声响。他注意到她的步子比昨天稳了一些,可能是昨晚休息得不错。

“早餐想吃什么?”周晴打开冰箱问。

“我来吧,你再躺一会儿。”

“医生说左侧卧位是缓解胎动频繁的姿势,又没说不能做早饭。”周晴回头冲他笑了一下,脸色比昨晚好了很多,“你去洗漱,煎两个鸡蛋,热杯牛奶就行。”

林文远走进卫生间,拧开水龙头。冷水扑在脸上的时候,他在镜子里看到自己眼睛底下有一圈淡淡的青色。昨晚在沙发上没睡踏实,脑子里反复转着两件事:一个是原公司支付系统压测死锁的报道,另一个是他自己写在新公司方案评审文档里的那个高并发架构。两件事像两条平行轨道上的列车,各自轰隆向前,互不交叉。

他擦干脸走回客厅,周晴已经把煎蛋和牛奶摆上桌了。两人面对面坐着吃早饭,电视没开,窗外是初冬早晨灰白色的天光。

“昨晚又动了没?”林文远问。

“后半夜消停了。”周晴用叉子切着煎蛋,“你倒是翻来覆去的,我摸你额头还以为你发烧了。”

“我在想赵总找我什么事。”

“去了就知道了。”周晴把牛奶推到他手边,“我产检约的下午两点,你要是能抽空就过来,抽不了空也没事,我妈说她陪我去。”

“能抽空。”

周晴看了他一眼,没再说话,低头继续吃煎蛋。她知道他说的“能抽空”是真的,从恋爱到结婚,林文远答应的事没有一次落空过。这也是当初她选择他的原因之一,在所有人都急着往前跑的时候,他是那个愿意停下来确认她鞋带有没有系好的人。

九点四十分,林文远到了公司。他在工位上打开新项目的架构文档,又翻到昨天标注的那几处性能瓶颈,用二十分钟把方案评审的要点在脑子里过了一遍。九点五十五分,他起身往赵总办公室走。

赵总的办公室在走廊尽头,门通常开着。林文远走过去的时候,赵总正在打电话,看到他抬手示意进。

“对,让他们把压测报告发过来,全量数据,别只给摘要。”赵总对着电话说,语气不急不缓,“对,今天下班前。好,就这样。”

挂了电话,赵总把手机扣在桌上,抬手让林文远坐。

“新项目上手怎么样?”赵总先问。

“架构摸清楚了,有个高并发场景的方案我调整了一版,下周一评审。”

赵总点点头,手指在桌面上轻轻点了两下。“我昨天收到一个消息,原公司支付系统出了点问题。他们压测挂了,你知道吧?”

林文远没有回避:“知道。前天的事。”

“方姐联系你了?”

“联系了。”

赵总靠在椅背上,看着林文远的眼神里带着一种很淡的笑意,像在看一道思路巧妙的算法题。“她怎么说的?”

“问参数。我还没回。”

赵总从桌上拿起一份文件,翻了两页又合上。“文远,我不兜圈子。原公司那边托人找到我,想通过我们公司做技术咨询,付费的。我看了他们的问题描述,心里有数,这个局面只有你能收。”

林文远没有说话。

“你不用现在答复。”赵总把文件推到桌子中间,“我只问你一件事,你想不想接?”

林文远看着那份文件,纸面上只露出一个标题和几行摘要,能看到“支付通道”“交易死锁”几个词。他的目光在纸页边缘停了两秒,然后抬起来对上赵总的眼睛。

“赵总,我只想在新项目上多花时间。”

办公室里安静了一瞬。窗外传来电梯到达的提示音,隔着一道走廊两道玻璃,听起来闷闷的。赵总没有立刻回应,而是拿起桌上的茶杯喝了一口,杯盖磕在瓷沿上,清脆的一声。

“好。”赵总放下茶杯,“那我就不安排对外接口了。他们的事让他们自己想办法。”

林文远点头。

赵总话锋一转:“新项目那边,核心模块的方案评审提前两周,能完成吗?”

两周。林文远在心里快速拆解了一下:架构图已经画完了,剩下的时序设计和压测方案可以压缩,但需要团队配合加班。他手下那五个人里,有两个还对他空降这件事带着观望态度,前天开会时那个叫孙磊的资深工程师全程没有发言。

“能。”他说。

赵总看了他几秒,然后笑了。那个笑容里有一种很直接的东西,是林文远在方姐脸上从来没有见过的——不是满意,更像是确认。确认他没看错人。

“方案评审放在这周五上午。”赵总拿起笔在便签上写了个日期,撕下来递给他,“团队你自己协调,需要资源跟我说。”

林文远接过便签,折好放进衬衫口袋。他站起来的时候,赵总又说了一句:“文远,新项目的产品定位是行业标杆,做成了,你在业内的位置就不一样了。”

“明白。”

他走出办公室,轻轻带上门。走廊尽头的落地窗外是这座城市的天际线,几栋玻璃幕墙的高楼在薄雾里泛着冷灰色的光。他摸出手机看了一眼时间,十点二十七分。周晴的产检是下午两点,从这里开车去医院不堵的话四十分钟。他可以先回工位把周五评审的框架发给团队,再赶过去。

走回工位的路上,他经过茶水间。有人在里面冲咖啡,速溶咖啡粉的气味飘出来,混着热水器咕噜咕噜的声响。他的脚步慢了半拍,但紧跟着又恢复了原来的步幅。那个茶水间里的工资条已经翻篇了,现在的战场上,他要拿的东西比一张纸上的数字大得多。

坐到工位上,他打开团队群,发了一条消息:周五上午核心模块方案评审,提前两周,今天下午四点半会议室碰一下分工,把各自手上的进度过一遍。

孙磊第一个回了收到,后面跟着另外三个人的收到。林文远看着屏幕上整齐排列的回复,手指在键盘上停了一下,又打了一行字:评审材料我今晚整理好发群里,大家先看,有异议会上直接提。

发完消息,他点开新项目的架构文档,在核心模块的时序图上继续标注。屏幕上的方块和箭头安静地铺展开来,像一张等待被验证的图纸。他喜欢这种安静,喜欢一切还在自己掌控中的感觉。

桌角的手机亮了一下,是周晴发来的:下午见。后面跟了一个微笑的表情。他回了一个好,然后把手机翻扣在桌面上,继续工作。

十一点四十分,他把周五评审的框架发到了团队群。十二点整,他收拾东西起身,拎着公文包走出工位。经过前台的时候,行政的小姑娘正在拆一箱新到的绿植,看到他打招呼说“林哥出去啊”。

他点头笑了一下,推开玻璃门。走廊里的空调暖风迎面扑来,吹动他衬衫的衣角。电梯下行的时候他看了一眼手机,没有任何新消息。原公司的那个技术群他还是没有退,但已经设置了免打扰。群里最后一条消息停在昨晚十一点,方姐发了一句:明天再想办法。

他没有回复,也没有往下翻。电梯到了一楼,门打开,外面是初冬正午的日光,淡淡地铺在写字楼前的广场上。他迈步走出去,步子很稳。

新项目在等他。女儿也在等他。

第十五章 高并发下的淬炼

周五早上七点四十分,林文远就到了公司。

会议室里白板上还留着昨天下午讨论的痕迹,几张便利贴歪歪扭扭地粘在边缘。他把笔记本电脑接上投影,打开压测报告初稿,屏幕的光映在他脸上,眼底有淡淡的青色。这三天他总共睡了不到八个小时,最长的一觉是在工位上靠着椅背眯了四十分钟。

周二晚上的分工会上,他把核心模块拆成三个子系统,孙磊负责订单链路、另外两个同事分别负责支付通道和对账服务,他自己啃最硬的分布式事务一致性。当时孙磊没说什么,只点了一下头,表情看不出态度。

周三一整天,孙磊那边进度很快,代码提交记录一条接一条,看起来顺畅。但到了周四下午联调,问题全冒出来了。

订单创建成功,支付回调超时;支付成功回调,订单状态又没更新。两边各自跑单测都没问题,一串联就出现数据不一致的间隙。林文远在监控面板上盯了半个多小时,确认是分布式环境下事务隔离级别和消息重试机制在不同节点之间的时间窗口产生了冲突。

这个问题他在原公司主导支付模块时就遇到过类似的变种,但新项目的并发量级高出好几倍,原来的方案直接搬过来行不通。

周四晚上的方案讨论会上,他把分析结果投在屏幕上,用红笔圈出了三个关键路径。孙磊坐在长桌另一端,双手抱在胸前,嘴角绷着一条向下的弧线。林文远讲到补偿事务的幂等设计时,孙磊忽然把手中的签字笔往桌上一搁,声音不大,但在安静的会议室里格外清晰。

“你那个架构理论上跑得通,但在这个并发量下,补偿逻辑的延迟会拖垮整个链路。”孙磊抬起头,目光直视他,“我做过类似的项目,这条路走不通。”

会议室空气凝了一瞬。另外三个同事不约而同地看向林文远。

林文远没有立刻接话。他把激光笔收进口袋,回到第一页,调出一张空白时序图,在上面快速画了几笔。“你担心的是TCC补偿链路过长,”他说,语速和平常一样,不快不慢,“我在原来的项目里遇到过同样的问题,当时的并发量是这里的三分之一。”

孙磊皱起眉:“所以呢?”

“所以我把补偿逻辑做了分层,”林文远在图上加了一条纵向的线,把事务拆成两段,“第一段保证最终一致性,第二段做异步补偿,通过消息队列削峰。原来的方案在低并发下确实会积压,但现在我们把补偿窗口压到毫秒级。”

孙磊盯着屏幕,手指在桌面上无意识地敲了两下,没有说话。

“沙箱环境跑一百轮压测,”林文远说,“数据出来再下结论。今晚我改方案,明天早上八点我们把两台并行环境同时开跑。”

孙磊沉默了几秒,最后点了一下头,幅度很小,但确实是点了头。

那一夜林文远没有回家。周晴发来消息让他注意身体,他回了句“忙完就回”,然后把手机翻扣在桌面上。屏幕亮了几下,他没有再看。

周五凌晨四点,他把改完的方案推到沙箱环境里,启动了一百轮循环压测脚本。进度条一格一格地走,他在旁边椅子上坐下来,把外套裹紧了一点。中央空调到了后半夜会调低功率,室温降了两度,他打了个哈欠,闭上眼睛。

再睁开眼是六点出头,屏幕上的压测报告已经跑完了。他滚动鼠标看了几分钟,然后在团队群里发了一条消息:数据跑完了,大家提前二十分钟到,我们过一遍。

八点整,五个人围在会议室屏幕前。林文远把一百轮压测的结果投出来:前三轮数据波动明显,从第四轮开始趋于稳定,第四十轮之后偏差值收敛到千分之三以内,到第八十轮时,补偿窗口的中位数是原来的六分之一,峰值没有超过阈值线。

“千分之三,”孙磊盯着屏幕上的曲线,声音比平时低了些,“在那个并发量下,这个偏差是可以接受的。”

林文远点头,没接话。

孙磊转过脸来看他,眼神和昨天完全不同,像是有什么东西在内部被重新排列了。他的喉结动了一下,然后说:“林哥,昨天我说那条路走不通,是我经验主义了。数据我看完了,你那份补偿方案确实比我的思路更适合这个场景。抱歉。”

会议室里安静了一拍。另外三个同事互相看了一眼,其中一个低下头笑了一下,像是终于确认了什么。

林文远合上笔记本电脑。“不用道歉,”他说,“你的顾虑是对的,只是这次数据站在另一边。方案通过,今天开始进入开发阶段,我整理一份详细的任务拆分发群里,大家各自认领。”

散会后孙磊走在最后,在走廊里快步赶上来,递给他一瓶水。“林哥,”他顿了顿,“之前看你空降过来,我以为又是那种只会画PPT的。今天我收回这个想法。”

林文远接过水,拧开喝了一口。“你之前的项目经验帮了大忙,”他说,“方案里那个补偿窗口的分段阈值,是你昨天提出的思路,我用上了。”

孙磊愣了一下,然后笑了。那种笑是真正放松下来的笑,眉毛和眼角一起舒展开,像是卸掉了一层壳。

林文远回到工位,打开手机,屏幕上跳出来周晴的消息,发送时间是凌晨一点十二分。他点开,是一张B超照片。黑白的影像里,一个小小的轮廓蜷缩着,头部、四肢都已经清晰可辨。下面跟着一行字:医生说一切正常,你安心忙,我和她等你回家。

他把照片放大看了两遍,指腹在屏幕上轻轻擦了一下,像是想碰一碰那个轮廓。然后他把手机放下,继续敲代码。

下午两点,任务拆分文档发下去了。三点半,他写完核心事务模块的伪代码,靠在椅背上闭了会儿眼。他梦见自己在改一段死循环的代码,变量名全变成了陌生的符号,他一个一个地追踪、替换,最后那个循环终于退出了,屏幕上跳出一行绿底白字的提示,写着什么他来不及看清。

有人敲了敲他的工位隔板。他睁开眼,是隔壁组的同事,提醒他下午五点的项目协同会。

“知道了,谢谢。”

他站起来,去洗手间洗了把脸。镜子里的人眼窝深陷,下巴上冒出一层青色的胡茬,但目光是亮的。他擦了擦脸上的水珠,走回工位,拿起笔记本向会议室走去。

手机又亮了一下,还是周晴:你睡醒了没?他回了一个“醒了”加一个笑脸。然后他把手机收进口袋,推开了会议室的门。

第十六章 旧系统崩塌

周五早上八点四十三分,林文远正在新公司的三楼会议室里做项目复盘。

投影幕布上是一张甘特图,他手里握着激光笔,讲到关键路径的依赖关系时,口袋里的手机震了一下。他没看。五分钟后连着震了三次,间隔很短,像是对方在反复拨号。他把手机调成静音,继续把剩余的五个风险点讲完。

会议在九点二十七分结束。他收拾好笔记本走出会议室,在走廊里掏出手机。

十三个未接来电,全部来自方姐。最近一个是九点二十一分,两分钟前。

微信上有十七条未读。他点开。最上面几条是方姐发来的语音,他转成文字:文远,支付模块出问题了,你方便接电话吗?文远,系统现在卡死了,整个交易链路全部阻塞。文远,你在不在?看到回一下,很急。

往下翻,是一段长消息。

文远,公司的支付系统今天早上八点整开始出现大面积超时,到现在已经全面死锁。外包团队排查了两个小时,找不到具体故障点,数据库连接池被打满了,交易流水全部堆积。技术那边说可能是分布式锁的释放逻辑有问题,但没人能定位准确参数。我知道你恨我,但能不能看在共事一场的份上,帮我看一眼架构层面的问题。哪怕是提个方向也行。现在客服电话被打爆了,已经有人把截图发到社交平台上了,公司高层在追责。

消息最后没有句号,像是发出来的时候还在犹豫要不要发。

林文远站在走廊尽头的玻璃窗前,楼下车流缓慢移动,阳光打在对面写字楼的幕墙上,反射成一片碎金似的光点。他盯着那段文字看了一会儿,指腹沿着手机边缘来回滑了一下。

他点开第二个未接来电记录,犹豫了半秒,没有回拨。然后把手机放回口袋,走回工位。

电脑屏幕上还开着昨晚跑压测的日志窗口,绿色的成功标记一排排往下延伸。他点开浏览器,在搜索框里输入了原公司产品的关键词。第一条结果是他们的官方页面,正常。第二条是社交平台上的用户发帖,配图是一张报错截图,配文写着“客服电话打不通,订单卡在支付中,钱到底扣了没有”。下面的评论已经有两百多条,有人晒出重复扣款的银行短信,有人贴出客服自动回复的截图。热度还在往上涨。

他又点开行业论坛,首页飘着一个帖子,标题是《某支付系统今晨大面积故障,疑似架构设计缺陷》。他没点进去。

手机又亮了。方姐的第十八条消息,这次只有一句话:文远,求你了。

林文远靠在椅背上,双手交叉放在腹部,盯着天花板上的灯带看了十几秒。灯管有一截轻微闪烁,频率不规律,他看着看着就走了神。

过了一分钟左右,他把手机解锁,翻出和周晴的对话框。他把方姐那段长消息截图发了过去,然后打了一行字:你怎么看。

周晴回得很快,像是手机就握在手里。

她问:你现在忙不忙?

他说:刚开完会,手头的事可以往后推一推。

周晴那边显示“正在输入”,持续了将近半分钟,最后发过来的只有五个字:你自己决定。

又过了几秒,跟了第二条:不管你做什么决定,我都支持。但你要是帮,就大大方方帮,帮完就放下,别把自己绕进去。

林文远盯着这两条消息,喉咙里涌上来一股说不清的酸涩。他打了一个“好”字发过去,然后把手机翻扣在桌面上,拿起桌上的水杯喝了一口水。水是凉的,从喉咙一路凉到胃里。

他知道方姐为什么找他。当初他主导设计那套支付架构的时候,在分布式事务的处理上留了一条退路,异常情况下降级到异步补偿模式,这条逻辑写在技术文档的第十九页,只有他和陈昊知道具体位置。那份文档后来被陈昊改动了大半,但降级开关的触发条件大概率没动,因为陈昊根本没吃透整条链路。

他闭上眼,脑子里过了一遍那套架构。加密逻辑、补偿窗口、事务一致性保障,每一个参数都清晰得像刻在大脑皮层上。他当初花了四个月搭建这套系统,每一条链路都亲手测过,每一个边界条件都反复推演过。当时方姐在项目总结会上说“这是团队共同努力的成果”,他认了,因为那时候他以为努力会被看见。

后来他知道了,看见和承认是两回事。

他睁开眼,把椅子转回来,打开了新项目的技术文档。屏幕上的代码整齐排列,是他上周刚重构过的事务模块。他扫了两行,然后停住,手指悬在键盘上方。过了几秒,他把文档最小化,新建了一个空白的编辑器窗口。

他在窗口里敲下第一行注释:降级触发条件复现。

然后他开始写伪代码。分布式锁的获取与释放逻辑、补偿事务的回滚边界、连接池的超时回收参数、异步队列的积压阈值。他一边写一边在脑子里对照原系统的架构图,把每一个可能出现死锁的节点标注出来。写到第四十七行的时候他停了一下,在注释里写了一句话:如果连接池最大等待时间没有异步切换机制,超时线程会全部阻塞在锁竞争上。

他盯着这行字看了几秒,然后继续往下写。

十点五十六分,周晴发来一张照片,是她在家里阳台上拍的,楼下的花坛刚浇过水,月季开得正红。她说:今天阳光很好,你中午记得吃饭。

他回了一个“好”字,然后把编辑器里的内容复制到文档里,关了屏幕。

手机又亮了。方姐的第十九条消息:文远,我打听到你在新公司负责的项目刚好涉及同类架构,你如果有空看一眼,我把技术群里的报错日志转给你。

他没有回复,也没有拉黑。他把手机拿起来,看着方姐的号码在屏幕上亮了一秒,然后暗下去。窗外有片云遮住了太阳,走廊里的光线暗了一格。

他站起来,走到饮水机前接了一杯热水,慢慢喝了两口。水有些烫,热气扑在脸上,他呼了口气。回到工位时,他顺手打开团队群,孙磊发了一条新消息:林哥,核心事务模块的单元测试覆盖率今天能到百分之七十五,你昨天说的那个边界场景我已经补上测试用例了。

他回了一个“收到”,然后加了一句:下午三点碰一下接口定义。

发完消息,他把那个空白编辑器窗口重新打开。光标在“降级触发条件复现”这行注释后面安静地闪烁着,像一颗耐心等待的心脏。他看了看屏幕右下角的时间,十一点零三分。

他拿起手机,给周晴发了一条消息:我中午回去陪你吃饭,想吃什么我顺路买。

然后他把手机收进口袋,把编辑器窗口关掉,站起身。经过孙磊工位的时候,他拍了拍隔板:“下午聊。”孙磊抬起头冲他笑了笑,比了个没问题的手势。

他走进电梯,按下一楼。电梯门合上的一瞬间,手机在口袋里震了一下。他没有掏出来看。电梯平稳下行,数字从七跳到六,再到五,像倒计时,又像某种沉默的确认。

第十七章 不回头,但伸手

他站在电梯口停了两秒,然后转身走向楼梯间。七层楼走下去,每一步都踩得很实。鞋底撞击水泥台阶的声音在封闭的楼道里回荡,像在替他把脑子里那些翻涌的念头一层一层压实。

到了一楼,他推开消防门,走到楼外的吸烟区。午休时间没什么人,只有远处花坛边坐着一个打电话的外卖员。他掏出手机,找到方姐的号码,拨了过去。

响了三声就接了。

“文远?”方姐的声音带着明显的疲惫,像是很久没睡好。

“方姐,我长话短说。”他靠着墙,视线落在对面写字楼的玻璃幕墙上,阳光反射过来有些刺眼,“你们现在报错日志里最多的是不是事务锁等待超时,连接池被打满,后面所有请求全部排队?”

电话那头顿了一下,然后传来急促的呼吸声。“对,陈昊说是加密模块的问题,外包团队今天上午看了三个小时也没定位到根因。”

“不是加密模块。加密模块如果出问题,交易会直接失败,不会排队。你们的现象是请求全部堵在入口,说明事务管理器在等锁,锁释放不掉,连接无法归还线程池。”

方姐沉默了几秒。“那要怎么处理?”

林文远把身体从墙上直起来,换了个站姿。“第一,立刻通知运维把所有非核心交易走降级通道,信用卡还款和转账这类入账操作先切到异步队列,给主链路腾出连接资源。这个降级开关在你们监控平台第三层的批量作业模块里,操作手册写过,只是平时没人用。”

“第二呢?”

“第二,把事务管理器的超时参数从默认的三十秒改成五秒,然后加上异常重试的退避策略。这一步治标,能撑住现在的流量。根因在事务补偿窗口的设置上,你们现在异步补偿的最大重试次数是十次,间隔是线性递增。这个参数必须改成指数退避,初始间隔十秒,最大间隔三百秒,重试上限三次,超过三次直接进入人工处理队列。死锁的原因就是补偿事务反复拿同一个行锁,越重试锁等得越久。”

他一口气说完,发现自己的语速比平时快了不少,像是这些话在喉咙里排了很久的队,终于等到了出口。对面安静得能听见键盘敲击声,方姐应该是在记录。

过了十来秒,她开口了,声音有些发涩:“文远,这个补偿窗口的参数,当时是你设计的对不对?”

“对。日志里的补偿轨迹是按毫秒记录的,你让陈昊把日志里的时间戳做差分,能直接看到锁等待的分布。”

“指数退避我刚才查了,要改代码。”方姐的声音明显急了,“运维说改代码至少要走两小时的审批。”

“不用改主代码。”林文远打断她,“你们的事务管理中间件支持在配置中心热更新补偿策略。找那个叫 task-compensation 的配置项,把 retry 后面的 linear 改成 exponential,初始值填十,倍率填三。保存之后重启消费者实例,不碰生产者。”

电话那头传来方姐快速吩咐旁人的声音,说了几句之后又转回来:“配置中心找到了,正在改。文远,降级开关的触发条件是不是还要配合什么参数?”

“开关打开之后,事务管理器的异步队列积压阈值会从五千自动降到两千,这是联动逻辑,写在当时的技术方案里。你让运维盯一眼队列深度,超过一千五就说明降级生效了。”

“好,好。我让他们盯着。”

方姐的声音开始带着一种压抑的颤抖,像是绷了很久的弦突然被人按住。她停了一下,又开口:“你离职的时候,这些东西怎么没跟我说?”

“我说过。交接文档第十九页,事务降级和补偿策略那一章,我写了完整的触发链路。后来陈昊改了文档,那一章被删了。”

方姐那边彻底没了声音。林文远能听到她背后的办公室里有人在喊“配置生效了”,然后是键盘敲击声和脚步声混在一起。过了很久,久到他以为电话已经挂了,方姐的声音才重新传过来,低得几乎听不清:“文档还在吗?”

“在。我离职那天放在共享盘第三层文件夹,文件名是项目交接补充。那个文件夹只有项目经理有权限,你是项目经理。”

电话那头传来一声极轻的吸气声,像是什么东西被人从胸腔里硬生生抽走。然后是很长的沉默。林文远没有催她,他把手机贴着耳朵,看着对面写字楼的玻璃幕墙上有一朵云缓缓移过。

“文远。”方姐终于说话了,声音沙哑得厉害,“对不起。”

他闭了一下眼睛。阳光从云层后面透出来,照在他的眼皮上,暖融融的,像一只手掌覆在脸前。

“都过去了,方姐。”

“系统恢复之后我让运维把日志分析报告发你一份,你不用回,看一眼就行。”方姐的语气重新变得职业,但尾音还带着没散干净的颤,“这个降级方案的有效期是多久?”

“临时降级能撑住现有流量,但你们必须在两周内把补偿窗口的逻辑整个重写。连接池的配置参数也要调,现在的最大等待时间太长了,异步切换的阈值需要重新算。我把伪代码写在文档附录里了,你找一下就能看到。”

方姐在那边吸了一下鼻子,像是终于把情绪压了回去。“我一会儿就去找。文远,不管怎样,谢谢你。”

“不用谢。”他换了一只手拿手机,拇指在手机边框上轻轻摩挲了一下,“我帮你是因为那套系统是我建的,不是因为你,也不是因为公司。这一点你清楚。”

“清楚。”方姐的声音很轻,但没有丝毫犹豫。

“那就这样。有问题看文档,文档里没有的,你发邮件,我抽空回。”

他挂了电话,把手机装进口袋。刚转身准备回楼里,手机又震了一下。是方姐发来的一条简短消息:文档找到了。第十九页。你看过我的批注了吗?

他愣了一下。打开共享盘的记录一看,那份文档的打印稿被浏览过很多次,最近一次修改时间是三个月前——比他离职还早两周。也就是说,在他还没走的时候,方姐就已经看过那份文档了,只是从来没有在任何场合提起过。

他站在原地,阳光打在脸上,眼睛眯了眯。然后他打字回复:看到了。就去干活吧。

发完消息他把手机调成静音,推开消防门走回楼梯间。上楼的时候手机屏幕亮了一下,是赵总发来的:听说原系统出状况了?你处理得很好。

他没有回复,只是把手机翻了个面,屏幕朝下握在手里。推开七楼消防门的时候,孙磊正好端着水杯从茶水间出来,看见他就喊了一声:“林哥,接口定义会提前到两点半行吗?老陈说想一起参加。”

“行。”他应了一声,走回工位。

刚坐下,手机在桌面上又震了一下。他看了一眼,是方姐的最后一条消息,只有一行字:四十分钟前恢复的。全链路追踪显示,触发器用的是你文档里写的那个参数。

他没有再回复,把手机推到显示器旁边,打开团队群,给孙磊发了一条消息:把降级方案那部分的架构图一起带上,下午讨论的时候顺便过一遍。

然后他拿起桌上的水杯喝了一口。水已经温了,从喉咙滑下去,像一条平缓的河流。窗外那片云彻底散开了,阳光大片大片地铺进来,落在键盘上,把每个键帽的边缘都照得发亮。他深吸一口气,手指落在键盘上,开始敲今天下午要用的技术方案。

第十八章 余波

方姐的通报是在周四下午发出来的。

林文远并没有刻意去打听,是孙磊把截图转给他看的。原公司内部系统发了一则人事调整通知,方姐从技术部总监降为副总监,分管范围缩减到运维保障和内部工具开发,支付模块转由另一位从总部调来的负责人接管。通报措辞克制,只说“因组织架构优化及业务需要”,但圈内人一看就明白是什么意思。

孙磊在微信上发了一串省略号,又补了一句:“方姐这算不算替你出了口气?”

林文远盯着那张截图看了几秒,打字回复:“跟我没关系了。下午的接口文档你写完没有?”

孙磊发了个捂脸的表情,没再追问。

但林文远心里并不是毫无波澜。方姐带过他三年,手把手教过他写第一版需求说明书,在他刚入职连数据库连接池配置都搞不明白的时候,是她花了一个下午陪他排查参数。后来她变了,变得偏心、功利、只看得到会哭的孩子,可那些恩情没办法一笔勾销。只是他明白,感激归感激,路归路。每个人都有自己要承担的代价。

陈昊的调岗消息来得更安静。林文远是在周六上午刷技术论坛的时候,看到一篇关于微服务事务一致性的讨论帖,往下翻评论时瞥见了一个熟悉的头像。点进去一看,陈昊的个人主页上更新了职位信息,从“支付业务线技术负责人”变成了“内部效能平台高级开发工程师”。没有发朋友圈,没有群发消息,甚至没有跟他提过一个字。

林文远想了想,没有点关注,退出了论坛。

周晴从卧室出来,扶着腰慢慢坐到沙发上,看他盯着手机出神,问了一句:“怎么了?”

“没什么。陈昊调岗了。”

周晴愣了一下。“他不是方姐面前的红人吗?”

“支付模块被总部接手了,新负责人带了自己的班底。陈昊要么走要么转,他选了转。”

周晴沉默了一会儿,伸手拉过他的胳膊,把他的手掌贴在自己的肚子上。“那你呢?你选对了吗?”

他感受到掌心下面轻微的律动,像是一条小鱼在水里摆了一下尾巴。他偏过头看着妻子,笑了一下。“你觉得呢?”

“我觉得你选得对。”周晴把脑袋靠在他肩膀上,“那会儿你每天回来眉头都是拧的,现在松了。”

他嗯了一声,没有再多说。

周一上午,前台通知他有快递。林文远下楼签收,拿到一个牛皮纸信封,摸上去有点厚度,封口处贴着一张便签纸,是方姐的字迹:物归原主。

回到工位拆开,里面是一沓打印纸,A4大小,边缘已经有些卷曲,能看出被翻阅了很多次。他翻到第一页就愣住了。是他离职那天放在共享盘里的那份项目交接补充文档的打印稿。每一页的空白处都有红笔标注,有的是下划线,有的是问号,有的是密密麻麻的小字批注,写在页脚空白处,挤得几乎没有空隙。

他翻到第十九页。那一章讲事务补偿和降级策略,页边空白处写着一段被划掉一半又重新写上的批注:“如果连接池等待队列溢出,应该走哪个分支?——问过陈昊,他说没问题。直觉告诉我这里有问题,但没人顾得上。”

日期标注是三个月前,他离职前两周。

再往后翻,第五十三页,是关于异步切换阈值的参数设定。方姐在旁边用红笔圈了一个数字,写了一句:“这个值是不是太保守了?——没有验证环境,不敢改。”

再翻,第七十二页,关于补偿窗口的重试次数。批注只有两个字,重重地画了两道下划线:“隐患。”

每一页都看过了。有些批注被划掉重写,有些打了星号,有些只留下一个问号。最后一页背面写了一行字,没有红笔,是黑色签字笔,字体比平时小很多,像是后来才加上去的:“有些事我看到了,但没有说。对不起。”

林文远把文档重新叠好,放回信封。他坐在椅子上沉默了很长时间,直到旁边的同事在群里发消息催他开会,他才回过神来,把信封塞进了抽屉最底层。

他没有回复方姐,也没有把这件事告诉任何人。有些东西留在那里就好,不需要回应,也不需要原谅或释怀,只是承认它存在过。

周三下午,新公司的大会议室里坐满了人。赵总亲自主持高并发方案的第二轮验收会,五个业务部门的负责人都到了。林文远打开投影,把过去三周团队打磨的架构图一页页翻过去,从流量削峰到分布式事务补偿,从多级缓存一致性到灰度降级策略,每一个环节都配了压测数据。

最后一页是模拟故障场景下的恢复时间统计。他的团队里最资深的老周——那个在方案会上拍过桌子的老员工——站起来补充了一段:“这个数据是我们连续七十二小时跑出来的,中间经历过一次真实的节点宕机,自动切流用了八百毫秒,没有丢单。”

会议室里安静了两秒。然后赵总带头鼓掌,其他部门的负责人也跟着点头。赵总当场拍板:“方案通过,下个季度在全部核心链路推广。项目分红按原定比例发放,下个月随工资一起到账。”

散会后,老周走过来,手里端着一杯茶,在老员工里他年纪最大,平时话不多,上次方案会拍桌子的事大家都记得。他把茶放在林文远面前,自己拉了把椅子坐下。

“林工。”老周难得这样称呼他,之前都是直呼其名,“我那天在会上不该那么冲动。”

“技术讨论嘛,有不同意见正常。”林文远端起茶喝了一口。

老周摇摇头。“不是冲动不冲动的事。我在这行干了十五年,见过太多空降的,嘴上说得漂亮,代码一塌糊涂。你那三天查出来的性能瓶颈,位置刁钻,我跑了一礼拜没发现。后来你改的那版连接池配置,压测数据比原来好了三倍。”他顿了顿,端起自己的杯子碰了碰林文远的茶杯,“我服你。”

林文远笑了笑。“下周开始全链路推广,你那块的老代码要重构,咱俩有的忙。”

“忙点好。”老周也笑了,露出一口被茶渍染黄的牙,“忙说明公司活得好,活得好大家才有年终奖。”

周五傍晚,林文远提前半小时下班,去了公司附近那家母婴用品店。周晴念叨那款婴儿车已经念叨了快一个月,高景观双向可推,折叠后能塞进后备箱,带独立睡篮和避震系统。价格不便宜,顶他从前大半个月的工资,但现在他付得起。

店员帮他装好箱子,他抱着大纸箱走到路边等车。晚高峰的车流堵在红灯前,尾灯连成一条暗红色的河。他把箱子放在地上,抬头看见天边有一层薄薄的橘色云彩,像是被阳光泡软的棉花糖。手机在口袋里震了一下,是周晴发来的消息:早点回来,今天做了你爱吃的红烧小排。

他打字回复:已经在路上了,给你带了个大件。

周晴回了一个问号,紧接着又发了一条:不会是我看中那个婴儿车吧?

他回了一个微笑的表情。

出租车停下来的时候,他把纸箱搬进后座,自己坐在旁边,手掌搭在箱子上。透过车窗,城市的灯光一盏盏亮起来,把黄昏的最后一点灰蓝也吞没了。车子汇入晚高峰的车流,走走停停,但他不着急了,往后的日子还长,路也还宽。

第十九章 阳台上的答案

周晴是在凌晨两点被推进产房的。

林文远坐在产房外的塑料椅上,手里攥着一瓶没拧开的矿泉水。走廊顶灯白得刺眼,隔壁家属的鼾声断断续续,空气里弥漫着消毒水和速食盒饭混合的味道。他把手机摸出来又放回去,放回去又摸出来,屏幕亮起时显示一条未读消息,来自方姐。

消息很短,只有四个字:谢谢,珍重。

他盯着这四个字看了好几秒。上一次联系,还是支付系统死锁那个凌晨,他在电话里用了二十分钟给方姐讲清楚加密逻辑的修复参数。后来方姐把那份文档打印稿寄了过来,红笔标注的阅读痕迹和最后一页的黑色签字笔留言,他都收下了,没有回复。再后来,原公司的内部通报他听陈昊提过一嘴,方姐从技术总监降成了副职,分管范围缩了一半。陈昊自己申请调去了测试部门,新岗位工资少了两千多,但他说睡得踏实了。

林文远没有追问细节,也没有评价。有些故事结束了就是结束了,续集不在他的计划里。

他把手机收进口袋,没有回复方姐这条消息。产房里隐约传来周晴压抑的呼吸声,隔着两道门,他只能听到一些模糊的片段。走廊尽头有一扇小窗,窗外是城市后半夜的灯火,稀稀疏疏的,像打瞌睡的眼睛。他突然想起半年前那个深夜,他在旧公司办公桌前通宵修复支付模块,荧光灯嗡嗡作响,周晴发消息说肚子有点疼,他回了一句“再等我一下”。那天他等到的是一份被陈昊改得面目全非的技术方案,而周晴一个人打车去了医院做产检,回来只字未提。

那之后他做了一个决定。现在这个决定要落地了,落在一个即将到来的新生命面前。

产房的门推开时,天已经蒙蒙亮了。护士探出头,声音带着一夜忙碌后的疲惫和笑意:“母女平安,孩子六斤四两。”

林文远站起来,膝盖有些发软。他走进产房,周晴躺在病床上,脸色苍白,额头上全是汗,但眼睛亮得像刚洗过一样。她怀里抱着一个皱巴巴的小东西,裹在浅蓝色的襁褓里,闭着眼,小嘴一张一合地找着什么。

“你看她。”周晴的声音很轻,沙哑里带着笑。

林文远弯下腰,凑近看了看那张小脸。鼻子像周晴,眉骨的轮廓隐约有自己的影子。他伸出手指,小东西的手无意识地攥住了他的指尖,力气小得几乎感觉不到。护士在旁边说了些什么注意事项,他一个字都没听进去,所有的注意力都被那只小手占满了。

“像你。”周晴说。

“像你。”他回。

周晴笑了一声,闭上眼睛休息。林文远坐在床边的凳子上,就这样被女儿攥着手指,坐了很久。窗外太阳升起来了,光线一点点爬进病房,落在床单上,落在那个浅蓝色的襁褓上,落在周晴疲惫但松快的睡颜上。他低头看了看自己西装口袋里露出的手机一角,方姐那四个字还躺在那里,像一块从旧衣服里翻出来的纽扣,已经找不到匹配的衣服了。

满月那天,林文远请了一天假。赵总在批假的时候随口说了一句:“项目分红上周到账了,你查一下。”他查过了,扣除税款后有六万多,是他在旧公司整整一个季度的工资。到账那天他给周晴转了两万,剩下的存进了一张单独的卡,专门用来支付孩子以后的各种开销。

上午的阳光很好,阳台上的绿萝抽出新藤,沿着栏杆绕了半圈。周晴搬了一把藤椅出来,半躺着晒太阳,膝盖上搭着一条薄毯。女儿在林文远怀里,穿了一件鹅黄色的连体衣,小脸晒得红扑扑的,眼睛半睁半闭地打量着这个明亮的世界。

“我问你个事。”周晴的声音从背后传来,带着午后的慵懒。

“嗯。”

“你当初跳槽的时候,有没有后悔过那么一点点?就一丁点。”

林文远低头看着怀里的女儿。她打了个小小的哈欠,拳头还是攥得紧紧的。他笑了一声,伸手把襁褓往臂弯里拢了拢,感受着那团小小的、暖融融的重量。

“说实话,不去想是假的。”他开口,声音不高,“那八千块钱,像一根刺,扎了很长一段时间。后来每次项目节点压力大的时候,我都会想,如果还在原来的地方,至少不用重新证明自己。”

周晴没有接话,安静地等着。

“但刺拔出来之后,伤口会愈合。愈合的地方,比以前硬。”他偏过头看了一眼周晴,她闭着眼,嘴角有一丝笑意,“新公司第一周,老周他们谁都不服我。我花三天找到那个性能瓶颈那天,下班回来,你问我怎么了,我说没什么。其实那天我特别想告诉你,有人开始叫我林工了。”

周晴睁开眼,目光落在他脸上。

“后来方姐给我打那个凌晨电话,陈昊在那边说‘不是我改的’,我听到的时候心里很平静。我就想,如果当初不走,现在接这个电话的人还是我,通宵填坑的人还是我,第二天被夸的人还是陈昊。”他低头看着女儿,“我不想让她以后听爸爸的故事,是一个永远在等别人给答案的人。”

他顿了顿,手指轻轻碰了碰女儿的脸颊。

“那八千块,教会我的东西其实很简单。你的价值不由别人定价,但你自己得敢定价。别人看不见的时候,你得自己看得见自己。别人不给的时候,你得自己走出去拿。”

周晴安静了几秒,然后轻声笑了。“你最近是不是偷偷看什么励志语录了。”

“赵总在项目总结会上说过一句。”林文远也笑了,“他说,一个能被轻易替代的岗位,给多少钱都是溢价。一个不能被轻易替代的人,给多少钱都是折扣。”

阳台外,城市的天际线在正午阳光下明晃晃的,几栋新建的写字楼玻璃幕墙反射着光,像一排竖起来的镜子。远处工地上的塔吊在缓慢转动,把城市的天际线一点点往高处推。林文远抱着女儿站起来,走到阳台栏杆边。小家伙在他怀里扭了扭,小脸侧向光亮的方向,眼睛终于完全睁开了,黑亮亮的,像两颗刚洗过的葡萄。

“你以后想做什么都行。”他低声说,不知道是对女儿说,还是对自己说,“爸爸只负责告诉你怎么定价。”

周晴在藤椅上笑出声来:“她才一个月大,你跟她讲这些。”

“听不懂没关系。”林文远把女儿举高了一点点,让阳光落在她脸上,“先记住这个光,别的慢慢来。”

他低头看了一眼手机。方姐那条“谢谢,珍重”已经沉到了消息列表深处,被各种工作群和生活服务号推到了很远的地方。他没有点进去,也没有删除。它就那样待着,像一个已经不疼的旧伤疤,不碍事,也不碍眼。

风从阳台外面吹进来,带着楼下桂花树隐隐约约的香气。周晴起身走到他身边,把头靠在他肩膀上。三个人挤在阳台的方寸之地,影子叠在一起,被正午的太阳拉得很短很短。

“走吧。”周晴说,“该给孩子喂奶了。”

林文远把女儿递给她,自己靠在栏杆上又站了一会儿。城市在他面前铺开,道路纵横,楼宇林立,每一扇窗户后面都有人在计算自己的价值,有人在等待别人给自己定价,有人在鼓起勇气写下自己的数字。他知道自己只是其中一个,从一张工资条开始,到一把攥紧的小拳头结束。这个过程里有多少不甘、委屈、犹豫和挣扎,他记得每一分每一毫。但此刻风是暖的,阳光是亮的,身后传来周晴轻声哼的儿歌,和女儿断断续续的咿呀声。

他没有回头去看那些已经翻过去的页码。

日子还长,路也还宽,该往前走的人,不会站在原地算账。

(全文完)

文章虚拟演绎,请勿当真。