1. 教 AI 上班:带出我的数字同事 —— 把开发习惯交给 Qoder,从零搭脚手架
「教 AI 上班」系列 · 第 1 篇:先说清我要什么,再让它教我怎么提问、照我的风格把架子搭起来。
前言
我想要的数字同事很简单:按我定好的技术选型,老实把具体业务代码写完、把 bug 改掉,别自己换架构。它只管代码生成器之外那部分,外围的 harness、openspec、superpowers 还是得靠 AI 来规范。
一开始我也说不清要做成啥样,就把需求一句一句交给 Qoder:先让它给思路、把范围收到后端,再照 ivy-simple-api 的风格从零搭起一套架子。它漏了就补、跑偏了就逼它改,改对了再把踩的坑记回 spec,反复几轮,直到它能脱离参考源码自己生成。
先交个底:这是一套完整的项目,不是搭个空架子就收——从按我的开发方式把业务代码写出来、改 bug,到测试,再到本地部署,这一路我都会讲到。
一、终极要求
1.1 数字同事负责哪一段活
我想做一个简单的数字同事,他能按照我的开发方式进行开发。
他主要任务是,正常的业务开发和修改bug,按开发文档进行开发。简单说就是按我选定好的技术选型,认真的完成具体的开发任务。
1.2 从数据库设计到代码生成器
我开发的习惯是,先讲简单的CRUD这种。
先用Pdman进行数据库设计,我也将ivy-simple.pdman.json放在services里面,要迁移或修改,你看着办。
然后手动创建数据库,结合代码生成器生成controller,service,dao,entity等代码,详见ivy-simple-api。
代码生成器这一块就按SKILL直接生成,数字同事的工作是生成的代码之外的,按我的开发方式编写具体业务代码。
我做了很多封装,所以生成的代码相当简单,我想的是不同的公司或项目,要先能创建所有的源码,只有微服务才会通过oss,maven来引用cores,这时才需要oss。
大部分技术选型都按ivy-simple-api来,未完成的,可以按同样风格补充。
这是我的总体需求。最终结果是能按SKILL生成可执行代码。结合 harness,openspec,请指导我一步一步完成所有操作。
而开发的外围 harness,openspec,superpowers这些还是要的,这个数字同事,只是负责具体代码开发,其他的还是要AI来规范,如果后期我修改了具体的技术实现方案,也可以同时升级数字同事。
是以skill方式还是其他方式,也可以讨论一下。
二、怎么和Qoder提问
2.1 从模糊需求收到后端起步
2.1.1 先甩模糊需求要思路
一开始我也不知道要做成啥样,就把这堆模糊需求直接甩给它,让它结合 harness、openspec、superpowers 先给思路:
我想编写一个数字同事项目,我也不知道是编写成什么样的。
我的要求是
他能按照我的开发方式进行开发。
他主要任务是,正常的业务开发和修改bug,按开发文档进行开发。
简单说就是按我选定好的技术选型,认真的完成具体的开发任务。
我的编写方式我会结出源码。
结合harness openspec superpowers ,请先指导我该怎么做。
2.1.2 把范围收到后端起步
聊了几轮,我把范围收到后端,让它先按我的习惯从数据库设计和代码生成器起步:
这个同事先做后端部分,结合业务开发文档,先用Pdman进行数据库设计
我也将ivy-simple.pdman.json放在当前目录下\里,有默认带过来的字段,以及字段类型,所有id都是String类型。
然后手动创建数据库,结合代码生成器生成controller,service,dao,entity等代码,详见ivy-simple-api。
先通过RepoWiki分析和学习我的ivy-simple-api。
代码生成器是以前我写的,现在就不需要了,你也要将这些按需求生成,是生成SKILL还是其他方式,结合Qoder来定。
数字同事的工作是生成的代码之外的,按我的开发方式编写具体业务代码。
我做了很多封装,所以生成的代码相当简单,我想的是不同的公司或项目,
要先能创建所有的源码,只有微服务才会通过oss,maven来引用cores,这时才需要oss。
大部分技术选型都按ivy-simple-api来,未完成的,可以按同样风格补充。
这个数字同事才是我的最终需要的结果。要结合harness,openspec等不断验证,测试,最终保证数字同事这个出品的质量。
2.2 让它搭出来、提交、再自测
2.2.1 反问是否完事了、要求提交
它给了一版,我反问是不是完事了、还要不要我动手,顺带要求提交:
现在就好了?还有没有要我做的,
如果都完成,就提交git,commit push
2.2.2 追问项目放哪、要不要自测
提交完我不放心,追问以后项目放哪、也不测一下能不能跑:
以后我要做项目,是放在哪里?
不要顺便测试一下有没有成功吗?
2.2.3 列六条要验的点逐条核对
我干脆列了六条要验的点,让它对着一条条核:
检查功能
1、我要的是能生成完成的代码
2、sa-token等
3、doc.httml
4、带网关的
5、代码生成器也是要做的,这个可能是Qoder做的是吧。
6、数字同事也是可以按我的这些要求来开发项目的。
检查功能
1、我要的是能生成完成的代码
2、sa-token等
3、doc.html
4、带网关的
5、代码生成器也是要做的,这个可能是Qoder做的是吧。
6、数字同事也是可以按我的这些要求来开发项目的。
2.3 补漏:cores、application 和改名
2.3.1 补齐 cores 与 application
核下来发现 cores 和 application 都没生成,我让它补齐,还要求把 springutils 的 banner 加进 application:
现在还有点问题,cores代码也是要生成的。
docsolo你也没有生成application啊
其他微服务才不用,使用oss拉取
要能生成完整的项目。
补充一下,application里面要加上springutils的那个banner
2.3.2 sql 与开发文档反哺回 spec
又发现 doc 里的 sql 和开发文档没反哺回 spec,我叫它把这些问题改回文档:
在项目中doc,里面有sql,存放真实的sql和pdman的文档。开发文档也是放在doc中的
你要将这些问题,反哺回去,修改spec和相关的文档
2.3.3 starter 改名 docsolo
既然整套叫 docsolo,starter 就不该还挂着 ivy 的名,我让它改名:
既然叫 docsolo 那么就不要叫 ivy-starter,而是改为docsolo-starter-*
2.3.4 包名自己定、每改必 push
包名我想自己定,顺便立了条规矩——每改一次都要 push:
包名,最好是指定的,
可以提问,说创建项目,有哪些必须填的,都弹出来填好后就可以了。
还有每次修改后,要提交git,我指一定要push。
2.4 连上库,逐个接口跑测试
2.4.1 连 130 初始化、逐个接口测
我这边 130 有现成的 redis、mysql,把账号丢给它,让它初始化库后拿 doc.html 逐个接口测,并强调要回归到数字同事:
我开启130里面有redis,mysql
redis 密码 wayhua
mysql root/Ivy@2024
我开启130里面有redis,mysql
redis 密码 wayhua
mysql root/Ivy@2024
你初始化数据库等,然后逐个接口通过doc.html进行测试,并验证。同时要回归到数字同事,从而保证以后可以直接使用。
2.4.2 maven 用 IDE 自带的
构建我要求用 IDE 自带的 maven 和指定 JDK,别自己乱找:
等等,maven最好使用ide中的。
- **JDK**:`D:/Program Files/Java/jdk-17.0.5`(JAVA_HOME 同路径)
- **Maven**:`D:/Program Files/JetBrains/IntelliJ IDEA 2025.1/plugins/maven-plugin/lib/maven3/bin/mvn.cmd`(必须 mvn.cmd,构建一律 `mvn -o` 离线)
- **本地仓库**:`F:\maven/repository`
这个最好是本机是这个其他机器,可以按ide搜索一下。
三、结构跑偏,逼它反思反哺
3.1 命名与结构跑偏
3.1.1 模块命名搞错、强调反哺
模块命名它搞错了,bootstrap/model 该是父 pom、该用单数,我借这处又强调一次反哺:
docsolo-bootstrap
docsolo-model
这两个是不对的,应该是父pom和复数去掉,变为单数。bootstrap一定要有service。
这种修改一定反哺数字同事
其实应该是 vip.wayhua.jet.core
vip.wayhua.jet.docsolo
这样的才是最好的,不过前面改成docsolo了也就先这样。
以后的微服务 vip.wayhua.jet.sys
vip.wayhua.jet.docsolo
要将这个反哺数字同事。 前面ivy是i版本,修改后就变成了j版本,叫jet。
3.1.2 按 jet 整体重构、规划 sys 验证
错的地方攒多了,我让它按 jet 这套整体重构,先测通再反哺,并规划后面用 sys 来验证:
这样,按前面的jet来将整个代码重构。jet-starter-cores
然后做 jet-service-docsolo
先测试通过,反哺数字同事。
后面我会添加sys,jet-service-sys,来验证此数字同事。
这是当前任务,严格按harness和openSpec来分步执行
项目改名: jet-simple-wrapper
3.2 目录跑偏与连名字都照抄
3.2.1 目录结构全错、质问反思
结果目录结构整个跑偏,我质问它为什么犯这种错,要它反思反哺:
怎么回事,目录结构全错了。
jet-service-bootstraps
|-jet-service-docsolo-bootstrap
jet-service-models
|-jet-service-docsolo-model
jet-starter-cores
哪能像你这样。为什么会犯这样的错误,要反思,反哺数字同事。
3.2.2 反向对比、去掉 -parent
我让它拿 ivy-simple-api 反向对比生成的架子,查有没有违规,还让去掉多余的 -parent:
反过来对比一下ivy-simple-api
与生成的jet-simple-wrapper对比,有没有违规的。
反哺数字同事。
另外:
<artifactId>jet-simple-wrapper-parent</artifactId>
去掉-parent
3.2.3 连名字都照抄、纠正
对比完它连名字都照抄了,我纠正它:要的是框架和结构,不是一模一样的名字:
你这是不对的。没叫你连名字也一样,主要是框架,结构。
现在的名字不是
jet-simple-wrapper,我都指定了名字,肯定不能一模一样。不然怎么叫数字同事,不叫数字**
网关名字可加可不加
反哺数字同事。
四、分页接口来回拉扯
4.1 先按 spec 出计划再改
接口有硬伤,分页查询用了 GET、还塞了两个 @RequestBody,我让它按 spec 先出计划再改:
IdCrudControllerController中
@GetMapping("/list")
public R<List<Dto>> list(@Valid @RequestBody Dto query, @Valid @RequestBody SortForm sortQuery) {
@Operation(summary = "分页查询列表", description = "分页查询列表")
@GetMapping
public R<Paged<Dto>> page(@Valid @RequestBody Dto query, @Valid @RequestBody PageForm pageQuery) {
这几个访求 是错的,要修改成post,但要SortForm和doto,有两个@RequestBody是有问题的。要修改,这个做为spec来修改一下。先做计划
怎么没反应了,按 采用A的D query; Integer page; Integer size; String[] sort; 这种方式内容由 AI 生成方式修改。
4.2 改反了,直接给定方法签名
4.2.1 入参改反了,重说一遍
它把入参改反了,我把真正要的形式重说一遍,还质问它到底测没测:
你是不是改反了,我要的是 D query; Integer page; Integer size; String[] sort;
这种方式,现在怎么改反了。就是不要SortForm
还有,就是你没测试吗?@Schema(description = "分页查询统一入参") public class PageQuery { 不要这个
你是不是改反了,我要的是 D query; Integer page; Integer size; String[] sort;
这种方式,现在怎么改反了。就是不要SortForm
还有,就是你没测试吗?@Schema(description = "分页查询统一入参")
public class PageQuery<D> { 不要这个
4.2.2 直接给定方法签名
越说越急,我直接给出我要的方法签名,让它照这个改、另一个同理:
怎么突然这么蠢了,我要的是
public R<Paged> page(@Valid @RequestBody Dto req,Integer page; Integer size; String[] sort){
怎么突然这么蠢了,我要的是
public R<Paged<Dto>> page(@Valid @RequestBody Dto req,Integer page; Integer size; String[] sort){
另外一个也类似
要反哺数字同事
五、彻底脱离参考源码,收到文档规范
5.1 追到连 wrapper 也脱离、代码进 skill
5.1.1 补 sort、要能脱离 example
改得差不多了,我提后续要求:补 sort 排序、controller 封装可逐步优化但不许脱离我的风格、最终要能彻底脱离参考源码:
这个代码可能还有不太完善的地方
我主要是增加了 sort的排序
重点是controller的这些封装,可以逐步优化一下,但不能脱离我的这个风格。
还有,就是最终是不要example的代码,也能生成。也就是这个数字同事,可以脱离ivy-simple-api的代码。
5.1.2 连 wrapper 也脱离、代码进 skill
我进一步要求连 ivy-simple-wrapper 也脱离、必需代码放进 skill 目录,还点它好像根本没真用 harness 和 openspec:
还要说明,也脱离 ivy-simple-wrapper能自动生成哦,不要又改成依赖这个项目。
可以将一些必需的代码放在skill中某个目录。
我要的是完全脱离以前源码,能生成,且不能有错。
好像没有使用harness和openspec啊
5.2 开发文档必须严格照 SKILL 样式
5.2.1 问能否用 SKILL 出开发文档
代码稳住后我转到文档,问它开发文档按不规范生成、能不能用 software-engineering-document SKILL:
现在代码没什么问题吧。
文档生成时有没有规范,开发文档。
software-engineering-document SKILL 有开发文档的格式
Qoder能不能用吗?
5.2.2 严格照 SKILL 样式、只替换
文档格式我卡得很死,必须严格照 SKILL 里的样式,只能替换不能自己造:
software-engineering-document SKILL 中的文档格式是非常重要的,严格按这个文档生成
有目录,有样式,只能在此基础上替换,不能自己制作 ,如果自己制作样式会不对。skill中是什么样式就什么样式。
六、小结
到这儿,脚手架算是立起来了,从一句模糊需求到能跑起来的一整套 jet 架子,来回逼了好几轮,几条先记下:
-
怎么提问和问什么一样重要:一句话要把边界说死,别让它顺带牵出没要求的改动。
-
技术选型是我定的,它只管照 ivy-simple-api 的风格写生成器之外的业务代码,不许自作主张换架构、改包名。
-
代码生成器那套不用它碰,它补的是生成出来的代码之外的具体业务;一旦越界把 docsolo 的东西做成 ivy 同名,当场就得拽回来。
-
每改一次都要 push。目录结构跑偏、分页接口改反了这种事,光返工还不够,要它说清为什么犯、下次怎么避免。
-
反哺是刚需:doc 里的 sql、开发文档、踩过的坑,改完必须回填进 spec 和 SKILL,不然下一轮照样再犯一遍。
-
最终目标是彻底脱离参考源码也能生成——连 ivy-simple-wrapper 都不依赖,必需代码收进 skill 的目录里。
下一篇拿 rbac 多租户来验货,看它到底靠不靠谱。