"我担心,程序员和 AI 的蜜月期要结束了。"
说这句话的时候,我正对着屏幕审查一段 AI 生成的并发代码。它写得又快又自信,可惜在我准备上线的最后一步,暴露了一个完全说不清来源的共享状态问题。看着那几行被无数人当场称赞过的"AI 代码",我脑子里突然冒出这个念头。
不是矫情。如果你跟我一样,过去一年里把 AI 编程工具从"新鲜玩具"用成了"日常依赖",你应该也会在某一个瞬间察觉到什么不对劲。刚开始用 AI 编程助手的时候,所有人都能感受到那种"蜜月期"的爽感:你要一个排序算法,它瞬间给你写;要一个网络请求封装,它连异常处理都给你补好;要一个单元测试,测试数据都帮你造齐。我当时的直觉是,编程这件事终于要被颠覆了。
但两个月之后,我开始频繁地删代码。不是删 AI 生成的代码,而是删我自己为了修 AI 生成代码里的 Bug 而打的补丁。一边删我一边想:我们是不是把"代码生成速度"和"软件开发效率"搞混了?
这篇文章想聊的,就是这半年里我想明白的东西:AI 编程到底强在哪里、弱在哪里,程序员和 AI 的协作为什么不可能一直停留在蜜月期——以及最重要的,当蜜月期结束以后,普通开发者应该用什么姿势继续用 AI,而不是被它反噬。如果你是刚开始接触 AI 编程的初学者,或者刚在团队里引入 AI 工具的负责人,这篇文章会更适合你。它会告诉你 AI 哪个阶段好用、哪个环节要盯死、哪些坑我已经替你踩过了。请把它当作一份参考,而不是结论。
1. 蜜月期的真实起点:我们是怎么一步步上头的
1.1 初次上手,"补全"变"生成"的震撼
我写代码的年头不短,见识过 IDE 从无到有的过程,习惯了编辑器里的自动补全。那种补全本质上还是"猜你要打的下一个单词",再怎么聪明,也跳不出单行逻辑的框。AI 编程助手出现之后,画风突然变了:你写一个函数名,它能给你生成整个函数体;你描述一句业务需求,它能直接给你一段能跑的模块。
这种体验对写代码的人来说确实震撼。因为以前从"需求到代码"中间的翻译过程,是需要自己动脑的:流程怎么拆、对象怎么设计、异常怎么处理、命名怎么统一。AI 把这些环节全部压缩了。压缩之后,人会产生一个错觉:好像我不需要懂设计,也能写出看起来完整的程序。很多第一次接触 AI 编程工具的人,就是在这个瞬间上头的。
1.2 蜜月心理是怎么形成的
心理学上有个概念叫"确认偏误",用在这里特别贴切。AI 生成代码恰好踩中了一个甜蜜点:你给它一个需求,它就给你一个答案;只要这个答案能跑通,你就会默认它是合理的。尤其在你不太熟悉的语言、框架或技术栈里,你会更加信任它,因为你根本看不出哪里不对劲。
我印象很深的一次,是在一个内部项目里让 AI 写一个带重试机制的网络请求函数。它写得很快,还加了指数退避,看起来很专业。结果一跑,超时单位写错了——把秒当毫秒、把毫秒当秒,我差点以为上游服务真的坏了。后来我把整段代码拉出来一行一行改,才定位到这个单位问题。这就是蜜月期的典型状态:你越缺少判断力,AI 给你的"确定性"就越让你安心;而这份安心的代价,最后都体现在了调试时长里。
1.3 蜜月期不是错觉,而是"红利前置,成本后置"
我现在更愿意用财务的思维来理解蜜月期:AI 带来的收益,比如写代码快、造数据快、搜索快,全都集中在前端,第一天就能看见。而成本——审查成本、纠错成本、重构成本、误用风险——全都分布在后面。前端收益又大又显眼,后端成本又小又隐蔽,所以初期体验特别美好。
但软件开发是一个长期工程。代码写出来只是第一步,后面还有评审、测试、上线、维护。当项目积累到一定规模,那些前期看不见的成本会突然集中爆发,然后你就会发现,为什么 AI 加持下的团队,代码总量涨了、Bug 总量也涨了;交付速度在变快,但线上事故的定位难度也在变高。到那个时候,就是蜜月期结束的准确节点。
2. 蜜月期结束的三个典型信号
信号这东西,通常都是事后才反应过来。但如果你提前知道它长什么样,至少不会在那个节点到来时手足无措。
2.1 第一个信号:看起来能跑,但谁都说不清它为什么能跑
我见过不少团队,AI 生成的代码直接进了主干分支,理由是"本机跑得通、测试也过了"。直到有一天线上出问题,大家围在一起查一个诡异的边界条件,才发现这段代码是从 AI 那里拿来的,没有人真正理解里面的每一个分支。
最典型的是日期处理和并发相关的场景。AI 在写日期格式化的时候,会漏掉时区;写并发代码的时候,会信心满满地跟你保证"这段代码是线程安全的",实际一测,数据竞争的结果完全随机。为什么?因为代码大模型的本质是"下一个字符的概率预测",它擅长的是生成"看起来像正确答案"的文本,而不是验证"这个答案在特定上下文里是否正确"。它写得快,不代表它理解得深。
2.2 第二个信号:阅读和解释的成本开始倒挂
以前写代码,成本主要在"写"上。现在反过来了:AI 负责写,我负责读懂它为什么这么写。当你的工作重心从"写"变成"审",边际成本就会急剧上升。
我在一个老朋友的项目里见过一个例子:他让 AI 给自己的模块补注释,AI 确实补了,但注释里面至少有三处是错的——它把已经不存在的参数还写进注释里,把变量名的语义理解反了。问题是,注释比代码更容易让人放松警惕。你看着注释觉得"哦,我懂了",实际上你在理解的第一步就建立在了错误信息上。这个成本,比代码本身的 Bug 更难排查。
2.3 第三个信号:在"全局问题"面前,AI 开始表现平庸
写过一段时间之后你会发现,AI 最强的场景永远是"局部生成":给你一个清晰的输入输出,它帮你写中间那段。但一旦问题涉及全局,比如这个模块和隔壁模块的职责边界在哪、资源释放应该由谁负责、将来要支持新协议时这段代码要动哪里——AI 的表现就突然变得平庸。
这种平庸不是因为它笨,而是因为它没有"上下文"。代码大模型能看到的是你粘贴进来的那一段,它无法感知整个项目的演进历史,也无法感知你下一个季度要上的新功能。于是它只能在一个非常窄的窗口内给你"局部最优解",而局部最优解堆在一起,往往就是全局的灾难。蜜月期里你根本注意不到这一点,因为你遇到的每一个问题都是孤立的新问题;当项目进入维护期,全局问题成为主线,这种平庸感就会越来越频繁地冒出来。
3. 能力拆解:AI 到底强在哪、弱在哪
蜜月期结束不代表 AI 没用。恰恰相反,搞清楚它的边界之后,它反而能发挥更大作用。我把自己半年多的实际体感整理成了"三强三弱"。
3.1 真正强的三件事:模板化、翻译、快速试错
第一件是模板化代码。比如配置文件的解析、数据模型的序列化、常用算法的标准实现、部门内部的常规接口封装。这些代码结构固定、模式成熟、几乎没有意外,AI 写起来又快又稳,人类写反而容易出错。
第二件是"翻译"。我说的不是自然语言翻译,而是跨语言、跨框架的转换:把一段脚本从一种语法翻译成另一种语法,把一套旧接口的调用方式改成新接口的调用方式。这种工作对人类来说很枯燥,对 AI 来说却正好在舒适区。
第三件是快速试错。当你对某段不熟悉的技术栈感到不确定时,可以让 AI 生成几种备选方案,然后在本地跑一跑、对比一下。这个用法我个人觉得是被低估的。以前做技术选型,可能得翻很多文档;现在相当于有一个随叫随到的"陪练",帮你快速建立一个认知起点。
3.2 一直很弱的四类场景:边界、安全、演进、需求
反过来看弱点,我至少可以分四类。
第一类是边界条件。AI 特别容易漏掉空值、超长、并发冲突、资源耗尽这类边缘情况。你给它的描述越"正常",它生成出来的代码就越"正常",而真实世界的输入从来都是不正常的。
第二类是安全性。我曾经让 AI 写一个文件上传功能,它给我写的代码里既没有校验文件类型,也没有限制文件大小,更没有任何压缩炸弹的防护。这在 Demo 里没问题,但如果上了生产环境,就是妥妥的漏洞。
第三类是长期演进。AI 不知道你下个月要加什么功能,不知道其他模块将来怎么依赖这段逻辑。所以它写出来的代码普遍缺少扩展性设计,也普遍缺少必要的抽象层次。
第四类是需求歧义。你真要把一段模糊的业务需求交给 AI,它要么给你一个看似合理的空壳,要么给你一个想当然的实现。因为需求歧义本质上要靠人去澄清,靠人去问"用户到底想要什么",这一点目前没有任何工具能替代。
3.3 一个我常用的类比:AI 是"极其熟练的实习生"
有朋友问我怎么向非技术背景的人解释这件事,我常用一个类比:AI 编程助手就像一个极其熟练的实习生——手快、话多、态度好,你说一句他写一行,还会主动补全你没想到的细节。但你交给他的每一项任务,都必须有一份足够清晰的验收标准,否则他会按自己的想法往下冲,冲完还不觉得有问题。
带一个实习生,你需要花时间讲背景、定标准、做评审、给反馈。带 AI 其实也一样:你要把需求拆到它听得懂的程度,你要制定验收标准,你要评审它的产出并给出修正。区别在于,实习生会随着时间慢慢成长,慢慢理解你们的业务逻辑和团队风格;AI 虽然也会通过对话上下文学习当前会话,但换一个项目之后,它对你的业务理解又归零了。这决定了它永远只能是一个"局部工具",而不是一个能承担整体责任的协作者。
这个类比,比"AI 要替代程序员"这种说法准确得多。它不替代程序员,它替代的是"程序员亲自动手写大量样板代码"这个动作。而这个动作,本来就不是程序员的核心价值。
4. 协作姿势调整:从"外包心态"到"结对心态"
蜜月期结束之后,我和 AI 的相处方式发生了根本变化。如果只分享一个结论,那就是:别把 AI 当"外包",要把 AI 当"结对编程的搭档"。
4.1 先明确:AI 负责"降噪",不负责"决策"
所谓降噪,就是把那些消耗你注意力的琐碎技术细节,交给 AI 去处理。比如类名怎么起、字段怎么定义、循环怎么写、判断条件怎么组织。这些东西虽然烦,但难度低、模式化,AI 做起来又快又稳。
所谓决策,则是那些一旦错了就会连累一大片的事情。比如方案选型、系统边界、数据一致性策略、接口契约、上线顺序。这些事情里的每一个,都需要你基于完整的上下文去权衡,AI 最多能给你提供参照意见,但拍板的责任一定在你。
我见过不少翻车案例,都是把决策权交了出去:让 AI 决定表结构设计,结果没有考虑建索引的成本;让 AI 决定缓存策略,结果过期时间设置太短,缓存形同虚设。这些错误单独看都不大,但叠加起来,会让一个项目从地基开始歪。所以"降噪"和"决策"的区分,不是一句漂亮话,而是所有配合动作的前提。
4.2 给 AI 下需求的实操模板:五件套
很多人抱怨 AI 写出来的东西不听话,其实问题往往出在"需求提得太粗糙"。我自己现在给 AI 下需求,会尽量凑齐五样东西,你可以直接拿去用。
第一是背景。一句话说明这个代码会在哪个模块里使用,上游是谁、下游是谁。
第二是输入输出。明确输入的数据结构和边界条件,输出的格式和预期行为,最好给一个具体例子。
第三是规则与约束。比如不支持某种操作、必须处理某种异常、性能上限是多少毫秒、用什么日志级别。
第四是验收标准。你打算怎么测试它、哪种情况算通过、哪种情况算失败。
第五是风格要求。是偏向标准库还是第三方库,是显式防御还是简洁优先,是否需要注释,注释的粒度要多大。
你可能觉得这五样东西列出来比写代码还累。没错,前期确实累。但它的好处非常明显:第一,你会发现,当需求被拆到这种粒度时,你已经想清楚了一大半实现细节;第二,AI 给出的结果会被限制在一个可靠的区间内,而不是天马行空。换句话说,把需求写清楚的过程本身,就是对你自己思维的强化。
4.3 一份我经常用的任务分配清单
为了让你少走弯路,我把自己常用的分配逻辑整理成了一个清单。原则很简单:确定性越高、风险越低的任务,越适合给 AI;不确定性越高、影响面越大的任务,越要自己来。
| 类型 | 典型任务 | 分工方式 |
|---|---|---|
| 适合交给 AI | 生成 DTO/VO、标准算法实现、跨语言翻译、单元测试骨架、日志文本整理、简单脚本 | AI 直接产出,我只看结果 |
| 必须自己来 | 模块架构设计、异常处理策略、缓存一致性方案、数据库表结构、安全相关代码、支付与权限逻辑 | 自己写核心,AI 最多给参考 |
| 需要协作 | 方案对比、初稿评审、测试数据补全 | 先让 AI 出方案或草稿,我再筛选、修改、补充 |
这个清单不是固定的,你可以调整。但核心原则始终如一:AI 可以帮你降低从"想法"到"代码"的摩擦,但对"这个代码该不该存在"的判断,必须有你自己的主见。
4.4 一定要做评审,而且要比以前更认真
过去写代码,评审是"检查有没有 Bug";现在评审 AI 的代码,更像是"检查一段陌生人写的代码是否符合项目约定"。这个转变很多人没意识到,导致他们拿着 AI 的产出,按"自己写的代码"的心态去审,结果很多隐藏问题就漏过去了。
我自己的评审习惯是三步。第一步只看接口和调用方式,不看实现,先确认"这段代码放进系统里,边界是否清晰";第二步看关键分支,把所有异常路径和边界条件都摆出来,逐个对着 AI 问"这里为什么这么写";第三步看测试,如果 AI 没给测试,我会明确要求它补,如果给了,我会把测试数据换成不等长的输入、空值、超大值,再跑一遍。
这三步做完,AI 生成代码里的问题,大部分都能在我本地被发现,而不是等到上线以后。记住一个铁律:AI 写的每一行代码,最终负责的都是你。你不在评审阶段较真,就得在事故阶段还债。
5. 受影响最明显的几类人,和正在变化的行业玩法
蜜月期结束不单是个人体验的问题。它对不同类型的人、不同岗位的生态,影响是不同的。
5.1 初级岗位和重复性工作:最先被"削掉"的部分
这两年大量"AI 替代程序员"的讨论,最焦虑的就是刚入行的人和做外包重复开发的团队。说实话,这种焦虑有一定道理:那些高度模板化、需求边界清晰的编码工作,确实是 AI 最擅长替代的部分。以前一个新手要接手一堆增删改查的接口,至少要练一年手;现在 AI 把这块压缩到了几天,甚至几小时。
但这不代表初级岗位就没有了。恰恰相反,初级岗位的价值正在从"会写代码"转向"会拆问题和会验收"。一个新人如果能快速理解业务、能把需求拆解成 AI 能执行的任务、能对 AI 产出一眼看出风险点,他产出的价值反而比以前高得多。换句话说,门槛没有消失,只是换了位置:从"写得出手"变成了"判断得了对错"。
5.2 高级工程师和架构师:定力和判断力开始值钱
AI 把"写代码"变得更便宜之后,什么变得贵了?答案是判断力。
以前你写一个系统,可能要花 80% 的时间在写代码细节上;现在 AI 把这些细节全部铺平了,最后剩下的 20% 的时间,反而成了决定成败的关键:你是选微服务还是单体?你是用消息队列做解耦,还是直接同步调用?你的缓存策略是旁路缓存还是先写库再删缓存?这些决策 AI 做不了,做错了也不是靠多写几千行代码能补回来的。
所以我现在看到的现象是:懂业务、懂架构、懂风险控制的高级工程师,不仅没有被 AI 替代,反而因为"能审 AI 的代码"而更有话语权。反倒是那种只会重复增删改查、长期停留在表层开发的人,确实会慢慢被边缘化。这个过程很安静,但也有点残酷。
5.3 团队流程在变化:评审从配角变成主角
工具变了,流程就得跟着变。我最近在几个团队里观察到,最明显的变化是代码评审的地位显著提高了。
以前很多团队把代码评审当成形式:合并前走个流程,大家点个"通过"就算完。现在不同了,AI 生成代码占比越高,评审越要较真,因为 AI 自己的自查能力其实很差。它可以用很自信的语气说出错误的结论,而且你很难通过"看它平时表现"来判断它在某个具体任务上的可靠性。唯一的办法,只有靠人来评审,而且评审的颗粒度还要比从前更细。
有些团队已经开始定这样的规矩:AI 生成的代码必须标注来源,必须由至少一个不看 AI 提示、纯粹看代码逻辑的同事做审核,并且不允许直接合并主干。这些规矩看起来很朴素,但确实能拦住一批"看着能用、运行就挂"的问题。
5.4 懂 AI 的和懂业务的开始合并
我还注意到一个趋势:以前大家热烈讨论"会不会出现一个专门写提示词的新岗位",现在好像这个岗位没有当初那么火热了。为什么?因为光会写提示词不够,你得懂业务、懂代码、懂风险,才能真正驾驭 AI。所以真正活下来的,是那些"既懂业务、又懂代码、还擅长用 AI"的人。
这些人不会自称提示词工程师,他们就是普通的软件工程师,只是手里多了一把好用的工具。这也带出一个判断:AI 不会消灭程序员这个职业,但会消灭一批"只写代码、不思考为什么"的程序员。这个判断,我现在依然坚持。
6. 我的三板斧:如何避开蜜月式陷阱
最后分享几个我真正在用的实操方法。你可以把它们当成"避坑指南",也可以当成"心态手册"。每一条都对应着我踩过的坑。
6.1 把 AI 生成的东西一律叫"初稿",永远不叫"代码"
我给自己定了一条规则:AI 生成出来的东西,在我评审之前,不叫"代码",叫"初稿"。这不是文字游戏。人的心理真的会因为命名而改变行为——如果你叫它"代码",你会下意识默认它是固化了的、能用的东西;叫它"初稿",你就会习惯性地带着挑剔的眼光去审视它。
这条规则帮了我很多次。尤其是 AI 生成一些看起来很完美的函数时,我因为没有"代码崇拜"心理,会更愿意追问一句"这里真的对吗"。就这一句追问,曾经帮我躲过一个文件路径拼接的系统性 Bug。
6.2 建立最小验证闭环:本地跑起来才算数
AI 写的代码,一句"看起来没问题"是不够的,一定要在本地跑通一个最小场景,你才算真正验收。
我现在的做法是:每个 AI 生成的核心函数,我都会给它补一个最小可执行示例,输入故意选边界值,然后看它的输出。如果涉及文件操作,我会在临时目录里跑;如果涉及网络请求,我会用本地模拟服务;如果涉及数据库,我会用一个轻量级的嵌入式数据库快速验证。整个过程尽量控制在五分钟以内。
注意:这五分钟看起来像是"浪费时间",但如果不做小验证,这段代码进了主干、跑在别人环境里出了事,你定位问题的时间可能是五十分钟,甚至是五个小时。五分钟换五十分钟,这笔账怎么算都不亏。
6.3 用 AI 当"老师",而不是当"打字员"
这是我觉得价值被严重低估的一个用法。遇到不会的接口、不熟悉的设计模式、不理解的框架机制,很多人习惯直接开搜索引擎或者翻文档,效率很低。我现在会把这些疑问抛给 AI,但要求它直接讲解思路,而不是直接给代码。
打个比方,我想了解某个并发工具类的原理,我会让它先解释设计意图和适用场景,然后让我手写一遍核心逻辑,它再点评。这个过程中,AI 其实成了我的教练和陪练。它的讲解不一定完全对,我会再结合文档和源码去验证,但这个"先学再写、写错再改"的过程,比我一个人闷头查资料要快得多。
6.4 心态调整:不怕被替代,怕的是"不再进化"
最后说心态。很多人在蜜月期结束后因恐慌而走向两个极端:要么认定 AI 没用了,完全回归手写;要么觉得是自己提示词写得不够好,于是拼命调参数、反复追问,试图让 AI 输出"完美代码"。这两个极端,我个人都不推荐。
正确的思路,是接受一个现实:AI 是一个能力边界清晰的生产力工具,就像 IDE、就像版本管理工具,锦上添花,但永远不能替你决策。程序员真正的护城河,从来不是能多快打出代码,而是能够在模糊、复杂、矛盾的需求里,找到一个可以被实现的路径。
我做了十几年软件开发,最大的体会一直是:编程这件事,最难的从来不是写,而是决定"写什么"和"不写什么"。AI 帮我省掉了大量"写"的时间,我就有更多时间去做那些决定。这难道不是好事吗?
如果你刚刚经历了我的前半段——看见 AI 什么都能写,正在疯狂复制粘贴——我的建议是:继续高兴,但记得在高兴的同时,开始建立你的判断力。蜜月期是用来享受的,但它结束之后真正剩下的东西,才是你和 AI 长期共处的基础。
我之所以把这篇文字写出来,是因为我不想看到程序员这个群体在甜蜜感退去之后陷入集体性迷茫。AI 不会走,它只会越来越强。我们也不需要对抗它,但在依赖它的同时,一定要守住那个"最终责任人"的位置。趁着蜜月期还没彻底结束,这反而是最好的学习时机。
最后再聊一个我最近常在思考的插曲:我试着让 AI 给自己写工作汇总、整理会议记录、做需求文档摘要,一开始觉得它们真好用,直到有一天我发现自己提交出去的文档里,出现了 AI 对我工作内容的主观猜测。那一刻我突然意识到,即便在一个最不起眼的文档任务上,我依然不能放弃对内容的最终审阅权。这不是效率问题,这是一种职业习惯,也是一种责任。
所以,与其担心蜜月期结束,不如趁它还在的时候,把那些本该自己掌握的东西——业务理解、架构判断、风险意识——训练得再结实一点。这样,无论下一个阶段 AI 进化成什么样,我们都能找到属于自己的位置。