速度若无控制毫无意义:在 AI 时代如何保持高质量

发布: (2025年12月10日 GMT+8 01:00)
8 min read

Source: GitHub Blog

加速开发有什么意义,如果你不能信任自己交付的代码?

我们已经在工作流中使用 AI 有一段时间了,毫无疑问,日常开发的速度大幅提升。曾经需要数小时完成的任务现在几分钟就能结束。整个功能在你还没喝完早晨的咖啡时就已经搭建完毕。

但我们也体验到了这种速度的另一面:当 AI 在缺乏明确方向或防护措施的情况下使用时,它会产生所谓的 AI slop——缺乏上下文的半功能代码,悄悄堆积 bug、破损的 import 和技术债务。

在这个新纪元,仅仅快是不够的。精准和质量才是团队之间的差异化因素。

“最好的司机不是单纯跑得最快的,而是能够在高速下保持平稳和可控的,” GitHub 产品副总裁 Marcelo OliveiraGitHub 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 中的 CopilotPull Request 中的 Copilot 代码审查 以及 GitHub Code Quality——帮助你洞察长期存在的问题并提供可操作的修复方案。

这些功能让你能够设定方向、标准和约束。你的意图越清晰,AI 对你的支持就越精准。

Prompting 框架

  1. 设定目标,而不仅是动作
    糟糕的提示:

    refactor this file

    更好的提示:

    refactor this file to improve readability and maintainability while preserving functionality, no breaking changes allowed
  2. 明确约束

    • “不使用第三方依赖”
    • “必须兼容 v1.7 版本”
    • “遵循已有的命名规范”
  3. 提供参考上下文
    链接到相关文件、文档、已有测试或架构决策。

  4. 决定输出格式
    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”,你为团队、未来的维护者以及自动化工具提供了一条透明的追踪路径,帮助他们理解并信任你交付的代码。

Back to Blog

相关文章

阅读更多 »

基于 Dependabot 的 Go 依赖图

继续围绕供应链安全的主题,不断提升我们对 package ecosystem 的支持,Go 项目现在将看到更完整、更准确的 transitive …