创作声明:本文为虚构创作,请勿与现实关联
年会上,全场灯光暗下来的时候,我知道要颁「年度最佳项目团队」了。
大屏幕上开始播宣传片——我写的那套推荐算法跑出来的效果图,被剪成了三十秒的炫酷动画,配着激昂的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我看不懂!你能不能帮忙看一下!!」
韩峰发的消息:「老罗,紧急情况,推荐系统全线故障,麻烦回个电话。」
隔了两分钟:「老罗?」
又隔了一分钟:「老罗你在吗???」
沈露被手机震醒了,迷迷糊糊地凑过来。
屏幕的光照亮了她半边脸。
她看了一会儿那些消息,慢慢清醒了。
「怎么了?」
「线上崩了。」
「那你不帮忙处理一下?」
我看着屏幕上韩峰那一连串越来越急促的消息。
「我没有权限了。」
沈露愣了一下。
然后她想起来了——上周五,年会那天晚上,我告诉她的那件事。
她没说话。
我把手机翻了过去,屏幕朝下。
震动声闷在棉被里,一下一下的,像心跳。
热门跟贴