ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI编程实战心法:从工具选择到Agent协作的完整指南

AI编程实战心法:从工具选择到Agent协作的完整指南 最近刚结束自己为期一段的“AI编程实战”学习周期趁热把这段经历里的收获、踩坑和沉淀下来的方法做一次完整的梳理。先说清楚这篇内容是什么它不教某款IDE的具体按钮也不打算吹嘘某个工具“有多神”而是站在一个完整跑过多个小项目、经历过从“用AI写玩具代码”到“把AI当作可靠结对程序员”的视角回答几个真正值得关心的问题——AI编程最厉害的软件到底怎么选、提示词和Skill在实战里是什么角色、Agent编程怎么学才能不浮于表面、以及AI辅助MCU这类偏硬件场景时有哪些隐性陷阱。适合正在入门AI编程、或者用了一段时间但总觉得效率上不去的朋友参考。老实说看完市面上的教程大多聚焦在“怎么安装插件”“怎么复制一段Prompt”。但真正到了实战环节你会发现决定产出质量的往往不是工具本身而是你对任务边界、验证方式和迭代节奏的理解。这篇文章会把我个人验证过的流程、翻过车的细节以及现在还坚持用的策略尽可能直接地摊开来讲。1. 这一轮AI编程实践我到底在练什么在展开工具和技巧之前先说一个更底层的观察。AI编程入门时最容易犯的错是把它当成“高级自动补全”来用。早期我试过拿大模型生成整段函数、生成配置文件、甚至直接让它写一个小模块的完整代码结果发现有相当高的概率拿到“看起来对但跑不通”的产物。后来才慢慢意识到AI编程练的不是“让模型吐代码”而是练三件事任务拆解能力、验收意识和变更管理能力。任务拆解能力指的是把一个大功能切成若干个可以被单独验证、单独描述清楚的小任务。这不是AI特有的要求但AI编程把这个要求放大了。因为模型对上下文的依赖很重一段逻辑里如果混杂了多个职责它很容易在某个边界上“自由发挥”。比如我之前让AI生成过一个数据采集模块要求包含串口解析、阈值判断、日志上报三个功能。结果是三个功能都写了但串口解析的格式假设和日志上报的数据结构完全对不上因为模型在生成日志上报时自己脑补了一个字段映射关系。验收意识则是说AI生成的每一段代码都必须有一个明确的“怎么算对”的判断标准。我以前经常是“看起来差不多就收工”结果经常在后续集成阶段被隐蔽的问题折磨。比如让AI写一个状态机的转换逻辑单纯看代码结构完全合理但状态转移的触发条件里漏了某个边界事件只有把测试用例跑起来才能暴露。后来我给自己定了一条规则任何AI生成的逻辑必须配套至少一组能证明它行为正确的输入输出样本。变更管理能力听起来有点重实际落地其实是对“迭代”过程的控制。AI编程最常见的工作方式是一轮一轮对话每一轮都在上一轮基础上调整。问题是模型对“修改之前先理解原有设计意图”这件事执行得并不稳定经常出现“你让它改A它顺手把B也改了”或者“改了A却忘了同步A的调用方”。这倒不是模型笨而是对话式交互天然缺少代码评审的约束。所以实战中我会频繁使用版本管理每次把AI生成的代码提交为一个小节点万一某轮对话把局面改乱了可以直接回退而不是在越来越乱的上下文里继续打补丁。复盘这一段时间我认为所谓的“AI编程实战”练到最后本质是练一种新的协作节奏人负责意图、边界和验收模型负责局部实现的最优解搜索。谁的角色错位项目质量都会滑坡。2. 热门工具的真实分工Copilot、Cursor、Claude Code、Kilo Code怎么选每次聊AI编程“最厉害的三个软件”这种问题都会被反复提起。我的整体观点是工具之间的差距远小于使用方式之间的差距但不同工具的设计取向确实会把你推向不同的工作模式。所以与其问“哪个最强”不如问“哪个和你的工作流合拍”。先整理一下目前个人实测过的主流工具定位工具核心定位适合场景个人体感短板GitHub Copilot行内补全与局部生成在已有代码库里提升打字速度面对跨文件、跨模块的大改动需要更明确的引导Cursor对话式代码生成多文件编辑用自然语言描述功能让AI批量改动上下文管理不当容易在改动中引入隐性回归Claude Code终端Agent模式复杂任务编排、长链路重构、自动化流程对不熟悉终端操作的人有门槛授权边界需要把控Kilo Code支持Skill和自定义Agent流程希望沉淀可复用AI经验、做标准化开发流的人需要投入时间组织Skill库初期成本不低Continue / 开源IDE插件灵活的本地/远程模型接入有隐私需求、或想用不同模型切换实验功能组件多配置项需要自己调教这些工具不是一个替代另一个的关系。我自己的实用组合是日常写业务代码和调接口时用Copilot因为它快、轻、不打断思路做新功能模块设计或者修一个牵涉面比较广的Bug时用Cursor或Claude Code因为对话式的多轮修改更适合探索而一旦我需要把某类任务固定下来、反复执行比如“按照项目规范生成一个新服务的骨架代码”我会把流程沉淀成Skill交给Kilo Code调度。这里要特别说一个容易忽略但影响非常大的点模型对项目上下文的读取深度。很多AI编程工具所谓的“理解项目”其实只是把当前打开的文件、选中代码、或者几份关键配置作为上下文并不是真的扫描了整个代码库。换句话说你问它“帮我改一下用户登录的逻辑”它的判断依据很可能仅局限于你当前窗口里能看到的那部分代码。这个机制决定了你在提问时补充的上下文越具体答案质量就越高。别指望AI自己“知道”你项目的全貌它不知道。另外终端Agent类的工具比如Claude Code的工作模式有一个文档里很少强调的特性它可以自主执行多轮“读文件-改文件-运行命令-读报错”的循环。这意味着它能自己跑测试、自己看编译错误、然后自己修改。这个能力是把双刃剑——用得好它能像一个人那样“自己把活干完”用得不好它会沿着一个错误方向越走越远直到你介入。所以给Agent设置任务时我强烈建议同时给它提供“停止条件”也就是什么情况它应该停下来问你而不是无限尝试。3. 提示词与SkillAI编程里最被低估的两张底牌很多人以为提示词就是“把需求写详细一点”其实远远不够。AI编程场景下的提示词核心不是修辞而是约束条件的显式化。模型之所以经常给出“看似合理但不满足需求”的结果往往不是因为能力不足而是因为需求描述里的隐式约束没有被传递。举一个实战例子早期我写过一个提示词“请生成一个函数用于解析配置文件。” 模型给出了一个读JSON的通用函数但其实我的配置文件是自定义的INI变体带注释和分组嵌套。通用解析器完全不能用。后来我改成这样描述任务请实现一个配置解析器。约束如下 1. 输入为字符串格式为分节式形如 [section] 开头下面为 keyvalue 行value可能包含逗号分隔的列表。 2. 行首#号视为注释解析时删除。 3. 返回一个嵌套字典第一层键为section名第二层为keyvalue统一为字符串或字符串列表。 4. 遇到格式错误的行抛出带有行号的异常。 请输出完整函数和两个测试用例。差别在哪里差别在于我把格式假设、注释规则、返回结构、错误处理策略全部变成了显式约束。模型在这种输入下生成的结果可用性会大幅上升。这是提示词写作的第一原则把你在头脑中默认的一切写出来。第二原则是为复杂任务准备“角色约束与生成规范”。比如我会在提示词中固定代码风格、命名风格、是否允许第三方依赖、错误处理偏好。这些看起来细枝末节但会显著影响代码与现有项目的融合度。否则你会在一个Python项目里拿到一份充斥着Java风格类定义的代码。Skill则是提示词的进阶形态。一个Skill的本质是把某类任务的提示词模板、流程步骤、甚至少量示例代码打包成一个可复用的单元。它解决的问题是你不需要在每次做同类任务时重新把约束条件敲一遍。比如我把自己在项目中常用的“新增API接口”流程沉淀成了一个Skill内容包括自动读取路由注册文件格式、生成参数校验逻辑、补全错误码枚举、输出符合现有风格的接口文档。每次执行这个SkillAI会按部就班地处理这四步比单纯对话的稳定度高很多。不少编辑器插件和Agent工具现在都支持自定义Skill只是入口和格式不同。Kilo Code在这块做得比较系统化Claude Code也可以把指令文件放进项目里。我的建议是skill库不要一开始就追求大而全先把工作中频率最高、步骤最标准化、翻车概率最高的三类任务沉淀下来就够了。Skill沉淀的过程本质上也是个人AI工作流的工程化过程。4. Agent编程实战从“聊天机器人”到“能自己干活的执行者”Agent是当下AI编程热词里最容易被神化、也最容易被误解的一个。我自己的理解是所谓Agent编程不是编程语言或者框架的变化而是人机交互模式的切换——从你出题、AI做题的单轮问答变成你定目标、AI拆解执行、中途汇报、接受反馈后继续推进的多轮循环。要真正用好Agent首先要建立三个基础认知Agent不是“更聪明的模型”而是“更完整的执行闭环”。它依赖规划和工具调用在终端环境里能执行命令、读写文件、调用外部API。这些能力让它可以像一个初级工程师那样去“干活”但它仍然受限于底层模型的判断力。你的指令需要从“描述结果”变为“描述目标、边界、流程、验收标准”。这话听着抽象但举例就很好懂。你用普通聊天窗口时可以说“帮我写个爬虫”Agent场景里最好说“请抓取这个页面里的新闻标题列表输出为JSON文件每个条目最多50字重复条目去重抓取失败时跳过并记录错误”。前者是描述愿望后者是定义任务。Agent的执行过程不是线性的它可能会自己设计步骤、自我修正、甚至多次尝试后换一种方案。这时候你需要有“观察而不干预”的耐心以及对“失控”的监控手段。我实际跑过的一个Agent任务是这样的在一个嵌入式示例工程里给一块MCU的UART驱动补充DMA收发逻辑。任务被我描述为请基于当前工程代码结构为UART驱动增加DMA发送功能。要求 - 复用项目现有的DMA通道定义不要新增外设时钟配置。 - 发送完成后通过中断回调通知调用方。 - 注意缓冲区生命周期不要在DMA未完成时释放发送缓冲。 - 修改完成后运行工程自带的单元测试确认无回归。这个任务Agent跑了大概几十步读了好几份头文件和启动文件期间因为不理解某个寄存器的位定义而回头查阅对应厂商sdk的示例最终完成了代码修改并触发了一次编译错误它自己读取错误信息定位到宏定义冲突调整后通过了测试。这次经历让我确信Agent能够胜任的不是“提出新技术方案”而是“在既定技术路线下完成繁琐落地”。它擅长补代码、查资料、修编译错误、对照示例实现模式但不擅长“从零设计一个系统并判断取舍”。后者的职责始终在人类工程师肩膀上。那怎么系统性学习Agent编程呢我走通的路线是先找一个支持终端Agent的工具例如Claude Code从最小任务开始比如让它在仓库里定位一个函数、加一行日志、跑一次测试逐步增加任务的开放性。每跑完一个任务主动复盘Agent的决策路径问自己它在哪一步停下来了为什么如果想让流程更顺畅指令里缺了什么约束这个复盘过程比跑100个Demo都有用。学习中还有一个热门问题怎么学AI Agent编程才不会浮于表面我的答案是——去用且是带着一个真实困扰自己的问题去用。纯学概念你永远停留在“会聊天”的层次只有当一个真实功能压在你身上你才会被逼着去理解Agent的上下文窗口限制、工具调用的失败模式、以及如何设计能让它自我纠错的提示结构。5. 偏硬件场景AI辅助MCU编程的能力边界与惊喜说完通用场景单独说一下MCU编程配合AI的实战体验。这方向和纯软件开发有个很大的不同错误不一定是运行时报出来的可能是逻辑层面的隐性错误因为嵌入式开发里编译通过不代表行为正确特别是寄存器配置、中断优先级、时序这类问题AI生成的代码经常能编译但行为不符合预期。我测试过的典型场景包括生成外设初始化函数、配置中断回调、补齐低功耗模式切换、移植厂商SDK的示例到自有工程。总体感受是AI在“从datasheet或参考示例翻译成工程代码”这类任务上确实能给到很大帮助但在涉及时序约束和硬件细节时可靠性明显下降。举一个曾经让我排查很久的例子。我让AI生成一段PWM输出的初始化代码基于标准库方式配置定时器和GPIO。AI给出的代码可以编译但接上示波器发现完全没有波形输出。后来一步步排查发现定时器的时钟源配置里它默认选择了内部时钟而实际硬件设计里PWM的时基来自外部时钟源。这种错误在通用代码评审里几乎不可能发现因为语法、逻辑看起来全是对的。为了应对这类问题我后来给自己定了一套MCU场景的AI协作规则凡是涉及寄存器位定义、时钟树、中断向量表的内容要求AI在回答中引用厂商SDK中对应的头文件定义来源。凡是生成外设驱动必须额外要求AI标注“哪些配置依赖具体硬件连接”并在输出里留出待确认清单。不要在对话里让AI“自由选择”引脚或外设直接给它硬件原理图里确定的引脚编号和复用功能。生成的代码必须经过编译并在真实硬件或仿真器上验证基本行为不能停留在“代码写得对”的层面。这些规则不一定能完全消除风险但把风险范围缩小到了可验证的范围内。这里也顺便提一下VSCode生态下的AI编程插件。VSCode因为轻量、插件多、且能覆盖大部分嵌入式开发流程是目前我用下来最顺手的AI编程载体之一。我常用的组合是Cline或Continue接入远程模型配合Cortex-Debug做MCU调试编译线上错误直接回传给AI进行分析。VSCode插件的好处是它在你的本地编辑器上下文内工作可以直接看到报错位置、变量值这让AI修复编译错误的成功率比粘贴一段报错信息到网页聊天框高得多。如果刚开始尝试AI辅助MCU开发我建议最先跑的Demo是故意引入一个宏定义错误然后用AI插件读取编译错误信息并自动修复。这个路径跑通之后再逐步扩展到驱动生成这类更大颗粒度的任务。6. 高频翻车点以及我的完整排查链路复盘AI编程远不是“一路顺风”的体验翻车才是常态。这一节挑几个我踩过最深、也最有代表性的坑把完整排查链路写出来。不一定能帮你完全绕开坑但至少让你遇到时知道从哪里入手。第一个坑是“代码越改越乱最后崩溃”。具体表现是前面几轮对话产出挺正常后面某一次修改开始AI突然开始频繁改出语法错误或者不断推翻自己上一轮的设计。这里要理解一个关键机制对话上下文里旧信息会与新指令冲突而模型对“该以哪条为准”的判断不一定准确。它会认为你每一轮的描述都是新指令于是反复覆盖自己之前的合理实现。我的一次实际经历是让AI渐进式重构一个日期处理工具库。前三轮都很顺利第四轮我说“新增对农历年份的支持”结果它把之前罗马数字月份映射的逻辑也重写了一遍导致旧接口全部失效。排查时我做的第一件事不是直接让它改回来而是用版本管理工具回退到第三轮结束时的稳定版本然后开一个新的对话窗口把背景和需求重新组织后再次提出需求。这件事让我总结出两条经验一任何超过三轮的AI编码对话都应该建立分支节点并有提交记录二一次对话只承担一个连续性目标如果目标跨度大宁可拆成多个会话。第二个坑是“AI自信地提供不存在的API”。这在模型训练数据截止日期之后更明显模型会依据自己熟悉的历史版本推测新版本API应该存在。某次我在项目里引入了一个较新的库AI在生成代码时直接使用了该库的API但实际运行时提示属性不存在。排查链路是先检查报错信息里API所在模块是否正确导入然后去查官方文档确认该API是否存在或是否有更名。确认是AI幻觉后我在提示词里明确加上“仅使用本项目requirements.txt中已声明版本的API如有不确定请先说明再动手”。这个约束加上之后这类问题明显减少。第三个坑是“让AI修Bug但它把身份从修理工变成了重写者”。面对一个问题AI经常不止修复目标行还会顺手“优化”周边的代码结构导致引入不必要的变更风险。我遇到的典型情况是让AI修复一个空指针异常结果它把整个类的构造函数重写了虽然空指针没了但序列化逻辑受到了影响。从那以后我在让AI修Bug时都会加一句“请采用最小化修改策略只改动与问题直接相关的代码不要重写无关部分”。并且要求AI在回复里列出所有改动文件的diff摘要方便我review。以上三种翻车模式共同指向一个核心技能对AI产出内容的审查能力比提问能力更重要。我在实战里摸索出一套快速审查流程现在一直在用。首先看改动范围任何包含意外文件的变更都要警惕其次看边界条件AI生成的代码里循环边界、默认值、异常分支是最容易出错的地方最后看依赖关系新引入的第三方库、新添加的全局状态都要在审查清单里单独打勾。这套审查流程也让我的AI协作可靠性上了一个台阶至少现在项目里不再频繁出现“跑的时候才发现的低级问题”。7. 给正在入门AI编程的人一份可复制的毕业清单走到这个阶段之前踩过的坑基本都变成了习惯。最后分享一份我现在会给团队新成员用的清单。它不是我拍脑袋想的而是从这段时间的实战里一点点打磨出来的按顺序做基本能避开大多数AI编程的新手陷阱。先说工具安装和配置层面先挑一个能和你的编辑器深度集成的工具无论选Copilot还是Cline或Continue第一周只练习两件事一是熟练地用自然语言描述任务二是学会给模型“看”最相关的文件上下文。很多人装了插件之后第一件事就是让它生成整个项目这反而会失败。我的经验是先做小任务比如“给这个函数增加类型注解”“补全这个单元测试的边界用例”让模型在一个窄范围内表现稳定。然后是提示词习惯层面从第一天就强制自己写出“带约束的自然语言”把需求描述拆成四段目标做什么、上下文在哪个文件、基于什么结构、约束不能引入什么、必须保持什么、验收方式怎么判断做对了。这套模板看起来繁琐但它是帮你建立AI协作肌肉记忆最快的方式。熟练之后可以缩短但在刚开始时宁可啰嗦也不要留白。再就是Skill沉淀层面每完成一个值得重复的任务问自己一句“这个流程我下次还会遇到吗”如果答案是会就花点时间把它整理成Skill或者项目指令。积累一段时间后你会发现自己在AI上的效率出现一次质的跃升——因为很多调试性、检索性的重复劳动已经被标准化掉了。最后是心态层面对AI编程保持“好用但不迷信”的态度。它确实能帮你节省大量体力劳动但项目的技术方向、架构取舍、质量底线仍然要由你来承担。建议每个项目开始前明确一个原则凡是AI生成的核心模块必须有独立测试覆盖凡是涉及资金、安全、数据完整性的逻辑必须做人工逐行评审。这不是对AI的不信任而是工程责任感的一部分。以上就是我从这一阶段AI编程实战里带走的绝大部分东西。代码会有更新迭代、工具名单会不断换血但这些围绕“人机协作边界”建立的判断方法和操作习惯应该还能用挺长一段时间也给正在这条路上摸索的朋友留一份还算靠谱的参照。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进