![]()
我抱着纸箱走到停车位,手机屏幕还停在薪资明细上。原年薪六十万,新标准十万,那行数字像一道没擦干净的划痕。
身后传来急促的高跟鞋声。沈知微从电梯间追出来,手里攥着几份新人简历,纸角被她捏得发皱。
“周砚,你一走,全年4个核心项目全瘫痪了!”
我拉开后备厢,把纸箱放进去。里面是用了七年的键盘、两个旧工牌,还有团队送我的保温杯。
沈知微挡住车门:“现在不是闹情绪的时候。你先回去把项目恢复,其他事我们之后再谈。”
“我的离职手续上午已经办完。”我拿出文件袋,“如果公司需要技术服务,请先确认问题范围,再谈授权和责任。”
“四个项目都报错,还有什么范围可确认?”她把简历拍在车顶,“你带的人一起走,系统立刻出事,这很难不让人怀疑。”
我从文件袋里抽出交接风险单,翻到最后一页。接替负责人一栏空着,旁边却有沈知微的签名。
“接替负责人这一栏,是您坚持暂空的。”
她伸手来拿,我按住纸页:“先看日期。二十天前第一次提交,七天前复核,今天上午九点四十分再次签收。”
沈知微的视线停在三个日期上。她没有再抢,只问:“既然知道有风险,你为什么不等接替人到岗?”
“我提前三十天启动离职程序,公司决定岗位可以空缺。风险单写明,四个项目共用底层平台,没人接平台职责,就不能保证统一发布。”
她皱眉:“每个项目不是都安排了接收人吗?”
“接收文件的人有四个,决定公共版本的人一个也没有。”我松开纸页,“这两件事,风险单第一页就区分了。”
沈知微抬眼看我:“你是在告诉我,四个人都接不住你一个人的工作?”
“我是在告诉您,人数不能替代权限和职责。谁批准版本,谁协调兼容验证,谁在冲突时决定项目顺序,交接会上没人肯签。”
她沉默片刻,语气仍硬:“研发团队为什么偏偏今天一起离开?你组织过他们,对不对?”
我关上后备厢,没有回避:“我组织了共同交接,没组织任何人辞职。劳动争议和个人离职程序,是每个人自己启动的。”
“公司只是调整薪酬,不是赶你们走。”
我点亮手机,把未签署的降薪通知给她看:“六十万降到十万,年度奖金同时取消。我没有签同意书,其他人也各自做了选择。”
“奖金方案本来就能调整。”
“所以我们依法提出异议,也按期限完成交接。”我收起手机,“沈总,今天要核验技术问题,就别把劳动争议和故障原因混在一起。”
沈知微盯着我,像第一次发现我没有顺着她给出的期限立即行动。过去七年,她说今晚要结果,我总会先把机器救起来。
她压低声音:“邵衡刚发来消息,说服务器上的资料缺失,接手的人根本无法运行。你怎么解释?”
“让他指出缺哪一项。”我看了一眼时间,“代码、构建说明、环境镜像校验值和依赖表,都有签收记录。”
沈知微拨通邵衡的电话,开了免提。邵衡的声音从扬声器里传来:“核心人员集体离职,本身就说明交接存在问题,现在追究细节没有意义。”
“有意义。”我说,“请你说清楚,是文件不存在,还是接收人没成功使用。”
电话那头顿了一下:“结果就是四个项目不能交付。周砚作为原负责人,有义务配合恢复。”
“我可以参加核验,但不接受口头回岗,也不在权限不明的情况下操作生产系统。”我把风险单推到沈知微面前,“先查每条处理记录。”
邵衡冷笑:“你这是拿流程要挟公司。真有职业操守,就该先把服务拉起来。”
“如果故障源头尚未确认,直接操作只会覆盖记录。”我说,“你若坚持立即改生产环境,请把指令和责任人写下来。”
电话里只剩轻微的电流声。沈知微看向纸上空白的接替栏,终于没有重复让我立刻回岗。
“今天下午组织双方核验。”她说,“你、陈序、运维和邵衡都参加。你需要什么条件?”
“只核验已交接内容能否独立使用,不做生产修复。所有操作由公司在职人员执行,我只说明文档位置,全程留存记录。”
沈知微问:“如果证明资料不完整呢?”
“缺什么,我承担什么。如果资料完整,就撤回我扣留代码和团队恶意离职的指责,并继续查故障发生在什么环节。”
她握着手机,指节慢慢松开:“可以。地点放在公司测试间,陈序操作,你不能碰键盘。”
“再加一条。”我打开后备厢,取出笔记本和风险单副本,“核验结论由双方签字,不能核验完又变成无边界救火。”
这时林岚从停车场另一端走来。她没靠近沈知微,只把一只封好的移动硬盘交给我:“离线副本校验过,封条编号也拍了照。”
沈知微看了她一眼:“你们早就准备今天对质?”
林岚回答:“我们准备的是有人说资料不存在时,能让记录说话。”
我把文件袋夹在臂下,重新锁好车:“下午一点,测试间见。先验证交接,再决定是谁的判断需要负责。”
沈知微没有再命令我上楼。她低头拍下签字日期,随后给行政发消息,要求封存当前服务器日志,并通知陈序不得提前修改环境。
下午一点,测试间的百叶窗全部拉下。长桌中央摆着一台刚从仓库领出的空白服务器,封条还贴在机箱接口上。
陈序坐在键盘前,沈知微站在他身后。运维主管负责录像,林岚坐在最外侧,面前只有核验表和计时器。
邵衡没有到场,视频会议窗口里只显示他的头像。他说临时有预算会,让大家尽快得出结论。
沈知微把一页授权书推给我:“仅限测试环境,允许调取公司仓库内已交接资料,不接触生产系统。这样够不够?”
我逐行看完,在见证栏签名。
陈序抿了抿嘴:“周总,我懂开发。你没必要用这种方式证明我接不了。”
“我不证明你接不了。”我把椅子向后挪了一米,“今天只证明一件事:按文档,一个有开发能力的人能不能把环境搭起来。”
他拆开服务器封条,接通显示器:“仓库入口在哪里?”
“交接目录第一页,内部制品库地址。账号申请编号在附录二,你上午已经领取过对应权限。”
陈序照着输入,页面顺利打开。镜像、源码压缩包、依赖锁定文件和校验清单按版本排列,没有需要向我索要的私人密码。
邵衡在视频里说:“能看见文件不代表能运行。核心脚本可能还在个人电脑上。”
陈序没有接话。他下载基础镜像,对照文档核验散列值,屏幕上的两串字符完全一致。
接下来是数据库样例、消息队列和模拟设备服务。每完成一项,他就在核验表上报出状态,运维主管同步记录时间。
我没有靠近屏幕。陈序问到配置项时,我只报页码:“环境变量说明第十四页,测试证书在同目录的只读文件夹。”
第一次启动失败,终端显示端口被占用。陈序下意识回头看我,我指了指文档,没有给答案。
他重新翻到故障排查页,发现服务器自带的监控代理占用了端口。修改测试端口后,基础服务全部变成绿色。
沈知微问:“这算不算文档缺漏?”
陈序摇头:“排查表写了默认端口冲突,只是我刚才跳过了。这个问题不能算交接不完整。”
视频里的邵衡轻咳一声:“运行基础服务没有价值,关键是四个项目的业务代码。”
陈序依次拉取四个项目的固定版本。编译器开始滚动日志,测试间里只剩风扇加速的声音。
十七分钟后,第一项构建完成。随后三项相继通过,屏幕上出现四行相同的成功标记。
陈序盯了几秒,像在重新衡量上午听到的那些话。他转向沈知微:“至少代码、依赖和构建流程都是完整的。”
沈知微看着我:“生产系统为什么还是不能交付?”
“那是下一项核验。”我说,“现在请先确认,公司服务器上的交接内容能够被接收人独立使用。”
邵衡立刻插话:“只是碰巧构建成功,周砚人在现场,本身就构成指导。”
林岚把计时器按停:“录像会保留全部问答。他总共回答了六次,内容都是仓库路径和文档页码,没有补充任何未交接步骤。”
她将核验表转向陈序:“你是操作人,请按实际情况写,不替任何一方判断责任。”
陈序拿起笔,写下“资料可访问、校验一致、四项目构建成功”,又在异常栏注明一次端口冲突已按文档解决。
他签完名字,没有立即放笔:“我还想确认发布流程。文档里写公共平台版本必须经过兼容矩阵验证,再由平台负责人批准,为什么我收到的任务里没有这个角色?”
沈知微转向运维主管:“谁给陈序开的权限?”
“邵总办公室发来的清单。”运维主管调出审批记录,“他有四个项目仓库的开发权限,没有公共平台的发布审批权限。”
陈序说:“上午有人让我直接把最新平台包接进四个项目。我以为那是已经验证过的正式版本。”
我问:“谁发的消息?”
他没有看邵衡的头像,直接把工作群记录投到屏幕上。发送人是邵衡,时间是上午十点零八分,内容只有一句:统一版本,今天必须全部上线。
邵衡的声音冷下来:“这是为了避免四个项目各用一套旧包。管理要求不需要向离职人员解释。”
“管理要求当然可以统一版本。”我说,“但是否完成兼容验证,是可以核验的事实。”
沈知微没有替邵衡回答。她拿过陈序签署的表,在结论后补了一行:未发现周砚扣留代码或构建资料。
她签下名字,抬头对我说:“刚才在停车场关于你扣留代码的判断,我撤回。团队恶意造成系统瘫痪的说法,在查明前也停止传播。”
我把属于我的副本交给林岚,没有说接受,也没有借机要求她恢复职位。
沈知微问:“现在能查设备连接吗?客户明早会带新采购的控制器过来验收。”
“可以在隔离测试台复现。”我说,“仍由陈序操作,先保留当前环境快照,再接公司仓库里的两种设备。”
林岚补充:“核验范围要写进授权。若发现需要修复,今天只定位,不默认由我们继续做。”
沈知微重新打印授权书,加入隔离环境、只读调取发布记录和禁止修改生产数据三项。她签字后,把笔递给陈序。
陈序签完,没有像刚进门时那样盯着我。他把构建日志完整导出,主动勾选了保留失败记录,随后问:“先接现在交付用的新设备,还是先接旧型号?”
“两种都接。”我说,“同一套程序在不同设备上的结果,才知道问题落在哪一层。”
隔离测试台被推到长桌旁,左边是用了三年的旧控制器,右边是客户本次采购的新型号。两台设备外壳相似,接口协议版本却不同。
陈序先保存环境快照,又给录像镜头展示设备铭牌。林岚在核验表上分别记下型号、固件号和接入时间。
我说:“运行刚才构建出的当前交付版本,先连新设备。”
陈序插上数据线。设备电源灯亮起,通信灯闪了两下便熄灭,终端随即刷出握手失败和能力集不匹配。
沈知微向前一步:“上午四个项目报的也是这个错误?”
运维主管调出告警截图:“错误码一致。四个现场从十点二十一分开始陆续出现,最晚的一条在十点三十七分。”
邵衡仍在视频里:“测试设备本身也可能有问题。客户的新型号没经过我们采购验收,不能凭一条日志下结论。”
陈序检查线缆,又换上备用接口,结果没有变化。他随后运行设备厂商提供的自检程序,新控制器全部项目通过。
“硬件能响应,自检正常。”陈序说,“失败发生在我们的平台建立会话时。”
我让他打开公共平台的发布清单:“不要先改参数。查当前四个项目引用的是哪个包,再对时间。”
屏幕显示,四个项目都在上午十点十四分改用了平台版本5.8.0。发布说明后面的兼容验证状态,却是一片空白。
林岚问陈序:“你接入这个版本前,有没有看到测试报告?”
“没有。”陈序说,“邵总发完消息,运维把包标记成统一交付版。我以为审批已经在上游完成。”
邵衡提高音量:“客户今天催进度,四个项目各自发版才更危险。我推动统一版本,是正常的成本和风险控制。”
“统一不是问题。”我指向那一排空白,“未经兼容验证就把它标成可交付版本,才是问题。”
沈知微问运维主管:“谁有权限修改平台包的交付状态?”
运维主管放大审计记录:“平台负责人原本有权限。周砚九点四十分完成移交后,该角色被停用。十点零六分,邵总申请临时放行权限,十点十二分获批。”
“谁批的?”沈知微追问。
“您在晨会时点了同意。”运维主管低声说,“申请理由写的是避免离职影响当日交付,没有附兼容报告。”
沈知微的目光在记录上停了很久。她没有否认签批,只问:“版本5.8.0原本处于什么状态?”
陈序打开制品库历史:“候选版。开发测试通过,兼容矩阵只完成旧设备,新增型号的两组用例未执行。”
我让他切换到旧控制器,但不更换软件版本。数据线接好后,通信灯连续闪烁,十秒后稳定常亮。
测试界面陆续返回温度、转速和告警状态。四个项目的模拟服务也都收到数据,当前版本在旧设备上可以运行。
沈知微盯着亮起的绿灯:“也就是说,程序不是完全不能用,只是不支持客户的新设备?”
“目前证据只能说明5.8.0通过了旧型号路径,新型号路径失败。”我说,“还要比较上一正式版本,才能判断是新引入的回归,还是从未完成适配。”
陈序主动创建第二个隔离实例,调取发布记录中的5.7.3版本。它有完整签名,兼容矩阵却只列着旧型号。
邵衡催促:“既然旧版稳定,直接回滚生产。客户要的是明天能验收,不是看你们做学术研究。”
我没有回应他,只对陈序说:“按授权范围运行旧版,先接旧设备,再接新设备。每次都保留原始日志。”
5.7.3连上旧控制器后,状态灯很快常亮,数据也持续返回。结果证明旧路径确实可以通过回滚恢复。
换成新控制器后,状态灯却始终停在黄色。日志没有出现5.8.0的能力集错误,而是直接提示该型号未注册。
陈序把两份日志并排放大:“旧版根本不认识新型号。新版加入了型号定义,但握手适配没有完成。”
我点头:“所以回滚能让旧设备恢复,却不能完成明早的合同验收。客户采购清单里已经包含新型号,拿旧设备演示没有意义。”
沈知微翻开依赖表。四个项目名称分列在上方,下面却共同指向同一个平台包、同一套设备协议和同一组兼容矩阵。
她问:“四个项目为什么会在半小时内一起中断?”
陈序先回答:“四个项目引用了同一个未经完整验证的平台版本,共同依赖被统一替换。”
运维主管补充:“发布时只有邵总的临时放行指令。”
视频窗口里,邵衡的头像终于亮成画面。他坐在会议室里,脸色发沉:“周砚交接时明知新型号没测完,却没有阻止发布,这就是失职。”
“风险单第六项写着,新型号兼容验证尚缺两类现场设备,平台负责人空缺期间禁止统一放行。”我把签收页推向镜头,“你在七天前签过已阅。”
林岚调出封存副本,文件时间戳、校验值和服务器版本完全一致。那句话没有临时添加,也没有在离职后改动。
邵衡说:“一张风险单不能成为你们拒绝配合的理由。陈序今晚把适配补上,四个项目明早照常验收。”
陈序的手还放在键盘上,却没有像上午那样立即应声:“我没有新型号完整协议包,也没有批准公共版本的权限。就算临时写完,也没人能在一晚内跑完四个项目的兼容矩阵。”
“权限我给你开,今晚加班。”邵衡说,“先让能亮的亮起来,测试以后补。”
沈知微突然打断他:“不要再催陈序改代码,也不准把候选版继续往生产推。”
视频那头安静下来。邵衡似乎没料到,她会当着所有人的面截断他的命令。
沈知微转向运维主管:“立即冻结5.8.0的交付标记,保留十点后的全部审计记录。旧设备现场可以评估回滚,新设备不得伪装成已通过。”
随后她看向我,语气第一次不再要求一个当场日期:“如果要让新型号真正通过,缺的到底是哪道验证?”
“不是一道勾选。”我说,“先补齐两类新设备的协议适配,再分别验证四个项目的业务路径、异常恢复和版本共存。现有测试资源无法同时覆盖。”
她追问:“最快能先保住哪个项目?”
“那要看明早客户带来的设备配置、合同优先级和现场损失。”
我合上依赖表,“在这些信息确认前,谁承诺四个一起恢复,谁就是继续拿未经验证的版本下注。”
窗外天色已经暗下去,新控制器的黄色状态灯仍在规律闪烁。旧设备那盏绿灯亮着,却只证明过去还能运行,不能替公司跨过明早的验收。
第二天早上八点四十,我按沈知微发来的临时邀请到了验收室。昨晚那台新控制器也被送了过来,黄色状态灯依旧没有变绿。
项目经理高程正在调整展示屏。他把旧控制器藏在桌板下,只把运行界面投到大屏上,页面里的四项数据都在正常刷新。
陈序站在旁边,脸色不太自然。他看见我进门,立刻把昨晚保存的两组失败日志递了过来。
我没有接日志,先问高程:“今天客户清单上的设备在哪里?”
“许工带来的还在路上。”高程指了指桌下,“我们先用现有设备把业务流程走一遍,证明系统主体没问题,再解释型号差异。”
“昨晚已经确认,旧设备能运行不代表新型号能验收。”我走到展示台前,“如果不标明演示型号,这块屏幕传递的就是错误结论。”
高程压低声音:“客户只给我们今天一次机会。先让他看到系统能动,后面再谈适配,至少场面不会太难看。”
沈知微从门口进来,手里拿着四份项目合同。她没有立即制止高程,只问我:“这套演示会不会影响后续修复?”
“不会影响修复,会影响客户是否继续相信我们。”我翻开设备清单,“今天要验的是B17和B21,桌下这台是A09。”
高程急道:“型号都写在协议里,界面功能也一样。我们没说这是客户的新设备,只是先展示软件。”
“展示屏上写着交付环境实时数据。”陈序忽然开口,“但数据来自模拟服务和A09,不是客户现场。”
高程瞪了他一眼:“你刚来,不清楚客户沟通的尺度。”
陈序把昨晚的录像编号写到白板上:“我只知道失败记录必须保留。许工如果要求看连接日志,这套演示撑不过一分钟。”
沈知微翻到合同附件,目光停在验收条款上。条款要求设备序列号、固件版本和现场日志三者对应,缺一项都不能签字。
九点整,验收室的门被推开。许工带着两名工程师进来,身后的小推车上放着两台封装完好的新控制器。
他没有寒暄,先把设备清单递给高程:“今天只看实机。内部出了什么人事变动,不属于我们验收标准。”
高程笑着迎上去:“许工,我们先把完整流程演示一遍。核心功能已经恢复,设备接入只是最后一小步。”
他抬手示意陈序启动展示。陈序没有动,只看向沈知微。