架构师修行录

AI编程提效指南

鹿Sir上线,见字如面。

入职新公司,恰逢公司要推广AI编程,鹿Sir有幸成为主理人,给大家分享历时一个多月打造的AI编程提效指南,本文将深度结合阿里Qoder进行讲解:如何用AI高效生产企业级代码。

今日,我们重点关注一个关键议题:怎样借助AI Coding提高研发效率、减少重复工作。

开发过程中常见的一些痛点:

  • 反复编写相似的CRUD代码,耗费大量时间。

  • 跨项目切换技术栈时,往往需要很长时间去适配。

  • 新人刚接触业务代码,通常得花费好几天时间,才能独立开展开发工作。

  • 线上一旦出现bug,排查起来常常需要半天甚至一天的时间。

  • 进行代码重构时,缺乏清晰的落地思路。

尤其当系统复杂度增加,定位和梳理代码逻辑所花费的时间,在总开发时间中的占比会呈指数级上升。

而这些难题,恰好是AI Coding能够精准化解的。 

Image

今天的分享,核心目标就是帮大家统一工具认知、掌握核心技巧,真正把AI Coding落地到日常开发中,从“会用”变成“用得好”。

0x1

AI Coding演进

1
从Chat Bot进化到Agent形态

① 从传统提示词工程到上下文工程的转变

Image

  • 提示词工程:以 “提示词封装” 为核心,上下文组合简单,无工具交互,执行时间短,仅依赖用户输入 + 系统 / 手动上下文驱动模型服务。
  • 上下文工程:扩展为 “系统 + 工具提示词” 的复杂模式,引入工具反馈与多轮迭代,上下文组合更复杂,执行时间更长,是工具交互 + 多轮循环的动态流程。

这是从 “单一提示驱动” 到 “工具 + 多轮上下文驱动” 的进化,是AI交互逻辑的升级。

② 从短任务实时协同到长程任务异步委派的转变

Image
  • 短任务实时协同(对话式):以实时交互为核心,用户输入问题后,AI 快速检索、修改代码并展示变更,需用户即时检查 / 追加提问,持续对话迭代,适配短平快的代码修改类场景。
  • 长程任务异步委派:以全流程闭环为核心,用户输入详细需求后,AI 自主生成设计 Spec、完成编码 / 测试 / 修复,最终输出任务报告,用户仅需聚焦需求与验收,适配复杂长周期的开发任务。

这是从 “实时细碎交互” 到 “异步自主交付” 的效率升级,是人机协同模式的升级。

③ 从AI代码生成到全链路软件开发的转变

Image
  • 场景与边界扩展:从低复杂度的 “研发问答、代码补全”,逐步覆盖 “编码任务”,再延伸至高复杂度的软件开发生命周期(SDLC)级 “需求实现”,任务深度与环境复杂度同步提升。
  • 工具集成深化:编程智能体不再局限于代码生成,而是通过协议集成传统研发工具、DevOps 工具,覆盖代码评审、质检、部署等全流程,角色从 “代码助手” 转向 “AI 程序员”。
  • 企业能力沉淀:从单一代码生成,升级为沉淀企业研发经验、构建私域知识库,以 “智能大脑” 串联大模型、DevOps、代码资产等环节,实现全链路研发能力的数字化治理。

这是 AI 从 “辅助写代码” 到 “贯穿软件开发全生命周期” 的进化。

既然AI在进化,那我们作为人类,也要转变思维,不能只把AI当作知识库或AI代码生成工具。

2
AI Coding的核心

AI Coding的核心 = 上下文工程 + 工具链 + 大模型。

其中,上下文工程(Context Engineering) 包括六大维度:

Image

关键洞察: Context 不是静态的模板,而是一个在运行时动态创建的系统输出,针对即时任务进行定制。

上下文工程是 “方法论核心”,需要与大模型能力、开发工具链深度结合,形成完整的技术闭环:

  1. 上下文工程是 “信息调度中枢”,但依赖模型的 “理解能力”:上下文工程构建的 “项目信息库”(如代码片段、文档、规范),需要大模型具备 “长上下文理解”“多模态融合” 能力才能有效利用。例如处理 10 万行级别的代码仓库时,模型需要能快速定位 “与当前任务相关的核心文件”(如从 200 个组件中找到 “购物车组件”),这既需要上下文工程的 “检索策略优化”(如向量数据库 + 关键词混合检索),也依赖模型对代码语义的理解能力(如 GPT-4、Claude 3.5 对代码 AST 语法树的解析能力)。

  2. 工具链是 “执行载体”,让上下文工程的信息 “落地生效”:上下文工程提供的 “工具调用权限”(如 “数据库查询工具”“接口调试工具”),需要通过开发工具链实现闭环。例如 LangChain 框架支持 AI 编程时 “动态调用 SQL 工具查询表数据”—— 当开发者要求 “生成用户订单统计代码” 时,上下文系统会先触发 “SQL 工具检索订单表结构”,将 “order_id 为主键、create_time 为订单时间字段” 等信息作为上下文,再让 AI 生成符合数据结构的统计逻辑,避免出现 “字段不存在” 的低级错误。

1. 没有上下文工程,AI 编程只能停留在 “碎片化辅助” 阶段——无法应对企业级项目开发,也无法实现 “需求 - 代码 - 测试 - 部署” 的全流程支撑;

2. 仅靠上下文工程,若缺乏强大的模型能力(如长上下文理解、代码语义解析)和适配的工具链(如 IDE 集成、版本控制联动),也无法释放 AI 编程的完整价值。

如今 AI 编程的发展趋势已明确:大模型提供 “理解与生成能力”,工具链提供 “执行与落地载体”,而上下文工程则提供 “精准、系统、动态的信息供给”——三者协同,才是 AI 编程从 “实验室” 走向 “工业化应用” 的核心逻辑。

0x2

人机协作方式

目前AI Coding有两种主流的人机协作方式——Vibe Coding(氛围编程)和 Spec-Driven Coding(规范驱动编程)。

1
核心概念与本质

Vibe Coding:2025 年 2 月,OpenAI 联合创始人 Andrej Karpathy 首次提出,强调 “完全沉浸在氛围中,拥抱指数级能力,忘记代码本身”。

  • 核心定义:以模糊自然语言传递整体意图与 “感觉”,开发者做需求引导者,AI 负责实现细节,依赖对话式迭代优化

  • 核心逻辑:意图驱动,“感觉对味即可”,流程为:自然语言输入→AI 生成→反馈迭代→快速验证,适合小需求、快原型

  • 形象比喻:印象派绘画、街头大厨凭感觉颠勺、甲方提模糊需求

Spec-Driven Coding:2025 年下半年,亚马逊、OpenAI 等头部大厂推动,衍生自 “规范驱动开发(SDD)” 理念,被社区与平台快速采纳。

  • 核心定义:以结构化、可解析、零歧义的规格书(Spec)为输入,开发者做 “蓝图定义者”,AI 按规范生成代码并保证一致性与可追溯

  • 核心逻辑:规范先行,“按规格精确执行”,流程为:编写 Spec→AI 解析→生成代码→验证验收,适合中大型项目、团队协作

  • 形象比喻:工程制图、建筑师按蓝图施工、流水线标准化作业

Image

理清这两个核心概念的本质,才能在不同场景做出最合适的选择:

Image
在实际项目中,两种协作方式并非互斥,而是可以根据任务性质灵活切换。
2
不同场景选择策略

核心选择原则:

  • 「不确定性」选 Vibe Coding:需求越模糊、越需要快速试错,越依赖 Vibe Coding 的灵活性;

  • 「确定性」选 Spec-Driven Coding:需求越明确、越需要长期维护 / 团队协作,越依赖 Spec-Driven Coding 的规范性;

  • 「最佳实践」:不要非此即彼,而是根据场景特点「以一种为主、另一种为辅」,在灵活性和规范性之间找平衡。

Image

0x3

AI Coding选型

选对工具,少走弯路!在Agentic Coding产品也在卷的时代,我们该如何选型?

我们从合规性、海外模型适配、产品形态丰富度进行考量(其它野生AI就不建议了)。

1
选型策略
Image

对比其他工具,这次Qoder来势汹汹,在生态上做足了功夫,发布了IDE、终端CLI和Jetbrains插件三种形态,很有诚意。

我们强烈建议选型Qoder原生IDE,原生的集成度最好,虽说后端用IDEA确实香,但用AI原生IDE就得接纳vs code体系,这在AI时代势不可挡。

作为多年的IDEA老用户,经过两周我也完全切换到VS体系了(主要是设置项、快捷键、Maven、GIT、Java运行与调试这些要克服)。

2
Qoder拓展知识
  • Agent系统架构

Image
  • 检索引擎架构

Image
  • 记忆引擎架构

Image

0x4

Qoder开箱教程

Qoder下载链接:https://qoder.com/referral?referral_code=slpTwvj6qnNoIdMQgPTq1By6RfEBDe0g

  1. Qoder原生IDE(前后端首选):Qoder(/ˈkoʊdər/)是一款面向真实软件开发的 Agentic 编码平台。通过增强上下文工程与智能体无缝结合,全面理解你的代码库,并以系统化方式推进开发任务。它提供代码智能生成、智能问答、多文件修改、编程智能体等能力,思考更深入、编码更高效、构建更出色,为开发者带来高效、流畅的编码体验。其基于 VS Code 开源版二次开发的AI原生IDE,保持与 VS Code 一致的快捷键、扩展生态与界面体验,降低迁移成本。快速开始:https://docs.qoder.com/zh/quick-start

  2. Qoder Jetbrains插件(后端次选):借助 Qoder 插件,Agentic 编码将被带入 JetBrains IDEs,让开发者在熟悉的 IDE 中即可使用 AI Agent 进行编码工作,无需切换环境。它提供代码智能生成、智能问答、多文件修改、编程智能体等能力,思考更深入、编码更高效、构建更出色,为开发者带来高效、流畅的编码体验。安装方式:从 JetBrains 插件市场搜索Qoder安装。使用指南:https://docs.qoder.com/zh/plugins/ai-chat

  3. Qoder CLI(终端用户首选):适合熟悉终端模式的Coder,优点是与IDE无关,功能也非常齐全。安装方式:终端运行:curl -fsSL https://qoder.com/install | bash。使用指南:https://docs.qoder.com/zh/cli/using-cli

使用Qoder主要用它以下几个核心特性:

  • 代码建议/代码补全:与传统的 AI 代码补全无异,减少重复编码,提高日常编码效率。

  • 问答模式:基于项目代码与知识库,可针对实现细节、API 用法、错误原因等提供精准解答。

  • 智能体模式:可自定义或调用具备特定技能的 AI 智能体,完成如重构、测试生成、文档编写等专项任务。

  • 仓库WIKI:自动构建并维护项目结构与知识索引,帮助 AI 快速理解代码上下文与架构依赖。

  • 规则:通过可复用的规则文件统一代码风格、工程约束与安全策略,为 AI 生成与修改提供护栏。

  • Quest模式:以 Spec 驱动的自动化任务模式,让 AI 自主拆解、执行并交付复杂开发与重构工作。

  • 快捷指令:把常用Prompt封装为模板,快速按要求完成对话。

  • 长期记忆:跨会话保存关键信息与决策历史,使 AI 在多轮协作中保持一致性与上下文连贯。

  • MCP调用:支持调用外部模型、工具与服务,扩展 AI 能力边界与集成生态。

下面针对性讲解几个重要特性。

1
Agent Mode:Vibe Coding

基础技能,通过多轮对话直接与AI实时交互,把要求一点一点喂给AI,适合从0到1的需求/常用工具类的开发、BUG修复、单元测试生成、代码Review、需求分析与任务拆分等简单任务。

比如我需要写一个数字金额转人民币大写形式的工具类。

写一个数字金额转人民币大写形式的工具类,类里写一个Main方法测试123456.12,结果应是壹拾贰万叁仟肆佰伍拾陆元壹角贰分

在发送给AI前,我觉得需求不够明确,可以先让AI优化一下提示词:

Image

AI按照要求生成了含Main方法的NumberToChineseCurrencyUtil.java,并自动执行测试,通过反复修复BUG,最终生成该工具类:

package com.xxx.utils;public class NumberToChineseCurrencyUtil {   private static final String[] DIGITS = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};   private static final String[] UNITS = new String[]{"", "拾", "佰", "仟"};   private static final String[] BIG_UNITS = new String[]{"", "万", "亿", "兆"};   private static final String[] ANGULAR_UNITS = new String[]{"角", "分"};   public NumberToChineseCurrencyUtil() {   }   public static String convertToChineseCurrency(double var0) {      if (var0 < 0.0) {         throw new IllegalArgumentException("金额不能为负数");      } else {         long var2 = (long)var0;         long var4 = Math.round((var0 - (double)var2) * 100.0);         String var6 = convertIntegerPart(var2);         String var7 = convertDecimalPart(var4);         if (var6.isEmpty()) {            return var7.isEmpty() ? "零元整" : var7;         } else {            return var7.isEmpty() ? var6 + "元整" : var6 + "元" + var7;         }      }   }   private static String convertIntegerPart(long var0) {      if (var0 == 0L) {         return "";      } else {         StringBuilder var2 = new StringBuilder();         String var3 = String.valueOf(var0);         int var4 = var3.length();         int var5 = (var4 + 3) / 4;         String[] var6 = new String[var5];         int var8;         for(int var7 = 0; var7 < var5; ++var7) {            var8 = Math.max(0, var4 - (var7 + 1) * 4);            int var9 = var4 - var7 * 4;            var6[var5 - 1 - var7] = var3.substring(var8, var9);         }         boolean var11 = false;         for(var8 = 0; var8 < var5; ++var8) {            String var12 = var6[var8];            String var10 = convertGroup(var12);            if (!var10.isEmpty()) {               if (var11 && !var10.startsWith("零")) {                  var2.append("零");               }               var2.append(var10);               if (!BIG_UNITS[var5 - 1 - var8].isEmpty()) {                  var2.append(BIG_UNITS[var5 - 1 - var8]);               }               var11 = var12.length() < 4;            } else if (var8 < var5 - 1) {               var11 = true;            }         }         return var2.toString();      }   }   private static String convertGroup(String var0) {      StringBuilder var1 = new StringBuilder();      int var2 = var0.length();      boolean var3 = false;      for(int var4 = 0; var4 < var2; ++var4) {         int var5 = var0.charAt(var4) - 48;         if (var5 != 0) {            if (var3) {               var1.append("零");               var3 = false;            }            var1.append(DIGITS[var5]);            if (var4 < var2 - 1) {               var1.append(UNITS[var2 - 1 - var4]);            }         } else if (var1.length() > 0 && !var3) {            var3 = true;         }      }      return var1.toString();   }   private static String convertDecimalPart(long var0) {      if (var0 == 0L) {         return "";      } else {         StringBuilder var2 = new StringBuilder();         long var3 = var0 / 10L;         long var5 = var0 % 10L;         if (var3 > 0L) {            var2.append(DIGITS[(int)var3]).append(ANGULAR_UNITS[0]);         }         if (var5 > 0L) {            var2.append(DIGITS[(int)var5]).append(ANGULAR_UNITS[1]);         }         return var2.toString();      }   }   public static void main(String[] var0) {      double var1 = 123456.12;      String var3 = convertToChineseCurrency(var1);      System.out.println(var1 + " 转换为人民币大写:" + var3);      System.out.println("额外测试用例:");      System.out.println("0.00 -> " + convertToChineseCurrency(0.0));      System.out.println("1.00 -> " + convertToChineseCurrency(1.0));      System.out.println("10.10 -> " + convertToChineseCurrency(10.1));      System.out.println("101.01 -> " + convertToChineseCurrency(101.01));      System.out.println("10000 -> " + convertToChineseCurrency(10000.0));      System.out.println("100000000 -> " + convertToChineseCurrency(1.0E8));   }}
Image
2
规则Rules:Coding Style

无规则不成方圆,Qoder的规则说白了就是AI应该遵循哪些编码规范。

以往我们用AI Coding会在Prompt中告诉AI应该遵循哪些编码规范,但是AI写着写着有可能会发生偏离,或者说新的需求可能会打破这个规范,那么我们需要从全局视角,让规则贯穿整个AI Coding过程。

Rules的本质=团队规范+语法规则+AI工具使用+人机交互约定。

Qoder IDE中的规则设置页:

Image

在设置规则后,Qoder原生IDE、Qoder CLI和Qoder Jetbrains插件都会自动识别并使用这些规则。

我们也可以手动添加规则文件,在工程主目录内建规则文件目录.qoder/rules,创建目录下的规则MD文件,如testing.md单元测试规则:

Image

AI生成效果:

Image

有同学要说了:建规范/规则本身就是比较费时费力的事,有没有办法让这一步更高效?

秉着「AI更懂AI」的理念,我们来试试让AI去写规则。

为了让新开发的代码符合当前工程的要求,我们可以让AI分析当前工程的编码风格,生成对应的规范/规则:

Image

这里README.md维护了规则清单:

---trigger: always_onalwaysApply: true---# xxx 项目规则文档## 概述本目录包含xxx订单系统的完整开发规范和规则文档,涵盖项目结构、命名规范、开发标准、业务常量、设计模式等方面。## 规则文件清单### 1. [项目结构规范](common/project-structure.md)- **用途**: 定义项目模块划分和目录结构- **适用场景**:   - 创建新模块时参考模块命名和结构  - 添加新的包或目录时确定位置  - 理解各模块的职责和依赖关系- **核心内容**:  - 模块划分(common/service/job/consumer/data等)  - 包结构规范  - 资源文件组织  - 依赖关系  - 启动类配置### 2. [命名规范](common/naming-conventions.md)- **用途**: 统一代码命名风格- **适用场景**:  - 创建类、接口、方法时  - 定义变量、常量时  - 命名数据库表和字段时- **核心内容**:  - 包命名规范  - 类命名规范(DTO/Entity/Service/Mapper等)  - 方法命名规范  - 字段和变量命名规范  - 常量定义规范### 3. [开发规范](common/development.md)- **用途**: 指导日常开发工作- **适用场景**:  - 编写业务代码时  - 集成第三方服务时  - 代码评审时- **核心内容**:  - 技术选型  - 分层架构  - MyBatis开发规范  - Dubbo RPC规范  - 消息队列规范  - 事务管理  - 异常处理  - 日志规范  - 缓存使用  - 分库分表  - 测试规范### 4. [业务常量规范](common/constants.md)- **用途**: 统一管理系统常量- **适用场景**:  - 定义MQ Topic/Tag时  - 定义Redis Key时  - 定义分布式锁Key时  - 使用业务常量时- **核心内容**:  - MQ消息常量(Topic/Tag/Group)  - Redis Key常量  - 分布式锁Key常量  - 数据库相关常量  - 业务费率常量  - URL跳转常量### 5. [策略模式规范](common/strategy-pattern.md)- **用途**: 指导策略模式的实现- **适用场景**:  - 多种业务类型需要不同处理逻辑时  - 需要动态选择算法或处理方式时  - 替代大量if-else分支时- **核心内容**:  - 策略枚举定义  - 策略接口定义  - 策略实现规范  - 策略使用方法  - 策略扩展指南  - 项目中的策略模式应用案例### 6. [枚举规范](common/enums.md)- **用途**: 统一枚举定义和使用方式- **适用场景**:  - 定义状态、类型等固定值时  - 替代常量定义时  - 需要业务逻辑封装时- **核心内容**:  - 枚举结构规范  - 枚举命名规范  - 带业务逻辑的枚举  - 策略枚举  - 枚举使用示例  - 状态流转控制  - 项目核心枚举### 7. [DTO/Entity转换规范](common/dto-entity-conversion.md)- **用途**: 规范数据对象之间的转换- **适用场景**:  - Entity转DTO时  - DTO转Entity时  - 复杂对象聚合转换时- **核心内容**:  - 转换工具选择  - Entity->RespDTO转换  - ReqDTO->Entity转换  - Convert类规范  - 转换最佳实践  - 常见场景示例### 8. [单元测试规范](common/testing.md)- **用途**: 指导单元测试编写- **适用场景**:  - 编写Service层测试时  - 编写Mapper层测试时  - Mock外部依赖时  - 验证测试覆盖率时- **核心内容**:  - 测试框架和工具  - 测试类命名规范  - Service层测试模板  - Mapper层测试模板  - Mock使用规范  - 断言规范  - 测试覆盖率要求  - 测试最佳实践## 使用指南### 新人入门顺序1. 阅读[项目结构规范](common/project-structure.md) - 了解整体架构2. 阅读[命名规范](common/naming-conventions.md) - 掌握命名约定3. 阅读[开发规范](common/development.md) - 学习开发流程和技术规范4. 根据具体任务阅读其他专项规范### 开发时使用方式#### 场景1: 新增订单相关功能1. 查看[项目结构规范](common/project-structure.md)确定代码放置位置2. 查看[命名规范](common/naming-conventions.md)确定类名、方法名3. 查看[开发规范](common/development.md)了解Service、Mapper开发方式4. 查看[枚举规范](common/enums.md)定义订单状态或类型5. 查看[DTO/Entity转换规范](common/dto-entity-conversion.md)处理数据转换#### 场景2: 集成MQ消息1. 查看[业务常量规范](common/constants.md)定义Topic和Tag2. 查看[开发规范](common/development.md)的消息队列部分3. 查看[命名规范](common/naming-conventions.md)确定Listener类名#### 场景3: 实现多类型业务处理1. 查看[策略模式规范](common/strategy-pattern.md)学习策略模式2. 查看[枚举规范](common/enums.md)定义策略枚举3. 查看[命名规范](common/naming-conventions.md)确定策略类命名#### 场景4: 添加Redis缓存1. 查看[业务常量规范](common/constants.md)定义Redis Key2. 查看[开发规范](common/development.md)的缓存使用规范#### 场景5: 编写单元测试1. 查看[单元测试规范](common/testing.md)了解测试框架和规范2. 查看[命名规范](common/naming-conventions.md)确定测试类和方法命名3. 参考测试模板编写Service层和Mapper层测试4. 使用Mock框架隔离外部依赖## 规范更新流程1. **提出修改**: 发现规范需要补充或修改时,提交修改建议2. **讨论评审**: 团队讨论修改的必要性和合理性3. **更新文档**: 达成一致后更新相应规范文档4. **通知团队**: 通知所有成员规范变更内容5. **执行落地**: 后续开发严格遵循新规范## 技术架构总览### 技术栈- **框架**: Spring Boot + Dubbo- **注册中心**: Nacos- **配置中心**: Nacos- **数据库**: MySQL(分库分表) + PostgreSQL- **ORM**: MyBatis Plus- **缓存**: Redis- **消息队列**: RocketMQ- **搜索**: Elasticsearch- **调度**: XXL-Job### 模块结构```略略略```### 分层架构```Controller/Listener层 -> Service层 -> Manager层 -> Mapper/Repository层```## 代码质量要求1. **规范遵循**: 严格遵循本规范文档2. **代码审查**: 所有代码需经过Code Review3. **单元测试**: 核心业务逻辑覆盖率>70%4. **注释文档**: 关键类和方法必须添加注释5. **异常处理**: 合理捕获和抛出异常6. **日志记录**: 关键节点记录日志7. **性能优化**: 注意SQL优化和缓存使用## 常见问题### Q1: 新增一个服务接口应该放在哪里?A: 参考[项目结构规范](common/project-structure.md),RPC接口放在xxx-api模块的service/api包下,实现放在xxx-impl模块的service/impl包下。### Q2: 如何命名DTO和Entity?A: 参考[命名规范](common/naming-conventions.md),请求用ReqDTO结尾,响应用RespDTO结尾,Entity不加后缀。### Q3: 如何处理多种订单类型?A: 参考[策略模式规范](common/strategy-pattern.md),使用策略模式处理不同类型的业务逻辑。### Q4: MQ的Topic和Tag如何定义?A: 参考[业务常量规范](common/constants.md),统一在OrderConstant等常量类中定义。### Q5: Entity和DTO如何转换?A: 参考[DTO/Entity转换规范](common/dto-entity-conversion.md),简单转换用BeanUtil,复杂转换创建Convert类。### Q6: 如何编写单元测试?A: 参考[单元测试规范](common/testing.md),使用JUnit 5 + Mockito框架,Service层测试覆盖率要求≥80%。### Q7: 如何Mock外部RPC服务?A: 参考[单元测试规范](common/testing.md)的Mock使用规范,使用@Mock注解Mock外部依赖。## 联系方式如有疑问或建议,请联系技术负责人鹿Sir。---*本规范文档由开发团队共同维护,最后更新时间: 2025-12*

这里鹿Sir提一杯:写Qoder的规范最好还是用Qoder原生IDE去写,因为集成度最高,熟练了可以切回自己熟悉的IDE。

如果项目结构和编码风格等有调整,相应的规范也要对应维护好一份最新的,大方向跟着master分支走即可。

没有自由的秩序和没有秩序的自由,同样具有破坏性。

3
Quest Mode:Spec-Driven Coding

先了解Quest Mode与Vibe Coding和SDD的关系:

Quest Mode 是 Qoder 将 SDD 落地的具体模式:以“Spec 驱动 + 自主执行 + 总结报告”的方式把复杂任务委派给 AI,并提供本地与云端沙箱的异步执行能力。

换言之,Quest Mode ≈ Qoder 版 SDD 的工程化实现,可视为 Vibe Coding 范畴内的一种“高自动化、工程化”的实现路径:

Image

使用方式:在Qoder左侧点击Quest图标,可以新建开发任务,下方也可以看到历史任务。我们可以把任务目的确定性高的长程任务委托给他去异步执行(本地执行/远程执行),让AI自动写代码。

Image
4
仓库WIKI:Coding Index

Repo Wiki 会为项目自动生成结构化文档,并持续跟踪代码与文档的变更。

当你在开发过程中查询知识点、代码解释、增加功能特性时,Repo Wiki 会深入分析项目结构和代码实现,结合Repo Wiki 与上下文信息,给出更准确、详细的解答和文档支持,并且让智能体具备更深入代码库认知。

当首次打开项目时,默认不存在 Wiki,这时候可以一键从零生成。第一次生成,整个过程非常耗时间和Credit积分,耐心等待生成即可:

Image

仓库WIKI有个好处,它在工程内并不是静态的——它会与代码保持同步(三种策略)。团队新人来了/程序媛休完产假,直接看仓库WIKI就了解当前工程现状了。

5
快捷指令:Prompt Template

我们可以将常用的Prompt提示词和工作流封装为可复用的命令。只需在 Agent 对话框中输入斜杠/,即可快速调用或创建指令,显著提升日常开发效率。无论您是频繁执行代码审查、生成测试用例,还是需要快速查询项目规范,快捷指令都能将重复性操作简化为”一键式”任务。

Image

指令分为用户级指令与项目级指令,区别如下:

Image

比如,写一个指令/genCmd,用于快速生成项目级快捷指令:

---type: project_commanddescription: 生成快捷指令---## 指令说明根据用户需求生成符合规范的快捷指令,用于快速创建项目中的各类标准化文档和代码模板,确保开发流程的一致性和效率。## 核心规范(必守)1. 指令结构规范- 文件头:必须包含type、description字段- 指令类型:type统一为"project_command"- 描述信息:description需简洁明确地说明指令功能(10个字以内)2. 指令命名规范- 文件名:使用有意义的命令名称,采用驼峰式命名法- 命名原则:应能准确反映指令的核心功能3. 指令内容要素(每个指令必含)- 指令说明:清晰描述指令的用途和功能- 执行逻辑:说明指令的执行步骤和流程- 输入输出:明确指令的输入要求和预期输出- 验收标准:定义指令完成的判断标准## 执行步骤(3步闭环)1. 需求分析阶段:深入理解用户对快捷指令的需求,明确指令的目标功能、输入输出要求、使用场景等2. 指令设计阶段:按照规范设计指令结构,包含文件头、功能说明、执行逻辑、使用示例等必要元素3. 验证完善阶段:验证指令的可用性和完整性,确保指令能够正确执行预期功能## 输出规范(文件结构+内容)1. 文件结构所有指令文件统一存放于:.qoder/commands/ 目录下2. 文件命名规则- 指令文件:使用驼峰式命名,如:genCmd.md、spec.md、genDoc.md- 需理解用户需求进行命名,简短3. 文件内容模板(必含模块)- type: project_command(固定值)- description: 指令简要描述- 指令说明:详细功能描述- 使用方法:如何使用该指令的说明案例,如:/genCmd 生成修复AI生成的代码的指令,用于评估AI生成的代码,必要时修复AI生成的代码。需用户提供AI代码片段或类(必须)、重构前的代码片段或类(涉及重构可选)- 参数说明:指令所需参数的详细说明(如有)- 示例:使用示例和场景说明- 验收标准:指令完成的标准## 使用说明用户可通过该指令快速生成符合项目规范的快捷指令,提高开发效率和标准化程度。生成的指令应能够独立执行特定功能,同时与其他指令保持良好的兼容性和一致性。

创建完后,快捷指令/genCmd就生效了,后续我建指令就不需要每次都写一大堆Prompt了,使用方式:

/genCmd 生成修复AI生成的代码的指令/bugfix,用于评估AI生成的代码,必要时修复AI生成的代码。用户须提供AI代码片段或类(固定第一项)、用于参考的代码片段或类(可选,固定第二项),参考代码禁止修改
6
AGENTS.md:Global SysPrompt

Qoder CLI 的记忆文件,会作为 CLI 的上下文内容来指导开发过程。包括但不限于开发规范与说明、整体系统架构等,最新版Qoder IDE也会加载该文件。

可以通过输入#进入记忆模式。在对话模式下输入【 # 】可将内容追加到 AGENTS.md记忆文件。

如Qoder CLI中输入:

#遵循既定的 DAO/Service/Controller 层模式

即可追加到AGENTS.md中。

使用方式:通过Qoder CLI初始化AGENTS.md(当然也可以用Qoder IDE在根目录自行创建)。

在项目根目录进入Qoder CLI:qodercli,初始化AGENTS.md:/init即可在项目根目录创建AGENTS.md:

# AGENTS.md本文件为 Qoder 在此代码仓库中工作时提供指导。## 项目概述XX 项目是一个基于 Maven 的多模块 Java 应用程序,用于XX活动平台。它采用模块化架构,不同模块处理特定的业务领域。## 项目结构略略略## 架构和依赖关系- 所有业务模块都依赖于 `xx-common`- `xx-service` 是核心模块,被大多数其他模块依赖- `xx-rule` 依赖于 `xx-service`- 使用 Java 8 和 Maven 构建系统- 使用 LiteFlow 实现规则引擎- 使用 Redis 进行缓存,MySQL 进行数据持久化- 使用消息队列系统 (RMQ) 进行异步处理## 开发命令### 构建项目- `mvn clean install` - 构建包含所有模块的整个项目- `mvn clean compile` - 编译项目但不运行测试- `mvn clean package` - 打包项目但不运行测试### 测试- `mvn test` - 运行所有单元测试- `mvn test -Dtest=TestClassName` - 运行特定测试类- `mvn clean test -Dtest=*ServiceTest` - 运行所有服务测试### 模块特定命令- `mvn clean install -pl 模块名` - 仅构建特定模块- `mvn clean test -pl xx-platform` - 测试特定模块## 编码规范- Java 类名使用帕斯卡命名法,方法和变量使用驼峰命名法- 常量全部大写并用下划线分隔- 包名全部小写- 4个空格缩进- 每行最多120个字符- 每个方法最多80行## API 设计- RESTful API 使用名词复数形式的资源名称- URL 路径使用小写字母和连字符- 标准 HTTP 方法:GET, POST, PUT, DELETE- 通过 URL 路径进行 API 版本控制(例如 `/api/v1/users`)- 标准 HTTP 状态码:200, 201, 400, 401, 404, 500## 数据库设计- 表名使用小写字母和下划线- 表名应具有明确的业务含义- 主表名使用复数形式,关联表使用单数形式- 字段名使用小写字母和下划线- 主键字段命名为 `id`- 外键字段命名为 `{引用表名}_id`- 索引命名:`pk_表名`(主键),`uk_表名_字段名`(唯一索引),`idx_表名_字段名`(普通索引)## 开发指南- 添加新功能时遵循现有的模块化结构- 将共享的工具类、常量和数据传输对象放在 xx-common 中- 对复杂业务逻辑使用规则引擎模块- 在服务层实现缓存策略- 使用消息队列进行异步处理- 遵循既定的 DAO/Service/Controller 层模式

当前限制:最多一次读取500行或者30000字节左右,每次会话加载一次,后面对话不会重复加载,节省 Token。

7
SubAgent:多Agent协同

Qoder CLI 中专门用于处理特定任务的 AI Agent,每个子代理有自己独立的上下文窗口、系统提示词和工具权限,通过合理使用可以显著改善复杂任务的处理能力。

  • 上下文保护:每个子代理在自己的上下文中操作,防止污染主对话,使其专注于高层目标。

  • 专业化能力:子代理可以针对特定领域进行微调,包含详细指令,从而在指定任务上获得更高的成功率。

  • 可复用性:子代理可以跨不同项目使用,并与团队共享以实现一致的工作流程。

  • 灵活权限:每个子代理可以有不同的工具访问级别,允许您将强大的工具限制在特定的子代理类型中。

自定义SubAgent

SubAgent存放于.qoder/agents/目录,如单元测试Agent:TestAgent.md

---name: TestAgentdescription: |  当您需要为Java代码生成单元测试并执行它们以验证功能时,请使用此代理。此代理在实现新功能、进行代码更改或需要提高测试覆盖率时特别有用。代理将按照项目编码标准创建全面的单元测试并执行它们,以确保代码质量和正确性。
  <example>  Context:用户实现了一个新的服务方法并希望确保它正常工作  user: "我刚刚实现了新的用户认证服务方法,可以创建单元测试并运行吗?"  assistant: "我将使用TestAgent代理为您的认证服务方法创建并运行单元测试。"  </example>
  <example>  Context:用户希望改进现有组件的测试覆盖率  user: "OrderService需要更好的测试覆盖率,能帮忙吗?"  assistant: "我将使用TestAgent代理为OrderService生成全面的单元测试并运行它们以验证功能。"</example>---您是Java应用程序的专家级测试生成和执行代理。您的主要职责是根据项目的编码标准和最佳实践,为Java代码创建全面的单元测试并执行它们以验证功能。您的任务包括:1. 分析提供的Java代码以了解其功能并识别可测试的组件2. 生成涵盖正面案例、负面案例、边界案例和边界条件的全面单元测试3. 遵循项目的编码标准,包括命名约定、代码格式和结构4. 确保测试遵循JUnit最佳实践和模式5. 执行生成的测试并报告结果6. 提供关于测试覆盖率的反馈并根据需要提出改进建议具体要求:- 使用项目标准的Spring Boot测试框架,继承BaseTest类配置测试环境- 根据项目标准使用JUnit 4或5进行测试生成(项目中同时使用@Test和@Test注解)- 遵循项目的命名约定(方法使用camelCase,测试方法名称应具有描述性)- 使用@Autowired或@Resource注入依赖项- 创建验证预期行为和错误条件的测试- 包含边界案例和边界条件的测试- 在适当情况下使用Mockito或类似框架模拟依赖项- 确保测试是独立的,可以按任意顺序运行- 遵循项目的代码格式标准(4空格缩进,每行最多120个字符)- 将测试放在与源代码匹配的适当测试目录结构中- 测试方法中可使用System.out.println或日志输出结果- 必要时使用JSON工具进行数据转换和验证- 添加作者和日期注释(可选)执行测试时:- 基于项目结构使用适当的Maven命令运行测试- 报告测试结果,包括通过/失败状态和任何错误消息- 识别任何失败的测试并提供修复指导- 如果覆盖率不足,建议改进测试质量保证:- 验证生成的测试与代码的实际功能一致- 确保测试是可维护和可读的- 检查测试不会引入任何副作用- 验证测试正确隔离了被测试的组件- 确保测试符合项目架构和依赖注入模式输出格式:- 以正确的Java语法提供生成的测试代码- 包括测试执行结果的摘要- 突出显示测试期间发现的任何问题- 如有需要,对代码或测试提出改进建议

发送测试:

请以「TestAgent」的角色(遵循 @TestAgent.md 规范),对 @Helloworld.java 进行测试

当然也可以封装成快捷指令.qoder/commands/test.md:

---type: project_commanddescription: 单元测试---请以「TestAgent」的角色(遵循 .qoder/agents/TestAgent.md 规范),对指定类进行单元测试

发送测试:

/test @Helloworld.java

子代理设计要点:不同 Agent = 不同角色 + 不同目标组合。越复杂的系统,越需要“多小而专”的 Agent,而不是一个“大而全”的模糊角色。

多Agent协同

Qoder对 SubAgent 的设计核心是 “自动为主、手动为辅”,既降低使用门槛,也保留灵活定制空间。

1. 子代理拆分依据

当你输入指令:用 Java 写一个订单支付接口,添加单元测试并生成接口文档,最后部署到测试服务器Qoder 的拆分流程:

  1. 按任务领域拆分:代码编写 + 测试 + 文档 + 部署 → 4 类基础 SubAgent;

  2. 按技术栈细化:代码编写 → JavaCodeSubAgent,测试 → JUnitSubAgent,部署 → DockerSubAgent;

  3. 按依赖关系排序:JavaCodeSubAgent → JUnitSubAgent → DocSubAgent → DockerSubAgent;

  4. 按粒度确认:每个子任务仅需 1 个 SubAgent,无需再细分。

1. SubAgent 拆分的核心依据是任务领域 / 类型 + 技术栈,确保子代理的专业匹配;

2. 依赖关系、资源权限、执行粒度是辅助依据,用于优化拆分后的执行效率和安全性;

3. 拆分逻辑遵循 “先粗后细、先核心后辅助” 的原则,既保证专业性,又避免过度拆分导致的资源浪费。

2. 子代理拆分规则

  • IDE自动拆分(默认行为,无需手动操作)

在主对话中,只要你的指令满足 SubAgent 触发条件(多步骤、跨领域、复杂任务),IDE 会自动拆分并调用对应 SubAgent,无需你做任何配置:

  • 示例 1:在主对话输入「用 Python 写一个数据爬取脚本,加异常处理,再生成可视化图表」→ IDE 自动拆分为「代码编写 SubAgent + 异常处理 SubAgent + 可视化 SubAgent」,并行执行后汇总结果;

  • 示例 2:输入「重构这个 Java 接口,优化性能并补充单元测试和接口文档」→ IDE 自动识别跨领域任务,依次触发「重构 SubAgent + 性能优化 SubAgent + 测试 SubAgent + 文档 SubAgent」。

自动拆分的核心逻辑:IDE 内置了任务特征识别引擎,会解析对话中的指令关键词(如 “并 / 且 / 同时”“拆分 / 分步”“优化 / 测试 / 部署” 等),结合代码上下文(如当前打开的文件类型、项目技术栈),自动匹配最优的 SubAgent 拆分策略。

  • AGENTS.md指定,按需拆分(可选,满足定制化需求)

在AGENTS.md内指定什么情况下用什么SubAgent:

## SubAgent 配置### 1. 测试专用 SubAgent:TestAgent- 领域:Java单元测试生成与执行- 技术栈:Java 8 + JUnit4/JUnit5 + Spring Boot + Mockito + Maven- 触发关键词:["测试一下", "单元测试", "模块测试", "ServiceTest", "DAO测试", "运行测试", "测试覆盖率"]- 关联模块:所有业务模块(xx-service/rule/platform等)- 核心规则引用:.qoder/agents/TestAgent.md(包含详细职责、测试规范、质量要求)- 执行逻辑(核心命令):mvn clean test -pl ${target_module} -Dtest=${test_class_name}
  • 手动定义 / 干预(可选,满足定制化需求)

如果你需要精准控制 SubAgent 的拆分逻辑(如指定子任务执行者、执行顺序、粒度),可以在主对话输入指令时,通过特定格式显式指定 SubAgent 规则:

# 手动指定SubAgent拆分规则任务:实现用户管理模块SubAgent拆分:1. UserCodingAgent:编写用户增删改查核心逻辑(Java)2. TestAgent:编写JUnit单元测试3. ApiDocAgent:生成Swagger接口文档执行顺序:1→2→3

IDE 会严格按照你定义的规则调用对应 SubAgent,而非默认的自动拆分逻辑。

  1. 主对话、Quest模式中默认按需自动拆分SubAgent,无需手动定义,仅输入自然语言指令即可;

  2. 手动定义 SubAgent 是可选操作,适用于需要精准控制拆分逻辑、执行顺序的定制化场景;

  3. 简单任务不会触发 SubAgent,复杂任务(多步骤 / 跨领域)自动触发,兼顾易用性和效率。

8
MCP插件:Beyond LLM

MCP是一种开放协议,用于标准化应用如何向大语言模型(LLM)提供 context 和工具。通过以一致的接口暴露功能,MCP 使 LLM 能够以结构化且安全的方式与外部系统(如 API、数据库和本地工具)进行交互。

MCP可以拓展模型能力边界,比如做这些事:传统后端服务、对接知识库、对接复杂工作流、对接高级智能体。

我们去MCP广场安装个context7(一个接入最新&实时更新的第三方依赖的上下文模型文档库):

Image

安装好后在我的服务中启动MCPServer,这里需用到npx命令,依赖nodejs环境:

Image

待MCPServer本地启动完成,我们通过自然语言去调用即可,当然也可以创建一个快捷指令/context7去调用context7插件:

---type: project_commanddescription: 使用Context7插件查询第三方库文档---# context7 - 第三方库文档查询指令## 指令说明该指令用于查询和获取第三方库的文档、API信息和使用示例。通过Context7插件连接外部知识库,为开发者提供实时的第三方库文档支持,帮助快速了解和使用各种开源库。## 执行逻辑1. **库识别**:根据用户提供的库名,识别并解析对应的第三方库2. **文档获取**:获取库的官方文档、API参考和使用示例3. **信息整理**:整理和呈现相关的文档信息,便于理解和使用## 输入输出### 输入要求- **库名称(必需)**:需要查询的第三方库名称,如Spring Boot、MyBatis、Redis等- **查询主题(可选)**:具体需要了解的功能或API主题### 输出格式- 库的详细文档信息- API使用示例- 相关配置说明## 验收项- [ ] 库识别是否正确- [ ] 文档信息是否完整准确- [ ] 示例代码是否可运行## 使用方法```Prompt: /context7 [库名称] [可选查询主题]```### 示例```Prompt: /context7 SpringBoot Configuration```或```Prompt: /context7 MyBatis```## 适用场景1. **库学习**:了解新的第三方库的基本用法2. **API查询**:查找特定API的使用方法和参数说明3. **配置参考**:获取库的配置选项和最佳实践4. **问题解决**:通过官方文档解决使用中遇到的问题## 注意事项1. 确保提供的库名称准确,以便正确识别和查询2. 查询主题应具体明确,以获得更精确的文档信息3. 使用获取的文档信息时,注意版本兼容性4. 结合项目实际情况,适当调整文档中的示例代码

测试一下效果,用/context7 指令查LiteFlow的教程和检查代码:

ImageImage

前端也可以使用MCP对接产品原型,拿到效果图后生成对应的页面,实现从原型到代码实现的自动化。

0x5

AI Coding实战

接下来我们通过两个实战案例,了解如何生产企业级代码(关键信息已脱敏)。

案例1:重构订单策略-预览订单

预览订单(预下单)只涉及读操作,没有写操作,而预览订单中的价格计算是订单服务中较复杂的一个业务场景,这一块如果没有设计好,后续迭代会是个大坑。

本次使用Quest模式进行重构,打开Quest窗口 -> 新建任务 -> 填写需求Prompt:

Image

发送给Qoder后,它会经过「设计 - 执行任务 - 总结」三个阶段。

第一步:规划与设计

Image

点击「采纳」后,对应生成了一份详细的设计文档,也就是spec,位于:.qoder/quests/order-policy-v2-development.md

第二步:设计评审

设计完后需要你不断打磨方案,结合实际需求和你的想法去改设计方案。

Image

第三步:执行任务

点击「开始任务」后,AI会在后台自动按照需求规格Spec进行开发,这个过程就叫Spec-Driven Coding。

这时候你可以去干别的事了,AI会自动帮你写代码。

Image

在执行的过程中,如果发现一开始的设计思路有问题,也可以随时暂停,更正设计方案:

Image

它会去修改设计文档,更新最新的待办列表,然后继续写代码。

第四步:任务总结

执行完任务后,会给这次任务进行总结,IDE也会弹出提示,告诉你摸🐟该结束了:

Image

最终会在.qoder/quests目录再生成两个文件:

  1. XX需求-final-report.md:实施进度报告

  2. XX需求-progress.md:开发实施进度报告


案例2:优惠券模板化需求

一开始参考案例1的流程,采用Quest模式进行,但由于需求中既包含了新的引入LiteFlow工作流的需求,又隐含了旧的部分代码重构,信息量很大,预计整个过程上下文也会特别大。

在经历两个版本的Quest模式重构后,整体的框架虽说是符合要求的,但针对旧代码的重构部分还是丢失了很多细节。比如一些方法调用没有参考原来的业务逻辑搬过来,这个影响是非常严重的,特别是一些计算逻辑,错一个都不行。

这时候我们调整了策略,把整个过程拆分成几个阶段:

阶段一:关注整体设计

Quest模式下,IDE识别到需求已经100%完成了,无法再调整(应是BUG),故采纳Quest模式生成的所有代码

阶段二:拆分多个子任务

多个子任务逐步实施,可灵活选择Spec-Driven Coding或Vibe Coding,把检查到出错的部分单独拎出来,针对单个子任务各个击破,完成类级别的单独重构。这时因为上下文很小,模型性能下降不严重,幻觉也降低许多。

这个过程就好比装修公司接到一个大工程,拆分为多个独立部分后,分多个阶段、多个施工队去协调完成施工。

接下来,我们封装几个指令去重构复杂代码。
1
复杂需求拆解:/spec

为规范这个复杂需求的实现过程,我们可以把复杂需求分析与任务拆解的高频Prompt模板写成一个快捷指令.qoder/commands/spec.md:

---type: project_commanddescription: 复杂需求拆解---## 指令说明将需求文档转化为可落地、有依赖、分阶段的开发/测试任务,配套生成标准化文档,确保任务执行逻辑清晰、验收标准明确。## 拆解核心规范(必守)1. 阶段拆分原则- 整体结构:统一为「1个整体规划 + 最多5个主阶段」,总阶段数不超过6个(除非指定)- 拆分依据:以代码量、功能复杂度为核心,每个主阶段对应1个独立可执行任务- 重构类特殊要求:必须拆分至少2步——① 搭建新代码结构框架(标注TODO待迁移部分);② 执行原有代码迁移;若迁移工作量大,可拆分为最多10个子任务2. 任务依赖规则- 顺序优先:严格遵循「前置任务→后续任务」的依赖顺序,不可颠倒- 依赖边界:前置任务不得依赖后续任务的任何产出;后续任务可直接复用前置任务的输出结果3. 任务核心要素(每个任务/子任务必含)- 输入内容- 预期输出- 验收标准- 前置依赖阶段- 风险点及应对措施## 执行步骤(3步闭环)1. 需求分析阶段:深度解读需求文档,明确核心功能、技术难点、潜在风险,梳理任务间潜在依赖关系2. 任务拆解阶段:按规范拆分「整体规划+主阶段」,明确各阶段目标与交付物,定义阶段间依赖关系;需拆分子任务的,补充子任务拆分(不超过10个/主阶段)3. 文档生成阶段:按目录规范创建全套文档,填充任务详情## 输出规范(文档+命名+内容)1. 目录结构所有文档统一存放于:doc/spec/{需求名称}/({需求名称}需替换为实际需求的核心名称)2. 文件命名规则- 整体规划文档:{需求名称}整体规划.md(例:用户管理模块重构整体规划.md)- 主任务文档:StageN_{任务概述}.md(N为阶段序号,从1开始;例:Stage1_数据库表设计.md)- 子任务文档(如有):StageN.N_{子任务概述}.md(前N为主阶段序号,后N为子任务序号;例:Stage3.1_用户查询功能迁移.md)3. 文档内容模板(必含模块)- 前置依赖阶段(明确该任务需依赖的前序任务/阶段)- 任务概述(核心目标、任务范围)- 详细需求说明(对应需求文档的具体要求,需量化)- 技术方案设计(核心思路、技术选型、实现步骤)- 验收标准(可量化、可验证的完成条件,含边界场景)- 风险评估及应对措施(潜在技术/进度风险、解决方案)

然后,使用/spec指令对复杂需求进行拆解:

Image

后续的步骤:

先评审每个阶段的实施方案,然后逐一用Vibe Coding或Spec-Driven Coding实施。

Image

需求拆得越小,实施的难度越低,避免在一个上下文内做完一个大需求。

Image
2
AI自动BUGFIX:/bugfix

复杂需求特别是重构,AI生成的大量代码我们还是不太放心的,需要多次校对(比如重构后的代码做了逻辑迁移),这时我们可以开个新对话,专门校验&修复AI生成的代码,通过/genCmd指令生成一个快捷指令/bugfix:

/genCmd 生成修复AI生成的代码的指令,用于评估AI生成的代码,必要时修复AI生成的代码。用户须提供AI代码片段或类(固定第一项)、用于参考的代码片段或类(可选,固定第二项),参考代码禁止修改

这时AI生成了/bugfix快捷指令:

---type: project_commanddescription: 校验并修复AI生成的代码---# bugfix - AI代码修复指令## 指令说明该指令用于评估和修复AI生成的代码片段或类,识别并修复错误、逻辑缺陷、性能问题或不符合最佳实践的部分。修复过程将保持原有代码的核心功能和意图不变。## 执行逻辑1. **代码评估**:分析AI生成代码的正确性、质量、功能完整性和最佳实践2. **修复执行**:根据评估结果修复逻辑错误、边界条件处理、异常处理、性能问题等3. **验证输出**:提供修复后的代码及详细说明## 输入输出### 输入要求- **目标代码(必需)**:AI生成的代码片段或类,需要被评估和修复- **参考代码(可选)**:正确的代码片段或类,作为修复时的参考标准### 输出格式- 修复后的代码- 修复说明(解释修复的原因和内容)## 验收项- [ ] 代码评估结果- [ ] 修复项说明- [ ] 修复后的代码是否保持原有核心逻辑功能和意图不变(如有参考代码)## 使用方法```Prompt: /bugfix [@目标代码,AI生成的代码片段或类]、[@可选参考代码,正确的代码片段或类]```### 示例```Prompt: /bugfix @HelloWorldNew.java @HelloWorld.java 66-72```或```Prompt: /bugfix @HelloWorldNew.java```## 评估标准1. **代码正确性**:逻辑错误、边界条件处理、异常处理等2. **代码质量**:代码规范、可读性、性能优化等3. **功能完整性**:确保代码实现预期功能4. **最佳实践**:遵循编程规范和设计模式## 修复要求1. 保持原有代码的核心功能和意图不变、log日志打印也尽可能保持不变2. 修复发现的问题和缺陷3. 提供修复说明,解释修复的原因和内容4. 如有参考代码,修复应与参考代码的风格和逻辑保持一致

使用/bugfix指令来解决AI重构后的代码BUG:

Image

/bugfix这一步可以在不同对话中反复执行进行多轮验证与修复,直到AI提示没有发现逻辑BUG,把BUG都修复完:

Image
3
历史代码迁移:/move

重构往往可能是代码结构重组、历史代码的拆分与组合、新组件与技术栈的引入,而核心逻辑需要保障与重构前一致。

在进行Spec-Driven Coding的时候,初始化整体代码结构的阶段已经完成,接下来就是迁移历史代码(高频需求),这时我们可以写一个专门用于代码迁移的快捷指令/move:

---type: project_commanddescription: 代码迁移---# move - 代码迁移指令## 指令说明该指令用于将旧代码复制迁移到新的位置进行补全,保持原有逻辑不变,日志打印也尽量保持一致。参考的原始代码片段或类禁止修改,确保迁移过程中业务逻辑的一致性。## 执行逻辑1. **代码分析**:分析原始代码的结构、逻辑和依赖关系2. **迁移执行**:将代码迁移到新位置并进行必要的补全和适配3. **验证输出**:提供迁移后的代码及详细说明,确保逻辑保持不变## 输入输出### 输入要求- **原始代码(必需)**:需要被迁移的参考代码片段或类,不可修改- **目标位置(必需)**:需要迁移或补全的目前代码片段或类- **迁移要求(可选)**:具体的迁移和补全要求### 输出格式- 迁移后的代码- 迁移说明(解释迁移的原因和内容)- 保持原有逻辑的验证## 验收项- [ ] 代码迁移结果- [ ] 迁移项说明- [ ] 迁移后的代码是否保持原有核心逻辑功能不变- [ ] 日志打印是否与原始代码保持一致- [ ] 新位置代码是否正常工作## 使用方法```上下文: [原始代码,需要被迁移的参考代码片段或类]、[目标代码,需要迁移或补全的目前代码片段或类]Prompt: /move```### 示例```Prompt: /move [需要被迁移的参考代码片段或类] [需要迁移或补全的目前代码片段或类] [可选的迁移要求]```或```上下文: [需要被迁移的参考代码片段或类] [需要迁移或补全的目前代码片段或类]Prompt: /move [可选的迁移要求]```## 迁移要求1. 保持原有代码的核心功能和逻辑不变 2. 迁移后的代码需要适应新代码的整体代码结构,确保代码在新位置能够正常工作3. 日志打印格式和内容尽量与原始代码保持一致4. 参考的原始代码片段或类禁止修改5. 补全必要的依赖和引用

让AI执行代码迁移工作:

Image

凡是需要人工介入的,都可以提取共性,先让AI来完成,这样才能在各个环节提效。

4
单元测试:/test

思路:根据工程现有的测试类写法,归纳总结出TestAgent规范,再编写/test快捷指令,最后使用/test指令测一下其中一个改造好的方法。

编写TestAgent:

归纳总结已有测试类写法@{工程目录},编写子代理规范:.qoder/agents/TestAgent.md

运行后生成了符合该项目测试类的子代理:

---name: TestAgentdescription: |  当您需要为Java代码生成单元测试并执行它们以验证功能时,请使用此代理。此代理在实现新功能、进行代码更改或需要提高测试覆盖率时特别有用。代理将按照项目编码标准创建全面的单元测试并执行它们,以确保代码质量和正确性。
  <example>  Context:用户实现了一个新的服务方法并希望确保它正常工作  user: "我刚刚实现了新的用户认证服务方法,可以创建单元测试并运行吗?"  assistant: "我将使用TestAgent代理为您的认证服务方法创建并运行单元测试。"  </example>
  <example>  Context:用户希望改进现有组件的测试覆盖率  user: "OrderService覆盖测试"  assistant: "我将使用TestAgent代理为OrderService生成全面的单元测试并运行它们以验证功能。"</example>---您是Java应用程序的专家级测试生成和执行代理。您的主要职责是根据xx项目的编码标准和最佳实践,为Java代码创建全面的单元测试并执行它们以验证功能。## 测试类编写规范1. **继承BaseTest类**:所有测试类必须继承 `com.xx.BaseTest`,该基类已配置Spring Boot测试环境、Nacos配置和相关测试属性。2. **使用JUnit注解**:使用 `@Test` 注解标记测试方法,可使用JUnit 4或JUnit 5的@Test注解。3. **依赖注入**:使用 `@Autowired` 或 `@Resource` 注解注入需要测试的服务类或其他依赖项。4. **测试类命名规则**:   - ServiceImpl 测试类:`[Service实现类名]Test`,如 `XxxTest`   - 特定方法测试类:`[Service实现类名][特定方法名]Test`,如 `XxxSkuMinUnitPriceTest`   - Cache 类测试:`[Cache类名]Test`,如 `XxxTest`   - Mapper 类测试:`[Mapper类名]Test`,如 `XxxMapperTest`   - Listener 类测试:`[Listener类名]Test`,如 `XxxListenerTest`   - 所有测试类均以 `Test` 结尾5. **测试方法命名**:使用描述性的方法名,清晰表达测试的场景或目的,如 `testSkuMinUnitPriceWithUserProvidedParams` 或 `testBatchSpuMinUnitPriceV2`。6. **测试数据构建**:在测试方法中构建完整的测试数据,包括请求DTO对象和必要的业务参数。7. **测试逻辑组织**:   - 准备阶段:构建测试数据和参数   - 执行阶段:调用被测试的方法   - 验证阶段:输出结果或验证预期行为8. **输出和验证**:使用 `System.out.println` 输出测试结果以便验证,后续可添加断言进行自动化验证。9. **注释说明**:为复杂的测试逻辑添加注释,说明测试的目的和步骤。10. **异常处理**:根据需要在测试中包含异常处理逻辑。## 测试编写流程1. 分析被测试类和方法的功能2. 确定需要测试的场景和参数3. 构建测试数据和模拟对象4. 编写测试方法验证功能5. 执行测试并验证结果

封装快捷指令/test:

---type: project_commanddescription: 单元测试---请以「TestAgent」的角色(遵循 .qoder/agents/TestAgent.md 规范),对指定类进行单元测试

单元测试XxxService.singleSkuCouponCalculate()方法:

/test 测试方法 @XxxService 52-53,参数:{"bizSourceEnum":"ECOM_GOODS","calScene":1,"supplierId":122xx320,"memberPrice":388,"price":388,"spuId":17194xx176,"skuMinUnitPriceSimpleReqDTO":{"minUnitPrice":155,"needBuyNum":3},"userType":2,"skuId":171941937xx272,"skuNum":1}&16641xx4469152

此时生成了测试类并自动跑测试:

/** * XxxService 单元测试类 *  * @author TestAgent * @since 2025-06-26 */public class XxxServiceTest extends BaseTest {    @Autowired    private XxxService service;    /**     * 测试 singleSkuCouponCalculate 方法     * 使用用户提供的参数进行测试     */    @Test    public void testSingleSkuCouponCalculate() throws Exception {        // 构建请求参数,使用用户提供的参数        SingleCouponCalculateReqDTO reqDTO = new SingleCouponCalculateReqDTO()                .setBizSourceEnum(BizSourceEnum.ECOM_GOODS)  // bizSourceEnum: "ECOM_GOODS"                .setCalScene(1)  // calScene: 1                .setSupplierId(122xxx20L)  // supplierId:                 .setMemberPrice(388L)  // memberPrice: 388                .setPrice(388L)  // price: 388                .setSpuId(1719419xxx2176L)  // spuId:                 .setSkuMinUnitPriceSimpleReqDTO(new SingleCouponCalculateReqDTO.SkuMinUnitPriceSimpleReqDTO()                        .setMinUnitPrice(155L)  // minUnitPrice: 155                        .setNeedBuyNum(3))  // needBuyNum: 3                .setUserType(2)  // userType: 2 (店主)                .setSkuId(171941xxx1782272L)  // skuId:                 .setSkuNum(1);  // skuNum: 1        // 用户ID        Long userId = 1664138xxx69152L;        // 执行测试        SingleCouponCalculateRespDTO result = service.singleSkuCouponCalculate(reqDTO, userId);        // 验证结果不为null        assertNotNull("返回结果不应为null", result);
        // 根据业务逻辑验证结果的某些字段        // 注意:由于服务可能依赖于数据库和缓存,实际结果可能根据环境而变化        System.out.println("测试结果: " + result);    }}

测试双轨验证对比结果:

Image

后续BUGFIX:根据双轨执行结果去定位出现问题的位置,针对性修复即可。

经验总结:

  1. 针对大需求,特别是涉及代码重构的需求,需拆分成多个阶段去完成:

    - 先通过Spec-Driven Coding先完成整体的框架搭建,如工作流、策略模式、责任链的整个框架搭建

    - 后针对各个细分逻辑独立实现,灵活选择Spec-Driven Coding和Vibe Coding

  2. 大泥球(单类超过1500行代码)是「上下文刺客」,在代码重构迁移过程需要特别注意,最好还是先手动拆分一版再重构优化。

  3. 涉及非写入类重构场景的平稳过渡,可以采用双轨验证法+灰度组件实施

企业级复杂需求/重构的AI Coding案例,网上较少教程,需要我们不断优化流程、累积经验。

0x6

AI Coding落地建议

AI是研发效率的“放大器”,而非“替代者”。它能帮我们省去重复劳动、快速解决问题,但核心的业务逻辑设计、架构规划和代码校验,还得靠咱们自己。

结合不同角色的落地建议:

  1. 对于团队萌新

  • 前后端熟悉并逐步迁移至Qoder IDE进行开发

  • 复用项目.qoder/rules规则与.qoder/commands快捷指令,用 AI生成合规的基础代码,规避踩坑。

  • 让AI拆解复杂模块逻辑、解释代码设计思路,缩短独立开发适应期。

  • 把单元测试、简单 Bug 排查交给 AI,集中精力理解业务与架构。

  • 写代码前用 AI 明确需求边界,遇报错直接上传日志获取排查方案。

  • 用AI写GIT Commit,用好NES代码补全、提示词优化与Vibe Coding写简单需求。

  1. 对于团队老人

  • 将 CRUD、跨语言转换等重复工作交给 AI,聚焦核心逻辑设计与性能优化

  • 主导编写 Spec 规格说明,复杂需求按复杂度与依赖关系拆解成各个阶段子任务,灵活选择Spec-Driven Coding/Vibe Coding分阶段在多个上下文内实施,关注上下文窗口健康度,把控输出质量

  • 识别高频Prompt模板并沉淀到项目快捷指令.qoder/commands,提升团队 AI 协作效率

  • 借助 AI 多文件分析能力,快速定位线上复杂 Bug,减少排查时间

  • 组织内部分享复杂需求/重构的落地经验

  1. 对于研发组长 / 架构师

  • 牵头制定统一的.qoder/rules规则集,让 AI 成为团队规范的 “执行者”

  • 仓库WIKI构建与维护,AI会在Coding时会取最新WIKI进行参考

  • 参与SPEC方案评审,把控复杂需求SPEC质量,指导SPEC优化

  • 按需构建不同细分角色SubAgent子代理,最大程度压缩上下文窗口

  • 建立 AI 产出评审机制,统计代码采纳率,优化团队协作流程

  • 研究前沿AICoding技术与方法论,沉淀最佳实践,组织内部分享,培养 “AI 指挥官” 型团队,最大化 AI 效率价值

历史车轮滚滚前行,AI Coding已是不可逆的潮流与趋势,用好AI Coding,你就是AI代码指挥官。

Image

EOF

Image
关于「鹿Sir」

分享架构技术/IT资讯/牛马日常

电商·SaaS架构师/DDD极客,COLA-DDD/DDD4j框架作者

→关注公众号,撩小码鹿「已接入AI」

→加我备注“进群”,进技术大佬群学习

数据分析不踩坑

推荐关注「心里有点数」

专治数据看不懂,让你心里真有数

▼