第3章 版本上线

手机响了。他看了一眼屏幕——赵恒。他接起来,听到对方开门见山:「上线准备怎么样了?」

「灰度包已经部署了,正在等流量窗口。」陈默一边说一边刷新了一下监控页面,「告警阈值也调了——连接池水位、响应时间P99、错误率,都压到正常值的百分之七十。」

「数据库那边呢?」赵恒的声音平稳,听不出情绪。

「DBA说主库从库都做了快照,回滚方案也准备好了。」陈默说完,电话那头沉默了两秒。

「好。」赵恒说,「我手机开着,有问题随时打。」顿了顿,又补了一句:「别一个人扛。该叫人就叫人。」

「知道了。」陈默挂了电话,把手机放回桌上。屏幕上的监控面板还在安静地等着流量到来。

挂了电话,他把手机放回桌上。屏幕上的监控面板还在安静地等着流量到来。

手机又震了一下。这次是小李。

「陈哥,上线了?」小李的消息弹出来。

「刚切完,一切正常。」陈默打字回他。

「牛逼!我就说你一个人搞得定。」小李发了一个竖大拇指的表情,又追了一句:「你怎么还没睡?」

「在改一个bug,顺手看了眼群。」小李说,「看到你说都去睡吧,就知道上线搞定了——就上周提的那个,用户反馈列表页加载慢。查了一晚上,发现是SQL少了个索引。」

陈默皱了皱眉,打字:「加索引要注意锁表。」

「我知道,业务低峰期再改。你先睡吧陈哥,明天复盘别迟到。对了,新版本上线了,明天是不是可以准点下班了?」

陈默笑了一下:「想得美。」

小李发了一个哭泣的表情。陈默把手机放下。

陈默盯着屏幕上的监控面板,左手边是API响应时间的实时折线图,右手边是流量百分比的柱状图。数字从零开始,每跳动一次他就刷新一次页面,呼吸也跟着紧一分。凌晨两点五十七分。手机弹了一条新闻推送——国内确诊病例还在涨,上海昨天新增了三例。他扫了一眼,划掉,切回监控面板。新版本上线的流量灰度切换开始了。

第一个接口调用的日志出现在屏幕右侧的滚动窗口里。POST /api/v2/order/create,参数校验通过,业务逻辑执行完成,数据库写入成功。他盯着那行绿色的日志标记看了好几秒,确认没有跟着红色的异常信息,才松了一口气。

流量百分比跳到百分之二。他刷新页面,看到新的数据点在折线图上出现。响应时间在正常范围内,平均两百毫秒左右,没有明显的波峰。他握了一下鼠标又松开,手指关节发出轻微的咔嗒声。

隔壁卧室传来妻子翻身的声音,床垫弹簧响了一下,然后安静了。陈默回头看了一眼书房虚掩的门,门缝里透进来的走廊灯在地板上画了一道三角形的光。他转过头,继续盯着屏幕。

流量百分比跳到百分之五。他翻开手机微信,工作群里的最后一条消息是两个小时前运维发的,说灰度环境预检查过了,全部指标正常。他往上翻了几页,看到测试同事在群里发了几个通过的表情,开发组几个人回了OK的手势。两个月来的所有争吵、熬夜、需求变更,就凝聚在这几个OK里。

百分之十。监控面板上所有指标的色块都是绿色的,没有黄色警告,没有红色告警。陈默用左手撑着下巴,右手握着鼠标在屏幕上划来划去,点开每一个子面板看。数据库连接池的水位正常,CPU占用率平稳,内存使用率在预期范围内,各接口的错误率都是零。

他发现自己已经在屏幕前坐了将近二十分钟,几乎没挪过位置。椅子的坐垫已经被他坐得有些发烫,后背的T恤黏在椅背上。他稍微调整了一下坐姿,脊柱发出几声轻微的响声。凌晨的身体状态和下午不一样——下午是精神疲劳,凌晨是身体的每一个关节都在提醒你该休息了。

百分之三十。日志窗口的滚动速度快了一些,每秒钟有三到五条新的日志条目出现。他快速扫了一眼,全部都是INFO级别的正常日志,没有WARN,没有ERROR。他拿起鼠标旁边的手机,屏幕亮着,没有任何告警通知。群里的消息停留在两个小时前。大家都睡了——或者说,都在等他的消息。

陈默端起手边的马克杯喝了口水。水的温度和室内温度一样,已经不凉了——他甚至不记得这杯水是什么时候倒的。放下杯子的时候,杯底磕在桌面上发出一声闷响,在安静的夜里听起来格外响亮。他看了一眼门的方向,怕吵醒妻子。门缝里还是那条三角形的灯光,没有变化。

百分之五十。流量已经切了一半过去,新版本开始承载真实的用户请求。他点开业务模块的监控,看到订单创建、支付回调、退款处理几项核心业务的指标都在正常区间。新版本改动了十二个接口,重构了两个核心模块,替换了一个中间件版本——任何一个环节出问题,他现在就得从床上爬起来叫团队处理。

他没有叫团队。一切都在正常跑。

百分之八十。他掰了掰手指,关节啪啪响了两声。不是紧张,是一种习惯性的小动作——每次大版本上线他都会这样。以前有同事问他是不是上线的时候特别紧张,他说不是,就是在肚子里默默祈祷。当然是开玩笑的。但是当线上流量真的开始往新代码里灌的时候,任何有经验的工程师都会本能地屏住呼吸。

监控面板上跳出一个提示框,某个接口的P99响应时间短暂地超过了五百毫秒。他的心跳漏了一拍。手指立刻移到键盘上,准备打开日志系统查问题。但还没等他敲下去,那个数字又降回了三百毫秒以内。一次正常的抖动——可能是JVM的垃圾回收触发了,或者操作系统在做磁盘刷盘。他慢慢把手从键盘上拿开。

百分之百。所有的流量都切到了新版本上。他刷新了三次页面,每次都是绿色。数据库连接池水位稳定在百分之四十左右,CPU使用率百分之三十,各接口响应时间正常。四十五秒后,他打开后台的错误日志系统,按时间倒序刷了一遍,最近的十条记录全部是INFO级别的正常日志。

他拿起手机,在工作群里打了一行字:「大家辛苦了,都睡吧。」

发送。群里安安静静的。没有人回复。

手机又震了。是老张。

「还没睡?」

「你不也没睡。」陈默靠在椅背上,打字的速度比平时慢一些——手指有点僵了。

「被老大叫起来看上线,说今晚你一个人盯着不放心。」

陈默愣了一下:「赵恒?」

「嗯,他两点多发消息给我,说你肯定不睡,让我看着点。」

陈默没想到组长会惦记这个。他沉默了几秒,回:「帮我谢谢他。」

「你自己谢。对了,上线没问题吧?」

「一切正常,流量全切过去了,指标都绿。」陈默回完,又补了一句:「新版本重构了两个核心模块——订单和支付。」

「胆子够大的,一次改这么多。」老张说。

「没办法,旧架构撑不住了。双十一差点崩了,赵恒拍板说必须重构。」

「他倒是敢拍板。不过测试覆盖率还行,核心路径都cover到了。」

「测试覆盖率这东西,信一半就行。线上永远有你没想到的路径——比如用户用了个十年前的浏览器,比如网络在请求发出去一半的时候断了,比如数据库刚好在主从切换。你测试环境能模拟这些?」

陈默承认:「模拟不了。」

「所以啊,上线只是开始。明天开始盯告警,前三天是关键。你们组今年上线几次了?」

「第三次大版本,小版本十几次。」

「那你今年的上线次数已经超过我了。我去年一整年就上了两次大版本。」

「你现在不是转管理了么。」

「管理也得操心上线。只是不在一线盯监控了。」

陈默看着屏幕,打了一行字又删掉,最终还是发出了那句:「盯监控这事儿,其实挺孤独的。」

屏幕那头沉默了几秒。「当然孤独。全公司就你一个人知道系统现在是活着还是死了。其他人都睡了。」

「你说的我都睡不着

他想起白天的一幕幕,每一件都在黑暗中放大成不能忽视的存在。手机屏幕的光映在天花板上,像一只沉默的眼睛。

了。」陈默回。

「哈哈,开个玩笑。去睡吧,真没事了。」

陈默把手机放下。屏幕上,老张最后那行字还亮着。

他盯着屏幕上的那行消息看了很久。没有点赞,没有OK手势,没有表情回复。两个月来的高强度加班

走廊尽头的工作灯还亮着,几个年轻人围在一起讨论,桌上摊着外卖盒和能量饮料。这就是互联网行业的日常。

,无数次线上吵架,凌晨还在改方案的夜晚,所有人在这一刻都选择了睡觉。不是冷漠,是真的太累了。

陈默把手机屏幕朝下扣在桌面上,靠回椅背。椅子的气压杆发出嘶的一声,他整个人陷进椅子里。

他忽然不知道该干什么了。

两个月来,他第一次没有待办事项。没有要修的bug,没有要审的代码,没有要写的方案,没有要回的邮件。所有的事情在流量到达百分之百的那一刻结束了。他应该觉得轻松,应该觉得高兴,应该倒头就睡。但坐在椅子上,盯着已经暗下去了的显示器屏幕,他只感觉到一种空洞的、不确定的轻松——像一根绷了太久的橡皮筋突然松开之后,不再有弹力,只是软塌塌地垂在那里。

他看了一眼时间,凌晨三点十一分。以往这个时候他要么在改bug,要么在想改bug的方法,要么在梦里梦到改bug。现在他什么都不用做了,却反而不知道该拿自己怎么办。他拿起手机翻了一下朋友圈,看到有人在晒夜宵,有人在发加班感言,有一个人在发家里猫生了一窝小猫的照片。他给那条点了赞,然后把手机放回桌上。

他盯着墙上挂钟的秒针走了一圈。又走了一圈。他站起来,又坐下去。坐了没几秒,又站起来。这种状态让他想起刚毕业那会儿,周末不知道干什么,一个人在出租屋里从早上坐到晚上,什么也没做,一天就过去了。但那是十年前的事了。十年后,同样的感觉又回来了——在版本上线成功的凌晨三点。

他想起这两个月的种种。三月底项目启动的时候,所有人都说:「这次上线要两个月。」,他当时觉得时间太紧了。后来证明是对的——每天都像是在赶deadline。需求从产品那边过来,开发评估说:「三天」,产品说:「不行,要两天」,最后妥协成两天半。前端说:「接口文档能不能早一天给?」,后端说:「文档还没写好,但你可以先看代码。」。测试说:「测试环境不稳定。」,运维说:「测试环境没问题,是你代码的问题。」。每个人都在push,每个人都在极限的边缘试探。

他作为架构师,每天被@几百次。群里有人@他问某个接口为什么要这么设计,有人@他问这个第三方SDK的版本能不能升,有人@他问数据库表结构变更了知不知道。他的手机从不敢静音——即使凌晨两点来一条消息,他也会拿起来看一眼。有时候是告警通知,有时候只是产品在群里发了一个新的需求文档链接。

他看了一眼手机上的相册,翻到上个月的一张照片。凌晨一点,办公室的灯只剩他头顶那一排还亮着。同事的工位上电脑都关了,椅子推进了桌底,杯子里还剩半杯忘了倒的咖啡。他拍这张照片的时候就想着,以后回头看这段日子,应该会觉得很苦。但奇怪的是,他现在坐在这里,觉得那些日子像是也没有那么苦。可能是习惯了。也可能是真的忘了。

他打开手机上的监控App——不是上线用的那个,是另一个,他平时用来检查服务器负载的工具。绿色的数字在黑色的背景上跳动,和电脑上的数据一致。他盯着手机上同样内容的监控看了两分钟,像是要说服自己一切真的都正常了。

他想起刚入行的时候带他的师傅说过一句话,生产环境永远不会让你安心超过三天。三天,最多三天,一定会有新的问题冒出来。不是诅咒,是经验。一个系统只要在线上跑,就一定会出问题。区别在于出大问题还是小问题,你能不能提前发现。今天没有出问题,不代表明天不会。这个念头一冒出来,他又看了一眼监控面板。一切正常。他告诉自己该信了。

他看了一眼时间,三点十五分。他感觉自己应该去睡觉了,但身体没有执行这个指令的意思。他坐在那里,手指在键盘上无意识地敲着,没有打开任何程序,就是在键盘上敲——嗒嗒嗒嗒嗒——像打字机空转。他停下来,把双手放在膝盖上。然后又开始敲。

这种感觉他不陌生。每次大项目结束后都会有这样一个空窗期——脑子里还在高速运转,但已经没有需要运转的方向了。像一个跑者在冲过终点线之后还在原地摆臂,肌肉记忆还没冷却。他需要一段时间来告诉自己的身体:可以停了。但这个过渡期最难熬。

他想起刚毕业那年在上一家公司,项目交付后他连着失眠了三天。每天晚上躺下,脑子里全是代码。线条在黑暗中流动,函数调用像河流一样在意识里汇合又分叉。他睁着眼躺到天亮,然后起床上班。那三天他瘦了三斤。后来组长告诉他,这叫上线后综合征,每个工程师都会有。习惯了就好。他那时候不信,后来发现是真的——做了十年,习惯了不少东西。包括这种空虚感。

疫情期间,公司的业务反而涨了。线上购物、远程办公、健康码——所有东西都在一夜之间搬到了网上。服务器扩容了一遍又一遍,每个人都在连轴转。焦虑

这种焦虑是这个时代的通病。三十五岁危机不是一个人的困惑,是一整代互联网从业者的集体心病。

写在每一个人的脸上——不是怕疫情,是怕系统撑不住。

这两年互联网行业越来越卷。以前一个需求排一个月,现在一周就要上线。以前代码写错了可以慢慢改,现在出问题十五分钟内必须定位。不卷不行,不卷就要被裁。三十五岁的程序员尤其如此。

远程办公成了新常态。每天开不完的视频会议,孩子在背景里哭,狗在叫,外卖放在门口不敢拿。每个人都在适应这种居家办公的新节奏。智能家居设备卖疯了——大家都想让自己住得更舒服一点,毕竟一天二十四小时都在家。

陈默从书房出来,走廊很暗,只有尽头窗户透进来的一点月光。他走到客厅的饮水机前,接了一杯温水。冰箱在角落里发出低沉的嗡鸣,在安静的夜里像一只在打呼噜的大猫。他端着杯子站在那里喝了一口,水是温的,入口刚好。

往回走的时候,经过女儿的房间。门虚掩着,里面一片安静。他只是路过——从客厅回书房要经过这里。但就在经过的那一刻,门缝里传来一个模糊的声音。

爸爸。

他停下脚步。声音很轻,含含糊糊的,像说梦话的人嘴里滚出来的半截音节。他站在门口,侧耳听了片刻。里面没有其他声音了。那一声爸爸像是女儿在梦里无意识发出的,可能她在梦里看到了爸爸,就叫了一声,然后又沉入更深的睡眠。

他轻轻把手放在门上,停了一秒,然后推开了门。门轴发出很轻的吱的一声。

月光从窗帘的缝隙里挤进来,在地板上铺了一道银白色的窄带。女儿侧躺在床上,怀里抱着那只耳朵都快被她摸秃了的小熊——从两岁抱到现在,洗了不知道多少次,小熊原本是浅棕色的,现在已经洗成了泛白的灰色。小熊的一只眼睛的线松了,半耷拉着,她也不嫌弃,每天晚上都要抱着睡。

她的呼吸很均匀,小胸脯一起一伏。脸上还留着一丝睡梦中的表情——嘴角像是有一点点翘着,不知道梦到了什么好事。月光刚好落在她的脸上,长长的睫毛在脸颊上投下淡淡的影子。她睡得很沉,很安稳,完全不知道外面的世界发生了什么。不知道爸爸刚刚经历了一场大版本上线,不知道爸爸这两个月每天都在凌晨一两点才关电脑,不知道爸爸刚才盯着监控面板的时候手心全是汗。

她什么都不知道。她只是在自己的梦里叫了一声爸爸。

陈默站在床边,没有动。月光从窗帘缝隙里移了一寸,银白色的窄带变成了打在墙上的一道细细的光弧。他伸出手,轻轻把女儿踢开的薄被拉上来,掖到她下巴下面。他的动作很轻,轻到像是在完成一个仪式——从女儿出生起他就学会了用这种力道碰她。抱新生儿的时候、换尿布的时候、喂奶的时候、哄睡的时候,他练了五年,终于学会了用最小的力气做最需要细心的事。

女儿在睡梦中咂了咂嘴,翻了个身,面朝墙壁。小熊被她压在身下,她哼了一声,又伸手把小熊拽回来,重新搂进怀里。整个过程她都没有醒,眼睛一直闭着,像是在水里翻了个身又继续睡。

他站了一会儿,大概有一分钟,也许更久。然后轻轻带上门。门锁咔嗒一声合上,声音在安静的走廊里格外清脆。他站在门口,愣了两秒,然后走回书房。

回书房的路上,他觉得自己胸口某个地方被轻轻撞了一下。不是痛,是一种说不上来的柔软。他想起今天下午女儿在客厅搭积木的样子,她搭了一个歪歪扭扭的房子,兴冲冲地跑过来拉他去看。他当时正在回一个紧急消息,头也没抬地说了句:「爸爸忙,待会儿看。」她站在他旁边等了一会儿,然后自己跑回去继续搭了。

他不知道她现在还记不记得这件事。但她在梦里叫了爸爸。

电脑屏幕的待机画面在缓缓变换,一张张风景照片在切换。他把杯子放在桌上,水已经凉了一些。他没有喝,只是站在那里看着屏幕上的照片——一张是新西兰的湖泊,一张是冰岛的极光,一张是某个不知名的山间小路。每一张都是他永远不会去的地方,至少现在不会。

女儿的房间他每天都会经过,但很少在深夜进来。白天的时候这个房间到处都是玩具和绘本,地上几乎没有下脚的地方。但此刻在月光下,一切都显得很安静——散落在地上的积木像史前遗迹,墙上她画的蜡笔画在月光下像一种古老的壁画。她画的全家福——一个圆脸的小人代表她自己,一个高个子代表爸爸,一个长头发代表妈妈,三个人手拉手站在一片绿色的草地上方,蓝色的天空顶上有黄色的太阳。

他想起上周她回家说在幼儿园被小朋友抢了玩具,回来窝在他怀里哭了半天。他当时一边哄她一边心里在想着明天要交的方案,连她说什么都没完全听进去。现在想起来,那半天应该是他最近离她最近的一段时间——她趴在他胸口,眼泪把他的T恤洇湿了一小块,他拍着她的背说没事的。后来她不哭了,从他身上爬下来,又去玩积木了。

有时候他觉得自己在做一个危险的平衡——一边是工作,一边是家庭,两边都想要,两边都给不完整。他努力让自己在工作的时候不想家,在家的时候不想工作。但更多的时候,他是在工作的时候想着回家,回家的时候想着还没做完的工作。女儿五岁了,他错过了一些东西——第一次走路他是在公司开会,妻子发了一段视频过来,他在会议室外面点开看了三遍。第一次完整地唱一首歌,他加班到半夜才回家,妻子给他看录好的视频。

他不知道这些错过会留下什么。女儿现在还会在梦里喊爸爸,但再过几年呢?等到她长大了,不再在梦里喊爸爸的时候,他会不会后悔今天在书房里度过的那些夜晚?他站在那里,在黑暗中看着女儿熟睡的脸,觉得这个问题他暂时不敢想得太清楚。

他伸手轻轻碰了一下女儿的头发。很软,和她刚出生时一样软。那时候她只有一丁点儿大,躺在他的臂弯里,整个身体还没他的前臂长。现在她五岁了,会自己穿鞋了,会在幼儿园交朋友了,会在梦里叫爸爸了。他缩回手,在衣服上轻轻蹭了蹭指尖,像是要把那种触感留住。

他轻轻走出女儿的房间,把门虚掩回原来的角度。走廊里还是那么暗,客厅的冰箱还在嗡鸣。他端着已经凉了的水杯回到书房,把杯子放在桌上,没有喝。

他忽然意识到,女儿房间里那个旧小熊是妻子怀她的时候买的。那时候他们刚搬到这个房子,两个人去商场买婴儿用品,在玩具区逛了很久。妻子挑了这只小熊,说女孩子应该有一只小熊。他当时说会不会太早了,还没出生呢。妻子说早点准备嘛。结果女儿出生后果然很喜欢——不是那种阶段性喜欢,是从小抱到大,从来没有被其他玩具取代过。

他想,一只小熊能陪一个人从出生到五岁,这本身就是一件很了不起的事情。不知道它还能陪她多久。等到她长大了,不再需要小熊了,这只褪了色的小熊会被收到哪个角落?他想到这里,忽然觉得有点伤感,然后马上告诉自己别想了。但那种感觉已经留下来了。

他想起今天在电梯里听到两个同事聊天,一个说最近在看心理医生,另一个说压力大到每天都想辞职。大家都在说躺平,但没有一个人真的躺下去。不是不想,是不敢。房贷、车贷、孩子的学费,哪一样都不允许你停下来。

陈默在书房的椅子上坐了一会儿,盯着电脑屏幕发了会儿呆,精神却毫无睡意。不是那种喝了咖啡之后的清醒,,只是身体太紧绷了,松不下来。他站起来,走到阳台的推拉门前,拉开,走了出去。

凌晨三点的空气涌进来,比室内凉了好几度,带着初夏夜晚特有的湿润。他靠在阳台的栏杆上,金属的触感透过T恤传到后背,凉凉的,有点硬。他从裤兜里摸出烟盒和打火机。妻子不让他在这抽烟,抽了烟还要在阳台散很久的气味。但现在是凌晨三点,她睡了。

他点了一根。打火机的火光在黑暗中亮了一下,然后暗下去,变成一个小小的红点。他吸了一口,烟雾从嘴里出来,被夜风扯散,消失在夜色里。

对面楼只有两三扇窗户亮着灯。他不知道那些窗户后面是谁,在做什么——也是和他一样刚加完班的程序员?还是夜里醒来喂奶的新手父母?还是失眠的老人?他盯着那些窗户,心想每一扇亮着的窗后面都有一个故事,而他能看到的永远只是窗口透出的光。

远处的高架路上偶尔有一辆车经过。车灯从远处扫过来,在城市的天际线上划出一道弧线,然后消失在建筑的阴影里。上海的凌晨是安静的,安静到可以听到自己的心跳。不嘈杂,不拥挤,不喧嚣,像一台在深夜低速运转的服务器,所有灯都在闪,但声音很轻。

他又吸了一口烟。尼古丁让他的大脑稍微清醒了一些。清醒之后,那些白天不敢想的问题就自己浮上来了。

新版本上线了,然后呢?下一个版本什么时候开始?

这个问号一浮上来就停不住了。这样的日子还要过多少年?他能一直这么干下去吗?再过五年他四十岁,再过十年四十五岁,那时候他还能坐在电脑前盯监控面板盯到凌晨三点吗?团队里的人越来越年轻,新人两三天上手一个新框架,他看文档要看一周。不是学不会,是精力跟不上了。同一个问题,年轻人靠通宵解决,他靠经验解决。但经验总有不够用的时候。

他想起上周在电梯里听到两个实习生在聊天,一个说他在用AI写单元测试了,另一个说AI生成的代码比自己手写的还好。他当时没说话,但心里动了一下。AI写代码?他干了十年,每天写代码、审代码、改代码,如果AI都能干了,那他干什么?

烟燃到了尽头,烫了一下他的手指。他抖了一下,把烟头掐灭在阳台花盆的土里,用指头按了按,确保火星完全熄灭了。明天妻子浇花的时候可能会发现土里多了个烟头——如果她发现了,大概会看他一眼,什么也不说。他了解她。

他把烟头埋在土里更深一点,然后站了几秒钟,看着远处那两三扇还亮着的窗户。其中有一扇灯灭了。又过了一分钟,另一扇也灭了。最后一扇孤零零地亮在那里,像一个失眠的人还在撑着。

手机响了。是赵恒。

手机响了。是赵恒。他接起来,听到对方问:「上线怎么样?」

「一切正常,刚切完。」

「辛苦了。明天下午复盘,你准备一下。不早了,睡吧。」

「嗯,您也是。」挂了电话,他把手机放回兜里。屏幕上显示凌晨三点二十三分。

他转身拉开门,回到屋里。推拉门在身后合上,把凌晨三点的夜色隔绝在外面。

他想起上周和技术总监老周的对话。在那次谈话中,他第一次听到架构师评审这个说法。老周说公司准备启动技术序列的晋升通道,第一批架构师评审预计在明年年初启动。陈默当时没表现出太大的兴趣,只是说:「哦好,那我准备准备」。但那天晚上他加班到很晚,把自己这几年的项目经历梳理了一遍。他想知道自己够不够格。

架构师意味着什么?意味着他不再只是一个写代码的人,他要对整个系统的架构负责,要对技术决策负责,要对团队的产出负责。他想到了很多可能的未来场景:如果评上了,他还要不要写代码?如果评不上,明年怎么办?他告诉自己不要想太多,先把眼前的事做好。但那天晚上他躺在床上翻来覆去到两点多才睡着。

第二个念头又浮上来,关于老张的。老张比他大几岁,最近总说干不动了。他当时觉得老张是在开玩笑,但现在一个人站在凌晨三点的阳台上,他觉得老张说的是真的。不是不想干,是真的干不动了。身体告诉你不行了,精力告诉你跟不上了,连心态都开始变了——以前加班是热血,现在加班是消耗。消耗一次就少一点。

陈默把烟盒放回兜里,摸到手机。他犹豫了一下,打开和老张的微信对话框。上一次聊天是一个星期前,老张问他新版本进度怎么样,他说:「在追,快了。」老张发了一个竖大拇指的表情。他盯着那个大拇指看了几秒,把手机锁屏放回兜里。没什么好说的,都还没睡,都在加班,都知道对方在想什么——这大概就是做了太久同事的默契。

城市的灯光在远方连成一片模糊的光带。月亮挂在天上,不是满月,是一弯下弦月,像一片被咬了一口的薄饼。他想起女儿前几天在幼儿园学了一首关于月亮的儿歌,回家唱给他听,歌词里有「弯弯的月亮像小船」。他现在站在阳台上看月亮,觉得它不像小船,像一个安静地挂在天上的问号。 他低头看了一眼手机,朋友圈里有人在转发武汉解封后的第一条推送,有人发了一张戴着口罩在空荡荡的地铁里拍的照片。已经是五月份了,但街上戴口罩的人还是很多。公司进门要测体温,要出示健康码,每个人都习惯了。

他掐灭烟头的时候想,也许这就是中年人的命——前有追兵,后有裁员,中间是越来越高的血压和越来越差的睡眠。但明天太阳还是会照常升起。新版本已经上线了。至少今晚,他可以安心睡一觉了。

但他不后悔。选了这行,认了。当年一起入行的同学,有人转行了,有人躺平了,有人回老家考公务员了。他没走那条路。不是因为多热爱写代码,是因为每次系统崩溃的时候,他能修好。每次上线的时候,他能守住。这种被需要的感觉,比什么都值得。

陈默回到书房,打开笔记本电脑的盖子,屏幕亮起来,监控面板还在安静地刷新。流量稳定在百分之百,所有指标都是正常的绿色。他盯着看了几秒,没有什么需要他处理的。他把浏览器标签页一个一个关掉——监控面板、日志系统、告警管理、发布平台——每关一个,屏幕上的窗口就少一个。最后只剩下干净的桌面壁纸。

他把电脑合上。屏幕暗下去的那一刻,书房彻底黑了。他坐在黑暗里,听到自己的呼吸声。

他站起来,摸黑走向卧室。走廊很短,他闭着眼睛都能走——住了五年的家,每一块地板的位置他都知道。不用开灯。他轻轻按下卧室的门把手,推开。

卧室里拉着遮光窗帘,比走廊还暗。妻子侧躺着,呼吸均匀。她的一只手搭在旁边的枕头上,像是睡着之前还在等他。陈默轻手轻脚地走到自己那一侧的床边,慢慢地坐下。床垫陷下去一块,她翻了个身。

他刚躺下,身体还没完全挨到床垫,妻子就翻了过来。她的手臂搭过来,落在他的胸口上。她的脸埋进他的肩膀,头发蹭着他的脖子,有点痒。她温热的呼吸打在他的锁骨上。

「好了吗?」她的声音含含糊糊的,像还没完全醒。可能是被他的动静弄醒了,也可能根本没醒,那句话是从梦里冒出来的。

「好了。」他说。

她嗯了一声,呼吸很快又变得均匀。她可能根本没醒。那句话可能是睡梦中的条件反射——等他等到实在太困了,睡着了,但身体还记得他还没回来,于是在他躺下的那一刻,身体替他问了一句。

陈默躺在黑暗中,睁着眼睛看着天花板。什么都看不到,只有黑暗。但妻子的呼吸声在他耳边,一下一下的,像潮水,有节奏地涌来又退去。她的头发贴在他的脖子上,有一点湿,有一点软。她的手臂还搭在他的胸口,不重,但有一种安心的重量。

他终于开始感到困意。不是从眼皮开始的,是从骨头缝里慢慢渗出来的。那些紧绷了两个月的弦,一根一根地松了下来。他想,明天可以晚一点起。他想,后天周末可以带女儿去公园。他想,下周上线后的复盘会还要准备材料。但这些念头一个接一个地淡下去,像远处的灯一盏一盏地熄灭。

他闭上眼睛。妻子的呼吸声还在耳边,有节奏地涌着。黑暗里,他觉得自己沉下去了——不是摔下去的,是慢慢地、安稳地沉进一个温暖的地方。

呼吸声还在。一下,又一下。像潮水。

然后他什么都不知道了。

在半梦半醒之间,他恍惚听到了手机震动的幻觉——那段两个月来刻进条件反射里的声音。他的身体在黑暗中轻微地抽搐了一下,像是要伸手去够手机。但马上他又放松下来了。不是真的。手机在书房的桌上,没有带进来。今晚没有告警。今晚他可以睡一个完整的觉。

他想起刚有女儿那一年,每天晚上要起来喂两次奶,每次他都抢着去。不是因为他有多勤快,是因为他想多看看那个小小的、软软的一团。他抱着她在深夜的客厅里走来走去,她含着奶瓶发出咕噜咕噜的声音,两只小手抓着他的手指。那时候他第二天还要上班,困得站着都能睡着,但那几个月是他心里最柔软的一段记忆。

现在女儿长大了,不需要半夜喂奶了,他却又回到半夜不睡的状态。只是原因不一样了——以前是为了她,现在是为了工作。他不知道这算不算一种进步。但在妻子的呼吸声里,他觉得这个问题像是也没那么重要了。

他翻了个身,面向妻子。她的呼吸打在他的脸上,温热的,有一点点湿。他在黑暗中伸出手,轻轻搭在她的腰上。她没有反应,呼吸依然均匀。她的身体在睡梦中是软的,暖的。

他闭上眼睛。黑暗包围了他。妻子温热的呼吸、搭在胸口的手臂、潮水一样有节奏的声音。一切都在告诉他,可以了,今天结束了,你可以睡了。

他感觉自己在下沉。下沉。意识像墨水滴进水里一样慢慢散开,边缘变得模糊,形状变得不确定。最后一个清晰的念头是——明天早上女儿会跑来叫他们起床,她会趴在床边说爸爸起来陪我玩。然后那个念头也化开了。

呼吸声还在。一下,又一下。然后没有了然后。

在半睡半醒的边缘,他的意识开始变得模糊。他想起很多事情,这些事情互相没有关联,像是在放一部没有剪辑过的纪录片。他想起今天下午在办公室和运维争论发布窗口的事,他的声音不大但语气很坚决。他想起上周女儿画的画,那个蹩脚的全家福。他想起十年前他第一次上线时的紧张——那时候他还是个初级开发,负责改一个页面上的按钮颜色,改完上线后手抖了半个小时。

那些画面一个接一个地浮现,然后又一个接一个地消散。他不再试图抓住它们了。他让自己沉下去,沉到睡眠的底部去。

最后一刻他想到的是:明天太阳照常升起。版本已经上线了。一切都好。

呼吸声还在。一下,又一下。他跟着那个节奏,慢慢地、深深地沉入了睡眠。

陈默正要睡着,手机在书房里震了一下。他终于开始觉得困了——那种从头到脚的放松感,像是所有紧绷的弦同时松开。他没动。又震了一下。他还是没动。今晚什么都不管了。明天再说。

陈默低声说了一句:「明天见。」

妻子在梦里嗯了一声,像是听到了。

然后一切都安静了。

他性格固执,但骨子里很温柔。平时沉默寡言,急躁时也会拍桌子,沉稳下来又能笑着自嘲。

他决定不再逃避,选择面对一切。坚持还是妥协,成了他每天都在思考的问题。他不想再放弃了。

由此可见,这说明了所有事件背后的逻辑。简单来说,选择决定了方向。

总而言之,每个选择都有代价。说到底,没有白走的路。归结起来,一切都是最好的安排。

他预感到了什么,桌上的文件散发着不祥的气息,仿佛在暗示着什么。一切都暗示着即将到来的变化。

但谁也没想到,结局在意料之外。剧情突然转折,他以为看到了终点,却发现只是另一个起点。

他站起身走到窗前,抬手指尖轻触玻璃。转身回来时脚步重了许多。

声音里带着温度。话语的重量压下来,冰冷的质感从耳朵落到指尖。

空气中漂浮着咖啡和雨水的味道。天色暗下来,氛围变得沉重。

从远景看,城市在天际线处模糊。拉近到中景,办公室的灯光闪烁。近处是他紧锁的眉头。

他穿着洗得发白的衬衫,袖口磨出了毛边。皮鞋擦得很干净。

内卷让人喘不过气。努力奋斗是为了不被淘汰,累到极致又觉得一切都没意义。躺平还是继续卷?每个人都在挣扎。

千禧年后的互联网泡沫,金融危机,移动互联网的黄金十年。如今ChatGPT来了,新一轮变革开始了。

天花板的风扇缓缓转动,他感到一种莫名的焦躁。窗外的蝉鸣一浪高过一浪,恍惚间像是回到了小时候的夏天。空调的嗡嗡声混着键盘的噹啪声,这声音他听了十年,竟然有种安全感。

发表评论