主题
界面
主题
AI 已经是你日常开发的一部分,但它有两个特点必须认清:输出速度极快,准确率不是 100%。
本节解决两个问题:怎么问才能得到能用的答案,以及怎么判断 AI 给的代码能不能用。第二件事更重要——AI 写的代码,最终签字的还是你。
完成本节后,你应该能够:
先说两个事实。
事实一:AI 会一本正经地给出错误代码。 它可能调用一个不存在的 API(幻觉)、用一个已被移除的方法(版本过期)、或者写出看起来合理但边界条件错的逻辑。这些错误不会自带警告,看起来和正确代码一模一样。
事实二:直接要答案会阻碍你成长。 调试和设计的能力,恰恰来自"卡住 → 思考 → 尝试 → 解决"这个循环。让 AI 跳过这个循环,你会得到能跑的代码,但得不到能力。
所以 AI 的正确用法是放大器:它放大你的效率,也放大你的判断力缺口。
① 上下文:环境、版本、相关代码、已经试过什么
② 目标:你想要的结果(不是"帮我看看",而是"帮我找出为什么返回 null")
③ 约束:不能改什么、必须用什么、有没有性能要求
④ 输出格式:要代码 / 要解释 / 要对比表 / 要步骤对比一下差别:
差:我的 Java 代码报错了,怎么办?
好:JDK 21 + Spring Boot 3.2,下面这段代码在并发调用时报
ConcurrentModificationException。我已经试过加 synchronized,
但性能下降明显,不想用锁。请给出两种不用锁的改法,
并说明各自的适用场景。
(附:完整异常栈 + 相关代码)第二种提问里,AI 不需要猜环境、不需要反问、也不会给出"加个锁"这种你已经否掉的方案。
| 场景 | 必须提供的信息 | 你要重点检查的 |
|---|---|---|
| 概念解释 | 你的理解程度、具体困惑点 | 它是否在编造来源;能否用你的话复述 |
| 代码生成 | 输入输出、边界条件、JDK 版本 | API 是否存在、依赖是否正确、边界处理 |
| 报错诊断 | 完整异常栈 + 相关代码 + 已尝试方案 | 结论是否符合栈信息;是否只是"猜" |
| 代码审查 | 代码 + 你的关注点(可读性/性能/安全) | 建议是否可执行;是否过度重构 |
| 方案对比 | 场景约束、评价维度 | 对比维度是否覆盖你的实际约束 |
| 类型 | 表现 | 识别方法 |
|---|---|---|
| 幻觉 API | 调用了不存在的方法或类 | 在 IDE 里敲一遍,编译不通过就是幻觉 |
| 版本过期 | 用 Java 8 之前的写法,或已废弃的 API | 看是否有 @Deprecated;对照官方文档版本 |
| 逻辑看似正确 | 主流程对,边界(空值、越界、并发)错 | 读边界分支;补测试用例 |
| 过度设计 | 三行能解决的事给了三层抽象 | 问自己"这个抽象现在有第二个实现吗" |
最有效的单条审核手段:把代码粘贴进 IDE 编译。 一次编译能过滤掉幻觉 API 和语法层面的错误——这类问题在 AI 输出里占比很高。
拿到 AI 生成的代码,逐项过一遍:
| 不该交给 AI | 原因 |
|---|---|
| 核心业务规则的判断 | 规则背后有业务上下文与责任,AI 无法承担 |
| 最终的技术选型决定 | 选型涉及团队、成本、长期维护,不只是技术对比 |
| 你没读懂就提交的代码 | 出了问题你无法排查,这是最危险的负债 |
| 需要保证正确的关键算法 | 边界与性能问题必须自己验证 |
| 个人隐私、公司敏感数据 | 直接违反合规要求 |
一条实用准则:如果一段代码你解释不了,就不要提交——无论它"跑起来是对的"。
差:什么是多态?
好:我已经学了继承和方法重写,也写过父类引用指向子类对象的代码,
但我不理解"编译时类型决定能调什么方法"这句话。
请用一个最小例子说明:为什么编译时要看声明类型?
如果编译期就按运行时类型检查,会有什么问题?第二种提问指向你的具体困惑,AI 不会给你一份能搜到的定义,而会针对性地解释。这也是检验自己是否真懂的方法——能提出精确的问题,说明你已经理解了一半。
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 能直接定位到"遍历中删除导致索引偏移"这类具体机制。
帮我写一个订单结算功能,要考虑各种情况。问题有三层:规格不清(什么是"各种情况")、无法验证(结算规则对不对 AI 不知道)、责任缺失(出错时你无法解释为什么这么写)。
AI 可以帮你写:DTO 转换、参数校验骨架、日志与异常包装、单元测试用例的初稿。但"满减怎么算""优惠券能不能叠加"这类规则,必须来自业务,且必须由你确认。
本仓库 prompts/ 目录下保存了内容生产用的提示词,它们都遵循同一个结构。以课程作者提示词为例(节选):
你是一名资深 Java 课程作者。
请为「具备少量 Java 基础、希望系统补全知识并转向 Java 全栈开发」的学习者
编写一节原创课程。
必须包含:本节定位、学习目标、前置知识检查、核心概念、三个递进示例、
完整可运行代码、Debug 观察点、常见错误、动手实验、练习题、分级提示、
参考答案、掌握标准。
约束:
- 首次出现的术语必须解释
- 不假设用户理解未列出的前置知识
- 不能用伪代码代替可运行代码
- 不复制书籍、付费课程或网站正文注意这里的三个特征:明确了读者画像(AI 才知道讲多深)、固定了输出结构(结果可预期)、写死了约束(尤其是"不能用伪代码"这条,直接针对 AI 的偷懒倾向)。
AI 的输出没法下断点,但可以做两个检验:
AI 的语气与准确率无关。判断依据只有两个:编译运行 + 你自己的理解。
帮我设计一个电商系统,包含用户、商品、订单、支付、库存、推荐……范围越大,输出越泛。拆成小问题逐个问,每个问题都能验证。
Java 8 和 Java 21 的写法差别很大(List.of、record、虚拟线程)。不写版本,AI 通常按较老的语法给,你会拿到一堆过时代码。
把这道练习题答案直接给我。本节所在的课程提供了分级提示而不是直接答案,原因就在这:先看提示 1(方向),想 10 分钟;再看提示 2(关键点);真的卡死再看答案。思考的过程才是学习发生的地方。
目标:用同一问题对比两种提问方式的输出质量。
步骤:
Map<String, List<Order>>,我需要按订单金额倒序输出每个用户的前 3 笔订单,且当用户订单不足 3 笔时按实际数量输出。请给出 Stream 写法,并说明如果金额相同怎么保证顺序稳定。" 记录回答;验收方式:能说清第 1 步与第 2 步的差距来自哪几个要素。
扩展任务:让 AI 审查你自己写的 UserService,提示词里明确"关注过度 Mock 与异常处理"。然后把它的建议分成"采纳""部分采纳""不采纳"三类,并写下理由。
基础题
场景题
我的程序报空指针,帮我修一下。判断题
综合任务
提示 1(方向):第 4 题缺少版本、异常栈、相关代码、已尝试的方案。
提示 2(关键点):第 5 题判断的核心是"是否需要业务责任"与"是否涉及敏感数据"。
提示 3(接近答案):第 6 题的规则不必多,但每一条都要能在真实场景里执行——比如"AI 生成的代码必须编译通过并补一个测试才提交"。
补全后的提问:
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。关键补充:版本、完整异常栈(尤其是自己代码的那一帧)、相关代码、已尝试方案、期望结果。
参考规则:
## 我的 AI 协作规则
### 必须自己写
- 核心业务规则与状态流转
- 与资金、权限相关的逻辑
- 最终的技术选型决定
### 提交前必做
1. 在 IDE 里编译通过
2. 补一个覆盖主流程的测试并跑绿
3. 能逐行解释(解释不了的删掉或重写)
4. 用审核清单过一遍(边界、异常、安全、规范)
### 绝不发给 AI
- 生产数据库连接串、密钥
- 用户个人信息
- 公司未公开的业务规则与代码
### 固定提问模板
上下文(JDK/框架版本 + 代码 + 已尝试)
目标(一句话)
约束(不能用什么 / 必须满足什么)
输出格式(代码 + 说明 / 对比表 / 步骤)prompts/ 目录下的课程架构师、代码审查、内容审核等提示词(项目内文件)《知识库使用方式与学习节奏》 会把学习方法固化成可执行的周计划;此后进入 S1 编程语言基础,正式开始语言学习。
无,可直接开始
暂无