1. 从校招入职到AI Coding工作流的起点
1.1 为什么我要把AI塞进整条开发链路
刚入职那会儿,我跟大多数校招生一样,对“AI Coding”这四个字的理解停留在“让模型帮我补全几行代码”。用了一段时间才发现,这种用法太浅了。真正让我效率翻倍的转折点,是我开始把AI当成一个贯穿需求理解、方案设计、编码实现、调试排查、代码审查全流程的协作对象,而不是一个高级一点的自动补全插件。
这个转变背后的逻辑其实很朴素:写代码这件事,真正耗时间的从来不是敲键盘,而是想清楚要写什么、为什么这么写、写完对不对。AI在“敲键盘”这一环已经很强了,但如果只让它干这个,等于把一台挖掘机当铲子用。我后来做的事情,是把整条开发流程拆开,看每个环节AI能承担什么角色,然后用一套稳定的工作流把它们串起来。
这套工作流的核心关键词有三个:IDE内的即时协作、Coding Agent式的任务托管、以及Context Engineering(上下文工程)。前两个决定了AI在哪个层面介入,第三个决定了AI介入的质量上限。很多人抱怨AI写的代码不能用,十有八九不是模型不行,而是你喂给它的上下文太烂。
1.2 这套工作流适合谁,不适合谁
先说适合的人。如果你每天要写业务代码、要读别人的代码、要排查线上问题、要写技术方案,这套流程基本可以直接抄。尤其是刚入职一两年的同学,你会发现它最大的价值不是让你少写代码,而是让你更快理解一个陌生系统、更快定位问题、更快产出可评审的方案。
不太适合的场景也得说清楚。如果你的工作主要是探索性的算法研究、需要大量试错的底层系统调优,AI能帮的忙相对有限,因为这类工作的上下文很难用文字完整描述,模型拿不到足够的信号。另外,如果你的团队对代码外传有严格限制,那本地模型或者私有部署的方案会更合适,这个后面会提。
我自己的情况是后端业务开发为主,日常在IDE里泡着,所以整套流程是围绕IDE和命令行工具搭建的。下面按环节拆开讲。
2. 核心思路拆解:AI在开发流程里到底站哪个位置
2.1 三个层次的AI介入方式
我把AI在开发中的介入分成三层,这个分层是我踩了不少坑之后总结出来的,理解了它,你就知道什么时候该用哪种方式。
第一层是行内补全。就是你在IDE里敲代码,AI根据当前文件和光标位置实时给建议。这一层的特点是快、无感、上下文窄。适合写重复性代码、样板代码、简单的逻辑分支。它的天花板很低,因为模型只看得到当前文件的一小部分,稍微复杂一点的业务逻辑它就抓瞎了。
第二层是对话式协作。你在IDE的侧边栏或者独立窗口里跟AI聊,把相关代码贴给它,让它解释、重构、写测试、找bug。这一层的特点是上下文可控、交互灵活。适合理解陌生代码、设计单个模块、排查具体问题。它的瓶颈在于你得手动喂上下文,喂得不好结果就不好。
第三层是Agent式托管。你给AI一个任务描述,它自己去读文件、改代码、跑命令、看结果、再调整,直到任务完成。这一层的特点是自动化程度高、能处理多文件改动。适合批量重构、跨模块的功能实现、自动化修复。它的风险在于你得盯着,不然它可能改出一堆你不想看到的东西。
我的工作流不是三选一,而是根据任务类型在三层之间切换。简单改动走第一层,理解和小范围实现走第二层,大范围机械性改动走第三层。
2.2 Context Engineering为什么是成败关键
这个词听起来玄乎,说白了就是:你怎么把AI需要知道的信息,以它能理解的方式喂给它。这件事做得好不好,直接决定AI输出质量的天花板。
我举个真实例子。有一次我让AI帮我写一个订单状态流转的函数,第一次我只贴了函数签名和一句“实现订单状态流转”。它给我的代码逻辑上没错,但状态枚举用的是它自己编的字符串,跟我们项目里的枚举完全对不上。第二次我做了三件事:把项目里的状态枚举定义贴进去、把相关的状态机配置贴进去、把两个已有的类似函数作为参考贴进去。这次它给的代码基本可以直接用。
差别在哪?第一次我给的是“意图”,第二次我给的是“意图+约束+范例”。这就是Context Engineering的核心:意图让AI知道要干什么,约束让AI知道不能干什么,范例让AI知道该长什么样。
具体到操作上,我养成了几个习惯。第一,任何涉及项目特定概念的任务,先把相关定义文件的内容带上。第二,让AI写新函数时,先找一个已有的类似函数作为模板。第三,涉及配置和约定的,把配置文件的关键片段贴进去。这三件事花不了几分钟,但能把返工率降一大半。
2.3 工具选型的取舍逻辑
工具这块我不推荐具体产品,因为变化太快,今天好用的明天可能就换了。我说说选型的判断标准,你自己套。
IDE内的AI助手,我看三点:补全延迟、上下文感知范围、是否支持自定义指令。补全延迟超过几百毫秒就会打断心流,这个必须实测。上下文感知范围决定了它能不能理解跨文件的引用关系。自定义指令决定了你能不能把团队的编码规范固化进去,让AI默认遵守。
命令行Agent工具,我看四点:能否读写文件、能否执行命令并读取输出、任务拆解的粒度、出错后的自我修正能力。前两点是基础,没有这两点它就是个聊天机器人。后两点决定了它能不能处理稍微复杂一点的任务。
还有一个容易被忽略的点:模型的选择。同一个工具背后可以接不同的模型,不同模型在代码任务上的表现差异很大。我的经验是,涉及复杂逻辑推理的任务用推理能力强的模型,涉及大量代码改写的任务用代码专项模型,涉及快速补全的用轻量模型。别一个模型用到底。
3. 核心环节实操:从需求到提交的完整流程
3.1 需求理解阶段:让AI帮你把模糊需求变清晰
校招生最容易犯的错,是拿到需求就开始写代码。我现在拿到一个需求,第一步不是打开编辑器,而是把需求描述丢给AI,让它帮我做三件事:列出这个需求涉及的所有改动点、指出描述里模糊或者矛盾的地方、给出需要确认的问题清单。
这个操作的价值在于,它逼着你在动手之前把问题想清楚。AI列出的改动点不一定全对,但能帮你建立一个初步的全局观。它指出的模糊点往往是你自己读需求时忽略的。它给出的问题清单,你可以直接拿去跟产品或者导师确认。
我实际用下来,这一步能省掉后面大量的返工。有一次一个需求描述里说“订单超时后自动取消”,AI直接问我:超时的判定标准是什么?取消后库存怎么处理?已支付的订单要不要退款?这三个问题我拿去问产品,果然产品自己也没想清楚,当场补了规则。如果我直接开写,写完发现规则不对,那才是真的浪费时间。
这一步的Context Engineering要点是:把需求的原始描述完整贴进去,不要自己概括。因为你的概括可能已经丢掉了关键信息。同时把相关的业务背景简单说一下,比如这个需求属于哪个模块、影响哪些下游。
3.2 方案设计阶段:用AI做方案的第一轮评审
需求清楚之后,我会自己先想一个方案,然后把方案描述给AI,让它扮演一个挑剔的评审者,专门找方案的漏洞。这个用法比让AI直接给方案更有价值,因为AI直接给的方案往往太通用,而你自己想的方案更贴合项目实际,让AI来挑刺正好互补。
我通常会让AI从这几个角度评审:边界条件有没有考虑全、异常情况怎么处理、对现有代码的侵入性大不大、有没有更简单的实现方式。这四个角度基本覆盖了方案评审的主要关注点。
举个例子,我之前设计一个异步任务的重试机制,自己想的方案是用消息队列加定时扫描。AI评审时指出:如果任务本身是幂等的,其实不需要消息队列,直接在数据库里标记状态加定时扫描就够了,能省掉一个中间件依赖。这个建议我采纳了,方案确实简化了不少。
这一步的Context Engineering要点是:把你的方案写得足够具体,包括数据结构、接口定义、关键流程。同时把现有的相关代码结构告诉AI,让它知道你的方案要嵌进什么样的系统里。
3.3 编码实现阶段:分层使用AI的具体操作
到了写代码这一步,我按任务复杂度分三种打法。
简单任务直接行内补全。比如写一个getter、一个简单的工具函数、一个CRUD接口。这种任务我基本不跟AI对话,就靠行内补全,敲几个字符它就给建议,对了就Tab接受,不对就继续敲。这个阶段的关键是别停下来跟AI较劲,它给的建议不对就直接忽略,保持心流。
中等任务用对话式协作。比如实现一个业务逻辑稍微复杂的service方法。我会先把相关的实体类、已有的类似方法、这次要实现的逻辑描述一起贴给AI,让它给出实现。拿到实现后我不直接复制,而是先读一遍,确认逻辑对、命名符合规范、异常处理到位,然后再粘贴进去做微调。这个“先读再粘”的习惯很重要,能避免你把AI的错误逻辑直接带进代码库。
大范围机械改动用Agent托管。比如要把某个字段名从A改成B,涉及几十个文件;或者要给一批接口统一加上参数校验。这种任务人做起来枯燥且容易漏,交给Agent正合适。我的操作是:先在一个小范围试跑,确认Agent的改动符合预期,再放开到全量。跑完之后一定要用git diff仔细看一遍改动,Agent偶尔会改到不该改的地方。
这一步的Context Engineering要点,对话式协作时最关键。我的经验是,贴给AI的代码要满足三个条件:完整(不要贴半截函数)、相关(只贴跟当前任务有关的)、有序(按依赖关系排列,先定义后使用)。做到这三点,AI的输出质量会明显提升。
3.4 调试排查阶段:把报错信息变成AI能吃的输入
调试是AI能帮大忙的环节,但很多人用不好,原因是给AI的信息太少。只贴一句报错信息,AI只能猜。我的做法是给AI一个完整的“现场包”,包括:完整的报错堆栈、触发报错的请求参数或输入、相关的代码片段、你期望的行为和实际行为的差异。
这四样东西给全了,AI定位问题的准确率会高很多。我实测下来,大部分常见的空指针、类型转换、边界条件问题,AI都能直接指出问题所在。
还有一个技巧:让AI帮你写排查脚本。比如你怀疑是数据问题,可以让AI写一段查询语句或者一段临时代码来验证你的猜想。这比你自己一点点试要快得多。
这一步的Context Engineering要点是:报错信息要完整,不要截断。堆栈信息里往往藏着关键线索,截断了AI就看不到了。相关的代码要贴够,特别是报错行往上几层的调用链。
3.5 代码审查阶段:让AI做提交前的第一道关
我养成了一个习惯,每次提交代码之前,把git diff的内容丢给AI,让它做一轮审查。审查的角度我固定为几个:有没有明显的逻辑错误、有没有遗漏的异常处理、命名和注释是否清晰、有没有可以简化的地方、有没有潜在的性能问题。
这个习惯帮我拦下了不少低级错误。有一次我写了一个循环里查数据库的代码,自己没意识到,AI审查时直接指出这是N+1查询,建议改成批量查询。这种问题在review时被同事指出来挺尴尬的,自己提前发现就避免了。
AI审查不能替代人工review,但它能帮你把那些明显的、机械性的问题先过滤掉,让你的同事只需要关注真正需要人判断的设计问题。这既是对同事时间的尊重,也是对自己代码质量的负责。
这一步的Context Engineering要点是:git diff要完整,不要只贴改动的文件列表。同时把这次改动的目的简单说一下,让AI知道你在做什么,它才能判断你的改动是否达成了目的。
4. 常见问题与排查技巧实录
4.1 AI给的代码跑不通怎么办
这是最常见的问题,我按排查顺序列一下我的处理流程。
第一步,看报错信息。AI给的代码跑不通,报错信息通常很明确。先看是编译错误还是运行时错误。编译错误一般是语法或者类型问题,运行时错误一般是逻辑或者空值问题。
第二步,检查AI是否用了不存在的API。这是高频问题,AI有时候会“幻觉”出一些看起来合理但实际不存在的方法或参数。遇到这种情况,把相关的类或接口定义贴给AI,让它基于真实定义重新生成。
第三步,检查上下文是否给全。如果AI的代码逻辑上没错但就是跑不通,很可能是它不知道某个项目特定的约定。比如它不知道你的项目里某个字段是可空的,或者不知道某个方法会抛异常。把相关的约定补充给它。
第四步,缩小问题范围。如果以上都不行,把AI给的代码拆成几段,逐段验证,定位到具体哪一段有问题,再针对那一段跟AI讨论。
4.2 AI改代码改出问题怎么回滚
用Agent托管任务时,最怕的是它改了一堆文件,你发现改错了。我的做法是:每次让Agent干活之前,先确保工作区是干净的,也就是没有未提交的改动。这样一旦Agent改出问题,直接git checkout .就能全部回滚,不会误伤你自己的改动。
另外,我习惯让Agent分批次改,不要一次性给它一个巨大的任务。比如要改50个文件,我会先让它改5个,我检查没问题,再让它改下一批。这样即使出问题,影响范围也可控。
还有一个技巧:让Agent在改之前先列出它打算改哪些文件、每个文件改什么。你看过这个清单确认没问题,再让它动手。这个“先计划后执行”的模式能避免很多意外。
4.3 上下文太长导致AI“失忆”怎么办
跟AI对话久了,上下文会越来越长,AI会开始忘记前面说过的内容,或者抓不住重点。我的处理方式有三个。
第一,主动做上下文压缩。当对话进行到一定长度,我会让AI把当前的任务状态、已确认的结论、待解决的问题总结一下,然后开一个新对话,把这个总结作为起点。这样既保留了关键信息,又清空了冗余内容。
第二,把关键信息固化到文件里。如果某个约定或者设计决策很重要,我会把它写进项目的文档或者注释里,而不是只留在对话记录里。这样即使换了对话,AI读文件也能拿到这些信息。
第三,分而治之。一个大任务拆成几个小任务,每个小任务用独立的对话处理。这样每个对话的上下文都是聚焦的,AI的表现会更稳定。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查动作 |
|---|---|---|
| AI代码编译不过 | 用了不存在的API或类型 | 贴相关类定义,让它基于真实定义重写 |
| AI代码逻辑对但跑不通 | 缺少项目特定约定 | 补充相关配置和约定信息 |
| Agent改乱了文件 | 任务粒度过大或工作区不干净 | 回滚后拆小任务,确保工作区干净再执行 |
| AI开始胡言乱语 | 上下文过长或矛盾 | 压缩上下文,开新对话,固化关键信息到文件 |
| AI给的方案太通用 | 没给项目背景 | 补充现有代码结构和业务背景 |
| 补全建议总是不对 | 上下文感知范围不够 | 检查工具配置,或改用对话式协作 |
4.5 几个我踩过的坑
第一个坑:过度信任AI的命名。AI起的变量名和函数名有时候跟项目风格不一致,我早期直接用了,结果review时被指出命名不规范。后来我养成了习惯,AI给的代码粘贴之前先把命名过一遍,不符合项目规范的自己改掉。
第二个坑:让AI写注释。AI写的注释有时候是废话,比如// 设置name为name这种。我现在的做法是,注释自己写,只让AI写代码。因为注释是给人看的,需要传达的是意图和背景,这个AI很难写好。
第三个坑:在AI对话里贴敏感信息。这个不用多说,涉及密钥、用户数据、内部地址的内容,绝对不要贴给外部AI。需要AI帮忙处理这类代码时,把敏感部分替换成占位符。
第四个坑:完全依赖AI不做验证。AI给的代码,哪怕看起来再对,也要跑一遍测试。我见过太多次AI代码逻辑上看起来没问题,实际跑起来边界条件就崩了。测试是最后的防线,不能省。
5. 把工作流固化下来的几个实践
5.1 建立自己的提示词模板库
用AI用久了,你会发现很多任务是重复的。比如每次写新接口都要让AI生成一套CRUD,每次排查问题都要给AI同样的背景信息。这些重复的部分,我把它固化成了模板。
我的模板库分几类:代码生成模板(比如生成一个标准的service方法)、代码审查模板(固定的审查角度)、问题排查模板(固定的现场包格式)、方案评审模板(固定的评审角度)。用的时候把变量填进去就行,省去了每次重新组织语言的时间。
模板不用写得很复杂,关键是把你每次都要说的那些话固定下来。比如我的代码审查模板就是一句话:“请从逻辑正确性、异常处理、命名规范、可简化点、性能问题五个角度审查以下diff”,然后附上diff内容。
5.2 把项目约定写进AI能读到的地方
AI不了解你的项目,这是天然的劣势。但你可以通过把项目约定写进代码注释、README、或者专门的AI指令文件里,让AI在读取上下文时自然获取这些信息。
我做的事情包括:在项目根目录放一个约定文件,写明代码风格、命名规范、常用工具类的位置;在关键模块的入口文件里写清楚这个模块的职责和边界;在容易出错的函数上写清楚注意事项。这些内容本来是写给新人的,现在也顺便写给了AI。
这个投入是一次性的,但收益是持续的。AI读到了这些约定,生成的代码就更贴合项目实际,你返工的次数就少了。
5.3 定期回顾AI的使用效果
我每个月会花半小时回顾一下这个月AI帮我做了什么、哪些任务AI表现好、哪些任务AI表现差、我的使用方式有没有可以改进的地方。这个习惯让我不断调整自己的工作流,把AI用在它擅长的地方,不擅长的部分就自己来。
比如我发现自己让AI写单元测试的效果一直不好,它写的测试要么太浅要么太偏。后来我改成自己写测试,让AI帮我检查测试覆盖了哪些边界条件,效果好多了。这就是通过回顾找到的调整点。
5.4 保持对AI输出的判断力
最后说一个最重要的心得:AI是工具,判断力是你的。AI可以帮你写代码、找问题、提建议,但最终决定用不用、怎么用的,是你自己。我见过一些同学,AI说什么就是什么,结果代码质量反而下降了。
保持判断力的具体做法是:AI给的每一段代码,你都要能解释它为什么这么写。解释不了,就去搞清楚,或者不用。这个习惯短期看会慢一点,但长期看,你的能力在增长,而不是在退化。
我在实际使用中发现,把AI接入开发流程最大的价值,不是让我写代码更快了,而是让我有更多时间花在真正需要思考的地方——需求的理解、方案的设计、质量的把控。这些才是开发工作中真正有价值的部分,也是AI暂时替代不了的部分。把机械性的工作交给AI,把判断性的工作留给自己,这个分工我觉得是当下最合理的。