大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!
代码审查是软件开发的基石。我们在这里分享知识、尽早发现错误并确保我们的代码符合最高标准。
但说实话…
传统的代码审查可能既运行又乏味,有时甚至会遗漏重点但关键的。进入人工智能代码审查时代,将会改变游戏规则,解决这些挑战将代码质量提升到新的高度。
本文深入探讨了代码审查的常见陷阱,并探讨了 AI 工具彻底改变开发生命周期的每个如何阶段。
我开发人员和审查人员的两个主要角度讨论AI在SDLC不同阶段的使用和影响。我具体讨论 AI在代码审查中的使用以及如何有效地实施它。我将提供在不同阶段使用的工具示例: Github Copilot、SonarQube、Qodo和IntelliJ。
AI代码助手生成代码
人工智能生成代码助手可根据您的输入自动生成代码,进一步发挥人工智能的强大功能。这可以大大减少编写代码所需的时间和精力,尤其是对于重复或样板任务而言。
生成的代码助手还可以帮助您在开始编码之前探索不同的设计选项并识别潜在问题。通过利用这些工具,您可以专注于软件开发的创意和战略性方面,而人工智能则处理繁琐和机械的任务。
人工智能采用
很多AI代码助手提供不同的功能,根据5种不同的分类具有不同的排名率:
虽然这些工具功能强大且丰富,但它们依赖于某处托管的模型,并且某些功能需要付费。本地免费开源方式…
还有其他完全完全开源的选项提供选择。此选项涉及托管模型以在本地或网络中生成代 码。您可以使用大量免费和开源模型,并且您只能通过在您的网络或本地机器上安装免费工具 Ollama 来提供这些模型。
我尝试过 IntelliJ 插件“ Continue ”、Ollama以及模型“codellama”和“deepseek-
coder”,体验一点也不差。使用此解决方案,您还可以确保您的代码和提示不会超出您的 范围。
但是,每个魔法都是有代价的。
虽然生成式人工智能前景广阔,但并非没有缺陷。一个主要问题是可能将错误和漏洞引入代码中。人工智能模型是在大量数据上进行训练的,如果这些数据包含错误或恶意代码,生成的代码可能会继承这些缺陷。
AI 生成代码正确性
另外,生成式人工智能系统可能无法完全理解其生成的代码库上下文或意图,从而导致输出没有意义甚至致命。另外,生成式人工智能可能无法使用完整的代码库上下文来生成与我们当前内容最一致的代码。对于开发人员来说,仔细审查和人工智能测试生成措施的代码并采用强大的安全来降低这些风险关键。
从这个全景图中可以清楚地看出,使用人工智能生成代码会产生负面影响,但同时对整个 SDLC产生负面影响,更重要的是对代码审查过程产生负面影响。
让我们关注传统的代码审查流程及其痛点。
传统代码审查之争:熟悉的痛点
我们都经历过这种情况。传统的代码审查虽然很有价值,但经常出现以下问题:
- 运行:手动审查每一行代码需要大量投入,尤其是对于大型项目而言。
- 预警性:“好代码”可能带有预警性,导致反馈不一致和潜在的突发。
- 遗漏问题:即使存在最有经验的人工审查人员也可能会遗漏漏掉的错误、安全漏洞或性能瓶颈。从我们上面看到的助手
在这方面的影响时间。
●风格注重:过分强调细小的风格问题会分散对更关键问题的注意力。 ● 背景不足:审查人员可能缺乏代码更改的完整背景,这使得提供有效的反馈变得更加困难。 ● 高认知负担:审查包含数百行代码的大型拉取请求甚至会让最有经验的开发人员不知所措。 ● 延迟反
馈:代码审查会减慢开发流程,影响时间表交付。 ● 团队摩擦:当由于背景信息缺乏而忽略了简单问题、出现过高反馈或出现不良功能测试时,代码审查可能导致团队摩擦,并可能升级为封闭。
人工智能:增强代码审查
人工智能工具正在通过自动执行复杂的任务、提供追踪反馈并发现隐藏的问题来改变代码审查。让我们探索这些工具如何在整个开发生命周期中提供帮助:
开发阶段(IDE集成)
我们已经看到多个代码助手插件和IDE可以帮助我们生成代码。多个基准测试
(huggingface、stackeval、Mike Ravkine的)可以帮助我们选择在这些助手中使用的模型。
因此,我们有适当的自动完成和代码生成工具,但如何验证生成的代码不会引入不适合代码库上下文的语言版本的问题、漏洞或解决方案呢?
对于这项任务,有以 IDE 代码检查器形式出现的静态分析器,例如 IDE 的 SonarQube,它可以在您编写的代码时提供即时反馈,或者 CI/CD 代码分析器,例如 SonarQube
Server/Cloud,将对您的代码进行全面分析并防止或允许被合并。
想象一下,在进行代码审查之前就可以发现潜在的错误和最佳实践。
这些 linter 使用静态分析和不同的功能,直接在您的 IDE 中检测代码异味、错误和安全漏洞,使您能够从
一开始就编写更干净、更安全的代码。
但是,这不仅包括错误和漏洞,还包括使用某些框架或语言版本的最佳实践。AI代码助手有时不能很好地了解您在代码库中使用的语言版本(例如Java 21),并且他们建议的解决方案没有考虑语言的最新改进,只是考虑简单最常用的方法。
在这种情况下,GitHub Copilot 并没有建议使用 7 年前推出的功能的方法。
由 Github Copilot 生成
public double calculateAverage(Collection<Integer> collection) {
int sum = 0;
for (Integer num : collection) {
sum += num;
}
return (double) sum / collection.size();
}
考虑到 Java 12 中引入的 Java 新 Teeing 收集器,采用手动方法,使用一致和语言级别的方法来迭代集合并终止延迟计算值。
public double calculateAverageManual(Collection<Integer> collection) {
return collection.stream().collect(
Collectors.teeing(
Collectors.summingDouble(i -> i), Collectors.counting(),
(sum, count) -> sum / count)
);
}
甚至不使用语言的最新特性。在这种情况下,虚拟线程是在一年半前在 Java 21 中引入的。
Github Copilot 使用平台线程生成的代码
new Thread(() -> {
var url = new URI("http://localhost:4000").toURL();
var connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
}).start();
使用虚拟线程的手动方法能够创建数千个线程,从而极大地提高阻塞操作的性能。
Thread.ofVirtual().start(() -> {
var url = new URI("http://localhost:4000").toURL();
var connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
}).start();
幸运的是,这些 linter 将会在我们的编码和 CI 完整分析期间警告我们缺乏最佳实践的使用。
某些 linter 最初于其他 linter(如 SonarQube IDE)的一个特别优势是它们,可以在同一个项目中同时分析多种类型的文件。这不仅包括 Java、Python、JScript、Kotlin 等编程语言,还包括 Docker、Kubernetes、Ansible、Terraform、CloudFormation 等云部署文件,甚至 Secrets 漏洞。
测试生成阶段
AI可以分析当前代码,尝试了解其用途,并生成可能生成测试代码的测试方法,从而保证高覆盖率。这有助于保证您的代码在发布之前经过彻底的测试。
在这个领域,我们可以找到Qodo Gen等专门用于测试生成的工具。
我已经将它安装在我的 IntelliJ IDE 中,并在我的 AI 项目中试用它。到快乐路径或边缘情况下的几个测试示例,结果令人印象深刻。与大多数代码助手一样,我们选择使用远程托管模型。
像 Qodo 这样的工具将采用类方法并创建其测试。我们将有一个仪表板来查看测试和执行情况,以及 Qodo 插件中的测试生成计划:
创建拉取请求
创建拉取请求的过程也很重要,以便于审核其人员提供适当的背景和详细信息。典型的工作流程通常意味着:
提交 ● 签署等待所有提交(请!) ● 创建具有完整描述的草稿拉取请求(有时遵循模板,例如JKube项目) ● 通过所有检查 ● 将PR状态更改为准备审核。
有几种指南(GitHub、pull request)可以帮助您编写良好的描述,但我们可以利用 AI 来实现这一点。因此我们可以使用的工具之一是 Github Copilot,它可以分析 PR 中的代码
以提供更详细的描述。
在这两张图片中,我们看到了如何要求 Github Copilot 为 PR 生成摘要。
我们还可以利用我们认为可以增加更多背景和帮助审阅者完成任务的细节来扩展这一点。
预代码审查(自动分析)
静态分析器(如SonarQube)会对您的代码库进行深入的静态分析,识别出人工审阅者可能遗漏的问题。这超出了样式检查,还将深入研究:
-
- 错误检测:识别潜在的NullPointerException、逻辑错误和其他错误。
- 安全漏洞:检测潜在的注入攻击、跨站点脚本(XSS)漏洞方法和其他安全风险。
- 代码异味:突出显示难以阅读、维护或理解的代码。例如,总计的复杂或重复的代码。
- 代码覆盖率:测量单元测试覆盖的代码总数,有助于确保全面测试。
这些分析器清晰且可操作地处理这些问题,并根据严重程度确定其优先顺序。
这样,开发人员就可以首先关注最关键的问题,从而使审查过程更加高效和有效。
前面的步骤与之前的 PR 工作流程联系起来,我们连接到存储库的工具可以帮助我们在任何人花时间审查代码之前检查所有可能导致代码失败的情况,从而只关注需要丰富的审查的工作更改。
Pull Request 变更说明
现在轮到审阅者了。他们应该首先阅读定义 PR 目标的草案。之后,仔细检查检查状态将使我们知道这些更改是否可以合并。
为此,我们可以使用多种工具。我尝试使用Github Copilot和Qodo PR-Agent (你可以您可以找到以下链接:
Copilot 为每个更改的文件提供了解释功能,而 Qodo 为整个 PR 描述。这将帮助审阅者了解创建评估文件的详细信息,并专注于需要更多关注的内容。局部 PR 处理所需的时间非常重要,而使用 AI 工具无疑可以帮助我们实现这一点。
修改建议
在 PR 中,审阅者会提出改进或修复文档部分内容的建议。这是一些至关重要的一点,如果处理不当,可能会增加团队成员之间的焦虑和困难。
为了确保作者和审阅者之间能够进行安全且有效的沟通,有一些指导方针。
一些AI工具,例如Qodo PR-Agent,还可以将AI代理建议的改进和更改直接从PR评审实现到代码中。
与所有更改一样,它们需要使用 SonarQube 等工具进行分析和检查。如果有任何问题,这些工具就会失效,从而阻止这些更改合并到主分支中。
利用人工智能应对挑战
以下是AI解决传统代码审查挑战的方法:
- 减少时间:自动化提高开发人员可以专注于更复杂、更创意的任务。也有助于减少了解所有变更范围所需的审核流程的认知负担。
- 侦听性:静态分析根据预定义的规则和最佳实践提供侦听、一致和确定性的反馈。
- 关注关键问题:优先级有助于审阅者关注最重要的问题。
- 增强相关内容:AI 读取变更并生成详细的 PR 描述以及对变更的详细解释,供审阅者参考。
结论
人工智能不会取代人类审阅者,而是会增强他们的能力。通过自动执行繁琐的任务并提供有价值的意见,人工智能工具将提高生成代码的速度和理解力。
静态分析器等工具将自动检查代码的合规性并保证整个 SDLC 的代码质量,使开发人员能够专注于他们最擅长的领域:设计、构建和创新。
通过利用人工智能工具,我们可以将重点从简单地查找错误转移到构建高质量、可维护和安全的软件。