AI编码实践反思:从提示词工程到协作流程,如何避免越用越累 1. 从“AI解放生产力”到“AI制造新负担”的认知转变最近和几个做开发、做产品、做运营的朋友聊天发现一个挺有意思的共性现象大家嘴上都在说AI工具多厉害但私下里抱怨最多的反而是“用了AI之后活儿好像更多了人更累了”。这和我自己近一年的体验高度吻合。当初ChatGPT横空出世Codex、Claude这些代码助手紧随其后我们都以为一个“躺平”的时代要来了——让AI去写那些重复的、繁琐的代码我们只需要动动嘴皮子做做架构设计和核心逻辑就行。理想很丰满现实却给了我们一记闷棍。我最初接触的是GitHub Copilot后来是Cursor再后来是各种基于Claude、DeepSeek的本地化代码助手。从简单的代码补全到根据注释生成整段函数再到现在的AI Agent能帮你跑通一个完整的模块。工具越来越强但我的待办清单并没有变短反而因为要“驯服”和“管理”这些AI新增了一堆任务。这绝不是错觉而是一个正在发生的、普遍性的“AI疲劳”综合症。问题的核心不在于AI不够智能而在于我们使用AI的方式、我们与AI协作的流程以及我们对AI产出的预期管理出现了系统性的偏差。这篇文章我就结合自己踩过的坑聊聊为什么AI会让你更累以及我们该如何调整策略真正让AI成为助力而不是负担。2. “提示词工程”的隐性成本从想法到可执行指令的漫长路径很多人觉得用AI写代码就是输入一句“帮我写个用户登录的API”然后就能得到完美可用的代码。这可能是最大的误解。在实际操作中从你脑海中的一个模糊需求到AI能准确理解并生成合格代码的“提示词”中间隔着一条鸿沟。这条鸿沟的填补消耗了大量的、我们未曾预料的心智成本和沟通成本。2.1 需求拆解与上下文构建AI不是你的产品经理当你对一个人类开发者说“做个登录功能”他基于共同的知识背景HTTP协议、数据库、Session/Cookie、密码加密等能自动脑补出大量细节。但AI没有这个“共同背景”除非你明确告诉它。于是你的工作从“写代码”变成了“给AI写一份极度详细的产品需求说明书”。举个例子我最近需要用Spring Boot写一个带验证码的登录接口。如果我自己写脑子里过一遍流程就开始敲键盘了。但用AI我得先为它构建上下文技术栈限定 “使用Spring Boot 3.x, Spring Security, JWT数据库用MySQLORM用MyBatis-Plus。”功能细节描述 “登录请求体包含username, password, captchaKey, captchaCode四个字段。captchaKey是前端生成验证码时返回的UUIDcaptchaCode是用户输入的验证码文本。需要先校验验证码是否正确假设有一个CaptchaService.verify(key, code)方法再校验用户名密码。密码在数据库中是BCrypt加密存储的。”输出格式要求 “登录成功返回一个JSON包含code: 200,message: “success”,data: { token: “jwt-string”, userInfo: {…} }。登录失败要区分是验证码错误、用户不存在还是密码错误返回对应的错误码和信息。”安全与异常处理 “需要对请求参数进行校验用Valid密码错误次数过多要有锁定机制这里先不提全局异常处理器已经存在你只需要抛出对应的业务异常如CaptchaException或BadCredentialsException。”写完这一大段提示词可能已经过去了十分钟。这还没完AI生成的第一版代码很可能把JWT的生成逻辑写在了Controller里或者没考虑MyBatis-Plus的查询方式。你需要继续补充“JWT工具类叫JwtUtils用户查询使用UserMapper接口其selectOne方法接收一个QueryWrapper。” 这个过程本质上是在进行精细化的“需求翻译”和“上下文注入”。你的角色从一个执行者变成了一个需求分析师、架构师和测试用例设计者的复合体。思考的深度和广度并没有减少只是从“动手实现”转移到了“动嘴描述”上而这种描述的精确性要求极高其脑力消耗甚至超过直接写代码。2.2 迭代调试与“对齐损耗”和AI的拉锯战即使提示词写得足够详细AI生成的代码也极少能一次通过。它可能会用错API的版本比如Spring Security 6.x的配置和5.x完全不同可能会忽略线程安全可能会写出性能有问题的查询比如N1问题。这时你就进入了“迭代调试”环节。你不是在调试自己的代码逻辑而是在调试AI对你意图的理解。这个过程充满了“对齐损耗”。比如AI生成了一段使用Transactional注解的方法但你觉得在服务层某个特定情况下不需要事务。你告诉AI“去掉这里的事务注解。” AI照做了但可能顺手把其他必要的注解也改了或者破坏了方法内的其他逻辑。你又得花时间去看diff确认它只改了该改的地方。更常见的是AI生成的代码通过了编译但运行时行为不符合预期。比如一个分页查询AI可能正确使用了PageHelper但排序字段写错了。你不得不自己去看日志、分析SQL最后发现问题然后再次用精确的语言描述给AI“分页查询的排序字段应该是create_time DESC不是id。” 这一来一回的沟通成本常常抵消了AI生成代码所节省的初始编码时间。你节省了敲键盘的时间但花费了更多在“审查、验证、沟通和微调”上。这种精神上的频繁切换和高度专注比连续敲代码更容易让人感到疲劳。3. 代码审查负担的指数级增长信任与验证的悖论当代码全部由自己编写时审查的重点在于逻辑是否正确、边界是否覆盖。当代码由AI生成时审查的维度发生了质的变化。你不再只是审查逻辑更要审查AI是否“正确理解”了你的意图是否引入了你知识盲区里的“暗坑”。3.1 风格不一致与“碎片化”的代码库不同的AI模型甚至同一模型在不同上下文下其代码风格会有差异。比如有的生成的代码喜欢用Optional有的则直接用null判断有的变量命名是驼峰式有的则用了下划线有的异常处理用try-catch有的用ResponseEntity。如果团队中多人使用不同的AI工具有人用Claude Code有人用Cursor有人直接问ChatGPT那么整个代码库的风格会迅速“碎片化”变得像一块由不同裁缝拼接起来的百衲衣。作为团队技术负责人或资深开发者你面临的代码审查压力陡增。以前你可以快速扫描抓住核心逻辑。现在你需要额外分心去统一风格 “这个UserDTO怎么又出现了我们项目里不是统一用UserVo吗”、“这里为什么用LinkedList我们约定好默认用ArrayList的。”统一风格本身就成了一个持续性的、低价值但高消耗的维护任务。你不得不制定更详细的AI编码规范并花费大量时间在CR中纠正这些“风格偏差”这无疑增加了心智负担。3.2 隐藏的“知识诅咒”与安全陷阱这是最让人心惊胆战的一点。AI生成的代码可能使用了你完全不熟悉的库、API或设计模式。它“知道”的太多而你能“理解”的有限。这就造成了“知识诅咒”——一段代码能运行但你不知道它为什么能运行或者它可能在什么边界条件下会崩溃。我遇到过一个真实案例让AI生成一个文件上传的接口它引入了一个我从未用过的Apache Commons FileUpload的配置项设置了某个内存阈值。在测试环境小文件上传一切正常。到了生产环境某个用户上传了一个大文件直接导致内存溢出服务宕机。排查了半天才发现是AI生成的这段“黑盒”配置在作祟。如果这段代码是我自己写的我清楚地知道每一个配置项的作用和风险。但AI写的我就可能因为信任而疏于审查这些细节。同样安全问题更为致命。AI可能会生成一段存在SQL注入风险的字符串拼接查询尽管你提示了用MyBatis-Plus但它可能在动态SQL中犯错或者使用了不安全的随机数生成器或者JWT的密钥处理不当。审查AI代码要求你具备更广的知识面和更深的警惕性。你不能假设AI生成的代码是安全的你必须以“零信任”的态度去审视每一行尤其是涉及网络、IO、并发和安全的部分。这种如履薄冰的审查状态极其消耗精力。4. 工具链的复杂化与“选择困难症”为了“更好地”使用AI我们陷入了工具链的军备竞赛。这本身就成了一个新的负担。4.1 本地化部署与配置的泥潭以Claude Desktop或Codex的本地部署为例。为了获得更好的响应速度、更长的上下文长度比如128K或者出于数据隐私考虑很多团队选择本地部署开源模型。这立刻带来了全新的问题环境配置virtual machine platform not available、CUDA版本不匹配、显存不足这些错误提示足以让一个只想写业务代码的开发者折腾一整天。你需要懂一些基本的GPU环境知识、容器知识Docker、甚至模型量化知识。代理问题 即使部署在本地某些组件可能仍需访问外部网络。cc switch local proxy failed while handling codex endpoint这类错误会让你陷入网络配置的排查中这与开发主业完全无关。版本管理与更新 今天出了一个新模型号称代码能力提升20%明天某个框架如Spring AI发布了新版本提供了更优雅的集成方式。你跟不跟更新意味着重新测试、可能出现的兼容性问题不更新又怕落后。这种持续性的“技术选型”压力也是疲劳的来源。4.2 Agent框架的学习与心智模型切换AI Agent是当下的热点。从AutoGPT、LangChain到国内外的各种Agent框架它们承诺能让AI自主完成复杂任务。但学习一个Agent框架本身就是一门新学问。你需要理解其Prompt模板、Tool定义、Memory管理、Planning逻辑。比如你想让Agent帮你开发一个简单的用户管理CRUD。你需要为它定义工具Tools 调用MyBatis-Plus生成代码的工具、运行单元测试的工具、调用Git提交代码的工具。编写规划Plan提示词 “首先分析需求创建数据库表然后生成实体类、Mapper、Service、Controller接着编写单元测试最后提交代码。”调试Agent的决策逻辑 为什么它卡在了第一步是工具定义不对还是提示词不够清晰Agent陷入循环了怎么办你从“写代码”变成了“教AI如何写代码”并且需要构建一整套基础设施和规则来约束AI的行为。这个过程的初期其复杂度和挫败感远超直接自己动手。你常常会感觉花在调试Agent上的时间足够你手动完成好几个类似的任务了。这种“为了自动化而投入巨大前期成本”的悖论在AI工具的使用中非常普遍。5. 思维连贯性的破坏与“碎片化”的工作流这是最隐性也最深刻的影响。在传统的深度编程中开发者会进入一种“心流”状态大脑中构建着完整的系统模型手指流畅地将思维转化为代码。这是一个连贯的、创造性的过程。引入AI后这个工作流被频繁打断你正在构思一个复杂算法思路被打断去给AI编写一段详细的提示词。等待AI生成代码虽然很快但依然是一个切换。阅读并理解AI生成的代码将你的思维上下文从“自己的构思”切换到“理解AI的产出”。发现AI的理解有偏差你的思维又要切换回“如何纠正AI”的模式并组织纠错语言。循环往复。这种频繁的上下文切换对大脑来说是极高能耗的。它阻止了你进入深度的“心流”状态让你的工作变得“碎片化”。你感觉自己一整天都在忙和AI“对话”了很多轮产出了很多代码但下班时却感到一种莫名的空虚和疲惫因为缺乏那种完成一个完整模块的、连贯的创造快感。AI成了你思维的“中断器”而不是“加速器”。6. 策略调整如何与AI协作而不被其奴役认识到问题是为了解决问题。让AI从“负担”变回“工具”需要我们在认知和流程上做出根本性的调整。6.1 明确AI的能力边界将其定位为“高级助手”而非“替代者”这是最重要的心态转变。不要指望AI能独立完成一个你都无法清晰描述的任务。把它想象成一个能力极强、但缺乏常识和业务背景的实习生。你的核心职责是提供精确的蓝图 你必须是系统架构和核心逻辑的绝对掌控者。AI负责的是根据你清晰的图纸提示词去“砌砖”写实现代码。负责关键决策 数据库选型、API设计、核心算法、安全方案这些必须由你决定。AI可以提供选项和利弊分析但拍板的是你。承担最终责任 代码的质量、性能、安全性最终负责人是你不是AI。因此严格的审查和测试不是可选项是必选项。基于这个定位AI最适合的场景是样板代码生成 重复的CRUD接口、DTO/VO转换、简单的单元测试、配置文件。这些代码模式固定AI生成准确率高能节省大量体力劳动。探索与学习 “用Go语言写一个快速排序的三种实现方式并对比性能”、“OpenFGA和Casbin在权限模型上有何异同”。AI是一个强大的知识库和思维碰撞伙伴。代码解释与重构建议 将一段复杂的遗留代码丢给AI让它解释逻辑、提出重构建议、甚至生成重构后的代码。这是一个很好的“第二双眼睛”。6.2 建立规范的AI协作流程为了减少碎片化和审查负担必须在团队层面建立规范制定AI编码规范 在团队已有的编码规范基础上增加AI章节。明确规定哪些类型的代码鼓励使用AI生成如简单的ServiceImpl生成代码后必须进行哪些标准化修改如统一命名、替换团队内部工具类禁止AI生成哪些代码如核心业务逻辑、安全相关代码。固定工具链 团队内部统一主要使用的AI编码工具例如统一使用Cursor或VS Code Claude Code插件并固定主要使用的模型版本。减少因工具差异带来的风格碎片化。推行“AI生成-人工精修”模式 不是生成完就直接提交。而是建立一个流程AI生成 - 开发者进行“代码精修”修复bug、统一风格、优化逻辑、补充注释- 进行常规的代码审查。精修环节是关键它确保代码最终符合“你的”思维和标准。提示词知识库 团队共建一个高质量的提示词库。将经过验证的、能生成高质量代码的提示词如“生成一个标准的Spring Boot全局异常处理器”、“生成MyBatis-Plus的QueryWrapper动态查询示例”保存下来供团队成员复用。这能极大降低编写提示词的成本。6.3 保护你的“深度工作”时间有意识地规划你的工作时间“创造时间” 留出大块不被打断的时间用于核心架构设计、复杂算法实现、关键问题攻关。在这段时间里关闭AI代码补全提示或者仅使用最基础的自动补全避免被AI的建议带偏思路或打断心流。“辅助时间” 将需要与AI协作的任务集中处理。比如把需要生成的样板代码、需要查阅的文档、需要尝试的简单实验都放在这个时间段。在这个时间段内你可以高强度地与AI互动。“审查时间” 专门安排时间集中审查AI生成的代码。以“零信任”模式进行走查和测试确保质量。通过这种时间区块的划分你既能享受AI带来的效率提升又能保护自己深度思考和创造的能力避免陷入全天候的、低效的碎片化交互中。我个人在过去几个月的实践中强制自己将核心业务逻辑的编写放在上午的“创造时间”完全手动完成。下午的“辅助时间”则用来让AI生成周边工具类、单元测试、接口文档并进行审查和精修。这套方法显著减轻了那种“被AI牵着走”的疲惫感重新找回了对代码的控制权和工作的节奏感。AI最终应该像IDE的快捷键一样成为你延伸的、顺手的工具而不是一个需要你不断伺候和博弈的“副驾驶”。这条路需要磨合但明确边界、建立流程、主动管理是走出当前“越用越累”困境的必经之路。