本次演讲源于支付宝生活缴费一个包含约 60 万行 Java 代码、600 多个接口的核心在线系统跨语言重构实践。系统包含复杂的业务分支、机构差异配置、分布式调用链和外部依赖。传统依靠代码评审、补充用例和上线观察的交付方式,能够发现局部实现问题,却难以证明新系统在预期业务边界内保持了老系统的关键行为。
为此,我们将重构目标从“迁移代码”转变为“迁移行为”,建立两个相互校验的 Loop:Loop 1 从老系统提取业务行为,通过 PERS 建模、Case-Forge 路径压缩和人机协同完成场景生成;Loop 2 使用 Bubble 在新系统回放相同场景,验证实际执行路径,判定新老系统的行为差异,并结合真实流量回放为分阶段切流提供依据。
本次演讲重点剖析两个工程问题:一是如何从复杂分支中提取规模可控但不失真的行为集合;二是如何识别 AI 生成用例中的路径偏移与假覆盖,并将差分结果转化为可发布、可观测、可回退的工程决策。
演讲提纲
1. 现象:代码完成了,为什么重构还没有完成
- 大规模跨语言重构面对的不是简单的语法转换,而是散落在代码分支、机构配置和外部交互中的业务行为迁移
- 代码评审通过、生成用例 PASS、覆盖率上升,都只能说明部分实现得到检查,不能证明目标业务分支真正执行
- 重构交付最终需要回答三个问题:老系统有哪些关键行为需要迁移;新系统是否真实复现了这些行为;发现差异后,能否据此作出发布决策
2. 思路:把跨语言重构转化为行为迁移
- 不要求新旧代码结构逐行对应,而是在明确的建模与可观察边界内,验证业务终点、核心返回、副作用和关键交互是否等价
- 建立两个相互校验的 Loop:Loop 1 回到老系统,确定“需要迁移什么行为”;Loop 2 进入新系统,验证“这些行为是否被真实复现”
- 将场景生成与执行验真分离。AI 可以参与理解和生成,但不能同时负责生成目标、修改数据并证明目标已经完成
- 重构交付物不再只有新代码,还包括行为模型、可执行场景、实际路径证据、差异结论以及发布与回退依据
3. 方法:双 Loop 如何贯穿重构与上线
- Loop 1 从老系统识别业务终点,使用 PERS 表达行为,通过路径压缩控制组合规模,再由 AI 补全业务数据、机构配置和 Mock 语义
- Loop 2 在相同输入和依赖响应约束下回放新系统,验证实际执行路径,并比较新老系统的业务结果和外部影响
- 两个 Loop 通过行为场景连接。每个场景都需要具备目标行为、输入约束、实际路径证据和差分结论,才能进入后续流量验证
- 整体过程形成“老系统行为提取—新系统回放验真—差异驱动修复—真实流量验证—分阶段切流”的交付链路
4. 技术深挖一:如何得到规模可控但不失真的行为集合
- PERS 将前置条件、触发事件、业务结果和副作用组织为独立于编程语言的行为描述,使老系统中的业务知识能够进入新系统验证
- 在复杂接口中,请求参数、机构配置和外部返回会共同影响执行路径。直接组合所有因素会产生场景爆炸,简单保留高频或 Top-N 路径又可能遗漏低频失败终点
- Case-Forge 首先按照业务终点组织候选路径,复用共享分支条件,对只影响局部结果的独立因素进行增量展开,并剪除约束冲突或不可达的组合
- 路径压缩的目标不是得到最少的用例,而是在执行成本可控的前提下,为每类关键业务终点保留具有代表性的可执行路径
- 确定性分析负责提供路径骨架和条件约束,AI 负责将抽象条件展开为具体的业务数据、机构配置和 Mock,人负责确认高风险终点及语义边界
- 以一个同时受请求参数、机构配置和外部返回影响的接口为例,展示如何从大量路径组合中识别业务终点、压缩候选路径,并生成人可以审查、机器可以执行的场景
5. 技术深挖二:如何识别假覆盖并完成差分验真
- 实践中曾出现这样的场景:AI 生成的用例描述合理,最终断言也能 PASS,但实际执行在前置分支提前结束,目标调用和目标业务终点并未发生
- 进一步分析发现,问题不在断言本身,而在输入、配置和 Mock 的组合没有满足目标路径约束。AI 完成了一个可以通过的用例,却没有完成预期行为的覆盖
- 因此,有效覆盖不能只检查最终断言,还需要同时确认目标终点是否到达、关键条件是否满足、必要调用是否发生、副作用是否符合预期
- 只有实际运行证据与目标路径一致,场景才计入有效覆盖。通过这一规则,将“用例执行成功”与“目标行为真实发生”区分开来
- Bubble 在相同请求和依赖响应约束下分别回放新旧系统,将行为一致性转化为一组可判定的等价约束:业务终点一致、核心返回语义一致、关键副作用一致、重要 IO 交互可解释
- 差异并不直接等于重构错误。空串与 null、时间戳等非确定字段需要归一化;老系统已有行为和本次主动变更需要单独确认;无法归因的差异则阻断下一阶段
- 离线场景验真通过后,再结合录制流量回放验证真实请求分布,并通过白名单、小流量和分阶段切流逐步扩大范围。每个阶段都需要具备明确的观测指标和回退路径
6. 经验:最终沉淀下来的工程判断
- 用例 PASS 不等于目标行为被覆盖。覆盖必须建立在实际路径证据上,而不能仅依赖用例数量、断言结果或覆盖率
- AI 可以参与场景生成,但不能独立证明自己生成的场景正确。目标定义、场景生成和执行验真需要形成相互独立的约束关系
- 老系统是行为参考,而不是绝对正确的规格。历史问题、本次主动变更和真正的重构偏差需要分类处理,不能机械追求所有字段完全一致
- 离线一致不是上线的充分条件。缺少路径证据、差异无法归因、真实流量表现不明确或没有回退能力时,都不能继续扩大流量
- 该方法不依赖单体或分布式架构。单体系统重点观察返回结果和状态变化;分布式系统还需要将外部调用、消息和副作用纳入行为边界。关键在于能否定义并观测需要保持的业务行为
实践痛点
- 行为完整性与执行成本之间存在取舍。复杂分支无法全部穷举,但过度压缩又可能遗漏低频失败行为。我们的判断规则是先保证关键业务终点不丢失,再压缩到达同一终点的等价路径
- AI 生成效率与路径真实性之间存在冲突。实践中出现过用例断言通过、目标调用却未发生的假覆盖。如果只统计 PASS 数量,会高估重构验证程度,因此必须引入独立的实际路径证据
- 严格一致与生产差异之间存在冲突。逐字段比较会被空值表达、时间戳等差异产生的噪声淹没;整体放宽比较又可能掩盖真实业务偏差,因此需要按业务终点、核心语义、副作用和 IO 交互进行分层判定
- 离线可重复与线上真实性之间存在取舍。离线场景便于复现和定位,但无法覆盖全部真实请求分布;真实流量更接近生产环境,却需要控制影响范围并保留快速回退能力
演讲亮点
- 建立面向大规模 AI 重构的双 Loop 方法,将老系统行为提取、新系统回放验真和上线切流连接起来,使 AI 重构从代码生成延伸到可验证、可发布的完整交付过程
- 将覆盖判断从“用例是否通过”升级为“目标行为是否真实发生”,通过实际路径证据识别 AI 场景中的路径偏移与假覆盖,并利用分层行为等价约束形成差异归因和发布依据
听众收益
- 理解为什么代码评审、覆盖率和用例数量无法单独证明大规模重构的正确性
- 掌握以业务终点组织行为模型、压缩复杂路径规模并控制场景成本的方法
- 掌握 AI 语义展开的适用边界,以及路径偏移和假覆盖的识别方法
- 掌握新老系统差异的分层判定方式,以及从离线验真、真实流量回放到分阶段切流的工程决策框架