速度若无控制毫无意义:在 AI 时代如何保持高质量
Source: GitHub Blog
加速开发有什么意义,如果你不能信任自己交付的代码?
我们已经在工作流中使用 AI 有一段时间了,毫无疑问,日常开发的速度大幅提升。曾经需要数小时完成的任务现在几分钟就能结束。整个功能在你还没喝完早晨的咖啡时就已经搭建完毕。
但我们也体验到了这种速度的另一面:当 AI 在缺乏明确方向或防护措施的情况下使用时,它会产生所谓的 AI slop——缺乏上下文的半功能代码,悄悄堆积 bug、破损的 import 和技术债务。
在这个新纪元,仅仅快是不够的。精准和质量才是团队之间的差异化因素。
“最好的司机不是单纯跑得最快的,而是能够在高速下保持平稳和可控的,” GitHub 产品副总裁 Marcelo Oliveira 在 GitHub Universe 2025 说道。 “速度和控制不是相互妥协的关系,它们相互强化。”
那么,如何兼顾两者?如何在保持代码整洁、可靠且受你掌控的同时快速前进?以下是三条关键策略。
Tip #1: 将速度和质量视为一体
接受看似光鲜却隐藏潜在问题的 AI 生成代码很容易。没有质量的速度并不能让你更快交付,只会增加复合问题的风险。成功的团队会将 AI 驱动的高效与真实的防护措施相结合。
GitHub Code Quality(当前处于公开预览)是一款基于 AI 与 CodeQL 的分析工具,可在你编码时即时呈现代码库的可维护性问题、可靠性风险和技术债务。
一键启用
在仓库层面打开它,GitHub 将使用 CodeQL 与基于大模型的检测相结合,对你的代码进行分析,提供可维护性和可靠性问题的清晰视图。
在每个 Pull Request 中自动修复
只要打开 Pull Request,GitHub Code Quality 就会标记未使用的变量、重复的逻辑、运行时错误等。
问题代码示例
// fuelCalculator.js
export function calculateFuelUsage(laps, fuelPerLap) {
const lastLap = laps[laps.length - 1]; // unused variable
function totalFuel(laps, fuelPerLap) {
return laps.length * fuelPerLap;
}
// duplicated function
function totalFuel(laps, fuelPerLap) {
return laps.length * fuelPerLap;
}
return totalFuel(laps, fuelPerLap);
}
AI 生成的修复
-export function calculateFuelUsage(laps, fuelPerLap) {
- const lastLap = laps[laps.length - 1]; // unused variable
-
- function totalFuel(laps, fuelPerLap) {
- return laps.length * fuelPerLap;
- }
-
- // duplicated function
- function totalFuel(laps, fuelPerLap) {
- return laps.length * fuelPerLap;
- }
-
- return totalFuel(laps, fuelPerLap);
-}
+export function calculateFuelUsage(laps, fuelPerLap) {
+ if (!Array.isArray(laps) || typeof fuelPerLap !== "number") {
+ throw new Error("Invalid input");
+ }
+ return laps.length * fuelPerLap;
+}
无需人工分拣或减速——只有干净、可靠的代码。
强制质量门槛
规则集可以阻止不符合团队标准的合并,让质量保持一致,而不依赖审阅者的意志。
揭示(并修复)遗留技术债务
AI Findings 页面会突出显示团队已在处理的文件中的问题,帮助你在问题仍然新鲜时就进行修复,降低上下文切换的成本。
结论: AI 为你提供速度,GitHub Code Quality 为你提供控制。两者结合,让你在不做取舍的前提下更快、更好地构建软件。
了解更多关于 GitHub Code Quality 的信息
Tip #2: 成为司机,而不是乘客
AI 能快速生成代码,但质量从来不是仅靠自动化就能保证的。GitHub 提供了一系列工具——从 IDE 中的 Copilot 到 Pull Request 中的 Copilot 代码审查 以及 GitHub Code Quality——帮助你洞察长期存在的问题并提供可操作的修复方案。
这些功能让你能够设定方向、标准和约束。你的意图越清晰,AI 对你的支持就越精准。
Prompting 框架
-
设定目标,而不仅是动作
糟糕的提示:refactor this file更好的提示:
refactor this file to improve readability and maintainability while preserving functionality, no breaking changes allowed -
明确约束
- “不使用第三方依赖”
- “必须兼容 v1.7 版本”
- “遵循已有的命名规范”
-
提供参考上下文
链接到相关文件、文档、已有测试或架构决策。 -
决定输出格式
Pull Request、diff、patch、评论或代码块。
使用编码代理的多步骤任务
Create a new helper function for formatting currency across the app.
- Must handle USD and EUR
- Round up to two decimals
- Add three unit tests
- Do not modify existing price parser
- Return as a pull request
思考的责任仍在你身上,代理负责执行。
结论: AI 加速了执行,但只有你的清晰指令和 GitHub 的防护措施,才能把加速转化为高质量的软件。
Tip #3: 构建可见的思考证明,而不仅是输出
随着 AI 承担更多执行工作,优秀的开发者会通过清晰传达决策、权衡和推理来脱颖而出。仅仅写代码已经不够,你需要展示在整个功能生命周期中,你是如何思考、评估和处理问题的。
最佳实践清单
-
创建捕获 “why” 的 Issue
简要概述问题、成功标准、约束以及可能的风险。 -
用心命名分支和提交
使用有意义的名称和提交信息,叙述你的思考过程,而不仅是键入的操作。 -
使用 Copilot 与编码代理完成代码,然后记录决策
简短说明为何选择某种实现方式以及考虑过哪些备选方案。 -
打开包含丰富信息的 Pull Request
添加 “Why”、 “What changed” 与 “Trade‑offs” 部分,并可附上截图或测试说明。
示例
模糊的提交信息:
Added dark mode toggle
更丰富的上下文:
- Added dark mode toggle to improve accessibility and user preference support.
- Chose localStorage for persistence to avoid server dependency.
- Scoped styling changes to prevent side effects on existing components.
- Added unit tests for toggle state persistence and UI rendering.
通过在 “what” 之外记录 “why”,你为团队、未来的维护者以及自动化工具提供了一条透明的追踪路径,帮助他们理解并信任你交付的代码。