1个场景(618促销)5种范式(Spec-Vibe-Glue-TDD-Harness) ,企业级AI Coding经验分享(附代码示例)
公众号名称:沐然云计算
作者名称:吕昭波
发布时间:2026-05-10 00:25

核心观点速览
在618促销这样的大型项目中,我们通过实战验证了五种研发范式的价值,核心发现如下:
1. 范式无优劣,场景定选择
Spec Coding重文档、TDD重质量、Glue Coding重效率、Harness重交付、Vibe Coding重体验,没有绝对的好坏之分。
2. 资产复用是效率关键
复用春节促销和周年庆的Reference代码,618核心功能开发周期缩短60%,代码复用率达70%。
3. 规范先行保障质量
遵循AGENTS.md规范(命名、日志、异常处理),确保代码风格统一,降低维护成本。
4. 组合使用效果最佳
不同阶段采用不同范式:Spec Coding定需求、TDD保核心、Glue Coding提效率、Harness自动化、Vibe Coding优体验。
5. PM角色随范式调整
Spec Coding中PM主导需求,TDD中PM关注验收标准,Vibe Coding中PM聚焦用户体验。
6. 文档参考各有侧重
需求文档对应Spec Coding,测试文档对应TDD,Reference代码对应Glue Coding,部署文档对应Harness,设计稿对应Vibe Coding。
一、项目背景:站在巨人的肩膀上
在开始618促销开发之前,我们团队已经积累了丰富的技术资产,这为我们选择不同研发范式提供了坚实基础。
1.1 已有代码资产(Reference)
我们整理了去年春节促销和周年庆活动的核心代码:
Reference/
├── SpringFestivalPromotionService.java # 春节促销服务
│ ├── processOrder() # 处理订单优惠
│ ├── applyFullReduction() # 满减计算
│ ├── checkGiftEligibility() # 赠品资格判断
│ └── applyPointsMultiplier() # 积分翻倍
├── AnniversaryCouponService.java # 周年庆优惠券服务
│ ├── distributeCoupons() # 发放优惠券
│ ├── determineCouponAmount() # 按等级确定金额
│ └── batchDistribute() # 批量发放
└── PromotionConfig.java # 促销配置
├── springFestival # 春节配置
├── anniversary # 周年庆配置
└── configMap # 通用配置
1.2 研发规范(AGENTS.md)
项目已建立完善的研发规范:
| 规范类别 | 内容 |
| 技术栈 | Spring Boot 2.7.18、MyBatis-Plus 3.5.3.1 |
| 代码规范 | 使用@Slf4j日志、统一异常处理、事务管理 |
| 命名规范 | Service接口名、VO/DTO命名规则 |
| 永久红线 | 禁止修改财务模块 |
| 验证命令 | Maven编译、JUnit测试、Checkstyle检查 |
1.3 项目架构信息

二、618大促需求分析
整个方案不涉及客户信息,所以,这些都是Mock数据,模拟促销信息。当然,为了更真实的Mock,还Mock了618促销需求讨论的邮件.md、会议纪要.md。
所以,在这里我们重点关注中间的逻辑,而非具体需求或者功能本身。
2.1 核心需求
基于现有资产,我们需要实现:
-
1. 优惠券系统:用户领取、使用优惠券(可复用周年庆代码)
-
2. 满减优惠:满300减50(可复用春节满减逻辑)
-
3. 限时抢购:新增功能
-
4. 积分翻倍:可复用春节积分逻辑
2.2 技术要求
- 高并发:支持每秒10万级请求
- 高可用:系统可用性99.9%以上
- 数据一致性:库存扣减、优惠券核销必须准确
- 快速迭代:两周内完成开发和测试
三、多种研发范式实战
3.1 Spec Coding:文档先行,规范驱动
核心思想:先写完整的需求文档和设计规范,再严格按照文档进行代码实现。
切入点
从需求分析开始,结合现有Reference代码,明确”做什么”和”怎么做”。
实战过程
第一步:编写Spec文档(参考已有资产)
我们基于AGENTS.md规范编写了14份Spec文档:
01-Spec写作总则与文档编号索引.md
02-需求来源与采集记录.md
03-立项提案与范围说明.md
...
08-系统架构与技术选型.md → 参考现有架构设计
09-API接口规格.md → 参考AnniversaryCouponService
10-数据模型与存储规格.md → 参考现有表结构
...
14-需求追踪矩阵.md
第二步:识别可复用资产
| 需求 | 可复用资产 | 复用方式 |
| 优惠券领取 | AnniversaryCouponService | 直接复用 |
| 满减计算 | SpringFestivalPromotionService | 修改阈值 |
| 积分翻倍 | SpringFestivalPromotionService | 直接复用 |
第三步:设计新增功能
限时抢购功能需要全新设计:
// POST /api/promotion/flash-sale
{
"productId": 1001,
"userId": 12345,
"quantity": 1
}
关注点
| 关注点 | 说明 |
| 需求明确 | 结合Reference明确需求边界 |
| 设计先行 | 先设计后开发,避免返工 |
| 可追溯性 | 每个需求都能追溯到文档 |
| 团队协作 | 文档作为团队沟通桥梁 |
优缺点
优点:
- 需求清晰,减少歧义
- 设计严谨,架构清晰
- 可维护性强,便于后续迭代
- 适合大型团队协作
缺点:
- 前期投入大,文档编写耗时
- 灵活性不足,需求变更成本高
- 不适合快速迭代场景
3.2 基于Spec的TDD:测试先行,质量驱动
如果只是TDD,那么还是之前的TDD,如果基于Spec的TDD,会让TDD更严谨。
核心思想:先写测试用例,再实现代码,确保代码可测试性和正确性。
切入点
从测试场景出发,参考Reference代码定义”成功的标准”。
实战过程
第一步:参考Reference编写测试用例
@Test
voidtestReceiveCoupon_Success() {
// 参考AnniversaryCouponService的发放逻辑
UserCouponVOresult= couponService.receiveCoupon(userId, couponId);
assertEquals("AVAILABLE", result.getStatus());
}
@Test
voidtestFullReduction_618Rule() {
// 618规则:满300减50(参考春节满500减100)
BigDecimaltotal= BigDecimal.valueOf(700);
BigDecimaldiscount= promotionService.applyFullReduction(total);
assertEquals(BigDecimal.valueOf(100), discount); // 300*2=600,减100
}
@Test
voidtestFlashSale_Success() {
// 新增限时抢购测试
FlashSaleResultresult= flashSaleService.purchase(userId, productId, 1);
assertEquals("SUCCESS", result.getStatus());
}
第二步:运行测试(预期失败)
mvn test -pl order-service -Dtest=CouponServiceTest
第三步:实现代码(复用+新增)
@Service
publicclassPromotion618Service {
@Autowired
private AnniversaryCouponService couponService; // 复用
@Autowired
private SpringFestivalPromotionService springService; // 复用
@Transactional(rollbackFor = Exception.class)
public PromotionResult processOrder(Long orderId) {
Orderorder= orderMapper.selectById(orderId);
// 复用春节满减逻辑,修改618阈值
BigDecimaldiscount= applyFullReduction(order.getTotalAmount());
order.setDiscountAmount(discount);
// 复用周年庆优惠券逻辑
if (order.getCouponId() != null) {
couponService.validateAndUseCoupon(order.getUserId(), order.getCouponId());
}
// 新增:积分翻倍(复用春节逻辑)
springService.applyPointsMultiplier(order.getUserId(), order.getTotalAmount());
return convertToResult(order);
}
private BigDecimal applyFullReduction(BigDecimal totalAmount) {
// 618规则:满300减50
BigDecimalthreshold= BigDecimal.valueOf(300);
BigDecimalamount= BigDecimal.valueOf(50);
inttimes= totalAmount.divide(threshold, RoundingMode.DOWN).intValue();
return amount.multiply(BigDecimal.valueOf(times));
}
}
关注点
| 关注点 | 说明 |
| 测试覆盖 | 确保核心逻辑有测试覆盖 |
| 可测试性 | 代码设计考虑可测试性 |
| 质量保障 | 测试驱动开发,代码质量高 |
| 重构安全 | 测试保障重构不破坏功能 |
优缺点
优点:
- 代码质量高,测试覆盖充分
- 可测试性好,便于维护
- 重构安全,测试作为安全网
- 适合核心业务逻辑
缺点:
- 开发周期较长
- 初期投入大
- 对测试人员要求高
3.3 Glue Coding:复用先行,效率驱动
“天下文章一大抄”,就是说的Glue Coding。项目中已经有稳定的代码框架和模板了,就没必要让AI再重新生成一遍代码,重新生成一定带来更多隐患和检查代价。
核心思想:优先复用现有代码和组件,快速拼接实现新功能。
切入点
从Reference代码出发,寻找可复用的组件。
实战过程
第一步:识别可复用组件
// 参考Reference目录结构
@Component
publicclassPromotionComponentScanner {
public Map scanReusableComponents() {
Map components = newHashMap<>();
// 扫描春节促销代码
components.put("fullReduction", newSpringFestivalPromotionService());
components.put("pointsMultiplier", newSpringFestivalPromotionService());
// 扫描周年庆代码
components.put("couponDistributor", newAnniversaryCouponService());
components.put("levelCalculator", newAnniversaryCouponService());
// 扫描配置
components.put("config", newPromotionConfig());
return components;
}
}
第二步:组合复用组件
@Service
publicclassPromotion618Service {
@Autowired
private AnniversaryCouponService couponService; // 直接注入
@Autowired
private PromotionConfig promotionConfig;
@Value("${promotion.618.full-reduction.threshold:300}")
private BigDecimal threshold;
@Value("${promotion.618.full-reduction.amount:50}")
private BigDecimal amount;
@Transactional(rollbackFor = Exception.class)
public PromotionResult processOrder(Long orderId) {
Orderorder= orderMapper.selectById(orderId);
// 复用春节满减逻辑(修改参数)
BigDecimaldiscount= calculateDiscount(order.getTotalAmount());
order.setDiscountAmount(discount);
// 复用周年庆优惠券验证
if (order.getCouponId() != null) {
couponService.validateAndUseCoupon(order.getUserId(), order.getCouponId());
}
return convertToResult(order);
}
private BigDecimal calculateDiscount(BigDecimal totalAmount) {
// 复用SpringFestivalPromotionService的计算逻辑
inttimes= totalAmount.divide(threshold, RoundingMode.DOWN).intValue();
return amount.multiply(BigDecimal.valueOf(times));
}
}
第三步:配置618活动参数
# application.yml
promotion:
618:
enabled: true
start-time: 2026-06-01T00:00:00
end-time: 2026-06-18T23:59:59
full-reduction:
threshold: 300
amount: 50
关注点
| 关注点 | 说明 |
| 代码复用 | 最大化复用Reference代码 |
| 快速开发 | 缩短开发周期 |
| 一致性 | 保持代码风格与现有一致 |
| 配置化 | 可变参数外部配置 |
优缺点
优点:
- 开发速度快(复用已有代码)
- 代码质量有保障(经过验证的代码)
- 代码一致性好
- 适合快速迭代
缺点:
- 可能受限于现有代码结构
- 需要良好的代码资产积累
- 可能引入不必要的依赖
3.4 Harness:自动化先行,交付驱动
整体是个框架,限制边界。
核心思想:建立自动化的CI/CD流水线,实现从代码提交到生产部署的全流程自动化。
切入点
从部署流程出发,结合现有基础设施构建自动化能力。
实战过程
第一步:配置CI流水线(复用已有配置)
stage:
name:构建阶段
type:CI
spec:
codebase:
repo:https://github.com/example/order-service
branch:feature/618-promotion
build:
type:Maven
spec:
pomPath:pom.xml
goals:cleanpackage-DskipTests
artifacts:
-name:order-service.jar
path: target/order-service-1.0.0.jar
第二步:配置CD流水线(参考现有部署规范)
stage:
name:部署阶段
type:CD
spec:
environment:测试环境
deploymentType:Kubernetes
strategy:
type:RollingUpdate
spec:
maxSurge:25%
maxUnavailable:25%
manifest:
type:Helm
spec:
chartPath:charts/order-service
values:
replicaCount:5
env:
-name:PROMOTION_ENABLED
value:"true"
-name:PROMOTION_THRESHOLD
value: "300"
第三步:配置持续验证
stage:
name:验证阶段
type:Verify
spec:
duration:30m
metrics:
-name:响应时间
query:avg(http_request_duration_seconds)
threshold:500ms
-name:错误率
query:sum(http_requests_total{status=~"5..*"})/sum(http_requests_total)
threshold:5%
onFailure:
action: rollback
关注点
| 关注点 | 说明 |
| 自动化部署 | 代码提交自动触发部署 |
| 持续验证 | 部署后持续监控 |
| 智能回滚 | 自动检测问题并回滚 |
| 可观测性 | 实时监控和告警 |
优缺点
优点:
- 部署效率高
- 可靠性强,自动回滚
- 可观测性好
- 适合持续交付
缺点:
- 前期配置复杂
- 需要一定的DevOps能力
- 基础设施要求高
3.5 Vibe Coding:体验先行,氛围驱动
没想到吧,Vibe Coding在企业场景也有用处的,有很大的作用。
核心思想:通过快速原型验证用户体验和交互设计,强调情感化设计和用户感受。
切入点
从用户体验出发,快速验证交互效果和视觉风格。
实战过程
第一步:快速原型设计
0
6
:
1
8
内容效果不满意?点此反馈