
2026年9月27日我重新拿出三年前让AI写快速排序的那台电脑跑了一遍当年的测试。三年前它给我输出的是“冒泡排序”还附了一句写着“这是优化后的版本”的注释三年后同一个输入它给出的答案不仅提供了复杂度更优的快速排序实现还顺手写好了单元测试并提醒我“注意输入存在大量重复元素建议使用三路切分”。那一刻我真的愣了一下这三年AI编程到底进化成了什么怪物如果你是一个这几年偶尔听说过AI编程但还没实际用过的开发者可能会觉得这种变化只是“模型变聪明了”。但作为从Copilot预览版就开始用试过ChatGPT、Cursor、Codex CLI等各种AI编程软件的人我可以明确说能力提升只是表层真正的变化是整个工具链和工作方式都被重写了。这篇文章不写那些玄乎的“AI替代程序员”理论只讲实际的东西——它到底强在哪、弱在哪、怎么用才不容易翻车以及哪些坑我已经替你踩过了。1. 三年前所谓的“玩具”到底有多菜1.1 模型形态决定了它只能“补全”不能“理解”三年时间看下来最核心的变量不是“代码生成得有多快”而是模型从“自然语言到代码的模式映射”变成了“目标驱动的任务执行”。在解释这个演变之前先复盘一下为什么当时的AI写不出业务代码。三年前的AI辅助编程产品比如当时很火的GitHub Copilot预览版本质上就是基于海量代码库训练出来的语言模型。它的工作方式是读取你正在编辑的文件和光标前的代码然后根据统计概率续写下一个token。用大白话说它就是“高级自动补全”加“代码模式匹配器”。在IDE里签入代码时确实惊艳敲一个函数名能补出一大段但它不掌握项目的目录结构、业务约定和配置信息一碰到跨文件、多模块的任务就翻车。我记得2021年有个很典型的测试让AI写一个“带重试机制的网络请求函数”。它生成得像模像样第一行就import requests但那个脚本运行环境里根本没有这个依赖而且它完全没有考虑网络异常应该捕获哪些类型。这就是补全模型的典型问题——它不是在做真实验证只是“看起来像”。所以当年最流行的AI编程玩法是拿AI做算法题。LeetCode题目自带完整规范输入、输出、边界条件全在题目文本里模型不需要理解外部世界直接按概率生成答案偶尔还真能通过。这给很多人留下的第一印象就是“AI编程很强”或者“AI编程很弱”其实都失真。强是因为算法题是训练样本里的高概率路径弱是因为它根本不接触真实软件工程中的上下文。1.2 当年提示词再花哨也填不上“上下文缺失”的坑当时网上流行各种“必杀提示词”。我试过不少结论是提示词能改善生成质量但改善幅度有限。因为模型看不到代码库你再怎么描述业务背景它也只能猜。那时候最有效的提示词反而是一句短话“请用Python实现XX函数输入输出如下”。任务越简单越不要加戏否则模型会把无关描述也编进代码里。这个阶段确实更像玩具但用来写一次性脚本、生成算法原型已经比从零查文档快不少了。问题在于一旦你想让它进项目里干点正经事比如改一个接口、修一个bug它的表现立刻崩塌。因为项目上下文里包含的命名规范、异常处理习惯、历史包袱是当时模型完全看不见的。所以三年前我对AI编程的判断就是当个代码生成器用可以当编程搭档不行。2. 转折点从“补全代码”到“理解项目”2.1 上下文长度和对话能力带来的质变转折出现在两个方向一个是上下文窗口变大另一个是学会了多轮对话。2022年底到2023年初以GPT-3.5/GPT-4为代表的通用对话模型允许你把整个文件甚至整个目录塞进上下文模型终于能“看见”你的代码风格、依赖和历史包袱。这直接让AI从“没见过项目的临时工”变成了“至少看过你代码库的实习生”。上下文变大带来的不是简单翻译而是一整套新的工作模式。最早我用ChatGPT重构一个老模块时把200行代码贴进去要求它拆成三个函数并保留原有行为。它给出的结果不但能运行还把重复的try/except抽成了装饰器。这件事放在一年前根本做不了。原因很简单模型看到了足够多的上下文才能理解“这个模块在做什么”而不是把代码当作无关文本流水线产出。另一个质变是“对话纠错”。以前AI给一段代码你试了不行得回到对话里重新描述问题。现在你可以直接把报错信息贴给它让它自己看。甚至可以让它给出几种候选方案你再选。这种交互成本极低几乎等同于多了一个“特别擅长写代码、但偶尔会胡说的同事”。学会多轮对话之后AI编程第一次摆脱了“写一次生成一次”的玩具感。2.2 能解释、能重构、能写测试这才是真正的分水岭单论“生成代码”这件事GPT-3到GPT-3.5的提升其实没有营销号吹得那么大。真正让我觉得AI编程“不可逆地变了”的是它开始靠谱地做解释、重构和写测试。这三件事决定了一个AI能不能从“自动补全”变成“结对搭档”。解释代码是最先成熟的。随便丢给模型一段几百行的老PHP脚本它能告诉你哪个函数负责登录、哪个地方有SQL注入风险、为什么输出格式和预期不符。搁在以前这种解释任务得靠人肉读代码少说半小时。重构是第二成熟的给定一个文件名和“把重复逻辑抽成公共方法”的需求AI能保持行为不变地给出改动。它甚至比一些毛躁的中高级程序员更保守不会顺手改掉你不想要的逻辑。写测试是第三成熟的虽然AI写的测试有过度模拟的问题但作为初稿已经能覆盖很多边界。这个分水岭非常重要。会“生成代码”的AI只能当玩具因为它跑不出完整系统但会“解释、重构、写测试”的AI已经可以进入开发流程承担以前只有正式员工才愿意干的脏活累活。2.3 Agent工具的诞生从“给代码”到“干活”到2024、2025年AI编程工具进化成了Agent形态。典型代表就是Codex这类需要付费订阅的AI编程软件以及Claude Code、Cursor Agent模式。它们不再满足于在对话框里输出代码而是直接接管一个沙箱环境读文件、改文件、执行命令、跑测试、看报错、继续改直到完成需求。这里一定要强调工具形态的变化比模型能力的变化更能解释“AI编程忽然变强”的错觉。模型还是那个模型但Agent给了模型“动手验证”的能力。以前模型“编造”一个不存在的API你只能在试运行后才发现现在Agent直接执行命令发现ImportError就自己去查文档然后换一种写法。它把“从AI生成到人验证”这个循环变成了“从AI生成到AI验证”人只需要做最终审查。我自己的体验是补全型和Agent型的区别就像“雇了一个在线文档”和“雇了一个实习生”之间的区别。补全型只会给你句子Agent型会帮你把一个任务的前后事做完再向你汇报。当然这个“实习生”也会闯祸所以还是需要人盯着。3. 现在Agent化之后AI编程真的“超越中高级程序员”了吗3.1 “超越”发生在有明确验收标准的具体任务上这个话题需要谨慎。标题说“超越中高级程序员”作为每天用AI的人我可以负责任地说在特定任务上是的在整体软件工程能力上还差得远。关键在于怎么定义任务边界。哪些任务算特定任务第一类是增删改查接口。规则清晰、位置明确AI能在几分钟内产出完整代码错误率极低。第二类是重构和清理代码比如“把这段重复逻辑抽成公共方法”模型对整体文件看得见重构时保守又靠谱。第三类是写单元测试AI会认真读函数签名和输入输出生成正常和异常用例虽然可能过度mock但作为初稿已经远超“只会写happy path”的人类同事。第四类是解释遗留代码把一个几百行没有注释的老脚本丢给它要求它理清调用关系这种能力已经超过大多数靠猜的中高级程序员。这些场景都有一个共同点需求能被文字准确描述且验收标准明确。只要满足这两点AI的执行速度和稳定性确实能“超越”中高级程序员。3.2 我实测的一次“从需求到PR”全流程前阵子我拿一个内部管理后台做了一次实测。需求是在用户列表页增加按注册时间筛选的参数并支持分页。我把这个需求连同现有的接口文件、模型文件、路由文件丢给了Agent工具。它在终端里一个step一个step地跑过程大概像这样[1] 读取 models/user.py [2] 确认字段 created_at, updated_at [3] 修改 routers/user.py添加 start_date/end_date 查询参数 [4] 运行 pytest发现时间比较方式不对 [5] 修改 datetime 解析逻辑重新跑测试 [6] 生成 commit message说实话我在旁边看着是有点震惊的。因为三年前这种活还得自己打开文件、看字段定义、改查询语句、再手动跑测试。现在它不仅能干活还会因为测试失败自己改代码而我只给了需求描述没有手把手教它任何一步。不过这中间出现了问题。我核对diff的时候发现它在接口返回里多加了一个字段虽然不影响功能但会改变前后端契约。它为什么不主动提醒我因为AI关心的是“完成任务”不是“评估改动影响面”。所以AI能超越程序员的是执行速度但还替代不了“定义契约”的责任感。这也是为什么我到现在都不建议直接合并AI生成的代码必须过一遍diff。3.3 依然拍马不及的领域模糊需求、技术选型和架构权衡真正还需要中高级程序员的场景通常是需求本身模糊的时候。比如产品经理说“让这个列表更智能”AI不知道“智能”是想加排序、加推荐还是加筛选。再比如技术选型新项目用微服务还是单体要不要引入消息队列这些决策没有标准答案需要结合团队维护成本、部署环境、人员水平来判断AI只能给出一个基于网络经验的通用答案往往忽略了团队实际情况。还有一个常见的坑AI写过大的架构时会“一本正经地瞎设计”。我见过一个让AI生成“电商订单系统”的案例它用五个微服务、三个消息队列、一个搜索服务连Docker Compose都写好了。看起来非常专业但如果项目部署在一台2C4G服务器上跑起来内存直接爆炸。中高级程序员至少会问一句我们有几台服务器预算多少团队几个人这恰恰是AI最不擅长的问题。所以在“定义问题”和“做取舍”这些层面AI依然是个初级工具。4. 提示词和工具选型决定你是“玩具”还是“利器”4.1 20分钟学会能用于生产环境的提示词模板很多人对AI编程的最大误解就是“提示词写得越长越有用”。我用三年下来的经验是一句话描述目标 明确的约束 相关上下文 验收标准远比写一篇小作文好。我自己现在常用的模板已经固定下来了简单到可以写在下边角色你是一位熟悉{项目技术栈}的资深工程师。 任务实现{具体需求}。 约束 - 使用{项目已有库/框架}不新增不必要的依赖 - 遵循项目现有命名风格 - 不修改与本次需求无关的代码 - 完成前先列出实现思路和可能的风险 上下文 {贴出相关文件内容} 验收标准 - 项目测试通过 - 对输入/输出格式有注释 - 说明你在什么地方做了取舍这个模板不一定适合所有场景但它解决了“信息不足”这个最常见问题。我对比过不给约束时AI大概率会引入一个新依赖比如做日期格式化就想到dateutil而项目里明明有现成工具而加上“遵循现有代码风格”生成结果就能无缝嵌入代码库。使用技巧还有三个第一把任务拆小一个接口一个接口地让AI写而不是“把整个模块改了”第二给AI看真实文件内容而不是描述第三要求AI先说思路再写代码。当你发现AI生成的东西偏差很大多数情况是因为你没有给它足够多的约束或上下文而不是“AI不行”。4.2 免费工具、订阅工具怎么选工具选型要看你的具体场景。为了不让你被各种广告带偏我按实际使用体验整理了一个表可以直接抄类型代表工具适合人群优点需要注意IDE补全插件GitHub Copilot、Codeium日常写代码想提速的人集成好补全快不用切换窗口对项目理解有限只擅长局部生成对话式AI助手ChatGPT、Claude需求分析、代码解释、独立脚本上下文灵活可多轮对话手动复制粘贴不适合大项目Agent型工具Codex CLI、Claude Code、Cursor Agent能接受AI自主执行命令的人可自动读写文件、跑测试、修复错误订阅费用高消耗token快本地免费方案Twinny、Continue 开源模型数据敏感、不想付费隐私可控离线可用模型能力弱于在线需要自己调环境说到“Codex这类付费AI编程软件到底值不值”我的看法是如果你每天都写业务代码它一天能帮你省下两小时重复性编码就值如果只是偶尔问问题免费版完全够用。成本不单是钱还有上下文暴露风险。公司核心代码不能随便粘贴到公开工具敏感项目要用企业版或者私有部署方案。这也是选型里最容易被忽略的一条。4.3 把AI接进工作流的正确姿势以及要守住的红线我建议把AI当“结对的新手程序员”而不是“自动程序员”。正确的工作流是这样的你拆好任务明确验收标准。提供上下文文件给出约束。让AI生成代码或Agent执行任务。你认真review diff补上AI不会主动给出的“影响面说明”。跑测试、跑静态检查再合并。红线方面我总结了三条第一绝不在生产环境直接执行AI给的“修复命令”尤其是数据库迁移、批量删除这类危险操作第二绝不把密钥、内网地址、用户真实数据贴进公开对话工具第三绝不接受“测试通过了”作为唯一标准因为AI可能生成一个自我安慰的测试根本断言不到关键行为。守住这三条AI可以成为一个好队友守不住它就是一个有高权限的实习生。5. 实操实录让AI从零搭建一个可运行的小项目5.1 一个真实需求与AI给出的第一版代码选一个小项目统计目录下每个子目录大小的命令行工具。需求简单但足够说明“能跑”和“能上线”的区别。我给AI的提示词大概是写一个Python命令行工具扫描指定目录下每个子目录的大小按大小从大到小输出前10个输出格式为“目录名 大小MB”。AI很快给出了第一版代码import os import sys from pathlib import Path def get_dir_size(path: Path) - int: total 0 for file in path.rglob(*): if file.is_file(): total file.stat().st_size return total def main(): root Path(sys.argv[1]) items [] for sub_dir in root.iterdir(): if sub_dir.is_dir(): items.append((sub_dir.name, get_dir_size(sub_dir))) items.sort(keylambda x: x[1], reverseTrue) for name, size in items[:10]: print(f{name} {size / 1024 / 1024:.2f} MB) if __name__ __main__: main()坦白说这个版本能跑。但如果你真的放到一个有一定规模的目录下比如一个有几十万个文件的项目目录它会卡到你怀疑人生。原因在rglob(*)这个遍历方式会把子目录里的所有文件都递归出来做stat调用重复计算且IO压力巨大。5.2 人工检查发现的问题与修复过程我让AI“用os.scandir重写避免全目录遍历”。第二版改成了递归遍历每个子目录并正确处理符号链接。然后我又发现两个问题一是没有处理权限受限的目录程序遇到PermissionError会直接崩溃二是大小单位写死MB文件多了以后展示很不友好。于是继续要求AI加异常处理并支持自定义单位。最后得到的版本多了一层错误捕获还加了一个简短的单元测试验证空目录和符号链接场景。这个过程最有价值的地方在于AI每一版都能跑但每一版都存在真实问题。如果我只用“接口能跑通”来验收就会漏掉性能、权限、边界条件这些关键点。AI输出“能用”的代码很容易输出“能用的好代码”还需要人的判断去引导。所以整个实操可以总结成一条经验让AI先给实现思路再写代码最后让它自评“这段代码在你的约束下可能有什么问题”能显著减少返工。5.3 从“能跑”到“能上线”还差哪些步骤“能跑”和“能上线”之间差着一整套工程动作。AI生成的代码可以快速搭骨架但要进入生产环境我还需要手动做这些事情安装并锁定依赖版本写README和使用说明加CI任务保证后续改动不会破坏功能统一日志格式方便排查对长时间运行的任务增加进度输出或超时控制。这些事AI也能做一部分但都需要人工确认是否符合团队规范。我见过很多团队让AI直接生成一个脚本然后扔到生产服务器上跑结果半夜磁盘写满都找不到一条日志。这显然是使用方法的问题不是AI能力的问题。如果你能把“验收标准”从“代码能跑”升级成“符合工程的验收标准”AI生成的代码才能从玩具变成工具。6. 常见问题与排查技巧实录6.1 AI“幻觉代码”长什么样怎么识别AI生成代码最常见的坑就是幻觉也就是它“很自信地写错”。我踩过的幻觉代码通常有几个特征调用了某个库根本不存在的接口把一个常见的API参数记错测试用例过于完美但没有验证真实行为注释和实现完全对不上。现象可能原因排查方法运行报错提示某个方法不存在模型基于记忆“补全”了API查官方文档或直接看库源码代码能跑但特别慢模型选了一个“最热门”的写法用小数据压测再决定要不要优化测试全过真实数据却出错测试用例被AI“模拟”了检查断言断言要落在真实行为上注释写的是A实现是BAI把说明和代码分开生成不信任注释直接读代码逻辑排查这些问题的核心动作只有一个人工review。不要因为AI“看起来很懂”就跳过review。某种程度上AI夸张的自信感甚至会让新手更容易踩坑因为它从来不会说“我不确定”。6.2 上下文窗口不够用怎么办项目一大上下文窗口再大也有限。我的处理方式有三种第一把任务拆到函数级一次只给一个函数第二用Agent工具放在项目根目录让它自己去读文件不要手动全量贴进去第三让AI“先读取并总结再基于总结修改”减少一次性上下文压力。还有一个很有效的技巧如果某个文件太长要求AI先只读关键函数或类而不是整段贴进去。很多Agent工具支持选择代码片段后再生成配合“只改你给出的部分”这一约束能有效避免AI把其他函数也改了。一旦发现AI改了无关代码直接回滚重新约束不要在上面继续改否则后面会越来越乱。6.3 安全合规视角生成代码也要过审在团队里推广AI编程不能只谈效率还要过合规这关。需要明确几条底线公司核心代码不传到未经批准的第三方平台敏感项目使用私有部署或企业版账号生成代码的License归属要明确尤其当模型训练数据来自开源仓库时要检查生成结果是否复制了大段受保护代码。我在团队内部推动AI辅助开发时定的规则很简单AI生成的代码也要走普通代码评审流程不能因为是AI生成就自动获得更高的信任。评审关注点包括是否有SQL注入、是否有鉴权缺失、是否引入了不必要依赖、是否改变了接口契约。这些红线守住之后AI编程才能成为效率工具而不是事故源。说了这么多最后还是想聊几句体感。我自己从“AI编程是玩具”到“AI编程像开挂”最大的变化其实是心态我不再让它直接写“正确”的代码而是让它先写“可验证”的代码我再负责验证。用AI三年我的核心经验就一句话提示词永远替代不了你自己的判断力。AI可以超越中高级程序员的打字速度但超越不了你对软件工程边界的理解。最后再分享一个小技巧在提示词里加一句“先列出可能的边界条件和风险再开始写代码”这句话能帮你挡掉一半以上的返工。我后来所有用在生产环境上的AI生成代码都是基于一次次“让它先说风险”的版本改出来的。用AI不是放手让机器干活而是把它当成一个执行速度极快、但方向感和边界感都需要你兜底的外援。希望这篇复盘能让你在未来的开发里少走我走过的弯路。