在微软,我们一直在寻找提高开发人员生产力和代码质量的方法。在这一领域,我们最具影响力的创新之一是 AI 驱动的代码审查助手 —— 一款增强拉取请求(PR,pull request)审查的 AI 工具。这款 AI 助手最初只是一项内部实验,如今已扩展到支持公司内超过 90% 的 PR,每月影响超过 60 万个拉取请求。它帮助我们的工程师更快地发现问题、更早地完成 PR,并执行一致的最佳实践 —— 所有这些都在我们标准的开发工作流程中进行。我们是与开发部门的数据和 AI 团队密切合作开发出这一功能的。内部积累的经验和知识被融入到 GitHub 的 AI 驱动代码审查服务中,现在让外部客户也从中受益。这是一个很好的例子,说明第一方(1P)创新如何塑造了第三方(3P)产品,以及外部使用如何持续为内部改进提供信息。

用 AI 解决 PR 审查中的实际问题

  拉取请求(PR)是开发工作流程中的关键部分,但也存在一些问题。审查人员常常把时间花在低价值的反馈上,比如语法问题或命名不一致,而更有意义的问题 —— 如架构决策或安全影响 —— 可能被忽视或延迟处理。另一方面,作者可能难以提供足够的背景信息,特别是当 PR 规模较大或涉及多个文件时。还有规模方面的挑战:面对成千上万的开发人员和代码库,确保每个 PR 都能得到及时、彻底的审查并非易事。我们曾见过 PR 等待数天甚至数周才被合并,或者重要反馈被遗漏的情况。这些痛点促使我们尝试在审查过程中引入 AI 辅助。目标是让 AI 处理审查中重复性的或容易被忽视的方面,让人类审查人员能够专注于更高层次的问题。

  我们的解决方案是将 AI 代码审查器集成到现有的 PR 工作流程中。每当创建一个拉取请求时,AI 助手会自动作为审查人员之一参与进来。它的功能如下:

  - 自动检查和评论:AI 审查代码变更,并像人类审查人员一样留下评论。它会标记一系列问题 —— 从简单的风格不一致和小错误,到更微妙的问题,如潜在的空引用或低效算法。例如,如果开发人员引入的一个方法没有妥善处理错误情况,AI 可能会在特定的差异行上给出警告并附上解释。这些评论会出现在 PR 讨论线程中,因此作者和其他审查人员都能看到并采取行动(就像同事发表的意见一样)。每个建议都有一个相关类别,例如异常处理、空检查、敏感数据等,这有助于理解相关影响。通过及早发现这些问题,AI 减少了人类同行的审查负担,并确保明显的问题不会被遗漏。

  - 建议改进:除了审查之外,助手甚至会提出具体的代码改进建议。如果它识别出一个 bug 或不理想的代码模式,会提出更正后的代码片段或替代实现方案供作者采用。虽然它功能强大,但也设计了安全保障措施。当 AI 建议代码更改时,不会直接提交。作者仍拥有控制权 —— 可以审查、编辑建议,并通过明确点击 “apply change” 选项来决定是否接受建议。所有更改都会记录在提交历史中,以保持问责制和透明度。

  - PR 摘要生成:AI 还会生成 PR 摘要 —— 本质上是 AI 撰写的对代码变更内容的描述。这解决了一个常见问题,即许多 PR 没有完善的描述。AI 会查看差异,并尝试解释变更的意图,突出关键变更。审查人员发现这非常有用:它帮助我们了解整体情况,而无需手动解读每个文件。

  - 交互式问答(“询问 AI”):审查人员还可以在 PR 讨论中与助手进行对话。如果代码中的某些内容不清楚,审查人员可以向 AI 询问有关代码的问题或请求阐明。例如,“为什么这里需要这个参数?” 或者 “这个变更对模块 X 有什么影响?”AI 可以分析代码并提供答案,就像一个随叫随到的知识渊博的共同审查员。

  AI 审查器之所以有效,关键在于它能自然地融入现有的工作流程。它就像其他任何审查人员一样 —— 无需学习新的用户界面,无需安装额外的工具。开发人员可以在 PR 线程中与它进行对话式交流,感觉就像团队中一个无缝的延伸部分。它甚至可以配置为在 PR 一创建就自动参与,作为第一个审查人员 —— 随时待命,随时准备就绪。这种无摩擦的集成是其获得高采用率和产生巨大影响的关键。

对质量和速度的影响

  AI 审查器的采用和影响是显著的。其带来的一些好处如下:

  - 更快的审查周期:由于 AI 对每个 PR 进行初步审查,团队发现完成拉取请求的总体时间有所减少。根据早期实验和数据科学研究,5000 个采用 AI 代码审查器的代码库,其 PR 完成时间中位数提高了 10 - 20%。AI 通常在 PR 创建后的几分钟内就能发现问题并提出改进建议,这意味着作者可以及早解决这些问题,而无需等待人类审查人员的时间安排。这也意味着对于小的修复,来回沟通的次数减少,因此 PR 可以更快地获得批准和合并。

  - 更高的代码质量:它通过在各个方面提供有关编码标准和最佳实践的指导,帮助提高代码审查的基准质量。在很多情况下,AI 标记出了可能被忽视的错误 —— 例如,发现缺失的空检查或顺序错误的 API 调用,这些都可能导致运行时错误。通过在代码合并前发现这些问题,我们防止了下游可能发生的潜在事故。

  - 开发人员学习:它可以像一位导师一样,审查每一行代码并解释可能的改进。特别是对于新员工,它可以作为有用的指南,加速他们的入职过程和对最佳实践的学习。

定制化:为团队量身定制审查

  其提供的一个强大功能是可配置性和可扩展性。团队可以自定义体验,以提供特定于代码库的指导原则。此外,团队还可以定义特定于其场景的自定义审查提示。公司各团队正在利用这些定制功能进行专门的审查,例如根据历史崩溃模式识别回归问题,或确保具备发布和变更管控。

第一方和第三方解决方案的协同进化

  一个很自然的问题是:微软内部的 AI 审查如何惠及更广泛的开发社区?作为 AI 驱动代码审查的首批采用者和内部测试者,我们很早就有了相关经验,能够根据工程团队的直接反馈,快速迭代改进审查质量、可用性和开发人员信任度。内部获得的见解、模式和成功案例不仅验证了 AI 辅助审查的价值,还有助于定义诸如内联建议和人机协作审查流程等体验。这个反馈循环对 GitHub 推出 Copilot 拉取请求审查功能起到了重要作用,该功能于 2025 年 4 月全面上市,为全球数百万开发人员带来了这些创新。

  同时,使用 GitHub Copilot 进行拉取请求审查所收集到的经验教训正被整合到微软的内部开发流程中。这种协同演进确保微软的开发人员和更广泛的开发社区都能从代码审查领域的 AI 进步中受益。

最终思考

  AI 驱动的代码审查是推动我们大规模改变代码审查方式的催化剂。通过将大型语言模型的力量与人类工作流程的严谨性相结合,它使开发人员能够更快地编写更好的代码。审查人员获得更深刻的见解,作者得到可操作的反馈,团队能够更有信心地前进。

  而这仅仅是开始。随着在定制化和质量方面的持续投入,AI 有望重新定义微软的开发人员体验。展望未来,我们专注于加深其上下文感知能力 —— 引入特定于代码库的指导、参考过去的 PR,并从人类审查模式中学习,以提供更符合团队规范和期望的见解。这将使审查人员能够完全专注于高价值的反馈,而 AI 处理主要的常规检查,从而简化审查流程,提高速度和一致性。这是一个我们所期待的未来 —— 在 AI 的全程支持下,发布高质量代码变得更容易、更快速。

  无论您是在微软,还是在更广泛的开发社区中贡献力量,AI 都能帮助您更智能地编写代码。尝试 GitHub Copilot 的代码审查功能,将 AI 融入您的工作流程吧。

原文链接:https://devblogs.microsoft.com/engineering-at-microsoft/enhancing-code-quality-at-scale-with-ai-powered-code-reviews/

 

【译】借助 AI 驱动的代码审查,大规模提升代码质量的更多相关文章

  1. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

    随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...

  2. 程序员的恶性循环:加班->没空学习->老是写同等水平代码->无法提升代码质量->老是出BUG->老是需要修改->加班->...

    程序员的恶性循环:加班->没空学习->老是写同等水平代码->无法提升代码质量->老是出BUG->老是需要修改->加班->...

  3. 我是如何在公司项目中使用ESLint来提升代码质量的

    ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...

  4. PHP之提升代码质量36计

    转载:https://www.binarytides.com/35-techniques-to-enhance-your-php-code/ 1.不要使用相对路径 常常会看到: require_onc ...

  5. 为了增强团队的协作和高效开发,提升代码质量,TGideas团队一起制订的代码规范。主要包括五部分内容:PC规范、移动端规范、性能优化、CP规范、其他项目规范

    http://tguide.qq.com/main/index.htm

  6. AI驱动的超分辨技术落地实践

    近年来,随着深度学习技术的快速发展,基于AI的超分辨技术在图像恢复和图像增强领域呈现出广阔的应用前景,受到了学术界和工业界的关注和重视.但是,在RTC视频领域中,很多AI算法并不能满足实际场景下的应用 ...

  7. 微软发布云端基因服务:推动AI驱动的精准医疗

    微软发布云端基因服务:推动AI驱动的精准医疗 2018年03月07日 00:00:00 微软研究院AI头条 阅读数:117    版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  8. 迈入 8K 时代,AI 驱动超高清 “视” 界到来

    2021 年,超高清迈入 "8K" 时代.超高清视频将带来全新视听体验,但超高清生产在内容生产层面也面临着超高清存量少.生产设备更新换代慢.制作周期成倍增加的困境.在 7 月 10 ...

  9. NPC AI驱动最基本过程

    NPC AI驱动最基本过程 NPCmgr中比较重要的是加载NPC和一个NPCAI的一个指针 他利用map那个线程的定时到底做了啥呢 void NPCmgr::npcAITimer() { time_t ...

  10. 痞子衡嵌入式:在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺. 恩智浦 MCU SE 团队近期一直在加班加点赶 SBL 项目 ...

随机推荐

  1. 学习nodejs的一点笔记

    >>1.模块:一个文件即为一个模块 1)global可以声明全局变量 (跨模块) 例如:global a = 100; console.log(global.a);   //输出100 2 ...

  2. Python3循环结构(二) while循环

    Python3 while循环 当循环次数无界时通常会使用while循环. 1.使用while循环输出九九乘法表 i=1 while i < 10: j = 1 while j < i + ...

  3. 【经验】C++通过文件句柄获取文件路径(两种方式)

    方法一 主要参考博客:根据文件句柄获得文件名(这篇超级清晰,就是有一点点小问题) 通过文件句柄获得文件路径(这篇不是很好用,但是思路大体是一致的) 主要思路: 根据HANDLE 创建映射文件,调用Ge ...

  4. 数据库问题之“字符编码问题 Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x81\xE7\x88...' for column 'product_name' at row 41”

    1)表1和表2的产品名称[数据库字段]字符编译方式不一致 ①问题 org.springframework.jdbc.UncategorizedSQLException: Error updating ...

  5. SQL 强化练习(三)

    继续来练习 sql 查询, 似乎也没有什么窍门, 跟着写多了, 自然就记住了, 这个帖子, 来记录一波, 模糊查询 like; 四表关联查询: 老师名 -> 老师id -> 课程id -. ...

  6. codeup之 查找学生信息

    Description 输入N个学生的信息,然后进行查询. Input 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息格式如下: 01 李江 男 21 0 ...

  7. 乒乓球测距(K210)

    测距 说明 识别的物体是乒乓球(规格应该是统一的吧), 硬件是K210,测距的函数经过拟合,在50cm范围内是准确的 如果使用起来不准确,可以打印代码中的LM, 然后去测数据,自己再拟合一个函数,代替 ...

  8. 「Log」做题记录 2023.11.27-2023.12.31

    \(2023.11.27-2023.12.3\) \(\color{black}{P6965}\) 2-sat 是显著的. 对于无问号串,直接否定向自己连边即可,然后塞到 Trie 树里. Trie ...

  9. Flask之model以及缓存

    Flask默认并没有提供任何数据库操作的API. Flask中可以自己的选择数据,用原生语句实现功能,也可以选择ORM(SQLAlchemy,MongoEngine)原生SQL缺点 代码利用率低,条件 ...

  10. ChatMoney智能知识库让你轻松工作!

    本文由 ChatMoney团队出品 为了增强企业内部知识的传递和共享效率,最近花了两周时间测试Chatmoney知识库 +企微客服助手模式,测试效果让我很惊喜! 对话引用知识库内容,Chatmoney ...