AI 编程助手在 2025 年成了游戏规则改变者,但有效驾驭它们需要技巧和结构。这些工具极大地提升了 LLM 对真实编码能做的事,很多开发者(包括我)都拥抱了它们。在 Anthropic,工程师如此重度采用 Claude Code,以至于今天 Claude Code 约 90% 的代码是它自己写的。然而,用 LLM 编程不是一个按钮魔法体验——它"困难且反直觉",要拿到好结果需要学习新的模式。批判性思维仍然是关键。经过一年多项目,我收敛到一个和许多有经验开发者正在发现的工作流相似的东西:把 LLM 当作一个强大的结对程序员,它需要清晰的方向、上下文和监督,而不是自主判断。
在这篇文章里,我会分享 2026 年我如何规划、编码和与 AI 协作,提炼我自己经验和社区集体学习的技巧与最佳实践。这是一种更自律的"AI 辅助工程"方法——激进地利用 AI,同时对产出的软件保持问责。
从清晰的计划开始(先规格后代码)
别把愿望直接扔给 LLM——先定义问题、规划解决方案。
一个常见错误是带着模糊提示直接进入代码生成。我的工作流里(也是很多其他人的),第一步是和 AI 一起头脑风暴详细规格,然后列出逐步计划,然后才写任何实际代码。对新项目,我会描述想法,让 LLM 迭代地向我提问,直到我们把需求和边界情况都厘清。最后,我们把所有内容编译成一份完整的 spec.md——包含需求、架构决策、数据模型,甚至测试策略。这份规格构成开发的基础。
接下来,我把规格喂给一个带推理能力的模型,提示它生成项目计划:把实现拆成合乎逻辑的小任务或里程碑。AI 基本是在帮我做一次迷你"设计文档"或项目计划。我经常迭代这份计划——编辑、让 AI 批评或细化——直到它连贯完整。然后我才开始编码。这笔前置投入感觉慢,但回报巨大。就像 Les Orchard 说的,这等于做一次"15 分钟的瀑布"——一个快速的结构化规划阶段,让后面的编码顺畅得多。
有清晰的规格和计划意味着,当我们放出代码生成时,人和 LLM 都确切知道我们在构建什么、为什么。一句话:先规划逼着你和 AI 对齐,防止浪费循环。很多人想跳过这步,但有经验的 LLM 开发者现在把扎实的规格/计划当作工作流的基石。
把工作拆成小的迭代块
范围管理就是一切——喂给 LLM 可管理的任务,而不是一次整个代码库。
我学到的一个关键教训是避免向 AI 要大型整体输出。相反,我们把项目拆成迭代步骤或工单,一个一个地攻克。这镜像了良好的软件工程实践,但有人在循环里时它更重要。LLM 在收到聚焦提示时表现最好:一次实现一个函数、修一个 bug、加一个功能。比如规划之后,我会提示代码生成模型:"好,让我们实现计划的第 1 步"。我们编码、测试,然后进入第 2 步,如此类推。每块小到 AI 能在上下文里处理、你能理解它产出的代码。
在代码库上工作时,我确保把 AI 表现好所需的全部信息喂给它:它要修改或引用的代码、项目的技术约束、以及任何已知陷阱或首选方法。现代工具有帮助:Anthropic 的 Claude 可以在"Projects"模式下把整个 GitHub 仓库导入上下文;Cursor 或 Copilot 这类 IDE 助手自动把打开的文件包含进提示。但我经常更进一步——如果怀疑模型没有某些内容,我会用 MCP(如 Context7)或手动把代码库或 API 文档的重要部分复制进对话。
专家 LLM 用户强调这个"上下文打包"步骤。比如做一次"大脑倾倒"——把模型在编码前应该知道的一切倒出来,包括:高层目标和不变式、好解决方案的例子、以及要避免的方法的警告。如果我让 AI 实现一个棘手的方案,我可能会告诉它哪些 naive 方案太慢,或者从别处提供一个参考实现。如果我用一个冷门库或全新 API,我会把官方文档或 README 贴进去,这样 AI 不是盲目飞行。所有这些前置上下文都大幅提升输出质量,因为模型不是在猜——事实和约束就在它面前。
现在有工具可以自动化上下文打包。我试过 gitingest 或 repo2txt 这类工具,它们把你的代码库相关部分"倾倒"成一个文本文件给 LLM 读。处理大项目时它们是救星——生成一个关键源文件的 output.txt 包,让模型消化它。原则是:别让 AI 在残缺信息上运行。如果修一个 bug 需要理解四个不同模块,就展示那四个模块。是的,我们必须注意 token 上限,但当前前沿模型有相当大的上下文窗口。明智地使用它们。我经常只选任务相关的那部分代码,并明确告诉 AI 哪些不要关注(省 token)。
我们还没到让 AI agent 无人看管地编码整个功能并期待完美结果的阶段。相反,我以监督的方式使用这些工具:我让它们生成甚至运行代码,但盯着每一步,看到不对劲随时介入。还有 Conductor 之类的编排工具,让你在不同任务上并行跑多个 agent(本质上是规模化 AI 帮助的方式)——一些工程师在实验一次跑 3-4 个 agent 处理不同功能。我试过这种"大规模并行"方法;它能高效完成很多事,但监视多个 AI 线程也很费神!多数情况下,我一次只用一个主 agent,也许再加一个次要的做审查。
记住,这些是强力工具——你仍然控制扳机、引导结果。
保持人在循环——验证、测试、审查一切
AI 会很乐意产出看起来可信的代码,但你对质量负责——总是彻底审查和测试。我的一条基本原则是绝不盲目信任 LLM 的输出。就像 Simon Willison 精辟说的,把 LLM 结对程序员想成"过度自信、容易犯错"。它带着完全的自信写代码——包括 bug 或胡说——而且不会告诉你哪里不对,除非你抓到。所以我对待每一段 AI 生成的片段,都像来自初级开发者的代码:读一遍、跑一遍、按需测试。你必须测试它写的东西——跑单元测试,或手动演练功能,确保它真的做了它声称的事。
事实上,我把测试织进工作流本身。我早期的规划阶段经常包括为每步生成测试列表或测试计划。如果用 Claude Code 这类工具,我会指示它在实现任务后跑测试套件,有失败就调试。这种紧密反馈循环(写代码→跑测试→修复)正是 AI 擅长的——只要有测试存在。那些从编码 agent 获益最多的人,往往是有强大测试实践的人。Claude 这样的 agent 能在好测试套件作为安全网时"飞"过项目。没有测试,agent 可能心安理得地假设一切正常("当然,都好!")而实际上它已经弄坏了几处。所以,投资测试——它放大 AI 的用处和你对结果的信心。
即使超越自动化测试,做代码审查——人工和 AI 辅助都做。我例行暂停,逐行审查已生成的代码。有时我会开第二个 AI 会话(或不同模型),让它批评或审查第一个产出的代码。比如,我可能让 Claude 写代码,然后问 Gemini:"你能审查这个函数有没有错误或改进吗?"这能抓到微妙问题。关键是别因为代码是 AI 写的就跳过审查。如果有的话,AI 写的代码需要额外审查,因为它有时表面上令人信服,却藏着人类不会立刻注意的缺陷。
跳过人工监督的严重后果有据可查。一个重度依赖 AI 生成赶工项目的开发者,把结果描述为不一致的乱摊子——重复逻辑、错配的方法名、没有连贯架构。他意识到自己一直在"建、建、建",没有退后一步真正看看 AI 编织出了什么。解法是一次痛苦的返工,以及再也不让事情失控到那种地步的誓言。我记住了。无论我用多少 AI,我仍然是负责的工程师。
实际操作上,这意味着只有在我理解代码之后才合并或发布。如果 AI 生成的东西绕来绕去,我会让它加注释解释,或者用更简单的术语重写。如果有什么感觉不对,我深挖——就像人类同事贡献了有危险信号的代码那样。
当和一个能快速生成大量代码的 AI 工作时,事情很容易跑偏。我通过采纳超细粒度的版本控制习惯来缓解。我早提交、频繁提交,甚至比手工编码时更频繁。每完成一个小任务或每次成功的自动编辑,我就带着清晰消息做一次 git 提交。这样,如果 AI 的下一个建议引入 bug 或混乱改动,我有一个最近的检查点可以回退(或 cherry-pick),不会丢失几小时工作。一位实践者把它比作"游戏里的存档点"——如果 LLM 会话翻车,你总能回滚到最后一个稳定提交。这条建议非常有用。当你知道必要时可以用 git reset 撤销时,大胆的 AI 重构实验压力小得多。
正确的版本控制在和 AI 协作时也有帮助。既然不能指望 AI 记住它做的一切(上下文窗口限制等),git 历史就成了宝贵的日志。我经常扫最近的提交来给 AI(或自己)简报改了什么。事实上,LLM 自己能利用你的提交历史——我把 git diff 或提交日志贴进提示,让 AI 知道哪些代码是新的、之前状态是什么。有趣的是,LLM 非常擅长解析 diff 和使用 git bisect 这类工具找 bug 是哪里引入的。它们遍历提交历史有无限的耐心,能增强你的调试。但这只有在你一开始就有整洁的提交历史时才有效。
另一个好处:带好消息的小提交基本上记录了开发过程,做代码审查(AI 或人类)时有帮助。如果一个 AI agent 一次做了五处改动然后坏了,那些改动在单独提交里,更容易定位哪个提交导致问题。如果全在一个叫"AI 改动"的巨型提交里,祝你好运!所以我自律:完成任务,跑测试,提交。这也和前面拆小块的建议契合——每块最终成为自己的提交或 PR。
最后,别怕用分支或 worktree 隔离 AI 实验。我采用的一个高级工作流(受 Jesse Vincent 等人启发)是为新功能或子项目开一个全新的 git worktree。这让你能在同一个仓库并行跑多个 AI 编码会话而不互相干扰,之后合并改动。有点像给每个 AI 任务一个自己的沙箱分支。如果一个实验失败,丢掉那个 worktree,主分支什么都没丢。如果成功,合并进去。这个方法在比如"让 AI 实现功能 A,同时我(或另一个 AI)做功能 B"时至关重要。版本控制正是让这种协作成为可能的东西。一句话:频繁提交、用分支组织工作、拥抱 git,把它作为让 AI 生成的改动可控可逆的控制机制。
用规则和示例定制 AI 的行为
通过提供风格指南、示例甚至"规则文件"来引导你的 AI 助手——一点前置调校换来好得多的输出。
我学到的一件事是,你不必接受 AI 的默认风格或方法——你可以通过给指南来极大影响它。比如,我有一个定期更新的 CLAUDE.md 文件,包含 Claude(Anthropic 的模型)要遵循的流程规则和偏好(用 Gemini CLI 时类似的有 GEMINI.md)。内容包括"用我们项目的风格写代码、遵守我们的 lint 规则、不要用某些函数、偏好函数式而非 OOP"等。开始会话时,我把这个文件喂给 Claude 让它对齐我们的约定。让模型"保持在轨道上"的效果惊人地好——它减少了 AI 脱稿或引入我们不想要模式的倾向。
即使没有花哨的规则文件,你也可以用自定义指令或系统提示设定基调。GitHub Copilot 和 Cursor 都引入了让你为项目配置 AI 行为的特性。我利用过这个——写一小段关于我们编码风格的文字,比如"用 4 空格缩进、React 里避免箭头函数、变量名要描述性、代码要过 ESLint"。有了这些指令,AI 的建议会贴合人类队友可能写的东西。Ben Congdon 提到他惊讶于很少人用 Copilot 的自定义指令,考虑到它多有效——通过提前提供示例和偏好,他能引导 AI 输出匹配团队习语的代码。我附议:花时间教 AI 你的期望。
另一个强大技巧是提供行内示例——你想要的输出格式或方法。如果我想让 AI 以非常特定的方式写一个函数,我可能先给它看代码库里已有的相似函数:"这是我们实现 X 的方式,对 Y 用类似的方法。"如果我想要某种注释风格,我会自己写一条注释,让 AI 按那种风格继续。本质上,用模式引导模型。LLM 擅长模仿——给它们一两个示例,它们就会沿着那个方向继续。
社区也想出了创造性的"规则集"来驯服 LLM 行为。你可能听说过 "Big Daddy" 规则,或在提示里加"不许幻觉/不许欺骗"条款。这些基本是提醒 AI 诚实、不要过度编造不存在的代码的技巧。比如,我有时在提示前加:"如果你不确定某事或代码库上下文缺失,要求澄清而不是编造答案。"这减少幻觉。我用另一个规则:"修 bug 时总是在注释里简短解释你的推理。"这样 AI 生成修复时,也会留下"// Fixed: 改了 X 为 Y 以防 Z(按规格)"这样的注释。对后续审查超有用。
总结:别把 AI 当黑盒——调校它。通过配置系统指令、分享项目文档、写下明确规则,你把 AI 变成团队里更专业的开发者。类似给新人入职:你会给他们风格指南和一些入门提示,对吧?对你的 AI 结对程序员也一样。投资回报巨大:你得到需要更少调整、和你的代码库更顺滑集成的输出。