Skip to content

如何向 AI 提问与审核 AI 代码 ​

S0-008必学入门约 45 分钟JDK 21学习准备与环境 · 学习方法与 AI 协作

1. 本节定位 ​

AI 已经是你日常开发的一部分,但它有两个特点必须认清:输出速度极快,准确率不是 100%。

本节解决两个问题:怎么问才能得到能用的答案,以及怎么判断 AI 给的代码能不能用。第二件事更重要——AI 写的代码,最终签字的还是你。

2. 学习目标 ​

完成本节后,你应该能够:

  • 用"上下文 + 目标 + 约束 + 输出格式"四要素提出一个高质量问题;
  • 根据不同场景(概念解释 / 代码生成 / 报错诊断 / 代码审查)选择提问方式;
  • 认出 AI 输出的四类典型错误:幻觉 API、版本过期、逻辑看似正确、过度设计;
  • 用审核清单(编译、依赖、边界、异常、安全、规范)逐项检查 AI 生成的代码;
  • 说清哪些事不应该交给 AI 做。

3. 前置知识检查 ​

4. 为什么需要这个知识 ​

先说两个事实。

事实一:AI 会一本正经地给出错误代码。 它可能调用一个不存在的 API(幻觉)、用一个已被移除的方法(版本过期)、或者写出看起来合理但边界条件错的逻辑。这些错误不会自带警告,看起来和正确代码一模一样。

事实二:直接要答案会阻碍你成长。 调试和设计的能力,恰恰来自"卡住 → 思考 → 尝试 → 解决"这个循环。让 AI 跳过这个循环,你会得到能跑的代码,但得不到能力。

所以 AI 的正确用法是放大器:它放大你的效率,也放大你的判断力缺口。

5. 核心概念 ​

5.1 好提问的四要素 ​

text
① 上下文:环境、版本、相关代码、已经试过什么
② 目标:你想要的结果(不是"帮我看看",而是"帮我找出为什么返回 null")
③ 约束:不能改什么、必须用什么、有没有性能要求
④ 输出格式:要代码 / 要解释 / 要对比表 / 要步骤

对比一下差别:

text
差:我的 Java 代码报错了,怎么办?

好:JDK 21 + Spring Boot 3.2,下面这段代码在并发调用时报
    ConcurrentModificationException。我已经试过加 synchronized,
    但性能下降明显,不想用锁。请给出两种不用锁的改法,
    并说明各自的适用场景。
    (附:完整异常栈 + 相关代码)

第二种提问里,AI 不需要猜环境、不需要反问、也不会给出"加个锁"这种你已经否掉的方案。

5.2 四类场景与各自的要点 ​

场景必须提供的信息你要重点检查的
概念解释你的理解程度、具体困惑点它是否在编造来源;能否用你的话复述
代码生成输入输出、边界条件、JDK 版本API 是否存在、依赖是否正确、边界处理
报错诊断完整异常栈 + 相关代码 + 已尝试方案结论是否符合栈信息;是否只是"猜"
代码审查代码 + 你的关注点(可读性/性能/安全)建议是否可执行;是否过度重构
方案对比场景约束、评价维度对比维度是否覆盖你的实际约束

5.3 AI 输出的四类典型问题 ​

类型表现识别方法
幻觉 API调用了不存在的方法或类在 IDE 里敲一遍,编译不通过就是幻觉
版本过期用 Java 8 之前的写法,或已废弃的 API看是否有 @Deprecated;对照官方文档版本
逻辑看似正确主流程对,边界(空值、越界、并发)错读边界分支;补测试用例
过度设计三行能解决的事给了三层抽象问自己"这个抽象现在有第二个实现吗"

最有效的单条审核手段:把代码粘贴进 IDE 编译。 一次编译能过滤掉幻觉 API 和语法层面的错误——这类问题在 AI 输出里占比很高。

5.4 审核清单 ​

拿到 AI 生成的代码,逐项过一遍:

  • [ ] 能编译吗:在 IDE 里实际编译,不通过就别往下看
  • [ ] 依赖存在吗:它引用的库在 Maven 仓库里真的有这个坐标和版本吗
  • [ ] 版本对吗:API 在你使用的 JDK / 框架版本里可用吗
  • [ ] 边界处理了吗:空值、空集合、最大最小值、并发访问
  • [ ] 异常处理合理吗:是吞掉、是包装、还是往上抛,符合你的分层约定吗
  • [ ] 有安全隐患吗:SQL 拼接、路径穿越、敏感信息写入日志
  • [ ] 符合项目规范吗:命名、分层、日志格式、异常类型
  • [ ] 我能解释每一行吗:解释不了的部分,要么弄懂,要么删掉
  • [ ] 测试通过吗:核心逻辑补测试再提交
  • [ ] 有没有更简单的做法:AI 倾向于"完备",你倾向于"够用"

5.5 哪些事不该交给 AI ​

不该交给 AI原因
核心业务规则的判断规则背后有业务上下文与责任,AI 无法承担
最终的技术选型决定选型涉及团队、成本、长期维护,不只是技术对比
你没读懂就提交的代码出了问题你无法排查,这是最危险的负债
需要保证正确的关键算法边界与性能问题必须自己验证
个人隐私、公司敏感数据直接违反合规要求

一条实用准则:如果一段代码你解释不了,就不要提交——无论它"跑起来是对的"。

6. 递进示例 ​

6.1 最小示例:让 AI 解释概念 ​

text
差:什么是多态?

好:我已经学了继承和方法重写,也写过父类引用指向子类对象的代码,
    但我不理解"编译时类型决定能调什么方法"这句话。
    请用一个最小例子说明:为什么编译时要看声明类型?
    如果编译期就按运行时类型检查,会有什么问题?

第二种提问指向你的具体困惑,AI 不会给你一份能搜到的定义,而会针对性地解释。这也是检验自己是否真懂的方法——能提出精确的问题,说明你已经理解了一半。

6.2 业务示例:用 AI 排查报错 ​

text
JDK 21,下面这段代码在处理 10 万条数据时抛异常。

【异常栈】
java.util.ConcurrentModificationException
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1096)
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1050)
	at cn.kb.learn.Report.aggregate(Report.java:64)

【相关代码】
(第 60-70 行)

【已尝试】
1. 改成 for (int i = 0; i < list.size(); i++):不再抛异常,但结果少了几条
2. 加 synchronized:结果正确,但耗时从 2s 涨到 9s

【我的目标】
不用锁,且结果正确。请先解释第 1 种改法为什么会少数据,再给方案。

这个提问的价值在于:它把 AI 从"猜"变成了"推理"。提供已尝试的方案和现象,AI 能直接定位到"遍历中删除导致索引偏移"这类具体机制。

6.3 反例:让 AI 写完整业务逻辑然后直接提交 ​

text
帮我写一个订单结算功能,要考虑各种情况。

问题有三层:规格不清(什么是"各种情况")、无法验证(结算规则对不对 AI 不知道)、责任缺失(出错时你无法解释为什么这么写)。

AI 可以帮你写:DTO 转换、参数校验骨架、日志与异常包装、单元测试用例的初稿。但"满减怎么算""优惠券能不能叠加"这类规则,必须来自业务,且必须由你确认。

7. 完整示例:本知识库用的提示词结构 ​

本仓库 prompts/ 目录下保存了内容生产用的提示词,它们都遵循同一个结构。以课程作者提示词为例(节选):

text
你是一名资深 Java 课程作者。

请为「具备少量 Java 基础、希望系统补全知识并转向 Java 全栈开发」的学习者
编写一节原创课程。

必须包含:本节定位、学习目标、前置知识检查、核心概念、三个递进示例、
完整可运行代码、Debug 观察点、常见错误、动手实验、练习题、分级提示、
参考答案、掌握标准。

约束:
- 首次出现的术语必须解释
- 不假设用户理解未列出的前置知识
- 不能用伪代码代替可运行代码
- 不复制书籍、付费课程或网站正文

注意这里的三个特征:明确了读者画像(AI 才知道讲多深)、固定了输出结构(结果可预期)、写死了约束(尤其是"不能用伪代码"这条,直接针对 AI 的偷懒倾向)。

8. Debug 观察点 ​

AI 的输出没法下断点,但可以做两个检验:

  1. 编译检验:把 AI 给的代码粘进 IDE,看是否报错。这一步能过滤掉相当比例的幻觉 API;
  2. 复述检验:合上对话,用自己的话把它的方案讲一遍。讲不顺的地方就是你没懂的地方——要么追问,要么不用。

9. 常见错误 ​

错误 1:把 AI 的"自信语气"当成正确性证据 ​

AI 的语气与准确率无关。判断依据只有两个:编译运行 + 你自己的理解。

错误 2:一次性问太多 ​

text
帮我设计一个电商系统,包含用户、商品、订单、支付、库存、推荐……

范围越大,输出越泛。拆成小问题逐个问,每个问题都能验证。

错误 3:不提供版本信息 ​

Java 8 和 Java 21 的写法差别很大(List.of、record、虚拟线程)。不写版本,AI 通常按较老的语法给,你会拿到一堆过时代码。

错误 4:让 AI 帮你"跳过学习" ​

text
把这道练习题答案直接给我。

本节所在的课程提供了分级提示而不是直接答案,原因就在这:先看提示 1(方向),想 10 分钟;再看提示 2(关键点);真的卡死再看答案。思考的过程才是学习发生的地方。

10. 动手实验 ​

目标:用同一问题对比两种提问方式的输出质量。

步骤:

  1. 用模糊提问:"Java 里怎么遍历 Map?" 记录回答;
  2. 用结构化提问:"JDK 21,有一个 Map<String, List<Order>>,我需要按订单金额倒序输出每个用户的前 3 笔订单,且当用户订单不足 3 笔时按实际数量输出。请给出 Stream 写法,并说明如果金额相同怎么保证顺序稳定。" 记录回答;
  3. 对比两次回答的可用性(能不能直接编译、是否覆盖你的约束);
  4. 把第 2 步的代码粘进 IDE 编译运行,用第 5.4 节的清单逐项审核;
  5. 记录 AI 犯的错(如果有)——积累"AI 在哪些地方容易错"的经验,比记住它有多强更有用。

验收方式:能说清第 1 步与第 2 步的差距来自哪几个要素。

扩展任务:让 AI 审查你自己写的 UserService,提示词里明确"关注过度 Mock 与异常处理"。然后把它的建议分成"采纳""部分采纳""不采纳"三类,并写下理由。

11. 练习题 ​

基础题

  1. 判断:AI 给的代码只要有注释说明,就可以直接提交。(对 / 错)
  2. 填空:好提问的四要素是 、、、。
  3. 简答:为什么"能不能自己解释每一行"是审核的关键标准?

场景题

  1. 下面这个提问缺少什么?请补全:
text
我的程序报空指针,帮我修一下。

判断题

  1. 下面哪些任务适合交给 AI?说明理由。
  • A. 生成 DTO 与实体类的转换代码
  • B. 决定订单超时后是否自动退款
  • C. 解释一段开源代码的调用流程
  • D. 帮你把公司数据库的连接串发到云端做调试

综合任务

  1. 建立你自己的"AI 协作规则",至少包括:
    • 哪些代码必须自己写;
    • 提交 AI 参与生成的代码前必须做什么;
    • 哪些信息绝不发给 AI;
    • 一个你打算固定的提示词模板。
分级提示

提示 1(方向):第 4 题缺少版本、异常栈、相关代码、已尝试的方案。

提示 2(关键点):第 5 题判断的核心是"是否需要业务责任"与"是否涉及敏感数据"。

提示 3(接近答案):第 6 题的规则不必多,但每一条都要能在真实场景里执行——比如"AI 生成的代码必须编译通过并补一个测试才提交"。

12. 参考答案 ​

基础题
  1. 错。注释也是 AI 生成的,同样可能有错。审核依据只能是编译运行 + 你的理解。
  2. 上下文、目标、约束、输出格式。
  3. 因为解释不了就意味着你无法维护它:出问题时不知道怎么排查,需求变更时不知道怎么改,别人问起时答不上来。代码的维护成本远高于编写成本,解释不了的代码是一笔负债。
场景题(第 4 题)

补全后的提问:

text
JDK 21,Spring Boot 3.2 项目。调用 /user/detail 接口时抛异常:

java.lang.NullPointerException: Cannot invoke "User.getName()" because "user" is null
	at cn.kb.learn.UserService.detail(UserService.java:42)

相关代码(第 38-46 行):
(代码片段)

我已尝试:加了 if (user != null) 判断,但 500 变成了 404,业务上
期望返回空对象。请给出符合这个期望的改法,并说明为什么原来会返回 500。

关键补充:版本、完整异常栈(尤其是自己代码的那一帧)、相关代码、已尝试方案、期望结果。

判断题(第 5 题)
  • A 适合:机械转换,可编译验证,风险低。
  • B 不适合:涉及资金与业务规则,必须由业务方定义、你来实现和验证。
  • C 适合:解释代码是 AI 的强项,但仍需对照源码核对结论。
  • D 绝对不可以:泄露公司敏感信息,属于合规红线,与 AI 能力无关。
综合任务(第 6 题)

参考规则:

markdown
## 我的 AI 协作规则

### 必须自己写
- 核心业务规则与状态流转
- 与资金、权限相关的逻辑
- 最终的技术选型决定

### 提交前必做
1. 在 IDE 里编译通过
2. 补一个覆盖主流程的测试并跑绿
3. 能逐行解释(解释不了的删掉或重写)
4. 用审核清单过一遍(边界、异常、安全、规范)

### 绝不发给 AI
- 生产数据库连接串、密钥
- 用户个人信息
- 公司未公开的业务规则与代码

### 固定提问模板
上下文(JDK/框架版本 + 代码 + 已尝试)
目标(一句话)
约束(不能用什么 / 必须满足什么)
输出格式(代码 + 说明 / 对比表 / 步骤)

13. 掌握标准 ​

  • [ ] 能用四要素提出一个结构化问题;
  • [ ] 能识别 AI 输出的四类典型问题;
  • [ ] 提交 AI 参与生成的代码前会走一遍审核清单;
  • [ ] 清楚哪些事绝不交给 AI,并能在真实场景里守住这条线。

14. 扩展资源 ​

15. 下一步学习 ​

《知识库使用方式与学习节奏》 会把学习方法固化成可执行的周计划;此后进入 S1 编程语言基础,正式开始语言学习。

前置知识

无,可直接开始

后续知识

暂无

进度只保存在本机浏览器,可随时清除

个人学习项目:AI 生成内容均经人工复核,第三方资源仅作索引