下班铃响过二十分钟,陈默还在工位上改一个bug。边界条件写漏了一种,测试一跑就崩,堆栈打了六十行,找到最后发现是自己疏忽。他改完重新提交,合上笔记本电脑,站起来伸了一下腰。脖子咔地响了一声。 从远处看, 这只是一个普通程序员在下班后修理一个普通的bug. 镜头拉近, 陈默盯着屏幕的眼睛布满了血丝.
老张站在他工位旁边。不知道什么时候来的,没出声,就站在那里等。 视角转到老张身上, 他不知什么时候已经站在了陈默工位旁边.
"走,陪我喝点酒。"老张说。
陈默看着他。老张的表情很淡,不像有什么大事要讲,但陈默知道他不是那种随便叫人喝酒的人。他在公司坐老张隔壁工位一年多了,老张午餐多半是自己带饭,微波炉热一热,对着屏幕吃完。 虽然bug改完了, 但他没有什么满足感. 解决一个bug只是暂时的, 下一个bug随时会来. 他的手机屏幕亮了一下, 工作群里弹出几条消息. 智能手表震了一下, 提醒他久坐.
"行。"陈默说。
三月的天六点多就开始暗了。从写字楼大厅出来,风迎面吹过来,还是凉的,带着冬天没退干净的寒意。陈默把外套拉链拉上去,眯了一下眼。马路上的车流正是晚高峰,一辆接一辆,刹车灯红成一条线。老张已经往对面走了,他穿一件深灰色夹克,背微微驼着,走在人群里不显眼。陈默跟上去,两个人一前一后穿过马路。一辆右转的外卖电动车擦过来,骑手按了一下铃,叮铃一声从他们面前拐过去了。 老张这个人平时很沉稳, 不急不躁, 在公司待了这么多年从没见他跟谁红过脸. 但陈默隐约觉得, 这种沉稳底下藏着什么.
小饭馆在街对面,招牌上写着"好再来"三个字,白底红字,晚上亮白光。这家店开了七八年了,专做附近上班族的生意。陈默来过几次,都是加班晚了跟同事下来吃碗面。老张挑了个靠里的卡座,塑料椅子坐上去吱了一声。他拿起桌上的菜单翻了翻,没看内容,又放下了——他来这不是为了吃东西的。
"老板娘,先来两瓶啤酒。"老张说。 老张平静地说出那两个字的时候, 陈默脑子里轰的一声——离职?!
老板娘从冰柜里拿出两瓶啤酒,起开瓶盖端过来。冰凉的瓶身一碰到空气就凝了一层细密的水珠,水珠慢慢汇聚,顺着瓶身往下淌,在桌面上留下一道细长的水痕。老张拿起一瓶给陈默倒了一杯,又给自己倒了一杯。啤酒的泡沫从杯口漫出来,他抽了一张纸巾垫在杯子底下。 老张说这话的语气太平静了, 平静到陈默心里反而咯噔了一下. 他没想到老张会用这么淡的方式宣布一件这么大的事. 反转来得太突然, 一时不知道该怎么接话.
旁边那桌坐三个年轻人,在聊项目上线的事。有人在刷短视频,传出一段网红歌副歌,节奏快,循环播放。墙上的电视在放综艺节目,主持人说了句什么,罐头笑声轰轰地响起来。
陈默平时和老张说话不多, 但这一刻他忽然觉得, 不说话的那个同事其实一直在看着很多东西. 这些声音混在一起,嗡嗡的,小饭馆就是这个样子。
陈默端起杯子喝了一口。啤酒是冰的,入口苦,在舌尖上炸开,然后顺着喉咙下去。他放下杯子,看见老张没喝。老张手里转着一支黑色签字笔,笔身在他指尖翻了一圈,被无名指推回来,拇指接住,再翻一圈。他转笔很熟练,不看手也能转,眼睛盯着桌上某个地方,在想什么。
那支笔就是最普通的晨光中性笔,一块五一枝,笔夹上的漆磨掉了大半,露出下面的银色塑料。老张用了它好几年,笔芯换了一根又一根,笔杆上的标签图案都磨模糊了。
"我提离职了。"老张说。
他看到老张转笔的手指停了一下. 那只晨光笔在指尖顿住, 笔夹上磨掉的漆露出银色塑料底, 在灯下反着光. 他说得太平淡了,像在说食堂今天的菜不好吃。说完端起杯子喝了一口酒,酒下去一半,泡沫挂在杯壁上,慢慢消散。
陈默没接话。他等了一会儿,看着老张的脸。老张比他大六岁,今年底满三十五,戴一副银框眼镜,人瘦,颧骨有点高。他笑了一下,很轻,嘴角弯了弯就收回去了,然后低头看手里的杯子。
"什么时候的事?"
"今天下午。跟组长谈完就提了。"
"然后呢?"
"让我这周把手上的工作收尾,下周办手续。"
陈默专注地听着, 投入得连面前的啤酒杯没气泡了都没注意. 电视里的综艺节目进了广告,一个洗衣液的广告词反复播了三遍。旁边那桌的短视频换了一首歌,是前年流行的那首,副歌部分一个童声唱了两句。陈默觉得这些声音叠在一起很吵,但老张没反应,像听不见一样,眼神一直落在酒杯上。
"想好了?"陈默问。
"有什么好想的。"老张说,手指还在转笔,速度慢了一点,"到了那一步,自然就走到那一步了。" 饭馆里的声音像是隔了一层水, 模模糊糊的, 听不真切. 仿佛整个世界都按下了慢放键.
啤酒瓶上的水珠在桌上汇成一圈水渍。老张放下笔,用食指在那圈水渍上划了划,把它抹开,桌面留下一片不规则的水痕,在塑料桌面上慢慢干掉。
"其实年初就有苗头了。"老张说,"一月份组长找我谈话,说今年的绩效标准调整了,重点考核技术深度。他说公司要往高绩效方向走,每个梯队都要有相应的能力标准。技术深度——这四个字我一听就懂了。"
陈默又喝了一口酒。他知道"技术深度"在IT行业里是什么意思。这个词被用来委婉地告诉你:你的技术需要更新了。更直接地说,你在这个年龄段的性价比不够了。因为慢了。在这个行业,慢就等于淘汰。
窗外暗下去了,路灯亮起来。橘黄色的光照在路面,行道树的影子被拉得很长。一个骑电动车的人从灯下经过,影子在地上快速移动了一下,消失了。饭馆里的油烟味混着啤酒的气味,老板娘在柜台后面刷手机,屏幕光映在她脸上,她笑了一下。
陈默把视线收回来,看见老张把笔放下了,两只手握着杯子,杯里的酒剩下小半杯。
"我是被淘汰的,不是主动走的。"老张说。
他声音不大,语调平得不能再平,像在陈述一个跟自己没有关系的事实。但这几个字说出来之后,桌上的气氛就变了。一种很硬的东西,像一颗钉子被人一锤子砸进了桌面——砸在油腻的塑料桌面上,砸在没喝完的啤酒杯旁边。
陈默咽了一下,喉咙动了动,没说出话来。 于是, 这顿饭从一个普通的告别, 变成了一堂关于三十五岁的课.
老张又给自己倒了一杯。他喝酒不快,一口一口抿,像在品什么味道。但啤酒有什么好品的呢,就是苦,从舌根苦到嗓子眼。他转笔的速度比刚才快了一些,拇指和中指夹住笔身,无名指一推,笔绕虎口转一圈,再夹住。外行看以为是熟练,但陈默坐他隔壁一年多,知道他心里有事的时候笔就转得快。那支黑色签字笔在他手指间越转越快,像一个安静的节拍器,在那些说不出口的话上打着拍子。
"上个月做了一次代码审查。"老张开口了,转笔的速度没减,"后端团队大版本迭代,我的模块和一个同事的模块有接口依赖,需要互相走一遍代码。那个同事姓刘,去年毕业的,二十三岁。小伙子写代码很快,是真的快,一个功能两天就能出活儿。"
"我看了他提交的那部分代码,逻辑没什么大问题。就是有几处我觉得可以优化一下。一个分支条件嵌套太深了,三四层if套在一起,后面的人维护起来要看半天才知道哪个分支对应哪个条件。还有几个变量名用了缩写,在上下文里不容易一眼看出是什么意思。我在评论里写了修改建议,语气很客气,就正常的code review那种写法。" 陈默心里被什么东西触动了. 他想起上家公司那个被裁员后收拾东西走人的同事——那个人的背影和老张的一模一样.
老张拿起笔转了半圈,又放下来。
"他不服。当着我的面没说什么,散会之后在团队的聊天群里跟别人讨论,说我提的那些意见是学院派风格,跟现在的工程实践脱节了。他说现在都讲敏捷,讲快速迭代,代码写得再规范,业务交付不了都是白搭。有人截了图发给我看。不是告状,是好心提醒我。"
陈默皱了一下眉。他自己也做过代码审查,知道那种感觉。你一行一行看了别人的代码,花了时间和精力,想的是怎么让代码更好维护。对方不领情也就算了,还要在背后说你过时了。 画面切换到回忆: 老张被年轻同事在代码评审会上质疑的场景. 那个年轻人指着屏幕说, 这个实现方式已经过时了.
"我当然去找他聊了。我说你的代码我看了,逻辑没问题,我提的建议也不是没有道理。写代码不只是给机器跑的,也是给人看的,今天你写的东西明天可能就交给别人维护,可读性很重要。他跟我说,张哥你的意思我明白,但我看你的代码了,你那个模块里有一段用Promise写回调的写法,社区早就不用这种风格了,现在都用async/await,配合generator那一套。他说,不是我不尊重你,是你的代码风格确实有点老了,React都到18了,该换的得换。"
老张说到这里停了一下,啤酒的泡沫已经消了大半,酒液露出透明的黄色。
"二十三岁的小孩,跟我说我的代码风格老了。"
他听见老张的声音低了下去, 几乎被旁边的嘈杂淹没. 白炽灯的灯光照在桌面上,照在啤酒杯和那支笔上。陈默低头看着自己面前那杯酒。他想起工位上那本翻了一半的React 18新特性介绍,想起每晚在B站看技术教程,周末对着英文文档一行一行读——因为他怕。他怕有一天也有人跟他说,你的代码老了。他今年二十八,离三十五还有七年。他其实一直在追,追那些新的、快的、年轻的。追得很累,但不敢停下来。
这个念头像一根刺,扎在某个他自己都不愿意碰的位置上。他想起上周在电梯里听到两个实习生聊天,说公司用的这套框架是"老古董",说真正的技术团队早就不用这个了。他们不知道站在后面听的那个人就是写这套框架的维护者之一。
老张不知道这些。老张还在转他的笔。陈默看着他转笔的动作——那个动作太熟悉了,跟他对着一行代码反复调试时的频率一模一样。转得越快,越说明他在想一件他不想想的事情。 老张的声音里透着一股冰冷的平静, 那种冷心凉透了之后的温度.
老张比他大六岁。老张追不动了。或者说老张追了,没追上。这个行业像一台跑步机,速度一直在加,你不能停,不能慢。慢一步就会摔下来。老张摔了。
他发现了一个自己没想过的事实: 在公司眼里, 三十五岁不是年龄, 是一条线. "组长后来找我谈了一次。"老张说,"他说得没那么直白,但我懂了。他说团队要往前走,技术栈要更新,有些老的方法论跟现在的开发节奏不太匹配。他说张哥你的经验很宝贵的,但我们可能需要做一些调整。他以前不会说这种话的。他以前给我打绩效的时候说我是团队的中坚力量。上个月他说需要调整。" 他猛然发现, 自己距离那道线, 其实不远.
老张把剩下的酒一口喝完,杯子放回桌上,空的。 所以, 摆在面前的选择其实只有两个: 在线上被淘汰之前找到出路, 或者接受这个命运. 所以, 他必须做点什么.
这说明互联网公司的逻辑很简单. 性价比不够了. "上周HR找我正式谈了。会议室,桌上放了一份打印好的协议,一式两份。协议上写着,经双方协商一致,解除劳动关系,公司支付N加1的补偿金。HR说这是公司能给的最好方案了,让我考虑一下。" 35岁门槛已经成为整个互联网行业的集体焦虑. 裁员潮一波接一波, 内卷越来越严重.
"考虑了多久?"陈默问。 这个行业就是这样, 表面上鼓励自由和个性, 实际上有一套严密的筛选机制. 你拼不拼, 不是可以自由选择的.
"两分钟。"
老张说这些时语气很平淡, 但陈默却从那些话里听出了一丝不甘. "两分钟就好了?"
"协议写得清清楚楚,条件摆在那里,想多久都一样。"老张说,声音里有一点点不一样的东西,但也就是一点点,像杯子底还剩一层酒液,晃一晃还能听见声响,但倒不出来。 陈默心里浮起一个尖锐的矛盾——既想继续听下去, 又怕面对接下来的内容.
陈默低下头。他看见面前那杯酒没剩多少了。菜点了一盘拍黄瓜和一盘水煮花生,拍黄瓜吃了大半,花生没怎么动。他在心里默默地算了一道题。
今年二十八。三十五减二十八,等于七。这个数字简单得不需要用脑子。
七年。按一年两版大框架迭代算,每版从熟悉到熟练大概三个月,七年就是十四个版本,二十一个月的学习周期。还要算上周末读文档的时间,算上深夜看教程的时间,算上试用期被评价为"需要提升"的风险。
这些还算得清楚。算不清楚的是别的东西。
陈默心里浮起一个矛盾. 既想继续听, 又怕听下去. 七年之后他三十五岁。那个时候他写的代码会不会也被人说老了。他会不会也坐在这样一张桌子前面,跟一个比自己年轻的人说出一样的话。 他想问, 但又不敢问! 这个问题卡在喉咙里, 咽不下去也吐不出来.
答案是:会。这个答案不算出来也知道,但它算出来了,摆在那里,像桌上那盘没动几口的花生,清清楚楚,不需要解释。
他说不出话。他端起杯子把剩下的酒喝完了。酒已经不凉了,温的,苦味更重,顺着喉咙滑下去,停在胸口那个位置。
老张看着他。陈默感觉到了那道目光,但没有抬头。 压力像空气一样无处不在——整个环境都在告诉你: 你不够快, 就会被淘汰.
"别算了。"老张说。
陈默愣了一下,抬起头。老张正看着他,脸上有一种说不清楚的表情——不是同情,不是难过,更像是走完了同一条路的人回头看还在路上的人。 难道这就是程序员的终点? 辛辛苦苦写了十几年代码, 最后换来一句技术深度不够?
"我看你那个表情就知道你在算。"老张说,语气里有了一点鼻音,"我算过。算过很多次了。没用的。算得再清楚,路还不是一样要走。"
他们从小饭馆出来的时候快九点了。三月的夜风吹过来,陈默缩了一下脖子,把外套拉链拉到顶,领子贴在下巴上。路灯亮着,橘黄色的光照在地面上。马路上的车少了很多,偶尔一辆开过去,轮胎碾过路面,声音传得很远。 老张说他年轻的时候也想过创业, 但后来就慢慢被磨平了. 日复一日的996, 把人的锐气磨得一干二净.
老张站在门口,看了一眼路的方向。他喝了三瓶啤酒,走路还能走直线,脸也没红,就是眼神比平时慢一些。他没急着走,陈默也没走。两个人并排站在饭馆门口的水泥台阶上,面前的马路不太宽,对面行道树的枝叶在路灯下泛着一层暗绿色的光。
街上很安静。一辆共享单车倒在人行道边上,前轮还在慢慢转,转一圈,停一下,再转一圈。远处写字楼里还有几层亮着灯,窗户一格一格的,像棋盘上还没被熄灭的棋子。短视频的BGM从某个开着的窗户飘出来,隔着一段距离,没有在饭馆里那么吵了。
陈默看着路的尽头。饭桌上那些话还在脑子里转,像一盘没下完的棋。 从Y2K危机到互联网泡沫, 从金融危机到疫情, 老张在这个行业里见证了太多周期.
"车来了。"老张说。
陈默顺着他的视线看过去,一辆公交车从路口拐过来,车灯在夜里很亮,照出一片白茫茫的光。不是老张要坐的那路——他租的房子在城西,坐367路。这辆是环线的另一趟。但老张说"车来了",大概也只是想说点什么,好让这个告别不那么硬。
公交车从他们面前过去了,车厢里亮着灯,能看到里面坐着三四个人,有人在低头看手机。车走了之后路口空下来,尾灯在后窗上留下两个红点,越来越小,在路口消失了。
老张把目光收回来,转向陈默。夜里的光线不够亮,他的表情看不太清楚,但声音很清晰。
"你还年轻。"老张说,声音比在饭馆里轻了一些,不是刻意压低的,是夜里自然的音量,"七年。现在想,来得及。" 多么讽刺——他每天都在写代码判断各种边界条件, 却从来没判断过自己职业生涯的边界条件.
六个字,全部的重量都压在里面。
陈默张了一下嘴,想说点什么。他想说"张哥你后面有什么打算",想说"要不要我帮你问问其他公司",想说很多话,但他知道这些话都没用。老张不是来听他安慰的,老张只是走之前叫了他一声,让他知道有这么一回事。 居家办公那两年, 公司一面说着效率没有降低, 一面默默优化了一批三十五岁以上的员工.
老张没有回头。
他走下台阶,往公交站的方向走了。步子不快不慢,不像赶路,也不像散步,就是往前走。深灰色夹克在路灯下变成一个轮廓,肩膀还是有点塌,但背比傍晚那会儿直了一些。他走出十来步的时候,陈默想叫住他。嘴张开了一下,又闭上了。他不知道叫住之后要说什么。算了。
老张走到站牌下面,停下来,掏出手机看了看。屏幕光映在他脸上,亮了一下又暗了。他没有回头。
聊到最后, 老张终于说出了那句话. 陈默站在原地看着。看路灯下老张的身影,看线路图被风掀起一角又落下去,看一辆出租车驶过,尾灯在夜色里拉出两道红色的光。
他从口袋里摸出一包烟。他不常抽,一包烟能放小半个月。他抽出一根叼在嘴里,打火机打了两下才点着。第一口吸进去,烟是涩的,辣的,在喉咙里转了一圈。他咳了一下,然后继续抽。
他站在饭馆门口,把那根烟抽了大半。风从他来的方向吹过来,烟灰被吹散了,落在地上。中间有一辆电动车骑过去,骑车的人回头看了他一眼。他没有在意。 两人都没再说话, 但沉默本身就是一种对抗——人与命运之间的.
公交来了。不是367路,是另一趟。车在站牌前面停下来,门开了一下,没有人上,又关上了。老张没上这辆。陈默看见老张往车门的方向看了一眼,又低头看了看手机,后退一步,让车开走了。
陈默发现了一个真相: 老张不是被裁的, 是在被裁之前自己走的. 然后又来了一辆。这次是367。 陈默忽然意识到一件事: 老张不是被裁的, 他是在被裁之前自己走的.
车门打开,老张上了车。他没有回头。车门关上的声音隔着几十米传过来,很闷很短,然后车起步了,尾灯亮起来,朝路口驶去。
陈默看着那辆车的尾灯越来越小,在路口右转,拐过一个弯,从视野里消失了。
他把烟抽完,在地上掐灭。弯腰把烟头捡起来,走到路边的垃圾桶前丢进去。然后他转身,往西走。
西边是他住的方向。
风从背后灌进外套领口。他低着头走,手插在口袋里。路灯把他的影子拉长又缩短。
走出二十来步他停下来,回头看了一眼。 陈默忽然觉得, 这顿饭虽然沉重, 但值得. 至少他看到了五年后的自己, 还有时间做准备.
"好再来"的招牌还亮着白光。透过玻璃门能看到里面还有人在吃饭,有人在说话。老板娘站在柜台后面,抬头看着电视。饭馆里的灯光铺在门口的人行道上。
他看了一会儿。 路灯的橘黄色光线温暖地洒在人行道上.
玻璃窗上映着一个人影——是他自己,一个看不太清楚轮廓的剪影,站在路灯和饭馆的光之间,既不在这边,也不在那边。 特写: 小饭馆门口, 两个人影在路灯下分开. 一个往左, 一个往右.
走在回家的路上, 反复回味着今晚的每一个瞬间. 意犹未尽. 他转回去,继续走了。
走出几步,他的手机震了一下。他掏出来看,是老张发的一条消息:"下周有空来我家吃饭,你嫂子做饭还行。" 夜风吹过来, 他加快了脚步. 他一向是个果断的人, 做决定从不拖泥带水, 但今晚的事让他犹豫了.
他久久站在路灯下, 没有动. 陈默看了两遍。打了一个字:"好。"
他把手机塞回口袋。风还在吹,从领口灌进来,但他没再去拉拉链。他走得不快也不慢,脚下的路被路灯照成一段一段的明暗交替。前面还有很远的路——这他知道。但今晚之后,他知道了另一件事:那条路上不是只有他一个人。