不是AI取代程序员,是会用AI的程序员取代不会用AI的程序员。这篇文章分享我每天用AI编程助手的真实工作流。

大家好,我是卷毛。

先用数据说话:

使用AI编程助手前后对比(我的真实数据):

                    使用前        使用后       节省
日均编码时间        8小时         6小时        2小时
写CRUD接口          40分钟/个     8分钟/个     32分钟
写单元测试          30分钟/个     8分钟/个     22分钟
Code Review        60分钟        35分钟       25分钟
调试排Bug           90分钟/个     45分钟/个    45分钟
写技术文档          60分钟        15分钟       45分钟

每月节省时间:约40小时 ≈ 5个工作日

这不是吹牛,这是我用了半年AI编程助手的真实数据。今天把我的工作流分享出来,每个场景都附具体操作步骤


工具选择:我用什么?

日常开发主力:GitHub Copilot(IDEA插件)
  → 代码补全、生成测试、解释代码

复杂问题分析:DeepSeek / ChatGPT
  → 架构设计、技术选型、疑难杂症

代码审查:AI Code Review(GitHub Actions)
  → PR自动审查、安全漏洞检测

文档生成:Spring AI + ChatClient
  → 自动生成API文档、注释、变更日志

# 不需要全用,选1-2个趁手的就行
# 核心原则:AI是副驾驶,你才是主驾驶

场景一:快速写CRUD接口(省32分钟/个)

传统方式

1. 写Entity → 5分钟
2. 写Mapper → 5分钟
3. 写XML → 10分钟
4. 写Service → 8分钟
5. 写Controller → 7分钟
6. 写DTO → 5分钟
总计:40分钟

AI辅助方式

// Step 1: 用AI生成Entity
// 给AI提示:
// "生成一个订单实体类,字段包括:订单号、用户ID、商品名称、数量、金额、状态、创建时间、更新时间。使用JPA注解,状态用枚举。"

@Entity
@Table(name = "orders")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true, length = 32)
    private String orderNo;

    @Column(nullable = false)
    private Long userId;

    @Column(nullable = false, length = 128)
    private String productName;

    @Column(nullable = false)
    private Integer quantity;

    @Column(nullable = false, precision = 10, scale = 2)
    private BigDecimal amount;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, length = 16)
    private OrderStatus status;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

public enum OrderStatus {
    PENDING, PAID, SHIPPED, DELIVERED, CANCELLED, REFUNDED
}

// Step 2: Copilot补全Mapper和Service
// 写完Entity后,Copilot会自动建议Mapper和Service代码
// 按Tab接受,稍作修改即可

// Step 3: 用AI生成Controller
// 选中Entity和Service → 右键 → Copilot → Generate REST Controller
// 自动生成增删改查接口

我的提示词模板

# CRUD生成提示词(存为模板,重复使用)

请基于以下信息生成完整的REST API代码:

实体类:[粘贴Entity]
要求:
1. Controller包含CRUD接口,RESTful风格
2. Service层包含业务逻辑
3. 使用Spring Boot 3.x + Java 21
4. 统一返回ResponseEntity<Result<T>>
5. 参数校验使用@Valid
6. 异常处理使用@ExceptionHandler
7. 分页查询使用Pageable

输出:Controller + Service + ServiceImpl + DTO

场景二:自动生成单元测试(省22分钟/个)

传统方式

手动写测试用例:30分钟
→ 想测试场景
→ 构造mock数据
→ 写断言
→ 补充边界情况

AI辅助方式

// 选中要测试的方法 → 右键 → Copilot → Generate Tests

// AI生成的测试用例:
@SpringBootTest
class OrderServiceTest {

    @Mock
    private OrderMapper orderMapper;

    @Mock
    private UserService userService;

    @InjectMocks
    private OrderService orderService;

    @Test
    @DisplayName("创建订单 - 正常流程")
    void createOrder_success() {
        // Given
        OrderRequest request = OrderRequest.builder()
            .userId(1L)
            .productName("Java编程思想")
            .quantity(1)
            .amount(new BigDecimal("99.00"))
            .build();

        User mockUser = new User(1L, "卷毛", UserLevel.VIP);
        when(userService.findById(1L)).thenReturn(mockUser);
        when(orderMapper.insert(any(Order.class))).thenReturn(1);

        // When
        OrderResult result = orderService.createOrder(request);

        // Then
        assertNotNull(result);
        assertEquals(OrderStatus.PENDING, result.getStatus());
        assertEquals("VIP折扣已应用", result.getDiscountDesc());
        verify(orderMapper, times(1)).insert(any(Order.class));
    }

    @Test
    @DisplayName("创建订单 - 用户不存在")
    void createOrder_userNotFound() {
        when(userService.findById(999L)).thenReturn(null);

        assertThrows(UserNotFoundException.class, () -> {
            orderService.createOrder(OrderRequest.builder()
                .userId(999L)
                .productName("test")
                .quantity(1)
                .amount(BigDecimal.ONE)
                .build());
        });
    }

    @Test
    @DisplayName("创建订单 - 数量为0")
    void createOrder_zeroQuantity() {
        OrderRequest request = OrderRequest.builder()
            .userId(1L)
            .quantity(0)  // 边界值
            .amount(BigDecimal.ZERO)
            .build();

        assertThrows(InvalidOrderException.class, () -> {
            orderService.createOrder(request);
        });
    }

    @Test
    @DisplayName("创建订单 - VIP用户享受额外折扣")
    void createOrder_vipDiscount() {
        // 测试VIP专属逻辑
    }
}

AI生成测试的改进技巧

# 提示词模板

请为以下方法生成JUnit5单元测试:

[粘贴方法代码]

要求:
1. 使用Mockito进行依赖Mock
2. 覆盖以下场景:
   - 正常流程
   - 空值/null场景
   - 边界值(0、负数、最大值)
   - 异常场景
3. 使用@DisplayName描述每个测试
4. 使用Given-When-Then结构
5. 断言要具体,不要只断言notNull

场景三:快速调试和排查Bug(省45分钟/个)

传统方式

1. 看报错信息 → 不懂
2. 搜Stack Overflow → 找到类似的但不完全一样
3. 加断点调试 → 逐行跟踪
4. 查日志 → 日志不够详细
5. 请教同事 → 等他有空
总计:90分钟

AI辅助方式

// Step 1: 把报错信息丢给AI
// 提示词:
// "我的Spring Boot应用启动报错,以下是完整错误日志。
// 请分析原因并给出解决方案。
// [粘贴错误日志]"

// AI分析示例:
// 报错:java.lang.IllegalStateException: Failed to load ApplicationContext
// 原因:Bean循环依赖
// A → B → C → A
//
// AI回答:
// "这是一个循环依赖问题。Bean A注入B,B注入C,C又注入A。
// 解决方案:
// 1. 使用@Lazy注解延迟加载
// 2. 重构代码,提取公共逻辑到第四个Bean
// 3. 使用ApplicationContextAware手动获取
// 4. Spring Boot 2.6+在application.yml设置spring.main.allow-circular-references=true(不推荐)"

// Step 2: 让AI帮你加调试日志
// 提示词:
// "这段代码在并发环境下偶尔返回错误结果,帮我加调试日志定位问题。
// [粘贴代码]"

// AI会帮你加上关键节点的日志:
public Order processOrder(Long orderId) {
    log.debug("[processOrder开始] orderId={}", orderId);

    Order order = orderDao.findById(orderId);
    log.debug("[查询订单] order={}, status={}", order, order.getStatus());

    if (order.getStatus() != OrderStatus.PENDING) {
        log.warn("[状态异常] 期望PENDING,实际={}", order.getStatus());
        throw new IllegalStateException("订单状态不允许操作");
    }

    // ... 处理逻辑
    log.debug("[processOrder结束] orderId={}, result={}", orderId, result);
    return result;
}

// Step 3: 让AI分析性能瓶颈
// 提示词:
// "这个接口响应时间从200ms涨到2000ms,以下是代码和链路追踪截图。
// 请分析可能的性能瓶颈。
// [粘贴代码] [粘贴追踪信息]"

// AI会指出:
// 1. 第45行有N+1查询问题
// 2. 第67行在循环里调用RPC
// 3. 第89行有重复计算
// 并给出优化建议

场景四:自动生成技术文档(省45分钟/次)

传统方式

手写API文档:60分钟
→ 整理接口列表
→ 写请求/响应格式
→ 写示例
→ 写错误码
→ 维护更新

AI辅助方式

// Step 1: 用AI生成Swagger注解
// 选中Controller → 右键 → Copilot → Generate Documentation

// AI自动添加:
@RestController
@RequestMapping("/api/orders")
@Tag(name = "订单管理", description = "订单相关接口")
public class OrderController {

    @PostMapping
    @Operation(
        summary = "创建订单",
        description = "根据商品信息和用户ID创建订单,返回订单详情。VIP用户享受额外折扣。"
    )
    @ApiResponses({
        @ApiResponse(responseCode = "201", description = "创建成功"),
        @ApiResponse(responseCode = "400", description = "参数校验失败"),
        @ApiResponse(responseCode = "404", description = "用户不存在"),
        @ApiResponse(responseCode = "409", description = "库存不足")
    })
    public ResponseEntity<Result<OrderVO>> createOrder(
        @Valid @RequestBody @Parameter(description = "订单创建请求") OrderCreateRequest request,
        @RequestHeader("X-User-Id") Long userId
    ) {
        OrderVO order = orderService.create(request, userId);
        return ResponseEntity.status(HttpStatus.CREATED)
            .body(Result.success(order));
    }
}

// Step 2: 让AI生成接口文档
// 提示词:
// "基于以下Controller代码,生成Markdown格式的API文档。
// 包含:接口说明、请求参数表格、响应格式、错误码、示例。
// [粘贴Controller代码]"

// Step 3: 让AI生成变更日志
// 提示词:
// "对比以下两个版本的代码差异,生成变更日志。
// 版本1:[旧代码]
// 版本2:[新代码]"

// AI输出:
// ## v2.0.0 变更日志
// ### 新增
// - 订单创建接口支持VIP折扣
// - 新增库存预扣机制
// ### 修改
// - 订单状态枚举增加REFUNDED
// - 分页查询默认 pageSize 从20改为50
// ### 废弃
// - 旧版批量查询接口标记为@Deprecated

场景五:代码重构(省30分钟/次)

// 选中要重构的代码 → 右键 → Copilot → Refactor

// 重构前:100行的processOrder方法
public void processOrder(Order order) {
    // 一大坨if-else逻辑...
    // 混合了校验、业务处理、通知、日志...
}

// AI重构后:拆分成职责清晰的方法
public OrderResult processOrder(Order order) {
    validateOrder(order);
    OrderResult result = executeOrder(order);
    notifyOrderProcessed(result);
    return result;
}

private void validateOrder(Order order) {
    if (order == null) throw new IllegalArgumentException("订单不能为空");
    if (order.getAmount().compareTo(BigDecimal.ZERO) <= 0)
        throw new InvalidOrderException("金额必须大于0");
    if (!isValidStatus(order.getStatus()))
        throw new InvalidOrderException("状态不合法");
}

private OrderResult executeOrder(Order order) {
    // 核心业务逻辑
}

private void notifyOrderProcessed(OrderResult result) {
    // 通知逻辑
}

AI编程助手的正确使用姿势

该让AI做的事

✅ 重复性代码(CRUD、DTO、Converter)
✅ 单元测试(生成测试骨架和用例)
✅ 代码注释和文档
✅ 代码格式化和import优化
✅ 简单Bug分析
✅ 正则表达式
✅ SQL编写
✅ 配置文件生成

不该让AI做的事

❌ 核心业务逻辑设计(AI不了解你的业务)
❌ 安全相关代码(加密、认证、授权——必须人工审查)
❌ 性能关键路径(AI生成的代码可能有效率问题)
❌ 架构决策(AI给的建议可能不适合你的场景)
❌ 不加审查直接使用(AI会犯错,必须review)

高效使用原则

1. 给上下文,不要只给代码
   ❌ "这段代码有什么问题?"
   ✅ "这是一个订单处理方法,在高并发下偶尔超卖。
      代码如下,请分析原因并给出修复方案。"

2. 分步骤提问,不要一次要求太多
   ❌ "帮我写一个完整的电商系统"
   ✅ "先帮我设计订单创建流程的接口定义"

3. 要求AI解释,不要盲目接受
   ✅ "为什么你建议用ReentrantLock而不是synchronized?"
   ✅ "这个方案有什么缺点?"

4. 建立自己的提示词库
   ✅ 把好用的提示词存起来,重复使用
   ✅ 团队共享提示词模板

我的AI编程日常时间线

08:30-09:00  晨会 + 看邮件
09:00-09:30  用AI生成今天要开发的3个接口代码骨架
09:30-11:00  核心业务逻辑编码(AI辅助补全,自己把控设计)
11:00-11:30  用AI生成单元测试,人工review补充边界场景
11:30-12:00  Code Review(AI预审 + 人工确认)

14:00-15:00  修Bug(AI分析报错 + 自己定位根因)
15:00-16:00  重构老代码(AI建议 + 自己决策)
16:00-16:30  写技术文档(AI生成初稿 + 自己润色)
16:30-17:30  开会 + 沟通协作
17:30-18:00  提交代码 + 明日规划

以前:9小时工作日,3小时加班
现在:8小时工作日,准时下班

省下的2小时:
  → 30分钟:学习新技术
  → 30分钟:写公众号文章
  → 1小时:陪家人 / 健身 / 休息

写在最后

AI编程助手不是在取代程序员,而是在淘汰不用AI的程序员

会用AI的程序员:
→ 把重复劳动交给AI
→ 把省下的时间用在架构设计、业务理解、技术深度上
→ 产出质量更高,加班更少

不会用AI的程序员:
→ 还在手写CRUD
→ 还在手动写测试
→ 还在逐行Debug
→ 效率越来越落后

工具在那里,用不用是你的选择。


📌 我是卷毛,9年Java开发,每天用AI省2小时,把时间花在更有价值的事情上。

这篇如果对你有帮助,收藏+关注,随时翻出来参考。

关注《卷毛的技术笔记》,后续分享更多AI辅助开发的实战经验! 🔥

你在用AI编程助手吗?有什么好用的技巧?评论区分享 👇

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐