跳转至

第七章 · 蒋辉的方案

周四早上,陈稳到公司,刷卡进闸机,等电梯,电梯门打开,里面没有人。他按了八楼。

他走到工位,坐下来,打开电脑。屏幕亮起来,右下角的时间是八点十二分。他打开邮箱,有一封新邮件,发件人是纪衡,抄送结算组全员,标题是“双月会通知:下周三下午两点,三楼会议室”。

他点开邮件,正文两行:时间七月二十八号周三下午两点,每人十五分钟,请提前准备。

他看了两遍,关掉。然后打开 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 第一页——红色加粗标题,带下划线,下面是一张流程图,箭头从左上角出发,往右走,分叉,聚合,再分叉,再聚合,汇聚蓝色框,写着“补偿成功”。

他翻了翻身,面朝墙壁,盯着墙上的光,从窗帘的缝隙里漏进来,在天花板上拉出一条细长的白色线条。

他盯着那条线,盯了很久,然后闭上眼睛,睡着了。


← 第六章 PPT母版 · 目录