ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AI代码审查:从费根检查到人机协同的演进与实践

2026/9/7 16:34:24 拓冰建站 浏览量
AI代码审查:从费根检查到人机协同的演进与实践 一个做后端的朋友跟我讲过这样一件事他提交了一个 Pull Request晚上回家路上手机弹出一条评论——不是同事的回复而是一个代码审查机器人。它指出一个空指针可能被漏掉还附带了一段上下文分析。他扫了一眼确实是漏了。第二天晨会时同事说“你那个 PR 我看过了没什么大问题”。那一刻他突然意识到代码审查这个过去需要人凑齐时间、反复翻代码、来回评论的流程已经在他没有察觉的情况下被悄悄重新定义了。代码审查这个领域其实是软件开发史里最容易被忽略、但从未缺席的一块。从四十多年前的费根检查到今天各类 AI 辅助审查工具批量出现它经历了一次典型的“由重到轻、由人到机、再由机回人”的演进。这篇文章想把这整条线串起来讲清楚。我的核心判断是AI 并没有“接管”代码审查它只是把代码审查从一种依赖人的流程纪律变成了一种人与工具各司其职的质量协同。这个判断听起来不够“炸”但恰恰是它决定了你在实际工作里该怎么用 AI 审查工具——是把 AI 当成一个看起来全知的裁判还是把 AI 当成一套需要配置、调参、验证、兜底的工程组件。1. 从费根检查说起代码审查为什么一开始是“仪式感”很多年轻开发者只知道现代代码评审也就是在 GitHub 上提 PR、拉分支、等人评论、点 Approve。他们不太清楚代码审查最初的样子是一套重到几乎像正式会议的流程叫费根检查Fagan Inspection。1.1 费根检查是什么一场有准备的正式会议1976 年前后IBM 的 Michael Fagan 提出了一套正式的软件检查方法后来被广泛称为“费根检查”。它不是为了代码评审准备一份 checklist而是把检查当作软件工程里的一个正式阶段。整个流程大概是这样的由代码作者提交一份设计或代码成品。检查者提前拿到材料阅读并记录缺陷。正式召开一个检查会议主持人、记录员、读者、检查者各有分工。在会议上逐段朗读并检查代码发现的问题逐条记录。会议结束后形成一份缺陷清单作者负责修复主持人负责跟踪闭环。这套流程在今天听起来相当“重”但对于 70 年代来说它是合理的。为什么因为那是一个没有版本控制工具、没有自动化测试、甚至没有像样调试器的时代。代码一旦提交到生产环境出错的代价非常高所以把错误拦截在发布之前远比今天更重要。费根检查的核心价值也不仅仅是找缺陷。它做了三件更重要的事情统一理解多人一起读同一份代码团队对系统形成的理解是共用的。知识传播新人能在检查会议上快速了解一个模块的设计意图和约定。质量标准它让“可读”“可维护”这些抽象概念在会议上被反复讨论最终变成团队公认的尺子。如果你认真看这三件事会发现它们几乎是现代代码审查文化的祖先。我们今天说“代码评审不只是找 bug”很多人的第一反应会觉得这是新理念其实并不是。费根检查那代人早就明白代码审查的价值首先是人其次才是代码。1.2 为什么它会衰落不是因为理念错了而是因为成本太高费根检查的困境非常典型它对人力的要求太高了。一次合格的费根检查需要凑齐主持人、记录员、读者和至少两三个检查者提前分头读代码再约一个 1 到 2 小时的正式会议。对于一个小团队来说这意味着一个功能合入之前可能要先烧掉大半天人力。更麻烦的是人的注意力是有限资源。当代码量增大、交付节奏加快让每个人都长时间高强度读别人代码效果会断崖式下降。结果就是流程仍然存在但“正式检查”慢慢变成了“走形式”。我在早期项目里见过很多类似变体每周五下午全组坐在一起过代码看起来像在审查实际上每个人都在心里默念“这个功能不是我的别点名我发言”。审查会议开成了一个工作汇报会最终输出是“整体逻辑是 OK 的几个细节后面补一下”。这不叫代码审查这叫仪式感。费根检查衰落的核心原因是**它的价值是真实的但它对时间和注意力的消耗让它无法适应当代软件开发的高频交付节奏。**但你要记住一个前提——它在电子政务、航空航天、汽车电子、核心金融系统这类安全关键领域里至今仍以变体形式存在。因为这些领域里代码缺陷的代价远高于一次会议的人力成本。2. 轻量评审的上位从“开会审”到“异步讨论”费根检查衰落之后代码审查并没有消失而是换了一种形态。真正把代码审查变成今天这个样子的是 Git 工作流和代码托管平台的普及。2.1 Pull Request 带来的三个关键变化GitHub 把 Pull Request 推成了标准的协作方式。它看起来只是“把分支变更合并进主干前先让其他人看看”但实际影响远比这个描述大得多异步化审查不再需要所有人同时出现在一个会议室。你在北京评论一个函数我在上海晚上看到再回复时间差可以是一天但不阻断整体工作流。小步化基于分支和 commit 的粒度审查被拆小。今天看一个 feature 分支明天看两个 bug 修复每个 PR 的范围明显收窄人的注意力负载被降低。过程记录化每一条评论、每一次回复、每一个 Approve都有自己的时间戳和归属。代码审查从“会议纪要”变成“可追溯的工程资产”。这三个变化背后是对软件交付节奏的重新理解。过去我们默认质量必须通过“重流程”来保障而现代工程实践发现只要把变更拆小人人可随时打开看一眼质量保障就能以更轻的方式实现。这就是为什么会有人把轻量评审说成“费根检查的民主化”。它把一个需要主持人的正式活动变成了一个不需要主持人、不需要会议室、甚至不需要同步在场的协作机制。2.2 轻量评审的真问题注意力被打散LGTM 变成掩护轻量评审解决了成本问题但它没有解决注意力问题。大批团队一个常见的真实状态是PR 挂在那里已经三天了本来箭在弦上要合入主干结果 reviewer 一直忘了看。后来在群里催了一下对方回了一句“LGTMLooks Good To Me”然后点了一下 Approve。这就是“轻”带来的副作用当审查变成一件没有任何仪式感、随时可以被跳过的事它就会变得有名无实。很多团队为了补这块短板给真实评审加上了许多外部纪律要求每个 PR 至少一个小时代码阅读时间。要求审阅人必须给出非 LGTM 的具体评论。设置门禁没有两个 Approve 不能合并。把代码审查通过率纳入团队效能指标。这些方案都有一定效果但它们本质上还是“靠流程约束人的注意力”。只要人的时间有限、上下文频繁切换注意力问题始终会回来。一批 PR 积压总有人会在压力下草率点下 Approve。而正是在这个环节上AI 第一次找到了一个非常精确的切入位置它不能替代人去做判断但它可以在人开始看之前先把重复性的、机械性的、拼人眼力的事情做完。3. AI 入场它到底在审什么又审不了什么AI 代码审查并不是平地起高楼。它的逻辑前身其实是从 lint、静态分析、编译警告一路演化过来的。3.1 静态分析、lint 与 AI从“人找规则”到“模型找规律”传统的静态分析工具原理是“人定义规则机器按规则扫描”。比如你规定“禁止使用 eval”工具就扫代码里所有 eval匹配到就报警。这个模型很可靠、可解释但有两个致命局限一是规则要人工维护规则库能不能跟上语言特性和项目风格全靠团队经营二是它只能发现“你已经知道要防的东西”对那些“你没有意识到的反模式”无能为力。AI 审查的工具模型不一样。大模型在海量代码上训练它不需要你预先定义“什么是坏味道”你只要给它一段代码和上下文它就能根据训练数据里的普遍模式给出判断这个函数可能返回空、这段正则没有考虑边界、这两个分支逻辑实际重复了。这里的差异本质上是从“穷举向下的因果规则”变成了“统计向上的模式识别”。AI 能发现一些你没写进规则库的反模式这是它超过传统静态分析的地方但它也可能给出错误的判断因为它本质上是在“猜”。更准确地说AI 审查擅长四件事代码解释把一段难以理解的代码翻译成通俗人话降低 reviewer 理解门槛。简单逻辑缺陷空指针、数组越界、线程安全、并发写等问题模型能在常见框架语境下给出提示。一致性建议命名风格不统一、重复代码可抽取、函数过长等可读性问题。审查描述生成自动生成 PR 的变更说明让 review 的人更快抓住改动目标。3.2 AI 审查的真边界它不懂业务更不懂“为什么要改”但 AI 审查有非常明显的边界这一点如果团队没有提前达成共识很容易误用。第一它对项目业务语义的理解非常浅。它知道这是一个 HTTP 接口、知道这段代码在更新数据库但它不知道你这次改动的目的是为了合规审计还是为了承接一个未公开的业务规则。真正影响代码质量的关键判断往往藏在这类业务意图里。第二它容易产生“自信的错误”。一个模型可能信心满满地指出某处存在空指针风险但你细看上下文发现这个函数在上层已经被判空保护过。它的问题不在于“会犯错”而在于它“犯错时的表达非常坚定”。人类 reviewer 看到一段语气笃定的评论很容易先入为主认为这是对的。第三上下文窗口是硬限制。很多审查问题需要看到整个模块的调用链、相关历史 commit、甚至设计文档。AI 工具通常只能拿到这次 PR 的 diff、附近的几段代码或者仓库里截断后的上下文。换一个项目、换一个分支它的判断基准就变了。这也解释了为什么实际落地时AI 审查工具的表现常常是“看起来很厉害但总差一口真正专业的气”。我用一张表对比传统静态分析、AI 审查和人类审查这样你会更清楚边界在哪里维度静态分析AI 审查人类审查规则来源人工维护训练数据规律业务经验与团队约定识别未知反模式弱较强强业务意图判断无法非常弱核心能力误报率可控但规则死板不稳定可能自信误报依赖个人能力和状态推理成本低中高高是否适合作为门禁适合适合做辅助提示不建议直接拦截最终门禁必须靠人这张表的意思是AI 审查的最好定位是一个能力泛化的预审员而不是最终裁判。3.3 实践中别踩的最大坑把 AI 评论直接提升为合并门禁我在很多团队里见过一个共同的风险工具提供方为了展示效果默认开启较为激进的规则把所有 AI 建议都推到机器人评论区。结果一个新 PR机器人给出 15 条评论其中 3 条真实有用另外 12 条属于过度揣测。真实场景里一个忙不过来的 maintainer 看到这么多机器人评论反而容易漏掉关键问题或者产生“狼来了”效应。正确做法是把 AI 输出当成一个分层信号而不是一个平等信号。比如严重级别高的、附带了行号和上下文的问题设置更高的置信阈值。风格类建议单独分组不要混在阻塞投递的评论里。提供“安静模式”默认不主动评论让 developer 需要时再请求 AI 分析。注意不要把 AI 审查的结论文直接当作合并门禁。它适合做第一批过滤、上下文补全和提示但真正关卡仍然应该由人来执行。4. 落地实践把 AI 审查接入团队工作流如果你读到这里决定在团队里试试 AI 辅助代码审查下面这条路是我认为最稳的做法。它不追求一步到位而是先让 AI 从小范围、低扰动、可验证的方式进入流程。4.1 先定义你希望 AI 帮你解决什么这一步最关键但大多数团队会跳过。请先想清楚一个问题“你想要 AI 解决哪一个痛点”常见痛点可以拆成几类大量 PR 被拖着不看因为审阅者理解代码太慢。新手提交的代码总是有低级问题反复被打回。团队没有统一编码风格规则太多人记不住。线上出 bug复盘发现是空指针和边界条件想提前拦截。不同的痛点对应不同的接入方式。如果目标是“降低理解成本”可以让 AI 在 PR 正文里生成变更说明如果目标是“拦截低级问题”可以让 AI 针对新开发者的 diff 做一轮提示如果目标是“统一风格”建议先选择已有静态规则AI 只做遗漏补位而不是主力。我的经验先选一个最痛的场景用最小样本验证 AI 是否真的能产生增量再决定是否推广。千万不要一上来就把所有 PR 的应用场景都切换给 AI。4.2 最小可运行流程从本地验证到 CI 接入具体接入路径取决于团队使用的代码托管和 CI 平台但底层思路大同小异。我建议按这个顺序做第一步本地小样本验证。选 10 个已经合入、历史上有缺陷讨论的 PR用同一个 AI 审查工具再做一遍。人工对比机器评论和历史讨论看看 AI 能否命中真实缺陷误报率有多高。这一步的核心目标不是验证 AI 有多强而是验证你们项目“适不适合” AI 审查。如果你用的大模型训练数据里和你们用的语言、框架差异很大第一次跑出来的结果可能乱七八糟别急着换工具先调整提示词、上下文范围和模型版本。第二步选一个非关键的仓库接入 CI 或 bot。选一个内部服务、非核心应用的小仓库接入 AI 审查 bot。先让它每天只输出最严重级别的问题不在评论区刷噪声。运行两周后请 2 到 3 个核心工程师做一个总结有多少评论被认为有用有多少被忽略哪些语言/框架场景误报率最高第三步调整参数与输出粒度。不同工具提供不同配置这里列举常见的参数维度和它们的影响参数含义经验建议扫描范围只扫 diff 或扫描整个仓库刚开始只扫 diff避免上下文噪声文件过滤是否审查测试文件、配置文件、生成代码建议排除生成代码和 lock 文件测试文件可视情况纳入最大上下文长度单条问题能携带多少上下文太大成本高太小判断不准先从默认值试严重级别阈值只有 high 才展示或 all 都展示先用 highest跑稳后再放开自动评论模式主动评论还是按需请求建议先打开按需请求减少评论区噪声第四步慢慢放宽。一轮跑稳后再纳入第二个仓库、测试文件、第三方依赖升级的审查。放宽时注意观察误报率是否上升。一个通用的 CI 接入思路类似于在 merge request 事件触发时执行一次审查分析任务并把结果通过机器人回写到评论区。伪代码结构如下review: stage: review script: - code-review-agent analyze --diff $MERGE_REQUEST_DIFF --output-format mr-comment rules: - if: $PIPELINE_SOURCE merge_request_event $CI_MERGE_REQUEST_TARGET_BRANCH_NAME main具体命令名和参数名以你选用的工具文档为准但这个结构能说明核心逻辑它只针对 merge request 事件运行只扫描 diff结果回填到对应 PR。4.3 在你的团队里怎么定义“AI 说得对”一个非常容易被忽视的问题你要怎么判断“AI 说得对”如果你只是让每个开发者凭感觉判断就会产生巨大的不确定性有人觉得 AI 指出的是真问题有人觉得是误报反复争论反而增加协作成本。我建议在接入前就定义一个简单的分级规范A 级确定有问题的风险点必须由人类 reviewer 人工确认。B 级建议类意见例如代码可读性、命名统一、抽取函数仅供参考不阻塞合并。C 级风格类建议可以由团队约定是否统一采纳不必逐条讨论。这套分级不复杂但能让 AI 输出从“额外噪声”变成“可处理的任务列表”。真正成熟的 AI 审查流程最后一定不是让 AI 直接阻塞合并而是让 AI 输出分级再由人类对高风险项做二次判断。5. AI 审查最常见的坑以及一套排查链路工具接入后一定会遇到一些问题。这里说一说实际团队接入 AI 审查时最常见的典型现象以及一个通用的排查链路。5.1 典型问题清单我把它们归类为几类高频问题问题一AI 完全不触发或评论为空。出现这种情况优先看配置层流水线事件是否匹配比如只在 merge request 事件触发。diff 是否为空比如目标分支和源分支没有差异。是否有文件大小或路径限制比如工具默认不扫描超过 2000 行的文件。上下文模型是否过于保守把全部建议都过滤掉了。问题二AI 只审了一部分文件漏掉了核心模块。先检查文件过滤规则。很多工具默认会忽略测试文件这可能是故意的但也可能让你漏掉测试代码本身的质量问题。另外如果文件改动过大超过模型可处理范围工具可能会压缩或跳过部分 diff。遇到这种 case可以先把大型 diff 拆小。问题三误报率特别高。这个是最常见的问题几乎每个团队都会遇到。原因通常是三类上下文不足模型只看到片段没看到上下游函数。框架不熟项目用了较冷门的框架模型训练数据里有类似语法但没有该框架的正确用法。提示词太开放你让模型“检查所有可能的问题”它就会把所有可疑之处全列出来误报自然爆炸。排查建议先回溯触发器看看高误报是否集中在某类文件、某个语言、某类变更模式。如果集中在某类就为这类场景单独调参数或排除。我的经验让 AI 从“尽量发现所有问题”转向“只发现高置信度问题”虽然单条评论的数量会骤减但整体可用性会大幅提升。5.2 一套四步排查链路当 AI 审查结果不符合预期时别急着换工具。先按这个顺序排查先看现象是完全没有输出还是输出全是噪声是只审了部分文件还是关键建议缺失现象决定了排查方向。再看输入diff 是否完整、有没有大量生成代码或二进制文件混入、源分支和目标分支是否选对。再看环境模型版本、上下文长度、仓库语言、是否使用缓存、CI runner 资源是否够用。再看参数扫描范围、文件过滤、严重阈值、最大上下文、输出模式。最后看工具边界工具是否支持你们的核心语言模型训练数据的知识截止时间是否早于你们使用的框架版本。这个排查链路的核心逻辑是**先确定是整个系统没工作还是局部场景不工作再确定是输入问题、环境问题还是配置问题最后才考虑工具能力不足。**一上来就怀疑工具不行容易漏掉自己输入侧的问题。5.3 怎么防“AI 幻觉”影响团队信任AI 审查一旦出现几次“自信的误报”团队对它的信任度会下降得非常快。一个很常见的恶性循环是AI 提了一条看似专业的建议开发者真去改了结果引入新问题从此人人都不看 AI 评论。避免这个问题有三个具体方法要求模型引用上下文。在提示词里要求输出必须引用代码行号和片段纯泛泛的结论不要显示。只展示高置信度问题。宁可少报也不要乱报。保留人类复核循环。高风险建议需要至少一个人确认确认后可以给工具标注“正确”或“误报”让工具在后续迭代中学习你们团队的判断标准。6. 未来判断代码审查不会消失但会重新分层看到这里你可能会问那 AI 到底会不会让“代码审查”这个岗位消失我的判断是不会消失但它会重新分层而且这种分层已经在发生。6.1 从一条主线到三层架构未来成熟的代码审查体系我认为会是一个三层架构第一层机器自动规则层。这一层处理已知规则权限检查、格式统一、依赖漏洞、覆盖率门禁、单元测试执行。它们的特点是确定性高可以直接作为门禁。第二层AI 辅助分析层。这一层处理不完全确定但可提示的问题边界条件、潜在空指针、重复模式、代码一致性和可读性建议。它们的准确性较高但不保证正确需要人类复核。第三层人类评审层。这一层负责业务意图、架构合理性、长期演进、团队知识传播。AI 可以提供信息和候选方案但最终判断必须由人来做。这个分层意味着代码审查的“重活”正在从人身上移开但“判断活”反而更加集中在人身上。以前一个高级工程师需要花时间看大量重复代码才能找到真正的问题以后他可以让 AI 先把低层次问题筛一遍自己直接看到最难、最模糊、最需要业务判断的节点。6.2 对开发者和团队意味着什么第一普通开发者的基础审查能力仍然重要。AI 可以帮你找到可能有问题的地方但如果你不理解为什么这里是问题你仍然无法判断 AI 是否正确。AI 并没有降低对开发者理解力的要求它反而提高了审查结论的判断要求。第二团队需要重新定义“审查完成”的标准。以前一个 PR 有 2 个 Approve 就算完成。以后可能是机器规则通过、AI 高置信度项已确认或解释、人类 reviewer 对业务意图和架构确认过。这个标准更严格也更合理。第三知识传播方式会被改变。费根检查时代知识传播靠全场人一起读代码。PR 时代靠评论区和讨论记录。AI 时代AI 可以先解释代码但真正深层的业务知识和架构决策还是需要从有经验的人传给新来的人。也就是说代码审查在工程资产之外依然是团队最重要的一类“口传文化”载体。6.3 哪些团队适合先上 AI 审查哪些不适合为了让这篇文章不只停留在趋势判断我把适用边界再说透一些适合先尝试 AI 审查的团队已有 Git 工作流和 CI代码托管在 GitHub/GitLab 等平台。远程或分布式协作reviewer 上下文切换频繁。新人比例高提交的 PR 经常有低级问题。项目使用的主流语言和框架在训练数据里覆盖度高比如 Python、TypeScript、Java、Go。不适合一上来就大规模使用 AI 审查的团队安全关键系统。这类系统要的是确定性和可追溯性AI 的“自信误报”会干扰流程。高度定制、内部框架极多且文档很少的老项目。AI 对项目内部约定理解有限很容易给出“看起来正确但实际不适合”的建议。团队还没有基础审查文化。如果团队连人审 PR 都只是走过场引入 AI 只会增加噪声而不是提升质量。从工程经验看AI 审查工具是一种“能放大团队现有流程质量”的工具团队审得好AI 是助力团队审得差AI 只是多一个吵闹的评论者。回到开头那个朋友的故事。他现在的工作状态已经变成了这样提交 PR 后AI 机器人先给出一轮分析他会先看高置信度提醒再自己过一遍思路然后把最有争议的判断留给同事。代码审查没有消失但它终于不再是一件需要靠人硬扛注意力的苦差事而变成了一套人与机器各管一段的协同流程。如果你也想在团队里引入 AI 辅助代码审查我的建议很简单先挑一个最痛的场景拿 10 个历史 PR 做一次小样本验证用两周时间观察误报率再决定要不要扩大范围。先跑通再闭环最后再谈规模化。这条路看起来慢但它最能帮你建立起对 AI 审查这项技术的真实体感也最容易在团队里建立长期信任。