1. 为什么你需要一套固定的 AI 编程工作流,而不是“随缘提问”
过去一年里,我问过自己一个问题:同样是打开对话框问 AI,为什么有的人能半小时交付一个完整功能,有的人折腾一下午还在跟幻觉代码缠斗?后来我复盘了一下身边效率差别很大的开发者,发现差距不在工具,也不在提示词技巧,而在于有没有一套稳定、可复用的AI 编程工作流。
所谓工作流,不是让你背一套固定的提示词模板,而是把“人机协作写代码”这件事拆成固定的动作序列:什么时候让 AI 自由发挥,什么时候必须人肉介入,什么时候必须用测试兜底,每一步都有明确的目的和出口条件。有了这套东西,AI 就不再是一个偶尔灵光的自动补全工具,而是一个真正能推进项目的结对程序员。
我这篇文章想分享三个我自己已经跑通很久、拿过来就能直接用的工作流。它们分别解决三个高频场景:从零写新功能、理解并改造陌生代码、以及 DEBUG 到怀疑人生时的排查闭环。每个工作流都会讲清楚适用场景、具体步骤、以及我踩过的坑。文章会比较长,但保证没有一句废话。
注意:这三个工作流不是互相替代的关系,而是可以按场景切换使用的。我自己的习惯是周一写新功能用工作流一,周三接手同事留下的模块用工作流二,周五下午改 bug 用工作流三。你可以把它们当成三套工具箱,而不是一套大而全的银弹。
2. 工作流一:需求澄清-伪代码-测试先行-实现-重构
2.1 这个工作流解决什么问题
“帮我写一个订单导出功能”,然后把这段需求直接丢给 AI——这么干的人,十有八九拿回来的代码是不能直接用的。原因很简单:AI 生成代码的质量,上限取决于你对需求的表达质量。你脑子里的“订单导出”可能是带筛选条件的 Excel,AI 理解的“订单导出”可能是一段打印 JSON 的控制台脚本。这不是 AI 笨,而是信息缺口太大。
这个工作流的核心思路,是在写任何业务代码之前,用一轮结构化的对话把信息缺口补上。它不是让 AI 直接写代码,而是先让 AI 帮你把需求“翻译”成无歧义的功能描述和验收标准,然后再进入编码阶段。用大白话说:先对齐认知,再动手。
我通常把整个过程分成五个固定动作,严格按照顺序执行,每一步没有达到出口条件就不进入下一步。这样做的直接好处是:AI 生成的代码一次性通过率能稳定在八成以上,而不是来回改七八轮。
2.2 五步动作的详细拆解
第一步,需求澄清。打开对话框,把你脑子里的原始需求原封不动扔进去,然后追加三句固定话术:“请列出你理解的功能点、边界条件和隐含假设;请指出我表述中模糊的地方,并用提问的方式让我确认;请基于你的理解输出一份功能清单。”这里有个细节值得注意:AI 往往不敢主动质疑你,所以你必须给它一个“质疑的许可”。我见过很多开发者抱怨 AI 写出的东西不对,但其实 AI 在第一轮就问过“是否需要支持批量操作?”,只是他们没注意,直接不耐烦地说“你赶紧写”。
第二步,伪代码先行。当功能清单得到你确认后,让 AI 基于这份清单输出“结构化伪代码”,而不是直接写实现。这一步的关键作用是强行让 AI 把逻辑摊开,把循环、分支、异常处理都摆在明面上。这时候你能在伪代码阶段就发现逻辑漏洞,比如漏了超时重试、没考虑空数据场景、字段映射错误——这些如果在伪代码阶段被发现,修改成本几乎为零,要是在实现阶段才发现,就得推倒重来。
第三步,测试先行。这一步是三个工作流里最容易被跳过、但也最致命的一步。让 AI 基于功能清单生成一组“最小用例”,不要多,每个功能点一到两个就够。用例的格式不是完整的测试文件,而是“输入数据 + 预期行为”的结构化描述。这个动作看着不起眼,但它强制你在编码之前定义“什么叫做好了”,而不是等代码写完了再回头现编测试。我自己的经验是:这个步骤能砍掉至少一半的返工时间。
第四步,实现。当伪代码被确认、测试用例被确认之后,再告诉 AI:“基于上述伪代码和测试用例,生成完整实现。实现方式要求……”,你可以在这里追加语言版本、框架约束、代码风格等要求。经过前三轮的铺垫,这一轮生成出来的代码质量会明显高于直接提问。原因也很简单:AI 的上下文里已经有了一份经过确认的“需求规格说明书”和“验收标准”,它不是在盲猜,而是在按图施工。
第五步,重构。实现跑通测试之后,不要急着收工。用一个新问题让 AI 以“资深代码评审者”的身份审查刚才的代码,专门挑这些问题:重复代码、异常处理缺失、命名不合理、安全隐患。这一步往往能发现很多看起来“能跑”但细看全是问题的代码。
提示:这五步里,第二步和第三步的耗时最长,但它们是整个工作流里真正的价值所在。很多觉得 AI 编程“不靠谱”的人,其实是跳过了这两步,让 AI 在需求模糊的情况下直接写实现,等于让一个经验丰富但没拿到需求文档的工程师蒙眼写代码,写出来的东西当然没法用。
2.3 一个完整的最小示例
我把这个流程完整走一遍,让大家直观感受下“每一步到底该说什么”。假设我要给一个内部工具加一个“按日期范围导出用户操作日志”的功能。
第一轮,我输入:“我想给系统加一个操作日志导出功能,用户能选日期范围,然后导出 CSV。请列出你理解的功能点、边界条件和隐含假设;请指出我表述中模糊的地方,并用提问的方式让我确认;请基于你的理解输出一份功能清单。”
AI 返回的功能清单里包含了:日期范围校验、时间跨度上限、CSV 文件编码、字段映射、超大结果集处理等。然后它问了我三个问题:时间跨度是否限制最大 31 天?CSV 用 UTF-8 还是 GBK?字段是固定还是可配置?
这三个问题我原来确实没想清楚。我回答了“限制 31 天、UTF-8、固定字段”,然后让 AI 把确认后的信息整理成最终版功能清单。
第二轮,我输入:“基于这份功能清单,输出结构化伪代码,包含主要函数、循环逻辑、异常分支。”AI 输出的伪代码里有一个细节让我立刻警觉:它在导出逻辑里写了“先全量查询再写文件”,对于用户量大的系统这必然内存溢出。我在伪代码阶段发现了这个问题,让它改成“分批查询 + 流式写入”。这个改动如果放到实现阶段去发现,就得重写大半个功能。
第三轮,我输入:“基于功能清单,为每个核心功能点生成最小测试用例,格式为输入数据 + 预期行为。”它返回了六条用例,包括:正常导出、日期范围为空报错、超过 31 天被拦截、数据为空时生成带表头的空文件、特殊字符转义等。我检查了一遍,补了一条“跨年日期范围”的用例。
第四轮,我输入实现要求,让它生成完整代码。这一步基本没出什么幺蛾子。
第五轮,我让它以评审者身份查代码,它指出了两个问题:CSV 拼接用的字符串拼装没走标准库、异常处理把所有错误都吞掉了。我让它修正后,整个功能从提出需求到可提交,总共花了大约四十分钟,包含三轮人工确认。
2.4 这个工作流的适用边界
这套流程不是所有场景都适用的。它最适合的是逻辑复杂、规则较多、交付后不容易改的业务代码。对于纯 CRUD 的接口、一眼就能看穿的工具函数,走完整套五步反而浪费时间。我的建议是:逻辑超过三个分支、或涉及状态流转、或需要对接外部依赖的场景,值得走全套;简单的场景,只需要两步——先让 AI 列功能清单,再让它实现,就够了。
打一个比喻:这套工作流相当于建筑行业里的“图纸-审批-施工”流程。盖个鸡窝不需要图纸,但盖一栋住人的楼就必须先出图再施工。代码也是同样的道理,复杂的业务逻辑就是住人的楼,不先出图直接施工,后面全是返工。
3. 工作流二:代码解释-语义标注-单测固化-定向重构
3.1 什么时候需要这个工作流
接到一段陌生代码、或者要修改同事半年前写的老模块,打开文件看到几百行没有注释的函数,这种感觉每个开发都经历过。直接问 AI“这段代码是干什么的”,拿到的往往是逐行翻译,看了等于没看。真正的问题是:你看不懂这段代码,往往不是因为不认得语法,而是因为不知道它为什么这么写、这个函数被哪些地方调用、数据流是怎么穿过整个模块的。
工作流二解决的就是这个问题。它的核心目标不是“看懂代码”,而是“安全地改造代码”。两件事有本质区别:看懂是理解,改造是动刀,动刀就得先知道哪里能切、哪里不能切。这套工作流用四个步骤,把一段陌生代码变成一段你可以放心修改的代码。
3.2 四步拆解:从“它是什么”到“怎么改”
第一步,代码解释。把完整文件丢给 AI,让它“以模块为单位解释整体职责,而不是逐行解释;指出主要函数、数据流转、外部依赖;用文字描述这个模块在整个系统里的角色。”这里的关键词是“以模块为单位”——你必须明确要求 AI 跳出行级视角,否则它默认给你每一行都加上注释,输出一大坨噪声,反而把真正的模块结构淹没了。
第二步,语义标注。这一步的输出是一份“结构化的模块说明”,包含:每个函数的输入输出与副作用、每个类的职责边界、模块之间通过什么接口通信。一个很有用的技巧是,让 AI 为每个关键函数生成“调用关系描述”:谁调用它、它调用谁、异常在哪个边界被抛出。这份标注会成为后续所有修改的依据。
第三步,单测固化。看完语义标注之后,让 AI 写出针对现有行为的测试用例。这里有一个原则:先别管代码逻辑是否优雅,先用测试把当前行为“固化”下来。这个动作的原理是建立一条安全网:后续你重构时改坏了任何行为,测试就会报错提醒你。我见过太多开发者改别人代码时不敢下手,就是因为没有这张安全网。有了测试,你就有了“改坏了能发现”的底气。
第四步,定向重构。当你确认测试通过,再让 AI 基于语义标注和测试结果,提出“修改建议清单”。清单里每一项都包含:改动内容、改动理由、影响范围、涉及函数。你确认后再让它逐项实施。千万不要一次性下达“帮我重构这个模块”的模糊指令——那样 AI 会连带你没打算动的地方一起改了。
3.3 实操中的关键细节与真实案例
我拿一个实际场景来说。曾经需要修改某团队遗留的一个用户积分计算模块,代码大概 800 行,没有注释,里面有三个定时任务,还有一份格式奇怪的 JSON。我按照上面的流程操作:第一步让 AI 解释模块职责,它告诉我这个模块里其实混了三块逻辑:积分流水计算、过期积分清理、通知消息组装。这三块逻辑缠在一起,才是这段代码难以理解的根本原因。
第二步,语义标注。AI 把三个隐藏模块拆开标注,每个函数标明了归属。这一步让我意识到:我原本以为我要改的“积分规则”,实际上散落在七个不同的函数里,而且有两个地方逻辑还是矛盾的。
第三步,单测固化。AI 帮我生成了 14 个测试用例,覆盖现有行为。运行后全部通过,有了安全网。
第四步,定向重构。我让 AI 把七个地方的积分规则改动点整理成清单,并标注每一处的影响范围。确认后,修改在半小时内完成,测试全部通过,原有行为没有一处被破坏。
这套工作流里最值得强调的一点是:第四步一定要每次只改一个改动点。如果一次让 AI 改五个点,某个点改坏了,你连是哪个改动引起的问题都难以定位。逐点修改虽然慢,但每一步都有明确的回滚边界。
3.4 适合这个工作流的场景标签
这套流程特别适合三种情况:接手别人写了一半的功能、给老旧模块做小步优化、排查线上问题时需要快速理解某段代码在干什么。它不适合的场景是:代码只有几十行、逻辑一目了然、或者整个模块已经决定废弃要重写。前两者用了浪费时间,最后一种情况应该直接进入工作流一从零重写,而不是在一堆陈旧逻辑上打补丁。
4. 工作流三:报错结构化提取-根因定位-修复建议-验证与沉淀
4.1 DEBUG 的核心痛点
调试是每个开发者每天都要面对的事,也是 AI 编程中最容易翻车的场景。我见过无数人把报错信息原样复制粘贴给 AI,AI 给一个推测,按推测改了,再跑,报错变了,又复制粘贴,再改……循环到第十轮,终于解决了最初的问题,但代码已经被改得面目全非。
这种循环的本质原因,你根本不是在 DEBUG,你是在“试答案”。报错信息只是问题的最表层表现,真正的原因是调用链里的某个环节出了问题。如果你不把完整的上下文喂给 AI,它就只能看到一个残片,给出的建议自然也是盲人摸象。
工作流三的核心思路是:把 DEBUG 从一个“猜测-验证”的循环,变成一个“信息收集-结构化分析-定向修复”的收敛过程。具体分四步:结构化提取报错、构建根因假设、验证假设并修复、沉淀到项目知识库。
4.2 四步排查闭环的完整操作
第一步,信息收集,不能只贴报错文字。至少需要包含:完整报错堆栈、相关代码文件的内容、输入数据样例、这个功能正常时的表现。这些信息拼在一起,AI 看到的就不是一行红字,而是一个完整的“现场”。我的固定话术是:“这是一个报错现场,请帮我做结构化提取。内容包括:1. 报错的核心异常类型和关键信息;2. 涉及的函数调用链;3. 根据输入数据和代码逻辑,列出可能的根因假设,按概率从高到低排序。”
第二步,根因假设。AI 会给出若干假设,每个假设附上验证手段。这一轮的关键是,不要直接改代码,先让 AI 说明“如果这个假设成立,应该在哪一段代码、什么位置能观察到什么现象”,然后你按图索骥去代码里确认。这一步把“猜测-修改-跑测”的盲试,变成了“猜测-取证-确认”的推理。
第三步,定向修复。根因确认后,让 AI 基于根因给出修复方案,而不是直接给代码。修复方案必须包含:改动点在哪、改成什么、为什么这么改能解决根因、会不会引入其他副作用。你认可方案后再让它生成代码。这一步是为了防止一种情况——AI 改了报错表面问题,但根因还在,下次换个输入又爆。
第四步,沉淀。修复完成后,把“现象 + 根因 + 修复方式”整理成一段简短记录,放进项目的 docs/debug-notes 或维护一个 DEBUG.md 文件。这一步的价值是积累项目自己的排错知识库。
4.3 一次完整排查记录
有一次,系统上一个报表接口偶尔返回 500,重启后又好了,非常有迷惑性。我把完整的报错堆栈、涉及的查询代码、以及触发时的输入参数交给 AI,让它做结构化提取。
AI 的第一轮输出指出了三个信息:异常类型是数据库连接池获取连接超时、调用链中有一个嵌套事务、输入参数里有一个“日期范围为空”的边界值。它给了三个根因假设:一是连接池耗尽,二是嵌套事务导致连接长时间占用,三是空参数导致查询走了异常分支而且没释放连接。
我没有直接改代码,而是按它的验证建议去检查:看监控面板,连接池活跃连接数峰值确实打满;代码里确实有一个自嵌套事务方法,外层事务一直持有连接直到整个报表生成结束。结合空参数场景,走的分支在异常捕获里吞掉了错误,但没有释放底层连接。到这里根因其实已经是三重叠加:空参数是扳机,嵌套事务是放大器,连接池耗尽是最终爆发点。
我让 AI 基于这三个根因给出修复方案。它的方案分三层:入口参数加默认值校验、嵌套事务改为 REQUIRES_NEW 避免长时间占连接、异常分支里补充资源释放。逐一确认后让它生成修复代码,上线后再也没有出现过这个报错。整个排查过程大约一小时,比传统的人肉看代码快了很多,而且最大的收获是那一段 DEBUG 记录,沉淀下来后,上个月同样类型的问题另一位同事只花了十分钟就定位了。
4.4 这套 DEBUG 工作流能解决和不能解决的问题
它能解决的问题类型:有明确报错堆栈的异常、偶发现象能够稳定复现的场景、问题涉及多个模块联动的情况。它解决不了的问题:没有明确报错的性能瓶颈、需要业务直觉来判断“这样设计是否合理”的问题。后者依然需要人来做判断,AI 只能提供数据辅助。
5. 三个工作流的横向对比与选择策略
看到这里,你会发现三个工作流虽然场景不同,但底层有一个惊人一致的哲学:先让人和 AI 对话对齐认知,再让 AI 动手写代码。工作流一里是“功能清单对齐”,工作流二里是“语义标注对齐”,工作流三里是“根因假设对齐”。对齐之后才允许 AI 进入“生成代码”这个动作。这个顺序不能反,反了 AI 就变成了一只乱撞的苍蝇。
我整理了一张表格,方便你在实际工作中快速选择:
| 场景特征 | 推荐工作流 | 核心动作 | 关键产出物 |
|---|---|---|---|
| 从零开发新功能、需求较复杂 | 工作流一(五步全流程) | 需求澄清-伪代码-测试先行-实现-重构 | 确认过的功能清单与测试用例 |
| 开发简单 CRUD 或工具函数 | 工作流一(精简两步) | 功能清单-实现 | 一份简短确认单 |
| 接手陌生代码、准备改造 | 工作流二(四步) | 代码解释-语义标注-单测固化-定向重构 | 模块文档与行为测试 |
| 线上报错、偶现 bug、调用链复杂 | 工作流三(四步) | 结构化提取-根因假设-定向修复-沉淀 | 根因记录与修复笔记 |
| 几十行小函数、逻辑一眼可见 | 无脑直接问 | 直接提问 | 无 |
选择策略就一条:根据你对这个任务的风险评估来定。风险高(改错代价大、逻辑复杂、影响范围广)就走完整流程;风险低(小工具、一次性脚本、自己马上能验证)就直接问。不要一刀切。
重要提醒:这三个工作流都需要你具备基本的代码阅读能力。工作流里反复出现的“确认”“检查”“判断”环节,AI 只是帮你把信息结构化,最终决策权仍然在你手里。如果你完全看不懂代码,任何工作流都救不了你。AI 编程工作流不是让不懂代码的人写代码,而是让懂代码的人写得更快更稳。
6. 常见错误、避坑经验与个人心得
使用这三套工作流的这段时间里,我总结了一些容易犯的错和对应的解决经验,按踩坑频率从高到低盘点一下。
第一,跳过“确认”环节是最大的错误。工作流里的每一步“确认”,本质上是在做纠偏。很多开发者觉得 AI 写出来的伪代码没问题,草草看一眼直接进入下一步,结果到实现阶段跑偏了,再回头改,反而比不走工作流还慢。我自己的应对办法是:确认环节不要用“看起来没问题”来判断,而是拿真实场景去验证。比如伪代码阶段,专门想一个边界输入丢进去,看它的逻辑会不会炸。这是一种低成本高收益的纠错手段。
第二,输入上下文不完整。很多人在第二步语义标注、第三步 DEBUG 场景里只给片段代码、或只给报错信息,导致 AI 只能在信息残缺的情况下猜测,猜错了还怪 AI 不行。现在我的习惯是:套一个固定的输入模板,把模块职责、相关文件列表、已知行为、期望输出一次性喂给 AI。
第三,让 AI 一次改动太多。这在工作流二和工作流三里都容易犯。一次让 AI 处理多个改动点,出了问题无法定位,回溯成本急剧上升。我现在给自己定了个规矩:工作流二里一次只确认一个修改点,工作流三里一次只验证一个根因假设。
第四,低估了“沉淀”环节的价值。DEBUG 记录和项目知识积累看起来琐碎,但长期来看回报率非常高。同一个项目里,很多报错是相似甚至重复的,有了历史沉淀,第二次遇到同类问题只需要查文档,五分钟结束战斗。
第五,没有把“工作流”落实到工具层面。这三个工作流本质上是一套对话模板 + 动作顺序。我建议你把它固化到你的 AI 编程工具的提示词预设里,或者做成一个 Markdown 文件放在项目根目录,随时调用。不要每次都重新凭空组织语言。
最后聊一点个人体会。我刚开始用 AI 编程的时候,总觉得多问几轮、多给点提示词,它就能自动把活干完。实际用下来发现,真正产生价值的时刻,几乎都是“人在关键节点做出准确决策”的时刻。AI 负责把信息摊开、把选项列全,人负责判断方向、把关质量。这三个工作流,本质上就是一套把“AI 的信息处理能力”和“人的决策能力”排列组合起来的打法。你不需要成为提示词专家,只需要在正确的节点做正确的事,就能让 AI 的生产力翻倍。这也是我写下这篇文章的初衷——希望你能绕开我走过的弯路,直接把这套打法上手用起来。