AI编程01:Codex使用技巧
从任务拆分、上下文提供、结果验收三个维度,掌握如何高效使用Codex提升日常开发效率。
Codex 不是一次性代码生成器,而是可以持续配合的编程伙伴。用好 Codex 的关键在于:把大任务拆成小任务、提供准确的上下文、建立有效的验收机制。
任务拆分的艺术
为什么要拆分
| 问题类型 | 不拆分的后果 | 拆分后的效果 |
|---|---|---|
| 大功能需求 | Codex 生成的代码不完整或不符合预期 | 每个小任务都能得到准确的代码 |
| 复杂逻辑 | 生成的代码难以理解和维护 | 逻辑清晰,易于调试 |
| 多步骤任务 | 上下文丢失,生成质量下降 | 每个步骤都有完整的上下文 |
| 跨模块修改 | 生成的代码可能破坏现有结构 | 逐步修改,风险可控 |
拆分原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 单一职责 | 每个任务只做一件事 | ”实现用户注册功能” → “实现用户注册接口” |
| 边界清晰 | 明确输入输出和依赖 | ”输入用户信息,输出注册结果,依赖 UserService” |
| 可验证 | 每个任务都有明确的验收标准 | ”注册成功后返回用户ID和Token” |
| 循序渐进 | 从简单到复杂逐步推进 | 先实现接口,再实现业务逻辑,最后实现验证 |
拆分示例
原始需求:实现一个电商订单系统
拆分后:
1. 设计订单数据模型
2. 实现订单创建接口
3. 实现订单查询接口
4. 实现订单状态更新接口
5. 实现订单取消接口
6. 实现订单支付接口
7. 实现订单发货接口
8. 实现订单退款接口
9. 实现订单统计接口
10. 添加订单相关的单元测试
上下文提供技巧
上下文的种类
| 上下文类型 | 作用 | 示例 |
|---|---|---|
| 代码上下文 | 让 Codex 了解现有代码结构 | 粘贴相关类、方法、接口定义 |
| 业务上下文 | 让 Codex 理解业务逻辑 | 描述业务流程和规则 |
| 技术栈上下文 | 让 Codex 使用正确的技术 | 指定语言、框架、库版本 |
| 约束上下文 | 让 Codex 遵守特定限制 | 指定设计模式、编码规范、性能要求 |
| 输出格式上下文 | 让 Codex 按指定格式输出 | 指定代码结构、注释风格、测试框架 |
如何提供有效上下文
| 技巧 | 说明 | 示例 |
|---|---|---|
| 粘贴相关代码 | 只粘贴与当前任务相关的代码 | 需要修改一个方法时,只粘贴该方法及其依赖 |
| 描述业务规则 | 清晰描述业务逻辑和边界条件 | ”订单金额超过100元免运费” |
| 指定技术约束 | 指定必须使用的技术栈 | ”使用 Spring Boot 3.0 + Java 21” |
| 提供示例 | 提供输入输出示例 | ”输入: 订单ID=1, 输出: 订单详情JSON” |
| 定义验收标准 | 明确说明什么是正确的结果 | ”接口返回HTTP 200,包含订单ID、状态、金额” |
上下文提供示例
任务:实现用户登录接口
上下文:
- 技术栈:Spring Boot 3.0 + Java 21 + MySQL
- 用户表结构:id, username, password(BCrypt加密), email, created_at
- 现有代码:UserRepository.java, AuthService.java
- 输出格式:返回 JWT Token
- 验收标准:
1. 用户名密码正确返回 Token
2. 用户名不存在返回错误
3. 密码错误返回错误
4. Token 有效期为 24 小时
提供的代码:
// UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
// AuthService.java
@Service
public class AuthService {
private final UserRepository userRepository;
public AuthService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 需要实现登录方法
}
结果验收机制
验收的三个层次
| 层次 | 检查内容 | 方法 |
|---|---|---|
| 语法检查 | 代码是否能编译通过 | IDE 编译、Maven 构建 |
| 逻辑检查 | 代码是否符合业务逻辑 | 单元测试、集成测试 |
| 质量检查 | 代码是否符合质量标准 | 代码审查、静态分析工具 |
验收流程
1. 接收 Codex 生成的代码
2. 检查代码语法是否正确
3. 运行单元测试验证逻辑
4. 人工审查代码质量
5. 如果有问题,提供反馈给 Codex
6. Codex 修复后重复验收流程
7. 验收通过后提交代码
如何给 Codex 有效反馈
| 反馈类型 | 说明 | 示例 |
|---|---|---|
| 指出错误 | 明确说明哪里错了 | ”第15行的变量名应该是 orderId,不是 order_id” |
| 提供预期 | 说明期望的结果 | ”应该返回 Token,而不是用户对象” |
| 给出约束 | 说明必须遵守的规则 | ”密码必须使用 BCrypt 加密” |
| 提供示例 | 提供正确的示例 | ”正确的写法应该是:BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();“ |
反馈示例
Codex 生成的代码:
public String login(String username, String password) {
User user = userRepository.findByUsername(username).orElse(null);
if (user == null) {
return "用户不存在";
}
if (user.getPassword().equals(password)) {
return generateToken(user);
}
return "密码错误";
}
反馈:
1. 密码比较方式错误,应该使用 BCryptPasswordEncoder.matches() 方法
2. 返回值应该是 Token 字符串或抛出异常,而不是返回错误消息字符串
3. 请使用 ResponseEntity 包装返回结果
期望的返回格式:
- 成功:ResponseEntity.ok(JwtResponse)
- 失败:ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(errorMessage)
Codex 使用最佳实践
日常开发流程
1. 明确开发任务
2. 拆分任务为小步骤
3. 为每个步骤提供上下文
4. 让 Codex 生成代码
5. 验收生成的代码
6. 如有问题,反馈给 Codex 修复
7. 逐步推进完成所有任务
8. 集成测试和代码审查
代码审查流程
1. 使用 Codex 生成代码初稿
2. 人工审查代码质量
3. 使用 Codex 辅助重构
4. 使用 Codex 生成测试用例
5. 运行测试验证
6. 最终代码审查
学习新技术流程
1. 向 Codex 询问技术概念
2. 让 Codex 提供示例代码
3. 分析示例代码理解原理
4. 让 Codex 帮助实现小功能
5. 逐步深入理解技术细节
6. 总结学习心得
常见问题与解决方案
问题1:生成的代码不符合预期
表现:Codex 生成的代码与需求不符
解决方案:
- 提供更详细的上下文
- 明确指定技术栈和约束
- 提供输入输出示例
- 将大任务拆分为小任务
问题2:生成的代码有错误
表现:代码无法编译或运行出错
解决方案:
- 运行编译检查
- 执行单元测试
- 提供错误信息给 Codex
- 让 Codex 修复错误
问题3:上下文丢失
表现:Codex 忘记了之前提供的信息
解决方案:
- 在每个任务中重复关键上下文
- 使用聊天模式保持对话
- 将相关代码组织在一起提供
问题4:生成的代码质量差
表现:代码难以理解、维护性差
解决方案:
- 指定编码规范和设计模式
- 让 Codex 生成注释
- 使用静态分析工具检查
- 人工审查后让 Codex 重构
问题5:生成速度慢
表现:Codex 响应时间过长
解决方案:
- 减少单次请求的代码量
- 拆分任务为更小的步骤
- 提供更简洁的上下文
- 使用异步方式等待结果
项目判断清单
- 需要快速实现功能原型 → 使用 Codex 生成代码框架
- 不熟悉某技术栈 → 让 Codex 提供示例和解释
- 需要编写大量重复代码 → 让 Codex 批量生成
- 代码质量需要提升 → 让 Codex 辅助重构
- 缺少单元测试 → 让 Codex 生成测试用例
- 学习新代码库 → 让 Codex 帮助理解代码
- 生成代码不符合预期 → 检查上下文是否完整
- 生成代码有错误 → 运行测试并提供反馈
- 需要持续修改 → 使用聊天模式保持上下文