实战案例:代码审查 Skill
通过一个完整的案例,学习如何从需求到实现构建一个实用的代码审查 Skill。
需求分析
场景
作为团队的技术负责人,你需要:
- 审查团队成员提交的代码
- 确保代码质量和安全性
- 提供可操作的改进建议
- 统一团队的代码审查标准
痛点
人工审查的问题:
- 耗时长(每个 PR 需要 30-60 分钟)
- 标准不统一(不同审查者关注点不同)
- 容易遗漏(人脑会疲劳)
- 知识难沉淀(审查经验无法复用)
现有工具的问题:
- 静态分析工具只关注语法
- 无法根据项目上下文调整
- 输出难以理解(太多误报)
目标
创建一个 review-code Skill,能够:
- 自动分析代码,发现潜在问题
- 根据项目规范调整审查标准
- 提供具体、可操作的改进建议
- 支持多种语言和框架
设计 Skill
Step 1:确定名称和描述
json
{
"name": "review-code",
"description": "审查代码,检查安全漏洞、性能问题和最佳实践,提供具体修复建议"
}Step 2:设计 Prompt
根据需求,Prompt 需要覆盖:
- 安全审查
- 性能审查
- 代码质量
- 最佳实践
请审查以下代码:
上下文信息:
- 编程语言:{{language}}
- 框架:{{framework}}
- 项目类型:{{projectType}}
请从以下维度进行审查:
## 1. 安全审查 🔒
检查以下安全问题:
- SQL 注入
- XSS(跨站脚本攻击)
- CSRF(跨站请求伪造)
- 敏感信息泄露
- 不安全的依赖
- 权限控制问题
对于每个安全问题:
- 问题描述
- 风险等级(🔴 高危 / 🟡 中危 / 🟢 低危)
- 修复建议(包含代码示例)
## 2. 性能审查 ⚡
检查以下性能问题:
- 时间复杂度过高
- 不必要的计算
- 内存泄漏
- 资源未释放
- N+1 查询问题
- 阻塞操作
对于每个性能问题:
- 问题描述
- 影响程度
- 优化建议(包含代码示例)
## 3. 代码质量 📐
检查以下代码质量问题:
- 命名规范
- 函数长度(超过 50 行警告)
- 圈复杂度(超过 10 警告)
- 重复代码
- 死代码
- 魔法数字
## 4. 最佳实践 ✅
检查是否符合以下最佳实践:
- 错误处理
- 日志记录
- 输入验证
- 注释规范
- 测试覆盖
- 文档完整
## 5. 总结
- 主要问题列表
- 优先级排序
- 修复建议总结
审查标准:
- 对于明显问题:必须修复
- 对于潜在问题:建议修复
- 对于改进建议:可选Step 3:设计示例
示例 1:简单的安全问题
json
{
"input": "function getUser(id) {\n const query = \"SELECT * FROM users WHERE id = \" + id;\n return db.query(query);\n}",
"output": "## 1. 安全审查 🔒\n\n### 🔴 高危:SQL 注入\n- **位置**:第 2 行\n- **问题**:直接拼接 SQL 语句,存在 SQL 注入风险\n- **风险**:攻击者可以执行任意 SQL 命令,可能导致数据泄露或损坏\n- **修复建议**:\n```javascript\nfunction getUser(id) {\n const query = \"SELECT * FROM users WHERE id = ?\";\n return db.query(query, [id]);\n}\n```\n\n## 2. 性能审查 ⚡\n- 无明显性能问题\n\n## 3. 代码质量 📐\n- 函数名清晰\n- 函数长度合适(2 行)\n\n## 4. 最佳实践 ✅\n- ⚠️ 缺少错误处理\n- 建议添加 try-catch 块处理数据库错误\n\n## 5. 总结\n- 🔴 必须修复:SQL 注入\n- 🟡 建议修复:添加错误处理"
}示例 2:性能问题
json
{
"input": "function findDuplicates(arr) {\n const duplicates = [];\n for (let i = 0; i < arr.length; i++) {\n for (let j = i + 1; j < arr.length; j++) {\n if (arr[i] === arr[j] && !duplicates.includes(arr[i])) {\n duplicates.push(arr[i]);\n }\n }\n }\n return duplicates;\n}",
"output": "## 1. 安全审查 🔒\n- 无明显安全问题\n\n## 2. 性能审查 ⚡\n\n### 🔴 严重性能问题\n- **时间复杂度**:O(n³)\n - 双重循环:O(n²)\n - includes 检查:O(n)\n - 总计:O(n³)\n- **问题**:对于大数据集会非常慢\n- **优化建议**:使用 Set 优化\n```javascript\nfunction findDuplicates(arr) {\n const seen = new Set();\n const duplicates = new Set();\n \n for (const item of arr) {\n if (seen.has(item)) {\n duplicates.add(item);\n } else {\n seen.add(item);\n }\n }\n \n return Array.from(duplicates);\n}\n```\n优化后时间复杂度:O(n)\n\n## 3. 代码质量 📐\n- 函数名清晰\n- 变量命名合理\n\n## 4. 最佳实践 ✅\n- ✅ 有返回值\n- ⚠️ 缺少输入验证(检查 arr 是否为数组)\n\n## 5. 总结\n- 🔴 必须修复:性能问题(O(n³) → O(n))"
}完整实现
json
{
"name": "review-code",
"description": "审查代码,检查安全漏洞、性能问题和最佳实践,提供具体修复建议",
"prompt": "请审查以下代码:\n\n```\n{{code}}\n```\n\n上下文信息:\n- 编程语言:{{language || '未知'}}\n- 框架:{{framework || '未知'}}\n- 项目类型:{{projectType || '通用'}}\n\n请从以下维度进行审查:\n\n## 1. 安全审查 🔒\n检查以下安全问题:\n- SQL 注入(直接拼接 SQL)\n- XSS(未转义的输出)\n- CSRF(缺少防护)\n- 敏感信息泄露(硬编码密钥、密码)\n- 不安全的依赖(已知漏洞的库)\n- 权限控制问题(越权访问)\n\n对于每个发现的问题:\n- 问题描述\n- 风险等级(🔴 高危 / 🟡 中危 / 🟢 低危)\n- 具体位置\n- 修复建议(包含代码示例)\n\n## 2. 性能审查 ⚡\n检查以下性能问题:\n- 时间复杂度过高(如嵌套循环)\n- 空间复杂度过高(如大量内存占用)\n- 不必要的计算\n- 资源未释放(文件、连接等)\n- N+1 查询问题\n- 阻塞操作\n\n对于每个发现的问题:\n- 问题描述\n- 复杂度分析(大 O 表示法)\n- 优化建议(包含代码示例)\n\n## 3. 代码质量 📐\n检查以下代码质量问题:\n- 命名规范(是否清晰、一致)\n- 函数长度(超过 50 行建议拆分)\n- 圈复杂度(超过 10 建议重构)\n- 重复代码(DRY 原则)\n- 死代码(未使用的变量/函数)\n- 魔法数字(应使用常量)\n\n## 4. 最佳实践 ✅\n检查是否符合以下最佳实践:\n- 错误处理(try-catch、错误返回)\n- 日志记录(适当的日志级别)\n- 输入验证(参数检查)\n- 类型安全(类型注解或检查)\n- 注释规范(必要的注释)\n- 测试覆盖(可测试性)\n\n## 5. 总结与建议\n- 主要问题列表(按优先级排序)\n- 必须修复的问题(🔴)\n- 建议修复的问题(🟡)\n- 可选改进(🟢)\n- 整体评价\n\n审查原则:\n- 🔴 必须修复:安全漏洞、严重性能问题、明显错误\n- 🟡 建议修复:代码质量问题、缺少最佳实践\n- 🟢 可选改进:风格问题、轻微优化",
"examples": [
{
"input": "function getUser(id) {\n const query = \"SELECT * FROM users WHERE id = \" + id;\n return db.query(query);\n}",
"output": "## 1. 安全审查 🔒\n\n### 🔴 高危:SQL 注入\n- **位置**:第 2 行\n- **问题**:直接拼接 SQL 语句,存在 SQL 注入风险\n- **风险**:攻击者可以执行任意 SQL 命令\n- **修复**:\n```javascript\nfunction getUser(id) {\n const query = \"SELECT * FROM users WHERE id = ?\";\n return db.query(query, [id]);\n}\n```\n\n## 2. 性能审查 ⚡\n- 无明显性能问题\n\n## 3. 代码质量 📐\n- ✅ 函数名清晰\n- ✅ 函数长度合适\n\n## 4. 最佳实践 ✅\n- ⚠️ 缺少错误处理\n- 建议添加 try-catch\n\n## 5. 总结与建议\n- 🔴 必须修复:SQL 注入(安全漏洞)\n- 🟡 建议修复:添加错误处理"
},
{
"input": "function findDuplicates(arr) {\n const duplicates = [];\n for (let i = 0; i < arr.length; i++) {\n for (let j = i + 1; j < arr.length; j++) {\n if (arr[i] === arr[j] && !duplicates.includes(arr[i])) {\n duplicates.push(arr[i]);\n }\n }\n }\n return duplicates;\n}",
"output": "## 1. 安全审查 🔒\n- ✅ 无明显安全问题\n\n## 2. 性能审查 ⚡\n\n### 🔴 严重性能问题\n- **时间复杂度**:O(n³)\n - 双重循环:O(n²)\n - includes 检查:O(n)\n- **优化**:使用 Set\n```javascript\nfunction findDuplicates(arr) {\n const seen = new Set();\n const duplicates = new Set();\n for (const item of arr) {\n if (seen.has(item)) duplicates.add(item);\n else seen.add(item);\n }\n return Array.from(duplicates);\n}\n```\n优化后:O(n)\n\n## 3. 代码质量 📐\n- ✅ 命名清晰\n\n## 4. 最佳实践 ✅\n- ⚠️ 缺少输入验证\n\n## 5. 总结与建议\n- 🔴 必须修复:性能问题(O(n³) → O(n))"
}
]
}使用示例
使用方式
用户: /review-code
function processPayment(userId, amount) {
const user = db.query("SELECT * FROM users WHERE id = " + userId);
if (user.balance >= amount) {
db.query("UPDATE users SET balance = balance - " + amount + " WHERE id = " + userId);
return { success: true };
}
return { success: false };
}
语言:JavaScript
框架:Express
AI: ## 1. 安全审查 🔒
### 🔴 高危:SQL 注入(多处)
- **位置**:第 2 行、第 4 行
- **问题**:多处直接拼接 SQL
- **修复**:使用参数化查询
### 🔴 高危:并发问题
- **问题**:没有事务处理,可能出现竞态条件
- **修复**:使用数据库事务
## 2. 性能审查 ⚡
- 无明显性能问题
## 3. 代码质量 📐
- 函数较长(8 行)
## 4. 最佳实践 ✅
- 缺少错误处理
- 缺少日志记录
## 5. 总结
- 🔴 必须修复:SQL 注入、并发问题
- 🟡 建议修复:添加错误处理、日志记录效果评估
使用前
- 每个 PR 审查时间:30-60 分钟
- 遗漏率:约 20%
- 标准不统一
使用后
- 初步审查时间:5-10 分钟(AI 辅助)
- 遗漏率:降低到 5%
- 审查标准统一
改进建议
根据实际使用反馈,可以进一步优化:
- 添加项目特定规则:根据团队规范定制检查项
- 学习历史数据:根据过去的审查记录优化
- 集成 CI/CD:在提交前自动审查
总结
通过这个实战案例,我们学习了:
- 需求分析:明确 Skill 要解决的问题
- 设计思路:根据需求设计 Prompt 结构
- 示例编写:提供高质量的输入输出示例
- 迭代优化:根据实际使用不断改进
下一步
学习如何维护和改进 Skill: