把流程换到文化时踩过的坑

这次做代码审查流程优化,从流程到文化,。

下面只记真正影响结果的部分。

审查流程

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);

这样做有几个好处:

  1. 代码更简洁
  2. 意图更清晰(累加)
  3. 减少临时变量

你觉得这个建议如何?


## 踩过的坑

### 坑一:审查太慢

审查速度慢,影响开发效率。

**解决**:制定审查 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/) 转载或引用必须申明原指尖魔法屋来源及源地址!