1 导语
HR 把离职协议推过来的时候,我正蹲在机房地上,给三号机柜换风扇。
「沈工,先签个字吧,签完再修。」
我站起来,手上有机油,在工装裤上蹭了两下。协议上写着:协商解除劳动合同,补偿 N+1,税前十九万八千元整。
我看了三分钟,签了。
HR 明显松了口气:「沈工,你是我见过最配合的。」
我说:「我配合,是因为我知道你们会回来。」
她笑了:「沈工真会开玩笑。」
我把工牌摘下来,放在桌上,蓝色挂绳垂到桌沿。
「小张,」我说,「这个系统里,四十三万行代码,谁写的哪一行,你让人记下来了吗?」
她的笑停住了。
2 被迫离职
我叫沈青,三十八岁,在安澜科技做了十一年。
安澜做城市供水管网调度系统。说白了,全市的自来水怎么走、哪个泵站开几台泵、哪片区域压力给多少,都靠一套软件算。这套软件叫「澜图」,是我们公司的主营业务,也是市水务集团唯一在用的调度平台。
「澜图」是我写的。
不是我主导,不是我参与,是我一个人写的。
二〇一五年公司刚成立,老板姓吴,接了这个项目,招了四个人,三个月走了三个,剩我一个。我从需求文档写到数据库设计,从采集网关写到调度算法,从后台写到前端大屏。上线前那两个月,我睡在公司,行军床放在机柜旁边,醒来就写,写完就测。
四十三万行。全国一千七百个测压点,八十六个泵站,十二个水厂,全在这套系统里跑。
十一年里,公司从七个人做到两百多人,从一间民房搬到写字楼十六层。老板吴总前年被资本收购,套现走了。新来的 CEO 叫陈立,四十二岁,履历上写着某知名商学院,开会爱说「对齐」「抓手」「闭环」。
今年三月,他空降了一个 CTO,叫魏凯,英文名 Victor,三十六岁,带了三个人进来。
五月十八号,公司开技术评审会。
会议室在十六楼,落地窗,能看见半条江。陈立坐主位,魏凯坐他右手边,我坐最末。
我讲的是《核心模块风险说明》,十四页。
第一页:澜图现有核心模块七个,其中四个由单人维护,无第二维护人。
第二页:关键算法无技术文档,注释覆盖率百分之十一。
第三页:加密密钥单点保管,无备份机制。
讲到第七页,魏凯打断我:「Shen,这些东西,你为什么不早做?」
「我做过。」我说,「二〇一九年我提过招人,吴总批了,招两个,一年后都走了。二〇二一年我又提过一次,批了一个实习生,干了四个月。」
「为什么留不住?」
「工资开不高。会写这个的人,市场上四万起,我们开一万八。」
会议室里有人笑。
陈立没笑,手指在桌上敲了两下。
「沈工,」他说,「你说的这些,本质上是说——公司离不开你。」
「不是。」我说,「是公司离不开这套系统。我只是暂时替它站着。」
「那如果我们要让它离得开你呢?」
我看着他。
「那就招三个人,给我两年。」我说,「我把文档写完,密钥拆成两份,算法讲透。两年之后,你们随时可以让我走。」
魏凯笑了一下:「Shen,两年太久了。我们要的是这个季度就有变化。」
「什么变化?」
「标准化。」他说,「把系统拆成模块,一个模块一个人,谁走了都能换。」
「这个方案的文档,谁写?」
「你写。」
「我写完,谁看?」
「我们看。」
「你们看不懂。」
会议室安静了。
陈立把笔帽盖上:「沈工,你这个态度,很有问题。」
「陈总,」我说,「我这个态度,十一年前就有了。那时候公司七个人,吴总跟我说,沈青,你把这套系统做出来,我养你一辈子。」
「吴总现在在哪儿?」
「三亚。」我说,「他有九套房。」
陈立的脸沉下去。
散会的时候魏凯走在我后面,压低声音:「Shen,你别把自己看得太重要。」
我停下脚步。
「魏总,」我说,「我没把自己看得重要。我是把系统看得重要。」
「有区别吗?」
「有。」我说,「我走了我还能活。系统停了,三十万人没水喝。」
三天后,小李被调去了测试组。
我问他:「谁安排的?」
他说:「魏总。他说我这边的活,让小周接。」
五月底,HR 张岚给我发消息:「沈工,下午三点,三楼小会议室,聊一下。」
我回:「好。」
那天上午我在机房,三号机柜的风扇坏了,轴承响,嗡嗡的,像有只苍蝇在铁皮盒子里飞。我自己带的备件,自己换。
三点差五分,我洗了手,上楼。
会议室里坐着张岚和魏凯。
张岚把协议推过来,笑得很客气:「沈工,公司业务调整,你这条线要优化。你放心,给的方案很厚道,N+1,税前十九万八,这个月的社保公积金公司继续给你交。」
我拿起来,从头看到尾。
魏凯在旁边说:「Shen,这不是你的问题,是组织架构的问题。我们要做年轻化,要提效。」
「嗯。」
「你的技术我们是认可的。」他说,「但是你这个岗位,坦白讲,一个人扛一整套系统,这本身就是个风险。我们接下来要做的是标准化、模块化,让更多人能接手。」
「挺好。」我说,「什么时候接手?」
「已经安排好了。」他笑,「小周他们组,下周就进来做代码梳理。」
小周,二十八岁,简历上写着某大厂三年经验,我见过他写的代码,一个接口里套了七层 if,注释是「//todo」。
我低头看协议。
第三页有一行小字:「乙方确认,已完成全部工作交接,无任何未了事项。」
我拿笔,在那行下面签了名。
张岚看了一眼,笑容真实了:「沈工,你是我见过最配合的。」
「我配合,是因为我知道你们会回来。」
她愣了一秒,随即笑:「沈工真会开玩笑。」
我把工牌摘下来。
「小张,」我说,「这个系统里,四十三万行代码,谁写的哪一行,你让人记下来了吗?」
她的笑停住了。
魏凯接话:「这个不用你操心,我们有文档。」
「有。」我说,「我写了四百七十页的运维手册,在共享盘第三个文件夹。还有一份,是我上个月提的《核心模块风险说明》,发给过你和陈总,标题是『建议保留原维护团队』。」
魏凯的脸动了一下。
「那封邮件,」我说,「陈总回了我四个字:知道了,删。」
「我没删。」我说完,站起来,「你们慢慢查。」
3 早有预料
我收拾东西用了四十分钟。
路过打印机的时候,出纸口还是热的,上面压着一叠纸,没人拿。
我抽出来看了一眼。
《组织优化名单》,二十七个人。
第一行是我:沈青,技术部,工龄十一年,年薪四十二万。
往下翻,三十五岁以上的,十九个。
最下面一行是合计:本次优化预计年化降本六百四十万元。
我把纸放回去,摆整齐,跟原来一模一样。然后拍了张照。
这张照片后来没用上。
工位上的东西不多:一个马克杯,杯子上印着「澜图 V1.0 上线纪念」,二〇一五年;一盆绿萝,养了六年,藤蔓爬到隔板上;一摞打印出来的图纸,是十年前的管网拓扑图,用铅笔改过很多遍;还有一个抽屉,里面放着我女儿的蜡笔画,画的是三个人,中间那个穿着蓝色的工装,旁边写着「妈妈」。
我把画折好,放进包里。
隔壁工位的实习生小李凑过来,小声说:「沈姐,你真走了?」
「嗯。」
「那系统怎么办?」
「有人接。」
「谁接啊?」他压低声音,「小周昨天问我,泵站的 PLC 协议为什么不用标准 Modbus。我说我不知道,他说这系统写得不规范。」
我笑了一下。
「你跟他说,」我说,「二〇一六年甲方招标文件第三十七页写着:数据接口须采用私有加密协议,防止第三方系统接入。他要是想改成标准协议,让甲方重新招标。」
小李睁大眼睛:「真的假的?」
「文件在共享盘,自己找。」
我把绿萝端起来,想了想,又放回去了。
「这个留给你们。」我说,「记得浇水,两天一次。」
其实一个月前,我就知道会有这一天。
四月二十六号,方处长请我吃过一次饭。
地方是集团旁边一家川菜馆,小包间,就我们两个人。他点了四个菜,一瓶啤酒,自己喝,我喝茶。
「沈工,」他说,「我跟你交个底。你们这个系统,我们集团是唯一的客户。你们公司要是换了维护的人,我们这边是要重新评估的。」
「评估什么?」
「评估还能不能用。」
他夹了一筷子水煮鱼,放在碗里,没吃。
「去年我们做过一次压力测试,你们公司来三个人,其中两个连登录权限都没有。就你一个人,从早上八点干到晚上十一点。」
「习惯了。」
「习惯是你们公司的事。」他说,「我这边是怕。十七个亿的设备,三百万人的用水,我不能把命押在一个人的习惯上。」
我没说话。
他喝了口啤酒,放下杯子。
「沈工,我跟你说句实话。你要是哪天不想干了,来我们这儿。或者你自己出来,把运维接过去,我们签你。」
「我再想想。」
「想吧。」他说,「但是别想太久。」
我那时候以为他是在客气。
五月二十九号,我签完离职协议,走出会议室,手机响了一下。
方处长发来一条消息:听说你走了。什么时候有空,见一面。
我回:下周。
那天从公司出来,四点半天还亮着,太阳照在台阶上,一片白。
我站在台阶上,掏出手机,给女儿的老师发了条消息:今天我去接。
老师回:好的,沈知意妈妈。
我开车到学校门口,等了二十分钟。放学铃响,一群小孩涌出来。我女儿沈知意今年十一岁,五年级,背着一个比她还宽的书包,出来就找我,一眼看见,跑过来。
「妈?你今天怎么来了?」
「下班早。」
「你从来没下班早过。」
「以后都早。」
她盯了我两秒,说:「你被开除了?」
我停了一下。
「你怎么知道?」
「你眼睛红的。」她说,「而且你今天没穿工牌。」
我把她的书包接过来,背在自己身上。
「上车。」我说,「今天吃火锅。」
4 系统崩了
第三天是周五。
那天上午十点,我在家擦抽油烟机。
手机响了,是小李。
「沈姐!」他那边很吵,能听见有人在喊,「出事了!」
「慢慢说。」
「大屏全红了!」他声音发抖,「一千七百个测压点,一个数据都没有,全部掉线!调度中心那边打电话过来骂人,说城西两个区高层没水了,投诉电话打进市长热线了!」
我把抹布放下。
「什么告警?」
「网关全部认证失败。」他说,「报错是『token expired』。」
我坐在沙发上,没说话。
「沈姐,你听见了吗?」
「听见了。」我说,「小李,你听我说。那个 token 是甲方要求的一年一换,密钥在我这儿。上个月我提过续期申请,魏凯给我驳了,说『这种小事不要占用流程资源』。」
「那怎么办啊!」
「流程资源,」我说,「现在占用了。」
挂了电话,我继续擦抽油烟机。
十点四十,张岚打来电话。我没接。
十一点,魏凯打来。我没接。
十一点二十,一个陌生号码。我接了。
「沈青吗?我是陈立。」
陈立,CEO。
「陈总。」
「你现在方便吗?来公司一趟。」他语气很稳,但背景音里有椅子拖动的声音,还有人在小声吵。
「不方便。」我说,「我在擦油烟机。」
停了两秒。
「沈青,」他换了个语气,压低了些,「这件事是我们工作不到位。你先来,把系统恢复,其他都好谈。」
「陈总,」我说,「我已经不是公司员工了。离职协议上写着,我没有任何未了事项。」
「我知道,我知道。」他说,「所以我们走技术服务,按小时算,你开价。」
「按小时?」
「对,你开。」
我把抹布扔进水槽,洗了手。
「陈总,我不按小时。」
「那你按什么?」
「按年。」我说,「一年四百八十万,签技术服务合同,预付一半。另外,我有个条件。」
「你说。」
「魏凯,」我说,「让他走。」
电话那头安静了很久。
「这个……」他说,「人事上的事,我们内部处理。」
「那就内部处理完了再谈。」
我挂了。
5 上门求我
下午两点,我下楼取快递。
小区门口停着一辆黑色的车,车窗降下来,是陈立。副驾上坐着魏凯。
陈立下车,走过来,伸出手:「沈工。」
我手里抱着一个纸箱,没伸手。
「陈总,」我说,「您怎么找到我家的?」
「HR 有档案。」
「档案里写了我家地址,」我说,「可没写我今天在家。」
他笑了一下,把手收回去。
「沈工,我上来是跟你道个歉。」他说,「这件事,是我判断失误。」
「不是判断失误。」我说,「是你根本没判断。你看的是报表,报表上我是一个年薪四十二万的成本项。你不知道那四十三万行代码是谁写的,你也不想知道。」
魏凯在旁边插话:「Shen,话不能这么说,我们做过评估——」
「你评估什么了?」我看着他,「你说要做标准化、模块化。我问你,澜图的调度算法,用的是什么模型?」
他张了张嘴。
「是管网水力平衡的迭代求解,」我说,「我用了三层收敛判据,因为老城区管网漏损率高,单层判据会震荡。这个方案在二〇一七年甲方验收会上讲过,会议纪要第七页。你看过吗?」
他不说话。
「你没看过。」我说,「你连系统有几个模块都不知道,你只知道我一个人扛着一套系统,是『风险』。魏凯,我告诉你什么叫风险。风险就是我走了,你们连密钥在哪儿都不知道。」
陈立抬手拦了一下魏凯。
「沈工,」他说,「四百八十万,我认。合同我今天就能签。魏凯的事,我会去处理。」
「还有两个条件。」
「你说。」
「第一,我要见到书面的处理结果,不是口头。」
「行。」
「第二,」我说,「从今天起,系统所有变更必须过我。你们可以招人,可以重构,但上线前要我看。我不看的,出了问题别找我。」
陈立看了我三秒。
「可以。」
「那走吧。」我说,「去公司。」
6 秒救场
到公司是三点二十。
调度中心
十六楼的调度中心,大屏上密密麻麻的红点。值班的人围在下面,有个年轻人在打电话,声音很急:「……对,手动开泵,先保城西,城西两个小区的高层水箱见底了……」
我在电梯口碰见甲方的人,姓周,运维科科长,脸黑得像锅底。
他看了我一眼:「沈工,你来了。」
「周科长。」
「上个月我还问你们陈总,说你走了没有。」他把手插在口袋里,「他说没有。今天早上我打电话,他说你退休了。」
「三十八岁退休。」
「挺会说话。」他往大屏那边抬了抬下巴,「现在怎么说?」
「我先看。」
大屏下面摆着一部座机,一直在响,没人接。
我走过去,接了。
「喂,水务热线。」
一个老太太的声音,很急:「你们到底管不管啊?我们这栋楼六层,水龙头拧开是空的,我孙女的奶粉都冲不了。」
「阿姨,您哪个小区?」
「城西,锦绣苑,六号楼。」
「几点开始停的?」
「上午十点多就没了。我打了七个电话,你们那个小姑娘一直说『正在处理』。」
我看了一眼大屏,锦绣苑的位置一个绿点都没有。
「阿姨,」我说,「今天晚上六点之前,会有水。」
「你说话算数?」
「算数。」
挂了电话,我看表,三点二十二。
三小时三十八分。
我转身,朝我的老工位走。
魏凯带的小周坐在那儿,屏幕上开着我的代码。
我走过去看了一眼。
他在改我的加密模块。他把 token 校验注释掉了,改成 return true。
「你干什么?」我问。
他抬头,脸通红:「我……我先让数据通上来。」
「你这一改,甲方那边网关全部拒绝接入,因为报文里没有签名。」我说,「而且你改完,明天审计一查,这叫破坏计算机信息系统。你要坐牢的。」
他的手从键盘上缩回去了。
我把包放下,坐下,插上自己的笔记本。
「小李,」我说,「把二号线机柜的串口线给我。」
「好!」
我敲了六行命令,调出一个界面,输入密钥,回车。
大屏上,红点一个一个变绿。
一千七百个点,用了四十七秒。
调度中心里有人鼓掌。
我没回头,继续敲。
把日志导出来,把三个异常泵站的参数回滚,把告警规则重写了一遍——原来那条规则是魏凯让人改的,把「连续三次失败告警」改成了「连续十次」,所以前九次没人看见。
我改回三次。
做完这些,我站起来,转身。
陈立站在我后面,手里拿着一份文件。
「合同。」他说,「按你说的,四百八十万,预付一半,今天走流程。」
我接过来,翻到最后一页,签了名。
「还有,」他说,「魏凯的离职手续,下周办完。」
我看了一眼魏凯。
他站在墙角,领带松了,没看我。
「陈总,」我说,「我不需要他走。」
所有人都看着我。
「我说让他走,是气话。」我说,「他走了,换一个更不懂的来,我还得再来一次。」
「那你的意思是——」
「让他留下。」我说,「让他做我的对接人。我每个月给他一份清单,他签字。出了事,他担。」
魏凯的脸白了。
「沈工,」他嗓子有点干,「这……这不合适吧。」
「挺合适的。」我说,「你不是要做标准化、模块化吗?我给你标准化。每个月一号,我把系统风险清单发给你,你确认,你签字,你上报。你要是不签,出了事,责任在你。你要是签了,出了事,责任还是在你。因为你签了。」
他转头看陈立。
陈立没看他。
7 代价太疼
合同签完那天晚上,市水务集团来了一封函。
是第二天早上小李转发给我的,抄送了全公司。
函上写着:「贵司核心系统维护负责人变更事项,未按合同第十二条约定提前三十日书面报备。经评估,本次数据中断累计影响用户约四万三千户,构成一般违约。请贵司于五个工作日内提交整改报告,否则我方将依据合同第十三条,启动违约责任认定程序,暂缓支付本年度运维服务费,并保留追偿权利。」
小李给我发消息:沈姐,运维服务费是多少啊?
我回:三千万。
他发来一串省略号。
过了一会儿他又发:陈总把魏凯叫进办公室了,门关着,能听见骂人。
我没回。
那天下午,甲方那边来了两个人,一个姓方的处长,一个技术负责人。他们没去十六楼,直接来了我这儿——我在城东租了一间办公室,四十平米,两张桌子,一台服务器。
方处长进来,看了一圈,说:「沈工,早该这样了。」
我给他们倒水。
「方处,」我说,「您这话说得早了点。」
「不早。」他说,「去年我就跟你们陈总提过,这套系统的核心在你这儿,人走了,系统就是一堆废纸。他不听。」
「现在听了。」
「现在听,代价有点大。」他喝了口水,「沈工,我问你个事。」
「您说。」
「你那个技术服务合同,一年四百八十万,是你自己开的价?」
「是。」
他笑了:「开低了。」
十二月三号,甲方开整改会。
集团大楼十九层,长条桌,坐了二十几个人。我坐在方处长右手边第二个位置。
陈立坐对面,隔着整张桌子。
方处长开场第一句:「今天这个会,我先介绍一下。这位是沈工,澜图的原作者。现在是我们集团请的技术顾问。以后系统的事,她说行就行。」
底下有人笑。
陈立没笑。他的笔记本摊开着,笔放在上面,一直没动。
会开了一个半小时。我讲了四十分钟,讲密钥、讲备份、讲为什么必须双人保管、讲如果下一次再断,责任怎么分。讲完,方处长问:「陈总,你们这边有意见吗?」
陈立说:「没有。」
散会后,我在走廊等电梯。
陈立从后面过来,站在我旁边。
「沈青。」
「陈总。」
「我跟你道个歉。」
「不用。」
「我不是为裁员道歉。」他说,「裁员是董事会的决定,我执行的。那个我不道歉。」
「那为什么道歉?」
电梯到了,门开了,里面没人。我没进。
「为那句『知道了,删』。」他说,「你那份风险说明,我看了。看完就删了。因为我不想让董事会知道,这套系统一个人就能停。」
「你现在知道了。」
「知道了。」
「疼吗?」
他看着电梯门,门在那儿开了又关,关了又开。
「疼。」他说。
我进了电梯,按了一楼。
8 新团队开张
一个月后,我招了两个人。
一个是小李,他从安澜辞了,来我这儿,工资涨了两千。他说:「沈姐,我不是为了钱。」
「那是为了什么?」
「为了不当小周。」
另一个是个女孩,二十六岁,做数据采集的,面试的时候我问她:「你能接受没有文档的系统吗?」
她说:「能。我能读代码。」
「四十三万行。」
「那得读半年。」
「我给你一年。」我说。
十月底,我把「澜图」的加密模块重写了一遍,做了双人密钥。一份在我这儿,一份封存,交给甲方保管。
方处长签收的时候说:「你这是给自己上枷锁。」
「不是。」我说,「是给我女儿上保险。」
他愣了一下,没听懂。
我也没解释。
沈知意十一岁,她不知道她妈在做什么。她只知道,从九月开始,她妈每天晚上七点回家,会给她做饭,会检查作业,会在她睡着以后坐在客厅里看一会儿文件。
有一天她问我:「妈,你现在是不是当老板了?」
「算吧。」
「那你还怕什么?」
我想了想,说:「怕没人写文档。」
她翻了个白眼,回房间了。
9 文档留痕
十二月的最后一周,安澜开年会。
陈立给我发了请柬,说我算是「合作伙伴」,请我上台讲两句。
我去了。
酒店宴会厅,二十桌。魏凯坐在第三桌,看见我,站起来点头,笑了一下,笑得很难看。
我上台,接过话筒。
「各位,」我说,「我不太会讲话。」
底下笑。
「我就说一件事。」我说,「安澜有二百三十七个人,其中二百三十六个,你们的名字都在组织架构图上。剩下那一个,不在图上。」
「十一年前,公司七个人,我坐在机柜旁边写代码,写累了就躺行军床。那时候没人跟我讲『标准化』,也没人跟我讲『组织架构』。就一句话:这系统得跑起来,因为城西有三十万人要喝水。」
「现在系统跑起来了。」我说,「我希望它一直跑下去。所以我提一个建议:把『澜图』的核心代码,做一份完整的技术文档,交给甲方备案。不是为了我,是为了下一个坐在机柜旁边的人,不用花半年时间去猜我当年为什么这么写。」
「这个事,我免费做。」
底下安静了几秒,然后掌声起来了。
我下台,走到门口,魏凯追出来。
「沈工。」
我停下。
「那个文档,」他说,「我能参与吗?」
我看了他一会儿。
「可以。」我说,「但有一个条件。」
「你说。」
「你写的第一页,」我说,「得先写清楚你自己为什么被留下来。」
他站在那儿,走廊的灯照着他的脸,一半亮一半暗。
「因为你走了,」我说,「还会来第二个魏凯。但你留下来,至少你知道疼。」
腊月二十三,小李跟我说小周辞职了。
「他走的时候跟我说,他这半年学到的东西,比在大厂三年都多。」
「那他为什么走?」
「他说他扛不住。」小李停了一下,「他说每次改代码之前,要先看一眼沈姐写的注释,看一眼就觉得自己是个骗子。」
我没说话。
腊月二十七,魏凯第一次自己写文档。
写到第三页,他来找我,抱着一台笔记本,站在我办公室门口,不进来。
「沈工,」他说,「这个数据模型,我画不出来。」
「画不出来就空着。」
「空着甲方不认。」
「那就写一句:此处待补,责任人魏凯。」我说,「写上你的名字,签上日期。」
他站了一会儿。
「就这样?」
「就这样。」我说,「文档不是给我看的,是给下一个接手的人看的。他看见这句话,就知道这块地是空的,不会掉进去。」
他走了。
第二天小李发给我一张照片:那张纸被打印出来,贴在魏凯的工位隔板上,A4,边上用透明胶粘了四条。
10 撕证明吃面
过年之前,我把离职证明从抽屉里翻出来。
一张 A4 纸,上面写着「因个人原因,双方协商一致解除劳动合同」。落款是安澜科技,盖着红章。
我看了很久。
那天签字的时候,我其实什么感觉都没有。不是麻木,是太清楚了——清楚这套系统离了我会怎么样,清楚他们什么时候会回来,清楚我等得起。
我等的不是一句道歉。
我等的是他们自己走到那一步,然后发现,那一步是他们自己走的。
我把那张纸对折,再对折,撕成四片。
扔进垃圾桶的时候,我女儿在客厅喊:「妈,面好了没有!」
「好了。」
我关了厨房的灯,把面端出去,两碗,一碗给她,一碗给我。
她吸溜了一口,抬头说:「妈,你以后别加班了。」
「不加了。」
「真的?」
「真的。」我说,「妈妈现在按年收费。」
她听不懂,低头吃面。
窗外有人在放烟花,是小年。