AI 编程实践:如何高效与 AI 沟通,实现"接近完美"的代码需求

前言

在日常开发工作中,AI 编程助手正在成为开发者的"配对程序员"。但很多人有一个困惑:“我告诉了 AI 要做什么,结果出来的代码却需要大量修改,甚至完全跑偏。”

问题的核心不在于 AI 能力不足,而在于:沟通方式和信息传递的质量决定了代码产出的质量。

本文将结合实际项目(Java 分层架构后端)的开发案例,总结一套与 AI 高效协作生成代码的方法论。


一、核心原则:AI 是"需求执行者",不是"需求分析师"

AI 不了解你的业务背景、代码风格、命名规范、架构约束。你给的信息越精确,它产出的代码离"正确"越近。

常见误区示例:

:cross_mark: 低质量提示:

帮我写一个查询接口

:white_check_mark: 高质量提示:

在 OrchDefectRecordAPI 中新增根据单个 defectRecordId 查询的接口,
入参为 BaseIdParams,新建返回值类 AuditDefectRecordDetailDTO(不要复用现有DTO),
具体实现逻辑在 DefectRecordServiceImpl 中,通过 OrchDefectRecordController 调用,
有问题请告诉我我来确认

关键差异:

  • 明确了修改哪个文件(OrchDefectRecordAPI)
  • 明确了入参类型(BaseIdParams)
  • 明确了返回值设计决策(新建,不复用)
  • 明确了实现逻辑的归属层(ServiceImpl)
  • 授权 AI 主动提问(有问题告诉我)

二、结构化提示三要素

要素一:定义边界 —— 告诉 AI 在哪里改

不说清楚范围,AI 可能在错误的文件里写代码,或者在正确的文件里改错位置。

示例:

在 imx-quality 项目
→ OrchDefectRecordAPI(接口定义)
→ OrchDefectRecordController(Controller实现)
→ DefectRecordServiceImpl(业务逻辑)
这三个文件中分别做对应修改

要素二:提供约束 —— 告诉 AI 不能做什么

约束条件往往比"要做什么"更重要。

示例:

不要使用 AuditCheckAreaDTO 和 QmsCheckAreaZoneDTO,
而是新建返回值类,字段和这两个 DTO 大概相同

这一句话避免了 AI 直接复用已有类,导致职责混乱、后续难以独立扩展。

要素三:授权提问 —— 让 AI 在不确定时问你

这是最被忽视却最重要的一点。

有问题请告诉我我来确认

这句话会让 AI 在面临设计决策点时停下来问你,而不是自行脑补一个可能错误的方案。


三、设计决策点的确认流程

在实际使用中,一个"新增接口"的需求往往涉及多个设计决策。AI 会把这些决策整理成问题列出来,你逐一确认后再开始实现。

实际案例 —— 新增 Audit 检查区域详情接口:

AI 提问:

1. 返回值类命名:AuditCheckAreaDetailDTO 还是其他?
2. 返回结构:区域基本信息 + zones 分区列表,是否可以?
3. Service 方法签名:
   - 选项 A:AuditCheckAreaDetailDTO getCheckAreaDetailById(Long id)
   - 选项 B:AuditCheckAreaDetailDTO getCheckAreaDetailById(CheckAreaParams params)
4. 权限配置:和检查区域详情一样的权限?

用户回答:

1. AuditCheckAreaDetailDTO
2. 可以
3. A
4. 和详情一个权限

这种"问答式确认"的优势:

  • 避免了 AI 在关键设计节点做错误假设
  • 将架构决策权牢牢掌握在开发者手中
  • 最终输出的代码与预期高度一致,几乎不需要返工

四、信息质量决定代码质量

4.1 提供现有代码的上下文

不要假设 AI 知道你的项目结构。把相关文件路径或目录结构提供给它。

示例 —— 把文件夹结构贴给 AI:

imx-quality/
├── application/
│   └── defectrecord/service/impl/DefectRecordServiceImpl.java
├── presentation/
│   └── aggregate/defectrecord/dto/DefectRecordDTO.java
└── orch/
    └── aggregate/defectrecord/controller/api/OrchDefectRecordAPI.java

AI 就能正确理解:

  • presentation 层存放 DTO
  • application 层存放 Service 实现
  • orch 层是对外暴露的 API

4.2 说明架构规范(如有)

项目采用分层架构:
- Controller 层只做参数传递,不写业务逻辑
- 业务逻辑全部在 Service 层实现
- DTO 新建,不复用现有类

这几句话能让 AI 生成的代码自然符合项目架构,而不需要你在代码出来之后再手动"搬运"逻辑。

4.3 明确枚举、类型等细节

字段类型一旦说错,会引发大量编译错误。

示例:

status 字段是 QmsCheckAreaStatusEnum 枚举类型,
不是 Integer,需要通过 getById(configStatus) 进行转换

五、分阶段迭代策略

复杂需求不要一次性交给 AI,分阶段进行更稳妥。

阶段一:先理解,再实现

先让 AI 分析现有代码,再基于分析结果提出实现方案。

先分析 RegionOverlapUtil 类各个方法的作用,然后
告诉我如何判断一个点是否在某个区域内

让 AI 先"读懂"代码,你确认它理解正确后,再让它写新代码。

阶段二:MVP + 迭代

先实现核心功能,再根据实际运行情况补充细节。

第一轮:

先实现基础的 getAuditDefectRecordDetail 方法,
返回 defectRecordPO 的所有字段

第二轮(用户调整后):

删除 woNumber、carModel 等基础字段,
新增 checkAreaId、checkItemId、coordinate、defectLevel、defectDomain 字段

这种分批迭代比一次性描述全部需求更精准,因为在看到第一版代码后,你更清楚自己真正想要什么。


六、让 AI 自检

代码生成完成后,不要直接运行,先让 AI 做编译检查。

提示语:

检查一下这个文件是否有编译错误

AI 会主动检查:

  • import 路径是否正确
  • 类型是否匹配
  • 接口方法是否都有实现
  • 枚举转换是否正确

实际案例 —— AI 自检发现的典型问题:

// ❌ 错误:直接赋值 Integer 给枚举字段
result.setStatus(checkAreaPO.getConfigStatus());

// ✅ 正确:通过枚举的 getById 方法转换
result.setStatus(QmsCheckAreaStatusEnum.getById(checkAreaPO.getConfigStatus()));

七、高效沟通的核对清单

在向 AI 提出需求前,用以下清单自查:

维度 检查项 示例
边界 是否明确了要修改的文件? OrchDefectRecordAPI.java
约束 是否说明了不能做的事? 不复用现有DTO,新建返回值类
层次 是否指定了逻辑实现的层? 在 ServiceImpl 中实现
类型 入参和返回值的类型是否已确定? 入参 BaseIdParams,返回 DTO
授权提问 是否告知 AI 遇到不确定时可以提问? 有问题请告诉我我来确认
命名 新建类/方法的命名是否已决定? AuditDefectRecordDetailDTO

八、总结

与 AI 高效协作写代码,本质上是把模糊的脑海想法转化为精确的书面指令的能力。

几个核心习惯:

  1. 提问前先整理清楚:你想让 AI 改哪几个文件、每个文件的职责是什么
  2. 让 AI 提问,而不是让 AI 猜测:遇到设计决策,人来拍板,AI 来执行
  3. 分阶段迭代:先跑通主流程,再完善细节
  4. 利用 AI 自检:代码生成后让 AI 检查编译问题,比自己肉眼找错更高效
  5. 上下文越充分,结果越准确:把项目结构、架构规范、枚举类型等背景信息一起提供

AI 不是万能的,但"精确的指令 + 合理的迭代策略"能让 AI 成为真正高效的编程搭档。


本文案例来自实际生产项目(Java Spring Boot 分层架构),核心技术栈:MyBatis Plus、DDD 分层架构、RESTful API。