mcpField
C
code-review-excellence

code-review-excellence

github.com/ovachiever测试与质量5655 次安装48 周前更新
代码仓库

关于 code-review-excellence

为开发团队提供结构化代码审查方法,涵盖反馈表达、审查清单和流程,侧重发现问题与促进协作和知识共享。

主要功能

  1. 01分阶段审查流程
  2. 02可复用审查清单
  3. 03建设性反馈技巧
  4. 04按严重程度标记问题
  5. 05语言特定检查建议
  6. 06PR 分析脚本与模板

适用场景

  1. 01审查拉取请求与代码变更
  2. 02制定团队审查规范
  3. 03通过审查指导初级开发者
  4. 04评估架构与安全风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --skill code-review-excellence

安装后在 Claude Code 中输入/code-review-excellence确认已加载。

详细介绍

卓越的代码审查

通过建设性的反馈、系统化分析和协作改进,将代码审查从把关转变为知识分享。

何时使用此技能

  • 审查拉取请求和代码变更
  • 为团队制定代码审查标准
  • 通过审查指导初级开发者
  • 进行架构审查
  • 制定审查清单和指南
  • 改进团队协作
  • 缩短代码审查周期
  • 维护代码质量标准

核心原则

1. 审查心态

代码审查的目标:

  • 发现 Bug 和边界情况
  • 确保代码易于维护
  • 在团队中分享知识
  • 落实编码标准
  • 改进设计和架构
  • 建设团队文化

非目标:

  • 炫耀知识
  • 吹毛求疵地纠结格式(使用代码检查工具)
  • 不必要地阻碍进度
  • 按照自己的偏好重写代码
2. 有效反馈

良好的反馈应当:

  • 具体且可执行
  • 具有教育意义,而非评判
  • 聚焦于代码,而非个人
  • 保持平衡(也要赞扬优秀的工作)
  • 按优先级排序(关键问题与可改进项)
❌ Bad: "This is wrong."
✅ Good: "This could cause a race condition when multiple users
         access simultaneously. Consider using a mutex here."

❌ Bad: "Why didn't you use X pattern?"
✅ Good: "Have you considered the Repository pattern? It would
         make this easier to test. Here's an example: [link]"

❌ Bad: "Rename this variable."
✅ Good: "[nit] Consider `userCount` instead of `uc` for
         clarity. Not blocking if you prefer to keep it."
3. 审查范围

需要审查的内容:

  • 逻辑正确性和边界情况
  • 安全漏洞
  • 性能影响
  • 测试覆盖率和质量
  • 错误处理
  • 文档和注释
  • API 设计和命名
  • 架构适配性

无需手动审查的内容:

  • 代码格式(使用 Prettier、Black 等工具)
  • 导入项的组织
  • 代码检查违规项
  • 简单的拼写错误

审查流程

阶段 1:收集上下文(2-3 分钟)
Before diving into code, understand:

1. Read PR description and linked issue
2. Check PR size (>400 lines? Ask to split)
3. Review CI/CD status (tests passing?)
4. Understand the business requirement
5. Note any relevant architectural decisions
阶段 2:高层审查(5-10 分钟)
1. **Architecture & Design**
   - Does the solution fit the problem?
   - Are there simpler approaches?
   - Is it consistent with existing patterns?
   - Will it scale?

2. **File Organization**
   - Are new files in the right places?
   - Is code grouped logically?
   - Are there duplicate files?

3. **Testing Strategy**
   - Are there tests?
   - Do tests cover edge cases?
   - Are tests readable?
阶段 3:逐行审查(10-20 分钟)
For each file:

1. **Logic & Correctness**
   - Edge cases handled?
   - Off-by-one errors?
   - Null/undefined checks?
   - Race conditions?

2. **Security**
   - Input validation?
   - SQL injection risks?
   - XSS vulnerabilities?
   - Sensitive data exposure?

3. **Performance**
   - N+1 queries?
   - Unnecessary loops?
   - Memory leaks?
   - Blocking operations?

4. **Maintainability**
   - Clear variable names?
   - Functions doing one thing?
   - Complex code commented?
   - Magic numbers extracted?
阶段 4:总结并做出决定(2-3 分钟)
1. Summarize key concerns
2. Highlight what you liked
3. Make clear decision:
   - ✅ Approve
   - 💬 Comment (minor suggestions)
   - 🔄 Request Changes (must address)
4. Offer to pair if complex

审查技巧

技巧 1:清单法
## Security Checklist
- [ ] User input validated and sanitized
- [ ] SQL queries use parameterization
- [ ] Authentication/authorization checked
- [ ] Secrets not hardcoded
- [ ] Error messages don't leak info

## Performance Checklist
- [ ] No N+1 queries
- [ ] Database queries indexed
- [ ] Large lists paginated
- [ ] Expensive operations cached
- [ ] No blocking I/O in hot paths

## Testing Checklist
- [ ] Happy path tested
- [ ] Edge cases covered
- [ ] Error cases tested
- [ ] Test names are descriptive
- [ ] Tests are deterministic
技巧 2:提问法

不要直接指出问题,而是通过提问鼓励对方思考:

❌ "This will fail if the list is empty."
✅ "What happens if `items` is an empty array?"

❌ "You need error handling here."
✅ "How should this behave if the API call fails?"

❌ "This is inefficient."
✅ "I see this loops through all users. Have we considered
    the performance impact with 100k users?"
技巧 3:提出建议,而非发号施令
## Use Collaborative Language

❌ "You must change this to use async/await"
✅ "Suggestion: async/await might make this more readable:
    ```typescript
    async function fetchUser(id: string) {
        const user = await db.query('SELECT * FROM users WHERE id = ?', id);
        return user;
    }
    ```
    What do you think?"

❌ "Extract this into a function"
✅ "This logic appears in 3 places. Would it make sense to
    extract it into a shared utility function?"
技巧 4:区分严重程度
Use labels to indicate priority:

🔴 [blocking] - Must fix before merge
🟡 [important] - Should fix, discuss if disagree
🟢 [nit] - Nice to have, not blocking
💡 [suggestion] - Alternative approach to consider
📚 [learning] - Educational comment, no action needed
🎉 [praise] - Good work, keep it up!

Example:
"🔴 [blocking] This SQL query is vulnerable to injection.
 Please use parameterized queries."

"🟢 [nit] Consider renaming `data` to `userData` for clarity."

"🎉 [praise] Excellent test coverage! This will catch edge cases."

特定语言的模式

Python 代码审查
# Check for Python-specific issues

# ❌ Mutable default arguments
def add_item(item, items=[]):  # Bug! Shared across calls
    items.append(item)
    return items

# ✅ Use None as default
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

# ❌ Catching too broad
try:
    result = risky_operation()
except:  # Catches everything, even KeyboardInterrupt!
    pass

# ✅ Catch specific exceptions
try:
    result = risky_operation()
except ValueError as e:
    logger.error(f"Invalid value: {e}")
    raise

# ❌ Using mutable class attributes
class User:
    permissions = []  # Shared across all instances!

# ✅ Initialize in __init__
class User:
    def __init__(self):
        self.permissions = []
TypeScript/JavaScript 代码审查
// Check for TypeScript-specific issues

// ❌ Using any defeats type safety
function processData(data: any) {  // Avoid any
    return data.value;
}

// ✅ Use proper types
interface DataPayload {
    value: string;
}
function processData(data: DataPayload) {
    return data.value;
}

// ❌ Not handling async errors
async function fetchUser(id: string) {
    const response = await fetch(`/api/users/${id}`);
    return response.json();  // What if network fails?
}

// ✅ Handle errors properly
async function fetchUser(id: string): Promise<User> {
    try {
        const response = await fetch(`/api/users/${id}`);
        if (!response.ok) {
            throw new Error(`HTTP ${response.status}`);
        }
        return await response.json();
    } catch (error) {
        console.error('Failed to fetch user:', error);
        throw error;
    }
}

// ❌ Mutation of props
function UserProfile({ user }: Props) {
    user.lastViewed = new Date();  // Mutating prop!
    return <div>{user.name}</div>;
}

// ✅ Don't mutate props
function UserProfile({ user, onView }: Props) {
    useEffect(() => {
        onView(user.id);  // Notify parent to update
    }, [user.id]);
    return <div>{user.name}</div>;
}

高级审查模式

模式 1:架构审查
When reviewing significant changes:

1. **Design Document First**
   - For large features, request design doc before code
   - Review design with team before implementation
   - Agree on approach to avoid rework

2. **Review in Stages**
   - First PR: Core abstractions and interfaces
   - Second PR: Implementation
   - Third PR: Integration and tests
   - Easier to review, faster to iterate

3. **Consider Alternatives**
   - "Have we considered using [pattern/library]?"
   - "What's the tradeoff vs. the simpler approach?"
   - "How will this evolve as requirements change?"
模式 2:测试质量审查
// ❌ Poor test: Implementation detail testing
test('increments counter variable', () => {
    const component = render(<Counter />);
    const button = component.getByRole('button');
    fireEvent.click(button);
    expect(component.state.counter).toBe(1);  // Testing internal state
});

// ✅ Good test: Behavior testing
test('displays incremented count when clicked', () => {
    render(<Counter />);
    const button = screen.getByRole('button', { name: /increment/i });
    fireEvent.click(button);
    expect(screen.getByText('Count: 1')).toBeInTheDocument();
});

// Review questions for tests:
// - Do tests describe behavior, not implementation?
// - Are test names clear and descriptive?
// - Do tests cover edge cases?
// - Are tests independent (no shared state)?
// - Can tests run in any order?
模式 3:安全审查
## Security Review Checklist

### Authentication & Authorization
- [ ] Is authentication required where needed?
- [ ] Are authorization checks before every action?
- [ ] Is JWT validation proper (signature, expiry)?
- [ ] Are API keys/secrets properly secured?

### Input Validation
- [ ] All user inputs validated?
- [ ] File uploads restricted (size, type)?
- [ ] SQL queries parameterized?
- [ ] XSS protection (escape output)?

### Data Protection
- [ ] Passwords hashed (bcrypt/argon2)?
- [ ] Sensitive data encrypted at rest?
- [ ] HTTPS enforced for sensitive data?
- [ ] PII handled according to regulations?

### Common Vulnerabilities
- [ ] No eval() or similar dynamic execution?
- [ ] No hardcoded secrets?
- [ ] CSRF protection for state-changing operations?
- [ ] Rate limiting on public endpoints?

提出棘手的反馈

模式:三明治法(改良版)
Traditional: Praise + Criticism + Praise (feels fake)

Better: Context + Specific Issue + Helpful Solution

Example:
"I noticed the payment processing logic is inline in the
controller. This makes it harder to test and reuse.

[Specific Issue]
The calculateTotal() function mixes tax calculation,
discount logic, and database queries, making it difficult
to unit test and reason about.

[Helpful Solution]
Could we extract this into a PaymentService class? That
would make it testable and reusable. I can pair with you
on this if helpful."
处理分歧
When author disagrees with your feedback:

1. **Seek to Understand**
   "Help me understand your approach. What led you to
    choose this pattern?"

2. **Acknowledge Valid Points**
   "That's a good point about X. I hadn't considered that."

3. **Provide Data**
   "I'm concerned about performance. Can we add a benchmark
    to validate the approach?"

4. **Escalate if Needed**
   "Let's get [architect/senior dev] to weigh in on this."

5. **Know When to Let Go**
   If it's working and not a critical issue, approve it.
   Perfection is the enemy of progress.

最佳实践

  1. 及时审查:在 24 小时内完成,最好当天完成
  2. 控制 PR 规模:为确保审查有效,每个 PR 最多 200-400 行
  3. 分时段审查:每次最多 60 分钟,并适当休息
  4. 使用审查工具:GitHub、GitLab 或专用工具
  5. 尽可能自动化:代码检查工具、格式化工具、安全扫描
  6. 建立融洽关系:表情符号、赞扬和同理心都很重要
  7. 随时提供帮助:对于复杂问题,主动提出结对处理
  8. 向他人学习:审阅其他人的审查意见

常见陷阱

  • 完美主义:因为细微的风格偏好而阻止 PR
  • 范围蔓延:“既然你正在处理,能不能也……”
  • 标准不一:对不同的人采用不同标准
  • 延迟审查:让 PR 搁置数日
  • 失联:要求对方修改后便不再回应
  • 走过场式批准:未实际审查就批准
  • 纠结琐事:长时间争论无关紧要的细节

模板

PR 审查评论模板
## Summary
[Brief overview of what was reviewed]

## Strengths
- [What was done well]
- [Good patterns or approaches]

## Required Changes
🔴 [Blocking issue 1]
🔴 [Blocking issue 2]

## Suggestions
💡 [Improvement 1]
💡 [Improvement 2]

## Questions
❓ [Clarification needed on X]
❓ [Alternative approach consideration]

## Verdict
✅ Approve after addressing required changes

资源

  • references/code-review-best-practices.md:全面的审查指南
  • references/common-bugs-checklist.md:需要留意的特定语言 Bug
  • references/security-review-guide.md:以安全为重点的审查清单
  • assets/pr-review-template.md:标准审查评论模板
  • assets/review-checklist.md:快速参考清单
  • scripts/pr-analyzer.py:分析 PR 复杂度并推荐审查者

评论

支持 Markdown