第五十一章 · 顾问¶
大年初一早上七点十一分,手机在枕边震了一下。顾源的回复,一共五行。
「评审可以。」
下面三行,是三个问题。
「一、回放归零,用的是改完的代码。影子跑两周,跑的是同一份代码,还是重写的那份?没改过的路径,你验过没有。」
「二、窗口十五分钟。你说重试间隔验证过三个月——重试和比对是两类负载。这个数为什么可以借。」
「三、八月一日那两个索引,是被有权限的人删的。新表上,怎么保证同样的事不发生第二次。」
最后一行:「答好发我。一页纸我当面看,问题我当面问。」
陈稳把第三条读了三遍。前两条是技术,他心里有答案,只是答案还没有长成能发出去的话。第三条不是技术。第三条是八月一号。
他回了一个字:「好。」
顾源没有再回。
他把三条抄进记事本,抄完在本子空白处算了一下:影子跑第九天,全量比对还没跑过;窗口依据的数据在平台上躺着,要重新拉;第三题的三段他去年十二月就写了一半。三件事,假期够。
他妈在门外喊他下来吃饺子。他把本子塞进包的外袋,下楼的时候想,这三个问题里,最贵的不是技术。是第三条。前面两条答不好,丢的是方案。第三条答不好,丢的是顾源愿意在名单上签的那个字。
初三中午,姑姑一家到了。他妈在厨房烧了八个菜,主菜是除夕腌的那条鱼,蒸出来搁在桌子正中间。
饭桌上,他妈往他碗里夹了一筷子鱼肚子上的肉。
「小何那边怎么安排的。」她说。「两边的爸妈,总要坐下来吃个饭了吧。」
「分了。」他说。
他妈的筷子在碗沿上停了一下。
「什么时候的事。」
「上个月。」
他妈把筷子放下,起身去厨房添汤。他爸端起酒杯,跟他姑父碰了一个,说厂里今年效益还行,订单排到五月。姑姑问他年终奖多少,他说了数,姑姑说比表哥多,说完这个话题就过去了。整顿饭,没有人再提小何。
下午大人们在客厅打牌。他进厨房烧水,他妈背对着他在擦灶台。
「她对你好。」他妈说。
「好。」
「是你要忙厂里,还是她要忙学校。」
「都不是。是我排得不对。」
他妈把抹布拧干,搭在水龙头上,转过身来。
「排得不对,就重排。」她说。「人走了,就排不了了。」
「她走的时候,说过我什么没有。」
他妈想了想。
「没有。」她说。「就说了句,爸那边我来打招呼。」
水开了。他把火关掉,提出水壶,泡了两杯茶。一杯端给打牌的姑姑们,一杯端进他原来的小屋。
小屋的桌子还是高中那张,桌角贴着一张褪色的高考倒计时贴纸,数字停在零。他把记事本摊开,压在贴纸上面。
第一题的答案,他在初三下午四点想清楚。回放验证的确实只有改过的路径——按秒取整那一处。没改过的路径,他在本子上列了三种补验办法,划掉两种,留下最笨的一种:新旧链路对同一批原始事件各算一遍比对,两份差异单做逐行比对,一行不差才算过。不抽样,全量。多花一晚上的机时,买一句「没改过的地方也没坏」。
第二题,他把易文教的那一套用在自己身上:先写结论,再写依据。窗宽不借重试间隔的数。重放间隔按商户加币种对实测,P99 是九分钟——这个数是上个月调对账告警阈值的时候跑出来的,日志还在平台上,随时可查。窗宽取 P99 的一倍半,十三分半,取整十五。数没变,依据换了。
第三题他写了删,删了写。写到一半,手机震了一下。不是顾源。是赵岩,工单系统自动通知:归档邮箱调取的申请批了,十个工作日内答复。
他把手机扣过去,接着写。凌晨一点,他写完最后一段:
「权限收口:新表 settle_reconciliation_v2 建在独立 schema,DROP 权限只留 DBA 角色,业务账号只给读写。DDL 审计接入日志平台,任何人在这张表上执行 DROP 或 ALTER,告警直接进值班手机,不走邮件。索引清单每天凌晨两点校验一次,少一个就告警,校验脚本进 Git。」
写完他把这三行读了一遍,在后面补了一句:
「告警是知道。防住的是权限。两件事分开做。」
这句是替顾源写的。他先替顾源把自己问了一遍。
初四早上七点,他把三段答案发过去,正文连标点四百一十字。
发完他把全量比对的任务写好了。新旧两条链路,对十二月第一周那批二十一万一千三百笔原始事件各算一遍,两份差异单逐行比对,输出四个数:新链路条数、旧链路条数、一致行数、不一致行数。任务挂在内网调度平台上,参数定死,谁登录都改不了,跑完自动给他发邮件。假期连着周末,机时够。
初四中午,顾源回:「第二题的依据,比数有用。第一题的全量比对,跑完把行数发我。第三题,评审那天你当面讲。」
隔了一分钟,又来一行:「二月十九号下午两点,五楼。你们会议室要能投屏。我把老花镜带上。」
评审定了。
初六下午返程。他妈往他包里塞了一袋腌鱼、两盒胃药。胃药是镇上药店买的,牌子跟他抽屉里那两盒不一样。
「抽屉里有。」他说。
「多的不压货。」他妈说。「断了才是事。」
火车开出去半小时,他把胃药从包里拿出来,跟背包最里层那页折过角的纸放在一起,又觉得不妥,拿出来放回外袋。
复工第一天是二月十二日。老楼的闸机换成人脸识别之后,旁边又贴回了刷卡机的提示贴纸,两套并行,早上闸机口堵了四分钟。
上午十点周会。纪衡开门见山。
「影子跑,第九天。报数。」
「第九天结束,回放比对全量跑完。」陈稳说。「二十一万一千三百笔,新旧两份差异单,逐行比对,零行差异。附一页核对说明,下午发您。」
「零行差异,是代码对,还是数据凑巧。」
「全量,不是抽样。两种链路各算一遍,一行不差。抽样撞不出来的。」
「评审日期。」纪衡说。
「二月十九号,下午两点。顾源,外聘顾问评审。」陈稳说。「材料今天下班前发您。」
「顾源。」纪衡把这两个字重复了一遍,笔尖在纸上点了两下。「他答应了。」
「他出了三道题。第三道,他要求我当面答。」
「念。」
陈稳把三条念了一遍。念到第三条,会议室静了两秒,王磊的笔停在半空。
「第三条不是技术问题。」纪衡说。「十九号那天我也到。你答的时候,只答技术。技术答完,剩下一句我说。」
散会后,蒋辉在茶水间堵住他。
「张毅提了离职。」蒋辉说。「今早 OA 上看到的。三月十二号,最后工作日。」
「什么时候提的。」
「假期里。OA 时间戳二月九号。」
茶水间的咖啡机还是那个浓度,从去年到现在,没人调过。陈稳接了半杯,喝了一口。
「你跟我说这个,是想说什么。」他问。
「有些东西,人走之前会交接。」蒋辉说。「有些东西,人走之前会删。他走之前的名单里,有没有你那张备份表——这个你比我清楚。」
「备份表挂了 DDL 告警。」
「告警能告诉你谁动的。」蒋辉把纸杯捏扁,扔进桶里。「动完了呢。」
王磊端着杯子进来,接水,听见后半句,站在饮水机边上没动。蒋辉冲他点了一下头,出去了。王磊把杯子接满,没走。
「张毅哥去年带过我两周。」他说。「交接老梁组长那批文档的时候,第三批一直没到,他还替孙宇追过一次。后来就没下文了。」
「第三批是什么。」
「ch3-原始设计文档。」王磊说。「前两批是操作手册和脚本注释,都发了。就第三批,文件夹的修改日期比孙宇离职还早一年。我当年觉得奇怪,没敢问。」
陈稳把杯子里的水喝完。
「你今天跟谁说过这个。」
「就你。」
「先别写进周报。」陈稳说。「十九号之后再说。」
王磊点了一下头,回工位了。
他端着杯子回到自己的座位,翻开记事本:「张毅离职,OA 二月九号。最后工作日三月十二。备份表、十一封核定邮件、十月的数——都在三月十二之前。」
下午三点,赵岩的回复进了工单。
「技术支持中心答复:TPL-TC-0342 去年十月底从张毅工位挪进三层东侧库房,接库房交换机,常供电。资产异动没有走流程。谁挪的,他们说不清。库房门禁平时不锁。」
陈稳把这段和日期对了一遍。去年十月二十号,他的 DHCP 申请被研发部驳回;十月二十二号,纪衡把申请转了出去;同一个星期,那台机器从工位进了库房,资产账没动,盘点照旧写着在用。
他在记事本上添一行:「我们开始查的第二周,机器进了库房。挪的人想不起来。」
四点,归档邮箱调取的工单批了下来,十月核定数邮件到了。十一封凑齐。十封格式一样:核定笔数、结算口径、备注栏一句话。十月那封多了半句正文:
「今后口径以核定数为准。」
发件人张毅,发送时间十月九日早上八点十二分。这句话,和马菁当年收到的那个不署名邮件,一字不差。
马菁在转发时附了一句:「十月这封,我们台账照抄了。你们要是核出实际数,给我们一份,我这边存个底。」
陈稳回了两个字:「应该的。」
然后他把十一个日期、十一个数字抄进记事本,最后一行写:
「同一句话,两个管道。一个署名,一个不署名。差的只是敢不敢署。」
十一个数抄完,他在本子上把两列并排放着。核定数一列,实际数一列。十个月,每一个月核定数都低,低幅在千分之三点一到千分之四点七之间。这不是手滑。手滑有高有低。
他往前翻,翻到去年十一月抄的那三行:43,200 / 44,180 / 45,000。当时他在「45,000」后面画了个问号。现在问号可以擦掉了——业务线的回执从来不是写给系统的,是写给查账的人的。核定数压住系统侧的口子,回执顶住业务线那头。两头都是人写的,中间跑数据的,只有他这张表。
他在本子上添一行:「差额不从张毅手里过。张毅只管把口子两头的数写平。口子本身,在八月一日那天就挖好了。」
写完他合上本子,去倒水。饮水机的水还没烧开,红灯亮着。他站在那儿等,忽然想起去年八月一号晚上,他查 binlog 查到 23:14:42 那条 DROP INDEX 的时候,也是这个站姿。八个月。那时候他以为那是一个人一时兴起。现在他手里有十一封邮件、一台进了库房的机器和一个离职日期。这不是一时兴起。这是一套流程:先让差异静默,再让对账跑不动,最后让经手的人一个个离开——孙宇先走,然后是老梁,然后是张毅。
老梁。
他端着杯子回到工位,没有坐下。去年老梁在散伙饭上说过一句话,他当时没听懂:「我把能交的都交了。」现在他想起来,老梁交接清单的第三批文档,到现在也没人收到过。
下班前,他把评审材料发给纪衡。立项页一页,附三道题的答案,附影子跑全量比对说明。纪衡回了三个字:「材料可以。」隔了一分钟,又来一条:
「十九号我也到。还有——技术支持中心那台机器,张毅走之前,物理位置和现在谁在用,钉死。别等他交接完。」
陈稳回:「赵岩在跟。本周五前要答复。」
这条消息他读了两遍。纪衡说的「剩下的一句」是什么,他没问。
他点开工单系统,把 DB-20261028-0047 那页又拉出来一次。工单状态:已归档。归档时间:2026-12-30 17:00。他当时在这页上写下的问题是「谁批的归档」,后来他知道答案了:没人批,规则批的。现在他在同一页下面补了一条跟进,正文一行:
「操作机器已定位,物理位置核实中。工单重新打开。打开人:陈稳。」
提交按钮按下去的时候,他想起赵岩那句话——「跟一次,是他说服自己这事还是他的事」。这次不一样。这次是纪衡让他钉死的。
五点,纪衡的办公室门开着。他进去把周五前要答复的事又对了一遍,纪衡摆摆手,意思是知道了。他转身的时候,纪衡开口了。
「十九号那天,你答完技术,我有一句话。」纪衡说。「你不用提前想。」
「什么话。」
「到时候你就知道了。」纪衡把手机拿起来。「不过我要你先替我问顾源一个问题。」
「您说。」
「2019 年结算系统二期,他做过一版分区方案,最后没上。」纪衡说。「问他,当年为什么放弃。他说了什么,你原样带回来,一个字不要改。」
「这个问题您问过他吗。」
「我没赶上问。」纪衡说。「我进恒澜是 2026 年 7 月。这个方案我是在交接文档里看到的,签名页上有他的名字。」
陈稳把 2019 和 2026 年 7 月在心里对了一下,差了七年。一个七年前的没上线的方案,纪衡从交接文档里翻出来了,还要原样带话——他问的不是技术。
他应了,出门。走廊上他把这个问题记进记事本,一行:顾源 2019 分区方案为何未上。纪衡要原话。为什么。
二月十八号夜里,办公室只剩他一盏灯。全量比对那晚跑完了:零行差异,行数他发给了顾源,顾源回了一个字:「过。」
他把三道题的答案再过最后一遍。第三题那页,他删掉了「告警是知道」那一句——那句话是写给自己的,不是讲给评审听的。评审上他只讲三层:权限收口,审计进值班手机,索引存在性每日校验。
关 IDE 之前,他打开对账模块里那条去年八月三十一号写的 TODO 注释。T+0。注释底下的 feat/reconcile-realtime 分支,今天合进了主干第九个提交。明天下午两点,评审。
关灯之前,他在窗前站了一会儿。对面那栋楼,十二个月零十四天了,那扇窗还是黑的。旁边一扇亮着暖黄色的灯,灯底下有人影,影子在动,一下一下,像在收拾东西。
他把立项页和三道题的答案摞在一起,用长尾夹夹住,放进包的外袋。外袋里那页折过角的记事本还在,边角又深了一道。
灯关了。走廊的声控灯应声亮起来,送了他半层,在他脚步停下之前,先一步灭在了电梯口。
← 第五十章 重写 · 目录 · 第五十二章 走了 →