1. 教 AI 上班:带出我的数字同事 —— 把开发习惯交给 Qoder,从零搭脚手架

1 阅读13分钟

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 ,请先指导我该怎么做。

QQ_1790575251737

QQ_1790575286836

QQ_1790575320269

QQ_1790575358106

QQ_1790575379595

QQ_1790575974251

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等不断验证,测试,最终保证数字同事这个出品的质量。

QQ_1790576031449

QQ_1790576091404

QQ_1790576457342

QQ_1790576535229

2.2 让它搭出来、提交、再自测

2.2.1 反问是否完事了、要求提交

它给了一版,我反问是不是完事了、还要不要我动手,顺带要求提交:

现在就好了?还有没有要我做的,
如果都完成,就提交git,commit push

QQ_1790576795120

QQ_1790576827436

2.2.2 追问项目放哪、要不要自测

提交完我不放心,追问以后项目放哪、也不测一下能不能跑:

以后我要做项目,是放在哪里?
不要顺便测试一下有没有成功吗?

QQ_1790576972780

QQ_1790577095655

QQ_1790577211868

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、数字同事也是可以按我的这些要求来开发项目的。

QQ_1790577265925

QQ_1790577321360

QQ_1790577344084

2.3 补漏:cores、application 和改名

2.3.1 补齐 cores 与 application

核下来发现 cores 和 application 都没生成,我让它补齐,还要求把 springutils 的 banner 加进 application:

现在还有点问题,cores代码也是要生成的。
docsolo你也没有生成application啊
其他微服务才不用,使用oss拉取
要能生成完整的项目。
补充一下,application里面要加上springutils的那个banner

QQ_1790578036303

QQ_1790578407226

2.3.2 sql 与开发文档反哺回 spec

又发现 doc 里的 sql 和开发文档没反哺回 spec,我叫它把这些问题改回文档:

QQ_1790584707463

在项目中doc,里面有sql,存放真实的sql和pdman的文档。开发文档也是放在doc中的
你要将这些问题,反哺回去,修改spec和相关的文档

QQ_1790584987541

2.3.3 starter 改名 docsolo

既然整套叫 docsolo,starter 就不该还挂着 ivy 的名,我让它改名:

既然叫 docsolo 那么就不要叫 ivy-starter,而是改为docsolo-starter-*

QQ_1790585347981

2.3.4 包名自己定、每改必 push

包名我想自己定,顺便立了条规矩——每改一次都要 push:

包名,最好是指定的,
可以提问,说创建项目,有哪些必须填的,都弹出来填好后就可以了。
还有每次修改后,要提交git,我指一定要push。

QQ_1790585441108

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进行测试,并验证。同时要回归到数字同事,从而保证以后可以直接使用。

QQ_1790585735646

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搜索一下。

image-20260928170013292

QQ_1790586073682

QQ_1790588891763

三、结构跑偏,逼它反思反哺

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。

QQ_1790590423044

QQ_1790592627551

3.1.2 按 jet 整体重构、规划 sys 验证

错的地方攒多了,我让它按 jet 这套整体重构,先测通再反哺,并规划后面用 sys 来验证:

这样,按前面的jet来将整个代码重构。jet-starter-cores
然后做 jet-service-docsolo
先测试通过,反哺数字同事。
后面我会添加sys,jet-service-sys,来验证此数字同事。
这是当前任务,严格按harness和openSpec来分步执行
项目改名: jet-simple-wrapper

QQ_1790592872440

QQ_1790592900007

QQ_1790592976031

3.2 目录跑偏与连名字都照抄

3.2.1 目录结构全错、质问反思

结果目录结构整个跑偏,我质问它为什么犯这种错,要它反思反哺:

怎么回事,目录结构全错了。

jet-service-bootstraps
  |-jet-service-docsolo-bootstrap
jet-service-models
  |-jet-service-docsolo-model
jet-starter-cores
哪能像你这样。为什么会犯这样的错误,要反思,反哺数字同事。

QQ_1790597460497

3.2.2 反向对比、去掉 -parent

我让它拿 ivy-simple-api 反向对比生成的架子,查有没有违规,还让去掉多余的 -parent:

反过来对比一下ivy-simple-api
与生成的jet-simple-wrapper对比,有没有违规的。
反哺数字同事。
另外:
    <artifactId>jet-simple-wrapper-parent</artifactId>
    去掉-parent
 

QQ_1790597836316

QQ_1790598441219

3.2.3 连名字都照抄、纠正

对比完它连名字都照抄了,我纠正它:要的是框架和结构,不是一模一样的名字:

你这是不对的。没叫你连名字也一样,主要是框架,结构。
现在的名字不是
jet-simple-wrapper,我都指定了名字,肯定不能一模一样。不然怎么叫数字同事,不叫数字**
网关名字可加可不加

反哺数字同事。

QQ_1790598524571

四、分页接口来回拉扯

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 生成方式修改。

QQ_1790599626271

QQ_1790599716456

QQ_1790600170041

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> { 不要这个

QQ_1790600514045

QQ_1790600641298

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){
另外一个也类似
要反哺数字同事

QQ_1790600810261

QQ_1790601284301

五、彻底脱离参考源码,收到文档规范

5.1 追到连 wrapper 也脱离、代码进 skill

5.1.1 补 sort、要能脱离 example

改得差不多了,我提后续要求:补 sort 排序、controller 封装可逐步优化但不许脱离我的风格、最终要能彻底脱离参考源码:

这个代码可能还有不太完善的地方
我主要是增加了 sort的排序
重点是controller的这些封装,可以逐步优化一下,但不能脱离我的这个风格。
还有,就是最终是不要example的代码,也能生成。也就是这个数字同事,可以脱离ivy-simple-api的代码。

QQ_1790601547178

QQ_1790602098040

5.1.2 连 wrapper 也脱离、代码进 skill

我进一步要求连 ivy-simple-wrapper 也脱离、必需代码放进 skill 目录,还点它好像根本没真用 harness 和 openspec:

还要说明,也脱离 ivy-simple-wrapper能自动生成哦,不要又改成依赖这个项目。
可以将一些必需的代码放在skill中某个目录。
我要的是完全脱离以前源码,能生成,且不能有错。
好像没有使用harness和openspec啊

QQ_1790602292067

QQ_1790602370660

QQ_1790602490833

QQ_1790603496811

5.2 开发文档必须严格照 SKILL 样式

5.2.1 问能否用 SKILL 出开发文档

代码稳住后我转到文档,问它开发文档按不规范生成、能不能用 software-engineering-document SKILL:

现在代码没什么问题吧。
文档生成时有没有规范,开发文档。
software-engineering-document SKILL 有开发文档的格式
Qoder能不能用吗?

QQ_1790604620246

5.2.2 严格照 SKILL 样式、只替换

文档格式我卡得很死,必须严格照 SKILL 里的样式,只能替换不能自己造:

software-engineering-document SKILL 中的文档格式是非常重要的,严格按这个文档生成
有目录,有样式,只能在此基础上替换,不能自己制作 ,如果自己制作样式会不对。skill中是什么样式就什么样式。

QQ_1790604872981

QQ_1790605024669

QQ_1790605870973

六、小结

到这儿,脚手架算是立起来了,从一句模糊需求到能跑起来的一整套 jet 架子,来回逼了好几轮,几条先记下:

  1. 怎么提问和问什么一样重要:一句话要把边界说死,别让它顺带牵出没要求的改动。

  2. 技术选型是我定的,它只管照 ivy-simple-api 的风格写生成器之外的业务代码,不许自作主张换架构、改包名。

  3. 代码生成器那套不用它碰,它补的是生成出来的代码之外的具体业务;一旦越界把 docsolo 的东西做成 ivy 同名,当场就得拽回来。

  4. 每改一次都要 push。目录结构跑偏、分页接口改反了这种事,光返工还不够,要它说清为什么犯、下次怎么避免。

  5. 反哺是刚需:doc 里的 sql、开发文档、踩过的坑,改完必须回填进 spec 和 SKILL,不然下一轮照样再犯一遍。

  6. 最终目标是彻底脱离参考源码也能生成——连 ivy-simple-wrapper 都不依赖,必需代码收进 skill 的目录里。

下一篇拿 rbac 多租户来验货,看它到底靠不靠谱。