在AI辅助开发逐渐成为主流的今天,我们面临一个根本性问题:AI如何真正理解一个产品的业务逻辑?传统开发模式下,新加入的工程师需要花费大量时间阅读文档、理解代码,而AI面临同样的困境。本文将分享我们通过SpecExtract和SpecExecute两个核心技能构建的解决方案——直接从产品代码中提取机器可读的规范(Spec),并实现基于Spec的自动化变更执行。
这个方案已经在真实项目中验证,成功从代码库提取出28个action、8个entity和4个rule的完整产品规范,并实现了包括添加compress参数、新建pdf_password模块在内的Delta变更。下面我将详细拆解这套方法的技术实现和实操要点。
在常规开发流程中,每当需要为一个产品添加新功能时,开发者必须经历以下循环:
code复制产品A新功能 → 理解产品A(3天) → 写代码(2天)
产品B新功能 → 理解产品B(3天) → 写代码(2天)
...
实际观察表明,开发者80%的时间花费在"理解产品"而非"编写代码"上。这种低效主要源于四个结构性问题:
在AI辅助开发场景下,这些问题被进一步放大。考虑一个典型场景:
用户对AI说:"帮我把VIP的API配额改成无限"
传统AI开发流程会这样处理:
code复制用户指令 → AI生成代码 → 执行
但由于缺乏产品规范理解,AI可能:
我们提出的解决方案是通过Spec建立产品理解的中间层:
code复制产品代码 → SpecExtract → 机器可读的Spec → AI基于Spec开发和定制
这套方案的核心价值在于:
我们的系统提供两个关键能力:
| 技能 | 功能 | 技术特点 |
|---|---|---|
| SpecExtract | 从代码提取规范 | 静态分析+动态追踪结合 |
| SpecExecute | 执行规范变更 | 差异计算+安全校验 |
虽然借鉴了OpenSpec的格式,但我们的系统有本质不同:
| 维度 | OpenSpec | 我们的方案 |
|---|---|---|
| 目标 | 人类协作 | AI驱动 |
| 来源 | 需求文档 | 产品代码 |
| 更新 | 手动维护 | 自动同步 |
| 粒度 | 功能级 | 代码级 |
规范的目录结构设计考虑了可扩展性和机器可读性:
code复制specs/{product}/
├── SPEC.md # 产品概览
├── actions/ # 操作定义
│ └── action_*.md # 每个操作单独文件
├── entities/ # 数据实体
│ └── entity_*.md # 每个实体单独文件
├── rules/ # 业务规则
│ └── rule_*.md # 每条规则单独文件
└── changes/ # 变更记录
└── {change-id}/
├── proposal.md # 变更背景
├── delta.md # 规范差异
├── design.md # 技术方案
└── archive.md # 执行结果
markdown复制# action_user_login.md
## Description
处理用户登录请求
## Scenarios
1. 正常登录
- Precondition: 用户已注册
- Steps:
1. 提交用户名密码
2. 验证凭证
3. 生成会话token
- Output: 登录成功响应
2. 密码错误
- Precondition: 用户已注册
- Steps: [...]
- Output: 错误提示
markdown复制# entity_user.md
## Fields
- id: string (required)
- name: string (max:100)
- roles: array<RoleEnum>
## Constraints
- 用户名必须唯一
- 密码强度要求:至少8字符,含大小写和数字
markdown复制# proposal.md
## Change Request
添加PDF文件密码保护功能
## Reason
客户需要符合ISO27001对敏感文档的保护要求
## Impact Analysis
- 新增pdf_password模块
- 修改文件上传逻辑
- 新增密码强度校验规则
以提取PDF处理模块规范为例:
代码扫描:
行为追踪:
规则提取:
规范生成:
需求:为PDF压缩添加密码保护
变更提案:
markdown复制# changes/pdf-password/proposal.md
## Change Request
在compress操作中添加密码参数
差异计算:
markdown复制# changes/pdf-password/delta.md
## actions/pdf_compress.md
+ Parameters:
+ password: string (required, min:8)
代码生成:
python复制# 生成的新代码
def compress(file, ratio, password=None):
if password:
validate_password_strength(password)
...
使用ANTLR解析多种语言的语法树,关键步骤:
基于AOP(面向切面编程)的实现:
java复制@Around("execution(* com.example..*(..))")
public Object traceMethod(ProceedingJoinPoint pjp) {
String method = pjp.getSignature().getName();
Object[] args = pjp.getArgs();
// 记录调用信息
SpecRecorder.record(method, args);
return pjp.proceed();
}
变更执行前的三层验证:
问题1:生成的Spec过于技术化
问题2:遗漏隐式规则
这套Spec驱动的开发方法已经在多个项目中得到验证,平均减少40%的新功能开发时间,同时显著降低了AI辅助开发的错误率。最令人惊喜的是,它使得产品知识不再依赖于个别"专家",而是成为了团队可共享的显性资产。