我先说个真实感受:这两年我用 AI 写过的生产代码,比我前五年自己敲的还多。但真正让我对「AI 编程」改观的,不是它能生成多少行代码,而是它确实能帮我处理那些脏活累活——补测试、查兼容、理老代码。这篇文章没有高大上的理论,全是我在真实项目里用 AI 编程的实际流程、提示词模板和踩坑记录,适合那些已经把 AI 用在副业、但还没敢让它碰核心工程的同学。
1. 真实编程和「让 AI 跑通 demo」差在哪
1.1 从一次翻车说起
去年我用 AI 写过一个爬虫。单文件、依赖少、跑起来很顺,数据抓得也挺干净。我当时觉得,AI 编程不过如此。结果把它往公司项目里一塞,直接挂掉——项目里有统一的日志规范、超时控制、代理配置、依赖版本锁定,这些 AI 一概不知道。它给我的是「能跑」的代码,但不是「能上线」的代码。
这个教训让我想明白一件事:真实编程的难度从来不在「写出一段逻辑正确的代码」,而在「这段代码能不能放进一个已经有十年历史、有团队规范、有线上流量、有天量异常路径的系统里,安安稳稳地跑下去」。AI 擅长前者,后者才是人的主场。
1.2 真实工程里的四笔隐形成本
用 AI 做真实编程,第一个要建立的概念就是「隐形成本」。一个功能从「AI 写出来」到「真正发布」,中间隔着四样东西:
- 业务约束:不仅仅是功能对不对,还要考虑数据和权限边界。比如导出接口不能把所有人的手机号都导出去,AI 不知道你的业务规则。
- 团队规范:命名风格、目录结构、错误码约定、日志格式。这些在 AI 的训练数据里存在,但你项目里的具体约定它只能靠猜。
- 运行环境差异:本地能跑、测试环境能跑、生产环境不一定能跑。文件路径、内存上限、并发模型、中间件版本,全是变量。
- 长期维护成本:代码是写给下一次看的人,包括三个月后的自己。AI 生成的「压缩饼干式」代码,往往注释少、命名随意、抽象过度,后面接手的人想骂人。
这也解释了为什么很多人说「AI 写的代码不敢用」。不是 AI 不行,而是缺了一个环节——你需要用自己的工程经验,补齐 AI 看不到的上下文。
2. AI 编程工具的实际分工
2.1 我每天都在用的三类工具
现在市面上的 AI 编程工具眼花缭乱,但按工作方式分,其实就三类。我身边总有同事问我「到底哪个最好」,我的答案一直是:分类看,别指望一个工具干所有事。
| 工具类型 | 代表 | 定位 | 适合场景 | 注意点 |
|---|---|---|---|---|
| IDE 插件 | GitHub Copilot、通义灵码、CodeGeeX | 补全型选手 | 写代码时的逐行补齐、函数级生成、注释转代码 | 对全局上下文感知弱,容易生成风格违和的代码 |
| 对话式模型 | ChatGPT、Claude、DeepSeek | 讨论型选手 | 方案设计、代码解释、逻辑推演、排查思路 | 不主动看你项目,需要你把关键代码贴给它 |
| 上下文编辑器 | Cursor、Trae、JetBrains AI 助手等 | 结对型选手 | 直接在项目里选中代码段提问、生成 diff | 上下文窗口有限,超大型 repo 还是抓瞎 |
| Agent 工具 | Cline、Codex 等 | 执行型选手 | 批量重构、跨文件机械修改、自动跑测试修错 | 改动范围大,必须严格审查 diff,短期别让它独立改业务核心模块 |
我个人的组合拳是:IDE 插件负责日常补全,不打断思路;遇到复杂需求,我会把相关代码片段丢给对话式模型,先聊清楚方案再动手;上下文编辑器用于需要精准改动单个函数的场景;Agent 类工具我只在机械性重构时才会用,比如批量把print改成统一日志、把某个老接口的参数从str换成enum。这类改动路径清晰、验证明确,Agent 很在行。
2.2 选型不必「All in One」,按任务选工具
很多人挑 AI 工具像挑手机,非要分个高下。真实情况是,同一个项目里我会同时用三个工具,各管一段。举个例子,我最近在做的一个数据同步模块:
- 设计同步策略时,用对话式模型讨论:主从冲突怎么处理、失败重试用什么策略、幂等怎么保证。
- 写具体同步函数时,用 IDE 插件补全,生成基础的
fetch/transform/load框架。 - 遇到某个同事写的晦涩函数,直接在上下文编辑器里选中那段代码,让它解释给我听。
- 最后用 Agent 工具把这个模块里的重复代码统一抽取成公共方法。
这套组合拳打下来,每个工具都在干自己最擅长的事。你不需要担心工具之间切换会不会打断思路,因为真实编程本来就是一件多线程的事情——设计、编码、调试、重构本来就交替出现。
3. 可复制的 AI 编程对话流
3.1 一份能用的提示词模板:四个上下文要素
很多人用 AI 写代码时上来就是一句「帮我写个登录接口」,然后抱怨 AI 写得稀烂。问题不在 AI,在你给的上下文太少。我总结了一套提示词模板,核心是四个要素:项目背景、技术栈、代码位置、约束条件。写清楚这四样,AI 的输出质量会提升一个档次。
先说我自己常用的一个模板:
你是这个项目的资深后端工程师。 项目技术栈是 Python 3.11 + FastAPI + SQLAlchemy 2.0。 现在需要新增一个 GET /api/orders/export 接口,返回全部订单的 CSV 文件。 请先阅读 server/main.py、api/routes/orders.py、models/order.py 这三个文件, 搞清楚现有的鉴权方式和错误处理约定,然后: 1. 给出接口设计说明,包括错误码和返回格式; 2. 复用现有的 resp 工具函数,不要引入新依赖; 3. 对数据量做上限保护,超过 10 万行给出明确报错; 4. 先不要写代码,先列出你要改动哪些文件、每处改什么。这个模板的关键动作是「先不要写代码,先列出改动计划」。我让 AI 在动笔之前先汇报思路,这样我能第一时间发现它的误解,而不是等它写完一大坨再花更多时间纠正。真实工程里,改错一个接口签名比多写十个函数代价更大。
3.2 把大需求拆成 AI 能吃的任务
第二个心法是拆任务。AI 跟我们一样,一次处理的信息量有限。你让它「帮我做一个完整的订单系统」,它只会产生一坨难以维护的缝合怪代码。真实项目里,我会把一个功能拆成五个左右的小任务,每个小任务都能独立验证:
- 第一步,定义数据结构:让 AI 生成数据模型和字段校验规则。
- 第二步,写访问层:只做数据库读写,不掺业务逻辑。
- 第三步,写业务规则:一个函数只管一件事。
- 第四步,写接口层:参数验证、鉴权、调用业务层。
- 第五步,补测试和文档。
每步之间我都会做一次代码审查,确认没问题再进下一步。这样做的好处是,出问题你能精准定位到是哪一步 AI 开始跑偏,而不是面对一整屏的代码无从下手。
拆任务还有另一个隐藏价值:它逼着你先想清楚设计。很多程序员自己动手时习惯边写边想,但让 AI 动手之前,你必须先把大方向想明白,不然 AI 的「自由发挥」会让你原地爆炸。
3.3 让 AI 先读代码,而不是先写代码
真实编程里最有价值的场景之一,是让 AI 帮你理解陌生代码。我接手过很多历史项目,老同事离职、文档缺失,代码全靠猜。以前碰到这种情况只能硬啃,现在我会直接把文件丢给对话模型,问它几个问题:
- 这个模块的整体流程是什么?
- 这个函数为什么这么写?里面的注释都不在了。
- 这里有段看起来永不执行的逻辑,是 bug 还是有意为之?
这个过程的重点是:让 AI 复述代码逻辑,你来做判断。AI 的代码理解能力在多数场景下相当靠谱,但偶尔也会自作聪明地帮你补全「作者的意图」,这时候你反而是那个发现问题的人。把 AI 当外援军师,而不是当权威,这是我在真实项目里最深的体会。
我之前在处理一个 MapReduce 风格的数据处理任务时,项目里的一个 reducer 函数特别晦涩,几十个状态变量互相纠缠。我花了一个下午没理清楚,后来把它拆成几段丢给 AI,让它一段一段解释,再用自己的话复述给同事听,确认思路没错。那次之后我就养成了一个习惯:看懂老代码之前,不让 AI 动一行代码。先把代码吃透,再只做最小改动,是真实项目里最稳的策略。
4. 真实项目实操:两个任务全流程拆解
4.1 给老系统新增一个导出接口
我带你们走一遍我在真实项目中使用 AI 新增接口的完整流程。这是一个订单管理系统,Python 写的,几十万行代码,里面的路由、鉴权、错误处理都有自己的约定。我不能直接让 AI 凭空生成一个接口,得按流程来。
第一步,让 AI 读代码。我会把相关的三个文件路径贴给它:路由文件、模型文件、公共工具文件。目标是让 AI 搞清楚现有的鉴权方式和返回结构。这一步的输出是一个「项目现状说明」,不是代码。
第二步,让 AI 提接口设计方案。我会告诉它新增接口的功能、数据规模、性能要求。它给我方案,我再根据经验调整。比如它建议直接同步导出全部订单,我根据数据量判断应该加一个异步任务的方案,但考虑到现有系统没有任务队列,最终选择同步导出加上限保护。这步的 AI 是讨论对象,不是决定者。
第三步,让 AI 生成实现代码。这次我会给它明确的约束:返回格式、错误码、依赖限制。代码生成后我不会直接使用,而是先做一次人工代码审查。我会重点看三处:鉴权是否复用现有逻辑、SQL 是否走了索引、异常处理是否符合项目约定。
第四步,让 AI 补测试。把生成的实现代码发给它,让它给出测试用例设计,覆盖正常路径、权限不足、数据超限、下游超时这几种情况。然后我再加上项目特有的两个场景:重复点击导出时的并发控制和导出文件编码问题(老系统的 Excel 导入模块一直因为编码问题被业务投诉,我吃过这个亏)。
这整个流程走下来,一个中等复杂度的接口大概花两三个小时,比我自己徒手写快了不少,更重要的是,每一步都有明确的验证节点,不会等问题堆积到最后才爆发。
4.2 排查一个线上偶发 bug
比写新代码更考验 AI 能力的,是排查线上问题。遇到过一次用户头像上传后偶尔出现 503 的诡异现象,平时没事,高峰期必现。这种问题靠肉眼盯代码很难找出来,因为问题往往不在报错的那一行,而在某个资源的生命周期管理上。
我的排查流程是这样的:
- 把相关文件的代码、报错堆栈、线上环境信息一起喂给 AI,让它列出所有可能的原因,先不要给修复方案。AI 会从缓存键冲突、临时文件句柄泄漏、上游存储服务的连接池耗尽、鉴权 token 过期重试这几个角度分析。
- 我根据经验给每个可能原因排优先级,再让 AI 针对前两个嫌疑点给出加日志的方案。
- 在预发布环境复现,看日志定位。
- 让 AI 给出修复方案,我审查后小范围灰度。
这次的实际元凶是临时文件没有及时关闭:头像处理时先写入临时目录,再上传到存储服务,但句柄一直没释放。高峰期文件描述符被耗尽,新请求无法创建临时文件,直接抛 503。AI 最开始列的原因里也有这一条,但它没把它排在前面。是我结合「高峰期必现 + 平时没事」这个特征,把资源耗尽类问题排到前面,这才少走了弯路。
排查类任务的正确用法,是让 AI 做头脑风暴和知识检索,而不是让它直接断案。它对运行时的理解、对中间件行为的认识都相当不错,但你的实战经验依然是最重要的判断依据。
5. AI 代码的验收标准与安全红线
5.1 我过 AI 代码时的六项检查
AI 代码能不能上线,最终拍板的必须是人。我的日常做法是,把 AI 生成的代码当成新同事写的 patch,按一套标准去 review。我把这套标准总结成六个检查项,每次都照着过:
| 检查项 | 具体看什么 | 常见问题 |
|---|---|---|
| 编译与静态检查 | 有没有类型错误、未定义变量、语法问题 | AI 偶尔会写错 import 路径 |
| 测试覆盖 | 关键路径有没有测试,异常分支是否覆盖 | AI 喜欢只测 happy path |
| 边界条件 | 空数据、超大数据、并发请求、超时情况 | 这是 AI 最容易忽略的地方 |
| 异常处理 | 异常是吞掉了还是会暴露堆栈,有没有重试机制 | AI 常写except: pass这类危险代码 |
| 性能风险 | 有没有 N+1 查询、全表扫描、不必要的循环嵌套 | AI 对数据量级没有概念 |
| 可维护性 | 命名是否清晰、注释是否必要、函数是否过长 | AI 会生成上千行的巨型函数 |
每次 review 我都会先跑静态检查和已有测试,再人工过一遍核心逻辑,最后补上 AI 漏掉的边界场景测试。这套流程看着繁琐,实际执行起来很快,但能挡住绝大多数坑。
5.2 几条不能越的红线
除了检查项,我还给自己定了几条 AI 代码的安全红线,几条「绝不让步」的规矩:
- 不直接使用 AI 生成的加密、鉴权、支付相关代码。这类代码出问题的代价太大,AI 就算写得对,也未必理解业务场景里的合规要求。我会让它给出思路,但核心实现一定自己写。
- 不在生产环境使用
except: pass这种静默吞异常的模式。AI 非常喜欢用这种方式「健壮化」代码,但对排查问题而言,这等于把故障埋进地里。 - 不让 AI 直接修改数据库迁移文件。迁移文件的历史记录和数据一致性非常重要,AI 不了解线上数据的实际情况,它生成的迁移脚本我只作参考,手动改写。
- 不对 AI 生成的代码做「无脑信任」的优化。有时候 AI 会主动建议「这里可以用线程池优化一下」,但如果原来的同步代码已经够用,为了优化而优化反而增加复杂度。
设定红线的本质,是把 AI 当工具而不是当队友。工具能帮你干活,但决策权必须在自己手里。
5.3 实测下来,提效了多少
很多人问我用 AI 编程到底能快多少。我的体感是:纯机械性工作(补测试、写简单 CRUD、改格式)提效 50% 以上;中等复杂度任务(新增接口、修 bug、重构单个模块)提效 30%~40%;高难度设计任务(系统架构、数据一致性方案、性能瓶颈分析)提效 10%~20%,但在方案讨论上省了大量时间。
我的实测经验是,提效最大的不是写代码本身,而是「减少上下文切换」。以前写代码卡住了,要切到搜索引擎、翻技术文档、翻自己的笔记,一折腾就是十几分钟。现在直接问 AI,几秒钟就有答案,哪怕答案不完美,也能快速提供思路。这种不打断心流的感觉,才是让我真正离不开 AI 编程的原因。
6. 踩坑实录与排查速查表
6.1 三个最常见的错误用法
跟大量朋友交流过用 AI 编程的经验,我发现几个高频错误,自己也都犯过,写出来帮你们避雷。
错误一:把 AI 当搜索引擎,搜到答案直接粘贴。搜索引擎返回的答案是面向广大网友的,AI 生成的代码也是。你项目里数据库字段叫user_nick还是nickname,你跟它说了它才会知道。不做任何适配就直接复制,几乎肯定会留下隐患。
错误二:给 AI 的信息太少,然后抱怨它「不听话」。我见过有人只发一句「这个接口怎么优化」,AI 给出一个泛泛的方案,他就觉得 AI 没用。真实情况是,你需要给 AI 赋予足够的角色设定和背景信息,它才能给出贴合实际的建议。你问得越笼统,它答得越空洞,这是必然的。
错误三:让 AI 一次生成一个超大功能。如果你拿到一个两千行的 AI 生成脚本,我建议不要直接放到项目里用。AI 没有「项目感」,它不会替你考虑这个模块将来怎么扩展、跟其他模块怎么衔接。拆成小任务、逐步生成、逐步审查,才是可控的做法。一句话概括:让 AI 帮你写函数,而不是帮你写系统。
6.2 排查速查表:AI 代码常见问题
我在日常 review 中整理了一份 AI 生成代码的常见问题速查表,分享出来,你遇到类似情况可以直接对照:
| 问题现象 | 可能原因 | 处理办法 |
|---|---|---|
| 代码能编译但运行直接报错 | import 路径写错、依赖版本不对 | 先看报错堆栈,别急着改逻辑 |
| 测试用例全过了但功能是错的 | 测试用例和实现用了一样的错误假设 | 人工走一遍核心逻辑,别只看测试结果 |
| 小数据量没问题,大数据量卡死 | AI 没考虑复杂度,写了 O(n²) 算法 | 让 AI 改用哈希表或减少循环,再跑性能测试 |
| 生成的代码风格跟项目不一致 | 没有给它看已有代码风格 | 贴一段项目里的代码作为风格参考 |
| 异常被静默吞掉,看不出来哪里有问题 | AI 习惯用except: pass | 全局搜索except:,要求改成日志输出 |
| 函数太长,一个函数几百行 | AI 倾向于把流程全塞进一个函数里 | 让它按职责拆分,每个函数只做一件事 |
这张表解决不了所有问题,但能帮你快速归类。AI 编程最有意思的一点是:它的错误模式是稳定的,你踩过一次坑,就知道下次该怎么让它避开了。
7. 我现在的一天:AI 编程的日常节奏
讲了这么多,最后聊聊我现在的日常节奏,也当是给大家一个参考。
我的一天大概是这样开始的:早上先花半小时处理消息、看代码 review 请求,这个阶段我会开着 IDE 插件,它会在旁边自动补全一些简单的重复代码,不太需要我动脑。上午的黄金时间我会用上下文编辑器集中写复杂业务逻辑,这时候我会先让 AI 读代码、列方案,再进入「讨论 → 生成 → 审查 → 修正」的循环。下午一般处理 bug 和测试,这类任务我会优先用对话式模型快速定位问题,再进入修改流程。傍晚留一个小时给自己——不依赖 AI,手写一些代码练手感。
这样做一段时间以后,我发现自己真正的进步不是「代码写得更多了」,而是「设计能力变强了」。因为 AI 承担了执行层的琐事,我有更多时间思考业务逻辑、系统边界和长期演进。以前写一个功能,大半时间在抠语法、调参数、踩坑;现在可以把精力放在「这个模块值不值得做」「接口应该怎么设计才不会被需求折腾死」这些更根本的问题上。
最后分享一个小技巧:我每隔一段时间会强迫自己不用 AI 写一个完整的小功能,从头到尾纯手写。这样做不是为了证明什么,而是为了保持「没有 AI 也能写」的能力。工具在进化,但你的基本功才是你在技术这条路上走远的底气。依赖 AI 可以,依赖到失去手写能力,那就要警惕了。
AI 编程现在对我而言,更像是一个能力放大器。代码还是要人写,架构还是要人选,锅还是要人背,但它确实帮我省下了大量时间,让我能把精力花在真正重要的事情上。这篇文章里的所有流程和模板,都是我在真实项目里一遍遍试错试出来的,希望能给正在探索 AI 编程的朋友一些参考。