Appearance
AI Review
在时代快速变化的当下,相信不少程序员都和我一样,会有一种“恍如隔世”的感觉。甚至一年前还在坚持的工作方式,今年就已经快被定义成“古法编程”了。
但这也没办法,时代的车轮就是这样往前滚。更何况,AI 编程确实是真的好用。
今天想分享一下我对 AI Review 的一些实践思路。
从 Code Review,到 AI 时代的分层 Review
有“古法编程”经验的人应该都知道 Code Review。这是提升代码质量非常有效的一种手段。
如果团队里有经验丰富的程序员,Code Review 往往能拦截很多问题:设计缺陷、边界遗漏、潜在 bug、风格不统一,甚至一些长期维护风险。
但现实情况通常是,受限于团队配置、业务节奏和个人精力,真正能够持续产出高质量 Review 的场景并不多。
到了 AI 时代,这件事反而变得更重要了。因为很多时候,Review 可能已经变成工程师在自己权力边界内,最后一道真正能把控质量的关卡。
但我觉得,Review 不应该只停留在 Code Review 这一层。
我现在更倾向于做一套分层 Review,当然其实其他层面也需要Review,这里我只聚焦于程序员一般的责任边界。
- Design Review
- Code Review
Design Review
我一直觉得,Design 才是程序员真正的工作重心。
这里面包含的,不只是“怎么写代码”,而是:
- 对问题的理解和定义
- 对需求边界的梳理
- 对整体流程的拆解
- 对模块职责和规则的组织
- 对异常场景和未来演进的预判
尤其是在 AI 时代,这一点变得更加重要。
以前在“古法编程”时代,程序员通常对自己写出来的代码有非常强的掌控感。很多事情虽然文档里没写清楚,但只要把代码翻一遍,往往就能学到很多东西。
有句名言说得很直接:
Talk is cheap, show me the code.
过去这句话成立,是因为代码本身就是最真实、最直接的表达。很多没有说透的设计,最后都沉淀在代码里。
但到了 AI 时代,情况开始发生变化。
代码本身正在变得越来越“廉价”。程序员投入在具体编码上的精力会越来越少,很多局部实现会直接交给 AI 生成。这样带来的一个问题是:工程师对代码细节的掌控感,实际上是在下降的。
尤其是在老项目中,这个问题会更加明显。因为系统本来就复杂,如果还把主要精力放在局部代码实现上,人的注意力很容易被淹没。
所以我现在的看法是:
在 AI 时代,程序员的掌控力应该上升一层,变成对“模型、结构、规则、行为”的掌控。
程序员不一定需要清楚项目里每一个角落的具体代码,但至少应该对这些内容做到足够熟悉:
- 整体架构是怎么分层的
- 关键模块之间是怎么协作的
- 核心行为链路是怎么串起来的
- 系统规则和约束落在哪些位置
- 一旦出问题,应该能快速定位到是哪个环节、哪个节点出了问题
至于局部代码实现,我想大家应该都已经见识过 AI 的编码能力了。在局部代码生成这件事上,AI 在很多场景里已经明显强于普通程序员。
但也正因为如此,Design Review 变得比以前更重要。
因为如果设计层面没控住,AI 只会更快地把问题放大、复制、扩散。
Design Review 需要审核哪些点
我现在理解的 Design Review,不只是“看方案有没有写出来”,而是要审核下面几个层面。
1. 问题定义是否准确
先看是不是把问题真正说清楚了:
- 要解决的核心问题是什么
- 这是用户问题、业务问题,还是技术问题
- 当前痛点在哪里
- 成功标准是什么
- 哪些内容在范围内,哪些内容不在范围内
很多方案一上来就在讲实现,但连问题本身都没定义清楚。
这种情况下,后面的设计越细,偏差可能越大。
2. 流程是否完整串联起来
一个好的设计,不应该只是几个零散的模块图,而应该能把流程完整串起来:
- 输入是什么
- 中间经过哪些步骤
- 每一步做什么转换
- 产出是什么
- 异常路径怎么走
- 回滚、重试、兜底怎么处理
也就是说,要让行为流程能够串联静态结构,而不是只看到组件,不知道它们怎么真正运转。
3. 结构、行为、规则是否闭环
这是我现在特别关注的一点:
- 结构:有哪些模块、对象、边界
- 行为:这些模块在什么条件下怎么动作
- 规则:这些动作受到什么约束
一个设计是否扎实,关键看这三者能不能闭环。
比如:
- 模块有了,但行为没说清楚
- 行为有了,但规则没定义
- 规则有了,但没有落实到具体模块
- 异常分支存在,但没有规则兜底
这些都说明设计还没完成。
4. 模块职责是否清晰
需要看:
- 模块边界是不是明确
- 谁负责校验,谁负责转换,谁负责存储,谁负责展示
- 是否出现职责重叠
- 是否出现“一个模块什么都做”的情况
- 是否有过度耦合
如果职责不清晰,AI 往往会“顺手”把逻辑写进最方便的地方。短期看效率很高,长期看维护性会越来越差。
5. 规则是否足够明确、可执行、可测试
很多设计文档的问题,不是没有规则,而是规则写得“不够落地”。
比如:
- “异常情况做合理处理”
- “超限时给出友好提示”
- “兼容常见场景”
- “必要时自动修正”
这种描述看起来没错,但几乎不能直接指导实现,也不能直接指导测试。
Design Review 要追问到足够具体:
- 什么算异常
- 什么算超限
- 提示文案是什么
- 自动修正怎么修
- 哪些情况 reject,哪些情况 warning,哪些情况 silent adapt
只有规则足够明确,AI 才不会在实现时自己“脑补”。
6. 方案的收益、风险和代价是否说清楚
一个设计方案不能只讲“能做什么”,还要讲:
- 带来的好处是什么
- 会引入哪些风险
- 对性能、稳定性、兼容性、维护成本有什么影响
- 有没有技术债
- 后续扩展是否方便
这一步review的时候也可以顺便根据情况来生成
7. 是否便于定位和排查问题
所以设计必须考虑可观测性:
- 日志打在哪里
- 错误码怎么设计
- 关键状态怎么暴露
- 如何区分不同失败类型
- 出问题时能不能快速定位到模块和阶段
如果这一点没有提前设计,后面排查问题会非常痛苦。
8. 是否便于演进
设计不能只考虑“这次需求能上线”,还要考虑:
- 后面加新规则难不难
- 新增一个分支要改几个地方
- 是否支持配置化
- 是否容易扩展测试
- 是否容易被 AI 持续接手
如果一个方案第一次写出来就已经很“僵”,那后面每次改动都会变成风险放大器。
Code Review
如果说 Design Review 负责把握方向、结构和规则,
那么 Code Review 就是在落地阶段,确保这些东西真正被正确实现。
AI 时代的 Code Review,我觉得比过去更需要“有明确参照物”。
因为以前是人在写代码,很多意图和上下文默认是在脑子里的;现在很多代码是 AI 生成的,如果没有明确的 Review 参照,Review 很容易变成“看起来差不多”。
所以我现在比较关注的 Code Review 参照主要有三类:
- 整体项目的架构风格和规范
- 根据需求生成的测试用例
- 语言特性和运行时层面的风险点
Code Review 需要审核哪些点
1. 是否符合设计
这是第一位的,不是先看“代码写得漂不漂亮”,而是先看:
- 是否真正实现了设计要求
- 主流程是否一致
- 异常分支是否覆盖
- 边界条件是否落实
很多 AI 代码局部看起来很好,但和设计一对,发现实现偏了。
2. 是否符合项目既有架构和风格
重点看:
- 有没有遵守项目分层
- 有没有把逻辑放到正确的模块
- 命名是否符合约定
- 是否复用了既有能力
- 有没有绕开公共组件另起一套
- 错误处理、日志、常量、配置是否符合已有规范
AI 很容易生成“自洽但不入乡随俗”的代码。单看没问题,放进项目里就显得很突兀。
3. 是否覆盖需求对应的测试点
Code Review 不能脱离测试点。
要对照看:
- 需求中的正常场景是否覆盖
- 边界场景是否覆盖
- 异常场景是否覆盖
- 回归风险点是否覆盖
- 是否有缺少断言的情况
- 是否只测了 happy path
最理想的状态是:
设计 -> 测试点 -> 代码实现 三者能互相映射。
4. 逻辑是否正确且一致
要重点看:
- 条件判断是否完整
- 分支之间是否互斥/重叠
- 默认值是否合理
- 状态转换是否正确
- 是否存在前后行为不一致
- 是否出现局部修补导致整体规则破坏
AI 很会“把一块补好”,但不一定能保证整体一致性。
5. 边界处理是否完整
重点检查:
null / undefined / empty处理- 长度、范围、数量上限
- 非法输入
- 重复输入
- 极端输入
- 时间、时区、编码、精度等特殊问题
这部分通常最值得花时间看,因为很多 bug 就藏在这里。
6. 错误处理和提示是否清晰
要看:
- 错误有没有被吞掉
- 是否区分可恢复错误和不可恢复错误
- 提示是否准确
- 日志是否足够定位问题
- 是否有模糊报错
- 是否把不同原因混成同一种错误
AI 写代码时很容易“能跑就行”,但错误处理往往比较粗。
7. 是否存在重复代码和错误抽象
看这些点:
- 是否复制粘贴了相似逻辑
- 是否应该抽公共函数
- 是否为了复用而过度抽象
- 抽象层次是否合适
- 是否把本该分开的语义硬合并了
AI 有时候会两边都犯:要么复制很多相似代码,要么抽出一个非常“万能但难懂”的函数。
8. 性能和资源使用是否合理
不是每次都要做深度性能 review,但至少要看:
- 有没有明显重复计算
- 有没有不必要的大对象拷贝
- 循环里是否有昂贵操作
- I/O、网络、数据库调用是否合理
- 是否有潜在内存风险
- 数据规模变大后是否会明显退化
AI 在小样本代码里经常“能过就好”,数据量一大就容易出问题。
9. 是否利用了语言特性,但没有踩语言坑
这个部分很重要,尤其是不同语言各有不同风险。
需要关注:
- 异步/并发是否安全
- 可变对象是否被误共享
- 异常传播是否正确
- 类型系统有没有被绕开
- 精度、时区、编码问题是否处理好
- 生命周期、资源释放是否完整
- 语言中的隐式行为有没有造成风险
也就是说,AI 可以很会写“像这个语言的代码”,
但不一定真的避开了这个语言最常见的坑。
10. 可读性和可维护性是否足够
最后再看这些:
- 命名是否清晰
- 函数是否过长
- 嵌套是否过深
- 关键逻辑是否容易理解
- 注释是否解释“为什么”,而不是重复“做了什么”
- 后续修改一个规则时,影响范围是否可控
AI 生成的代码有时候表面上很整洁,但真正维护起来并不一定轻松。