最近一个明显的变化是:AI 辅助写代码这件事,讨论重点已经从“能不能生成一段能用的函数”,变成了“能不能把一个跨多个文件、需要十几个步骤、中间还会反复出错和返工的任务完整跑完”。标题里那句话其实点破了核心——真正的提升出现在 coding 上,尤其是 long-horizon tasks,而且模型是专门为此做过训练的。
我自己的使用体感也吻合。前两年的模型,你让它写一个独立函数,表现经常不错。但你要让它“从零实现一个带后端接口、数据库表、前端页面和测试的小功能”,它往往会在第三个文件写完的时候,忘记了第二个文件里定义的数据结构。你会反复给它补上下文、纠正错误、重新描述需求,最后发现你花的精力比自己写还多。这不是模型不聪明,而是它根本没被训练成“能长期保持任务记忆”的工具。
最近这一波所谓 coding plan、vibe coding、spec-driven 开发、AI coding 笔试之类的话题频繁出现,本质都是在围绕同一个问题打转:当 AI 能参与的不再是一次性代码生成,而是完整软件任务时,我们该怎么和它协作?这篇文章不想复述哪个产品出了什么新功能,而是想把这段时间观察到的变化、实际跑任务的经验、以及踩过的坑整理成一个可复用的思路。你可以把它当成一份“如何让 AI 真正帮你干活”的实操笔记。
1. 真正的进步不是写代码更快,而是能处理更长的任务链
1.1 什么是 long-horizon task,为什么它才是真正的分水岭
Long-horizon task 在 AI coding 语境下,指的是一类需要很多步骤才能完成的开发任务。它的典型特征有三个:
- 跨文件:改动会涉及多个模块、多个目录,甚至前后端同时变动。
- 跨决策点:中途需要根据中间结果做出判断,比如“这个 API 返回结构和预想不一致,是改后端还是改前端”。
- 长上下文依赖:第 20 步时依然需要准确记住第 2 步定义的设计约束和关键变量名。
这不是靠把 context window 拉大就能解决的问题。上下文长度更长,只代表模型“能看到”更多历史内容,不代表它“会主动维护”任务主线。真正的 long-horizon 能力,是模型在每一步决策时都知道自己处在整个计划的哪个位置、下一步该做什么、做完之后如何验证。
过去大家熟悉的 AI coding 更多是“短视”的:给定眼前这段代码或问题,生成一个局部合理的回答。它擅长补全函数、写单元测试、解释报错。但一旦任务是“给这个项目增加用户注册功能,包含数据库迁移、接口、页面、表单校验和错误提示”,模型容易被局部目标带跑。
1.2 为什么过去模型在长任务上容易散架
我观察到的典型失败模式有三种:
第一种:上下文漂移。模型在处理早期代码时定下的命名约定、数据字段、错误处理风格,到后期逐渐不稳定。它可能在第一个文件里用user_id,到第五个文件里无意识地写成了userId。如果你没有强约束,它很难自己维持一致性。
第二种:局部最优陷阱。模型在生成每个文件时,倾向于让“这个文件”看起来合理,而不考虑“整个项目”是否能编译、是否能跑通。写接口的时候不考虑前端调用方式,写数据库模型的时候不考虑迁移脚本。
第三种:缺少验证回路。人类开发者在完成一步后通常会跑测试、查日志、看界面反馈。但过去的模型往往只生成代码,不生成验证步骤。它不会主动说“你应该先跑这组测试,再看这个报错”。
这些问题在过去被归结为“模型不够聪明”,但现在看更准确的说法是:训练目标里没有把“完成一个长任务”作为核心优化项。标题里那句 “explicitly trained on it” 指的就是这个转变——把长任务完成度作为训练目标,而不是只看单步生成的准确率。
1.3 这个转变对普通开发者意味着什么
一旦模型真的具备处理长任务的能力,最直接的影响是:AI 从一个“结对编程的补充角色”,变成了可以接手整段子任务的执行角色。你不再需要把需求拆成一个个函数喂给它,而是可以给它一个更完整的任务描述,让它自己规划、执行、验证。
但这不意味着你什么都不用管。恰恰相反,它需要的不是更少的参与,而是更高质量的参与。你需要学会定义任务边界、检查中间产物、制定验收标准。换句话说,AI 能力的提升,把开发者的工作重心从“写每一行代码”推向“定义和审核整个任务”。
2. vibe coding、coding plan、spec-driven:三种工作方式的真实边界
2.1 vibe coding 解决的是“从无到有”,不是“从有到对”
网上关于 vibe coding 的讨论很多,这个词大意指的是用自然语言描述你想要什么,让 AI 直接生成代码,你像“vibe”一样凭感觉接受或拒绝输出。它适合的场景是:
- 原型验证。
- 一次性脚本。
- 个人项目里的工具类代码。
- 你已经有能力判断对错,但懒得手打。
vibe coding 的最大问题在于缺少约束。你让 AI 生成一个登录页面,它给你一个能跑的样子,但你没有指定安全要求、异常处理、数据校验规则。如果这是一个内部演示,那没问题;如果是要上线的功能,这就很危险。
我见过不少初学者把 vibe coding 当成“不用学编程也能做软件”的捷径。这是对它的误解。vibe coding 是“让 AI 帮你写代码”,前提是你依然要能读懂代码、验证行为、知道哪里可能出错。否则你只是在把错误加速生产出来。
2.2 coding plan:把“计划”从人脑移交到工具
热词里反复出现 coding plan,很多产品也推出了类似功能。它和 vibe coding 最大的区别在于:工具会先输出一个实现计划,列出要改哪些文件、按什么顺序改、每个文件改什么,然后再逐步执行。有的产品干脆把这套能力做成了会员订阅服务,像“GLM coding plan 7 天体验卡”这类活动也出现在热搜里。
我对 coding plan 的理解是:它试图把人类开发者“先想后做”的流程,显式地嵌入到 AI 的执行过程里。这比直接生成最终代码更可靠,因为计划阶段暴露了模型对任务的理解,你可以在它动手之前纠正方向,而不是等它写完五个文件再推倒重来。
但要注意,coding plan 的能力上限取决于两个东西:一是任务本身的复杂度是否适合提前规划,二是模型在长执行过程中的维护能力。它并不能解决所有问题。比如重构一个你自己都还没完全看懂的老项目,模型给出的计划可能看起来很合理,但实施起来处处是坑。
2.3 spec-driven 开发:更接近工程实践的路径
另一个热词是 spec-driven,也就是“先写规格说明,再让 AI 按规格实现”。它和 vibe coding 是两个极端:
- vibe coding 是“你描述感觉,让 AI 自由发挥”。
- spec-driven 是“你定义行为,让 AI 严格按照行为说明实现”。
spec-driven 更接近正经软件开发里的需求文档和验收标准。你把“用户输入邮箱和密码,点击登录后,如果邮箱格式非法则提示错误且不提交请求;如果用户名不存在则提示……”这种规则逐条写清楚,AI 的实现会确定性高很多。
我建议的路径不是二选一,而是组合使用:用 vibe coding 做前期探索和原型,用 spec-driven 做正式实现,用 coding plan 类工具做长任务的执行管理。三者解决的是不同阶段的问题。
下面这张表可以帮助你快速判断:
| 工作方式 | 核心输入 | 适合场景 | 主要风险 |
|---|---|---|---|
| vibe coding | 自然语言描述 | 原型、脚本、探索性开发 | 缺少约束,质量不可控 |
| coding plan | 任务描述 + AI 生成计划 | 多文件、多步骤的完整功能 | 计划质量依赖任务清晰度 |
| spec-driven | 结构化行为规格 | 正式功能、算法逻辑、接口实现 | 写规格本身有成本 |
3. 我把一次长任务跑通的标准流程拆成了五步
不管你用的是哪家工具的 coding plan 模式,还是自己在 prompt 里让模型分阶段执行,下面这套流程在长任务上都适用。我把它称为“五步跑通法”。
3.1 第一步:先把输入和输出边界写清楚
这是最容易被省略的一步,也是决定后续是否返工的一步。开始之前,明确回答四个问题:
- 这个任务的输入是什么?(数据格式、文件路径、用户操作)
- 输出是什么?(代码、测试结果、修复建议、部署产物)
- 哪些文件允许修改?哪些文件绝对不能动?
- 验收标准是什么?(能编译、测试通过、某个接口返回 200)
把这些写进 prompt,或者写进一个 spec 文件里。不要指望模型自己猜出来。
任务: 在现有 Flask 项目中增加用户注册接口。 输入:POST /api/register,JSON 格式 {username, password}。 输出:创建 users 表记录并返回 201;参数不合法返回 400。 允许修改:app.py、models.py、migrations/。 禁止修改:配置目录、前端模板。 验收标准:运行 pytest 全部通过,注册成功后数据库能查到新记录。这种描述看起来啰嗦,但它在长任务里的价值是:无论模型执行到第几步,它都能回头对照这个边界。很多工具现在支持把 spec 文件挂在上下文里,相当于给了模型一份“施工图”。
3.2 第二步:先让模型给出实施计划,而不是直接写代码
在你确认规格之后,先别急着让模型开始写。让它先输出一份实施计划,包含:
- 要修改或新增哪些文件。
- 每个文件的改动要点。
- 依赖关系和执行顺序。
- 潜在的验证点。
这一步是在做“人类和 AI 的对齐”。如果你觉得计划不合理,现在调整的成本最低。等它写完代码再改,成本会翻好几倍。
一个实用技巧是:让模型用“文件路径 + 改动摘要”的格式列计划,而不是用大段文字描述。这样你可以快速扫一眼,就能发现它是不是漏掉了某个模块。
3.3 第三步:小步执行,每完成一个阶段就验证一次
不要一次让模型把整个长任务全部写完再验证。把它拆成若干个阶段,每个阶段做完就做一次验证。
以用户注册功能为例:
- 先建数据库模型和迁移脚本 → 确认迁移能跑通。
- 再写注册接口 → 用 curl 或 Postman 打一次请求,看返回是否符合预期。
- 再补充参数校验和错误处理 → 测试非法输入。
- 最后写单元测试 → 跑测试套件。
这样做的好处是:一旦某一步出错,你很快能定位是哪一步引入的,而不是面对一坨新代码无从下手。长任务最容易出的问题就是“叠加错误”,早期一个小错误到后期会被放大成莫名其妙的崩溃。分段验证可以把这个风险限制在单段范围内。
3.4 第四步:强制生成验证代码,而不是只生成实现代码
很多 AI coding 工具在生成功能代码时很积极,但在生成测试和文档时往往需要你额外要求。在长任务中,一定要把“写测试”作为任务的一部分,而不是事后补充。
我常用的做法是在规格里直接写:
要求:每个功能点需要配套一个单元测试,测试文件放在 tests/ 目录下。 运行 python -m pytest 必须全部通过才算完成。这相当于给模型设置了硬性的“完成定义”。没有完成定义的任务,模型很容易在“代码看起来能跑”这一步就停下来,而实际上它根本没有验证过。有测试作为验证回路,长任务的每一步都更有依据。
3.5 第五步:记录一次完整会话,沉淀成你的项目知识
长任务跑完之后,我会把三样东西存回项目里:
- 任务描述和规格:下次类似任务可以直接复用。
- 执行计划:记录了这次任务是怎么拆解的,方便复盘哪些步骤可以合并或优化。
- 问题列表:执行途中遇到了哪些报错、怎么解决的。这是最值钱的经验,因为下次大概率还会遇到。
这三样东西合在一起,就是你的“AI 协作记忆库”。长期积累之后,你会发现同类任务的执行时间越来越短,因为模型可以参考你以前验证过的做法,而不是每次都从零开始试探。
注意:不要一上来就直接把超大任务丢给 AI,尤其不要同时修改几十个文件。先跑通一个最小闭环,再逐步扩大范围。长任务的能力再好,也经不起“需求本身没想清楚”的折腾。
4. 长任务最容易翻车的五个环节,以及对应的排查链路
就算流程正确,长任务在实际执行中还是会有各种意外。下面这五个环节是我遇到最多的失败点,每个都附带一套排查顺序。这套排查链路不依赖特定工具,在你把普通 prompt 变成长任务协作时同样适用。
4.1 输入和上下文不完整
现象:模型写出来的代码和项目实际使用的框架、语言版本、目录结构对不上。比如项目用的是 Python 3.11 的新语法,模型却按 3.8 的写法生成。
排查顺序:
- 先检查你是否把关键的项目上下文提供给了模型。比如
requirements.txt、pyproject.toml、目录树。 - 再检查你的任务描述里是否说明了技术栈版本。没说明的话,模型会倾向于用自己训练数据中最常见的默认值。
- 最后检查是不是上下文太长把早期信息覆盖了。如果是,把关键约束单独放在一个文件里反复引用。
4.2 环境不一致
现象:模型代码在自己电脑上跑通了,但提交后别人拉下来就报错。
排查顺序:
- 先确认模型是否只是生成了代码,而没有更新依赖配置文件。
- 再检查是否有路径硬编码、系统相关的依赖,比如 Windows 和 Linux 不同的路径分隔符。
- 最后检查模型是否默认了某个端口、环境变量或数据库实例已经存在。
这类问题最有效的前置手段是:把环境准备步骤也写进任务里,让模型输出“如何从零跑起来”的说明。如果它提供的说明有遗漏,那说明它的环境建模还不够完整。
4.3 权限和路径问题
现象:代码逻辑看着没问题,但实际运行时报没权限写文件、找不到路径、目录不存在。
排查顺序:
- 先看报错发生在哪个系统调用上,是文件读写、网络请求还是数据库连接。
- 再检查代码里的路径是相对路径还是绝对路径,工作目录是否稳定。
- 最后检查运行用户对目标目录是否有写权限,临时目录是否存在。这类问题靠纯代码审核很难发现,必须通过实际运行暴露。
4.4 模型过早满足或幻觉
现象:模型声称任务已经完成,但实际代码里有些函数只写了 stub 没实现,或者它以为某个库有某个方法,实际上那个方法根本不存在。
排查顺序:
- 先看有没有真正执行过测试或构建命令。如果模型输出的“完成报告”里没有测试通过记录,就要起疑。
- 再抽查几个核心函数是不是真正实现,而不是写了
pass或空返回值。 - 最后把模型声称“没问题”的接口实际调用一次,用真实数据验证。
这是长任务中最隐蔽的风险,因为它不像报错那样看得见。唯一的防线就是引入验证回路,也就是前面说的测试、构建、实际调用。
4.5 工具自身的边界限制
现象:代码本身没问题,但任务就是完不成。比如模型一次只能处理有限数量的文件,或者某个模式请求频繁被限流。
排查顺序:
- 先确认工具的上下文窗口策略:是一次把所有材料都塞进去,还是按需加载。
- 再检查是否超出单次执行的文件数量或步数上限。
- 最后看是否有频率限制、token 配额或订阅权益限制。热词里出现“GLM coding plan 7 天体验卡”“Gemini 没有 coding plan”这类讨论,本身就是在说这些能力通常和订阅绑定,不是所有用户都能无差别使用。
这里要特别提醒一点:不同产品的 coding plan 能力边界差异很大,而且版本更新很快。如果你计划长期依赖某个工具,动手之前先确认它的文档权限、上下文策略、单任务限制、计费方式。不要根据一个月前的体验下结论。
下面是一张快速排查表,可以贴在工位旁边:
| 失败现象 | 优先排查 | 其次排查 | 最后排查 |
|---|---|---|---|
| 代码和项目风格不一致 | 项目上下文是否给够 | 技术栈版本说明 | 上下文过长覆盖 |
| 本地能跑别人不能跑 | 依赖文件是否更新 | 路径是否硬编码 | 系统差异 |
| 运行时权限报错 | 工作目录 | 目标目录权限 | 临时目录是否存在 |
| 模型说完成但实际缺实现 | 测试是否有跑通记录 | 核心函数是否 stub | 真实数据调用验证 |
| 任务中途停止或报错 | 上下文窗口限制 | 文件数/步数上限 | 配额/限流/订阅权益 |
5. 从一次成功到长期可用:把游戏规则沉淀下来
5.1 你需要的不是更好的 prompt,而是一套 spec 模板
我在前面提到,spec-driven 比 vibe coding 更适合正经功能。但写 spec 本身有成本。怎么降低这个成本?答案是建立你自己的 spec 模板。
一次写好的模板可以反复用。我自己的模板包含这样几个区块:
- 任务目标(一句话)
- 输入输出定义
- 允许修改的文件和禁止修改的文件
- 技术栈和版本约束
- 验收标准
- 测试要求
- 风险提示(比如“这个模块涉及支付,务必保留原有日志格式”)
把这个模板存成一个 markdown 文件,每次新任务复制一份,填上具体内容,然后把这份文件作为任务的“宪法”提供给模型。模型在执行过程中如果产生和 spec 冲突的决策,以 spec 为准。
5.2 真正的长期价值,是形成你自己的“AI 协作飞轮”
当你能稳定地完成长任务之后,再往上走一步,就是把每一次任务的结果沉淀回项目知识里。包括:
- 哪些 prompt 结构最有效。
- 哪些模型的偏好需要预先纠正。
- 哪些任务类型不适合交给 AI。
- 哪些错误模式反复出现,需要在 spec 里提前防御。
这套东西积累下来,你就是一群会用 AI 干活的人和不会用 AI 干活的人之间那条越来越宽的差距线。不是因为 AI 更聪明了,而是因为你学会了给 AI 提供更高质量的任务上下文和验证框架。
5.3 什么人不适合立刻用长任务 AI coding
说清楚适用边界,比吹捧工具更有价值。以下场景我建议你谨慎使用:
- 你对这个代码库完全没有了解:如果你是第一次接触老项目,连目录结构都还没有建立认知,直接让 AI 动手容易出大问题。先自己通读一遍代码,建立基本心智模型再说。
- 任务本身你对什么是“对”都没有概念:如果你的需求本身就模糊不清,AI 只会加速产出不确定的结果。先把需求本身定义到可验收的程度。
- 涉及高风险变更:比如生产数据库迁移、支付链路改动、权限系统重构。即便 AI 生成了代码,你也必须有充分的人工 review 和多层测试。AI 可以作为辅助执行,不能作为唯一执行者。
- 环境非常封闭或依赖稀有版权材料:有些公司内部环境模型无法访问,或者代码库需要严格的私有化处理。这时候要考虑工具的部署方式,而不是直接在公网版上跑项目代码。
适合发挥长任务 AI coding 的场景是:代码库结构你已经熟悉、任务边界清晰、有完整的测试基建、你可以在关键节点介入验证。在这样的项目里,AI 能把重复性、机械性的编码执行工作接过去,你专注于架构设计、规格编写、代码审查和异常决策。
5.4 开发者角色的变化:从“写代码的人”到“定义任务和验收的人”
如果未来 AI coding 的长任务能力持续进化,普通开发者的工作重心必然发生迁移。你不再需要用一排排代码证明工作量,而是需要:
- 更清晰地定义“做什么”和“怎么算完成”。
- 更敏锐地审查“生成的结果是否真正满足约束”。
- 更快速地定位“AI 在长任务中哪个环节出了偏差”。
- 更有意识地维护“项目中模型无法自己理解的历史决策和隐性知识”。
这不是“程序员要失业”那种焦虑叙事。恰恰相反,技术判断力会变得更值钱。AI 能写代码之后,稀缺的不再是代码量,而是对正确性、边界、成本和风险的控制能力。这套能力需要你在一次次长任务实操中自己沉淀,没有任何一个工具能替你补上。
回到文章开头那句话:真正的提升在 coding,尤其 in long-horizon tasks,而新模型也确实是在朝着这个方向做专项训练。这意味着你过去对 AI coding 的印象——只能写碎片、没法干活、需要反复纠正——可能需要更新了。与其等着观望,不如拿一个真实的小项目从头跑一遍:先写清楚规格,再让它出计划,然后小步执行、分段验证。跑完一次,你就知道这套流程里哪些环节是你真正的瓶颈。通常你会发现,瓶颈不在 AI,而在于任务定义本身。