深度调研 · 遗留系统 AI 现代化

用 AI 重写一个 13 年、73 万行的 ERP:把重构从「迁移代码」改成「迁移行为」

你手上的系统——reed 2.0.6 自研平台、Spring 3.2 + JDK 1.7、3412 个 Java 文件约 73 万行、508 个 MyBatis 手写 Oracle mapper XML、Hibernate 3 只服务 pigeon 工作流引擎、2013 年开发至今——在全世界的遗留系统现代化案例里属于公认最难的那一档:规模中等但业务密度极高、耦合面极广、且没有任何现成的测试网。 这份报告不给你「AI 能一键重写」的幻觉,而是给出被 Google、Amazon、微软、Meta、蚂蚁、华为反复验证过的真实工程形状,以及一份可以直接开工的 90 天动作清单。

调研范围 学术论文 · 大厂一手实证 · 工具链 · 失败率统计 面向场景 自研平台 + 三轨数据访问 + Oracle 证据标注 RCT / 大样本 / 单一案例 / 厂商自报 更新 2026-09

00摘要:十条核心论断

如果你只读一页,读这一页。每条论断都可以被证伪,并标注了主要证据的类型。

  1. 「用 AI 重新开发一个全新系统」这个提问方式本身是错的。大样本 + 多案例

    正确的目标定义是行为迁移(Behavior Migration)——把交付标准从「新系统写完了」改成「新系统在约定业务边界内,与老系统行为等价,且这一点被证据证明」。代码只是行为的载体;你真正要搬走的是 13 年里长在生产环境里的判定逻辑。蚂蚁在支付宝生活缴费 60 万行系统上的原话是:把重构目标「从迁移代码转变为迁移行为」。

  2. AI 在遗留系统上失败,95% 死在同一层:认知层。大样本观察

    Meta 内部对 4100+ 遗留改造任务的统计显示,AI 能独立完成的只有约 5%。原因不是它不会写代码,而是「为什么这段逻辑要这么写」根本不在文件里——它在十年前的邮件、离职同事的脑子里、在没人写下来的口头约定里。对你这套 2013 年起步的系统,这是最致命的一层。

  3. 编码能力早已不是瓶颈,判断力才是。基准测试 + 生产统计

    SWE-bench Verified 上顶级模型已达 78–88%,但更接近真实工作的 SWE-bench Pro 只有 23%,Senior SWE-Bench(欠规格、多服务、长周期)约 24%;生产环境真实 PR 采纳率约 35–50%。把它理解为:AI 能完成「定义清楚的小任务」,不能完成「定义本身」。

  4. 大爆炸式重写失败率 70–88%,且主因是组织性的。多来源统计(口径不一)

    失败原因排序:范围从「替换」膨胀成「重建」、特性冻结在第 4 个月被业务打破、懂老系统的工程师在第 18 个月流失、缺少并行运行期。全部与框架选型无关。这不是技术问题,是节奏问题。

  5. 第零步不可跳过:先把 13 年资产变成 AI 可读的东西。方法论 + 多案例共识

    三件套缺一不可:代码知识图谱(AST + 调用图 + 反向依赖 + CODEOWNERS)、决策日志/ADR(把「为什么」从人脑搬到 git)、特征测试(把「现在长这样」固化成可验证的不变量)。不做这三件事,后面所有 AI 动作都是在沙地上盖楼。

  6. 验证体系的建设成本必须前置,它是决定成败的单一最大投入。单一深度案例

    蚂蚁案例:60 万行、单接口分支超 8000 个、有效验证耗时 2–3 小时、在传统验证环境上 AI 的验证成功率只有约 60%。解法是 Golden Set 场景集(PERS 建模)+ 影子流量回放 + 差分验真,专门为 AI 重造可验证的工程地基。你这套系统的合同域(928 文件)分支密度大概率同级甚至更高。

  7. 「AI 生成占比」和「AI 独立完成占比」是两个完全不同的数,混淆会致命。大厂自报数据

    Google 内部新代码 AI 生成占比 2024 年 25% → 2026Q1 约 75%,看着震撼;但同一时间 Meta 的 AI 独立完成占比只有 5%,DX 测到真正合入主干的 AI 代码约 22%。前者衡量杠杆,后者衡量能力边界。汇报时只报前者,是在自欺。

  8. 代码转换 ≠ 应用现代化。厂商方法论 + 工程共识

    把 73 万行 Java 1.7 翻译成 Java 21 + Spring Boot 4,如果领域边界、数据模型、接口契约全没变,你只是把技术债换了个更贵的新版本,还额外背上了「AI 生成的代码没人真正理解」的认知债。语言升级是副产品,不是目标。

  9. 数据层是最硬的骨头,且唯一必须「先建双轨、再切」的部分。工具链实证

    你的三轨数据访问(508 个 MyBatis 手写 SQL + reed-grail 元数据 ORM + Hibernate 3 工作流)意味着业务逻辑同时寄生在 Java、XML、数据库元数据三层。自动转换工具(ora2pg / AWS SCT / 国产库迁移链)只能覆盖 90%,剩下 10% 的硬逻辑(层次查询、包级状态、自治事务、空串当 NULL)吃掉项目大部分时间。

  10. AI 会引入一种新负债:认知债(Cognitive Debt)。行业雷达 + 咨询共识

    Thoughtworks Technology Radar v34 的核心警告:AI 生成代码量越大,人与系统之间的理解鸿沟越宽。而对遗留系统重构这个场景,认知债是致命的——因为你的目标恰恰是让人重新理解这个系统。所以本报告把「可解释、可审查、可回滚」当成硬约束,而不是加分项。

一句话结论

不要启动「AI 重写项目」,启动「行为迁移工程」:先用 3–6 个月把 73 万行代码 + 508 个 mapper + Oracle 数据字典变成 AI 可读的知识基座,再用特征测试和影子流量织一张验证网,然后从 contract 域(928 文件)里划出最小的一条业务闭环做端到端试点,一个域一个域地绞杀。AI 在这条路径上的角色不是「写代码的」,而是认知放大器 + 确定性子任务的执行器。

01范式判定:什么才算「用 AI 重新开发」

在开工之前必须先分清三种被混为一谈的做法。它们的目标、成本、失败率和验收标准完全不同,而绝大多数「AI 重构」项目翻车,都是因为嘴上说的是第三种,实际做的是第一种。

1.1 三种范式的分野

范 式 A 代码翻译 Code Translation 目标 语法等价地换个语言/框架 产出 能编译、能跑的新代码 验收 编译通过 + 冒烟测试 真实结局 架构照旧,债换新版 范 式 B 全量重写 Greenfield Rewrite 目标 从头设计一套理想架构 产出 新系统 + 一次性切换 验收 功能对齐(实际很难证明) 真实结局 失败率 70–88% 范 式 C 行为迁移 Behavior Migration 目标 等价地搬走业务行为 产出 新系统 + 差分证据链 验收 新老系统 PERS 层面一致 真实结局 可控、可停、可回滚 本报告推荐的唯一路径是最右侧那一栏——因为它把「证明」变成了工程动作,而不是交付后的祈祷
图 1 三种范式分野。范式 A 的诱惑最大(工具链成熟、见效快),但它解决的是「语言版本过时」这个你最不痛的问题;范式 B 的失败率数据来自多份行业统计,口径不一但方向一致。

1.2 判别式:三个问题定路径

问题一:业务规则还在变吗?

如果 contract 域近 12 个月仍在按新业务需求改动,说明它的业务规格还活着——重写风险极高,因为你追的是一个移动靶。此时应选「模块化 + 增量绞杀」。

问题二:运行时还受支持吗?

Spring 3.2 + JDK 1.7 早已 EOL,安全补丁缺失是真实的合规风险(尤其涉及合同、金额、经营指标)。这是唯一能构成「必须动」的硬理由——但它支持的是分层升级,不是全量重写。

问题三:数据模型挡住业务了吗?

只有当 Oracle 里的表结构(而非代码结构)主动阻塞新产品能力时,全量重写才被行业共识认可。注意:「表设计很丑」不构成理由,「表达不了业务」才构成。

给你系统的初判

问题一:合同全生命周期 + 经营指标,13 年持续演进,业务规则必然仍活跃 → 重写风险高
问题二:JDK 1.7 / Spring 3.2 / Hibernate 3 全部 EOL,是真实的驱动因素 → 必须动,但可按层动
问题三:需要你补一个事实——Oracle 数据模型是否阻塞了新业务表达。这是本报告唯一无法替你判断的输入。
综合建议:走范式 C,目标架构倾向模块化单体(Modular Monolith)而非微服务。原因见 05 章:你的团队不具备成熟 SRE/可观测体系时,微服务的运维复杂度会吃掉全部收益。

02理论根基:为什么必须是这个形状

这一章不堆比喻。每一条理论都会推导出一个具体的工程动作——这是它存在的唯一理由。

2.1 阿姆达尔定律:为什么「给团队发 AI 工具」在你的系统里感觉不到效果

最大整体加速比 = 1 / (1 − P),其中 P 是能被 AI 加速的部分占整体的比例。在个人小项目里 P 可以到 0.9,加速比轻松 10×。但在一个 73 万行、13 年历史、跨部门交付的系统里,写代码这件事本身可能只占全生命周期的 20–30%;剩下的是读懂祖传逻辑、跨团队对齐接口、等评审与合规、跑全量回归、协调发布窗口。

10× 5× 2× 1.1× 1× 0 25% 50% 75% 100% P = 可被 AI 加速的工作占总工作量的比例 整体加速比上限 典型 13 年老系统 P≈0.25 → 上限仅 1.33× 把验证也做薄之后 P≈0.75 → 上限 4×
图 2 阿姆达尔定律的直接工程含义:不要把力气花在「让写代码更快」,要花在「把 (1−P) 变薄」——也就是让理解更快、让验证更便宜、让评审更短。这就是后面第 04 章(认知层)和第 06 章(验证层)占据本报告最大篇幅的原因。

推导出的工程动作:

  • 让理解更便宜 → 建代码知识图谱 + 为每个核心模块写「持久上下文」(边界、契约、已知坑、对接人),一次写清、会话自动加载,删掉「反复向 AI 解释仓库」这道串行工序。
  • 让验证更便宜 → 特征测试 + 影子流量回放 + 差分比对。注意方向:目标不是让评审更快,而是让验证不需要评审。评审是最贵的串行环节。
  • 让协作更短 → 明确的模块边界(模块化单体),让接口变更不必跨 5 个团队对齐。

2.2 知识的分布:为什么「读懂代码」比「写新代码」难一个量级

遗留系统研究里有一条反复被验证的经验律:源码中只有 20–30% 能对应到真正的业务规则,其余 70–80% 是与具体技术环境耦合的胶水代码(通信中间件、数据库宏、框架适配、日志、异常兜底)。这也是为什么「把遗留代码整体迁移到新平台」在学术上被明确判定为不明智——你会把 80% 的历史技术债原样搬进新系统。

更麻烦的是,那 20–30% 的业务规则不局限在单个模块内:一个判定条件可能在 A 模块计算,在 C 模块消费,中间经 B 模块裁剪。提取工具必须能跨模块追踪执行路径。

业务规则 ≈25% 技术环境胶水 ≈75%(框架适配 / 日志 / 异常兜底 / 通信与数据库胶水) 0% 25% 50% 75% 100% 做法 A:整体翻译 把 75% 的历史技术债原样搬进新系统 做法 B:先提取规则,再重建 只带 25% 的业务语义过河,胶水全部重写
图 3 知识分布的工程含义。这张图解释了为什么「先做业务规则提取(Business Rule Mining)再动手」不是流程洁癖,而是决定新系统质量的分水岭。行业统计口径下,业务规则考古平均占现代化项目总投入的 27%,而多数厂商报价低估了 3–4 倍。

2.3 遗留代码困境与特征测试:为什么必须「先锁行为,再让 AI 碰它」

Michael Feathers 给出的困境是:安全地改代码需要测试,而建立测试往往需要先改代码。遗留系统的定义就是「没有测试的代码」——你的 73 万行全部符合这个定义。

破解办法是特征测试(Characterization Test,也叫 Golden Master / Approval Test):目的不是验证代码正确,而是记录代码的实际行为。它的算法很朴素但极其有效:

  1. 写一个调用目标单元的测试,断言一个你明知是错的值(例如随便填 expected = 0,而实际返回值尚未可知)。
  2. 运行,从失败输出里读到真实值。
  3. 把期望值改成观察到的真实值。
  4. 用描述行为的名字重命名测试。重复下一个输入。

关键纪律:所有期望值必须来自实际执行。来自文档、注释、提交历史或推测的期望值,记录的是猜测,不是系统行为。

一条会被反复引用的原则

「当系统进入生产,它在某种程度上就成为了自己的规格说明书。」Old code is the spec.
—— 一个 COBOL→Java 的实测案例中,LLM 一次性转换后「连 1994 年就存在的保费进位错误都完整保留了下来」,而这并不是失败,而是正确结果:会计部门的工作流是围绕这个误差建立的。迁移阶段不要要求 AI「顺手优化」,否则你会丢掉自己都不知道依赖了的行为。修 bug 是迁移完成之后独立的、被审批过的工作。

2.4 认知债:AI 时代新增的一类系统性风险

Thoughtworks Technology Radar v34(2026)把「认知债」列为核心议题:AI 生成的代码量越大,人与系统之间的理解鸿沟越宽。技术债影响的是「改起来贵不贵」,认知债影响的是「还有没有人能改」。

对遗留系统重构而言这是致命的悖论:你引入 AI 的目的是让人重新理解系统,但如果 AI 只是加速了代码产出而没有加速理解,你最终会得到一个「代码更新、但更没人看得懂」的系统——比原系统更糟,因为它连历史惯性都没有了。

推导出的硬约束(贯穿本报告后续所有章节):

  • 每个由 AI 生成的模块,必须同时产出该模块的「决策记录 + 持久上下文文档」,与代码同 PR 合入。没有文档的 AI 代码不允许进主干。
  • 禁止把「通过测试」当作唯一验收。必须回答:这段代码是否符合本仓库既有约定?是否重复实现了已存在的抽象?资深评审是否会打回?(这就是 Senior SWE-Bench 强调的「tasteful solve」)
  • 汇报指标里必须包含「AI 独立完成占比」,而不仅是「AI 生成占比」。

03系统画像:你面对的东西到底特殊在哪

在全世界公开的遗产现代化案例里,绝大多数是 COBOL 大型机、或者「标准框架 + 标准架构」的 Java 老系统。你这套系统属于第三类,也是最难被现成方法论直接覆盖的一类:自研平台 + 高业务密度 + 三层业务逻辑寄生。

3.1 量化基线

3 412
Java 文件 / 约 73 万行
属于中型规模,但业务密度极高
928
contract 域文件数
最大业务域:合同全生命周期
623
operation 域文件数
经营指标
508
MyBatis mapper XML
手写 Oracle SQL,非生成
13 年
2013 → 2026
连续演进,无重写历史
3 轨
数据访问技术栈并存
MyBatis / reed-grail / Hibernate 3

3.2 平台层画像:五个自研组件

组件职责技术实质重构风险
grail建模 / 元数据 ORM自研元数据驱动的对象映射,承载业务对象极高 业务模型寄生于此,且无外部对标物
pigeon工作流引擎基于 Hibernate 3 实现,独立技术栈高 流程状态机是隐性规格,且 Hibernate 3 已 EOL
brick页面设计器元数据驱动的界面描述中 UI 层需重建,但业务语义相对独立
tiger安全认证 / 授权 / 审计中 可对标标准 RBAC/ABAC,但历史权限数据是硬约束
runway聚合跨模块数据聚合可控 相对独立,适合作为首个试点域
表 1 reed 2.0.6 的五个自研组件。注意「重构风险」一列的判断依据不是代码量,而是业务语义的寄生深度——grail 和 pigeon 承载了最多隐性规格。

全文最重要的一个判断:自研平台是 AI 的盲区

所有公开的 AI 现代化方法论都隐含一个前提:目标框架是主流开源框架(Spring Boot、Java 17、PostgreSQL),AI 在训练数据里见过成千上万个样本,能补全语义。

但你面对的是 reed / grail / pigeon / brick / tiger / runway——这些名字在公开语料里的出现次数是零。这意味着:

① AI 无法通过迁移学习理解 grail 的元数据语义,你必须显式地把平台规格喂给它;
② 不存在任何现成的「reed → 现代框架」转换工具,工具链必须自建;
③ 这恰恰是 AI 最擅长的场景——不是让它猜,而是在你提供完整规格后,让它做确定性的转换与验证。

结论:本项目第零步的核心交付物,是一份人类专家与 AI 都能读的《reed 平台语义规格》。这份文档的质量,直接决定后续所有 AI 动作的上限。

3.3 数据访问三轨制:业务逻辑寄生在三个地方

这是你系统里最容易被低估的结构性风险。同一个业务规则可能同时存在于三个地方,而且在 Java 代码里看不出来:

轨道一 · Java 应用层 Service / Domain 逻辑、流程编排、校验规则 reed-grail 元数据 ORM 把业务对象映射为表结构 可被 AI 静态分析 轨道二 · 508 个 MyBatis mapper XML(手写 Oracle SQL) 动态 <if> / <choose> 分支 → 事实上的业务判定逻辑 Oracle 方言:DECODE / NVL / ROWNUM / CONNECT BY / 分析函数 半结构化 · 需专门解析 轨道三 · Oracle 数据库内部 存储过程 / 函数 / 触发器 / 序列 / 物化视图 / 定时作业 oracle.dmp 里的数据字典、约束、注释 —— 唯一的事实来源 需导入 + 解析才能看见 任何一个只做单轨的分析都会漏掉行为: 只管 Java → 漏掉 SQL 分支与存储过程;只管代码 → 漏掉数据字典里的约束语义与历史兼容字段
图 4 三轨数据访问的寄生结构。特别注意第二轨:MyBatis 的动态 SQL 分支(<if> / <choose> / <foreach>)是业务逻辑,不是查询优化——在合同域这种多机构、多类型、多状态的场景里,单个 mapper 可能包含几十个分支,它们共同定义了一份「查询语义规格」。迁移时漏掉任何一个 <if> 都等于丢业务行为。

3.4 开工前必须采集的事实清单

行业数据显示,现代化项目最常见的超支原因是「集成面未知」——不知道老系统有多少未被记录的下游消费者。以下清单建议在两周内完成采集,它同时是后续所有估算的输入:

代码侧事实

  • 508 个 mapper 的 SQL 语句总数、动态分支数、跨表关联深度分布
  • Oracle 专有构造清单(CONNECT BY / DECODE / ROWNUM / (+) 外连接 / 分析函数 / MERGE)及各自出现次数
  • 存储过程 / 函数 / 触发器的数量、总行数、依赖关系图
  • grail 元数据定义文件(建模产物)全量导出与结构分析
  • pigeon 工作流定义:流程数、状态数、状态迁移条件
  • tiger 权限模型:角色数、权限点、数据行级权限规则
  • 跨域引用矩阵:contract 与 operation 之间的双向依赖清单

运行侧事实(更关键)

  • 接口契约清单:对外暴露的 API / 页面入口 / 批处理作业 / 报表 / 数据导出,全量枚举
  • 下游消费者清单:谁在读你的库、调用你的接口、解析你的文件(这一项决定成败)
  • 近 12 个月的变更热点:哪个模块改动最频繁(改动频率 ≈ 业务价值密度)
  • 近 12 个月的生产事故清单:出过问题的地方就是规则最密的地方
  • 关键人物清单:每个模块「还能说清为什么」的人是谁、是否在职
  • 数据量基线:核心表行数、日增量、批处理窗口时长
  • Oracle 授权成本与合规要求(合同 / 财务数据的出境与外部处理限制)

04第零步:把 13 年资产变成 AI 可读的东西

这是整个项目的前置条件,也是唯一一个「不做就一定失败」的环节。Google 的经验是 Context is all you need;对巨系统而言,context 不是 prompt 里的几行字,而是一整套基础设施。第零步的目标只有一个:让 AI(以及新人)能在不打扰老兵的前提下,回答「这段逻辑为什么这样」。

4.1 三件套总览

13 年历史资产 73 万行 Java 508 mapper XML oracle.dmp 人脑里的「为什么」 ① 代码知识图谱 AST + 调用图 + 反向依赖 + 所有权 回答:改这里会影响谁 对象:代码「是什么」 ② 决策日志 + ADR 把「为什么这么写」搬进 git 回答:当年为什么这么选 对象:代码「为什么」← Meta 的 5% 症结 ③ 特征测试网 把「现在长这样」固化为不变量 对象:代码「现在输出什么」 AI 可读的知识基座 · 结构化查询:「谁调用了这个函数」 · 语义检索:「合同变更的税费逻辑在哪」 · 变更影响分析:改 X 会波及 Y Z · 自动判对错:改动是否破坏既有行为 → 后续所有 AI 动作的地基
图 5 第零步三件套及其分工。三者不可互相替代:知识图谱知道结构但不知道意图;决策日志知道意图但不知道现状;特征测试知道现状但不能解释原因。缺任何一个,AI 都会在某个维度上瞎猜。

4.2 工序一:代码知识图谱

为什么纯向量检索不够:代码不是散文。「谁调用了这个函数」「哪个接口依赖这个服务」「改这里的影响面多大」是关系问题,不是相似度问题。纯相似度检索会把同一个工具类的多个副本召回,却漏掉真正解释行为的那条调用链。

2026 年的工程共识架构是「双索引」:向量索引负责语义邻域(找到候选),图索引负责结构扩展(决定哪些邻居必须一起带上),再用 token 预算封顶。

建图的技术要点

  • 解析层:用 Tree-sitter 做增量解析,只重算变更文件。公开基准显示该方案可在约 3 分钟内索引 2800 万行 / 7.5 万文件的 Linux 内核(M3 Pro,厂商自测数据)。你的 73 万行属于轻量级。
  • 节点类型:project / package / file / class / method / interface / **mapper / SQL 语句 / 表 / 字段 / 存储过程 / 工作流状态**——后四类是本项目的特殊扩展,通用工具不提供,需自建。
  • 边类型:CALLS / IMPORTS / IMPLEMENTS / INHERITS / **READS_TABLE / WRITES_TABLE / RESOLVES_TO_SQL / DEFINES_FLOW / GRANTS_ROLE**。
  • 切块粒度选择方法级——文件级太粗(问一个方法返回整个大文件)、类级仍偏粗(一个类 20 个方法时臃肿)。每个 chunk 只含一个方法 + 签名 + 注解 + Javadoc,类级摘要作为元数据保留。
  • 索引治理是架构的一部分:文件重命名/删除时必须同步移除或重新索引旧向量,否则失效路径会持续占据检索位。

本项目的三个特殊扩展(自建)

  • SQL 子图。把 508 个 mapper XML 解析为图节点:每个 <select>/<update> 是一个节点,其动态分支、引用表、引用字段成为边。这样「哪些 mapper 依赖 CONTRACT_MAIN 表」变成一条查询而不是一次搜索。
  • 元数据子图。把 grail 建模产物(业务对象 → 表 → 字段映射)导入图谱,打通「业务对象」与「物理表」两套命名体系。这是让 AI 理解 grail 的唯一途径。
  • 平台语义层。为 reed 五个组件各写一份规格文档(见 4.5),作为图谱的「注释节点」,检索时强制随主节点一起带上。

4.3 工序二:决策日志与 ADR

Meta 那 5% 的根因就是「reasoning lives outside the files」——逻辑背后的理由不在文件里。治本的办法是把「为什么」从人脑搬到 AI 能读的结构化位置:

  • 为现存系统补写「追溯型 ADR」。不要试图一次补齐 13 年,只补高风险 + 高变更频率的模块。格式固定五段:背景 / 当时的约束 / 选择 / 放弃了什么方案 / 今天还成立吗。注意最后一段——很多历史决策的前提已经消失了,这正是清理与简化的机会。
  • 设立「知识守门人」角色。专人负责图谱维护、向量库、检索管道、上下文清理。把领域专长外化成 AI 能读的结构,这本身就是护城河。
  • 新决策强制 ADR。从现在起,任何影响跨模块接口、数据模型、权限模型的决策,必须与代码同 PR 合入 ADR。规则简单:没有 ADR 的重构 PR 不允许合入。

4.4 工序三:特征测试网

这是三件套里最需要投入、也最直接产生回报的一件。要点:

  1. 优先级排序,不做全量。只覆盖「高风险 + 高变更频率 + 高业务价值」的模块。行业经验:特征测试覆盖率到 60–70% 通常已经能拦住绝大多数回归。
  2. 粒度从粗到细。先做端到端场景级(一次业务动作的输入输出),再做方法级。场景级成本低但覆盖面大。
  3. 命名必须可识别。测试名里显式带 characterises 标记,文件名用独立后缀。目的:让未来的人和 AI 一眼看出这是「记录现状」而非「断言正确」,并且知道它是临时脚手架、将在重构后被行为测试替换。
  4. 可疑行为要显式标记,不要偷偷放过。当特征测试捕获到一个看起来像 bug 的行为时,在测试里加注释标记 SUSPICIOUS 并说明——原样记录、单独升级评审。绝不在迁移阶段顺手修。
  5. 用 AI 批量生成,但要验证「测试有效」。两道自检:跑覆盖率找出从未被触及的输入;人为注入一个 bug,确认至少有一个测试能抓住它。做不到这两点,测试网就是装饰。

一个会被忽略但很关键的细节

特征测试的期望值必须来自实际执行输出。让 AI「看着代码推理出预期值」是反模式——那记录的是 AI 对代码的理解,而不是代码的行为。正确做法是:把老系统跑起来,喂真实输入,捕获真实输出(生产日志是最佳样本来源),再用这些输入输出对作为黄金样本。这也是影子流量回放(第 06 章)能无缝衔接的原因——它们是同一套样本基础设施。

4.5 第零步的交付物清单

交付物内容验收方式建议周期
代码知识图谱含 Java / mapper / 元数据 / 平台语义四层子图的查询库 + 检索接口任取 20 个真实问题(如「改 X 影响谁」),图谱答案 vs 老兵答案一致率 ≥ 80%6–10 周
《reed 平台语义规格》grail / pigeon / brick / tiger / runway 五份规格:概念模型、约定、扩展点、已知坑新人 + AI 仅读规格即可理解一个中型模块,无需老兵解释4–8 周
Top 20 模块持久上下文每模块一页:边界、契约、已知坑、对接人、相关 ADR 链接会话自动加载后,AI 首次回答的准确率显著提升(可做 A/B)3–4 周
追溯型 ADR 集高风险模块的历史决策记录,含「今天还成立吗」判断每份 ADR 由该模块原负责人签字确认持续
特征测试网高风险模块的黄金样本测试,含 SUSPICIOUS 标记注入式 bug 检出率 ≥ 90%;语句覆盖率纳入看板8–12 周
事实清单第 03.4 节全部条目下游消费者清单须经业务与运维双向签字2 周
表 2 第零步交付物。注意验收方式全部是可测量的——这是从「感觉准备得差不多了」变成「有明确完成标准」的关键。行业经验:这一步的投入看起来「不产代码」,但它是 P 能被有效放大的天花板。

05路径选型:五条路对比与决策树

行业里真正可用的现代化路径只有五条。先把它们放在同一张表上,再走决策树排除。

5.1 五条路径的硬对比

路径做法风险业务连续性成功率证据成本量级
A 代码翻译
工具驱动
用转换工具 / LLM 把代码逐层升级到新语言版本与新框架,架构基本不动 中 依赖与方言陷阱多 阶段性停机或双跑 高(机械部分)。Amazon 自报:数万个生产应用 Java 8/11 → 17,单应用从约 50 天降至数小时 低–中
B 增量绞杀
Strangler Fig
在老系统前加路由层,一个能力一个能力切到新系统,老系统持续缩小直至退役 低 每片可停可回滚 零中断 高。对比数据:增量迁移超支/取消率 28%,大爆炸重写 76% 中(可分期)
C 模块化单体
就地重构
不换代码宿主,但把内部按领域切成严格模块,模块间只走明确接口 低 零中断 中高。公认的「先看清真实边界,再决定是否切服务」的前置步骤 低–中
D 全量重写
Big Bang
冻结特性,从头建新系统,一次性切换 极高 长期双系统并行 + 一次性高危切换 低。失败率 70–88%(多来源,口径不一);大型项目成功率 <10%(CHAOS 报告口径) 高(中位 140 万美元量级 / 22 个月)
E 平台替换 / 重托管
Re-platform
代码基本不动,换运行时/数据库/部署形态(如去 O、上容器) 中 短窗口切换 中。中位 5 个月、成本量级 24 万美元(行业内统计);但「换完还是老系统」 低
表 3 五条路径对比。注意成本与周期数据来自不同咨询机构的统计口径,量级可比、绝对值不可比,仅供排序参考。表中最关键的一列是「业务连续性」——因为对你这种内部信息化系统,任何超过一天的业务中断都会立刻上升到管理层问题。

5.2 决策树

Q1 · 运行时已 EOL 且有合规风险? JDK 1.7 / Spring 3.2 / Hibernate 3 全部 EOL → 是 否 维持现状 · 只做第零步 无合规压力时,不要为重构而重构 是 Q2 · 业务规则仍在演进? 合同 / 经营指标近 12 月仍有新需求 否 路径 A + E · 分层升级 稳定系统只需换运行时,不需重设计 是 Q3 · 数据模型阻塞业务表达? 是「表设计丑」还是「表达不了新业务」?只看后者 否 ★ 推荐路径 C 模块化单体 + B 增量绞杀 A 作为机械转换的执行手段 是 路径 D 重写被纳入讨论 也仅限「数据模型驱动的那个域」重写 其余域仍走 C + B 整棵树里没有「全量重写」这个选项——它只在 Q3 为「是」时以「单域重写」的形式出现,且必须被增量路径包裹
图 6 路径决策树。三个问题按顺序排除,唯一的高亮结果就是推荐路径。注意 Q3 的措辞陷阱:「表设计很丑」几乎永远成立,但它不构成重写理由;只有「现有数据模型表达不了新业务」才构成,而这个判断必须由业务方而不只是技术方做出。

5.3 目标架构:为什么推荐模块化单体而非微服务

行业统计里最刺眼的一个数字:单体 → 微服务的中位成本约 250 万美元、周期 18–36 个月,成功率约 40%。而模块化单体的核心价值在于:它让你在不付微服务运维代价的前提下,先看清真实的领域边界。

模块化单体的定义与收益

  • 定义:单一可部署应用,内部按领域切成严格模块,每个模块拥有自己的领域切片(合同 / 履约 / 结算 / 对账 / 经营指标…),模块间只通过明确接口交互,禁止伸进对方内部。
  • 数据库通常仍然共用,但表按模块分组,跨模块泄漏被主动遏制。
  • 运维简单:一套部署管道、一个运行时、协调成本远低于服务集群。这对尚不具备成熟 SRE / 可观测 / 值守体系的团队是关键优势。
  • 暴露真实边界:当你在单体内部强制模块边界时,会看到哪些模块总是一起改、哪些藏着隐性业务规则、哪里真的需要自治——这些信息在拆分前是拿不到的。
  • 给未来留门:模块边界清晰后,若某个模块确有独立扩容或独立交付需求,再单独抽出为服务,代价远低于盲目先拆。

什么信号才支持真的拆服务

  • 某个模块出现明显的独立扩容压力(不是均匀的)
  • 某个模块需要独立的交付节奏(不同团队、不同发布窗口)
  • 领域边界已经清晰且稳定
  • 团队具备分布式系统的运维成熟度:CI/CD、监控、自动化测试到位
  • 有真实的业务理由,而不是技术趋势

判据:六条里少于三条成立时,拆服务带来的运维复杂度会吃掉收益。你当前的状态大概率是 0–1 条。

5.4 工具与 AI 的分工:什么交给机器,什么必须交给人

这是整个选型里最实用的一张表。核心原则:确定性的重复改动交给确定性工具(recipe / AST 转换),需要判断的地方才用 AI,架构与领域设计永远由人主导。

任务类型AI / 工具适用度推荐手段说明
替换废弃 API高OpenRewrite recipe确定性、可重复、零幻觉
升级重复的依赖高OpenRewrite + 依赖矩阵机械劳动,工具比 LLM 更可靠
生成测试高LLM + 特征测试框架但期望值必须来自实际执行
解释陌生类 / 模块高知识图谱 + LLM第零步的核心收益
重构重复代码高LLM + 人工评审需要「符合本仓库约定」的判断
更新配置高规则引擎 + LLM 兜底注意属性重命名会静默失败
应用服务器模式转换中高LLM + 集成测试需要大量回归验证
单体边界分解中人主导 + AI 辅助分析AI 提供依赖证据,人做边界决策
领域架构重设计人主导人 + Event StormingAI 无法承担业务判断
目标架构定义人主导架构委员会涉及组织与长期取舍
表 4 工具与 AI 的能力分工。这张表的实践含义是:把「用 LLM 做每一处改动」的冲动压下去。大规模现代化的正确形态是「确定性转换工具打底 + AI 处理需要判断的部分」,而不是让 LLM 包办一切——后者在编译通过率上看起来不错,但结构性问题会被 CodeBLEU 这类文本重叠指标掩盖(有研究显示两种方法在该指标上都得 91 分,而实际结构正确率天差地别)。

AI 与代码图谱的实证效果(可作为立项依据)

有一项针对企业级代码迁移的对比研究值得注意:标准向量 RAG 与分层上下文驻留图(HCRG,基于 AST + 属性图 + 上下文缓存)相比,后者在多项指标上显著更好——API 幻觉率从 56.4% 降至 16.2%,依赖解析质量从 34.8% 升至 65.9%,父子一致性从 26.7% 升至 45.5%。代价是引入了一定的「防御性过度设计」(圈复杂度一致性从 71.6% 降到 46.7%)。

这条证据同时说明两件事:① 图结构检索对代码迁移是实质性的改进,不是噱头;② 它会带来新的副作用(过度抽象),需要人工评审兜住。

06行为迁移工程:把「等价」变成可证明的工程动作

这一章是本报告的技术核心。它解决的问题是:当新老两套代码结构完全不同时,你凭什么说新系统是对的?行业里最成熟的公开答案是蚂蚁在支付宝生活缴费 60 万行系统上的双 Loop 体系——它的规模、技术栈、业务密度与你的系统高度可比,因此本报告把它作为主要参照。

6.1 起点:把重构的验收标准从「代码」换成「行为」

传统交付方式——代码评审 + 补充用例 + 上线观察——只能发现局部实现问题,无法证明新系统在预期业务边界内保持了老系统的关键行为。原因很直接:代码评审通过、生成用例 PASS、覆盖率上升,这些都只说明「部分实现得到了检查」,不能证明「目标业务分支真的被执行过」。

因此需要换一个可计算的等价性定义:

把每个业务接口视为一个函数:( P + E ) → ( R + S ) 单个测试用例 = 决策路径上的一次 PERS 采样 P · 入参 请求参数 / 报文 / 操作上下文 (含用户、机构、时点) E · 环境 数据库状态 / 配置 / 权限 / 开关 / 下游依赖状态 R · 返回 业务终点 / 核心返回字段 / 状态码 / 错误语义 S · 副作用 写库 / 发消息 / 生成单据 ← 最容易被漏掉的一项
图 7 PERS 等价性定义。关键约束:要求新老系统在「同一条决策路径」下,R 与 S 完全一致。不要求新旧代码结构逐行对应——这正好绕开了「结构无法映射」这个死结。副作用 S 是绝大多数团队会漏掉的一项:你的系统里,一次合同变更很可能同时写主表、写流水、写日志、触发工作流、发通知,这些都属于 S。

6.2 双 Loop:提取什么,验证什么

两个 Loop 相互校验,各自回答一个不可省略的问题。

LOOP 1 · 回到老系统:确定「要迁移什么行为」 ① PERS 建模 把接口形式化为 (P+E)→(R+S),定义可观察边界 ② 路径压缩(Case-Forge) 从上千分支中提取「规模可控但不失真」的行为集合 ③ 人机协同场景生成 AI 生成候选 + 业务专家确认,形成 Golden Set 场景集 ④ 产出 Golden Set 可枚举、可生成、可覆盖的行为基线 场景 差异 LOOP 2 · 在新系统回放:验证「是否真实复现」 ① 场景回放(Bubble) 在新系统执行同一 Golden Set 场景 ② 实际执行路径校验 识别 AI 生成用例的「路径偏移」与假覆盖 ③ 行为差异判定 按 PERS 维度比对,输出带优先级的差异报告 ④ 真实流量回放支撑切流决策 为分阶段灰度提供可发布 / 可观测 / 可回退依据 重构最终必须回答三个问题:老系统有哪些关键行为要迁移 → 新系统是否真实复现 → 发现差异后能否据此作出发布决策
图 8 行为迁移双 Loop。两个 Loop 的分工不可混淆:Loop 1 决定「测什么」,Loop 2 决定「能不能上」。实践中最大的工程量在 Loop 1 的②「路径压缩」——因为你的 contract 域单个查询接口在 13 年演进后,分支组合数很可能远超可穷举范围。

6.3 路径压缩:从上千分支到可管理的场景集

以合同域为例:合同类型 × 机构差异 × 状态 × 权限 × 时点 × 特殊条款,组合爆炸。行业公开案例中的对照数字是「2B 侧 600+ 技术接口、千家机构异构;单接口分支超 8000 个」。你的系统不会更简单。

压缩策略(按优先级):

  1. 等价类合并:把「同一个 <if> 分支内、参数取值不同但走完全相同的执行路径」的输入合并为一类。判据不是参数值,而是最终执行到的路径标识。
  2. 决策路径覆盖优先于参数覆盖:目标不是覆盖参数空间,而是覆盖决策路径集合。这直接把问题从「指数级」降到「分支数级」。
  3. 真实流量反哺:从生产日志里聚类高频路径,用真实分布决定压缩后的场景权重。生产流量天然包含那些没人想得起来的边缘场景——这是它比人工设计用例强的地方。
  4. 高价值低频场景单独保留:金额、结算、税务相关路径,哪怕一天只跑一次,也必须单列。低频高价值场景正是灰度放量后翻车的高发区。

必须警惕的「假覆盖」(False Coverage)

这是 AI 生成用例最危险的失败模式:用例看起来覆盖了目标分支,覆盖率指标上升了,但实际执行路径发生了偏移,目标分支从未被真正执行。

典型表现:AI 根据代码文本推理出「这段逻辑应该走 A 分支」,于是构造了一个看起来能触发 A 的输入;但由于上游某个校验先拦住了请求,实际执行到的是 B 分支(或提前 return)。测试 PASS,覆盖率 +1%,业务行为完全没有被验证。

破解手段只有一个:在 Loop 2 里采集「实际执行路径」并与预期路径比对,而不是只看返回值。这要求新系统具备运行时路径埋点能力——这属于第 08 章的 Harness Engineering 范畴,必须在试点阶段就建设,不能等。

6.4 影子流量与差分验真

场景回放解决的是「已知路径的等价性」;影子流量解决的是「未知路径的覆盖率」。两者互补,缺一不可。

线上用户请求 真实全量流量 流量复制层 异步镜像 · 不阻塞主链路 老系统(现网) 正常处理 · 真实响应给用户 用户收到 200 OK 业务零感知 · 完全无感 镜像 清洗 / 脱敏 / 改写 换影子请求 ID · 拦截写操作 新系统(影子实例) 完整计算 · 响应被丢弃 DIFF 比对引擎 按 PERS 维度比对 · 忽略规则过滤噪音 准出决策系统 差异率达标 → 放量 / 超阈值 → 拦住并定位 三个必踩的坑(上生产前必须解决) ① 影子流量写脏生产数据 → 应用层 / 中间件层拦截写操作,路由到影子表 ② 新系统调用下游影响第三方 → 下游依赖隔离(Mock 或影子下游环境) ③ DIFF 结果噪音太大,被淹没 → 配置忽略规则:日志 ID / 时间戳 / 非核心统计字段
图 9 影子流量与差分验真。设计要点:镜像必须异步且失败不影响主链路;影子必须覆盖全量而非抽样——抽样会让长尾场景进不了比对池,而这恰恰是影子相对场景回放的核心优势。另一个易错点:差分统计必须按业务标签拆分,只看整体差异率会被「占比小但差异巨大」的类别掩盖(公开案例中,某次整体差异仅 1.2%,但按标签拆开后发现某类场景字段错位率达 7%,靠标签维度才拦下了这次发布)。

6.5 差异治理:把差分结果变成发布决策

差分结果的用途不是「报告」,而是决策。建议把差异按四级分类,并为每一级预设动作:

差异等级典型情形预设动作决定权
L1 行为缺失老系统产生了副作用(写流水 / 触发流程),新系统没有;或反向立即阻断,不计入差异率统计,直接定位工程负责人
L2 结果不一致核心返回字段值不同(金额、状态、单号、日期)阻断放量,逐个定位后重新验收工程 + 业务双签
L3 非核心差异日志文本、中间态字段、非业务性排序必要时显式配置忽略规则(须记录理由),否则视为缺陷工程负责人
L4 已知历史缺陷老系统 13 年积累的、被业务绕过的错误行为按老系统行为复制,纳入「待修复清单」单独排期,不在迁移期修业务负责人
表 5 差异分级与预设动作。L4 是最容易被团队误解的一级:很多人出于工程师本能想「顺手修掉」,但这会在迁移期同时引入两个变化(迁移 + 修 bug),使差异归因失效。正确做法是原样复制那个 bug,然后在迁移完成后作为独立的、被审批的变更去修。

6.6 一条重要的反直觉纪律

不要在迁移阶段要求 AI「优化」

给 AI 的指令必须是范围受限、输出格式已定义、运行环境已锁定、不得引入任何「改进」的。原因:遗留系统的现有行为就是规格——会计流程可能是围绕某个历史误差建立的,下游系统可能依赖某个看起来错误的排序。

公开案例中的做法值得照抄:把测试集与历史错误记录一起塞进上下文,让模型知道「这段代码为什么长成这样」;用文件级流水线(读一段 → 生成新类 → 编译 → 跑测试 → 报 diff),只有 diff 数超过阈值时才叫人。该案例中 AI 仍然幻觉出两处新的 off-by-one 错误——是被静态分析步骤拦下的。

结论:AI 复制老 bug 是它理解了契约的证明;测试网才是用来确认它没有发明新 bug 的。真正的风险不是 AI 抄错了,而是它悄悄生成了新的错误,同时把老代码显得很干净。

07数据层攻坚:三轨数据访问与 Oracle 的正确打开方式

如果你只从这份报告里拿走一条战略建议,就是这一条:把「应用现代化」和「数据库替换」解耦,不要同时做。这是唯一能让你把项目风险从「乘积」降成「相加」的操作。

最重要的一个战略判断:数据库可以延后

绝大多数「AI 重写 + 去 O」项目失败,是因为把两个独立的极高风险变量绑在了一起:既要重构 73 万行应用逻辑,又要重建数据模型和全部 SQL。任何一个出问题都无法归因,回滚也没有干净的边界。

建议路径:
① 第一阶段(0–18 个月):新系统继续使用 Oracle。数据访问层用标准 JDBC / JPA / SQL 抽象隔离,SQL 保持 Oracle 方言。目标是先把应用逻辑与行为等价性做出来。
② 第二阶段(18 个月后):当新系统稳定运行、且已建立起完整的 SQL 清单与影子验证能力后,把数据库替换作为一个独立的、有明确边界的项目来做,届时它已经从「600 个未知」变成了「一份已知清单」。

只有一种情况例外:合规或授权成本构成硬约束。如果去 O 是政策要求而非技术选择,那它有自己的时间表,此时应把数据库替换当作独立工作流并行推进,但绝不让它成为应用重构的前置依赖。

7.1 Oracle 专有构造:转换难度分三档

公开工具链的实测边界很明确:自动化工具能完整转换 90%+ 的数据库代码,剩余不到 10% 需要人工。问题在于,这 10% 吃掉了项目的大部分时间。所以关键是提前知道这 10% 在哪——工具的评估报告(迁移成本评分)就是这张地图。

第一档 · 机械可自动(工具直接覆盖,抽查即可) NVL(a,b) → COALESCE(a,b) | DECODE(x,v1,r1,def) → CASE WHEN ROWNUM <= n → LIMIT n | sequence.NEXTVAL → nextval('seq') | SELECT 1 FROM DUAL → SELECT 1 Oracle (+) 外连接 → 标准 LEFT / RIGHT JOIN | VARCHAR2 → VARCHAR | DATE → TIMESTAMP(0) 注意:DATE 必须映射为 timestamp(0)——Oracle 的 DATE 是含时分秒的,映射成 date 会丢时间 第二档 · 必须语义重写(工具不覆盖,逐个手工,工作量大头) CONNECT BY PRIOR … START WITH → WITH RECURSIVE(层次查询,最常见的重写项) PRAGMA AUTONOMOUS_TRANSACTION(自治事务) | 动态 SQL 拼接 | Optimizer Hints DBMS_* 系统包 | UTL_FILE 文件操作 | CREATE SYNONYM(无 DDL 等价物) 空字符串 '' 等于 NULL —— 改变 IS NULL 判断、约束行为与字符串拼接结果 最后一条是最隐蔽的坑:Oracle 里 '' 与 NULL 同义,PG 系并非如此;WHERE col = '' 这类条件会静默改变语义 第三档 · 架构级问题(不是语法问题,必须重新设计) PL/SQL 包裹(PACKAGE)无直接等价物 → 需拆解为 schema,包级变量重新设计为会话状态 事务边界哲学不同:Oracle 文化里的隐式提交 vs 调用方界定事务;函数内不能 COMMIT 逐行循环必须重写为集合式(同语义但性能差一个量级) | 异常处理块滥用导致性能退化 只要内存中有任何 Oracle 例程在例程体内提交事务,就必须逐一审计——这类逻辑无法自动转换 三档的实际工时分布:第一档 ≈5%,第二档 ≈60%,第三档 ≈35%
图 10 Oracle 构造的转换难度分档。底部工时比例是经验分布,用于校准预期——不要在立项时按「90% 自动」来排期,因为那 90% 是代码行数口径,而工时口径下机械部分只占 5%。正确的排期原则:围绕测试排期,而不是围绕代码转换排期,因为剩余风险全部集中在验证环节。

7.2 工具链选型

工具定位自动转换率适合与不适合
ora2pg开源(Perl),schema + 部分 PL/SQLschema 全覆盖;PL/SQL 仅简单逻辑适合 预算敏感、目标 PG 系;不适合 复杂 PL/SQL、CONNECT BY
AWS SCT / DMS商业,schema 转换 + 数据搬迁 + CDC完整转换 90%+ 数据库代码适合 云迁移、需要一体化的全量+CDC;不适合 不想上云的场景
国产库迁移链
金仓 / OceanBase 等
信创场景,含 Oracle 兼容模式厂商自报 80–95%(视产品路线)适合 有信创要求;注意 高级特性(UTL_FILE、CONNECT BY 等效性)仍有差异,需实测
Istio / 网关流量镜像流量复制,不做数据转换不适用适合 影子验证阶段;与上述工具互补而非替代
LLM 辅助重写处理第二 / 三档的人工部分视上下文质量而定适合 语义重写 + 生成对照测试;严禁 单独作为迁移唯一手段
表 6 数据层工具链。实践中的正确组合是:确定性工具做第一档 → 人工 + LLM 做第二档 → 架构设计 + 人工做第三档 → 影子流量验证全部。任何声称「一键完成」的宣传都应假定它只覆盖了第一档。

7.3 数据切换三阶段

阶段一 · 全量装载 从 oracle.dmp 导入 → 抽取 → 装载 卸载索引 → 装载 → 重建索引 分批并行,耗时可能达数天 关键动作 数据类型逐列映射决策 序列复位到当前最大值 阶段二 · CDC 增量同步 捕获 oracle.dmp 源库变更 → 实时同步 老系统持续读写老库,互不阻塞 新系统双写 → 新库为影子记录 关键动作 每日全量校验 + 实时增量比对 此阶段可持续数周至数月 阶段三 · 切换与收尾 一致性验证通过 → 新库成为记录系统 待同步延迟收敛到零,短暂停写切换 新系统独占读写新库 回滚窗口 移除老对象前可回滚 移除后回滚需还原对象 + 重放变更 铁律:把「移除遗留对象」当作每个领域的最后一步,且只在验证通过后才执行。 移除前:回滚只是切回路由。移除后:回滚需要还原对象并重放数据变更,工作量与风险大幅上升。
图 11 数据切换三阶段。回滚窗口是这张图的全部要点——阶段一、二期间回滚只是路由切换,移除老对象后回滚则要还原对象并重放变更。因此「删老表」这个动作必须被显式地当作独立决策来审批,而不是迁移完成后的顺手清理。

7.4 508 个 mapper XML 的处理工序

这是你系统里最特殊的一块,公开方法论很少直接覆盖。建议按下列工序处理:

  1. 解析为结构化数据(而非文本)。把每个 mapper 解析为:语句 ID、类型、引用表、引用字段、动态分支树、Oracle 专有函数清单、结果映射。产出一份可查询的台账,这是后续一切自动化的输入。
  2. 区分「查询语义」与「实现细节」。动态 <if> / <choose> 的分支条件属于业务语义,必须逐条确认并纳入 Golden Set 的场景枚举;而 <where> 拼接、字段别名、排序写法属于实现细节,可以自由重写。
  3. 按「引用表」而不是「按文件」聚类。同一个业务实体(如合同主表)往往被几十个 mapper 交叉引用。按表聚类能让迁移后的模块边界自然浮现,也是模块化单体划分的数据侧依据。
  4. 用真实执行计划做交叉验证。从 Oracle 的共享池 / AWR 里导出历史 SQL 的实际执行记录与执行计划,与静态解析结果比对。静态解析会漏掉运行时动态拼接的 SQL——而这正是最容易出生产事故的部分。
  5. 生成对照测试。对每个语句,用老库数据构造输入、捕获输出,形成语句级的等价性测试。这比端到端测试便宜得多,且能精确定位差异。

7.5 关于 oracle.dmp 的使用建议

它是你最重要的资产

  • 数据字典是唯一的事实来源。表结构、约束、索引、外键、列注释、分区定义——这些决定了真实的数据模型,而不是代码里的假设。
  • 列注释常含业务语义,是业务规则挖掘的免费线索。
  • 历史数据本身是行为的证据:某些字段的取值分布能反推出被遗忘的业务规则(例如某个状态码只在特定机构出现)。
  • 导入一份到隔离环境,作为只读分析库与测试数据来源。

使用它的三条安全底线

  • 不得上传到外部 LLM 服务。含真实合同、金额、人员数据的 dmp 属于高敏数据。需要 AI 辅助分析时,只发送脱敏后的结构(DDL + 注释 + 字段统计)。
  • 导入环境必须网络隔离,与生产不互通,避免误连。
  • 建可重复的脱敏管道:结构保留、值替换、比例保持(分布特征不丢)。这同时解决了「测试数据不真实」和「数据不出域」两个问题。

一个反直觉的提醒

不要试图用 AI 直接「读懂」整个 dump。dmp 是二进制导出格式,不是分析载体。正确顺序是:先导入 → 用数据库自身的数据字典视图导出结构元数据 → 用 SQL 查询导出字段级统计特征 → 把这些结构化、脱敏、体积可控的产物喂给 AI。

这一步做对了,AI 就能回答「哪些表是核心事实表」「哪些字段事实上是枚举且取值有哪些」「哪些外键关系已失效」——这些是模块划分的直接依据。

08AI 工程体系:窄域智能体网络 + 闸门化授权

这一章回答一个具体问题:AI 到底以什么方式接入你的工程流程?答案是:不要追求「一个全能智能体」,而要建一张被既有流程闸门包住的窄域智能体网络,每个只压缩一处瓶颈。

8.1 为什么是「窄域网络」而不是「全能智能体」

全能智能体的幻想

「让 AI 读完整套 73 万行代码,然后重写一个系统」——这是个人小项目的心智模型(vibe coding),放到巨系统里必然失败:

  • 上下文装不下(500 万行级别的仓库无法整体进入任何上下文窗口)
  • 无法归因(一次跑出来的东西错了,你连是哪一步错都不知道)
  • 无法回滚(大块产出没有可回退的粒度)
  • 无法信任(没有人能审阅它做的一切)

窄域网络的实际形态

每个智能体只做一件事,且必须同时满足三个条件(巨系统上智能体的安全三件套):

  • 窄——职责边界清晰,输入输出格式固定
  • 可评测——有自动化手段判断它做得好不好
  • 可回滚——产出是离散的、可撤销的变更单元

符合这三条的典型窄域:依赖升级、API 弃用替换、测试生成、API 文档生成、变更日志、只读问答、根因分析、**SQL 语句级等价性测试生成**。

8.2 四阶段授权模型:智能体永远不绕过人类闸门

这是整个落地路径里最容易翻车的地方:不能让智能体绕过现有的评审、回归、发布闸门。一次幻觉就可能冻住整条发布线。正确做法是借绞杀者模式对智能体也做渐进式授权:

① 只读影子 只读仓库 / 日志 / 监控 回答「这段为什么这样」 流程影响:零 ② 影子提议 产出补丁 / 测试建议 但走与人类完全相同的 PR + 评审 + CI 闸门 人逐条 review 后 apply 流程影响:不新增流程 只加速既有流程 ③ 带闸门自治 在「有评测集 + 特征测试 兜底」的窄域内: 自动提 PR · 自动跑回归 通过闸门后自动合入 人:设闸门 + 抽样审计 流程影响:局部提速 风险被测试网围住 前置条件:特征测试覆盖率 达阈值 + 差异率长期达标 ④ 边界内全自治 边界清晰 / 可回滚 / 可评测 的子域端到端自治 典型:某类迁移、某类测试 生成、批量文档补全 人:只看 outcome 与 budget 流程影响:该子域被重铸 注意:这一步不是「绕过流程」, 而是闸门本身已被智能体化 判定标准:AI 独立完成占比 (而非 AI 生成占比)持续提升 且事故率不上升 授权程度(随时间推进,且每一级都必须以「上一级已稳定运行」为前提)
图 12 智能体四阶段渐进授权。这条路径的灵魂是:智能体的产出永远先走既有闸门,而不是为它开一条绕过人的快通道。阶段 ② 尤其关键——智能体提的 PR 走和人类一样的评审、一样的 CI、一样的发布窗口,不破坏任何既有流程,只是把「人写代码」这一步加速了。

一条关于「假自动化」的判断标准

「95% 准确、剩下 5% 还要人审」叫假自动化——因为那 5% 仍然需要人的注意力,而人的注意力是稀缺资源,它依然是瓶颈。只有把最后那 5% 也推到可自动判定,人力才被真正释放。

因此本项目中「合格」的智能体不是「写得像」,而是「错了能被自动发现」。这也是为什么第 06 章的验证体系和本章的 Harness 建设,优先级高于任何编码类智能体。

8.3 Harness Engineering:把验证环境改造成 AI 可用的

这是公开案例里一个很容易被忽略但极其重要的发现:传统验证环境对 AI 的适配性很差。在一项 60 万行系统的公开实践中,AI 在传统验证环境下的验证成功率仅约 60%,且单次有效验证耗时 2–3 小时。这意味着智能体大部分时间浪费在等待与误判上。

解法是专门为 AI 重建验证基础设施(Harness Engineering)。以下是可直接照做的五项改造:

改造项传统做法(对 AI 不友好)AI 友好做法预期收益
调用方式人工点界面 / 填表单触发提供可编程接口(命令行 / API),智能体可直接调用从「人驱动」变「智能体驱动」
反馈时延一次有效验证 2–3 小时环境常驻 + 增量构建 + 并行执行,压缩到分钟级迭代次数提升一个数量级
输出格式人读的日志文本结构化输出(JSON:通过/失败、差异字段、证据链接)智能体能自己判断对错
环境状态手工准备数据,状态漂移环境快照 / 可重置,每次验证从干净状态开始消除「上次跑的残留」类伪失败
失败归因只报「用例失败」附上实际执行路径 + 期望路径 + 差异字段同时解决假覆盖问题(见 6.3)
表 7 Harness Engineering 的五项改造。这五项的共同目标是同一件事:让「验证」这个动作变得便宜到可以反复做。回到阿姆达尔定律——把验证成本降下来,等于直接抬高 P 的上限。这项工作看起来不像「重构」,但它的杠杆率最高。

8.4 指标设计:防止被好看的数字骗过去

这是本报告里最能直接用在汇报材料上的一张图。

指标 A · AI 生成代码占比 衡量「杠杆有多大」——但会被误读 100% 50% 0 25% 2024 50% 2025 75% 2026Q1 ≈100% 新项目 来源:Google 公开披露的内部数据(厂商自报) 指标 B · AI 独立完成占比 衡量「能力边界在哪」——这才是瓶颈指标 100% 50% 0 5% Meta 遗留任务 22% DX 合入主干 ≈24% Senior SWE ≈23% SWE-bench 同一时期、同一批前沿模型 — 两个数差了十几倍 巨系统的胜负手从来不在指标 A,而在指标 B。 两图共用同一纵轴刻度。汇报时只报 A、不报 B,等于把「杠杆变长了」误读成「瓶颈变宽了」——这是大多数 AI 重构项目的立项误导源头。
图 13 双指标对照。同样的前沿模型、同一时期,AI 生成占比可以到 75%,而 AI 独立完成占比只有 5–24%。建议在项目看板上同时挂这两个数,并明确「B 才是本项目的真实进度条」。注意所有数据均来自厂商披露或第三方实测,口径不完全一致,仅用于表达量级差异。

8.5 六条防幻觉机制(可直接写进开发规范)

  1. 证据强制。任何 AI 给出的结论必须附代码位置 / 执行证据 / 数据出处。无法给出证据的结论一律视为推测。
  2. 路径校验而非结果校验。验证「实际执行到了哪条路径」,而不只是「返回了什么」。这是防假覆盖的唯一手段(见 6.3)。
  3. 确定性优先。能用工具链 recipe 解决的不走 LLM。LLM 只处理需要判断的部分(见 5.4)。
  4. 变更原子化。每次变更必须小到可被一次代码评审完整审阅。大块产出一律拆分。
  5. 负样本集。除了「正确样本」,还要维护一组「已知错误样本」,定期跑一遍确认智能体能识别它们。没有负样本集的评测是自欺。
  6. 私有留存集。不要用公开基准判断你的智能体行不行。从你自己的仓库里切出最近 6–12 个月的内部提交作为私有评测集——这个时间段的内容在任何模型的训练语料里都不存在,天然免疫污染。

09组织与治理:决定成败的是这些「非技术」的事

行业统计反复指向同一个结论:大规模现代化的失败主因是组织性的,不是技术性的——范围从「替换」膨胀成「重建」、特性冻结被业务打破、懂老系统的人流失、缺少明确的所有权。这一章处理的就是这些。

9.1 五个必须明确的角色

角色唯一职责关键授权常见错误配置
现代化总负责人
单一责任人
对整体节奏、范围与对外承诺负责 可否决范围膨胀;可暂停任一试点 设成委员会 → 无人负责,决策瘫痪
业务行为权威
业务侧
裁决「这个行为是业务规则还是历史缺陷」(即 L4 差异的判定权) 对差异分级有最终裁定权 由工程代劳 → L4 差异被当成 bug 顺手改掉,引入隐性回归
知识守门人
新增角色
维护代码知识图谱、决策日志、检索管道、上下文清理 对文档质量有门禁权(无 ADR 的重构 PR 不得合入) 无人负责 → 图谱三个月后就过期,检索质量崩塌
验证体系负责人
新增角色
Golden Set、影子流量、差分引擎、Harness 建设 裁定「差异率是否达标」 挂靠在测试团队下 → 被视为「测试工作」而非工程地基,投入被砍
平台架构师 目标架构、模块边界、平台语义规格(reed 五组件) 模块边界最终裁决 让 AI 或外部顾问决定边界 → 边界与业务不一致,后续全盘返工
表 8 五个关键角色。其中「业务行为权威」和「知识守门人」是绝大多数项目缺失的两个。前者的缺失会导致 L4 类差异被误改(见 6.5),后者的缺失会让第零步的成果在三个月内腐化——这是最常见的「做完知识图谱就没人维护」死法。

9.2 三条不可协商的合规红线

红线一 · 数据不出域

oracle.dmp 与任何含真实合同、金额、人员数据的样本,不得上传至外部大模型服务。需要 AI 辅助时,只发送脱敏后的结构(DDL + 注释 + 统计特征)与合成样本。这是硬约束,不是建议。

红线二 · 智能体最小权限

智能体的权限按第 08 章的四阶段模型逐级授予,默认只读。生产环境的写权限、数据库 DDL 权限、发布权限,必须有独立的、可审计的授权流程。零信任 + 沙箱执行是准入条件,不是加分项。

红线三 · 可审计的产出

每一条 AI 生成的代码都要能追溯到:哪个智能体、什么提示、哪些上下文、谁审阅、依据什么证据合入。审计链断了,后面对任何差异都无法归因。

9.3 投资配比:真正的编码只占四分之一

这是最容易被管理层误解的一条。不要把预算全部按「开发人天」来规划——大规模现代化的成本结构与传统开发完全不同:

27% 资产可读化 28% 验证与 Harness 17% 架构与领域建模 23% 编码与迁移执行 5% 资产可读化 业务规则考古 + 知识图谱 + 决策日志 + 特征测试网 验证与 Harness Golden Set + 影子流量 + 差分引擎 + 环境改造 架构与领域建模 模块边界 + 事件风暴 + 平台语义规格 编码与迁移执行 含 AI 生成 + 人工评审 ← 这是唯一被 AI 大幅压缩的 23% 业务规则考古在行业统计中平均占总投入 27%,而多数厂商报价低估了 3–4 倍——因为「未记录的业务规则」只在 新系统与老系统给出不同答案时才浮现出来,在那之前它不在任何人的清单上。
图 14 投资配比建议。这张图最重要的用途是管理预期:如果立项时按「开发人天」估算,你会得出一个偏低的数字;而真实成本的大头在「理解」和「验证」上。AI 压缩的是最下面那 23%,不是全部。把它误当成「总成本打三折」是立项阶段最常见的灾难。

9.4 向上汇报的正确口径

应该这样报

  • 「已建立代码知识图谱,覆盖 X% 核心模块,变更影响分析自动回答准确率 Y%」
  • 「特征测试网锁定 Z 个关键业务行为,注入式缺陷检出率 90%+」
  • 「试点域在影子流量下运行 N 周,L1/L2 级差异归零」
  • 「AI 独立完成占比从 0% 提升到 M%,事故率未上升」

不要这样报

  • 「AI 生成了 80% 的代码」——这是指标 A,不反映能力边界
  • 「重构进度 60%」——没有定义「完成」的口径,这个数没有意义
  • 「节省了 N 人天」——在人天不是瓶颈的项目里,这个数会被追问倒
  • 「试点很成功」——没有差异率与覆盖率数据的成功不是证据

10路线图:90 天 / 12 个月 / 36 个月

节奏设计的核心原则来自公开实践的经验教训:前 12 个月几乎不碰组织结构和发布流程,所有 AI 动作都被既有闸门包住。这样「不影响其他流程顺畅运行」这条红线才始终成立。

10.1 全景甘特图

M0 M6 M12 M18 M24 M30 M36 第零步 · 资产可读化 知识图谱 + 平台语义规格 事实清单与试点选型 2 个月 特征测试网 高风险模块优先 · 覆盖率爬坡 Harness 与验证基建 Golden Set + 影子流量 + 差分引擎 ★ 试点域端到端绞杀 contract 域一条最小业务闭环 逐域扩展 第 2、3 个域 → 全量域(operation 等) SQL / mapper 层迁移 语句级等价性测试驱动 数据库替换(独立评估) 不作为前置依赖 组织与流程重塑 仅在智能体已稳定覆盖后动 前 12 个月不碰组织与发布流程;M18 之后才开始动结构——那时闸门本身已被智能体化,而不是被绕过 ● 里程碑:M12 试点域首次通过影子流量验收 / M24 半数业务域完成行为迁移
图 15 36 个月路线。三条设计原则:① 前置验证基建先于任何业务编码;② 试点必须是端到端的一条业务闭环(不是「一个技术模块」);③ 数据库替换与组织重构排在最后,且不做前置依赖。注意 M12 与 M24 两个里程碑都是「验收」而非「开工」——里程碑的定义方式决定团队是往前赶还是往钱花。

10.2 第一个 90 天:可直接执行的动作清单

第 1–30 天 · 摸清家底

  1. 导出并导入 Oracle 数据字典,产出表 / 字段 / 约束 / 索引 / 注释的全量清单
  2. 静态解析 508 个 mapper XML,产出 SQL 台账(语句数、动态分支数、引用表、Oracle 专有构造计数)
  3. 导出存储过程 / 触发器 / 序列清单与依赖关系
  4. 枚举对外接口、批处理作业、报表、导出的全量清单
  5. 盘下游消费者:谁在读你的库 / 调你的接口(这一步最容易漏,也最致命)
  6. 拉近 12 个月变更热点 + 生产事故清单,生成「风险—价值」四象限

第 31–60 天 · 选点与准备

  1. 基于四象限选定试点域(建议:价值高 + 耦合面小 + 可端到端闭环)
  2. 为 reed 五组件写首版平台语义规格(先写 grail 与 pigeon)
  3. 搭代码知识图谱 MVP:Java AST + mapper SQL 子图 + 调用图
  4. 把最痛的 20 个历史决策补成 ADR(只做高风险的,不求全)
  5. 为试点域写第一批特征测试(目标:锁定 10 条核心业务行为)
  6. 建立私有评测集:从自有仓库切最近 6–12 个月的提交,作为智能体能力的真实标尺

第 61–90 天 · 首个闭环验证

  1. 把验证环境改造成可编程调用(Harness 五项改造)
  2. 对试点域的一条业务闭环做 PERS 建模,产出首个 Golden Set
  3. 把这一条闭环用新架构重写(只做这一条,不扩范围)
  4. 搭最小影子流量链路,在真实流量下比对
  5. 产出第一份差异报告,跑完 L1–L4 分级流程
  6. 复盘并向管理层汇报「AI 独立完成占比」与「L1/L2 差异率」

90 天结束时的成功标准

不是「写完了多少代码」,而是三件事:
① 事实清单完整——你知道系统有多少接口、多少表、多少下游;
② 一条业务闭环的 PERS 等价性被证据证明——不是「跑通了」,而是「差异率为零且证据可查」;
③ 验证成本显著下降——从「2–3 小时一次」降到「分钟级一次」。

这三条达成,才支持你向管理层申请扩大投入。任何一条没达成,都不应该进入第二阶段——这不是保守,这是把失败成本锁在 90 天以内。

10.3 成熟度阶梯:你的目标不是一步到位

L5 · 自演化 行为等价性可持续证明 技术债有自动清偿回路 人只守判断力 判定:新增需求可以 在旧系统退役后正常交付 L4 · 可授权 窄域智能体带闸门 自治;人设闸门 判定:AI 独立完成 占比持续提升 且事故率不升 L3 · 可验证 Golden Set + 影子 流量 + 差分归零 判定:L1/L2 差异 为零且证据可查 L2 · 可读 知识图谱 + 决策 日志 + 特征测试 判定:新人能独立 理解一个中型模块 L1 · 无序 无测试,靠人,改动靠勇气 ← 你当前的起点 每一级都有明确的、可测量的进入标准。不要跳级——L4 的授权若无 L3 的验证网兜底,必然出事故。
图 16 能力成熟度五级。注意每一级的「判定」一栏都是可观测的事实,而不是主观评价。这套划分的实用价值在于:它让「我们做到哪一步了」这个问题有了不含糊的答案,也让你能在任何一级安全地停下来——包括停在 L2。

11反模式清单:十五条会让你翻车的做法

建议把这一章单独打印贴出来。每一条都来自公开案例中的真实失败,而不是理论推演。

11.1 战略层(4 条)

反模式症状修正
① 范围膨胀 从「替换合同模块」变成「顺便重做权限、重做界面、上微服务、换数据库」。范围先翻倍、再翻三倍。 锁定功能对等。新需求一律排到迁移完成之后。任何在迁移期加进来的「新想法」都要走独立的、被否决权覆盖的审批。
② 大爆炸切换 单一切换日,所有风险(技术、运营、组织)压在同一天。没有部分回滚,只有 go-live 与事后复盘。 改走绞杀者 + 可回滚切片。每一片在并行运行窗口内验证,出问题回滚是路由切换而非数据修复。
③ 双高风险绑定 应用重构与数据库替换同时推进。出错无法归因,回滚没有干净边界。 解耦。第一阶段新系统继续用 Oracle(见 07 章)。数据库替换独立立项、独立排期。
④ KPI 选错 用「AI 生成代码占比」作为项目健康度指标。数字漂亮,实际瓶颈毫无改善。 改用AI 独立完成占比 + L1/L2 差异率 + 验证反馈时延三个指标(见 8.4)。
表 9 战略层反模式。这四条的共同点是在错误的层面上做优化——优化范围、优化切换方式、优化指标,唯独没有优化那块真正卡住进度的瓶颈。

11.2 工程层(7 条)

反模式症状修正
⑤ 让 AI 通读后重写 「把整个仓库喂给模型,让它产出新系统」。上下文装不下、无法归因、无法回滚、无人能审。 拆成窄域智能体网络,每个只压缩一处瓶颈,且必须窄 / 可评测 / 可回滚(见 8.1)。
⑥ 用 LLM 做机械转换 把本该用 recipe 完成的 API 替换、依赖升级交给 LLM 逐文件处理。成本高、结果不可复现。 确定性优先:OpenRewrite 类 recipe 打底,LLM 只处理需要判断的部分(见 5.4)。
⑦ 迁移期顺手修 bug 发现老系统一个 13 年的错误行为,顺手「修好了」。业务侧随之上报严重回归。 L4 差异原样复制,纳入待修复清单单独排期。迁移期同时引入两个变化会让差异归因失效(见 6.5)。
⑧ 用覆盖率当验证证据 「生成用例全 PASS,覆盖率 85%」,但目标业务分支从未被执行——假覆盖。 校验实际执行路径,而非只看返回值。要求验证环境输出「实际路径 vs 期望路径」(见 6.3 / 表 7)。
⑨ 期望值来自 AI 推理 让 AI「看着代码推出预期返回值」,然后以此为测试基线。记录的是 AI 的理解,不是系统行为。 所有期望值必须来自实际执行。生产日志是最佳样本来源——真实、且天然包含边缘场景。
⑩ 只分析一轨 只做 Java 侧分析,漏掉 508 个 mapper 的动态 SQL 分支与存储过程里的业务规则。 三轨全覆盖:Java / mapper XML / 数据库对象。任何单轨分析都会漏行为(见 图 4)。
⑪ 忽视下游消费者 新系统行为「正确地」变了,但某个没人记录的下游系统被打破。这被行业统计列为现代化项目超支的首要原因。 开工前完成下游消费者清单,由业务与运维双向签字(见 3.4)。契约变更走兼容层,不直接破坏。
表 10 工程层反模式。⑤–⑪ 条指向同一件事:把「理解系统」和「验证行为」当成了可以压缩的成本。而在 13 年的遗留系统里,这两项恰恰是不可压缩的——它们就是项目本身。

11.3 治理层(4 条)

反模式症状修正
⑫ 责任委员会化 设「现代化推进委员会」,重大决策集体表决。结果是无人对节奏负责,决策周期超过迭代周期。 单一责任人对整体节奏负责,委员会只做咨询(见 表 8)。
⑬ 文档无主 知识图谱建得很漂亮,三个月后无人更新,检索质量崩塌,团队重新回去问老兵。 设知识守门人角色,并给它门禁权:无 ADR 的重构 PR 不允许合入。
⑭ 敏感数据外流 把 oracle.dmp 或含真实合同 / 金额的样本传给外部大模型服务做分析。 建可重复的脱敏管道:结构保留、值替换、分布保持。只传结构与合成样本(见 9.2)。
⑮ 一次给足权限 直接让智能体持有写权限与发布权限,跳过渐进授权。一次幻觉冻住整条发布线。 四阶段渐进授权,默认只读,逐级开放,永不绕过既有闸门(见 图 12)。
表 11 治理层反模式。⑫–⑮ 的共同后果是问题无法被归因:责任不清则无法追责,文档无主则无法判断对错,权限过宽则无法定位来源,数据外流则无法审计。归因能力丧失,整个项目就失去了自我修正的回路。

这十五条的共同结构

拆开看,它们其实是三类错误的变体:① 把「理解系统」这件慢活当成可以跳过的前置工作;② 把「验证」当成交付后的动作而不是交付的前提;③ 用好看的过程指标替代真实的能力指标。

换句话说——所有这些坑的共同解法,都可以归结为本报告第 02 章那一句话:不要优化「写代码」这条最快已经很快的路径,去把那些又慢又贵的路径变便宜。

12结论与判断

12.1 六条明确判断

以下标注为「观点」的部分是我的判断,不是行业共识,请按此权重理解。

判断一 · 不要让「重写」成为立项词 观点

立项文件里出现「重写」二字,就会不断吸引范围膨胀。把它写成「行为迁移」或「渐进现代化」,不只是措辞——它会改变团队对「完成」的定义。

判断二 · 第零步是唯一不可压缩的环节 强观点

如果预算只够做一件事,做知识图谱 + 平台语义规格。它本身就能立刻降低新人上手成本、降低变更风险、减少对特定人员的依赖——即使后续不再推进重构,它也是净收益。

判断三 · 数据库先不动 强观点

除非有硬性合规要求,第一阶段保留 Oracle。把两个高风险变量解耦,是把项目从「乘法风险」降成「加法风险」的唯一操作。这一条能显著提高项目存活率。

判断四 · 试点要选「能端到端闭环」的,不是「技术最干净的」 观点

试点的目的不是验证技术可行性,而是验证整套方法(提取 → 重建 → 差分 → 切流)能不能走通。一个技术简单但走不通全链路的试点,几乎没有价值。

判断五 · 模块化单体优于微服务 观点

在团队尚不具备成熟 SRE 与可观测体系时,微服务的运维复杂度会吃掉全部收益(行业成功率仅约 40%)。先做模块化单体,看清真实边界,再让「是否拆服务」由真实压力而非趋势决定。

判断六 · 停在 L2 也是一个可接受的结局 观点

如果第零步做完,你已经有知识图谱、决策日志、特征测试网——即使不继续重构,这套资产的收益也是实在的。把第零步当作一个可以独立收口的成果,反而更容易推动它获得预算。

12.2 如果你只记住三句话

① 别从「让 AI 写代码」开始,从「让 AI 读懂你 13 年的代码」开始。 前者是给马车换更大的引擎,而引擎本来就不是瓶颈。(阿姆达尔定律:P 只有 0.25 时,加速上限 1.33×) ② 目标不是「迁移代码」,是「迁移行为」,而且要能把这件事证明出来。 验收标准是 PERS 层面的等价性证据,不是编译通过,也不是覆盖率上升。 ③ 把「验证」变便宜,比把「写代码」变快重要一个量级。 第零步与 Harness 建设占总投入的一半以上,因为它们是 P 的上限。
图 17 全报告的浓缩。这三句话分别对应第 02 章(为什么)、第 06 章(做什么)与第 04 / 08 章(先做什么)。

12.3 参考来源

按证据类型分组。浏览本报告时请对照正文里的证据标注理解每个数字的可信度:一手研究 > 行业调查 > 单一案例 > 厂商自报 > 建模。

一手研究与学术论文

  1. Ziftci, C., Nikolov, S., Sjövall, A., Kim, B., Codecasa, D., Kim, M. Migrating Code At Scale With LLMs At Google. FSE Companion '25, pp. 162–173.(arXiv:2504.09691)— 39 项迁移、595 个变更、93 574 次编辑,74.45% 变更与 69.46% 编辑由 LLM 生成;总耗时降约 50%。
  2. Jimenez, C. E. et al. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ICLR 2024;及其 Verified / Pro 变体(SWE-bench Pro 由 Scale AI 构建)。
  3. METR. Measuring AI Ability to Complete Long Tasks(arXiv:2503.14499)— 前沿智能体可自主完成的任务时长约每 7 个月翻倍。
  4. Beyond Vector Similarity: Hierarchical Context-Aware Graph RAG vs Standard RAG in Enterprise Code Migration(arXiv:2609.12464)— API 幻觉率 56.4% → 16.2%,依赖解析质量 34.8% → 65.9%。
  5. Ulrich, W. & Newcomb, P. From COBOL to Business Rules — Extracting Business Rules from Legacy Code. — 源码中约 20–30% 与业务规则相关;IRS 重写项目损失约 30 亿美元,根因是业务知识流失。
  6. Feathers, M. Working Effectively with Legacy Code. Prentice Hall, 2004. — 特征测试(Characterization Test)与接缝(Seam)概念的原始出处。

行业调查与基准统计

  1. NextGen Coding Company. Legacy Modernization Benchmark 2026. — 大爆炸重写超支/取消率 76%,增量迁移 28%;中位成本与周期对比。
  2. Standish Group CHAOS Report(转引)— 大型项目成功率低于 10%;31% 的 IT 项目在交付任何功能前被取消。
  3. DX(Developer Experience)开发者报告与 2025 DORA 报告(转引)— 约 90% 开发者使用 AI、80% 自认提效,但真正合入主干的 AI 代码约 22%。
  4. Presenc AI. Coding Agent Benchmarks 2026 / cowork.ink SWE-bench Explained / genalphai SWE-bench Pro vs Verified — 生产环境真实 PR 采纳率约 35–50%;Senior SWE-Bench 高质量解率约 24%。

云厂商与咨询机构方法论

  1. Microsoft Azure Architecture Center. Strangler Fig 模式(含数据库绞杀三阶段图示与回滚窗口说明)。
  2. AWS Prescriptive Guidance. Strangler fig pattern(Transform / Coexist / Eliminate 三阶段)。
  3. AWS Documentation. Oracle database schema conversion — AWS SCT 完整转换 90%+ 数据库代码,剩余不到 10% 需人工。
  4. AWS DevOps Blog. Amazon Q Developer just reached a $260 million dollar milestone — 数万个生产应用 Java 8/11 → 17,节省 4 500 开发年,2.6 亿美元年度成本节省;单应用从约 50 天降至数小时(厂商自报)。
  5. Huawei. Cloud-Native Meets AI-Native: Huawei Empowers Banks to Build a Resilient Core(2026)— CodeArts 编码智能体平台支撑主机下移,交付效率提升约 50%(厂商自报)。
  6. Thoughtworks. Technology Radar Vol. 33 / Vol. 34(2025 / 2026)— Vol.33 指出生成式 AI 在理解遗留代码库上的成功应用与 AI 反模式;Vol.34 提出「认知债」与「给编码智能体上缰绳」(spec-driven development、mutation testing)。
  7. Infosys. Modernizing enterprises: The power of generative AI in code migration — 航空与能源行业案例;八条大规模使用生成式 AI 的建议,含「用规则驱动的确定性与生成式 AI 互补」。
  8. Techment / Sphere / Coderio / 10Pearls / Dextralabs 等 2026 年企业现代化指南(用于交叉印证趋势判断,非一手数据来源)。

工程实践与一线案例

  1. 蒋宇(蚂蚁集团 / 支付宝). 60 万行巨石应用 AI 重构的可验证交付工程. QCon 上海。「Vibe Coding 时代的新质量债」专题。本报告第 06 章主要参照:PERS 建模、Case-Forge 路径压缩、Bubble 回放、Golden Set、影子流量四坑、验证成功率约 60% 与单次验证 2–3 小时。
  2. OpenCurve. 当 AI Coding 撞上巨型遗留软件 —— 屎山代码全生命周期 AI Agent 体系的落地路线图. 墨天轮, 2026-07。本报告第 08 章四阶段授权模型与第 02 章阿姆达尔定律框架的主要参照;含 Meta 4 100+ 遗留任务中 AI 独立可解约 5%、Google 新代码 AI 生成占比 25%→75%、Microsoft 2030 年 C/C++ 现代化目标等数据(多为转引)。
  3. Synapse Studios. Characterization Testing(对 Feathers、Fowler、Bache、Cartwright/Horn/Lewis《Patterns of Legacy Displacement》的综合)。
  4. BPM Institute. Mining Rules From Code: Plan It Well / Extracting Business Rules from Legacy Systems — 业务规则挖掘的六步项目规划法。
  5. Google Cloud. Mainframe Assessment Tool — Extract business rules — 用 Gemini 智能体把遗留代码逻辑提取为 Gherkin 格式业务规则与可读规格(Objective / Functional Requirements / User Journeys / Glossary)。
  6. Pretius. Escaping the Oracle ecosystem: Migrating Oracle Forms to PostgreSQL — Oracle→PostgreSQL 工具对比表与 SQL 构造转换清单(CONNECT BY / ROWNUM / NVL / DECODE / ROWID / (+) 外连接 / SYNONYM)。
  7. Ispirer / labhub / knowledgelib 的 Oracle→PostgreSQL 2026 迁移指南 — PL/SQL 包需重构为 schema、包级变量需重新设计为会话状态、空串与 NULL 语义差异、事务边界差异。
  8. 华为河图 / 金仓 / CSDN 社区关于央国企 Oracle 国产化替代的实践记录 — 1 200 余处语法差异、双写运行三个月、深层特性依赖(统计信息收集机制)导致查询计划抖动。
  9. 关于流量镜像与差分验证的工程记录(Istio 流量镜像实践、模型网关影子对比实践)— 异步 fire-and-forget、全量镜像优于抽样、按业务标签拆分差异统计的关键性。

工具链

  1. OpenRewrite / Moderne — Spring Boot 版本升级 recipe 链(UpgradeSpringBoot_3_0 至 _4_0)、MigrateToJakartaEE10 等确定性转换。
  2. ora2pg — 开源 Oracle→PostgreSQL 转换,含迁移成本评分(Simple / Medium / Complex)的评估报告。
  3. AWS SCT / DMS Schema Conversion / DMS — schema 转换 + 全量装载 + CDC 一体化。
  4. Tree-sitter + 图数据库(Memgraph / Spanner Property Graph / SQLite 图) — 构建代码知识图谱的通用技术栈;公开基准显示可支撑千万行级仓库的秒级结构查询。
  5. Istio / Envoy 流量镜像、approvaltests / Verify 系列、Testcontainers — 影子流量与特征测试的落地工具。

关于本报告数据可信度的说明

报告中的数字来自四类不同可靠度的来源,请分级理解:
① 一手研究(Google FSE 论文、SWE-bench、METR)——方法公开、可复核,可信度高,但样本多来自特定组织环境,外推需谨慎。
② 行业统计(CHAOS、现代化基准报告)——方向性参考价值高,但各机构口径不一,绝对值不可直接比较(例如「失败率 70%」中的「失败」可能指超支、延期或被静默取消)。
③ 单一案例(蚂蚁 QCon 分享、COBOL 迁移实测)——细节丰富、极具参考价值,但 n=1,不能当作普遍规律。
④ 厂商自报(AWS、华为、国产数据库厂商的 ROI 数字)——请按显著折扣理解,它们的主要价值在于证明「这件事有人做成了」,而不是证明「你能获得同样收益」。

本报告对你系统的一切具体建议(尤其是第 03、04、07 章),都建立在「未经验证的项目事实」之上——它们需要在第 10 章的前 30 天里被验证或推翻。