把流程换到文化时踩过的坑
这次做代码审查流程优化,从流程到文化,。
下面只记真正影响结果的部分。
审查流程
Pull Request 模板
# Pull Request 模板
## 变更描述
<!-- 简要描述这个 PR 做了什么 -->
## 变更类型
<!-- 选择一个 -->
- [ ] Bug 修复
- [ ] 新功能
- [ ] 性能优化
- [ ] 重构
- [ ] 文档更新
## 测试
<!-- 描述如何测试这个 PR -->
## 截图/演示
<!-- 如果有 UI 变更,提供截图或演示链接 -->
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 添加了必要的测试
- [ ] 更新了相关文档
- [ ] 没有引入新的警告
- [ ] 通过了所有 CI 检查
## 相关 Issue
<!-- 关联相关 Issue -->
Fixes #123
自动化检查
# .github/workflows/pr-check.yml
name: PR Check
on:
pull_request:
branches: [ main ]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm ci
- name: Run Linter
run: npm run lint
- name: Run Tests
run: npm test
- name: Check coverage
run: npm test -- --coverage
- name: Check TypeScript
run: npm run type-check
- name: Security audit
run: npm audit --audit-level=moderate
审查标准
代码质量
# 代码质量检查清单
## 可读性
- [ ] 变量和函数命名清晰
- [ ] 代码格式一致
- [ ] 注释适当且准确
- [ ] 复杂逻辑有说明
## 可维护性
- [ ] 函数职责单一
- [ ] 避免重复代码
- [ ] 模块化良好
- [ ] 依赖关系清晰
## 性能
- [ ] 没有明显的性能问题
- [ ] 合理使用缓存
- [ ] 避免不必要的计算
- [ ] 数据库查询优化
## 安全
- [ ] 没有硬编码密钥
- [ ] 输入验证
- [ ] 输出转义
- [ ] 权限检查
测试质量
# 测试质量检查清单
## 测试覆盖
- [ ] 核心功能有测试
- [ ] 边界条件测试
- [ ] 错误处理测试
- [ ] 集成测试
## 测试质量
- [ ] 测试用例有意义
- [ ] 测试数据合理
- [ ] 断言准确
- [ ] 没有过时的测试
审查工具
自动化工具
// 使用 husky 和 lint-staged
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write",
"jest --bail --findRelatedTests"
],
"*.{css,scss,less}": [
"stylelint --fix",
"prettier --write"
]
}
}
// 使用 commitlint
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore']],
'subject-case': [0]
}
};
代码质量分析
// 使用 SonarQube 进行代码质量分析
module.exports = {
plugins: [
['@typescript-eslint/eslint-plugin'],
['eslint-plugin-sonarjs'],
['eslint-plugin-import'],
['eslint-plugin-jsx-a11y'],
['eslint-plugin-react']
],
rules: {
// 复杂度规则
'complexity': ['warn', 10],
'max-lines-per-function': ['warn', 50],
// 安全规则
'no-eval': 'error',
'no-implied-eval': 'error',
// 最佳实践
'prefer-const': 'warn',
'no-var': 'error',
// 测试规则
'sonarjs/no-duplicate-string': 'warn'
}
};
审查沟通
反馈示例
# 好的反馈
## 代码结构
✅ 整体结构清晰,模块划分合理。
## 性能
⚠️ 在 calculate_total 函数中,建议使用数组方法代替循环:
```javascript
// 当前实现
let total = 0;
for (let i = 0; i < items.length; i++) {
total += items[i].price;
}
// 建议
const total = items.reduce((sum, item) => sum + item.price, 0);
测试
❌ 缺少边界条件测试,建议添加:
test('calculate_total with empty array', () => {
expect(calculate_total([])).toBe(0);
});
文档
✅ 注释清晰,建议添加 JSDoc 用于公共函数。
### 建设性反馈
```markdown
# 不好的反馈
这个代码写得不好,重写。
# 好的反馈
我注意到 calculate_total 函数使用了循环来实现,考虑到代码可读性和维护性,建议使用数组方法 reduce 来实现。这样可以更简洁地表达意图,也更符合函数式编程的理念。
# 甚至更好的反馈
我看到 calculate_total 函数有优化空间。当前使用循环实现,虽然功能正确,但可以考虑使用数组方法 reduce:
```javascript
const total = items.reduce((sum, item) => sum + item.price, 0);
这样做有几个好处:
- 代码更简洁
- 意图更清晰(累加)
- 减少临时变量
你觉得这个建议如何?
## 踩过的坑
### 坑一:审查太慢
审查速度慢,影响开发效率。
**解决**:制定审查 SLA,使用自动化工具。
```yaml
# 审查 SLA
# 小 PR (<50 行): 24 小时内审查
# 中 PR (50-500 行): 48 小时内审查
# 大 PR (>500 行): 72 小时内审查
# 使用 GitHub Actions 提醒
name: Review Reminder
on:
pull_request:
types: [opened]
jobs:
remind:
runs-on: ubuntu-latest
steps:
- name: Post comment
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '👋 请尽快审查这个 PR,谢谢!'
})
坑二:审查质量参差不齐
审查质量不一致,有时严格,有时宽松。
解决:制定审查标准,定期对齐。
# 审查对齐会议
## 会议目的
- 统一审查标准
- 讨论审查中的问题
- 分享最佳实践
## 会议内容
1. 审查标准回顾
2. 最近审查案例分析
3. 审查工具使用
4. Q&A
## 时间
- 每两周一次
- 时长:1 小时
坑三:审查变成形式主义
为了审查而审查,没有实质内容。
解决:关注有意义的反馈,避免形式主义。
# 审查重点
## 重点关注
1. 重大 bug 和安全问题
2. 架构和设计问题
3. 性能问题
4. 可维护性问题
## 不纠结
1. 代码风格(交给自动化工具)
2. 个人偏好
3. 细节优化(不是影响正确性的)
写在最后
代码审查这东西,不只是找错误,是团队学习和质量保证。
解决了:
- 代码质量
- 团队学习
- 知识传递
带来了:
- 开发时间增加
- 团队沟通成本
- 冲突可能性
实施之前先评估:
- 团队规模
- 项目质量要求
- 团队能力
- 时间预算
不是所有团队都需要严格的代码审查,但基本的审查不能少。
这次代码审查流程优化花了一个月,从流程到文化。优化完成后,Bug 数量减少了 40%,团队代码风格统一,学习氛围明显改善。
版权声明: 本文首发于 指尖魔法屋-把流程换到文化时踩过的坑(https://blog.thinkmoon.cn/post/100-code-review-process-culture-practice-guide/) 转载或引用必须申明原指尖魔法屋来源及源地址!
评论
使用 GitHub 账号登录后即可留言,支持 Markdown。