最近和一位做后端开发的朋友聊天,他提到一个现象:现在很多Java程序员,简历上项目经验写了不少,但面试官一问“这个项目里,除了CRUD,你还做了什么有技术挑战的事情?”,很多人就卡壳了。日常工作似乎被“接收需求 -> 设计表 -> 写Controller/Service/Dao -> 联调 -> 改Bug”这个循环给框住了。这背后反映的,可能不只是个人技术栈的局限,更是一种工作模式的惯性——我们习惯了在已知的框架内解决问题,却很少思考如何用新的工具和方法论去重塑整个开发流程。
“AI工程化编程”这个词最近很热,但很多人的理解还停留在“让AI帮我写几行代码”或者“用Copilot补全一下”。这当然有用,但它解决的只是“写”这个动作的效率问题,并没有触及“工程化”的核心。真正的AI工程化,应该是将AI能力深度、稳定、可预测地融入到软件开发的完整生命周期中,从需求分析、架构设计、代码生成、测试、部署到运维,形成一个闭环。它改变的不仅是编码速度,更是问题解决的范式。
今天,我们就以一个经典的“企业级电商项目”为蓝本,抛开那些手写CRUD的重复劳动,看看如何借助Claude Code和Harness AI这两套工具链,真正走通一次AI工程化编程的实战。我们的目标不是简单地“用AI生成代码”,而是构建一套可复用、可协作、可进化的智能开发工作流。
1. 重新定义起点:从“写代码”到“设计工作流”
在传统的Java电商项目开发中,我们的思维起点往往是技术栈:Spring Boot、MyBatis、Redis、MySQL……然后开始设计领域模型和数据库表。但在AI工程化的视角下,第一步应该是设计“人机协作的工作流”。
Claude Code是什么?你可以把它理解为一个深度集成在IDE(如VS Code)中的、具备强大代码理解和生成能力的AI助手。它不同于普通的代码补全工具,它能理解更复杂的上下文,能根据你的自然语言描述生成整块业务逻辑、单元测试、甚至重构建议。而Harness在这里指的是一套用于AI应用开发、部署和监控的工程化平台(Harness AI),它关注的是如何将AI能力(包括Claude Code这样的工具产出的代码)可靠地集成到CI/CD流水线中,并进行持续验证。
所以,面对一个电商项目,我们不应该立刻打开IDE新建UserController.java。而是先回答几个问题:
- 在这个项目中,哪些环节是高度重复、模式固定的(例如,标准的增删改查接口、DTO转换、基础数据校验)?这些是AI自动化优先级最高的部分。
- 哪些环节需要复杂的业务逻辑和领域知识(例如,优惠券分摊计算、库存预占释放策略)?这些可能需要AI辅助生成初版,但必须由人进行深度审查和修正。
- 如何确保AI生成的代码能无缝融入现有架构、符合团队规范、并通过自动化测试?
一个可行的AI工程化工作流设计如下:
- 需求拆解与提示词工程:将产品需求(如“用户下单”)拆解为具体的、可被AI理解的编程任务序列(如“生成一个
OrderService.createOrder方法,需处理参数校验、库存检查、优惠计算、订单持久化、发送创建事件”)。 - Claude Code辅助编码:在VS Code中,使用精心设计的提示词,让Claude Code生成核心业务逻辑代码骨架、单元测试、甚至API文档注释。
- 本地验证与迭代:运行生成的代码,进行基础功能测试。利用Claude Code的“解释代码”、“查找Bug”、“建议重构”功能快速迭代。
- 代码质量门禁:将代码提交至Git,触发CI流水线。流水线中必须包含针对AI生成代码的专项检查,例如:
- 代码风格一致性检查:确保生成的代码符合项目的Checkstyle或Spotless规范。
- 静态安全扫描:使用SonarQube或类似工具,检查AI可能引入的潜在安全漏洞(如SQL注入、不安全的反序列化)。
- AI代码检测:可以使用一些工具尝试识别代码是否由AI生成,并对高置信度的部分进行重点人工复审。
- Harness AI集成与部署:将包含AI生成代码的服务,通过Harness平台进行部署。Harness可以管理部署流程、进行金丝雀发布,并监控线上表现。这里的关键是,我们可以设定一些针对“AI生成模块”的特定监控指标,比如其接口的异常率是否显著高于人工编写模块,从而形成反馈闭环。
- 反馈与模型优化:将线上运行的真实问题、人工复审的修改点,作为优化下一次给Claude Code的“提示词”的素材,不断提升AI生成代码的准确率和可用性。
这个工作流的核心思想是:将程序员从重复的代码打字员角色,升级为工作流设计者、提示词工程师、代码审查员和系统质量守护者。
1.1 电商项目中的AI可自动化模块识别
以典型电商后端为例,我们可以列出AI高适用性的模块:
| 模块类别 | 具体任务 | AI辅助价值 | 人工审查重点 |
|---|---|---|---|
| 数据对象与接口 | POJO/DTO/VO生成、Mapper接口、基础Controller/Service | 极高。模式固定,AI能快速生成符合Lombok、MapStruct等约定的代码。 | 字段命名是否符合业务术语,是否遗漏了必要的注解(如@NotNull)。 |
| 基础CRUD服务 | 基于MyBatis-Plus或JPA的单一实体增删改查服务 | 高。AI能生成包含分页、条件查询的标准实现。 | 查询条件是否合理,分页参数处理是否正确,是否考虑了软删除等业务逻辑。 |
| 简单业务逻辑 | 状态机转换、基础计算(如金额求和)、枚举值处理 | 中高。AI能正确实现逻辑,但可能对业务边界考虑不周。 | 状态转换条件是否完备,计算是否有精度或溢出风险,异常场景处理。 |
| 单元测试 | 为上述生成的代码编写JUnit 5 + Mockito测试 | 极高。AI非常擅长根据方法签名和逻辑生成测试用例,包括边界情况。 | 测试覆盖率是否足够,Mock对象的行为设置是否正确,断言是否精确。 |
| API文档 | 生成OpenAPI 3.0 (Swagger)注解 | 高。AI能根据方法名和参数生成基本的@Operation,@Parameter等注解。 | 描述是否准确,参数示例是否恰当,是否需要补充更详细的业务说明。 |
1.2 设计你的第一个提示词:生成一个用户DTO
让我们从最简单的开始。在VS Code中安装好Claude Code插件后,新建一个文件UserDTO.java。不要手写代码,而是在文件中输入如下注释作为给AI的提示词:
// 请生成一个电商系统的用户DTO类。 // 要求: // 1. 使用Lombok注解,包含@Data, @Builder, @NoArgsConstructor, @AllArgsConstructor。 // 2. 字段包括:id(Long), username(String), email(String), password(String) 需要包含@JsonIgnore, mobile(String), avatarUrl(String), status(Integer 0正常1禁用), createTime(LocalDateTime), updateTime(LocalDateTime)。 // 3. 为email和mobile字段添加JSR-303校验注解@Email和@Pattern(regexp = "^1[3-9]\\d{9}$")。 // 4. 为createTime和updateTime添加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")。 // 5. 类名和字段名使用驼峰命名。然后,调用Claude Code(通常是快捷键或右键菜单),让它根据这段注释生成代码。你会立刻得到一个近乎完美的UserDTO.java。这节省的不仅是打字时间,更是避免了因手误导致的编译错误或注解遗漏。
注意:提示词的质量直接决定输出代码的质量。初期需要像和一位新同事沟通需求一样,清晰、无歧义。随着使用次数增加,你可以积累一套针对自己项目技术栈的“提示词模板”。
2. 超越单点生成:用Claude Code构建完整服务层
生成一个DTO只是开始。AI工程化的威力在于串联多个任务,构建出完整、可运行的功能模块。我们以“商品管理”模块为例,演示如何从零生成一套包含Controller、Service、Mapper、Entity的RESTful API。
2.1 步骤一:生成实体类与Mapper
首先,在合适的包路径下,创建一个描述商品实体的提示词文件Product.md(用Markdown文件来组织复杂的提示词也是一种好方法)。
# 生成商品(Product)实体类和MyBatis-Plus Mapper ## 实体类要求 - 类名:Product - 包路径:com.example.ecommerce.entity - 使用Lombok注解:@Data, @TableName("t_product") - 字段: id (Long, 主键,自增) categoryId (Long, 分类ID,索引) name (String, 商品名称,非空) subtitle (String, 商品副标题) mainImage (String, 主图URL) subImages (String, 附图URL列表,用JSON数组存储) detail (String, 商品详情HTML) price (BigDecimal, 价格,精度10位,小数2位) stock (Integer, 库存) status (Integer, 状态:0-下架,1-上架) createTime (LocalDateTime, 创建时间) updateTime (LocalDateTime, 更新时间) - 为price字段添加@TableField(value = "price", jdbcType = JdbcType.DECIMAL) - 为subImages字段添加@TableField(typeHandler = JacksonTypeHandler.class),并确保项目中有fastjson或jackson依赖。 ## Mapper接口要求 - 接口名:ProductMapper - 包路径:com.example.ecommerce.mapper - 继承自:com.baomidou.mybatisplus.core.mapper.BaseMapper<Product> - 添加@Mapper注解将这段提示词交给Claude Code,它会生成Product.java和ProductMapper.java。检查生成的代码,特别是subImages字段的TypeHandler配置是否正确,这通常是AI容易出错的地方。
2.2 步骤二:生成Service层
接下来,生成Service接口和实现类。提示词可以这样写:
// 生成商品服务层:ProductService接口和ProductServiceImpl实现类。 // 接口位置:com.example.ecommerce.service.ProductService // 实现类位置:com.example.ecommerce.service.impl.ProductServiceImpl // 要求: // 1. 接口继承自IService<Product>。 // 2. 实现类继承自ServiceImpl<ProductMapper, Product>并实现ProductService接口。 // 3. 需要注入ProductMapper(父类已处理)。 // 4. 提供一个自定义的业务方法:Page<ProductVO> searchProduct(ProductQuery query); // 5. 说明:ProductVO是待生成的视图对象,ProductQuery是待生成的查询参数对象。请先生成这两个类的基本结构(包含必要的字段),再生成Service。 // 6. searchProduct方法逻辑:根据ProductQuery中的条件(商品名模糊查询、分类ID、状态、价格区间)动态构造QueryWrapper,调用baseMapper.selectPage进行分页查询,并将查询到的Product列表转换为ProductVO列表(使用MapStruct或手动set,在提示中假设使用手动set)。请生成完整的转换逻辑。这个提示词更复杂,它要求AI理解多个类之间的依赖关系,并实现一个包含条件查询、分页和对象转换的完整业务方法。Claude Code通常能很好地处理这种链式任务。生成后,你需要重点审查:
QueryWrapper的构造逻辑是否正确,特别是模糊查询和范围查询。- 对象转换(Product -> ProductVO)是否遗漏了字段。
- 分页参数
Page<Product>的使用是否正确。
2.3 步骤三:生成Controller层
最后,生成REST控制器。
// 生成ProductController。 // 包路径:com.example.ecommerce.controller // 要求: // 1. 使用@RestController, @RequestMapping("/api/product") // 2. 注入ProductService。 // 3. 提供标准的RESTful端点: // GET /{id} - 根据ID获取商品详情(返回ProductVO) // POST / - 创建商品(接收ProductDTO,返回成功标识) // PUT /{id} - 更新商品(接收ProductDTO) // DELETE /{id} - 删除商品(逻辑删除,更新状态) // GET /search - 对应上面Service的searchProduct方法,接收ProductQuery参数,返回分页结果。 // 4. 所有方法需添加合适的Swagger注解(@Operation, @Parameter等)。 // 5. 创建和更新需要对传入的DTO进行JSR-303校验(@Valid)。 // 6. 统一使用ResponseEntity或自定义的Result对象进行包装。生成后,检查URL路径是否正确,参数绑定(@PathVariable,@RequestBody,@Valid)是否准确,以及异常处理是否完备(虽然提示词没要求,但AI有时会添加基础的异常处理)。
通过以上三步,一个具备基本CRUD和复杂查询功能的商品管理模块就生成了。整个过程,你的主要工作是设计和审查,而不是逐行编码。这极大地提升了模块开发的启动速度。
3. 工程化的关键:质量保障与持续集成
AI生成的代码,最大的挑战在于质量和一致性。我们不能假设生成的代码永远正确。因此,必须建立强力的质量保障门禁,这也是“工程化”与“玩具项目”的核心区别。
3.1 本地第一道防线:单元测试与静态分析
Claude Code生成代码后,应立即为其生成单元测试。你可以直接对Service实现类说:“请为这个类中的searchProduct方法生成JUnit 5单元测试,使用Mockito模拟ProductMapper。” AI会生成一个相当完整的测试类,覆盖正常和异常场景。
但生成了测试不等于通过测试。你必须运行这些测试。同时,在提交代码前,运行项目的全套静态检查:
mvn clean compile:确保编译通过。mvn checkstyle:check或使用Spotless:确保代码风格一致。mvn spotbugs:check:检查潜在Bug模式。- 运行所有单元测试:
mvn test。
可以将这些命令集成到本地Git钩子(pre-commit)中,自动化执行。
3.2 持续集成(CI)中的AI代码专项检查
在GitLab CI、GitHub Actions或Jenkins的流水线中,除了常规的编译、打包、测试,建议增加以下针对AI代码的步骤:
- AI代码检测工具:虽然不完美,但可以引入像
GPTZero、Originality.ai的API或开源工具,对变更的代码进行扫描,对高概率为AI生成的代码块进行标记,提醒评审者重点关注。 - 增强的代码审查(Code Review):在Merge Request中,必须有人工审查。审查重点从“语法是否正确”转向:
- 业务逻辑正确性:AI生成的算法或逻辑是否符合业务规则?
- 安全性:是否有SQL拼接、不安全的反射、错误的权限检查?
- 性能:循环、查询是否高效?N+1问题?
- 一致性:命名、日志格式、异常处理是否与项目其他部分一致?
- 集成测试:生成代码必须通过针对其功能的集成测试。可以编写或生成API测试(使用Postman Collection或Spring Boot Test),验证整个链路。
3.3 引入Harness AI进行部署后监控
当代码通过所有检查,合并到主分支并完成构建后,就进入部署阶段。这里就是Harness平台发挥价值的地方。
传统的部署可能只是一次kubectl apply或scp。而Harness提供了智能部署策略(如金丝雀发布、蓝绿部署)和持续验证。
对于包含AI生成代码的服务,我们可以在Harness中配置:
- 金丝雀发布:先将新版本部署给1%的用户流量,观察其表现。
- 关键指标验证:在发布过程中和发布后,Harness可以自动从监控系统(如Prometheus)或应用日志中,收集关键业务指标(如
/api/product/search接口的延迟、错误率)和系统指标(如CPU/内存使用率)。 - AI模块专项监控:我们可以为AI生成的模块定义更严格的基线。例如,如果该模块的P99延迟比人工编写模块高出20%,或错误率超过0.1%,Harness可以自动触发回滚,并通知开发人员。
- 反馈闭环:回滚或线上问题发生后,开发人员需要分析原因。是提示词不准确?是生成的逻辑有边界情况未覆盖?将这次教训总结,优化下一次的提示词,或决定该模块是否需要人工重写。这个“开发->生成->测试->部署->监控->反馈->优化”的闭环,是AI工程化成熟度的体现。
4. 应对复杂场景:AI辅助设计模式与重构
电商系统中不乏复杂场景,如分布式事务(下单扣库存)、缓存一致性、异步处理(订单超时取消)等。AI不仅能生成代码,还能辅助进行架构设计和代码重构。
4.1 使用AI辅助设计“下单”流程
“下单”是一个典型的长事务,涉及订单、库存、优惠券、支付等多个领域。你可以向Claude Code描述场景:
请为电商系统的“下单”流程设计一个Java实现方案。 需求: 1. 用户提交订单(商品SKU、数量、收货地址、优惠券)。 2. 需要检查库存(预占)、计算价格(商品总价、运费、优惠抵扣)、生成订单、扣减优惠券、扣减库存。 3. 需要考虑高并发下的数据一致性问题。 4. 请给出核心的类图设计(用文字描述)和关键方法(如OrderService.createOrder)的伪代码或实现思路,重点说明你如何保证库存扣减和订单创建的一致性(例如使用分布式事务Seata,或基于消息队列的最终一致性方案)。Claude Code可能会给出基于@Transactional的本地事务方案,或引入Seata的AT模式,或使用“预占库存+MQ异步扣减”的最终一致性方案。它甚至会生成大致的OrderService方法骨架和InventoryService的deductStock方法。你的角色是评估这些方案的优缺点,结合自身项目实际情况(团队技术栈、运维能力、业务容忍度)做出选择,然后让AI基于选定的方案生成更具体的代码。
4.2 使用AI进行代码重构
假设在代码审查中,你发现一个古老的CartService类,方法冗长,且充斥着if-else逻辑。你可以将这段代码贴给Claude Code,并指示:
请分析以下Java代码,并提出重构建议。目标是提高可读性和可维护性。 1. 是否可以提取方法? 2. 复杂的条件逻辑是否可以用策略模式或状态模式重构? 3. 是否有重复代码可以消除? 请直接给出重构后的代码片段。AI会识别出代码坏味道,并给出重构后的版本。这相当于一位不知疲倦的资深代码审查员在帮你优化代码结构。
5. 从项目实践到个人进化:构建你的AI工程化能力栈
通过一个电商项目的实践,我们体验了AI工程化编程的完整流程。但这不仅仅是完成一个项目,更是对个人能力栈的一次升级。要真正掌握这项能力,你需要有意识地在以下几个维度积累:
- 提示词工程能力:这是与AI高效协作的核心。你需要学会如何将模糊的需求转化为清晰、结构化、无歧义的指令。这包括定义上下文、设定约束、提供示例等。建立你自己的“提示词库”,分类管理不同场景(生成CRUD、生成测试、解释代码、重构代码、设计模式等)的最佳实践。
- 架构与设计评审能力:当AI能快速产出代码时,你的价值将更多体现在做出正确的技术决策和识别设计缺陷上。你需要能判断AI给出的多个方案中哪个更优,能发现生成代码中潜在的性能瓶颈、安全漏洞或架构不一致性。
- 质量守护与运维意识:你必须比以往更重视自动化测试、静态分析、持续集成和监控。因为AI的“黑盒”特性,必须用严格的工程实践来保证其输出的可靠性。理解并运用像Harness这样的现代部署与验证平台,将成为标配技能。
- 领域知识深化:AI擅长处理通用模式,但对特定业务领域的深度理解(如电商的库存周转逻辑、金融的风控规则)仍然是人类的绝对优势。你的领域知识越深,就能设计出越精准的提示词,也能更好地校验AI的输出。
回到开头那个问题:“除了CRUD,你还做了什么?” 现在,你可以给出的答案是:我主导或参与了将AI工程化能力引入团队开发流程的工作。我设计了人机协作的编码工作流,利用Claude Code等工具将开发效率提升X倍,同时通过建立严格的质量门禁和Harness部署监控闭环,确保了AI生成代码的线上稳定性。我不仅是在写代码,更是在构建下一代智能开发体系。
这,或许就是摆脱“CRUD程序员”标签,走向更高阶工程师的一条切实路径。工具永远在变,但用工程化思维解决问题、提升价值的能力,永远不会过时。