25 分钟
工程化

代码审查(Code Review)实战

掌握专业 Code Review 的方法论和常见问题识别

  • 理解 Code Review 的目的和流程
  • 掌握审查 Checklist
  • 学会识别常见代码坏味道
  • 了解如何给出有效的审查意见

Code Review 不只是找 Bug

Code Review 是团队保证代码质量、知识共享、统一风格的实践。Review 的目的不是挑错,是发现潜在问题、确保代码可维护、团队成员互相学习、统一技术方案。

🐍Google 的 Code Review 标准

Google 工程实践文档指出:Review 时先看变更是否正确,再看可维护性(可读性、复杂度、耦合度),最后才是风格细节。如果变更整体方向正确,即使不完美也应该批准,不要因为个人偏好阻塞合并。

审查 Checklist

每次 Review 按以下顺序检查:

正确性:逻辑是否正确?边界条件处理了吗?并发安全吗?

错误处理:异常有没有被正确捕获和传播?资源有没有正确释放?

安全性:有没有 SQL 注入、XSS、硬编码密钥?权限校验了吗?

可维护性:命名清晰吗?函数太长吗?注释解释了为什么而不是做什么?

测试:有单元测试吗?覆盖了边界和异常路径吗?

性能:有没有明显的N+1查询、不必要的循环、内存泄漏?

常见代码坏味道

Python
# 1. 过长函数(>50行就要警惕)
# 反例:一个函数做了太多事
def process_order(order_id):
    # 验证库存(20行)
    # 扣减库存(15行)
    # 计算价格(30行)
    # 发送通知(10行)
    # 写日志(5行)
    pass

# 正例:拆成小函数,每个只做一件事
def process_order(order_id):
    order = get_order(order_id)
    validate_inventory(order)
    deduct_inventory(order)
    total = calculate_price(order)
    notify_customer(order)
    log_order_processed(order, total)

# 2. 魔法数字
# 反例
if status == 3: ...
# 正例
ORDER_STATUS_SHIPPED = 3
if status == ORDER_STATUS_SHIPPED: ...

# 3. 重复代码(DRY原则)
# 反例:三个地方写了相似的数据库查询
# 正例:提取为公共方法

# 4. 过深的嵌套(>3层)
# 反例
if user:
    if user.is_active:
        for order in user.orders:
            if order.total > 100:
                ...
# 正例:提前返回(Guard Clause)
if not user or not user.is_active:
    return
for order in user.orders:
    if order.total <= 100:
        continue
    ...

如何给出有效的 Review 意见

糟糕的 Review 意见

"这写得不好""为什么不用XX?""太烂了"好的 Review 意见"这里如果用字典映射替代 if-elif,新增类型时不需要改这段代码,符合开闭原则。""这个循环里有数据库查询,N 条记录会查 N 次(N+1问题)。可以用 select_related 一次性查出。""这个函数有 4 层嵌套,建议用提前返回降低嵌套深度,可读性会好很多。"原则:对事不对人:说「代码」而不是「你」解释「为什么」:不只说要改什么,还要说原因区分「必须改」和「建议」:用 Nit: 前缀表示非阻塞建议肯定好的部分:不要只挑错

💡Review 的黄金法则

如果你在 Review 时需要超过 60 秒才能理解一段代码在做什么,这段代码就需要重构——不是你需要更努力地看,而是代码需要写得更清楚。

找 Bug直接拼接 SQL 字符串有 SQL 注入风险。哪怕 user_id 看着是数字,也得用参数化查询。
def get_user_orders(db, user_id): orders = db.query("SELECT * FROM orders WHERE user_id = " + str(user_id)) return orders
选择题

调试第一步应该是?

选择题

断点调试相比 print 的优势?

选择题

修复一个 Bug 后,最应该补上的是?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

底层是大量、快速、稳定的单元测试(优先覆盖纯函数与边界/异常路径),中间是少量集成测试(验证模块协作),顶端是少量端到端测试(慢且脆)。测试最大的价值是当「安全网」:有它你才敢放心重构。没测试兜底的重构,本质是在赌博。写用例先想正常、边界、异常三类。

挑战任务

审查代码

简单+50 XP

以下代码有多个问题,找出至少 3 个并给出修改建议。

审查代码
3 个测试用例

课后作业

审查真实代码

中等+30 XP

找一段你之前写的Python代码,用Checklist逐项审查,记好发现的问题和改进方案。

审查真实代码
1 个测试用例