如果说 2024 年很多人还在把 AI 当成高级搜索框用,那么 2025 年我觉得最值得投入的一件事,是把 AI 当成一个真正的新同事来带。项目标题里的 Qoder,是我最近一直在用的 AI 编程助手;而“脚手架”这个词,恰好是训练一个数字同事最好的起点:范围小、约定明确、产物可见。这篇文章就来记录,我怎么把平时写 Java 后端的开发习惯——分层结构、统一返回、异常规范、日志要求——一条条“翻译”给 Qoder,然后从空目录开始,让它跟我协作搭出一个可运行的 Spring Boot 3.5 脚手架。
你可以把这篇文章理解成一份“带人记录”。我带的不是一个实习生,而是一个没有耐心、记忆不太长、但知识面异常广的新同事。它会一本正经地编代码,也会一本正经地犯错。怎么给它定岗位、立规矩、做验收,才是把“AI 编程”变成“AI 工程实践”的关键。如果你也用过各种 AI 编程插件,但总觉得产出的代码没法直接进仓库,那这篇文章大概率对你有用。
先说结论:Qoder 这类工具真正值钱的地方,不是帮你补全函数,而是它能承接一套长期有效的项目上下文。脚手架这种活儿,正好能把这个能力逼出来。下面我会把整个过程拆成六段:先是思路,再是方案选型,然后是“教”它的具体方法,再给一份完整的实操记录,最后是复盘和排错。干货都在后面,别急。
1. 先想明白:把 AI 当“数字同事”,而不是高级搜索框
1.1 为什么零散提问永远带不出合格的 AI 同事
很多人用 AI 写代码是这么个节奏:遇到一个报错,复制粘贴,问一句;要生成一个类,写个描述,让它输出;下个需求又开个新对话,什么上下文都不带。这样搞下去,AI 永远是个“记忆只有几秒钟的临时工”。你上午刚跟它约定的命名规范,下午它就忘了;你上个月踩过的坑,它下次照样踩。
我试过一段时间之后发现,问题不在 AI,而在我没有把它当成一个“有岗位、有职责、有绩效要求”的协作对象。代码编辑器只是它的工作台,真正决定产物质量的,是你给它提供的岗位说明、项目规则、验收标准。这也是“信息密度”的问题:AI 能接收的上下文有上限,你往里面塞的东西越具体,它产出的质量越高。零散提问就像你每天给一个员工布置随机任务,却从不告诉他公司流程是什么,他怎么可能干得好?
所以“教 AI 上班”的第一步,不是学怎么提问,而是想清楚:这个数字同事在我团队里,到底承担什么角色,需要遵守哪些约定,交付什么东西算合格。
1.2 “数字同事”模式的三个约定:岗位说明、交付标准、复盘机制
我自己最后沉淀出三个约定,适用于所有 AI 协作场景。
第一是岗位说明。对人来说,岗位说明书会写职责边界;对 AI 来说,岗位说明书就是一段长期指令,告诉它“你负责脚手架搭建,不要顺手写业务功能,不要引入没要求的依赖”。有了边界,AI 才不会满脑子发散。
第二是交付标准。每次让它干活之前,先写清楚“完成的标准是什么”。比如“编译通过、启动无报错、所有公共配置必须在 application.yml 中以注释说明用途”,这比“帮我搭一个项目”有效得多。AI 不知道什么叫“好”,它只知道你给它标的“好”。
第三是复盘机制。AI 写出来的代码必须过一遍人工 review,把发现的问题回填到项目规则文档里。这不是浪费时间,这是在给数字同事“积累工龄”。一条规则触发过一次事故,下次就不可能再犯。我用 Qoder 搭脚手架的时候,最大的收获不是代码本身,而是那几份被反复修订的规则文件,它们现在成了整个团队的“开发宪法”。
1.3 多 AI 协作:不是一个 Agent 干所有事
还有一个很流行的词叫“多 AI 协作”,实践下来我觉得它本质上是“把一个大任务拆给不同角色”。你让一个 Agent 既做架构设计又写代码又做审查,结果往往是样样通样样松。更实用的做法是规划、编码、审查各配一个角色:
- 规划 Agent:负责拆任务、定目录结构、列出依赖清单;
- 编码 Agent:负责按规划产代码,严格遵循规则文件;
- 审查 Agent:负责扫一遍安全风险、边界条件、重复代码。
这三个角色可以轮流让同一个 Qoder 对话承担,也可以拆成多个会话挂在不同的项目文档下。关键是角色不能混。我见过很多人让同一个对话又写需求又写实现又自夸,最后代码里全是幻觉。角色分开之后,AI 的输出会明显变得克制、专注。
2. 从零搭脚手架:要交付什么,先定验收标准
2.1 什么是一个“合格的脚手架”
脚手架这个东西,外行看着就是一堆模板代码,内行看的是它能不能沉淀一套团队级的开发约定。一个合格的脚手架至少要做到四件事:能一键跑起来、能统一常见技术栈的接入方式、能约束代码分层和命名、能带着监控和日志的插槽。
听起来简单,做起来全是细节。比如统一返回体,字段名到底是 code、msg、data 还是 success、message、result?不同项目各写各的,前后端联调的时候光对齐字段就耗时半天。再比如异常处理,是抛 RuntimeException 还是自定义 BizException?全局异常处理器要不要吞掉错误?这些都是脚手架要回答的问题。
所以把“开发习惯交给 Qoder”这句话落到实处的第一步,是先自己把习惯写出来。你脑子里那些潜规则,AI 猜不到。我在动手之前花了一个小时,写了一份 PROJECT_RULES.md,内容不长,但每一行都是硬约束。后面对话里我反复引用这份文件,Qoder 写出来的代码就非常“像我们团队的人写的”。
2.2 本次脚手架的技术选型与目录规划
这次搭的脚手架,我选的是 Java 21 + Spring Boot 3.5 + Maven 多模块单包结构。为什么用 Spring Boot 3.5?因为它是目前 Java 后端的主流版本,生态资料多,AI 训练语料里大量出现过,生成代码时不容易张冠李戴。
具体的目录规划是这样的:
springboot35-scaffold/ ├── pom.xml ├── PROJECT_RULES.md ├── README.md └── src/main/ ├── java/com/colleague/demo/ │ ├── DemoApplication.java │ ├── common/ │ │ ├── result/Result.java │ │ ├── result/ResultCode.java │ │ ├── exception/BizException.java │ │ └── exception/GlobalExceptionHandler.java │ ├── config/ │ │ ├── MybatisPlusConfig.java │ │ ├── RedisConfig.java │ │ └── WebMvcConfig.java │ └── module/ │ ├── controller/SampleController.java │ ├── service/SampleService.java │ ├── mapper/SampleMapper.java │ └── entity/SampleEntity.java └── resources/ ├── application.yml ├── application-dev.yml ├── application-prod.yml └── logback-spring.xml模块层面,我没有上 Spring Cloud 那套分布式全家桶,因为脚手架的第一版目标是把单体应用的底座打扎实。等业务真的需要拆分时,再以这个单体的模块边界为参考去拆服务,比一开始就铺一堆注册中心要踏实得多。
2.3 为什么选 Spring Boot 3.5 这类“无聊但可靠”的技术
每次聊技术选型,总有人想上最新最炫的框架。但脚手架的意义恰恰在于“无聊”:它要扛住所有业务项目的公共部分,任何激进设计都会被放大成事故。Spring Boot 3.5 的好处是三点:
- 版本语义清晰,官方维护周期长,升级路径明确;
- 生态组件(Redis、MyBatis-Plus、SpringDoc)都对齐了 Spring Boot 3.x 的版本号,依赖冲突少;
- AI 训练语料里这类项目的代码量极大,Qoder 生成出来的代码通常更贴近官方推荐写法。
另外我强调一下,选型文档本身也要交给 AI 读取。你把“为什么选这个”写进项目说明,它后面做技术判断时就会自动避开那些“看起来很酷但没生态”的方案。这比每次都在提示词里苦口婆心地劝它要有用得多。
3. 把开发习惯“翻译”给 Qoder:Skill、上下文与提示词
3.1 先写一份团队规范,再让 AI 写代码
Qoder 这类 AI 编程工具,本质上是一个“服从性很强但常识有限”的同事。它会非常认真地照着规则来,但前提是你把规则写到它看得见的地方。我最推荐的方式是项目根目录放一份 PROJECT_RULES.md,把以下内容写死:
- 包名规范:com.xxx.demo,全部小写;
- 分层规范:controller/service/mapper/entity 不能互相跨越调用;
- 命名规范:类名用 UpperCamelCase,变量用 lowerCamelCase,数据库字段用下划线;
- 返回规范:所有接口必须返回 Result ,禁止直接返回裸对象;
- 异常规范:业务错误抛 BizException,禁止用异常做流程控制。
这份文件不需要多文采,最重要的是可执行、无歧义。你甚至可以把它当成一份“接口级的人事制度”。我第一次把 PROJECT_RULES.md 放进项目,然后让 Qoder 照着生成代码时,它生成的类名、注释风格、返回类型全都对上了,连注释里“描述不清”的废话都少了很多。
3.2 Skill 不是越多越好:按岗位配,而不是按玩具配
网上搜索“qoder做科研要装什么 skill”这类热词的人,其实混淆了一个概念:Skill 是给特定工作场景配的专业能力包,不是越多越厉害。如果项目是 Java 后端脚手架,装一堆 PPT 生成、文案写作、论文润色的 Skill,反而会让模型在生成代码时带上无关的表达习惯。
科研场景确实需要额外 Skill,但那是另一条赛道:文献检索、数据统计分析、论文格式,这些和“Java 后端开发脚手架”是两个岗位。我给自己的建议是:一个项目会话里挂的 Skill 不超过三个,且必须跟当前任务强相关。宁可让 AI 在一个方向偏执一点,也不要让它变成一个“什么都会一点但什么都干不深”的通才。
3.3 一套可以复用的三段式提示词
我最后沉淀出一个万能的提示词模板,叫“背景 + 约束 + 产出”。所有的复杂需求,都可以压进这三段里:
【背景】 我们在搭建 Spring Boot 3.5 脚手架,团队规范见 PROJECT_RULES.md。 项目已经存在,目前是空 Maven 工程。 【约束】 - 不要引入未要求的依赖; - controller 类只负责参数校验和结果包装; - 统一返回体必须使用 common.result.Result; - 数据库涉及 mybatis-plus,配置类需要单独放 config 包。 【产出】 列出本次需要创建/修改的文件清单,并逐个给出完整代码。 文件头部用注释说明用途和依赖关系。这比“帮我搭个项目”强在哪里?强在把“怎么做”的大部分决策权交给了规则文件,而“是什么”由你牢牢把控。AI 的能力上限由模型决定,但它的质量下限由提示词决定。这个模板用顺手之后,你会发现 Qoder 的返工率大幅下降——它不会再凭想象力给你引入一个冷门工具库。
3.4 让 Qoder 记住整个项目的约定
对话式 AI 最大的痛点是上下文丢失。每个新会话都像来了个新实习生,前面教的全白费。解决办法有两个层面。
第一层,把规则落到项目文件里,比如 AGENTS.md 或 PROJECT_RULES.md。Qoder 每次读取项目文件时,这些规则会重新进入它的上下文,相当于数字同事每天上班先读一遍员工手册。
第二层,把自己反复强调的口头约定也写进文件。比如我习惯“工具类禁止放在 controller 包里”“DTO 转换必须写在 service 层”。这些偏好一次写清,后面每一个新会话都自动继承。坚持两周之后,你会发现 Qoder 写的代码几乎不需要改命名风格,这就是“数字同事”养成的标志。
4. 实操记录:从空目录到可运行的 Spring Boot 3.5 脚手架
4.1 初始化工程:让 AI 先生成骨架
我建议不要真的从“空目录”开始让 AI 手搓一切。更可靠的做法是先拉一个官方骨架,再让 Qoder 在骨架上做裁剪。Spring Initializr 生成的项目虽然简单,但 Maven 坐标、主类、配置文件这些基础设施都是官方的,能省很多排查依赖的时间。
实际操作是这样的:
# 用 Spring Initializr 生成基础工程,语言选 Java,Spring Boot 版本选 3.5.x curl -G https://start.spring.io/starter.zip \ -d dependencies=web,validation,lombok \ -d groupId=com.colleague \ -d artifactId=demo \ -d name=scaffold \ -d packageName=com.colleague.demo \ -d javaVersion=21 \ -o scaffold.zip unzip scaffold.zip -d springboot35-scaffold然后把 PROJECT_RULES.md 和 README.md 放进项目根目录,打开 Qoder,把项目目录加载进去,第一句话我会这样写:“这是一个 Spring Boot 3.5 的空骨架,接下来我们要按项目规则补齐脚手架模块。先阅读根目录下的 PROJECT_RULES.md,然后列出你的实施计划,不要急着写代码。”
注意这个顺序:先让它读规则、列计划,再动手。AI 和人一样,一上来就写代码往往会把布局搞乱。等它给出计划之后,我会逐条批注,比如“config 包我觉得还应该加一个异步线程池配置”,然后再让它开始。这一步做好之后,后面基本是推进式执行。
4.2 统一返回体与全局异常处理:第一道“习惯约束”
脚手架的地基之一,是统一返回体和全局异常处理。这块代码量不大,但特别能检验 Qoder 有没有读规则。
我先给了它一个返回体的明确要求:字段包含 code、message、data;提供 success/fail 静态方法;业务异常用 BizException 承载。Qoder 生成代码的过程没什么波澜,生成完之后我会自己做终端级 review。这里提醒一句:AI 写的枚举类经常会出现注释缺失、魔法数字残留的问题,比如 ResultCode 里如果写一个 “20001 参数错误” 但不说清楚是给谁看的,后面所有人都会懵。所以我额外让它把所有枚举值的业务含义写进注释,并且附一个使用示例到 README 里。
全局异常处理也是重灾区。Qoder 默认生成的代码往往只处理了 Exception 和 RuntimeException,漏掉了参数校验异常 MethodArgumentNotValidException、路径参数类型异常 MethodArgumentTypeMismatchException。我会在 review 时补上这些 Handler,再让 Qoder 把规则写进异常规范文档,防止下次再漏。
4.3 日志与多环境配置:把可观测性写进地基
脚手架没有日志规范,后面线上排查问题就是灾难。我让 Qoder 生成 logback-spring.xml,并且明确要求:控制台输出带彩色、文件按天滚动、保留 30 天、ERROR 级别单独落文件。这一段它生成得比较快,但我发现它默认会把日志目录写成一个不存在的绝对路径,比如/var/logs/xxx,本地一启动就满屏报错。
解决办法是让日志目录用配置变量LOG_PATH注入,并在 application.yml 里给默认值./logs。这个细节我们团队踩过很多次,属于典型的“本地环境与部署环境不一致”的坑。让 AI 第一次就注意这些不现实,但通过一次踩坑把规则写进文档,后面所有项目的日志配置都能一次通过。
多环境配置方面,我要求拆成 application-dev.yml 和 application-prod.yml,公共配置留在 application.yml。同时给 Qoder 加了一条规则:所有环境配置必须带 profile 注释,禁止把数据库密码直接写在配置注释里。它严格执行了,但我也留了个心眼,在 review 时确认它没有把任何假数据库连接串写进 dev 配置。
4.4 数据库、Redis、JWT:集成第三方依赖的关键检查点
脚手架要接 MyBatis-Plus、Redis、JWT 三件套。这一阶段是 Qoder 最容易出“幻觉”的时候,因为它会非常自然地给你编出一些不存在的配置项。最典型的是:
- Redis 配置类自定义了 RedisTemplate,但序列化器设置混乱,key 和 value 的序列化器不匹配;
- JWT 工具类引用了一堆旧版本的依赖,比如
io.jsonwebtoken:jjwt只引入了 root,没有引入 impl 和 jackson; - MyBatis-Plus 的分页插件配置注册成了 Bean,但忘记在 MapperScan 上扫包地址。
我的处理策略是分三步走。第一步,让 Qoder 基于官方文档生成配置类;第二步,我自己把关键 Bean 的类型、依赖坐标、方法名检查一遍;第三步,把这三个集成方案分别写进 README 的“模块接入指南”里。这样以后任何一个新同事(包括未来的我)拿到脚手架,都不用重新查文档。
4.5 收尾验收:编译、冒烟、代码走查
最后一个环节是验收。我会做四件事:
- 跑
mvn clean compile,确认没有编译错误; - 跑
mvn test,确保示例测试类能通过; - 启动应用,访问一个示例接口,确认统一返回体生效,异常处理器生效;
- 把所有 AI 生成的代码过一遍走查,把不合规处提给 Qoder 修改。
这里我特别想强调第四步。AI 生成的代码“能跑”和“能上线”完全是两回事。它在单元测试里一般表现良好,但到了走查环节,你经常能发现:接口没有校验参数边界、错误日志用e.printStackTrace()、关闭资源的 try-with-resources 没用、公共方法缺少注释。这些问题不会让代码在本地炸掉,但会让 review 的人血压升高。把每次走查发现的问题都回填到规则文件里,是让数字同事下个项目表现更好的唯一路径。
5. AI 生成的代码,到底能不能直接用:复盘与避坑
5.1 能跑的代码不等于能用的代码:三个审查维度
我总结了一套快速审查三维度,几乎可以用在每一个 AI 产出的文件上。
第一个维度是依赖审视。这个文件是不是真的需要这个依赖?Qoder 特别喜欢“顺手”引入一个工具库来解决本来 3 行代码能解决的事。比如为了一个空字符串判断,引入StringUtils的某个冷门包,这种习惯要第一时间按住。
第二个维度是边界审视。参数为空、列表为 null、并发重复请求,这些边界 AI 大概率不会主动处理。你需要在提示词里强制加一条“所有方法必须处理 null 输入和空集合”,并在 review 时逐方法看。
第三个维度是安全审视。SQL 拼接、反射调用、文件路径拼接,这些都是 AI 幻觉的高发地。哪怕只是脚手架,我也建议在规则里写明“禁止拼接 SQL,必须使用 MyBatis-Plus 的条件构造器”。
5.2 高发问题的“幻觉现场”实录
说几个我这次实操里真实遇到的 AI 幻觉,给你提个醒。
第一,版本幻觉。Qoder 生成 pom 时,把一个 MyBatis-Plus 的版本号写成了3.5.3.1,但这个版本跟 Spring Boot 3.5 的依赖解析有冲突,编译直接报错。解决方案是让 AI 在 pom 里统一用属性变量mybatis-plus.version,并限定从官方 Maven 仓库读取版本范围。
第二,API 幻觉。它生成 JWT 工具类时用了一个setClaims方法,实际对应版本的 jjwt 里已经改成了claims()。这类问题很隐蔽,因为代码语法是正确的,只是运行时报错。我的应对办法是让 Qoder 在每个第三方库的配置类里写上“参考官方文档的版本是 X”,review 的时候能快速对照。
第三,重复代码幻觉。生成多个模块时,它把同一个工具类复制粘贴了三遍,放在不同包下。这不算错,但对工程是灾难。后来我加了一条规则:公共类必须放在 common 包,同文件内容出现两份即视为缺陷。
5.3 多 AI 分工实战:规划、编码、审查各司其职
回到多 AI 协作。我在这次脚手架搭建里实际开了三个 Qoder 会话,每个会话挂不同的角色设定。
第一个会话叫“架构师”,负责读 PROJECT_RULES.md,输出完整的目录与依赖计划;第二个会话叫“工程师”,只按计划产代码,不接受它新增设计;第三个会话叫“审计师”,专门扫描前两个会话的产物,输出一份“问题清单”。我会把审计师的报告直接丢回工程师会话,让它逐条整改。
这里有个实操技巧:会话之间不共享上下文,所以我会把规划结果、规则文件、产物清单手动塞给下一个会话,顺便在开头注明“这是上一轮的结果,你的职责只有 A,不要做 B”。多 AI 协作成功的关键不是工具本身多智能,而是你把每个会话的边界切得足够干净。
5.4 一些配套的工程护栏
除了规则文件和角色分工,我还会在工程层面加几道护栏:
- 用 Git 做每个阶段的独立提交,AI 改出问题可以快速回退;
- 所有 AI 生成的代码合并前,必须过一遍
mvn verify和差异检查; - 把 PROJECT_RULES.md 放进代码评审模板里,作为新代码的“对照表”。
护栏不是限制 AI,而是限制我自己“偷懒不看代码”的冲动。我发现最容易出事的阶段,恰恰是 AI 表现好的阶段——它连续几轮输出正确,你就放松警惕,结果它在某个配置文件里埋了一个生产环境的坑。所以我现在给自己立了死规矩:AI 生成的每一行进仓库的代码,都必须经过一次人肉阅读。
6. 常见问题速查与排障心得
6.1 上下文放不下 / 记不住约定怎么办
这是问得最多的问题:规则文件很长,新会话打开后 AI 好像又忘了。我的办法是分层投喂,而不是一次性把整个仓库塞进提示词。
核心规则放 PROJECT_RULES.md,每次必读;具体模块的说明放各自包的 README.md,AI 只在这个模块相关任务时读取;一次性任务的细节放在对话里。这样相当于给数字同事分了三本手册:员工手册、部门手册、便签纸。
6.2 AI 开始“好心办坏事”乱改代码怎么办
Qoder 有时候会在你让它改一个 bug 时,顺手重构了无关代码。这很让人抓狂。我的经验是给它的任务加一行“只修改与问题相关的文件,禁止改动其他业务逻辑”。如果它还乱来,我就用 Git diff 把它这次会话的所有改动过一遍,非预期的直接用 checkout 回退。
6.3 科研场景要不要装 Skill(给非 Java 同行的参考)
如果你的场景不是 Java 开发,而是科研,比如数据分析或者论文,那么 Skill 的选择逻辑是一样的:按“岗位”配。科研场景通常需要文献管理、统计建模、学术写作三类能力。与其装一堆泛泛而谈的“科研助手”,不如把三个 Skill 明确拆开:一个负责找和读文献,一个负责跑分析脚本,一个负责把结果写成符合期刊格式的段落。跟写代码一样,角色越纯,产出越靠谱。
6.4 给同样想带数字同事的人几个实在建议
第一,别怕它犯错,怕的是你不给它纠错的机会。每犯一次错,就补一条规则,这是最划算的投资。
第二,提示词写得具体,代码才写得先锋。你以为 AI 知道你的“品味”,它其实只知道你写的“要求”。
第三,定期把对话记录里反复讲解的内容整理进文档。我带 Qoder 搭完这个脚手架之后,最大的产出不是几 MB 的代码,而是那个越来越像“团队手册”的规则库。
我在实际带 Qoder 的过程中最深的体会是:数字同事的成长速度,不取决于模型多聪明,取决于你多愿意把自己的“直觉”说明白。把代码规范写下来、把验收标准写下来、把踩过的坑写下来,它就会一年比一年好用。搭脚手架只是一个开始,等这套习惯养成之后,你可以把同样的方法论交给它去处理迁移、重构、代码评审,让它真正从一个“代码生成器”,变成一个“靠谱的同事”。