AI编程02:Codex工作流
把Codex当成结对工程师使用,建立从需求分析到代码交付的完整工作流,而不是只让它生成一段代码。
把 Codex 当成结对工程师,意味着建立一套完整的协作流程:从需求理解开始,经过设计、实现、测试、审查,直到代码交付。这套流程不是一次性的代码生成,而是持续的人机协作。
需求分析阶段
需求澄清
| 步骤 | 说明 | 示例 |
|---|---|---|
| 理解目标 | 明确需求的核心目标 | ”实现用户注册功能” |
| 定义边界 | 明确功能范围和约束 | ”只实现基本注册,不包含邮箱验证” |
| 识别依赖 | 识别需要的依赖和资源 | ”需要 UserRepository、AuthService” |
| 确认验收 | 明确验收标准 | ”注册成功返回用户ID和Token” |
需求分析示例
原始需求:实现用户注册
分析过程:
1. 目标:创建新用户并返回认证信息
2. 边界:
- 用户名唯一
- 密码至少6位
- 邮箱格式正确
3. 依赖:
- User 实体类
- UserRepository
- BCryptPasswordEncoder
- JwtUtil
4. 验收:
- HTTP 201 Created
- 返回 UserResponse DTO
- 密码加密存储
与 Codex 协作
用户:帮我分析这个需求
Codex:好的,请提供需求描述
用户:实现用户注册功能
Codex:让我帮你分析这个需求:
- 核心目标:创建新用户账户
- 需要的功能:
1. 用户信息验证(用户名、密码、邮箱)
2. 密码加密存储
3. 用户数据持久化
4. 返回认证Token
- 技术依赖:
- Spring Boot、JPA、BCrypt、JWT
- 验收标准:
- 用户名重复返回错误
- 密码强度验证
- 邮箱格式验证
- 注册成功返回Token
用户:补充一下,密码需要至少8位,包含大小写字母和数字
Codex:好的,已更新密码验证规则
设计阶段
技术方案设计
| 设计维度 | 内容 | 示例 |
|---|---|---|
| 数据模型 | 实体类设计 | User 实体:id, username, password, email |
| API 设计 | 接口定义 | POST /api/auth/register |
| 业务流程 | 核心流程 | 验证 → 加密 → 保存 → 生成Token |
| 异常处理 | 错误场景 | 用户名重复、密码不符合要求 |
| 安全设计 | 安全措施 | 密码加密、输入验证 |
设计文档示例
用户注册功能设计
1. 数据模型
- User: id(Long), username(String), password(String), email(String), created_at(LocalDateTime)
2. API 设计
- POST /api/auth/register
- 请求体:{ "username": "string", "password": "string", "email": "string" }
- 成功响应:{ "id": 1, "username": "user", "email": "user@example.com", "token": "..." }
- 失败响应:{ "code": 400, "message": "用户名已存在" }
3. 业务流程
1. 接收注册请求
2. 验证用户名是否已存在
3. 验证密码强度
4. 验证邮箱格式
5. 使用 BCrypt 加密密码
6. 保存用户到数据库
7. 生成 JWT Token
8. 返回用户信息和Token
4. 异常处理
- 用户名重复:HTTP 409 Conflict
- 密码不符合要求:HTTP 400 Bad Request
- 邮箱格式错误:HTTP 400 Bad Request
与 Codex 协作
用户:帮我设计用户注册功能
Codex:好的,请提供现有代码结构
用户:[粘贴现有实体类和配置]
Codex:这是设计方案...
用户:密码验证规则需要更严格,至少10位,包含特殊字符
Codex:已更新密码验证规则:
- 至少10位
- 包含大小写字母
- 包含数字
- 包含特殊字符(@#$%^&*)
用户:请生成完整的设计文档
Codex:好的,这是完整的设计文档...
实现阶段
代码实现流程
| 步骤 | 说明 | 示例 |
|---|---|---|
| 实体类 | 实现数据模型 | User.java |
| Repository | 实现数据访问 | UserRepository.java |
| Service | 实现业务逻辑 | AuthService.java |
| Controller | 实现 API 接口 | AuthController.java |
| DTO | 实现数据传输对象 | RegisterRequest.java, UserResponse.java |
| 配置 | 添加必要配置 | SecurityConfig.java |
实现示例
用户:帮我实现用户注册功能的 Service 层
Codex:好的,请提供相关代码
用户:[粘贴 User.java, UserRepository.java]
Codex:这是 AuthService.java 的实现:
@Service
public class AuthService {
private final UserRepository userRepository;
private final BCryptPasswordEncoder passwordEncoder;
private final JwtUtil jwtUtil;
public AuthService(UserRepository userRepository,
BCryptPasswordEncoder passwordEncoder,
JwtUtil jwtUtil) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
this.jwtUtil = jwtUtil;
}
public UserResponse register(RegisterRequest request) {
// 验证用户名是否已存在
if (userRepository.existsByUsername(request.getUsername())) {
throw new UsernameAlreadyExistsException();
}
// 创建用户
User user = new User();
user.setUsername(request.getUsername());
user.setPassword(passwordEncoder.encode(request.getPassword()));
user.setEmail(request.getEmail());
// 保存用户
User savedUser = userRepository.save(user);
// 生成 Token
String token = jwtUtil.generateToken(savedUser.getId(), savedUser.getUsername());
return UserResponse.fromEntity(savedUser, token);
}
}
用户:帮我实现 Controller 层
Codex:好的,这是 AuthController.java...
代码审查
| 审查维度 | 检查内容 | 示例 |
|---|---|---|
| 代码质量 | 可读性、可维护性 | 变量命名、方法拆分 |
| 逻辑正确性 | 业务逻辑是否正确 | 验证逻辑、异常处理 |
| 安全性 | 是否存在安全隐患 | SQL 注入、密码明文存储 |
| 性能 | 是否存在性能问题 | N+1 查询、重复计算 |
| 规范 | 是否符合编码规范 | 代码格式、注释 |
测试阶段
测试用例设计
| 测试类型 | 测试场景 | 示例 |
|---|---|---|
| 单元测试 | 单个方法的测试 | AuthService.register() |
| 集成测试 | 多个模块的交互 | Controller + Service + Repository |
| 边界测试 | 边界条件测试 | 空用户名、最小密码长度 |
| 异常测试 | 异常场景测试 | 用户名重复、密码不符合要求 |
测试代码示例
用户:帮我为用户注册功能生成单元测试
Codex:好的,请提供相关代码
用户:[粘贴 AuthService.java]
Codex:这是 AuthServiceTest.java:
@SpringBootTest
class AuthServiceTest {
@Autowired
private AuthService authService;
@Autowired
private UserRepository userRepository;
@AfterEach
void tearDown() {
userRepository.deleteAll();
}
@Test
void register_Success() {
RegisterRequest request = new RegisterRequest();
request.setUsername("testuser");
request.setPassword("Password123!");
request.setEmail("test@example.com");
UserResponse response = authService.register(request);
assertNotNull(response.getId());
assertEquals("testuser", response.getUsername());
assertNotNull(response.getToken());
User savedUser = userRepository.findByUsername("testuser").orElse(null);
assertNotNull(savedUser);
assertTrue(passwordEncoder.matches("Password123!", savedUser.getPassword()));
}
@Test
void register_UsernameExists() {
// 先创建一个用户
User existingUser = new User();
existingUser.setUsername("testuser");
existingUser.setPassword("encodedPassword");
userRepository.save(existingUser);
RegisterRequest request = new RegisterRequest();
request.setUsername("testuser");
request.setPassword("Password123!");
request.setEmail("test@example.com");
assertThrows(UsernameAlreadyExistsException.class,
() -> authService.register(request));
}
}
测试执行流程
1. 编写测试用例
2. 运行单元测试
3. 检查测试结果
4. 修复失败的测试
5. 运行集成测试
6. 检查集成测试结果
7. 修复集成测试问题
8. 运行完整测试套件
交付阶段
代码提交
| 步骤 | 说明 | 示例 |
|---|---|---|
| 代码审查 | 人工审查代码 | Code Review |
| 测试验证 | 运行完整测试套件 | mvn test |
| 代码格式化 | 格式化代码 | mvn formatter:format |
| 提交代码 | 提交到版本控制 | git commit |
| 代码推送 | 推送到远程仓库 | git push |
提交信息规范
| 类型 | 说明 | 示例 |
|---|---|---|
| feat | 新功能 | feat: 实现用户注册功能 |
| fix | 修复 bug | fix: 修复密码验证逻辑 |
| refactor | 代码重构 | refactor: 重构 AuthService |
| test | 添加测试 | test: 添加用户注册单元测试 |
| docs | 更新文档 | docs: 更新API文档 |
Codex 工作流最佳实践
完整工作流示例
1. 需求分析
- 与产品经理确认需求
- 使用 Codex 辅助分析需求边界
- 明确验收标准
2. 设计阶段
- 设计数据模型和 API
- 使用 Codex 生成设计文档
- 与团队评审设计方案
3. 实现阶段
- 使用 Codex 生成代码框架
- 逐步实现各个模块
- 使用 Codex 辅助代码审查
4. 测试阶段
- 使用 Codex 生成测试用例
- 运行测试并修复问题
- 使用 Codex 辅助调试
5. 交付阶段
- 代码审查和测试验证
- 提交并推送代码
- 更新文档
高效协作技巧
| 技巧 | 说明 | 示例 |
|---|---|---|
| 保持上下文 | 在整个工作流中保持对话 | 使用聊天模式持续协作 |
| 逐步推进 | 每个阶段完成后再进入下一个阶段 | 设计确认后再实现 |
| 及时反馈 | 发现问题及时反馈给 Codex | ”这里逻辑有问题,请修改” |
| 人工审查 | 关键逻辑需要人工确认 | 安全相关代码必须人工审查 |
| 文档驱动 | 先写文档再写代码 | 先设计 API 文档 |
团队协作
| 角色 | 职责 | Codex 辅助 |
|---|---|---|
| 产品经理 | 定义需求 | 需求分析、验收标准 |
| 架构师 | 技术方案设计 | 生成设计文档、技术选型 |
| 开发工程师 | 代码实现 | 生成代码、测试、重构 |
| 测试工程师 | 测试用例设计 | 生成测试代码、边界测试 |
| 运维工程师 | 部署和运维 | 生成部署脚本、配置文件 |
常见问题与解决方案
问题1:需求理解偏差
表现:实现的功能与需求不符
解决方案:
- 需求分析阶段充分沟通
- 使用 Codex 辅助需求澄清
- 先写设计文档再实现
- 定期与产品经理确认
问题2:技术方案不合理
表现:设计的方案存在性能或安全问题
解决方案:
- 设计阶段进行技术评审
- 使用 Codex 评估不同方案
- 参考最佳实践
- 考虑扩展性和可维护性
问题3:代码质量不高
表现:生成的代码难以维护
解决方案:
- 指定编码规范
- 使用静态分析工具
- 人工审查代码
- 使用 Codex 辅助重构
问题4:测试覆盖不全
表现:存在未测试的代码路径
解决方案:
- 使用 Codex 生成测试用例
- 设计边界测试和异常测试
- 运行代码覆盖率工具
- 补充缺失的测试
问题5:交付延迟
表现:项目进度落后
解决方案:
- 合理拆分任务
- 优先实现核心功能
- 使用 Codex 提高效率
- 及时沟通进度问题
项目判断清单
- 需要快速迭代 → 使用 Codex 辅助实现
- 需求不明确 → 先用 Codex 辅助需求分析
- 技术方案不确定 → 使用 Codex 评估多种方案
- 代码质量需要提升 → 使用 Codex 辅助重构
- 测试覆盖不足 → 使用 Codex 生成测试用例
- 需要编写文档 → 使用 Codex 辅助文档编写
- 团队协作困难 → 使用 Codex 作为沟通桥梁
- 交付压力大 → 使用 Codex 提高开发效率