晴天技术
AI6 min read

用 AI 做代码审查:效率提升 5 倍的实践

用 AI 做代码审查:效率提升 5 倍的实践

AI编程代码审查Claude最佳实践

代码审查是保证代码质量的关键环节,但人工审查耗时且容易遗漏。AI 可以作为第一轮审查,大幅提升效率。

为什么用 AI 做代码审查?

人工审查的痛点

  • 审查者时间有限,容易草率
  • 容易遗漏安全漏洞和边界情况
  • 不同审查者标准不一致
  • 大量 PR 积压

AI 审查的优势

  • 24/7 可用,即时响应
  • 能发现隐藏的 bug 和安全问题
  • 标准一致
  • 不会疲劳

如何用 AI 审查代码

方法 1:直接粘贴代码

审查以下 Java 代码,重点关注:
1. 空指针风险
2. 并发安全
3. SQL 注入
4. 性能问题
5. 代码规范

[粘贴代码]

方法 2:用 Claude Code

# 审查最近一次 commit
claude > 审查最近一次 git commit 的代码

# 审查特定文件
claude > 审查 src/service/OrderService.java

# 审查整个 PR
claude > 对比 main 分支和当前分支的改动,审查所有变更

方法 3:GitHub PR 集成

使用 Claude 的 GitHub 集成,在 PR 上自动评论:

# .github/workflows/ai-review.yml
name: AI Code Review
on: [pull_request]
jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}

审查 Prompt 模板

通用审查

审查这段代码,从以下角度:
1. 正确性:逻辑是否正确
2. 安全性:有无漏洞
3. 性能:有无瓶颈
4. 可维护性:代码是否清晰
5. 边界情况:是否处理了异常输入

对于每个发现,给出严重程度(高/中/低)和具体修复建议。

安全审查

对这段代码进行安全审查,重点检查:
1. SQL 注入
2. XSS 攻击
3. CSRF 防护
4. 敏感信息泄露
5. 权限校验缺失
6. 文件上传漏洞

给出 OWASP Top 10 相关的安全建议。

性能审查

审查这段代码的性能问题:
1. 数据库查询是否高效
2. 是否有 N+1 查询
3. 缓存使用是否合理
4. 是否有内存泄漏风险
5. 并发性能如何

给出具体的优化建议和代码示例。

Java 专项

审查这段 Java 代码,遵循以下规范:
- Google Java Style Guide
- SOLID 原则
- Spring Boot 最佳实践

重点关注:
1. 异常处理是否合理
2. 资源是否正确关闭
3. 线程安全
4. Optional 使用
5. Stream API 使用是否恰当

实际案例

案例 1:发现空指针风险

AI 输入:

public String getUserName(Long userId) {
    User user = userRepository.findById(userId);
    return user.getName();
}

AI 输出:

问题:高 - 空指针风险
findById 可能返回 null,直接调用 getName() 会 NPE。

修复:
public String getUserName(Long userId) {
    return userRepository.findById(userId)
        .map(User::getName)
        .orElse("Unknown");
}

案例 2:发现 SQL 注入

AI 输入:

public List<User> searchUsers(String keyword) {
    String sql = "SELECT * FROM users WHERE name LIKE '%" + keyword + "%'";
    return jdbcTemplate.query(sql, new UserRowMapper());
}

AI 输出:

问题:高 - SQL 注入
直接拼接用户输入到 SQL 中,存在注入风险。

修复:
public List<User> searchUsers(String keyword) {
    String sql = "SELECT * FROM users WHERE name LIKE ?";
    return jdbcTemplate.query(sql, new UserRowMapper(), "%" + keyword + "%");
}

案例 3:发现并发问题

AI 输入:

public void deductStock(Long productId, int quantity) {
    Product product = productRepository.findById(productId);
    if (product.getStock() >= quantity) {
        product.setStock(product.getStock() - quantity);
        productRepository.save(product);
    }
}

AI 输出:

问题:高 - 并发安全
非原子操作,高并发下可能超卖。

修复:使用乐观锁或悲观锁
@Lock(LockModeType.PESSIMISTIC_WRITE)
Product findByIdWithLock(Long id);

或使用 CAS:
@Modifying
@Query("UPDATE Product p SET p.stock = p.stock - :qty WHERE p.id = :id AND p.stock >= :qty")
int deductStock(Long id, int qty);

AI 审查的局限

  1. 不能替代人工审查:AI 是第一轮,人是最终审查
  2. 可能误报:AI 可能标记不是问题的代码
  3. 不了解业务:AI 不知道业务逻辑是否正确
  4. 不能运行代码:AI 只能静态分析

最佳实践

  1. AI 先审,人后审:AI 做第一轮过滤,人做最终决策
  2. 定制 Prompt:根据项目规范定制审查标准
  3. 持续优化:根据审查结果优化 Prompt
  4. 结合 CI/CD:集成到 PR 流程自动审查
  5. 记录常见问题:建立团队的代码审查清单

总结

AI 代码审查的价值:

  • 减少低级 bug:空指针、SQL 注入、资源泄漏
  • 提高审查效率:AI 过滤明显问题,人关注架构和业务
  • 统一标准:AI 审查标准一致
  • 加速 PR 合并:减少审查等待时间

AI 不替代审查者,但能让审查者专注于更重要的事情。