AI都生成代码了,Java程序员还学基础干嘛?讲点扎心的大实话
你负责“复制粘贴”,AI负责“生成代码”——看起来很美好,直到凌晨三点被一通电话叫醒
上个月,团队里来了个实习生,用了两周就把一个 CRUD 模块写完了,代码行数不多,但跑得挺顺。我问他:“这块逻辑你是怎么设计的?”他笑了笑,说:“问的 GPT,它给的代码直接就能跑。”
我没说什么。
一周后,这个模块上线了。凌晨三点,报警电话把我叫醒——系统 OOM,堆外内存泄漏,GC 日志里全是 Full GC,Metaspace 几乎被打满。排查了两个小时,最后定位到实习生写的那段“完美代码”:动态代理生成类没有限制,配合某个框架的类加载器复用问题,每次请求都往 Metaspace 里塞新类,十几个小时就把元空间撑爆了。
实习生很委屈:“AI 生成的代码,我看着也没问题啊。”
我问他:“你知道 Java 的类加载机制吗?知道 Metaspace 是干什么的吗?知道动态代理生成的类是怎么被加载和卸载的吗?”
他摇头。
我问他:“那你觉得,AI 能替你回答这些问题吗?”
先别急着怼,AI确实有用
我必须承认,AI 写代码的能力在飞速进步。现在的 Copilot、ChatGPT、Claude,在以下场景简直是神器:
- 生成标准的 CRUD 接口代码
- 写单元测试模板
- 完成重复性的数据转换逻辑
- 解释一段陌生代码的含义
我每天也在用。一个 Controller 从数据库查数据、转 VO、返回,这种活儿我从来不让手写,全是 AI 代劳。
但问题在于——很多人把 AI 当成了“编程能力本身”,而不是“编程能力的辅助”。
这就好比你会用计算器,但你不能不懂加减乘除。计算器按快了也会出错,而你连验算的能力都没有,那就只能等着账算错。
AI 写代码,最容易在这 5 个地方翻车
下面我说的每一个场景,都是真实踩过的坑。你自己对号入座,看看有没有中招。
翻车场景 1:事务注解“假装”有效
让 AI 写一个用户注册方法,注册完要插入积分记录。AI 很自然地给了这段代码:
java
@Transactional public void register(User user) { userDao.insert(user); pointsService.addPoints(user.getId(), 100); }
看起来没问题是吧?
但如果addPoints方法内部捕获了异常而没有抛出(比如记录日志后吞掉了),整个事务不会回滚,用户注册成功,积分却没加上。
懂基础的程序员知道,@Transactional默认只回滚RuntimeException和Error,检查异常不会触发回滚。而且事务要生效,方法不能是private,调用方必须走 Spring 代理。
AI 不会主动告诉你这些。你问它“这段代码有问题吗”,它会说“看起来正确,建议测试一下”。——这等于没回答。
翻车场景 2:线程安全的“我以为安全了”
让 AI 写一个计数器,统计接口调用次数。AI 给了这段:
java
private static int count = 0; public void increment() { count++; }
懂 Java 的人看到count++就知道,这不是原子操作,多线程下结果一定不准。
但如果你不懂 JMM、不了解synchronized或AtomicInteger,你可能就直接拿去用了。等线上压测发现数字不对,你还以为是业务逻辑算错了。
翻车场景 3:N+1 查询,性能杀手
让 AI 写一个“查询所有订单及订单项”的接口。AI 最常见的写法:
java
List<Order> orders = orderMapper.listAll(); for (Order order : orders) { List<Item> items = itemMapper.getByOrderId(order.getId()); order.setItems(items); }
这段代码在开发环境(10 条订单)跑起来毫无压力。上线后数据量到 1000 条订单,SQL 执行次数 = 1 + 1000 = 1001 次。
懂基础的程序员知道,这种情况要么用JOIN一次查出所有数据,要么用IN批量查询。AI 不会替你考虑“数据量增长后会发生什么”。
翻车场景 4:Redis 分布式锁的坑
让 AI 写一个分布式锁,它大概率给你这个:
java
Boolean flag = redisTemplate.opsForValue() .setIfAbsent(key, value, Duration.ofSeconds(30));
单看这行没问题。但解锁的时候呢?如果不判断是不是自己加的锁就del,可能把别人的锁给删了。
懂基础的程序员会告诉你:要用唯一标识value来验证身份,并且解锁操作要保证原子性——最好直接用 Redisson,它会自动帮你处理锁续期和释放的细节。
AI 能给你这些经验吗?不能。它只会给你“看起来对”的代码。
翻车场景 5:内存泄漏的隐藏彩蛋
让 AI 写一个缓存工具类,它很可能给你一个static Map无限往里塞数据,没有淘汰策略。
懂基础的程序员看到static就知道,这些对象的生命周期和 JVM 一样长,如果不控制,迟早 OOM。他会考虑用Guava Cache、Caffeine或者自己实现 LRU。
AI 不会提醒你“这段代码在生产环境跑一周会出事”。
为什么基础差的人,会被 AI 困在“舒适区陷阱”?
我给你画个表,一目了然:
| 维度 | 不懂基础的程序员 | 懂基础的程序员 |
|---|---|---|
| 使用 AI 的方式 | 复制粘贴 → 能用就行 | 生成 → 审查 → 调试 → 优化 |
| 遇到 AI 给的代码报错 | 不知道怎么改,重新问一遍 | 看堆栈、分析原因、精准修改 |
| AI 给出的多种方案 | 选第一个 | 根据场景(性能/可维护性/扩展性)选最合适的 |
| 线上出问题了 | 不知道从哪里查 | 从日志、监控、GC、线程堆栈系统性地排查 |
| 学新框架的速度 | 等 AI 教 | 看官方文档 + AI 辅助,几天就能上手 |
| 职业安全感 | 低——随时可能被更便宜的工具或新人替代 | 高——经验判断力 AI 学不会 |
不懂基础的人,AI 用着用着,就成了“AI 的传声筒”。
今天 AI 能写 Java,明天就能写 Python、Go、Rust。如果只会“让 AI 写代码,我负责复制”,那你的可替代性,约等于一个不需要工资的实习生。
哪些基础知识,是 AI 时代反而更重要的?
我不跟你讲废话。以 Java 为例,以下 5 个模块,优先级最高:
1. JVM 内存模型 + 类加载机制
为什么重要?AI 不会替你排查 OOM、不会替你分析 GC 日志、不会告诉你怎么优化 Metaspace。
学到什么程度?能说清楚堆、栈、方法区(Metaspace)分别存什么;知道类加载的双亲委派机制;能看懂 GC 日志里的关键指标。
2. 并发编程
为什么重要?AI 给的线程代码,十个有八个不是线程安全的。你不懂 happens-before、volatile、锁的升级过程,就看不出来。
学到什么程度?能手写一个生产者-消费者模型;能说清楚synchronized和ReentrantLock的区别;知道什么是死锁以及怎么避免。
3. 集合源码(至少 ArrayList、HashMap)
为什么重要?集合用不对,性能翻车是大概率事件。AI 不会告诉你 ArrayList 的扩容开销有多大,也不会提醒你 HashMap 在多线程下会形成环形链表。
学到什么程度?能说清楚 HashMap 的 put 流程、扩容机制、为什么容量是 2 的幂次方。
4. 设计模式
为什么重要?AI 能把代码写对,但很难写好、写优雅、写扩展性强。你让它写一个支付模块,它能给你 if-else 写到底;懂设计模式的人会自然地用策略模式或工厂模式重构。
学到什么程度?单例、工厂、策略、模板方法、代理这 5 种能熟练应用。
5. SQL 优化 + 索引原理
为什么重要?慢 SQL 是线上最常见的性能杀手。AI 能生成正确的 SQL,但不会分析 explain 结果,也不会告诉你该建什么索引。
学到什么程度?能看懂 explain 的 type、key、rows、Extra;知道联合索引的最左前缀原则。
AI + 扎实基础 = 下一个时代的稀缺能力
我最近越来越觉得,AI 不会淘汰程序员,但会用 AI 的“胶水程序员”会被淘汰。
懂基础的程序员,AI 是副驾驶——生成重复代码、自动补全、快速查文档,把时间省下来去做架构设计、性能优化、业务建模。
不懂基础的程序员,AI 是轮椅——离开 AI 连一个简单的循环都写不顺,AI 给什么就信什么,出了问题两眼一抹黑。
你想当哪种?
写在最后
这篇文章没有劝你放弃 AI。恰恰相反,我每天深度使用 AI 来写代码、写文章、查资料。
但所有这些“高效”,都建立在一个前提下:我知道 AI 给的代码为什么对,也知道可能哪里会错。
这个“知道”,靠的不是天赋,而是日复一日的、枯燥的、甚至有点反人性的基础积累。
✍️思考题
最近你用 AI 写的一段代码里,有没有出现过“看起来对,但仔细一想不对”的情况?欢迎在评论区贴出来,大家一起排雷。
推荐阅读
这个问题——”AI 生成的代码如何审查?“——我建议是先学习一下基础,可以关注一下下面的公众号。
如果你也想系统地夯实这些“AI 替不了你”的基础
这个公众号叫「从CRUD到架构师」,名字起得很直白——从每天写增删改查开始,一步一步走到能设计架构、能排查深坑、能带团队。
接下来,我会把 Java 学习路径的每个阶段,拆成每周一篇的干货:
| 时间 | 系列 | 内容方向 |
|---|---|---|
| 周一 | 《Java从0到1》 | 从安装 JDK 开始,到面向对象、集合源码、JVM、并发编程……一期一期跟下来,半年走完 Java 主线 |
| 周三 | 《架构师之路》 | Spring 源码、线上排查、分布式设计、性能调优的真实案例——都是自己踩过的坑 |
| 周五 | 《面试宝典》 | 高频面试题深度解析——不只给答案,更告诉你面试官在考什么,以及 AI 的回答哪里不完整 |
我不保证每篇都是爆款,但我保证每篇都是自己踩过坑之后写的。
不是告诉你“这个东西怎么配置”,而是告诉你:
- 为什么这么设计
- 面试官为什么爱问这个
- 真实项目里到底踩过什么坑
- AI 给的方案哪里不够、怎么改
如果这篇文章对你有启发
欢迎「关注」「从CRUD到架构师」公众号,每周一三五,我们一起把 Java 的基础和架构,一块块吃透。
技术这条路,一个人走容易迷路,一群人走,方向会越来越清楚。
—— 来自「从CRUD到架构师」
