第七章 · 蒋辉的方案¶
周四早上,陈稳到公司,刷卡进闸机,等电梯,电梯门打开,里面没有人。他按了八楼。
他走到工位,坐下来,打开电脑。屏幕亮起来,右下角的时间是八点十二分。他打开邮箱,有一封新邮件,发件人是纪衡,抄送结算组全员,标题是“双月会通知:下周三下午两点,三楼会议室”。
他点开邮件,正文两行:时间七月二十八号周三下午两点,每人十五分钟,请提前准备。
他看了两遍,关掉。然后打开 PPT,把昨晚改好的版本又看了一遍,四条内容,数字对齐,时间标注清楚。他看完,关掉。
中午,他去食堂吃饭。食堂里人很多,他端着餐盘找位置,看到易文坐在靠窗的位置,对面空着,他走过去。
“这里有人吗。”
“没有。”
陈稳坐下来,拿起筷子,吃了一口饭。
“双月会通知看到了?”易文说。
“看到了。”
“你准备讲什么。”
“模板那四条。结算运行,拦截器,规则引擎,价值量化。”
易文拿起勺子,喝了一口汤,说:“蒋辉要报什么。”
“他说是智能重试补偿方案。”
“什么东西。”
“不知道。他没说细节。”
易文夹了一根青菜,吃了,慢慢嚼完,然后说:“你那个拦截器,灰度跑了多久了。”
“三天。全部通过。”
“数据够不够。”
“够。一千八百多条。”
“周三讲的时候,把这个数据放在开头,不要放在中间。”
陈稳说:“好。”
易文吃完饭,把餐盘端起来,说:“你那个 PPT 我帮你看看?”
陈稳愣了一下,说:“行。”
“吃完饭发我。”
“好。”
易文走了。陈稳把剩下的饭吃完,把餐盘端到回收处,走回工位。
他走回工位,坐下来,打开电脑,打开 IDE,继续写代码。他写了一个调度通知的异常处理,写完,跑了一遍,全绿,提交,然后切回邮箱,看到易文的回复。
“标题太大了。你这不是汇报,是填表。”
陈稳回了一个“好”。他打开 PPT,把标题改成“结算系统七月改进报告”,发给易文,易文回了一个“可以”。
下午,他收到一条消息,是蒋辉的私聊。
“陈稳,你那个拦截器,灰度数据能不能给我看一下?”
陈稳看了这条消息,没有立刻回复。他想了想,打了几个字:“你要做什么。”
“我那个方案需要参考一下实时拦截的数据,不涉及你的代码。”
陈稳看着屏幕,没有打字。他放下手机,打开监控大盘,把拦截器日志又看了一遍,绿的,全部通过,没有异常。他关掉大盘,拿起手机,回了一个字。
“好。”
他把日志文件的路径发给了蒋辉。
蒋辉回了一个“谢了”,后面跟着一个竖大拇指的表情。
陈稳放下手机,关掉 IDE,下班。
周五早上,他到公司,刷卡进闸机,等电梯,电梯门打开,里面站着蒋辉。
“早。”蒋辉说。
“早。”
陈稳走进去,按了八楼。电梯门关上,缓缓上升。蒋辉手里拿着一个文件夹,封面是透明的,里面夹着几页纸,打印出来的,有表格,有箭头。
“你那个灰度数据挺好用的。”蒋辉说。
陈稳看了他一眼,说:“嗯。”
“我那个方案,准备用拦截器数据做对比。”
陈稳没有说话。
电梯到了八楼,门打开,他们走出去。蒋辉走在前面,步伐比平时快,衬衫下摆塞在裤子里,腰上的皮带扣反射了一下走廊的灯光。
陈稳走回工位,坐下来,打开电脑。他打开 PPT,又看了一遍,然后打开 IDE,继续写代码。
他写了一个小时,收到一条消息,是易文发的。
“你的 PPT,我帮你改了一版,你看看。”
附件里是一个文件。陈稳点开文件,页面布局没变,标题变了。易文把他的第一条改成了“灰度拦截器上线 72 小时,累计拦截 1,843 次,通过率 100%,0 资损”,在下面加了一行字:“对比:历史同期凌晨时段事故率——2024 年 4 次,2025 年 2 次,2026 年 1 次(截至 7 月)。”
他看了一遍,又看了一遍,然后回了一条:“这个对比数据在哪里查的。”
易文回得很快:“事故记录。你自己写的复盘里就有。”
陈稳看着这条回复,没有打字。他关掉 PPT,打开自己的原版,打开事故记录,找到了那组数据——去年四次,前年两次,今年一次。他复制了这组数据,贴到自己的 PPT 里,放在第一条的下面。
他保存,关掉,给易文回了一个“好”。
下午,他打开微信,看到群里有人问蒋辉:“你那个方案,重试补偿的逻辑,跟陈稳上周做的 settle.guard 有什么区别?”
陈稳看着这条消息,手指停在屏幕上。
过了一分钟,蒋辉回了。
“底层逻辑不一样。他那个是事务拦截,我这个是事后补偿。一个是防护,一个是修复。可以互补。”
陈稳又看了一遍,放下手机,打开 IDE,继续写代码。
周一,他到公司,打开电脑,看到邮箱里有一封新邮件,发件人是纪衡,时间是早上七点五十分,收件人是蒋辉,抄送结算组全员。
邮件正文只有一行字:“方案有亮点。周三讲的时候,重点讲‘可复用’的部分,不要只讲故障场景。”
他看了两遍,关掉。
下午的时候,他收到一条消息,是易文发的。
“周三的汇报你讲了吗。”
“还没。周三下午。”
“准备得怎么样了。”
“还行。”
“你有彩排过吗。”
陈稳看着这条消息,没有立刻回复。他想了想,打了几个字:“没有。”
“那你现在讲一遍给我听。”
陈稳站起来,走到走廊尽头,有一间小会议室,门开着,里面没有人。他走进去,关上门,坐在会议桌旁,拿出手机,打了语音电话给易文。
电话接通了。
“你开始了。”易文说。
陈稳打开 PPT,看着屏幕上的第一条内容,清了清嗓子,说:“结算系统七月改进报告,主要工作包括拦截器灰度发布、规则引擎接入、价值量化提交。”
他说完,停了一下,等易文说话。
“你讲完了?你刚才说的跟你 PPT 上写的一模一样。你是在念,还是在讲。”
陈稳没有说话。
“你重新来。不要念,你把 PPT 合上,跟我说这个月你做了什么。”
陈稳把手机放在桌上,开了免提,然后把 PPT 最小化,看着空白的屏幕,想了想,说:“这个月做了三件事。第一,拦截器上线灰度,跑了三天,全部通过,没有资损。第二,规则引擎的调度通知接入了,加了重试机制。第三,价值量化写了三版,最后通过了。”
“谁通过的。”
“纪衡。”
“他为什么通过。”
“因为方向对了。”
“什么方向。”
陈稳想了一下,说:“降低资损和人力成本。”
“那你怎么不把这个放在开头。”
陈稳没有说话。
“你重新来。从‘最后通过了’开始讲。”
陈稳沉默了一会儿,然后说:“纪衡批了三版价值量化,最后通过的方向是降低资损与人力成本,不是技术指标。”
“然后呢。”
“拦截器灰度数据 1,843 次请求,全部通过,零资损。对比历史同期,该拦截器可覆盖历史七次事故中的六次。对比数据来自事故记录,由易文提供。”
“好。继续。”
陈稳把三条内容讲完,讲到最后一条的时候,语速稍微快了一点,他自己感觉到了,压了一下,把最后一句说完。
电话那头安静了两秒。
“好多了。但周三讲的时候,你就记住一个东西——纪衡想问什么。”
“他问什么。”
“他问的是‘影响多少钱’。你所有内容,都要回到这个点上。”
陈稳说:“好。”
“再练两遍。”
“好。”
电话挂断了。陈稳坐在会议室里,面前是空白的屏幕,墙上的时钟显示下午三点四十一分,秒针在走,一格一格。
他站起来,走出会议室,走回工位。他坐下来,打开 PPT,把第一页的标题改成“结算系统七月改进:减少资损、降低人力成本、提高稳定性”。他保存,关掉,然后打开 IDE,继续写代码,写到了下班。
周二晚上,他回到家,吃完饭,洗完澡,坐在书房里,打开电脑,把 PPT 又打开,对着屏幕把内容过了一遍。他讲完了,没有卡顿,没有超时。他讲完,坐了一会儿,把电脑合上,站起来,走到窗边,拉开窗帘。
对面那栋楼,亮着灯的窗户不多。三楼亮着,五楼亮着,八楼亮着。他看了十一个月的那扇,还是黑的。
他站了一会儿,放下窗帘,走回卧室,躺下来。他闭上眼睛,翻了翻身,面朝墙壁,睡着了。
周三下午一点四十分,他到三楼会议室,里面已经坐了几个人。纪衡坐在靠窗的位置,面前放着一台笔记本电脑。蒋辉坐在靠门的位置,面前放着那个文件夹,透明封面,里面夹着打印好的 PPT 页面,彩色打印的,有箭头,有表格,有绿色和红色的标注。
陈稳坐在靠墙的位置,没有带文件夹,没有带电脑,口袋里只有一部手机。
纪衡看了一眼手表,然后说:“一点四十五。开始。”
陈稳站起来,走到前面,把手机连上投影,打开 PPT,投影仪亮了,第一页投在白色的幕布上。
“结算系统七月改进报告。我讲三个部分。第一,拦截器灰度上线,数据对比。第二,规则引擎接入。第三,价值量化。”
他按了一下屏幕,翻到第二页。
“拦截器 settle.guard 于七月二十号灰度上线,选最低负载机器,截至目前运行七十二小时。累计拦截 1,843 次请求,全部通过,通过率百分之一百,零资损。”
他翻到第三页。
“对比数据:2024 年一至七月凌晨事故四次,2025 年两次,2026 年一次。该拦截器可覆盖历史七次中的六次,第七次根因为从库延迟,不在范围。”
他翻到第四页。
“规则引擎调度通知已于七月二十五号上线,增加重试机制,最多三次,间隔十五分钟。价值量化三版,最终方向为减少资损与降低人力成本。数据来源:2024 至 2026 年事故记录。”
他讲完了,看了一眼时间,四分十二秒。
会议室里安静了几秒。
纪衡没有说话,看着投影屏幕,看了一会儿,然后说:“数据来源是谁提供的。”
“事故记录。由数据组易文提供对比数据支持。”
纪衡点了点头,然后说:“拦截器什么时候全量。”
“计划本周内全量。已排期七月二十八号。”
“全量后怎么监控。”
“继续观察拦截器日志,异常告警接入值班手机。一周内无异常,摘灰度标签。”
纪衡在笔记本上敲了几个字,然后说:“可以。下一个。”
陈稳走回座位,坐下来。他看到有一条微信消息,是易文发的。
“讲完了?”
他回了一个“完了”。
易文回了一个“好”。
蒋辉站起来,走到前面,把电脑连上投影。他的 PPT 第一页是一个标题,红色加粗,带下划线:“智能重试补偿方案——跨部门协同优化,提升结算可靠性与用户体验”。
他翻到第二页,是一张流程图,箭头从左上角出发,往右走,分叉,聚合,再分叉,再聚合,汇聚蓝色框,写着“补偿成功”。
“我的方案背景是这样的,”蒋辉说,“目前结算系统的补偿机制是手动触发,依赖值班人员发现异常后手工补录。这个流程存在两个问题。第一,响应时延——从异常发生到手工补录,平均耗时三十三分钟。第二,手工补录的数据没有幂等校验,重复补录的概率在百分之三左右。”
他翻到第三页,是一张表格,左边写着“当前流程”,右边写着“优化后流程”。
“我的方案是:在结算系统与商户数据之间加一个智能重试补偿层。当结算事务失败时,补偿层自动捕获失败上下文,进入重试队列,按优先级排序,自动重试。重试三次失败后,进入人工队列。”
他翻到第四页,是一张柱状图,左边标着“当前平均补偿耗时:三十三分钟”,右边标着“优化后目标:三分钟以内”。
“如果这个方案上线,可以把补偿耗时降低百分之九十以上。”
他讲完了,看了一眼时间,十一分零八秒。
会议室里安静了一会儿。
纪衡看着投影屏幕,没有说话。他翻了一下蒋辉的 PPT 页面,翻到第一页,看了一遍,又翻到第三页,看了一遍,然后说:“这个方案,跟陈稳的 settle.guard 有什么区别。”
蒋辉说:“settle.guard 是事务拦截,在事务开始前校验,防止异常事务进入数据库。我的方案是事后补偿,在事务失败后自动重试。一个是防护,一个是修复。可以互补。”
纪衡说:“那你的补偿层,核心逻辑是什么。”
“失败上下文的捕获与重试队列的调度。失败时,捕获事务 ID、失败原因、时间戳、商户 ID,存入重试队列。重试时按优先级排序,先处理影响大的商户。”
“这个逻辑,跟结算系统现有的重试机制有什么区别。”
蒋辉停了一下,说:“现有的是单次重试,失败后不再重试,直接进入人工补录。我的方案是多次重试,最多三次,每次间隔递增,最后一次失败后进入人工队列。”
纪衡在笔记本上敲了几个字,然后说:“你的方案里,有多少是现成的。”
蒋辉又停了一下,说:“重试队列的调度框架是现成的,但需要适配结算系统的上下文。失败捕获的逻辑需要新建,大概占百分之四十。”
纪衡点了点头,没有继续问。
“可以。方案先留着,等拦截器全量后再评估。”
蒋辉点了点头,说:“好。”他拔掉电脑,走回座位,坐下来。他的表情没有变化,但陈稳注意到,他坐下来的动作比平时慢了一点,坐下后,他的手在桌面上放了一下,又拿起来,放在膝盖上,又放回桌面。
纪衡看了一眼手表,说:“下一个。”
组里那位资深工程师站起来,走到前面,开始讲他的内容。陈稳没有听进去,他坐在椅子上,看着投影屏幕上的文字,但没有在看那些文字。他脑子里在想刚才蒋辉讲的那句话——百分之四十需要新建。也就是说,百分之六十是现成的。
他想起上周在规则引擎里加的那个重试机制——最多重试三次,间隔十五分钟。他想起蒋辉在电梯里说的那句话。
他靠在椅背上,没有动。
资深工程师讲完了,纪衡点了点头,说:“可以。”
纪衡站起来,走到前面,没有连投影,只是站在会议桌前,面对着所有人。
“七月工作基本正常。八月的重点:第一,拦截器全量,按计划执行。第二,蒋辉的方案,等拦截器稳定后再推。第三,八月的双月会,我要看到每个人的数据同比环比。”
他看了一眼所有人,然后说:“散会。”
会议室里的人开始站起来,收拾东西,往外走。陈稳站起来,把手机装进口袋,往外走。他走到门口的时候,听到身后有人叫他。
“陈稳。”
他回头,是纪衡。
“你今天讲得不错。”
陈稳愣了一下,说:“谢谢。”
纪衡没有再说别的,转身走回座位,拿起笔记本电脑,拉开椅子,走了出去。
陈稳站在门口,看着纪衡的背影消失在走廊尽头,然后转身,走回工位。
他走回工位,坐下来,打开电脑,打开监控大盘,绿的,平的。他关掉大盘,打开 IDE,开始写代码。
他写了一个多小时,写到快下班的时候,停下来,站起来,走到茶水间,接了一杯热水,在窗边站了一会儿。窗外那栋楼的外墙还是灰色的,空调管还是沿着墙面往下走,在转角处拐了一个弯。他喝了一口水,水是温的,喝完,放下杯子,走回工位。
他收拾东西,关掉电脑,走出办公室。
他走到电梯口,等电梯,电梯来了,他走进去,按了一楼。电梯门关上的时候,一只手伸进来,挡了一下,门又开了。
是蒋辉。
他走进来,站在陈稳旁边,按了一楼,然后电梯门关上,缓缓下降。
“你今天讲得不错。”蒋辉说。
“你也是。”
蒋辉笑了一下,说:“纪总说等拦截器全量后再评估。你觉得什么时候能全量。”
“这周五。”
“那快了。”
电梯到了二楼,停了一下,门开了,没有人上来,又关上了。
“你那个重试机制,”蒋辉说,“跟我的方案有重叠的地方。我不是说要抄你的。我是说,如果我的方案上线了,你那个重试机制可以接过来,变成补偿层的一部分。”
陈稳看着电梯门上的数字,从 2 跳到 1。
“可以。”他说。
电梯门打开,他们走出去,穿过大厅,刷卡出闸机。
外面天已经黑了,路灯亮着,地面上有一层薄薄的水渍,不知道什么时候下过雨。蒋辉往左走,往停车场的方向。陈稳往右走,往地铁站的方向。
他走了一段,停下来,拿出手机,打开微信,看到易文发了一条消息。
“讲完了?纪衡怎么说。”
“他说讲得不错。”
易文回了一个“好”,然后补了一句:“下次别让他说这句话,让他在 PPT 上写。”
陈稳看着这条消息,看了几秒,然后回了一个“好”。
他回到家,换了鞋,走到客厅,坐下来。他拿出手机,打开发给纪衡的 PPT,看了一遍——四页,四分十二秒,纪衡没有打断,没有问“影响多少钱”,没有说“没有重点”。他看了两遍,关掉,把手机放在茶几上。
他站起来,走到书房,打开电脑,搜索“智能重试补偿 架构设计”,翻了几页,打开了一篇技术博客,里面有一段话:“重试补偿与事务拦截是两种不同的设计哲学。前者假设失败是常态,后者假设失败是异常。一个系统应当同时具备两种能力。”
他看了两遍,复制了这段话,贴在一个记事本里,关掉浏览器。
他关掉电脑,站起来,走到窗边,拉开窗帘。
对面那栋楼,亮着灯的窗户不多。三楼亮着,五楼亮着,八楼也亮着。他看了十一个月的那扇,还是黑的。
他站了一会儿,放下窗帘,走回卧室,躺下来。
他闭上眼睛,浮现出蒋辉的 PPT 第一页——红色加粗标题,带下划线,下面是一张流程图,箭头从左上角出发,往右走,分叉,聚合,再分叉,再聚合,汇聚蓝色框,写着“补偿成功”。
他翻了翻身,面朝墙壁,盯着墙上的光,从窗帘的缝隙里漏进来,在天花板上拉出一条细长的白色线条。
他盯着那条线,盯了很久,然后闭上眼睛,睡着了。