代码审查,你真的审对了吗?
一个成熟的团队,每天至少有30%的时间花在Code Review上。
你打开一个PR,看到500行改动,从第一行开始逐行看。看到第80行的时候,脑子已经开始模糊了。漏掉一个空指针异常,漏掉一个SQL注入点——这些都是日常发生的。
AI能帮你在30秒内完成一个人需要30分钟的审查工作。不是替代你,而是让你把精力放在真正重要的架构和设计问题上。
为什么AI适合做代码审查
代码审查有几类固定模式,这正是AI擅长的:
- 安全漏洞检测:硬编码密钥、SQL注入、XSS攻击点——这些规则AI比人记得牢
- 代码规范检查:变量命名、函数长度、重复代码——AI不会疲劳
- 性能问题识别:N+1查询、不必要的循环、内存泄漏风险——AI能全局扫描
- 逻辑错误发现:边界条件遗漏、异常处理缺失——AI能跑思维链推理
人工审查的优势在于理解业务上下文。AI的优势在于不知疲倦地检查每一行代码。两者结合,效果最好。
实战一:用ChatGPT审查Python代码
最简单的方式是直接粘贴代码。但这样效率太低。更好的做法是用结构化提示词。
你是一个资深Python工程师,请审查以下代码:
1. 找出所有潜在的安全漏洞
2. 检查是否有性能问题
3. 评估代码是否符合PEP 8规范
4. 指出缺少异常处理的场景
只列出具体问题,不要重写代码。每条问题标注严重程度(高/中/低)。
[粘贴你的代码]
这个提示词的关键在于限定输出格式。你不需要AI给你重写代码,你需要的是它告诉你哪里有问题。
实际效果如何?我用这段有问题的代码做了测试:
import sqlite3
def get_user(username, password):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
cursor.execute(query)
result = cursor.fetchone()
return result
ChatGPT给出的审查结果:
- 高危:SQL注入。使用了f-string拼接SQL语句,应该用参数化查询
- 中危:密码明文存储和传输。应该用bcrypt哈希比对
- 中危:数据库连接未关闭。应该用上下文管理器或finally块
- 低危:函数没有类型注解。建议添加参数和返回值类型
三条高危问题,你人工看可能需要5分钟,AI只要3秒。
实战二:用Claude审查前端React代码
Claude在处理前端代码时有两个优势:理解组件生命周期,以及分析渲染性能问题。
你是一个React专家。请审查以下组件代码:
1. 检查是否有不必要的重渲染
2. 找出useEffect依赖项是否正确
3. 评估状态管理是否合理
4. 检查事件处理器是否正确绑定
[粘贴代码]
比如这段代码:
function TodoList({ todos }) {
const [filter, setFilter] = useState('all');
const filteredTodos = todos.filter(todo => {
if (filter === 'active') return !todo.done;
if (filter === 'done') return todo.done;
return true;
});
return (
<div>
<select onChange={e => setFilter(e.target.value)}>
<option value="all">全部</option>
<option value="active">未完成</option>
<option value="done">已完成</option>
</select>
{filteredTodos.map(todo => (
<TodoItem key={todo.id} todo={todo} />
))}
</div>
);
}
Claude会指出:
filteredTodos在每次渲染时都会重新计算,如果todos数据量大,应该用useMemo包裹TodoItem组件没有接收done属性作为props,如果需要在子组件做样式区分会有问题- 没有对
todos做空值处理,传入undefined时会报错
实战三:在GitHub Actions中自动化代码审查
手动把代码贴给AI聊天的方式适合个人项目。团队协作需要更自动化的方案。
用GitHub Actions + OpenAI API,可以在PR提交时自动触发审查:
name: AI Code Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get PR diff
id: diff
run: |
git fetch origin pull/${{ github.event.pull_request.number }}/head:pr-branch
git diff origin/main...pr-branch > pr.diff
- name: AI Review
run: |
curl -X POST https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer ${{ secrets.OPENAI_API_KEY }}" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "You are a senior code reviewer."
},
{
"role": "user",
"content": "Review this diff:\n$(cat pr.diff)"
}
]
}'
这个方案的核心思路是:获取PR的diff,发送给AI模型,把结果自动评论在PR上。
更成熟的方案可以用现成的工具,比如CodeRabbit、Codiumate、或者SonarQube的AI插件。它们不需要你自己写Actions脚本,配置API Key就能用。
代码审查的边界在哪里
AI能帮你发现80%的常见问题。剩下20%才是真正考验经验的部分:
- 业务逻辑正确性:AI不知道你的产品需求是什么
- 架构合理性:微服务拆分粒度、模块边界划分,需要全局视角
- 用户体验影响:改了个函数签名,可能让整个UI层都要跟着改
- 团队协作规范:你们团队的命名约定、文件组织方式,AI不一定知道
所以最好的做法是:让AI做第一轮快速扫描,标记出明显问题。然后你带着这些标记去做第二轮深度审查,关注AI看不到的部分。
不同语言的审查重点
| 语言 | 安全重点 | 性能重点 | 常见规范 |
|---|---|---|---|
| Python | SQL注入、敏感信息硬编码 | 循环内DB查询、未用生成器 | PEP 8、类型注解 |
| JavaScript | XSS攻击、eval使用 | 闭包内存泄漏、频繁重渲染 | ESLint、Airbnb规范 |
| Go | 并发安全(Goroutine泄漏) | 不必要的内存分配 | golint、gofmt |
| Java | 反序列化漏洞、弱加密 | 线程池配置、GC压力 | 阿里巴巴规范 |
| Rust | 所有权借用违规 | 不必要的clone、锁竞争 | clippy警告 |
总结
AI代码审查不是要取代人类Reviewer,而是让你从"找低级错误"的体力活中解放出来。
建议你从今天就开始尝试:挑一个正在进行的PR,把diff丢给AI看看。你会发现,很多你以为"肯定没问题"的代码,其实藏着不少坑。
你的团队现在是怎么做代码审查的?人工Review还是已经引入了AI辅助?欢迎在评论区聊聊你的经验。