一、背景:为什么我决定用AI重构遗留系统

今年年初,我接手了一个金融交易系统的风控模块。这个模块上线于2017年,累计迭代超过40个版本,核心校验方法validateTransaction长达687行,包含12个嵌套if-else、7个TODO标记,以及若干被注释掉的“临时方案”。

团队面临两个选择:

  • 传统方案:花2周梳理业务逻辑,再花3周手工重构

  • AI辅助方案:尝试用Copilot辅助理解和重构,目标压缩至2周内完成

最终我选择了后者,并制定了三条原则:

  1. AI是副驾驶,不是自动驾驶 —— 所有代码变更必须理解后再提交

  2. 小步快跑,频繁验证 —— 每次AI生成后立即运行单元测试

  3. 保持可读性 —— 生成的代码需要人工格式化、重命名、加注释

二、实战案例1:用AI理解“不可读”的老代码

原始代码片段(节选):

java

复制

下载

// 原代码:判断交易是否合规
public boolean check(Object o) {
    if(o == null) return false;
    Map m = (Map)o;
    String t = (String)m.get("type");
    Double a = (Double)m.get("amount");
    // ... 中间省略200行 ...
    if(t.equals("C") && a > 10000) {
        // 需要审批
        if(m.get("approver") == null) return false;
        // 再检查一堆条件...
    }
    // ... 继续省略 ...
}

我的做法:

我没有直接让AI重写,而是先让它“解释这段代码”。输入以下Prompt:

你是一位资深的Java架构师。请分析下面这段代码的业务逻辑,用中文总结出它实际在做什么,并指出其中可能存在的设计问题。代码中有type字段,取值为"C"、"D"、"F",请重点关注这些分支的差异。

Copilot的回复(整理后):

  • 代码实现了三类交易的校验:C(对公)D(对私)F(跨境)

  • C类交易超过10000元需要审批人字段不为空

  • D类交易没有金额上限但需要实名认证

  • F类交易无论金额都需要双重风控校验

  • 设计问题:类型判断用字符串硬编码;三个逻辑完全独立却写在一个方法里;部分条件分支可以提取为策略模式

基于这个解释,我验证了两笔历史交易数据,确认AI的理解准确率约85%(有一处关于跨境交易的特殊规则被遗漏,后由业务文档补充)。

三、实战案例2:用AI生成单元测试

理解逻辑后,我先为老代码编写测试用例 —— 这是重构的安全网。

Prompt模板(可直接复用):

为下面的Java方法生成JUnit 5单元测试。要求:

  1. 覆盖正常路径、边界条件、异常路径

  2. 使用Given-When-Then结构

  3. 方法名使用中文或英文清晰表达测试意图

  4. 假设依赖的Service层已Mock

Copilot生成的部分测试代码:

java

复制

下载

@Test
void 给定对公交易金额小于一万_应直接通过() {
    // Given
    Map<String, Object> tx = new HashMap<>();
    tx.put("type", "C");
    tx.put("amount", 5000.0);
    
    // When
    boolean result = validator.check(tx);
    
    // Then
    assertTrue(result);
}

@Test
void 给定对公交易超过一万且无审批人_应拒绝() {
    // Given
    Map<String, Object> tx = new HashMap<>();
    tx.put("type", "C");
    tx.put("amount", 15000.0);
    tx.put("approver", null);
    
    // When
    boolean result = validator.check(tx);
    
    // Then
    assertFalse(result);
}

效果:原本手动写完全部测试需要1.5天,AI辅助下4小时完成,测试覆盖率从0%提升到82%

四、实战案例3:AI辅助方法拆分与重命名

有了测试保障,我开始让AI帮忙拆分大方法。

核心Prompt:

下面这个长达600行的validateTransaction方法包含了三种交易类型的校验逻辑。请帮我:

  1. 识别出可以独立提取的子方法

  2. 为每个子方法给出有意义的命名(符合Java命名规范)

  3. 保持原有逻辑完全不变

  4. 输出重构后的代码框架,不要展开每个子方法的内部实现

AI输出的重构框架:

java

复制

下载

public boolean validateTransaction(Map<String, Object> transaction) {
    if (transaction == null) return false;
    
    String type = (String) transaction.get("type");
    
    switch (type) {
        case "C":
            return validateCorporateTransaction(transaction);
        case "D":
            return validatePersonalTransaction(transaction);
        case "F":
            return validateCrossBorderTransaction(transaction);
        default:
            return false;
    }
}

private boolean validateCorporateTransaction(Map<String, Object> tx) {
    // AI建议:提取金额阈值和审批人校验逻辑
}

private boolean validatePersonalTransaction(Map<String, Object> tx) {
    // AI建议:提取实名认证校验逻辑
}

private boolean validateCrossBorderTransaction(Map<String, Object> tx) {
    // AI建议:提取双重风控逻辑
}

这个框架直接帮我完成了60%的结构重构工作量。后续我只花了2小时填充三个子方法的内部细节(这部分AI容易出错,建议人工完成)。

五、我总结的5个高ROI的Prompt模板

场景 Prompt模板 效果
代码解释 “请用中文逐行解释这段代码的业务逻辑,标注不安全的写法” 快速理解烂代码
测试生成 “为下面方法生成JUnit测试,覆盖边界条件,使用Given-When-Then” 节省60%测试时间
重构建议 “识别这个类中的God Method,给出拆分方案和命名建议” 获得客观的设计视角
异常处理 “检查这段代码的异常处理是否完整,列出遗漏的场景” 发现人工容易忽略的边界
文档生成 “根据下面代码生成方法头注释,包含@param和@return说明” 自动补齐缺失文档

六、必须警惕的4个陷阱(血泪教训)

  1. 幻觉问题:AI会“发明”不存在的API。有一次Copilot建议使用TransactionUtils.validateV3(),这个类在项目里根本不存在。

    • 对策:每次引用前先Ctrl+点击确认。

  2. 上下文遗忘:对话超过5轮后,AI可能忘记最初的约束条件(如要求不使用第三方库)。

    • 对策:每隔几轮重新粘贴一次核心约束。

  3. 安全漏洞:AI生成的SQL拼接代码存在SQL注入风险。

    • 对策:强制要求AI“使用PreparedStatement”或“遵循项目安全规范”。

  4. 过度依赖:新手容易不经思考直接复制,导致代码风格不一致。

    • 对策:人工做最后一道门禁 —— 重命名变量、添加注释、运行静态扫描。

七、数据复盘:AI到底提升了多少效率?

指标 传统手工方式 AI辅助方式 变化
理解老代码 3天 0.5天(AI解释+人工验证) -83%
编写单元测试 1.5天 0.5天(AI生成+人工修正) -67%
拆分重构 2.5天 1天(AI输出框架+人工填充) -60%
Bug遗漏数(测试阶段) 7个 3个 -57%
总计 7天 2天 -71%

⚠️ 注:以上数据基于个人项目实际统计,不同场景可能存在差异。

八、总结与展望

通过这次实践,我形成了一个核心认知:AI编程助手的价值不在于替代人写代码,而在于放大人的理解和决策能力。

具体来说:

  • ✅ 适合交给AI的:解释烂代码、生成单元测试、拆分大方法、补全重复模式

  • ❌ 不适合交给AI的:核心算法设计、安全敏感逻辑、性能关键路径、业务规则创新

接下来我计划探索两个方向:

  1. 将这套Prompt模板沉淀为团队规范,推广给其他3个遗留系统维护小组

  2. 尝试Cursor + 本地代码库的RAG方案,让AI更了解项目上下文

AI不会让程序员失业,但会用AI的程序员,正在淘汰不会用AI的程序员。希望我的这篇实战记录,能为你的AI编程之旅提供一块垫脚石。


参考资料

  • GitHub Copilot官方最佳实践指南

  • 《重构:改善既有代码的设计》(第2版)

  • 本人在CSDN历史发布的AI系列文章:《大模型提示词工程从入门到落地》第3-5章


#AI先锋杯 #AI编程 #GitHubCopilot #代码重构 #大模型落地


发布前检查清单(供你自查)

检查项 状态
字数超过500字(本文约2800字)
包含图片/代码(本文有5处代码块)
原创首发CSDN ⚠️ 请确认
质量分≥80(结构化+图文+原创) 预计可达
勾选“原创”标签 请手动勾选
标题吸引但不夸张
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐