最近一段时间,“I’m done coding with AI”这类视频标题在开发者社区里反复出现。前一两年大家还在热烈讨论 AI coding、vibe coding、AI Agent 带来的效率提升,现在却开始出现一批“被 AI 写代码”劝退的分享。这个现象很值得拆开来看看:是 AI 本身不行,还是我们把 AI 用错了地方?
作为长期在业务项目里折腾代码的人,我的看法是:AI coding 的效率提升是真实的,但它对“需求理解、代码审查、测试兜底、边界控制”的要求也比传统开发更高。很多人觉得 AI 能自动写代码,就等于可以把工程判断也交给 AI,结果在项目里踩出一堆隐藏问题,最后只能在视频里吐槽一句“受够了”。
这篇文章不准备站队,也不写情绪化评价,而是从工程实践角度系统拆解 AI coding 的适用边界。文中会涉及为什么你用 AI coding 会失控、哪些任务本质上不适合 AI 独立完成、以及改造后的生产级 AI 辅助工作流是什么样的。
1. 当“I’m done coding with AI”成为标题
1.1 这个现象背后的真实情绪
如果你平时关注 GitHub、掘金、CSDN 或者 YouTube 上的技术内容,会发现近段时间出现了不少标题类似 “I’m done coding with AI” 的视频或帖子。这些内容往往不是否定 AI 本身,而是表达一类挫败感:
- 让 AI 生成了大段代码,看起来很有道理,集成到项目后却频繁出错;
- 为了修一个小 Bug,让 AI 反复调整,结果把原本正常的模块也改乱了;
- 在“看起来很智能”的 Agent 模式下,代码库被大范围改动,却没有人能解释每一处修改;
- 提示词写得很长,但 AI 仍然忽略关键的业务约束。
这种现象和早先的“vibe coding”热潮形成鲜明对比。Vibe coding 是一种“我描述需求,AI 负责生成代码,我只管感觉对不对”的写代码方式。它在做 Demo、原型脚本时确实很爽,但在真实系统里,一旦涉及并发、事务、幂等、安全、数据一致性,光凭“感觉对”就远远不够了。
1.2 问题出在工具,还是出在流程
如果我们把 AI coding 看作一个生产力工具,就必须承认:工具解决的是“把想法变成代码”的效率问题,但无法替你回答“这段代码该不该存在、该放在哪里、边界是什么”。
大量“被 AI coding 劝退”的案例,本质上不是 AI 没有能力写代码,而是开发者把两个问题混为一谈了:
- AI 能否输出一段语法上正确的代码?
- 一段代码能否在特定业务场景里稳定运行?
第一个问题,大模型已经做得相当好;第二个问题,完全依赖人类的输入质量和工程约束。很多项目在没有写好规格、没有拆任务、没有测试基线的情况下,直接让 AI 大规模生成代码,就相当于在沙滩上建高楼。
1.3 本文希望能解决什么问题
考虑到 CSDN 读者中有大量后端、全栈和正在学习工程化的开发者,我会用一套尽量接近真实业务的方式来讲 AI coding:
- 解释 AI coding、vibe coding、coding plan、credits 等概念的真实意义;
- 梳理 AI coding 项目常见的失控模式;
- 用一个订单超时自动关闭的案例,还原“看起来正确、实际上问题很多”的完整过程;
- 给出改造后的 AI 辅助编码工作流、代码示例和验证方法;
- 最后给出团队落地时的治理建议和一份可在开发中直接对照的判断清单。
先说结论:不是“代码不能交给 AI”,而是“工程判断不能交给 AI”。把 AI 从“甩手掌柜模式”切回“结对工程师模式”,很多问题会立刻缓解。
2. 先厘清几个概念:AI coding、Vibe Coding、AI Agent
2.1 AI coding:从补全到生成完整模块
广义的 AI coding,泛指开发者借助大模型来完成编程任务。早期形态是 IDE 插件里的代码补全,能根据上文预测下一行代码;后来逐渐演进为能根据自然语言生成函数、生成文件、生成测试用例的辅助工具;再后来出现了能自己搜索代码、执行命令、修改文件、运行测试的 Agent 类产品。
这里有一个容易忽略的变化:当 AI 只是补全下一行代码时,人类仍然掌握着代码结构的主控权;当 AI 开始按自然语言生成整个模块时,工程边界就需要提前定义得非常清楚。当前很多“AI coding 失控”场景,都发生在第二类能力被过度使用时。
2.2 Vibe Coding:一种更偏产品原型的创作方式
Vibe coding 可以理解为 AI coding 在产品快速验证方向上的一种激进用法。它强调“用感觉写代码”:开发者把需求用自然语言描述出来,AI 生成项目代码,开发者运行后凭体验和界面反馈继续调整。
这种模式适合什么场景?答案是:一次性脚本、课程作业、短期 Demo、内部小工具、不考虑复杂并发和安全要求的原型。它最大的价值是把“从想法到可运行软件”的时间压缩到极短。
但如果是长期运行的严肃系统,直接沿用 vibe coding 的节奏就很危险。真实系统需要处理用户数据、权限边界、异常恢复、告警监控,这些都不是“运行起来界面没问题”就能覆盖的。
2.3 Coding Plan 与 Credits:算力资源的现实约束
现在很多 AI 编程工具都推出了类似 coding plan、agent plan 的订阅方案,有些按模型调用量计费,有些以 credits 作为计量单位。理解它们不需要纠结具体价格,而是要建立一个成本意识:AI Agent 在主动完成复杂任务时,会反复读取文件、调用工具、生成多轮代码,一次看似简单的交互可能消耗大量 credits,而且系统越复杂、项目越老,Agent 需要读取的上下文就越多,成本增长也越快。
成本约束带来的直接启示是:不要让 AI 在没有任何范围限制的情况下“自由探索”整个代码仓库。提前划定影响范围,既是为了代码质量,也是为了控制资源开销。
2.4 为什么概念不清会导致预期错位
如果开发者没有区分“补全型 AI”“对话型 AI”“Agent 型 AI”,很容易产生预期错位。面对一段简单补全,你会觉得 AI 很强;面对一个跨模块的大型改动,你又觉得 AI 很笨。
实际上,任务难度和上下文复杂度都在增加,AI 的准确率一定会下降。这不是玄学,而是信息损失导致的必然。你在自然语言描述中漏掉一个边界条件,生成出来的代码就可能少一个判断;你在多轮对话里说了一句“顺便优化一下”,Agent 可能就会重构掉你原本已经稳定的部分。
所以后续所有建议都可以归结为一句话:把 AI coding 当作一个需要输入明确约束的工程环节,而不是一个能自动理解业务的“黑盒程序员”。
3. AI Coding 容易翻车的四个底层原因
3.1 需求文本与真实语义之间存在“信息差”
大模型只能从文本中学习需求,但真实业务中的很多信息并不在文本里。比如,你说“查询订单列表”,AI 会写一个简单的 SELECT;但真实系统里“订单列表”背后可能还包含:
- 当前用户是否能看到所有订单;
- 是否需要按租户隔离;
- 列表是否需要分页、总数统计;
- 时间字段用数据库时间还是应用时间;
- 是否需要展示已删除或取消的订单。
这些隐藏约束如果不在需求里明确写出来,AI 生成的代码必然只是“看着逻辑合理”的简化版本。回到工程本质上,这其实就是传统开发中常说的需求分析不到位。只不过以前需求分析不到位由人写代码时消化了一部分,现在 AI 会非常忠实地按完整或不完整的描述生成代码,问题被直接放大。
3.2 代码的正确性不止是语法正确
很多开发者让 AI 生成代码时,最大的判断标准是“能不能跑起来”。但能跑起来和正确之间,隔着并发控制、事务边界、异常恢复和幂等性。
举一个常见例子:你在循环里逐条更新订单状态,单测通过,功能也能用;但线上如果在同一时刻有多个定时任务实例在跑,就会出现“一个订单被两个任务同时读到,库存被重复释放”的问题。这种问题不会出现在 AI 生成的第一个版本里,也不会被视觉检查发现,只有通过并发测试、性能测试和代码审查才能真正暴露。
3.3 增量修改时缺乏全局因果感知
写新代码时,AI 通常表现很好,因为任务边界比较清晰;但改代码时,AI coding 的失败率会明显上升。原因是既有系统里通常藏着很多“没有写成文档的历史原因”:
- 某个字段为什么加了这个默认值;
- 某个接口为什么需要多传一个无用参数;
- 某个查询为什么要强制 UNION 两次;
- 某个定时任务为什么要带分布式锁。
AI Agent 即使能阅读整个仓库,也只能看到当前静态代码,很难理解这些设计背后经历过的线上故障。当它按“最直接的方式”去优化或修改时,很容易破坏原有保护逻辑。
3.4 缺少验证体系时会快速积累技术债
AI coding 在缺少测试的情况下,效率越高,风险越大。以前人工写代码,每个人有自己的思维惯性,但至少会在改完一个方法后考虑调用方会不会受影响;而 AI 生成代码的速度是分钟级的,如果每次生成后没有一道强校验关卡去约束它,项目会迅速膨胀成一段“没有人类完全理解”的代码体。
在工程上,对抗这种膨胀的唯一手段是让验证速度和生成速度匹配:代码生成之后,立刻跑静态检查、单元测试、变更检查和安全扫描,让不符合规则的结果直接回流给 AI 继续修改。没有这套闭环,AI coding 就成了“写代码很快,Code Review 和修 Bug 更累”的负循环。
4. 一次高仿真的失败实验:订单超时自动关闭
下面用一个非常常见的业务场景,来还原 AI coding 从“看上去成功”到“实际不可上线”的全过程。这个案例我建议你亲手操作一遍,会比单纯看文章理解深很多。
4.1 原始需求与隐藏约束
先看最简单的需求描述:
用户下单后,如果超过 24 小时没有支付,系统需要自动把订单状态改为已取消,并释放占用库存。
如果你直接把这句话发给 AI,它会很快返回一段可运行的代码。但真实业务中,这段需求并不完整,至少还缺少以下隐藏约束:
- 订单状态变更需要幂等,不能因为任务重复执行就重复释放库存;
- 一个订单不能被两个定时任务实例同时处理;
- 每次扫描不能一次性加载全表,需要分批处理;
- 业务失败时要有日志和告警,不能静默跳过;
- 如果库存释放失败,订单不能先被标记为取消。
4.2 任务卡形式的 Prompt 示例
为了让 AI 正确理解需求,我建议不要用一句话描述需求,而是先编写一份任务卡。把任务卡文件保存到仓库里,再贴给 AI,效果会好很多。
文件路径:prompts/task_cancel_order_timeout.md
# 任务:订单超时自动关闭 ## 业务背景 用户在商城下单后进入待支付状态。超过支付期限仍未支付的订单, 需要由后台任务自动置为已取消,并释放预占库存。 ## 功能范围 - 扫描半小时前创建、且仍处于 PENDING 状态的订单; - 找到超时订单后,调用库存服务释放库存; - 库存释放成功的订单更新为 CANCELLED; - 库存释放失败的订单保持 PENDING,并记录重试日志。 ## 约束条件 1. 支持多实例部署,保证同一订单不会被多个实例重复处理; 2. 扫描使用分页或批量方式,禁止一次性全表扫描; 3. 每次处理需要记录处理时间、处理结果、失败原因; 4. 不能修改用户已支付(PAID)的订单状态; 5. 更新状态时使用条件更新,避免覆盖其他状态变更。 ## 验收标准 - 构造 3 个超时订单,运行定时任务后,只有符合条件的状态变更; - 并发运行两个任务实例,库存释放次数不超过一次; - 库存服务不可用时,订单保持 PENDING 且可再次被扫描。这份任务卡最核心的部分是“约束条件”和“验收标准”。如果你只是在对话里说一句“别忘了幂等”,AI 通常不会把它当成强制要求;但如果约束写在同一份文档里并且与验收标准绑定,生成结果会完全不一样。
4.3 AI 容易给出的“表面正确”答案
在不给任务卡、只给一句话需求的场景下,AI 很容易生成下面这种“表面正确”的代码。这里展示一个简化版核心片段,用来分析问题:
文件路径:examples/close_expired_orders_bad.py(仅供问题分析,不建议直接运行)
def close_expired_orders(conn): while True: rows = conn.execute(""" SELECT id FROM orders WHERE status = 'PENDING' AND created_at < NOW() - INTERVAL '24 hours' """).fetchall() if not rows: break for order_id in rows: conn.execute( "UPDATE orders SET status = 'CANCELLED' WHERE id = ?", order_id, ) release_stock(order_id) conn.commit() time.sleep(30)这段代码如果只在本地简单跑一次,确实能工作。但它包含的问题非常多:
- 每次循环都把符合条件的订单全部查出来,没有分页;
- 更新与释放库存不在一个事务边界内,库存释放失败时订单已经取消;
- 两个实例并发执行时,同一订单可能被同时读到并重复释放库存;
- 没有记录操作日志,出现问题后无法追踪。
这些问题用肉眼不容易发现,但一旦进入生产环境,每一种都可能造成线上资损或数据不一致。
4.4 用测试暴露问题
接下来我们用一个最简单的领域模型,来演示测试如何兜住“状态是否允许取消”这一层。先把业务规则写成一个可以被测试的纯函数。
文件路径:services/cancel_policy.py
from dataclasses import dataclass from datetime import datetime, timezone @dataclass(frozen=True) class CancelCandidate: order_id: str current_status: str created_at: datetime locked_at: datetime | None def should_expire_cancel(candidate: CancelCandidate, now: datetime, expire_hours: int = 24) -> bool: if candidate.current_status != "PENDING": return False if candidate.locked_at is not None: return False deadline_ts = candidate.created_at.timestamp() + expire_hours * 3600 return now.timestamp() >= deadline_ts对应的测试文件如下:
文件路径:tests/test_order_cancel_policy.py
from datetime import datetime, timezone from services.cancel_policy import CancelCandidate, should_expire_cancel def test_pending_order_after_deadline_can_cancel(): created = datetime(2026, 1, 1, 0, 0, tzinfo=timezone.utc) now = datetime(2026, 1, 2, 2, 0, tzinfo=timezone.utc) candidate = CancelCandidate( order_id="o1", current_status="PENDING", created_at=created, locked_at=None, ) assert should_expire_cancel(candidate, now) is True def test_paid_order_cannot_cancel(): created = datetime(2026, 1, 1, 0, 0, tzinfo=timezone.utc) now = datetime(2026, 1, 2, 2, 0, tzinfo=timezone.utc) candidate = CancelCandidate( order_id="o2", current_status="PAID", created_at=created, locked_at=None, ) assert should_expire_cancel(candidate, now) is False def test_locked_order_should_not_cancel(): created = datetime(2026, 1, 1, 0, 0, tzinfo=timezone.utc) now = datetime(2026, 1, 2, 2, 0, tzinfo=timezone.utc) locked_at = datetime(2026, 1, 1, 1, 0, tzinfo=timezone.utc) candidate = CancelCandidate( order_id="o3", current_status="PENDING", created_at=created, locked_at=locked_at, ) assert should_expire_cancel(candidate, now) is False当你把这几个测试用例交给 AI 时,你会观察到两种结果。一种 AI 会直接改写 cancel_policy 来适配测试;另一种 AI 会反问你:“当前需求里没有锁定字段,是否需要引入 distributed lock?” 后者更接近一个合格结对工程师的表现,但前提是你提供了验收标准。
4.5 实验得到的教训
这个案例说明了一个核心结论:AI coding 的稳定性高度依赖任务输入的确定性。当需求文本里没有明确写出并发、幂等、失败恢复时,AI 一定会选择代价最低的实现路径,而这条路径往往就是生产事故的高发路径。
所以不要问“AI coding 能不能用于真实项目”,而要问“我的团队能不能在 AI coding 之前把需求和约束定义清楚”。
5. 把 AI coding 改造成生产级工作流
5.1 第一步:先写规格,再写提示词
真实项目里,AI coding 的输入不能只是一句自然语言。建议先形成一份轻量规格文档,至少包含以下内容:
- 功能范围(做哪些事,不做哪些事);
- 输入与输出;
- 关键业务规则;
- 约束条件;
- 验收标准。
这份规格文档不要求像正式设计文档那样详细,但必须包含业务规则。将文档作为 AI 的上下文,比在聊天框里逐条补充要稳定得多。更重要的是,规格文档可以被 Code Review 的其他人类工程师阅读,解决“AI 生成后没人知道当初为什么这么设计”的问题。
5.2 第二步:把任务拆到可以验证的粒度
对于 AI Agent,一个大任务失败率高的原因通常是验证点离任务目标太远。所以工程上更推荐把一个复杂度较高的任务拆成若干小步骤:
- 定义数据结构或数据库表结构;
- 编写纯业务规则函数;
- 实现数据访问层;
- 接入定时任务或 API 层;
- 编写测试用例;
- 更新迁移脚本和文档。
每一个步骤都应当让 AI 产出一段可以被独立验证的结果。这样即使 AI 在后续步骤中出错,也不会把错误扩散到整个模块。
5.3 第三步:生成代码后的审查顺序
在把 AI 生成的代码合入前,建议按以下顺序做三层检查,而不是只看“代码能跑”。
第一层是依赖和变更范围。检查 AI 是否修改了与任务无关的文件。如果只是修改一个订单状态接口,diff 里却出现了支付模块的改动,必须打回。
第二层是业务规则。把规格文档里的约束逐条与代码对照。比如状态更新是否有 WHERE status = 'PENDING' 条件,是否存在重复执行的风险。
第三层是边界情况。思考如果网络超时、数据库连接异常、库存服务不可用,这段代码会怎么表现。AI 生成代码默认很少考虑失败路径,因此这一层只能由人类工程师完成。
5.4 第四步:自动验证与回归基线
如果 AI 生成代码的速度很快,那么代码合入前的自动检查速度也必须快。下面是一个比较轻量的验证命令组合,适合 Python 项目。
# 运行静态检查与单元测试 ruff check services tests pytest tests -q # 检查关键代码变更 git diff --stat git diff services/order_close.py这套命令的核心并不是复杂,而是可重复。每一次让 AI 修改后,都运行同一套命令;只有测试通过且 diff 范围符合预期,才能进入下一步。
如果你的项目使用 Java/Spring,则可以把命令替换为对应的 Maven 或 Gradle 构建命令,并配合 Checkstyle、SpotBugs 或 SonarQube 使用。重点仍然是“有一道固定门禁”,而不是依赖人工肉眼去盯每一次生成结果。
5.5 第五步:记录决策,反向修正提示词
每次 AI coding 失效后,不要把代码直接丢给 AI 让它继续猜。正确做法是把失败原因沉淀为新的约束,补充到任务卡里。比如“未支付状态判断必须使用订单创建时间,而不是本地时间”“更新时必须带条件,避免覆盖已取消状态”。
随着约束条件越来越完整,AI 生成的一次性通过率会明显提高。这也是为什么同样使用 AI coding,有些团队越来越顺,有些团队越用越乱的核心差异:后者只记录报错,不记录约束。
6. 团队引入 AI Coding 时的工程治理
6.1 权限与敏感信息边界
AI coding 工具在运行过程中,可能读取代码库文件、执行 shell 命令、访问第三方服务。团队在引入时,需要做好两个边界。
第一个边界是权限边界:不要给 AI Agent 直接执行生产环境命令的权限,不要让它读取生产数据库中的真实敏感字段,更不要把带有配置密钥的完整文件粘贴到对话中,防止敏感数据通过第三方服务形成不可控扩散。
第二个边界是人工确认边界:涉及数据删除、批量更新、权限变更等高风险操作,无论 AI 给出的结果看起来多么合理,都必须由有权限的人类工程师再次确认。这是工程底线,不是对模型能力的不信任。
6.2 依赖引入与供应链安全
AI 在生成代码时经常自行建议新依赖。例如让 AI 写一个日期处理功能,它可能建议引入一个新的工具库;让 AI 写一个重试机制,它可能引入某个第三方框架。对于小项目这没有明显问题,但在生产项目中,每引入一个新依赖,都会带来许可证合规、漏洞扫描和后续维护成本。
因此团队应该在仓库里维护一份“允许使用的依赖白名单”或至少建立“新依赖必须由技术负责人批准”的机制。每次 AI 生成代码后,需要检查它对 package.json、pom.xml、requirements.txt 等文件的修改。
6.3 成本与配额管理
Coding plan 和 credits 的概念在团队协作中需要被认真对待。有些 AI Agent 会反复读取大文件、执行长链路任务,看似只提了一个需求,消耗却很可观。建议为 AI coding 设定相对明确的配额与用途:
- 原型验证用途和正式编码用途分开;
- 大型代码库尽量引导 AI 读取指定文件和函数,而不是整个仓库;
- 每个任务设置最大尝试轮数,超过后由人工介入;
- 定期分析 credits 消耗路径,寻找可以降低的上下文成本。
成本治理也是质量治理的一部分。当 AI 开始“为了修改而修改”时,它会增加对话轮数、增加代码改动、增加无效工作。限制配额能倒逼它更谨慎地行动。
6.4 代码质量门禁
团队场景下,任何 AI 生成的代码都必须经过和人工代码相同的质量门禁。包括不限于代码风格检查、单元测试覆盖率、构建检查、安全扫描和人工 Code Review。
这里最容易犯的错误是:因为是 AI 生成的,团队成员下意识降低审查标准。代码的实际质量与来源无关,应该用同一套标准来衡量。如果代码进入主干之后出了问题,AI 不会为你承担责任,最终仍然需要团队在深夜爬起来排查。
7. AI Coding 与 Vibe Coding 的适用边界判断
7.1 可以交给 AI 的任务
根据我的观察,下面这几类任务交给 AI coding 效果最稳定:
- 一次性数据脚本和数据清洗;
- 通用算法与数据结构实现;
- 单元测试和接口 Mock 的生成;
- 模板化代码,例如 CRUD、配置文件、DTO 转换;
- 技术调研期的最小 Demo;
- 代码解释、日志分析、异常报错定位。
这些任务有一个共同特点:上下文边界清晰,结果可以快速验证,业务风险较低。即使 AI 生成的代码不完全正确,修复成本也可控。
7.2 暂时不要交给 AI 的任务
以下任务在现阶段建议至少保持人工主导权,AI 只作为辅助讨论角色:
- 涉及资金、库存、核心状态机的业务代码;
- 权限控制相关代码;
- 多服务分布式事务的修改;
- 大范围重构;
- 性能敏感模块的优化;
- 需要长期维护的底层基础设施。
这些任务高风险的原因不是 AI 不能理解语法,而是它很难完整理解历史原因与线上环境中的非代码因素。人工主导配合 AI 生成局部代码,是更稳妥的方式。
7.3 一张快速判断表
在没有时间深入分析时,可以从六个维度快速判断任务是否适合交给 AI:
| 判断维度 | 适合 AI coding | 需要谨慎 |
|---|---|---|
| 上下文边界 | 单一文件或单一函数 | 跨模块、跨服务 |
| 失败成本 | 错误可以快速修正 | 涉及资金、权限、数据 |
| 验证手段 | 有明确测试用例 | 缺少测试基线 |
| 业务稳定性 | 正在新增的独立功能 | 线上稳定运行的历史逻辑 |
| 合规要求 | 非敏感代码 | 涉及个人数据与密钥 |
| 长期维护 | 低代码沉淀要求 | 需要严格记录设计决策 |
如果某项任务在“需要谨慎”列中的命中项超过三个,我建议不要让它处于“AI 自动执行”状态,而是进入“AI 辅助人工实现”状态。
8. 常见问题与排查思路
不同团队使用 AI coding 时,遇到的问题其实高度重合。下面整理一些高频问题以及解决思路,可以直接对照排查。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| AI 生成的代码运行报错 | 任务描述缺少环境信息 | 补充语言版本、框架版本与关键配置,把报错栈贴回去 |
| 修改一个功能后其他功能异常 | AI 修改了与任务无关的代码 | 审查 diff,将 AI 作用范围限制在单个模块 |
| 提示词写得很长但效果越来越差 | 关键约束被无关信息淹没 | 精简上下文,把业务规则单独放在文档中引用 |
| AI 反复修改同一段代码仍不稳定 | 缺少明确的验收标准 | 先把测试用例和约束条件写清楚,再让 AI 修改 |
| Agent 自动修改了依赖或配置 | 没有设置文件变更白名单 | 增加变更范围检查,限制 Agent 写的文件路径 |
| AI coding 生成的代码有并发隐患 | 需求中未描述并发场景 | 在任务卡中补充并发、幂等、失败回滚约束 |
| 多个 AI 任务并行时互相覆盖 | 共享同一工作区且缺少冲突管理 | 按任务拆分分支,避免并行修改同一文件 |
这些问题的共同解决方案,不是“换一个更强的模型”,而是“把工程约束做得更硬”。模型能力提升会减少语法错误,但不会自动解决需求模糊和边界缺失的问题。
9. 使用边界判断与个人工作流建议
在文章最后,我想分享一套经过多次实验后沉淀下来的个人判断方法。当你面对一次 AI coding 任务时,可以先问自己三个问题:
第一个问题是:如果 AI 生成的这段代码上线后出问题,我能否在十分钟内定位并回滚?如果答案是不能,那就不要让它自动生成并直接合入。
第二个问题是:这段代码的业务规则,是否已经被我完整地写成了文字?如果有些规则只存在于你脑子里,请先补全任务描述,再让 AI 动手。
第三个问题是:我需要 AI 输出一个“完整方案”,还是只需要它填充一个“已经有边界的实现”?大多数场景下,后者效果更好。
我把这种方式称为“辅助驾驶模式”:AI 负责加速、建议和局部操作,人类负责路线判断、安全监控和最终决策。它没有 vibe coding 那么洒脱,但更适合真实软件项目。
如果你最近也处在“I’m done coding with AI”的边缘,可以先不要急着放弃,试着把下一个任务拆小一点,把约束写清楚,再加上一段测试。也许你会发现,问题并不出在 AI coding 身上,而是出在任务进入 AI 之前的准备工作上。
最后一个非常简单的检查方法:当你拿到 AI 生成的代码时,先问自己“我能解释它为什么这样写吗?”如果你解释不了,就不要让这行代码进入主干。把这条原则守住,AI coding 就可以成为团队里稳定可用的效率工具,而不是一颗等待引爆的雷。