人工智能工程在实践中的应用:人工智能工程师与现场部署工程师如何利用Claude Code、Codex及Gemini来进行开发工作
METR )。 DORA )。 Stack Overflow )。 Anthropic )。 目录 先决条件 什么是AI原生SDLC? 当代码开发成本降低后,瓶颈会出现在哪里? Claude Code、Codex与Gemini CLI:同一个框架,三种不同的工具/术语体系 如何开展规划阶段的工作 如何开展设计阶段的工作 如何开展构建阶段的工作 如何开展测试阶段的工作 如何开展部署阶段的工作 如何开展维护阶段的工作 一名工程师如何负责一个五人的团队 规划阶段 设计阶段 构建阶段 测试阶段 部署阶段 维护阶段 在全面采用AI原生SDLC之前,需要检查的事项清单 结论 接下来应该探索什么 先决条件
目录
先决条件
在开始之前,请确保您具备以下条件:
已安装至少一种AI编码工具:Claude Code、OpenAI Codex或Gemini CLI。只需安装其中一种即可。下面的内容会为您提供每种工具对应的命令或文件信息。
Node.js 18或更高版本(通过
node --version进行验证),因为这三款工具都是以npm包的形式提供的。Git 2.30或更高版本(通过
git --version进行验证)。一个启用了GitHub Actions功能的仓库,因为部署和维护阶段会使用CI工作流。
对CI/CD概念有基本的了解
:例如拉取请求、分支保护机制以及构建管道的功能。您不需要具备深入的GitHub Actions相关知识。
请安装您计划使用的工具:
npm install -g @anthropic-ai/claude-code
npm install -g @openai/codex
npm install -g @google/gemini-cli
以下是每种工具能为你提供的功能:
claude-code会在你的系统路径中添加一个claude命令,该命令会使用权限模式、子代理以及相关技能来针对你的本地代码库执行相应的操作。codex也会在你的系统路径中添加一个codex命令,它拥有自己的沙箱环境与审批机制,同时还支持在云端执行任务。gemini-cli会在你的系统路径中添加一个gemini命令,这个工具通过“扩展模块”的形式将提示信息、MCP服务器以及各种命令整合到一个可安装的单元中。
你并不需要这三种工具全部。只需选择你的雇主已经为你提供了其中哪一种工具,或者选择适合你项目的免费版本,然后按照本指南中的相关说明来使用即可。
什么是AI原生的SDLC?
下图展示了这六个开发阶段是如何作为一个连续的系统相互连接的,而不是孤立存在的步骤。后续的内容会解释每个阶段是如何将特定的成果传递给下一个阶段的,而最后一个阶段则会直接回到起始点,而不会在部署环节结束。
图1:AI原生的软件开发生命周期被描绘成一个封闭的六边形循环,而不是一个线性的流程。六个阶段——规划、设计、构建、测试、部署和维护——按顺时针方向依次进行。每个阶段会向下一阶段传递特定的成果文件(intent.md、spec.md、plan.md,以及代码、测试结果、review.md和bands.yaml),这些文件都位于循环图的内部,并且与相应的箭头相对应。特别值得注意的是那条从“维护”环节回到“规划”环节的双向箭头——正是这条箭头使得这六个独立的阶段形成了一个自我驱动的循环系统,而不仅仅是一些依次进行的操作。
如果你按照这些箭头的方向来理解这个流程:
在“规划”阶段,会生成
intent.md文件并传递给下一个阶段。在“设计”阶段,会生成
spec.md文件并传递给“构建”阶段。在“构建”阶段,会生成
plan.md文件,并将其与测试结果一起传递给“测试”和“部署”阶段;最终还会生成差异对比文件。在“部署”阶段,会将合并后的代码以及评审意见一起传递给“维护”阶段。
在“维护”阶段,当生产环境中出现问题时,需要重新编写
intent.md文件,然后再次启动这个循环过程。正是这种闭环机制才是推动创新的关键所在,而不仅仅是某个单独的阶段。
传统的软件开发生命周期图通常被绘制成瀑布模型或水平流水线结构。而这个模型被设计成圆形,因为其核心理念在于:运营数据会自动成为下一次规划的输入数据,而不会被闲置在仪表板上,直到下一次规划会议才会被重新使用。
工程师们基于一个持续了五十年的假设来构建传统的六阶段软件开发生命周期模型:编写和实现代码是整个过程中最耗时、成本最高的环节。
2026年,Anthropic的应用人工智能团队在发布其基于人工智能的软件开发生命周期框架时,明确指出了这一假设的局限性,并围绕这一假设不再成立时的情况来构建整个模型。Anthropic)。该框架仍然保留了软件工程师们熟悉的六个阶段名称,但每个阶段的工作内容与产出方式已经发生了变化。
Anthropic将这种开发机制称为“基于成果物的开发”。每个阶段都会生成一份可持久保存、经过版本控制且机器可读取的文档,供下一阶段使用;这种方式不需要开会讨论,也不需要依赖Slack等沟通工具,更不会存在仅存在于某人脑海中的理解偏差。
“规划”阶段会生成
intent.md文件,这份文件用请求方自己的语言对问题进行了清晰描述。“设计”阶段会生成
spec.md文件,其中列出了各项需求及约束条件,并标出了尚未解决的问题。“构建”阶段会生成
plan.md文件,这份文件详细说明了需要修改的文件、修改顺序以及用于验证修改结果的测试内容,最后还会附上代码差异对比结果。“测试与部署”阶段会提交一个包含多层自动化审核结果的拉取请求。
“维护”阶段会生成事件记录,当生产环境中的某些指标超出预期范围时,这些记录会被用于更新
intent.md文件。
Anthropic用自己的话很好地诠释了这一设计理念:
“每个阶段都会生成下一阶段可以读取的成果物。意图文档、规格说明书、实施计划、代码差异对比结果以及审核意见共同构成了完整的审计追踪体系。”Anthropic
这种审计追踪机制的重要性不仅仅体现在合规性方面。当人工智能模型能够在几分钟内生成可运行的代码差异对比结果时,决定软件质量的关键因素就变成了:它所依据的规划方案是否合理,以及在其发布之前是否有人对其输出结果进行了需求符合性的检查。
成果物的存在使得这种检查成为可能,而且不会影响人工智能模型的运行效率:一份规格说明书只需花费十分钟时间进行审核,还可以被缓存、重复使用,并像处理代码差异一样进行对比分析。而口头交流则无法实现这一点。
当代码成本降低后,瓶颈会出现在哪里?
Anthropic将其框架中涉及这一主题的部分命名为“代码已不再是瓶颈”,并在下一行解释了原因:
“各组织已经开始使用人工智能来编写代码,其速度之快是去年无法想象的;然而,与代码相关的流程并没有以同样的速度发生改变。”(Anthropic)
这一观察结果值得我们仔细思考,因为它涉及到的是那些会改变你日常工作安排的因素,而不仅仅是与你购买哪些工具有关。下图展示了在某个迭代周期内,这些工作流程是如何被重新分配的。
图2:两条堆叠的时间线,它们的总宽度相同,用于展示在某个迭代周期内工作流程是如何被重新分配的。上方的传统软件开发生命周期时间线将整个周期平均分为六个阶段;下方的基于人工智能的软件开发生命周期时间线中,“规划”、“设计”和“部署”这三个阶段保持原来的长度(标注为“仍以人类的工作速度进行”),而“构建”和“测试”这两个阶段则被压缩成很短的部分。这两条时间线的总长度被刻意设置得相同,因为重点并不在于所有环节的速度都变快了,而是在于那些原本用于“构建”的时间现在被重新分配到了其他环节。
上图将传统的软件开发生命周期与基于人工智能的软件开发生命周期的时间分配情况进行了对比。在传统模式下,“构建”环节占据了整个周期的大部分时间,因为大部分时间都被用来编写和调试代码;而“规划”、“测试”和“部署”这三个环节所占的时间相对较少。在基于人工智能的版本中,“构建”环节所占的时间被大大缩短,人工智能可以在原本用于召开启动会议的时间内完成代码的编写工作,而“规划”、“测试/评审”和“部署”这三个环节则占据了原来“构建”环节所占据的空间。整个图表的总宽度几乎没有发生变化,真正发生变化的是那些现在承担着限制整体开发速度的关键环节。
Anthropic自己也用同样的三个阶段来描述这一变化过程:
“瓶颈已经转移到了‘构建’环节之前的‘规划’环节以及之后的‘测试/评审’和‘部署’环节,而这些环节仍然以人类的工作速度进行。”(Anthropic)
这是一个具体且可以被验证的论点,因此我们应该认真对待它,而不仅仅把它当作一句口号而已。在“构建”环节中,速度的提升往往会以三种特定且可以避免的方式导致问题:
“快速构建,但规划不细致。”由于从代码编写错误到最终交付产品之间的时间间隔变短了,如果人工智能高速地实现错误的代码,其后果往往比人类缓慢地犯同样的错误更为严重。
“快速构建,但测试和评审的规模没有相应扩大。”由于没有人重新设计测试和评审流程来应对人工智能产生的大量变更,因此要么测试和评审的质量会下降,要么评审人员就会成为新的瓶颈,当人类需要阅读这些变更内容时,速度带来的优势就会消失殆尽。
“快速构建,但部署工作仍需人工完成。”由于最终产品的部署仍然需要人工在三个不同的环境中进行配置,因此即使人工智能能够快速生成代码,这些代码也还是无法被组织迅速地应用到实际工作中去。
这里的关键在于:真正让“基于人工智能的软件开发生命周期”这一概念名副其实的,是那些围绕智能体的各个阶段,而非智能体本身。智能体编码工具本身并不是问题所在。本指南的后续内容会将规划、设计、测试、部署和维护这些阶段视为与团队传统上对待开发阶段的同样重要的环节,因为目前制约这些流程的因素恰恰就存在于这些阶段。
Claude Code、Codex与Gemini CLI:一个框架,三种工具
以下每个阶段都会同时提供使用Claude Code、Codex和Gemini CLI时所需的命令或文件;不过只有当你了解每种工具是如何称呼你即将使用的功能的时,这些命令才能真正发挥作用。这三家供应商提供的智能体编码工具都相当功能强大,而最适合你的那一个,往往取决于你的雇主购买了哪一家的工具,或者哪家工具的免费版本能够满足你的工作需求。
下表是在阅读各阶段的具体内容时可以随时参考的信息。
| 功能 | Claude Code | OpenAI Codex | Gemini CLI |
|---|---|---|---|
| 内存/上下文文件存储位置 | CLAUDE.md:位于项目根目录,或~/.claude/文件夹中,或.claude/文件夹中(Anthropic) |
AGENTS.md:从Codex的根目录开始,沿着路径找到项目根目录即可找到该文件(OpenAI) |
GEMINI.md:该文件会覆盖全局、项目和子目录级别的设置信息(Google) |
| 可复用的提示语/扩展系统 | 子智能体(拥有独立的上下文窗口,可使用受限工具)以及技能功能;这些技能可以通过文件夹结构进行管理,并能自动被调用(Anthropic, Anthropic) | 技能功能取代了现已弃用的自定义提示语系统;MCP服务器会单独处理对外部工具的访问请求(OpenAI) | 扩展功能能够将提示语、MCP服务器、命令行指令、钩子程序以及子智能体整合成一个可安装的整体模块(Google) |
| 审批/沙箱模式 | 权限设置模式包括:手动模式、自动模式和规划模式,可通过Shift+Tab键进行切换(Anthropic) | 有两个独立的控制轴:沙箱模式(只读、可写入工作区数据、具有完全访问权限)和审批策略(不可信任、按请求审批、从不批准)(OpenAI) | 审批模式包括:默认模式、自动编辑模式、“yolo”模式(使用--yolo或Ctrl+Y键切换),以及仍在开发中的规划模式(Google) |
| 第一方的持续集成操作 | anthropics/claude-code-action:可以通过@claude指令或预定的事件来触发该操作(Anthropic) |
openai/codex-action:会在持续集成任务中执行codex exec命令,可用于应用补丁或发布评审结果(OpenAI) |
google-github-actions/run-gemini-cli:可以通过Pull Request或问题事件来触发该操作(Google) |
| 原生的代码评审功能 | 代码评审服务:这是一个由多智能体共同参与的管理型系统,用户可以通过/code-review命令进行代码审查,并且评论会带有严重性等级标签(Anthropic) |
在CLI中可以使用/review命令,在GitHub上可以使用@codex review指令,或者设置“自动评审”功能,这样每次收到新的Pull Request时都会自动检查P0/P1级别的问题(OpenAI) |
Google提供的Gemini Code Assist功能,可以通过提交.gemini/config.yaml文件来配置,该文件允许用户在五个评审维度上进行自定义设置(Google) |
| 随时可用的聊天界面 | 在Slack中使用“Claude Tag”功能,这个共享的组织身份标识可以将编码相关的请求路由到Web端的Claude Code工具进行处理(Anthropic) | OpenAI官方提供的Codex Slack应用:在频道中使用@Codex指令,可以创建云任务并查看处理结果(Slack) |
截至本文撰写时,尚未有确认的、由第一方提供的、原生支持Slack的功能。目前仅存在第三方开发的桥梁工具。 |
当你将这些工具的机制放在一起进行比较时,有几处值得注意的地方。如今,这三款工具都围绕同一个核心理念进行设计:首先,代理在执行任何操作之前都会读取一个纯文本格式的记忆文件;其次,它们都配备了用于重用提示和工具的打包系统;第三,存在一个决策层来决定代理应拥有多少自主权;最后,还有一套由原开发者提供的GitHub Action,可用于在持续集成环境中运行这些代理。
一旦“构建”不再是限制因素,所有供应商就都必须建立相同的基础设施,否则他们的工具虽然运行速度很快,但却会变得难以管理。
这三款工具在最后一个方面存在差异:Claude Code和Codex都提供了由供应商自行开发的官方Slack集成方案,这些方案通过特定的标签机制,能够将Slack频道中的提及内容转化为异步编码任务;而Gemini CLI目前还没有类似的官方功能(只有社区开发的第三方插件才能将其与Slack连接起来)。
如果你的维护阶段工作流程依赖于代理直接根据聊天信息来处理问题,那么这种差异其实是一种需要被考虑的因素,而不是某种个人偏好。
因为这一机制打破了“必须选择某一款工具并长期使用它”的固有观念,所以还有另一点关于工具互操作性的内容值得强调:Claude Code自身的文档中明确说明了如何导入现有的`AGENTS.md`文件——无论是通过`@AGENTS.md`这样的引用方式,还是通过符号链接的方式,这样Claude Code会使用与Codex相同的规则文件来存储信息。
实际上,`AGENTS.md`已经成为一种跨供应商的开放标准,在Codex之外也被广泛采用,并且由OpenAI等机构负责维护和管理。因此,如果一个团队将自己的规则文件格式统一为`AGENTS.md`,并让Claude Code能够导入这些文件,那么无论工程师当天更喜欢使用哪款工具,他们都能享受到这一共享记忆文件带来的诸多好处。
如何运行计划阶段
在开始编写任何代码之前,计划阶段首先要回答的一个问题是:究竟存在什么问题?应该用提出问题的人自己的话来描述这个问题。
Anthropic的框架将这一阶段产生的文件称为`intent.md`,这个名字其实相当朴实无华。它并不是一个包含了验收标准的Jira工单,也不是从解决方案中反推出来的详细要求列表;它更像是一份记录:请求者用他们自己的语言表达了他们的需求,在工程师或代理开始解读这些内容之前,这些信息就被完整地记录了下来。
下面是一个简单的`intent.md`模板,你可以将其保存到代码仓库中,然后在每项新的工作中重复使用:
# intent.md
## 提出请求的人
姓名、职位、提交日期
## 他们的需求描述
直接粘贴原始的请求内容,暂时不要对其进行任何处理。如果这个请求来自支持工单、Slack聊天记录或某个事件记录,请附上相应的链接。
## 这个请求要解决什么问题
用一两句话将原始请求内容转化为具体的问题描述。在这个阶段,就可以开始对请求进行解读了。
## 为什么现在提出这个请求
是什么引发了这个需求?如果这个请求是针对某个具体事件的,那么请说明该事件的具体记录编号。
## 已知的限制条件
请求者明确指出的任何限制因素,比如截止日期、预算上限、不能更改的系统配置、法规要求等等。
## 明确不在本次请求范围内的事项
说明这个请求不包含哪些内容。以下是具体的运作流程:
“用户的需求”部分被刻意保留原始状态,这样在后续环节中就可以及时发现那些可能被误解的请求。
将“用户的需求”与“该需求能解决什么问题”分开处理,可以确保解读这些需求的步骤只进行一次,并且以书面形式完成,而不是由下一个阅读该请求的人来自行解读。
“为何现在采取这一行动”这一字段的作用在于将维护阶段的工作成果与实际需求联系起来:如果某个需求是由于生产环境中的问题而产生的,那么就应该明确说明这一点,并链接到引发该问题的原始记录中。
当为某项请求填写这些信息时,模板的内容仍然会保持如此简洁的形式:
# intent.md
## 提出请求的人
Maria,独立承包商兼测试用户,2026-08-14
## 用户的需求
“我每天早上都需要查看四份不同的日历,才能确定自己什么时候有空。这个月我已经两次给自己安排了重复的会议。”
## 该需求能解决什么问题
对于需要为多个客户服务的承包商来说,如果不能让所有客户的日历系统相互连接,他们就无法清楚地了解自己的日程安排。
## 为何现在采取这一行动
这是在私人测试阶段获得的用户反馈,并非生产环境中的问题。
## 已知的限制条件
测试版本将在六周后发布。目前没有预算来聘请专门负责日历同步服务的供应商。
## 明确不在本次开发范围内的事项
本次版本不支持日历的双向同步功能,也不允许对任何客户的日历进行写入操作。仅提供只读查看功能。
根据这些需求编写技术规范时,需要明确指定应该优先支持哪些日历服务提供商、如何处理不同时区的时间差异,以及当某个服务提供商的API无法使用时应该如何应对。由此可见,在设计阶段就把这些细节写下来,实际上是为了避免后续在开发过程中出现不必要的误解或 improvisation。这就是在开始编写设计文档甚至代码之前,先明确这些需求的根本原因。
不同的工具提供了不同的机制来帮助人们完成这一阶段的工作,从而防止开发人员直接进入编码环节。Claude Code的“计划模式”就是专门为这种情况设计的——该模式下,开发人员可以研究代码库并提出解决方案,但无法编辑文件或运行命令,直到你切换出这种模式为止。切换模式的快捷键是Shift+Tab(Anthropic)。
Codex则采用了两种不同的设置来实现同样的功能,而不是仅仅通过一个模式开关来控制:一种是沙箱环境设置,用于限制开发人员可以进行的操作类型(只读、工作区写入或完全访问权限);另一种是审批策略设置,用于规定在什么情况下开发人员必须停止当前操作并请求许可(未受信任的请求、需经请求才能批准,或者永远不允许)。OpenAI
在“计划模式”下将沙箱环境设置为只读状态,就可以获得与Claude Code的“计划模式”相同的效果,只不过这种限制是在不同的层面实施的。Gemini CLI也提供了类似的“计划模式”,同样具有只读权限功能。不过谷歌自己的文档指出,这一功能相对于其他审批模式来说还处于发展阶段Google),因此在使用之前,最好先在自己的代码库中验证它的实际表现,以确保其能够满足你的需求。
无论使用哪种工具来执行计划阶段的工作,其输出结果都应该包括填写完成的intent.md文件,以及一段简短的交流内容,用于确认代理对问题的总结与请求者的意图是否一致。这个确认步骤正是前文提到的、需要以人工速度来完成的部分;当代理的总结听起来已经很合理时,人们很容易想要跳过这一环节。然而,正如“瓶颈转移理论”所预测的那样,如果因为代理迅速生成了看似合理的总结就直接跳过这一确认步骤,最终往往会导致错误的结论。
如何进行设计阶段的工作
在设计阶段,intent.md文件会转化为spec.md文件。这份文档会明确说明解决方案的技术实现方案、涉及的接口,以及在代理开始编写代码之前需要由相关人员审批的各项权衡因素。
Anthropic的框架将这一阶段描述为“需求与设计在同一个会议中得到整合”的过程(Anthropic),这与传统的开发流程有很大不同——在传统流程中,产品规格书和技术设计文档往往是由不同的人在相隔数天的时间分别编写,之后还需要通过会议来协调这两份文件的内容。
一份格式规范的spec.md模板能够确保这种整合过程是有意为之而非偶然发生:
# spec.md ## 来源 说明这份设计文档所针对的intent.md文件的位置。“存在的疑问”和“被明确排除的替代方案”这两个部分起到了至关重要的作用。如果让代理来编写设计文档,它很可能会将自己的方案视为理所当然、显而易见的最佳选择。因此,在这个阶段,人工审核者的工作重点非常明确:首先要仔细阅读这两部分内容,因为错误的前提假设很可能就隐藏在这些地方,而不是在代理最为自信的部分中。这三款工具在支持设计阶段的工作方式上是一致的:在起草设计文档的过程中,会将会议模式设置为只读或计划制定模式;只有当人工审核者阅读了“存在的疑问”部分,并对每一项问题进行了处理或明确表示同意后,才能切换到允许修改文件的模式。虽然具体的实现机制有所不同(Claude Code的计划模式、Codex的只读沙盒环境、Gemini CLI的计划审批模式),但所有工具都遵循同一个原则:在有人审核完设计文档中存在的疑问之前,任何内容都不能被实际执行。有一个实际可行的建议可以纳入你的开发流程中:就像你会为所描述的模型及其相关文档分别设置版本号一样,也要为规格说明文件和代码分别设置版本号。如果一个`spec.md`文件仅存在于聊天记录中,那么它就不算是一个正式的开发文档;而如果这个文件被提交到代码仓库中,并且与描述它的实现代码位于同一个拉取请求中,那么它在后续的测试和部署阶段就可以被参考使用了。
如何运行构建阶段
构建阶段是大家都已经熟悉的一个环节,因为各种编码工具本来就是为执行这一任务而设计的;同时,在这个开发框架中,构建阶段也是变化最少的环节。
不同的是,现在构建过程是根据经过审核的`plan.md`文件来执行的,而不是根据临时的指令来进行的。这种机制能够确保构建工具始终针对正确的目标进行操作,而不会偏离方向。
# plan.md ## 来源 本计划所依据的规格说明文件的链接。 ## 需要修改的文件及修改顺序 1. `src/models/user.py`:添加`last_login_at`字段 2. `src/api/auth.py`:更新登录处理逻辑以设置新字段 3. `tests/test_auth.py`:为新字段编写测试用例 4. `migrations/0042_add_last_login.py`:进行数据库结构迁移 ## 在完成本计划之前必须通过的测试 - 现有的认证测试套件,未修改的测试用例必须都能通过 - 新测试用例:登录操作后`last_login_at`字段应设置为当前的UTC时间戳 - 新测试用例:从未登录过的用户的`last_login_at`字段应为`null` ## 回滚方案 如果构建结果出现错误,可以执行以下操作进行回退:先撤销一次数据库迁移操作,然后对相关的三个代码文件使用`git revert`命令进行恢复,无需重新填充数据。在每个工具开始执行任何操作之前,它们都会先读取一个内存文件,正是这个文件决定了代理程序应该如何编写代码,而不仅仅是`plan.md`文件本身。位于代码仓库根目录下的`CLAUDE.md`文件可能包含如下内容:
# CLAUDE.md ## 命令 - 运行测试:`pytest tests/ -x -q` - 运行代码检查工具:`ruff check src/` - 启动本地服务器:`python manage.py runserver` ## 代码结构 项目采用Django框架进行开发。业务逻辑位于`src/services/`目录中,而不是视图或模型文件中。视图会调用服务模块,服务模块则会调用模型;切勿将业务逻辑直接写在视图函数中。 ## 标准要求 - 所有新的API接口都需要在`openapi.yaml`文件中有所对应记录 - 数据库迁移操作每个文件只进行一次,不会被合并到同一个迁移脚本中 - 如果引入新的依赖库,必须在`docs/decisions/`目录中留下相应的记录 ## 测试覆盖率要求 `src/services/`目录中的每一个新函数都必须在`tests/services/`目录中有对应的测试用例。如果测试覆盖率低于85%,构建过程将会失败。
如果你的项目已经采用了`AGENTS.md`文件作为标准配置文件,因为这是一种跨供应商通用的格式,那么上面的`CLAUDE.md`文件几乎可以直接套用过来:结构相同、内容一致,只是文件名不同而已。Codex系统在从其默认目录导航到你的项目根目录时,会自动识别并读取这个文件(OpenAI)。
GEMINI.md文件所包含的内容是固定的。Gemini CLI会将该文件与系统中任何位于`~/.gemini/GEMINI.md`路径下或子目录中的文件合并在一起。因此,一个单一代码库就可以同时体现公司统一的规范要求,同时也允许各服务根据自身需求进行个性化配置(参考Google的相关文档)。
<无论你最终选择将哪个文件名提交到代码库中,文件中的内容——包括命令、架构规范、测试规则等——才是决定该工具生成的输出结果是与你的代码库风格一致,还是看起来像普通的教程文件的关键因素。
<在需要跨多个模块或功能复用某些行为时,这三款工具之间的差异就变得更加明显了。Claude Code将这类机制分为两种类型:一种是“子代理”,它们在独立的运行环境中执行任务,且对这些环境中的工具具有有限的访问权限,例如专门用于检测SQL注入漏洞的功能;另一种是“技能包”,这些基于文件夹结构的包会在相关场景下被自动调用,它们实际上取代了以往那些需要手动配置的命令(参考Anthropic的相关文档和Anthropic的相关文档)。
如何运行测试阶段
在这个阶段,DORA报告中那些不太乐观的发现也就显得尤为重要了:尽管有90%的开发人员表示采用了相关技术,但仍有大约三分之二的开发者表示他们对人工智能生成的代码缺乏信任。DORA报告中提到了这一现象。当测试被安排在快速开发流程之后的一个独立阶段进行时,这种不信任情绪是可以理解的——因为在代码尚未经过验证的情况下,开发者就必须依赖这些代码来开展工作。然而,一旦每次代码提交后都会自动进行验证,而不再需要等待人工安排测试时间,这个问题就变成了一个可以通过工程手段解决的难题,而不再是一种持续存在的风险。
Claude Code通过“钩子”机制实现了这一功能:这些shell命令会在特定的生命周期事件发生时自动执行,比如在代理程序修改文件或运行命令之前或之后。Anthropic中详细介绍了这一机制。例如,在.claude/settings.json文件中,可以这样配置一个钩子:在每次文件被修改后执行测试套件,如果测试失败,则阻止代理程序继续执行后续操作:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "pytest tests/ -x -q --timeout=60"
}
]
}
]
}
}
具体来说,这个机制的工作原理如下:
PostToolUse钩子在代理程序完成“编辑”或“写入”操作之后才会被执行,因此它会检查磁盘上发生的变更。pytest -x命令会在遇到第一个失败案例时立即停止测试,这样就可以及时获取反馈信息,而不会生成一份完整的失败报告让代理程序去解析。- 如果测试失败,这个命令会返回一个终止代码,从而阻止代理程序继续处理
plan.md文件中列出的下一个文件,直到所有测试都通过为止。
Codex和Gemini CLI并没有提供与Claude Code同样成熟的本地钩子框架(如果你曾经尝试过在自己的笔记本电脑上手动停止代理程序的执行,就会明白这一点)。这与其说是一个缺失的功能,不如说是一种不同的开发流程设计:这两款工具主要依靠持续集成系统来实施代码验证,而不是依赖本地的生命周期事件触发机制。因此,Codex和Gemini CLI的/review功能以及由PR请求触发的审核流程,其实也能解决类似的问题——只不过这些机制是在代码提交到仓库之后才起作用的。
如果你目前正在本地使用Codex或Gemini CLI,那么一个实际的替代方案就是利用Git本身的预提交钩子来执行与Claude Code中的钩子相同的测试命令。这样,你就可以在工具链的不同层面上实现类似的验证功能。
无论使用哪种工具,这一阶段都应该生成一份与特定代码提交相关的测试结果,并将这些结果记录在plan.md文件中。这样一来,后续的审核人员就能清楚地了解是哪些测试验证了哪些内容,而不会盲目信任那些可能代表上周代码状态的绿色标记。
如何运行部署阶段
Anthropic将这一阶段描述为“多层自动化审查机制,其中对于受监管或至关重要的代码,仍会由人类进行审核”;在这个过程中,“当AI执行相关操作时,治理规则会被严格执行,而各种审批流程则起到了把关的作用。”(Anthropic)
“多层”这一表述确实很贴切:该框架并不是建议用自动化审查完全取代人工审核,而是主张将自动化审查作为前置且成本较低的环节,这样人类就可以专注于那些经过自动化检查后仍需要人工审核的部分,而无需从头开始检查所有内容。
目前,这三家供应商都提供了自己开发的GitHub Action插件,因此你不必从头开始构建CI集成流程。Claude Code提供的anthropics/claude-code-action插件可以响应PR或问题中包含的@claude标签,或者根据你配置的日程安排在任何GitHub事件中自动运行(Anthropic):
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
claude-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: “请根据spec.md和plan.md文件审查这段代码差异。”
Codex提供的对应插件openai/codex-action会在CI任务执行过程中直接运行codex exec命令,这意味着该插件拥有完整的CLI功能,并非仅用于审核;根据你的配置,它还可以应用补丁或发布审核评论(OpenAI):
name: Codex Review
on:
pull_request:
types: [opened, synchronize]
jobs:
codex-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: openai/codex-action@v1
with:
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
command: "请根据链接的spec.md文件审查这段代码差异,并标记出P0/P1级别的问题"
Gemini提供的google-github-actions/run-gemini-cli插件也会在相同的PR和问题事件触发时运行,而且它会利用完整的项目上下文异步执行审核任务,而不是进行同步阻塞式的检查(Google):
name: Gemini Review
on:
pull_request:
types: [opened, synchronize]
jobs:
gemini-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: google-github-actions/run-gemini-cli@v1
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
prompt: “请审查这段PR代码,检查其正确性、效率及可维护性。”
除了这些基础的CI插件之外,这三家供应商还都提供了具有各自配置界面的专用代码审核工具。Claude Code的Code Review是一项托管服务,它可以同时让多个专门的自动化审核工具并行处理代码差异;此外,它还包含一个单独的验证步骤,用于在任何内容被提交给人类审核之前,先过滤掉可能出现的误报结果。这个验证步骤可以通过@claude review命令或本地的/code-review命令来触发(Anthropic)。
Codex的审核机制主要包括两种方式:一是通过CLI composer中的`/review`命令;二是通过在GitHub的PR中添加`@codex review`标签;三是对于未添加相关标签的新PR,系统会自动执行审核流程。在GitHub模式下,Codex会专门筛选出最严重的P0级和P1级问题进行标记,而不会关注那些风格上的小问题(来源:OpenAI)。
与前两种审核机制不同,Gemini Code Assist for GitHub主要是通过配置文件`/.gemini/config.yaml`来设置审核规则的。这个文件与用于控制构建过程的配置文件是相互独立的。该工具会在五个方面生成审核评论:正确性、效率、可维护性、安全性,以及涵盖测试、可扩展性和错误日志记录等内容的综合评价(来源:Google)。
当自动化审核流程无法处理某些问题时,就需要由人工进行干预。具体而言,哪些变更需要人工审批,应该根据这些变更对系统产生的影响程度来决定,并没有统一的规则可以适用。例如,任何涉及数据库迁移、认证流程或支付相关的变更,无论自动化审核的结果如何,都应要求人工批准。
对于那些通过了所有自动化审核环节的文档修改或配置值调整,它们完全可以被自动合并到代码库中。Anthropic将这种差异记录视为审计追踪的一部分,它认为:“提交历史本身就构成了审计追踪——谁提出了哪些请求,代理程序生成了什么结果,以及最终是谁批准了这些变更”(来源:Anthropic)。
我们可以这样理解这个流程:自动化审核并不会在代理程序停止编写代码时就结束,而是会在它收集到足够的信息后才会完成审核过程,这样人类就可以基于这些信息快速而明智地做出审批决定。
如何运行维护阶段
“维护阶段”正是“以工件为导向的开发流程”这一名称的由来之处,因为在这个阶段,整个开发循环才会真正闭合。Anthropic将这个阶段描述为:“代理程序会监控生产环境中的部署情况。一旦发现任何超出预设范围的异常情况,就会生成新的`intent.md`文件,并将其重新纳入审核流程中”(来源:Anthropic)。
如果没有这个“反馈机制”,维护阶段就只是简单的监控工作,这与团队多年来一直使用的传统监控工具并无区别。但有了这个反馈机制,生产环境中出现的任何问题都会直接成为下一轮规划阶段的输入内容,而不会只是一份被阅读一次后就束之高阁的事后分析报告。
一种实用的配置方式是使用“区间控制”模型来规定各项指标的可接受范围,以及当这些指标超出范围时应采取的措施:
# monitoring/bands.yaml
- metric: p99_latency_ms
service: checkout-api
band: [0, 400]
on_breach:
severity: high
action: open_incident
write_intent: true
- metric: error_rate_pct
service: checkout-api
band: [0, 1.0]
on_breach:
severity: critical
action: page_oncall
write(intent: true
- metric: daily_active_users
service: onboarding-flow
band: [800, null]
on_breach:
severity: medium
action: open_incident
write_intent: false
以下是具体的运作机制:
每项指标都有一个可接受的范围,而不是一个固定的阈值。这种设计使得我们能够同样容易地发现那些数值过低的情况,也能及时察觉到数值过高的现象。
write_intent: true这一机制会自动将一次违规行为转化为一个新的规划阶段的开始,系统会生成一份intent.md文件,其中会明确指出出现问题的指标、相关服务以及事件的详细信息。并非所有的违规行为都应该触发新的规划流程。对于那些影响较小的服务而言,如果每日活跃用户数量有所下降,虽然可能需要记录这一事件以便关注情况,但并不一定需要启动新的规划工作。因此,这个选项是明确规定的,而不是默认生效的。
在这里,“代理程序接收信息的位置”其实非常重要:正是这个环节使得这三款工具之间存在差异。Claude Tag为组织在Slack中提供了一个统一的@Claude身份标识,该功能可以在频道中异步运行,并会将相关的编码任务转发到网上的Claude Code平台。因此,“有人在事件频道中提到出现问题的指标,然后让机器人处理这个问题”这种操作方式,本身就是一种现成的维护阶段处理流程(更多信息请参见Anthropic)。
OpenAI也提供了类似的解决方案:他们推出了官方的Codex Slack应用,在该应用中,如果在频道或讨论帖中使用@Codex标签,系统就会创建一个云任务,在相应的代码仓库中执行相关操作,并将结果再次发布到原来的讨论帖中(更多信息请参见Slack)。
如上所述,目前谷歌还没有自己的类似解决方案;目前只有第三方工具或社区开发的方案才能将 Gemini CLI与Slack连接起来。对于基于 Gemini的维护阶段流程来说,一个实际可行的解决方法是通过现有的待命通知系统的Webhook来自动执行相关操作,而不需要等待有人在聊天中提到这个问题(建议在事件发生之前就设置好这个机制,以免在事件处理过程中才去寻找相关的工具)。
如果追踪整个从违规行为到下一个规划周期的流程,就会看到如下所示的图表:
图3:实际上,这个流程更像是一个封闭的循环。从左到右、自上而下看,intent.md会生成spec.md,spec.md会生成plan.md,plan.md会用于构建代理程序,随后进入自动化测试和审核环节,然后进行部署,最后进行监控。那条标有“触发下一个周期”的虚线蓝色箭头,正是大多数团队流程所缺失的部分——它将监控结果直接反馈到新生成的intent.md文件中,从而完成整个循环过程,而不会像传统的流程图那样在部署环节结束。
上图展示了本章节中所有环节的运作流程:它追踪了从bands.yaml文件中的某处漏洞,经过open_incident流程,生成事件记录,进而创建新的intent.md文件,最终又回到本指南最初提到的“计划阶段”这一过程。那条从“维护阶段”返回“计划阶段”的箭头,正是当今大多数团队的工程流程中所缺失的部分——即便那些在“构建阶段”采用了自动化编码工具的团队也不例外。
如果只购买用于“构建阶段”的自动化工具,而不建立这种反馈机制,虽然可以快速编写代码,但各个团队依然会沿用那种繁琐的手动流程,将事件信息转化为路线图。正是这条箭头使得这六个阶段构成了一个完整的循环,而不仅仅是一些彼此相邻、独立进行的改进过程。
一名工程师如何管理一个五人的团队
上述内容假设团队规模足够大,因此有专人负责规划、审核、发布管理和应急响应工作。但实际上,越来越多的工程师所处的团队并不符合这种配置。
GitHub在2025年发布的Octoverse报告显示,在过去一年中加入GitHub的开发者中,近80%的人在入职第一周就使用了Copilot工具。这一数据说明,人工智能辅助开发正逐渐成为新工程师职业生涯的起点,而不再是一种需要多年经验才能掌握的高级技术。
再加上Stack Overflow的调查结果——大约有一半的专业开发者每天都在使用人工智能工具,由此可见,那些考虑独自创业或组建两人团队并采用这种技术栈的工程师,并不是个例,他们其实代表了大多数新入职的开发者。
下面以一个具体例子来说明当一个人或两个人共同完成这六个阶段时,整个流程会是怎样的:比如一名工程师正在为独立承包商开发调度工具,目标是在六周内推出付费测试版。
计划阶段:
计划阶段取代了产品经理将客户需求转化为具体规格书的工作。创始人会与三位承包商讨论现有调度工具存在的问题,然后将这些讨论记录整理到intent.md文件中,通过“计划模式”会议将这些零散的信息整合成一个明确的问题陈述:承包商需要能够看到所有客户的日历信息,但同时不能让任何一位客户的管理员访问其他客户的日历数据。
这个耗时15分钟的会议,相当于一个两人团队花费一周时间进行客户访谈和编写需求文档所完成的工作量。
设计阶段:
设计阶段取代了架构师在白板上进行设计的环节。同样的会议过程,在只读模式下进行,最终会生成spec.md文件:这个文件详细规定了系统需要实现的功能,包括日历信息的叠加显示、与各客户日历服务提供商的OAuth集成机制,以及统一的界面展示方式。同时,明确拒绝了实时同步功能,而是选择了每5分钟进行一次数据更新的方式——因为实时同步很可能会导致项目无法在六周内完成。
在规格书中明确写明“由于时间安排的原因,放弃了实时同步功能”,这一规定能够确保创始人在第五周面临压力时,不会重新考虑这个决定。
构建阶段:
构建过程实际上取代了整个工程团队的作用。通过使用plan.md文件来明确指定日历集成功能、认证流程以及统一视图组件的实现细节,这种基于代理的编码工具会根据CLAUDE.md(或AGENTS.md、GEMINI.md)文件来执行相应的开发工作。这些文件记录了创始人最初做出的各项技术决策:应该使用哪个日历库、采用哪种认证模式,以及业务逻辑应存储在何处。阅读本指南的读者应该已经预料到,这一阶段的开发速度会相当快。而Beta版本的能否按时发布,其实取决于其他相关环节的进展情况。
测试阶段:
测试工作同样取代了传统的质量保证工程师的角色。由于每次修改文件后都会自动运行测试套件,因此创始人在演示前的晚上根本不需要去调试那些尚未经过测试的代码结果。在开始构建开发之前,就将测试标准详细记录在plan.md文件中,而不是等到开发完成后才进行测试——这种做法正是专业质量保证工程师会坚持要求的。
部署阶段:
部署过程实际上取代了发布管理者的职能。GitHub Actions会自动对每一份拉取请求进行代码审查,而对于那些涉及OAuth认证流程或计费功能的修改,还会由专人进行特别审核。这样一来,即使没有其他工程师协助,创始人也能按照Anthropic框架的要求完成各项审批工作。不过,创始人仍然会亲自审阅所有与资金或敏感信息相关的代码变更。
维护阶段:
维护工作不再需要依赖轮值值班的运维团队。通过bands.yaml文件来监控API错误率及任务执行成功率,并将这些数据直接发送到创始人的手机上,这种机制就足以满足这家规模公司的应急响应需求。如果凌晨2点时任务执行失败率的数值超出了预设范围,相应的故障记录就会成为下周的第一份intent.md文件,而创始人也无需等到周一才能回忆起具体问题所在。
判断力依然像过去一样重要。不同的是,过去需要整个团队来协调完成的工作,现在已经通过代码本身得到了明确的规定:每个被提交的代码文件都清楚地记录了原本需要由多个专家分别负责处理的各项细节。
这就是为什么说,采用基于人工智能的SDLC框架是可行的——以工件为导向的开发模式可以让一个人的专业知识覆盖过去需要多人分工才能完成的工作范围。
在全面采用基于人工智能的SDLC框架之前,请先检查以下内容:
在根据这一框架重新设计团队工作流程之前,请先完成以下分阶段需要检查的事项:
规划与设计阶段
[ ] 仓库中必须存在
intent.md模板,每项新的开发工作都应从填写完整的该模板开始。[ ] 必须有
spec.md模板,并且其中要包含“待解决的问题”部分,以便在开始构建开发之前由专人进行审阅。[ ] 除了提出请求的人之外,至少还必须有另一位人员确认代理程序对开发目标的总结内容,之后才能将其正式纳入规范文件中。
构建阶段
[ ] 必须存在一个配置文件(如
CLAUDE.md、AGENTS.md或GEMINI.md),并将其提交到版本控制系统中。该文件应明确指定命令、架构及相关规范,而不仅仅是包含占位符文本。[ ]
plan.md文件需明确列出在开始实施之前需要处理的特定文件、变更顺序以及测试内容。
测试阶段
[ ] 必须设置钩子脚本、提交前检查机制,或类似的本地验证流程,以便在测试失败时自动阻止后续操作。
[ ] 测试结果应与对应的提交记录关联起来,而不仅仅是在聊天中简单地标注“通过”或“失败”。
部署阶段
[ ] 必须使用第三方CI工具(如Claude Code、Codex或Gemini),对每一份拉取请求进行自动审核。
[ ] 对于涉及权限管理、支付功能、数据迁移或基础设施变更的代码,无论自动化审核的结果如何,都必须经过人工审批才能继续部署。
[ ] 如果启用了自动合并功能,也仅应将其应用于低风险场景,而不能默认应用于所有通过审核的代码。
维护阶段
[ ] 监控配置应针对对企业而言真正重要的指标进行设置,而不仅仅是平台本身提供的所有指标。
[ ] 对于严重程度最高的违规事件,系统必须自动生成新的
intent.md文件,从而将问题反馈回规划阶段。[ ] 必须有人负责处理这一阶段产生的各种问题,即使这个人也是负责其他阶段工作的人员。
结论
现在,你已经掌握了如何利用智能编码工具来重构软件团队的开发流程,并了解了三种具体的实现方法。这六个阶段(规划、设计、构建、测试、部署、维护)的名称并没有发生变化,真正发生变化的是每个阶段产生的成果以及生成这些成果所使用的工具。
intent.md文件能够在任何人对问题进行解读之前,就将其捕捉下来——无论这种解读是在Claude Code的规划模式下进行的,还是在Codex的只读沙盒环境中完成的,又或者是通过Gemini CLI的规划审批流程来实现的。spec.md文件和plan.md文件将开发人员的工作效率转化为实际价值,因为它们为开发人员提供了明确的目标,并且这些目标已经经过了人工审核。钩子脚本、CI工具以及代码审查机制取代了传统的测试环节,实现了持续性的验证过程。这些流程被集成到每一次代码提交中,而不仅仅是在最后阶段才进行。
分层审核机制将人类的判断力应用在那些真正需要发挥价值的地方——也就是那些可能产生广泛影响的变更场景中,而不是对每一行代码都进行逐一审查。
区间式监控配置有助于形成闭环,使生产过程中出现的问题的信息能够直接用于下一个开发周期的规划工作,而不会被遗忘或忽略。
本指南中每个阶段所遵循的核心原则,其实就是METR最初提出的“任务完成速度倍增曲线”所体现的理念:无论你的开发流程是否已经跟上发展步伐,限制软件发布速度的因素其实早已发生了变化。那些仍然将“构建环节”视为瓶颈的团队,只会不断优化那个已经不再构成问题的环节而已。
接下来可以探索的内容
Anthropic提出的AI原生SDLC开发框架,这是本指南所采用的六阶段开发模型的主要来源
DORA发布的2025年人工智能辅助软件开发现状报告,其中包含了相关的数据与分析结果
- ,详细介绍了这一现象背后的计算方法与逻辑
Claude Code的文档中心,内容涵盖内存管理相关功能、权限设置模式以及子代理机制等
- ,详细说明了沙箱测试环境与审批流程的分离机制
- ,其中介绍了当前版本中的审批模式与扩展系统功能
欢迎访问我的GitHub账户,了解更多我使用这种AI原生工程流程开发并分享的开源软件解决方案及开发者工具。
相关文章
如何在重构旧代码之前设计相应的特性测试用例
许多工程师在继承遗留代码后,首先想要做的就是改进这些代码。 你会遇到一些难以理解的函数,或者看到重复的逻辑、深度嵌套的条件语句、混合了业务规则的数据库调用,以及那些使得测试几乎无法进行的依赖关系。 你知道这些代码本可以做得更好,于是开始对其进行优化。 然而,随后就会出现问题。并不是因为新的实现方式存在明显的错误,而是因为旧的实现方式在背后做了某些人们之前根本不知道它在做的事情。 这就是在遗留代码现代化过程中最常出现的风险之一。 在修改代码之前,你需要有一种方法来回答一个简单的问题: 我是否保留了那些原本就重要的功能行为? 这时,特性测试就派上了用场。 特性测试并不是从“软件应该做什么”这个角度
阅读全文
了解人工智能软件开发生命周期流程——构建智能代理功能的完整指南
也许你可以理解这样的场景:本周,你用了同样的说明四次向别人解释人工智能模型的使用方法。 你反复讲解过团队是如何构建演示文稿的框架的,哪些检查步骤需要在部署之前完成,以及为什么测试数据库并不是文档中提到的那个。 每次你都要把这些内容重新写一遍,每次智能助手也能完成得不错,但每次新的会话开始时,一切都得从零开始。 而这正是 智能助手技能 所要解决的问题。 技能 实际上就是一个文件夹,其中只包含一个名为 Skill.md 的文件。智能助手在启动时会阅读其中的一行总结内容,而只有当真正需要时才会打开完整的说明文件。你只需把解释内容编写一次,将其与代码一起提交,那么团队中的每个智能助手就能访问这些信息,
阅读全文
如何防止人工智能代理伪造自己的测试结果
我确认,那些被标记为“已验证”的结果实际上都是虚假的。这样一来,原本五个伪造的响应中现在一个也没有了,测试过程进行得非常顺利,任务已经完成。 随后我在更严格的条件下再次进行了测试,得到的准确率为66.7%。然而,这个数值并不符合我的预期;我本来还打算在它旁边标注“人工验证”呢。出现这种结果的原因是:仅仅一次成功的测试并不能证明其结果就是正确的,“已验证”这个标签其实并不代表这一点。而我之前开发的那个工具,本来就是为了防止人们忽视这种区别,但这次我却差点忽略了它。 这种讽刺意味确实值得专门加以说明。 我开发的这个工具叫做“spec-verify”:它属于Claude Code系列技能之一。该工具
阅读全文
在修改现有的代码库之前,如何利用人工智能来理解这些代码的含义
许多工程师在继承现有的代码库时,首先想要做的就是修改这些代码。我完全理解这种冲动。 当你打开一个长达1500行的类文件时,你会看到其中混杂着数据库调用、业务规则、分散在各处的配置值、根本没人愿意去修改的方法,以及那些提到早已被淘汰的系统的注释。 这时,一款人工智能编码助手主动提出可以帮助你理解整个代码库的结构。 于是你就会问: 请重构这个类。 但通常来说,现在还不是进行重构的时候。 从处理遗留系统的经验中,我认识到:代码虽然可能写得很糟糕,但却可能蕴含着重要的信息。 某个奇怪的条件实际上可能代表着某种业务规则;重复出现的计算逻辑可能是由于两个看似相同的流程其实并不完全相同所致;一个命名很糟糕的
阅读全文