Ohhnews

分类导航

$ cd ..
Jetbrains Blog原文

代码质量一成不变?AI是否正在挑战这一观念

#代码质量#人工智能#静态分析#游戏开发#qodana

本文改编自 Kai Schmithuesen 在 JetBrains 游戏开发日 2026 上的演讲。请在下方观看完整的视频演示和问答环节,或继续阅读!

目录

[LOADING...]

首先,我们将定义我们所说的代码质量是什么意思,然后看看它如何影响业务成果,AI 在其中的作用,AI 对质量的影响,以及如何在你的团队中保障质量。

你可以将本文所述的方法论应用于许多解决方案,但我们还将探讨一个 Qodana 的示例。

代码质量是一个有时容易被忽视的话题,尤其是在游戏开发中,你可能还有其他问题需要处理。然而,在游戏开发会议上与许多 JetBrains 客户交流时,大家都意识到这是一个重要的话题。话虽如此,游戏行业并没有一套行业最佳实践,因此我们在本次演讲中分享了一些来自其他行业的最佳实践。

我们所说的代码质量是什么意思?

对于如此重要的话题,这个定义可能有些"模糊"。如果你和十位同事交谈,可能会得到许多不同的答案。第一点是正确性。

正确性:我的代码是否做到了我设计它要做的事情?

性能:对游戏来说很重要,它足够快吗?

稳定性:它会崩溃还是不崩溃,从玩家的角度来看它有多稳定。

安全性:同样重要,你肯定不希望因为被黑客攻击而登上行业新闻。

可维护性:我的代码今天能正常工作,几年后还能正常工作吗?尤其是有些游戏会持续运营 10 到 12 年。

可复用性:这个话题对大型工作室来说越来越重要——我能否将已经开发的代码复用到其他项目中?所有这些都为你提供了一个关于代码质量涵盖内容的概览。 [LOADING...]

如果你去 X 或 LinkedIn 这类"西部荒野"看看,你会发现代码质量是否重要是一个争论激烈的话题。从有人说他们不在乎代码看起来怎么样,到另一个极端"我的代码在发布前必须美观无瑕",以及介于两者之间的各种观点。外面有大量不同的意见。

Qodana 团队认为,代码质量可以对你的业务以及你的游戏如何被接受产生真正的影响。曾有一家 3A 工作室在发布一周后市值损失了 33%。

仅仅是修复两个小的代码缺陷,就将 GTA 的加载时间缩短了 70%。加载时间从 6 分钟缩短到 2 分钟(由一位玩家实测),而《黑暗之魂》因为存在远程代码执行漏洞(安全问题)而停服了 2 个月,如果你在这两个月里流失了玩家,他们很可能不会再回来,这对收入有实实在在的影响。糟糕的代码不仅仅停留在你这边,它会落到你的玩家手中,从而导致退款、差评。 [LOADING...]

当我们看 IGN 或 PC Gamer 时,质量、bug、稳定性,总是会影响评分。这最终决定了你能吸引多少玩家,而满是 bug 的游戏会导致玩家不满。有一些大型工作室能够侥幸逃脱,比如 Bethesda,但这是你不应该冒险的事情。

为什么糟糕的代码会被发布?

在很多对话中,我们发现仅仅是让游戏上市的压力就极其巨大。排期是一个真正的问题,这反映在不得不经历赶工或加班加点的游戏开发者数量上——超过一半。这促使许多工作室思考如何利用 AI 来帮助解决这个问题。

AI,尤其是在游戏开发领域,是一个讨论激烈的话题。然而,95% 的 Unity 开发者(2026 年 Unity 游戏开发者报告)在工作中使用它来辅助编码过程,这表明 AI 如果使用得当,可以是一个有用的工具。

你可以更快地进行原型设计,尝试新的游戏机制等等。过去你需要花费几个月时间,现在你可以用几天时间,把行不通的东西扔掉。你不必在样板问题上花费太多时间,从而提高效率。 [LOADING...]

目标不是把开发者从团队中裁掉,而只是让你的团队能够使用 AI 去做一些更有趣的事情。然而,这种速度以及对 AI 的使用在代码质量方面也带来了潜在的弊端。AI 可以非常快地生成大量代码,代码本身不一定更好或更差,但确实会放大问题的数量。过去你可能写了几百行代码。现在,在同样的时间内 AI 可以写 10,000 行。这会导致现实中的问题,例如:

缓慢的代码,我的游戏在性能方面是否达标,它是否稳定?它是否可被利用,或者是否有潜在的安全问题?好消息也是坏消息的是,AI 代码不一定比人类生成的代码更差,在问题总量上似乎相当,但它的出错方式与人类生成的代码不同。

在逻辑和错误方面,它产生的问题比人类生成的代码多 1.7 倍。在可维护性等方面,它表现更差,而最令人担忧的是,它还可能比人类开发者产生更多的安全问题。这来自 CodeRabbit 的一项研究。他们本身就是一家 AI 供应商。 [LOADING...]

然而,关键并不一定是谁(人类还是 AI)产生了什么类型的问题,我们提出的唯一问题是:"我们的代码整体上是否达标,是否符合我们的质量标准",而这正是静态分析可以发挥作用的地方。好消息是,你可以使用静态分析来基本覆盖这全部 6 个领域。

使用静态代码分析为游戏开发者解决问题

在正确性方面,你有标准的检查。你还可以检查代码覆盖率阈值,这一点正变得越来越重要。不仅仅是覆盖率本身,还有如何使用它们。

性能是静态分析可以覆盖的一个领域。稳定性方面,几个例子包括空安全、资源泄漏、异常检查、安全检查以及软件成分分析——检查过时的依赖项,或者作为静态分析的一部分进行污点分析,以发现更复杂的问题,如 SQL 脚本注入等等。

从可维护性的角度来看,你可以定位代码异味、代码复杂度和重复。这是 AI 非常出名的方面。它喜欢重复,但不喜欢重构。如果你没有一种方法来控制它,这真的会损害你未来的可维护性,因为到了某个阶段没有人能理解你的代码。

可复用性也是如此,重复代码会让事情变得更复杂,而静态分析可以检查你的代码是否遵循你自己的内部编码标准,以便无论你在做什么项目,都能采用相同的方法。这样你也能更容易地共享代码。

AI 会产生这类问题,最常见的原因是它是在过时的资源上训练的。这些资源都被榨干了,没有多少新内容出现,这可能导致过时的依赖项和类似问题。

将静态分析与 AI 结合使用作为解决方案

[LOADING...]

缺点在于,这类分析已经存在很长时间了,但这是有充分理由的。其中之一是结果是确定性的。

如果你给静态代码分析工具分析十次,它会给你十次相同的结果集。如果你运行它十次,也不会花费更多,因为它不消耗任何 token。如果你给 AI 同一段代码 10 次,你会得到 20 个答案。

它既快速又便宜,如果你将 AI 审查员与静态分析进行比较——通常静态分析要快得多。回到确定性这一点,你可以将每个结果与特定的检查关联起来,看看它为什么是一个问题。

随着合规要求不断增长,这一点将变得更加重要。一个重要的例子是新的欧盟《网络韧性法案》,已在某些领域生效。该法案的一部分要求你创建软件物料清单。如果你使用 AI,这将很困难。如果你使用静态代码分析,并且能够展示结果与源代码之间的一一对应关系,你就更有可能合规。然而,两者各有利弊。

静态分析与 AI 分析的利弊

它无法理解你代码的意图,因为它基本上是寻找模式。这就是 AI 发挥作用的地方。如果你想检查代码是否跨文件或跨项目实现了你想要的功能,或者检查与逻辑相关的问题,那就是 AI 发挥作用的地方。

因此,理想情况下,你会结合使用静态分析来覆盖基础,再在其上叠加 AI。由人类编写代码,AI 也可以编写一些代码。然后一旦你启动流水线,静态分析就覆盖初始分析。Qodana 可以检查任何问题,也可以自动创建快速修复。因此,即使没有 AI,你仍然可以实现自动化。

这些快速修复不是由 QIA 生成的,因此这给了你静态分析的一般优势:快速、不产生额外费用、可靠。然后你将转向你选择的 AI 工具,审查其余部分,并为其他复杂问题(如逻辑问题或重构)创建修复方案。这可以补充你的流水线。

理想情况下,你就有了一个循环,AI 会将其推回流水线交给你的静态分析,以便静态分析可以重新确认 AI 创建的内容是否达标,是否通过了你的代码质量和安全标准。然后你就可以将代码合并到主分支。

这听起来很耗时,但讽刺的是,这每次可能只需几分钟,并且可以在未来为你节省时间。这几分钟可以避免以后出现未捕获的问题时花费数小时。

数据怎么说?

已经有一些研究显示了这种方法的优势。如果你将静态分析与 LLM 调用结合使用,那么 token 使用量下降了 72% 到 92%,同时该研究中使用的代码量还在增加。第二项研究发现,如果你使用这种组合,那么进入主分支的 LLM 代码中的漏洞可以减少多达 33%。 [LOADING...]

这里有一个快速示例,展示这在 Qodana 或你选择的其他静态分析工具中会是什么样子。我们开箱即用地支持最常见的游戏引擎。这就是 Qodana 本身界面的大致样子。通常作为开发者,你不会在这里花太多时间。这对团队负责人或项目经理来说很不错。Qodana 团队的某位成员用氛围编程(vibe-coding)方式构建了下面这个示例项目。它是一个用 Java 编写的银行前端,仅氛围编程部分就只用了几分钟就让它运行起来了。 [LOADING...]

观看 Qodana 演示

Qodana 发现了 126 个问题,并为你提供了一种很好的方式,让你快速了解哪些是重要的。然后你可以对它们应用快速修复。有不同的方式来设置这一点(自动化程度各不相同)。

这里我们将其作为 GitHub Actions 流水线的一部分来完成。然后我们将剩余的问题放入基线(Baseline)中。一旦它们进入基线,它们就不会拖慢你的进度。下次你用 Qodana 运行扫描并发现新问题时,理想情况下它会自动修复 3 个,而你只会看到 2 个新问题。这样就更容易弄清楚如何分配你的时间。

如果我们看看剩下的五个问题,你可以看到有些显示为重复代码。虽然你可以从 Qodana 中查看它们,但你不能从这里修复它们。因此,如果我们在 IntelliJ IDEA 中打开它。你可以看到它把我们带到了 IntelliJ IDEA 代码库中的确切位置。

这对我们的 IDE 有效,不过它也适用于 Visual Studio、Visual Studio Code 和 Cursor。你也可以使用我们的 CI 工具。在这里你可以查看问题,比如重复代码,通过将鼠标悬停在其上(取决于你的解决方案),然后转到更多操作、AI 操作,让 AI 为你修复这些问题。 [LOADING...]

你可以手动完成,也可以使用代理(agent),半自动化地完成,让它在后台运行,你在另一端等待干净的代码。如果你有兴趣了解更多,请联系我们,我们可以向你展示如何使用它,或者你和你的团队可以免费试用。

试用 Qodana

用户们也尝试将 Qodana 用于游戏开发。阅读 Doc Bok 如何在 Minecraft 游戏中使用 Qodana——或者了解 Qodana 如何在 Unity 和 Unreal Engine 项目上运行。

[LOADING...]

一旦你让 AI 添加测试,最终这些测试和所有仓库开始溢出,甚至像 linting 这样的琐碎过程也会滞后。你有这方面的经验吗?

在某些情况下,你必须绕过十个不同的环节才能发布代码。大多数时候,这是因为有人开了个头,但从来没有人审查过流水线,哪些有意义、哪些没有,但静态分析不应该拖慢你的速度。因此,在 Qodana 中,所谓的拉取请求模式只检查更改过的文件,应该只需要一两分钟。

IDE 中 JetBrains 内置的代理能在多大程度上读取 IDE 的静态分析工具?

Rider 有一个名为 Hooks 的功能。每当代理生成代码时,它会调用 Rider 中的 Hooks。其中一个会重新格式化代码,另一个会检查文件中的当前问题,执行 linting,检查问题并报告回代理,然后代理可以使用你的标准重新生成代码,或者只修复你要求它处理的内容。它是确定性的,因此代理被强制使用这些钩子,而不是被建议使用。钩子会在每次时被启用并执行。

请注意:广泛采用的 AI 技术相对较新,对于新兴数据的结论,包括本文中呈现的数据,始终应进行深入审视。

特别感谢 Kai 分享他的洞见。