Skip to content

AI Coding 规划与实践

很多人把 AI Coding 理解成一句话:“让 AI 帮我写代码。”

但真正把 AI 用进开发流程之后,你会很快发现,问题根本不在“能不能生成代码”,而在另外几件事上:

  • 需求有没有拆清楚
  • 上下文有没有给对
  • 哪些改动应该让 AI 直接做,哪些必须人工判断
  • 改完之后怎么验证、怎么回归、怎么防止越写越乱

所以这页讨论的不是“哪个 AI 编码工具最强”,而是:开发者应该怎样规划 AI Coding,才能让它成为稳定的工程能力,而不是偶尔灵光一现的捷径。

先区分三种不同的事

1. 聊天式问答

你把问题抛给模型,让它解释概念、分析报错、给出思路。这适合拿来补知识、拆需求、写草稿,但通常还没有真正接触代码库状态。

2. 代码生成与编辑

模型直接基于文件内容、上下文和工具调用去改代码。这已经不是普通问答,而是在影响真实代码结构,所以需要更强的约束和验证。

3. Agent 化编码

模型不仅改一段代码,还会自己读文件、搜索、列任务、运行命令、连续多步执行。它的效率可能更高,但风险也更高,因为失控范围更大。

AI Coding 最核心的判断

AI Coding 的质量,通常不取决于模型“聪不聪明”,而取决于你是否把下面四件事做好:

  1. 任务边界清不清楚
  2. 上下文是否准确、足够、不过量
  3. 验证方式是否明确
  4. 哪些步骤必须人工兜底

如果这四件事没有做好,换再强的模型,也很容易出现“看起来改了很多,实际上越改越乱”的情况。

一条适合开发者的最小工作流

第一步:先拆任务,不要直接让 AI 大包大揽

最危险的用法,是把一个模糊的大任务直接丢给模型,比如“把这个项目重构一下”“把这个模块改好”。这样模型很容易误判范围,改动扩散,最后你也很难 review。

更稳妥的方式是先拆成:

  • 目标是什么
  • 影响哪些文件
  • 哪些只是阅读,哪些会改代码
  • 做完以后怎么验收

第二步:只给当前任务真正需要的上下文

上下文过少,模型会瞎猜;上下文过多,模型会抓不住重点。最好的做法不是“把整个仓库都塞进去”,而是先给当前任务需要的文件、规则、接口关系和目标边界。

这也是为什么 AI Coding 和普通 Prompt 工程不同。这里的“上下文工程”不只是措辞,更是任务设计。

第三步:让模型先解释它准备怎么做

如果任务稍微复杂一点,先让模型说明:

  • 它理解的目标是什么
  • 准备改哪些地方
  • 哪些地方存在不确定性
  • 验证方式是什么

这一步不是浪费时间,而是在低成本暴露误解。很多偏航,其实在动手前就已经能看出来。

第四步:改完必须验证

AI Coding 最大的问题之一,就是“生成看起来很顺,但没有经过真正验证”。所以你至少要明确:

  • 运行什么构建或测试
  • 哪些行为需要人工点一下确认
  • 有没有可能引入隐藏回归

只看代码 diff 远远不够。

什么任务适合先交给 AI

下面这些任务通常比较适合:

  • 补充样板代码
  • 改局部文案或结构化字段
  • 从已知模式扩展出相似实现
  • 先做第一版方案,再由人工 review
  • 在明确文件范围内补测试、补注释、补文档

什么任务更容易失控

下面这些任务要格外谨慎:

  • 需求本身还没讲清楚
  • 涉及多个模块、多个系统、多个角色协作
  • 你自己也不确定该怎么设计
  • 需要大面积重构,但没有验收标准
  • 有安全、权限、支付、数据删除等高风险操作

这类任务不是不能用 AI,而是要先做规划,再让它执行局部步骤。

AI Coding 里最常见的 5 个失控模式

1. 任务太大,模型开始自行扩张范围

它可能顺手重命名、顺手抽象、顺手改样式、顺手改配置,最后已经不是你一开始要的东西。

2. 上下文不完整,模型开始脑补

比如没看到真实类型定义、没读到已有约束、不了解项目规则,就会产出“看起来合理、实际上不匹配”的代码。

3. 只生成,不验证

这是最常见也最危险的问题。模型经常能写出“像是对的”的代码,但真正运行时才会露出边角错误。

4. 把设计决策也外包掉

模型可以帮你比较方案,但如果你自己没有先判断目标和权衡,就很容易把架构决策也一起交出去。

5. 忘了安全边界

当 AI 不只回答问题,而能运行命令、读写文件、调用工具时,风险已经进入系统层面。

写好 AI Coding 提示词的实战技巧

前面讲的工作流和失控模式,本质上都在回答一个问题:怎么把任务交代清楚。落到操作层面,就是你写给 AI 的那段提示词到底长什么样。

AI Coding 场景下的提示词,和普通聊天场景有一个关键区别:你不只是在让模型"回答问题",而是在让它改真实代码。所以提示词的目标不是"让回答更像样",而是"让改动可控、可验证、不扩散"。

用结构拆清任务,不要靠一段话说完

模糊的一段话,模型很容易只抓住其中最醒目的部分,其他细节自动忽略。把提示词拆成几个明确的区块,模型的执行准确率会明显提升。

一个在 AI Coding 中比较实用的结构:

text
【角色】你是一个熟悉 React + TypeScript 的前端工程师。
【任务】优化下面这个列表组件的渲染性能。
【输入代码】(粘贴组件代码)
【约束】
- 使用 React.memo 和 useMemo
- 不要改动组件的 props 接口
- 不要拆分成多个文件
【输出要求】只输出修改后的完整组件代码,不需要解释。

这个结构不是唯一正确的写法,但它的好处是:任务目标、输入、约束和输出格式都各占一块,模型不容易搞混。

正向描述优先,少用否定句

模型对"应该做什么"的理解,通常比对"不要做什么"更稳定。

原因不复杂:否定句在语义上更间接。你说"不要用 JavaScript",模型需要先理解 JavaScript 是什么、再理解"不要"、再推断你想要什么。不如直接说"请使用 TypeScript"。

对比两种写法:

  • 写法 A:帮我写一份开发计划,文件不要用 txt 格式
  • 写法 B:帮我写一份开发计划,输出为 Markdown 格式,注意排版层级清晰

写法 B 直接告诉模型该做什么,模型更容易命中目标。否定句不是不能用,但在描述核心要求时,正向表述通常更稳定。

明确输出边界

AI Coding 场景中,最常见的意外之一是模型"顺手"改了你没让它改的地方。

在提示词里加上输出边界约束,能有效减少这类扩散:

  • "只修改 handleSubmit 函数,不要改动其他部分"
  • "只输出代码,不要添加解释"
  • "如果不确定某处该怎么改,保持原样并标注 TODO"

这些约束看起来很简单,但在模型执行多步任务时,它们就是在画线。

用多个模型迭代提示词

一个实际可用的提示词,很少是一次写对的。更常见的过程是:写一版、跑一次、看结果、再改。

如果你手边有多个模型可用(ChatGPT、Claude、Gemini、Cursor 内置模型等),可以把这个过程变成一套简单的迭代流程:

第一步:起草

先用任意一个模型把提示词初版写出来。甚至可以让模型帮你起草——"我想让 AI 帮我做 X,请帮我写一段结构化提示词"。初版不用追求完美,能把意图说清楚就行。

第二步:测试

把提示词放到你实际用的工具里跑一次(比如在 Cursor 里用它改代码)。观察输出:格式对不对、有没有遗漏、有没有越界改了不该改的地方。

第三步:针对性修改

根据输出里暴露的问题,调整提示词。常见修改方向:

  • 补上模型没注意到的约束
  • 删掉让模型分心的冗余信息
  • 把模糊的要求改具体

不要盲目把提示词越写越长。每次修改对应一个具体问题,改完再跑一次。

第四步:多模型对比

同一段提示词在不同模型上的表现可能差异很大。一个模型格式完美但逻辑有错,另一个逻辑对了但格式跑偏——比较之后你会更清楚提示词本身哪里还不够稳。

不同模型的能力侧重确实不一样:有的更擅长代码生成,有的推理更强,有的在长上下文场景下更稳定。但具体模型的能力边界变化很快,与其记一张对比表,不如养成"关键任务多跑一个模型对比"的习惯。

第五步:保存和复用

跑通之后,把效果好的提示词保存下来。可以是一个 Markdown 文件,可以是 Cursor 的 rules 文件,也可以是你自己的提示词库。

好的提示词不是用完就扔的。下次遇到类似任务,从模板开始改,比从头写快得多,质量也更稳定。

这套流程不复杂,但它背后有一个判断:提示词的质量不是靠灵感,是靠迭代。写得越多、测得越多、比较得越多,你对"什么样的描述模型容易理解"的感觉就会越来越准。

AI Coding 和站内其他章节的关系

这页不是孤立专题,它和很多章节天然相连:

一个简单的自查清单

在把一个开发任务交给 AI 之前,你可以先问自己:

  1. 我是否已经把任务拆到足够小?
  2. 我是否明确了会影响哪些文件?
  3. 我是否知道做完之后怎么验证?
  4. 这件事里是否有必须人工判断的架构或安全问题?
  5. 如果模型理解错了,我能否很快发现?

如果前 3 条还没想清楚,最好不要急着让 AI 直接执行。

稳定拆任务、控上下文、做验证、守边界——能把这四件事做稳,AI 才会真正融入工程流程。做不稳,就还是偶尔生成几段代码,大部分时间在救火。

面向开发者系统学习 AI 应用开发、RAG、Agent 与 Vibe Coding。