创作声明:本文为虚构创作,请勿与现实关联

年会上,全场灯光暗下来的时候,我知道要颁「年度最佳项目团队」了。

大屏幕上开始播宣传片——我写的那套推荐算法跑出来的效果图,被剪成了三十秒的炫酷动画,配着激昂的BGM。

台下四百多人鼓掌。

韩峰带着三个人走上台。

聚光灯扫过他们的脸——韩峰、苗苗、陆扬。

三个人,三个名字,三束追光。

台下第七排靠走廊的位置上,没有光。

那是我的座位。

韩峰接过话筒,西装袖口露出一截手表链,金属反光在大屏幕上一闪。

「感谢公司的认可。这个项目能成功,首先要感谢我们的产品经理苗苗,是她精准的需求洞察让产品方向从未偏航——」

掌声。

「要感谢我们的前端负责人陆扬,用户体验的每一个细节都凝聚着他的心血——」

掌声。

「更要感谢我们的合作伙伴——算法供应商智远科技的王总,没有他们的数据支持,这个项目不可能走到今天——」

掌声。

三个名字,说完了。

他举起奖杯,笑容对准了台下正中的摄影机位。

闪光灯亮了十几下。

我坐在第七排,鼓着掌。

掌心拍得很响。

手机在口袋里震了一下。

沈露发的微信,一个字:「?」

她在看公司的直播。

我没回。

年会结束后,我没参加聚餐。

我回到公司的办公楼——年会在酒店办的,公司就在隔壁两百米——刷卡进了楼,电梯到九楼,走到自己的工位,坐下。

整层楼都是黑的,只有应急灯亮着绿光。

我打开电脑,登录内网。

打开代码仓库的管理后台。

管理员列表里有四个名字——韩峰、陆扬、小贾,还有我。

我点进自己的账号,点了「移除管理员权限」。

系统弹出确认框:「确认移除?此操作将取消您对该仓库的管理权限,包括分支保护策略、合并审批权限及部署密钥管理。」

我点了确认。

页面刷新。

管理员列表变成了三个名字。

我关掉电脑,站起来。

走到工位旁的书架前,把那个U盘插进笔记本——里面存着一份文件,git日志导出的PDF,三百四十七页,记录着这个项目每一行核心代码的提交者和时间戳。

我把U盘拔下来,放进口袋。

然后关了灯,走了。

两周后的一个凌晨,我的手机被打爆了。

沈露在黑暗中被吵醒,看见屏幕上一连串的未接来电和微信消息,同一个名字反复弹出来——

韩峰。韩峰。韩峰。

她揉着眼睛,声音沙哑:「出什么事了?」

我把手机翻了个面,屏幕朝下。

「线上崩了。」

「那你不接?」

我看着天花板。

「我没有权限了。」

打开网易新闻 查看精彩图片

01

这个项目叫「灵犀」。

公司做了三年的一个智能推荐系统——用在自家App里的,首页内容推荐、搜索排序、个性化推送,所有跟「猜你喜欢」相关的东西,底层都跑的灵犀。

三年前项目启动的时候,团队一共五个人。韩峰是项目负责人,带着一个产品经理苗苗、一个前端陆扬、一个后端小贾,还有我。

我的title是「算法工程师」。

说是算法工程师,但项目初期什么都缺。推荐引擎没有现成的,要从零搭。数据管道没有,特征工程没有,模型训练的Pipeline没有——连GPU服务器都是我自己找IT部门申请的,前两个月用的是一台淘汰下来的旧机器,显卡风扇转起来像拖拉机。

韩峰不懂算法。

这句话没有贬义。他是做项目管理出身的,协调资源、推动进度、对上汇报,这些是他的活儿。他做得不错——至少在项目初期,他确实帮团队扛住了很多来自上面的压力,让我们有空间安心干活。

但算法这块,从第一行代码到最后一次模型迭代,都是我的。

不是我一个人写的——后来团队扩到十二个人,算法组有四个人,但架构是我定的,核心模型是我训练的,线上推理服务是我部署的,出了故障是我半夜爬起来修的。

代码仓库里的提交记录不会说谎。

三年,一万四千多次commit,其中我的名字出现了六千三百次——占总量的百分之四十五。

第二名是小贾,一千八百次。

韩峰的提交记录是零。

不是零次提交——他有一次在readme文件里改了个错别字,算一次。

但我从来没在意过这些数字。

代码这种东西,谁写的谁知道。跑得好就行了,名字写在commitmessage里还是写在PPT上,对服务器来说没区别。

直到那天年会。

02

年会的事,其实有预兆。

颁奖前一周,韩峰在组内开了个会,主题是「年会材料准备」。

他说公司那边要做宣传片,需要团队配合拍点素材。

拍摄那天来了个摄影团队,在我们办公区架了机器。

导演——姑且叫导演吧,是市场部的一个小姑娘——拿着脚本走了一圈,指了指韩峰的工位:「韩总,这个镜头需要你对着电脑屏幕,做出在分析数据的样子。」

韩峰点点头,坐在椅子上,打开了一个他根本不用的数据看板页面,做出思考的表情。

咔嚓,拍了三张。

然后导演走到苗苗那儿,让她拿着一叠打印的需求文档摆拍。

又走到陆扬那儿,让他对着前端页面指指点点。

最后导演扫了一圈,准备收工。

小贾凑过来问:「不拍我们这边了?」

导演翻了翻脚本:「后端和算法这块……韩总说不用了,主要拍产品和交互的部分就行,技术细节观众看不懂。」

小贾看了我一眼。

我没抬头,继续调我的模型参数。

「技术细节观众看不懂」——这句话没毛病。

推荐算法长什么样?是一堆数学公式、一串代码、一坨服务器日志。它不像前端页面那样可以截图,不像产品原型那样可以演示。

它的存在方式就是——你打开App,首页推给你的内容恰好是你想看的。

你不会想到有人在后面算了三年。

你只会觉得:这个App挺懂我的。

年会前三天,我在内网看到了宣传片的初剪版——市场部发的,征求意见。

三十秒的视频里,出现了韩峰的正脸特写、苗苗的侧面镜头、陆扬手指划过屏幕的慢动作。

推荐效果的动画占了十秒——App首页内容像瀑布一样刷新,每一条都精准命中用户兴趣。

画外音说:「灵犀推荐系统,让每一次打开都是惊喜。」

那十秒的动画效果,背后是我三年写的十二万行代码。

画面里没有我。

我关掉视频,继续干活。

03

年会当天,我穿了件黑色衬衫——不是刻意的,是衣柜里能找到的最体面的衣服。

沈露看我出门前照镜子,走过来帮我理了理领子。

「今天年会?」

「嗯。」

「听说你们项目要拿奖?」

「公司内网发了提名。」

「你上台吗?」

我犹豫了一下:「不确定。」

她看了我一眼,没再问。

但她拿出手机,打开了公司的直播链接——年会对外直播的,家属可以看。

「我看着你。」她笑了一下。

到了会场,我找到自己的座位——第七排靠走廊,名牌是提前放好的。

前三排是高管和VIP客户,中间几排是各部门负责人,我们项目组的人散落在第六排到第八排之间。

韩峰坐在第四排——项目负责人待遇,靠前。

苗苗和陆扬也在第四排。

我的名牌在第七排。

这个座位安排,其实已经说明了一些事情。

年会开始,各种节目,抽奖,领导讲话。两个小时之后,进入颁奖环节。

「年度最佳项目团队」是最后一个奖,也是最重的。

大屏幕上开始播宣传片,我看到了自己写的算法跑出来的效果——那些精准推荐的内容在屏幕上流动,漂亮极了。

然后韩峰站起来了。

他整了整西装,从第四排走向舞台。

苗苗跟在后面,陆扬第三个。

三个人上了台。

台上的追光灯照着他们,白得发亮。

台下暗了。

我坐在黑暗里,看着台上那三个人。

韩峰说感谢的时候,我竖着耳朵听——不是期待,是一种很奇怪的感觉,像在等一个注定不会来的人敲门。

他说了苗苗。

他说了陆扬。

他说了算法供应商智远科技的王总。

智远科技——他们给我们提供了一批训练数据,总共合作了两个月,收了我们八十万的服务费。

韩峰感谢了一个收了我们钱的外包公司,没有感谢坐在台下的我。

我把手放在扶手上,指尖按着冰凉的金属。

旁边的小贾侧过头来看我。

我冲他笑了一下。

他转回去了,没说话。

04

年会结束,大家往酒店宴会厅走。

我没跟过去。

我跟小贾说我胃不舒服,先回去了。

小贾说要不要一起走。

我说不用。

走出酒店大堂的时候,手机震了。

沈露的微信:「?」

一个问号,什么都没写。

她看了直播。她看到了韩峰上台、点名、感谢。她也看到了我的名字没有出现。

一个问号就够了。

我回了一个字:「嗯。」

她没再发。

我站在酒店门口,外面刮着风,一月份的北京,零下八度,风从脖子灌进去,冷得清醒。

然后我走回了公司。

九楼,漆黑一片。

我没开灯,借着应急灯的绿光坐到工位上,打开电脑。

屏幕亮起来的时候,桌面上的快捷方式排列整齐——代码编辑器、终端、数据库管理工具、代码仓库。

我打开了代码仓库的管理后台。

灵犀的仓库有一百二十七个分支,核心的有三个——主分支、预发分支、线上分支。这三个分支上了保护策略,任何代码合入都需要管理员审批。

管理员有四个人:韩峰、陆扬、小贾、我。

韩峰有权限,是因为他是项目负责人。他从来不审代码——他看不懂。每次有合入请求需要管理员通过,他都直接点「approve」,因为他信我已经看过了。

陆扬有权限,是前端部分的需要。他只管前端仓库,后端和算法的代码他不碰。

小贾有权限,但他只负责后端接口,算法核心模块他从来没动过——不是不让他动,是复杂度太高,改一行可能崩一片。

实际上,灵犀的核心算法模块——推荐引擎、特征工程、模型训练Pipeline、线上推理服务——只有一个人完整地理解它的每一个齿轮是怎么咬合的。

我。

我看着管理员列表上自己的名字,鼠标移到了「移除」按钮上。

这不是冲动。

我坐在那里想了很久——大概五分钟,也许十分钟,我不确定,黑暗里感觉不到时间。

我想的是:三年了,这个仓库有任何问题,第一个被@的人是我。凌晨三点的告警,找我。线上推荐效果下降,找我。模型需要更新,找我。数据管道堵了,找我。

但台上那三个名字里,没有我。

那我继续当这个管理员,意义是什么?

当一个不被感谢的守夜人?

我点了移除。

系统确认。

页面刷新。

我的名字从列表上消失了。

然后我做了第二件事。

我打开文件管理器,找到一个脚本——我自己写的,功能是把git仓库的完整提交日志导出为PDF。每一次commit的作者、时间、改动内容、代码行数。

我跑了一下。

三百四十七页。

我把PDF拷到U盘里。

不是为了证明什么。

是因为有些东西,应该被完整地记录下来。

做完这两件事,我关了电脑,站起来。

办公室很暗,窗外的城市灯火隔着玻璃映进来,每个工位上的显示器都是黑的,像一排关着的眼睛。

我看了一眼韩峰的工位——在我斜对面,桌上摆着那个年度最佳的奖杯复制品(正品在公司展厅)。奖杯底座上刻着项目名称:灵犀。

我笑了一下。

然后拿起外套,走了。

05

回到家已经十一点多了。

沈露没睡,坐在客厅的地毯上,背靠着沙发,抱着一个抱枕,电视开着,声音调到最低。

她穿着家居服,头发散着,看见我进门,没有起来。

我换了鞋,走过去,在她旁边坐下。

「吃了吗?」

「没胃口。」

「我给你煮碗面。」

「不用。」

沈露把电视关了,客厅暗了下来,只剩厨房的灯透过来一点光。

「我看了直播。」

「嗯。」

「从头看到尾。」

她的声音平得像一张白纸。

「他上台的时候,我还在想,下一个就该念你的名字了。苗苗、陆扬……然后他说了一个什么科技公司的王总。」

她转过头来看我。

「一个外包公司的名字,排在你前面。」

我没吭声。

「罗征。」她叫我全名的时候,声音会下沉半个音调,「三年了。你多少个周末没休息过?多少次凌晨被电话叫醒?你女儿幼儿园亲子活动你缺了几次?」

「沈露——」

「让我说完。」她的眼睛亮了一下,不是泪光,是一种压了很久的东西终于涌上来了。「我不懂你们写代码的事。但我知道一件事——这三年,你的手机从来不敢静音。吃饭的时候手机在桌上震,你就放下筷子;睡觉的时候手机响了,你就穿着秋裤坐到书房去敲键盘。有一次半夜你处理完故障回到床上,四点多了,你以为我睡着了,其实我一直醒着。」

她深吸了一口气。

「你第二天早上六点又起来上班了。眼睛都是红的,我不敢问。」

我低下头。

「这些事,他一件都不提。站在台上感谢这个感谢那个——你呢?你坐在底下鼓掌?」

「我确实在鼓掌。」

「你——」她顿住了,盯着我。

然后她笑了。

那种笑很苦。

「你别告诉我你不在乎。」

「我——」

「你要是不在乎,你不会这个点才回来。你从酒店出来之后去了哪?我给你打了两个电话你都没接。」

我沉默了几秒。

「我回公司了。」

「回公司干嘛?」

「做了一件事。」

她等着我说。

「我把自己的代码仓库管理员权限删了。」

她皱了一下眉——她不太明白这意味着什么。

「就是说,从今天开始,他们的系统出了问题,我没有权限去修了。」

她的眼睛慢慢睁大了。

「你要干嘛?」

我靠在沙发上,看着天花板。

「我要辞职。」

沈露的手松开了抱枕。

她看着我,看了很久。

「你想好了?」

「想好了。」

「小曦怎么办?」

小曦是我们女儿,三岁半。

「我会找到新工作的。」

「我不是问钱的事。」她的声音忽然低了下去,「我是问——你确定这不是赌气?」

我转过头来看她。

她的眼睛里有担忧,有心疼,有一点点恐惧——但没有反对。

「不是赌气。是想明白了。」

「想明白什么了?」

「在这个地方,我做得再好,台上也没有我的名字。那我为什么还要在台下守着?」

沈露沉默了很久。

然后报了抱我。

06

周一,我提了辞职。

没有找韩峰——我直接给HR发了邮件,抄送了技术VP老林。

辞职理由写的「个人发展规划」,四个字,标准话术。

邮件发出去十五分钟,韩峰就出现在了我工位旁边。

他手里端着咖啡,脸上带着一种我熟悉的表情——那种「我很关心你」的职业化微笑。

「老罗,听说你要走?」

「嗯。」

「怎么这么突然?是不是年会那天——」

「跟年会没关系,想了很久了。」

他放下咖啡,在我旁边的空椅子上坐下来,身体前倾,压低了声音。

「老罗,你跟我说实话。是不是对年会的安排有意见?上台那个事情,名额是公司定的,不是我定的。我本来想把你也叫上去的,但HR那边说人数有限——」

「韩峰。」我打断他。

他的嘴停住了。

我很少叫他名字。平时都叫韩总,或者韩哥。

「不用解释。我的辞职跟年会没关系。」

他的眼神变了一下——不是愧疚,是警惕。

「那你是……拿到offer了?」

「还没有。」

「裸辞?」他的语气里多了一丝东西,很微妙,像是担忧,又像是松了口气。「老罗,现在行情不好,你这年纪裸辞——」

「我知道。」

「你再想想。真有什么不满意的,咱们可以谈。待遇、title、团队分工……你说,我尽量帮你争取。」

我看着他。

他的眼睛里,我看出了一件事——他不是怕我走,是怕我走之后出问题。

这两件事的区别,微妙而致命。

「不用了,韩峰。谢谢。」

他又说了几句挽留的话,都是正确的、体面的、让人挑不出毛病的废话。

最后他站起来,拍了拍我的肩——那个动作也是体面的。

「好,你的决定我尊重。交接的事,你列个清单吧,我安排人接。」

「已经在写了。」

他点点头,端着咖啡走了。

走出三步,他又回过头来。

「对了,老罗——代码仓库的管理员权限,你转一下给小贾吧。」

我盯着他的脸。

「已经转了。」

「什么时候的事?」

「上周五。」

他的眼神闪了一下,像是想问什么,但没问。

「好,那就好。」

他走了。

那天下午,我花了四个小时写交接文档。

写到核心算法模块的时候,我犹豫了一下。

这部分的逻辑非常复杂——推荐引擎的排序策略、特征交叉的权重分配、冷启动的兜底方案、A/B测试的分流机制——每一个模块都跟其他模块深度耦合,改动任何一个地方都可能牵动全局。

我写了整整十二页的文档,但我知道——文档能传递知识,传递不了直觉。

那些代码里有太多是经验积累出来的「潜规则」——为什么这个参数是0.7而不是0.8?为什么这个特征要做对数变换?为什么模型每两周必须重新训练一次?

这些东西不在任何文档里,在我的脑子里。

我把文档发给了小贾。

小贾看完之后走到我工位旁边,站了十几秒没开口。

「罗哥——」

「嗯。」

「你真要走?」

「真要走。」

他蹲下来,声音压得很低:「是因为年会的事吗?那天我——我应该说点什么的。」

「跟你没关系。」

「可是我觉得——那天韩峰应该叫你上去的。整个灵犀,核心代码都是你写的,所有人都知道……」

「知道的人知道就行了。」

他看着我,欲言又止。

最后他站起来,拍了一下我的桌子——不重,但有那么一点不甘心的力道。

「罗哥,你走了,这套系统我真的不一定扛得住。」

「扛得住的。文档我写了,有不懂的随时问我。」

「你都走了还问你?」

「微信不删就行。」

他苦笑了一下,走了。

最后一天,我把工位收拾干净。

键盘、鼠标、两本技术书、一个女儿画的冰箱贴——贴在显示器上的。

装进背包的时候,小贾走过来帮我拎了一下。

韩峰没来送。

我知道他在。他的工位上台式机亮着,企微头像是在线状态。

但无所谓了。

我走到电梯口,按了下行键。

电梯来了,我走进去。

门关上之前,我看了一眼九楼的走廊。

长长的一条,两侧是开放工位,尽头是韩峰的独立办公室,玻璃墙,百叶帘拉着。

那个年度最佳的奖杯复制品,还摆在他桌上。

门合上了。

两周后,凌晨一点十七分。

我的手机开始震。

第一通来电:小贾。

我没接——不是不想接,是想看看他是不是打错了。

第二通,还是小贾。

第三通,韩峰。

第四通、第五通、第六通——韩峰、韩峰、韩峰。

然后微信开始炸了。

小贾发的消息:「罗哥!!!线上推荐服务全挂了!!模型那边出了个什么error我看不懂!你能不能帮忙看一下!!」

韩峰发的消息:「老罗,紧急情况,推荐系统全线故障,麻烦回个电话。」

隔了两分钟:「老罗?」

又隔了一分钟:「老罗你在吗???」

沈露被手机震醒了,迷迷糊糊地凑过来。

屏幕的光照亮了她半边脸。

她看了一会儿那些消息,慢慢清醒了。

「怎么了?」

「线上崩了。」

「那你不帮忙处理一下?」

我看着屏幕上韩峰那一连串越来越急促的消息。

「我没有权限了。」

沈露愣了一下。

然后她想起来了——上周五,年会那天晚上,我告诉她的那件事。

她没说话。

我把手机翻了过去,屏幕朝下。

震动声闷在棉被里,一下一下的,像心跳。