ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI写代码先做方案:降低返工率的实战工作流

AI写代码先做方案:降低返工率的实战工作流 先写方案再写代码这句话我反复跟身边人念叨了不下几十遍。很多人用 AI 写代码上来就说“帮我写个xx系统”把需求一句话甩给大模型然后就看它自由发挥。说实话能用但真到项目落地、要扩展、要维护的时候你会发现代码库乱成一锅粥。我自己把工作流改成“先出方案、后写代码”之后项目返工率明显下降今天就把这套方法完整拆开聊一聊适合正在用 AI 工具做开发、但总觉得效果差点意思的朋友。1. 为什么要让 AI 先写方案直接让它写代码到底坑在哪1.1 大模型的“第一版代码”往往最不靠谱先说说我观察到的现象。很多人包括我早期用 Claude、通义千问这类大模型写代码习惯于一句话把需求丢过去“用 Python 写一个爬虫”“帮我写个 Flask 博客”。模型确实能交出一版能跑的代码看起来结构也完整但问题恰恰藏在这“看起来完整”里。大模型的底层机制是概率生成它追求的是“大概率正确的下一段代码”而不是“从全局最优出发的系统方案”。这意味着它倾向于把功能堆在一个文件里因为单文件生成的成功率最高拆模块容易在某一步断掉它会照搬训练数据里最“常见”的模式哪怕这个模式跟你的项目场景根本不合适它不会主动考虑异常分支因为训练语料里正常的代码远比异常处理多最致命的是它没有“规划”概念写到哪算哪后续扩展时你会发现自己根本改不动。我拿一个实际案例来说。有次我想做一个 Markdown 批量转换工具需求是读取文件夹下所有 md 文件转成 HTML再按目录结构输出。我让 AI 直接写结果它给我的方案是单文件搞定用正则替换来解析 Markdown。跑一次没问题但我要加个代码高亮、想支持自定义模板就得从头改。后来我让它先出方案它给了三个选项用 Python-Markdown 库、用 Pandoc 方案、或者调用外部 API。最终我选了 Pandoc加个 10 行代码就能支持高亮和模板后续扩展非常顺。同一个需求两种处理方式代码质量和可维护性天差地别。1.2 写方案的本质是“让错误发生在文档里”先说个扎心的现实代码重构的代价远超文档修改的代价。你在方案阶段发现架构选型不对改的只是一页纸到了代码写了一半才发现问题改的是堆积如山的函数和类。所以“AI 先写方案”这件事本质上不是多一道没用的流程而是把试错成本最低的检验环节提前了。方案是文字错了删掉重建就行代码是逻辑错了可能牵一发动全身。那为什么一定要让 AI 来写方案因为 AI 在“穷举可能性”这件事上远胜人类。你让它给方案它能一口气列出技术选型的五六种选项你能从中挑出最适合的你让它设计数据库表结构它能把字段、索引、外键关系都列出来供你评审。人做方案容易被经验局限AI 做方案受训练语料广度影响反而能覆盖很多你没想到的方向。让 AI 先写方案是用它的广度补你的盲区再用你的经验做最后拍板。1.3 方案先行对项目全周期的实际影响这套流程的核心价值不只在写代码那一下而是覆盖整个项目周期。开发阶段少返工方案定好了边界代码实现就是翻译过程改动的往往是细节而非结构协作时更高效多人协作时一个人拿出的方案可以直接被其他人评审和修改各环节并行推进维护期更好过三个月后回来看代码你对照方案文档就能快速理解当初的设计意图不用从代码里反推架构。我自己实测下来用“先方案后代码”的工作流一个中型项目的总开发时间反而比“直接写代码再反复改”要短。前期多花两小时写方案后期少花两天改 bug这笔账怎么算都值。2. 从一句话需求到结构化方案实操三步走2.1 第一步把模糊需求逼成清晰描述这步看起来基础但大多数人做不好。你说“帮我写个图书管理系统”AI 能给出的方案必然泛泛而谈因为它不知道你是给图书馆用还是给个人用、是 Web 端还是客户端、需不需要借阅流程、数据量多少。需求不清楚方案必然走样。我的做法是在给 AI 提示词之前先自己把需求填进下面这个框架里项目定位一句话说清楚这是什么产品/工具 目标用户谁在用、在什么场景用 核心功能列 3~5 条必须有的能力 限制条件技术栈、性能要求、部署环境、预算 非目标明确说“不要做什么”防止 AI 自由发挥这个梳理过程本身就有价值它让你在动笔之前先想清楚要什么。举个例子我最近做一个“个人记账 CLI 工具”时给 AI 的需求描述是这样的项目定位一个基于 Python 的本地命令行记账工具 目标用户单人使用不涉及多用户权限 核心功能记录收支、分类统计、月度报表导出 限制条件纯本地运行数据存 SQLite不需要网络输出格式要求 CSV 和 Markdown 两种 非目标不需要图表界面不需要云同步不需要预算预警这样 AI 生成的方案才真正有针对性。2.2 第二步用结构化提示词让 AI 生成方案描述清晰之后进入核心环节让 AI 产出方案。这一步的关键是提示词的结构化程度。你直接说“请给我一份技术方案”它会给但往往流于形式缺少可评审的细节。我把自己的方案提示词模板分享出来实测效果稳定我准备做一个[项目类型]项目描述如下 [把你的需求描述粘贴进来] 请你扮演资深[语言/框架]架构师先不要写任何代码。 请基于以上需求输出一份技术方案包含以下部分 1. 整体架构设计模块划分、数据流方向、运行流程 2. 技术选型及理由列出 2~3 个候选方案给出对比和最终推荐方案 3. 数据库/数据模型设计如适用表结构、字段含义、关键索引 4. 核心接口或函数设计每个模块的职责、输入输出约定 5. 需要处理的关键细节边界条件、异常场景、潜在性能瓶颈 6. 可能的扩展点未来如果要加功能方案的可扩展性如何 7. 风险与对策当前方案里可能踩的坑及应对措施 请务必给出多个可选方案时做对比说明最后附一段不超过300字的方案摘要。用这套提示词跑出来的方案明显比直接要方案靠谱。因为你在指令里明确规定了输出的结构和维度等于给 AI 限定了一张“方案评审表”它会按着框架逐项填内容。尤其那句“先不要写任何代码”一定要加。不加这句你会发现 AI 写了几段方案之后还是忍不住甩一段代码出来那就把方案流程破坏了。2.3 第三步和 AI 多轮对话打磨方案第一轮生成的方案能用但离“可落地”往往还有距离。需要多轮对话来完善我一般会做这三类追问质疑类“这个技术选型在数据量达到百万级时会不会有问题给出你的分析。”补充类“异常处理部分再细化列出所有你想到的边界情况。”对比类“如果我把存储从 SQLite 换成 PostgreSQL方案要改哪些地方”这一环节常被忽略却恰恰是“先写方案”的价值放大器。大模型对话是有记忆的你每追问一轮它输出的内容都会基于上一轮的信息做修正。这几轮追问下来方案会从“完整”变成“经得起推敲”。另外提醒一句在方案阶段就要把“非目标”告诉 AI。比如我那个记账工具明确写了“不需要预算预警”不然 AI 会顺手在方案里加一堆你根本不需要的模块——功能膨胀会让方案越来越重开发和维护成本水涨船高。明确告诉它“这些不用做”方案的收敛速度会快很多。3. 方案评审AI 给方案人来做决策3.1 方案不是拿来直接用的是拿来审的很多人以为“先写方案”就是让 AI 出一份文档然后照着文档让它写代码。这是误区。方案是给人评审的素材不是可以直接拍板的答案。AI 生成的方案里技術选型往往会倾向“主流、稳妥”但不一定适合你的真实场景。比如我遇到过 AI 给一个纯本地小工具推荐用 FastAPI Docker 部署的情况——技术上没错但杀鸡用牛刀环境依赖还重。方案如果没人把关直接把这种过度设计带到代码里后面维护就是灾难。所以拿到方案后我固定的评审动作有三个逐条对比需求方案里每个模块是不是都覆盖了需求里提到的东西有没有多出来的、需求里没要求的审视技术选型这个选型对我当前的运行环境、部署方式、团队熟悉度是否合适不要因为“流行”就选它。推演异常场景把方案里写的“对于异常情况……”这部分展开想象这些异常真的发生时方案里的应对是否真的有效这三个动作做完方案才具备可执行性。3.2 一张我实际在用的方案评审清单评审过程不能靠感觉我给自己总结了一张清单每次评审都会逐项打钩评审维度检查重点我自己的判断标准完整性需求条目是否全覆盖需求里每一条核心功能在方案中都能找到对应设计找不到就说明漏了合理性技术选型是否匹配场景选型有没有大炮打蚊子或过于迁就旧技术导致难维护简洁性模块划分是否干净各模块职责是否有重叠有没有职责模糊的“万能模块”可扩展性加需求时改动范围多大加一个新功能改动只涉及一个新模块或小范围改动为佳异常处理边界条件是否列出空数据、并发请求、断网、非法输入这些最常被忽略可测试性输出结果能否验证每个模块的输入输出是否清晰能否独立测试成本评估开发、维护成本是否可控方案是否引入了不必要的学习成本或运维成本样例里“简洁性”这条最容易被忽略。AI 生成的方案有时模块划分非常细给你拆出十几个模块看着“专业”实际每个模块只有几行代码逻辑纯属把简单问题复杂化。我通常会把过小的模块合并宁可代码里少几个文件也别让结构撑破需求本身。3.3 评审完了还不够要把结论固化到方案里评审不是为了“看一遍觉得行”而是要把修改意见反馈给 AI让方案文档变成“最终版”。我一般会让 AI 按评审意见更新方案并且明确要求它把改动点标出来。这一步的意义在于后续真正写代码时AI 依赖的是这版最终方案而不是它最初生成的那版。这个操作步骤就三句话以上方案我评审后有几点修改 1. [修改点1尽量具体到模块/接口层面] 2. [修改点2] 3. [修改点3] 请基于以上修改意见重写方案并用列表的方式列出本次相比上一版改动的地方。跑完这个流程方案文档作为整个开发过程的“锚点”就算立住了。后面每一步代码实现都要以这个锚点为准而不是让 AI 自由发挥。4. 方案落地到代码如何让 AI 不偏题地实现4.1 把方案喂回给 AI分段生成代码方案评审通过后接下来才进入写代码阶段。但这里有个同步陷阱很多人会把方案当成“背景说明”直接丢给 AI然后说“开始写吧”AI 一口气输出几百行代码方案里的模块边界又被搅浑了。我建议按模块拆解一次只让 AI 实现一个模块。具体操作是我正在实现[项目名]当前方案如下 [把最终版方案粘贴进来] 现在请只实现“数据分析模块”部分 - 输入约定…… - 输出约定…… - 需要包含的函数接口…… - 暂时不要实现其他模块不要改动已有代码这样做的原因是大模型每次对话的上下文窗口有限你把所有需求一次塞进去它在生成后续代码时会逐渐“忘记”前面的约束。拆成模块逐段做每一段都有完整的方案作为上下文生成质量会高很多。而且拆模块生成的代码还有一个好处每一段出来都能立刻跑测试。你不需要等 AI 把整个项目写完才开始验证而是每完成一个模块就测一个模块问题定位成本成倍降低。4.2 代码生成后的“方案合规检查”AI 生成的代码即使是在方案约束下也经常会出现偏离。我的经验是无法完全信任它需要做一次“方案合规检查”把代码翻出来逐项对照方案模块划分有没有变 AI 有时写着写着就把几个模块合并到一个文件里了接口名称和参数是否和方案一致方案里定的函数名、参数名代码里最好完全一致否则后续你按方案来维护会找不到东西异常处理是否保留了生成代码时 AI 会为了“看起来简洁”省略一部分异常处理这是最常丢的。检查出不符合的地方不用自己改直接把差异反馈给 AI你生成的代码和方案有以下不一致 1. 方案中要求 xxx 模块单独一个文件你写在别的文件里了 2. xxx 函数的异常处理缺失 3. 这里不应该用全局变量方案里约定的是参数传入 请修正代码保持和方案一致。这个环节相当于给 AI 加了一个“复查流程”纠回它跑偏的地方。实际用下来两三轮往返之后代码就能稳定在方案约束的轨道上。4.3 让 AI 生成配套测试用例和代码注释按方案写代码还有个容易被忽略的好处测试用例生成更准确了。方案里定义了每个模块的输入输出你可以直接让 AI 基于方案里的约定来写测试基于方案中的“数据分析模块”输入输出约定 - 输入原始流水 DataFrame包含 amount、category 两列 - 输出统计报表 DataFrame包含 category、total_amount、count 三列 请用 pytest 为这个模块写测试用例覆盖正常情况、空数据输入、非法类型输入三种场景。这样生成的测试用例针对性很强而且覆盖了最容易出错的边界条件比自己拍脑袋写测试全面得多。5. 常见问题与排查技巧实录5.1 AI 给出的方案过于宏大功能膨胀怎么办这是我最常遇到的问题AI 会在架构阶段顺手引入缓存层、消息队列、微服务这类重型组件。明明是个 200 行代码能解决的小工具它非要给你上个生产级架构。处理方式有两个在需求描述里就明确“非目标”我那个记账工具就写明了“不需要云同步、不需要多用户、不需要 Web 界面”在方案生成后逐条砍凡是需求里没提的模块全部要求 AI 从方案里删除并要求它说明删除后对现有功能没有任何影响。砍到最后你会发现方案清清爽爽对应的代码也大幅简化。记住一句我老挂在嘴边的话需求之外的功能都是债。5.2 方案写得天花乱坠但 AI 生成的代码实现不了有一种情况是方案本身没问题但代码实现出现了偏差。比如方案里写了“使用 Redis 做缓存”但运行环境里根本没装 RedisAI 却默认它能用。这个问题的本质是 AI 对“现实环境”无感知它不知道你本地有什么依赖、什么版本。解决方式是在让 AI 写代码之前把我的环境信息写到提示词里。环境说明Windows 11Python 3.11已安装的库包括 pandas、flask不建议新增依赖如必须新增请先说明理由。这样 AI 在生成代码时就会有意避开没装过的依赖不要的内存和性能优化也会收敛很多。5.3 多轮对话后 AI 忘了最初的方案约束大模型对话存在上下文遗忘问题聊了十几轮之后最原始的方案约束会被稀释。你问 AI “前面那个模块的需求是什么”它可能已经记不全了。我的处理习惯是关键约束每隔几轮就重复一次或者把最终版方案固定在对话里。如果项目复杂度高我会把方案存成独立文档每轮让 AI 生成代码之前粘贴方案里相关的片段而不是依赖它“记住”。这样看起来多了一点操作量但可以最大程度避免上下文污染导致的代码偏离。5.4 代码能用但很丑助手生成的代码风格无法统一AI 生成的代码风格受模型版本影响很大有时它喜欢用列表推导式有时又喜欢写循环。多人协作时风格不统一会让人崩溃。我的做法是把代码风格要求写进系统提示词里代码风格要求 - 使用 Google 风格 docstring - 类型注解必须完整 - 变量命名使用 snake_case - 单函数控制在 50 行以内超过就拆分 - 禁止使用全局变量这段风格约束在生成代码和生成测试用例时都要带上。AI 对规范类指令的遵循度相当高统一风格的效果明显。6. 一些我反复踩坑后的个人心得整套流程跑了一年多我最大的感受是先写方案再写代码核心不是约束 AI而是约束我自己。我自己之前很喜欢“快”——需求一到就开写出 bug 就改改不动就重构中间浪费的时间非常多。现在多了写方案这一步看起来“慢”了但每段代码都是目标明确的很少因为返工来回折腾。说到底方案是给自己省时间的。再分享一个小技巧方案文档里有一个部分价值被很多人低估了就是“为什么选这个方案”。AI 在生成方案时让它把每个技术选型的理由写清楚不要只看结论。等三个月后你回来看代码看到“为什么不用 X 而用 Y”的记录能省掉大量重新推敲的时间。这份记录是方案里最值钱的内容之一。最后想说的是AI 写代码这件事工具本身差异没有想象中大真正拉开差距的是使用方式。先方案、后代码的工作流对我来说不只是一个效率技巧更是一种降低项目不确定性的思维习惯。如果你现在还在用“一句话甩需求”的方式让 AI 写代码建议下个项目试试这套流程跑通一轮之后你就明白我说的价值了。
返回列表