有一个观察让我最近想了很久:身边那些"学得最快"的工程师,在 AI 工具普及之后,并没有变得更快——反而有些人感觉越来越焦虑,越来越难以判断自己到底学没学会一件事。
问题不在于他们不努力,而在于他们的学习方式,是为一个已经不存在的时代设计的。
传统学习路径,是为"信息稀缺"时代设计的
工程师这个职业,过去二十年的主流学习路径大概是这样的:看官方文档 → 跟着教程敲代码 → 做一个小项目 → 遇到 Bug 去 Stack Overflow 找答案 → 写博客总结 → 重复。
这套流程在本质上是在解决一个问题:信息获取成本高。你需要知道去哪找答案,需要会筛选信息,需要把零散知识拼成体系。写博客的价值也在于此——把知识"外化"出来,是对抗遗忘的一种机制。
但现在呢?信息获取的成本已经趋近于零。你随手问 Claude 一句"帮我解释一下 Kotlin 协程的调度机制",得到的答案质量可能比你花两小时翻文档还高。Stack Overflow 的流量在持续下滑,不是因为问题减少了,而是因为人们已经不需要去那里找答案了。
信息稀缺的时代结束了。但很多工程师还在用信息稀缺时代的工具和逻辑来学习,这就是问题所在。
AI 加速了"会用"和"理解"之间的鸿沟
有一个现象值得警惕:AI 工具让工程师在表面上"能做到的事情"飞速扩展,但深层的理解速度并没有同步提升。
有个很形象的类比:用导航开了十年车的人,某天手机没电扔在家里,发现自己完全不知道该走哪条路。你以为自己"会"了,其实是工具替你记住了。AI 写代码这件事,跟这个一模一样。
举个具体例子。让 Claude Code 帮你写一段 Android 的 WorkManager 代码,它可以在 30 秒内给出一段能跑的、符合最佳实践的实现。你 copy 过去,跑通了,问题解决了。这当然很好。
但如果下周你需要调试一个 WorkManager 在特定设备上失败的 Bug,需要理解 Doze 模式和电池优化对 Worker 调度的影响——这时候你会发现,你其实根本不知道这段代码是怎么工作的。
更麻烦的是,你甚至可能不知道自己不知道。因为你"用过"它,感觉上掌握了,但实际上只是借助 AI 完成了一次任务。
这个鸿沟在过去也存在(复制 Stack Overflow 代码的人很多),但 AI 把它放大了几十倍——因为 AI 可以给你几乎所有问题的"可运行答案",覆盖范围比 Stack Overflow 大得多,速度也快得多。
结果就是:工程师的"能力边界感知"变得模糊了。你以为自己懂的,其实是 AI 帮你做到的。这不一定是坏事,但你得清醒地知道这一点。
学习的本质从未改变:要建立能迁移的心智模型
这不是说要抵制 AI,那是反智行为。而是说,在 AI 大量替代了"信息检索"和"代码生成"之后,工程师的学习目标需要重新锚定。
真正有价值的学习成果,是能迁移的心智模型,而不是记住具体的 API。
什么叫心智模型?比如你真正理解了"事件循环"(Event Loop)的机制,那你不管是在 JavaScript、Kotlin 协程、还是 Python asyncio 里,都能快速建立直觉:什么东西会阻塞,什么是并发,什么是并行,哪里可能有竞态条件。具体 API 可以查,这个底层直觉不能靠查。
比如你真正理解了"局部性原理"(Locality),你就能在 CPU Cache、数据库索引、Android View 的 RecyclerView 复用策略里看到同一个东西,对性能问题有跨域的嗅觉。
这类心智模型,AI 不会帮你自动建立。它可以帮你验证、举例、纠偏——但构建过程需要你自己完成。
AI 时代,工程师应该怎么学?
给出几个具体的、可操作的改变。
① 用 AI 做"苏格拉底式"追问,而不是直接取答案
当你不理解一个东西时,不要直接让 AI 给你解释。先自己说出你的当前理解,然后让 AI 告诉你哪里是错的,为什么是错的。这个过程比被动接受答案有效得多。
举个例子,你想搞懂 Kotlin Flow 的背压机制,可以这样问:(具体长这样:)
我的理解是:Flow 的背压是通过挂起(suspend)来实现的,
当下游处理不过来时,上游的 emit 会自动挂起等待。
这个理解有什么不准确的地方?什么情况下这个机制会失效?
这种问法强迫你先构建一个假设,然后用 AI 来验证和修正,而不是大脑空着等着被填充。主动建构 vs 被动接收,认知留存率差距可以达到3-5倍。
② 把 AI 当 pair programmer,但你必须是 driver
Pair programming 里有 driver 和 navigator 两个角色。Driver 负责打字,Navigator 负责方向和思路。跟 AI 协作时,你永远要是 driver——你决定要做什么、为什么这么做,AI 是帮你执行和验证的 navigator。
一旦你让 AI 来决定"做什么",你就降级成了一个 code reviewer,而且还是个对代码不够了解的 reviewer。这是最糟糕的状态。
具体操作上,在让 AI 写代码之前,先写一段伪代码或者注释描述你的思路。(举个具体例子:)
// 我的思路:
// 1. 用 StateFlow 保存 UI 状态,避免 LiveData 的 null 问题
// 2. 在 ViewModel 里用 viewModelScope 启动协程,生命周期绑定
// 3. 错误状态单独处理,不混入 data class
// 帮我按照这个思路实现 UserProfileViewModel,
// 如果思路有问题,先告诉我哪里不对
这样做的好处:即使 AI 写了代码,你至少对"应该是什么样的"有预期,review 会更有效,而且你的思路本身也在接受验证。
③ 用"教学测试"代替写博客
写博客的本质价值是"费曼技巧"——把东西教给别人,才知道自己到底懂没懂。但写博客成本高、反馈慢。
替代方案:写可以独立运行的"教学测试"。
比如你学了 Kotlin 协程的 CoroutineContext,不要去写"Kotlin协程上下文详解",而是写一组注释详尽的单元测试。(大概长这个样子:)
class CoroutineContextLearningTest {
/**
* 验证:子协程会继承父协程的 CoroutineContext
* 但 Job 对象不继承(每个协程有自己的 Job)
*/
@Test
fun `child coroutine inherits parent context but not job`() = runTest {
val parentJob = coroutineContext[Job]
var childJob: Job? = null
var childDispatcher: CoroutineDispatcher? = null
val child = launch(Dispatchers.IO) {
childJob = coroutineContext[Job]
childDispatcher = coroutineContext[CoroutineDispatcher]
}
child.join()
// Job 不同,是独立的
assertNotSame(parentJob, childJob)
// Dispatcher 继承自父(除非显式覆盖),但这里覆盖成了 IO
assertEquals(Dispatchers.IO, childDispatcher)
}
/**
* 验证:withContext 切换 Dispatcher 不会创建新协程
* 只是切换了执行线程,协程本身是同一个
*/
@Test
fun `withContext switches dispatcher without creating new coroutine`() = runTest {
val outerCoroutineId = coroutineContext[Job].hashCode()
var innerCoroutineId: Int = -1
withContext(Dispatchers.IO) {
innerCoroutineId = coroutineContext[Job].hashCode()
}
// 同一个协程,Job 相同
assertEquals(outerCoroutineId, innerCoroutineId)
}
}
这些测试是你真正理解之后才能写出来的。它们可运行、可验证、可作为以后的参考,比一篇博客文章的价值高得多——你三个月后翻出来,直接能跑,而不是要重新阅读。
④ 选择"有阻力的"学习路径
认知科学里有个概念叫"合意困难"(Desirable Difficulties)——学习时适度的阻力反而会增强记忆和理解,因为你的大脑需要努力提取和重构信息。
AI 的问题是它把所有阻力都消除了。你遇到问题,0.5 秒内就有答案,没有任何困难。这在短期内极其爽,但长期来看你在用"提取强度"换"遗忘速度"。就像健身房里用助力机器代替自由器械——动作完成了,肌肉没有真正受力。
一个反直觉但有效的做法:先自己解题,再去看 AI 答案。即使你花了 20 分钟也没做出来,这 20 分钟不是浪费的——它建立了你大脑里对这个问题的"挂钩",让你之后看到答案时理解更深、记得更久。
具体可以:
• 面对新技术,先自己设计一个 API 或架构方案,再去看官方设计,对比差异
• 修 Bug 时给自己设一个"不许用 AI 提示"的 15 分钟,先穷尽自己的排查思路
• 读源码时先猜实现,再翻代码验证,而不是一上来就让 AI 总结源码
⑤ 把精力放在 AI 不擅长的地方
AI 非常擅长:把已知的代码模式翻译成新的形式、解释现有概念、生成符合规范的样板代码、找低级语法错误。
AI 不擅长(截至目前):理解你的业务上下文和历史债务、做涉及人的判断(比如这个需求值不值得做)、在真正的新领域里给出有创造性的方案、对"系统整体感"的把握。
工程师应该把更多学习精力投入到 AI 不擅长的这些地方。系统设计、工程判断、跨域连接、沟通与需求分析——这些能力的培养,AI 没法替代你,也没法帮你走捷径。
关于"学习焦虑"这件事
值得单独说一下。很多工程师现在有一种弥漫性的焦虑:新工具太多,跟不上;AI 发展太快,不知道该学什么;感觉什么都会一点,但什么都不深。
这种焦虑的本质,是把"知道"和"理解"混为一谈,同时把"技术宽度"当成了安全感的来源。
现实是:在 AI 工具普及之后,"知道"的价值在迅速贬值。能让 AI 帮你检索和整合的知识,本质上已经不是你的核心竞争力了。真正的安全感,来自于一些很难被复制的东西:你对一个系统的深度直觉、你在特定领域积累的判断力、你理解人和业务的能力。
这些东西,跟你学了多少新技术、装了多少 AI 工具关系不大,跟你在真实问题上花了多少心力密切相关。
学少一点,学深一点,选你真正在用的东西深入下去——这是我目前觉得最不会后悔的方向。
一些反直觉的结论
把上面说的浓缩成几个不那么主流的判断,你可以拿来跟自己的经验对照:
• 用 AI 写代码的效率 ≠ 学习效率。生产效率提升是真实的,但学习效果可能为负。两件事要分开管理。
• 技术宽度正在被 AI 平权。你会五门语言,AI 也会。宽度已经不再是护城河,深度才是。
• 写博客的价值已经从"输出内容"变成了"建立思考习惯"。为了 SEO 或影响力而写的博客价值在下降,为了整理自己思路而写的私人笔记价值在上升。
• 最好的 AI 协作,是 AI 帮你更快地犯错和纠错,而不是帮你跳过犯错的过程。犯错是学习的核心机制,AI 不应该把它消除,而应该加速它。
• 学习路径上的"速度感"越强,可能越危险。"两天学会了 XXX"的感觉,在 AI 时代要打个大问号——你是真的学会了,还是 AI 帮你完成了?
下一步值得想的问题
最后留一个问题:你上一次真正"卡住"是什么时候?
不是指 AI 给了错误答案、你去找了正确答案那种卡。是指你在一个问题上想了很久,翻了很多资料,还是不确定答案,最后做了一个判断,事后还在反复验证那种卡。
如果你想不起来,或者上一次是很久以前——那可能说明你的学习过程已经太顺滑了。顺滑不一定是好事。
值得探索的方向:能不能设计一套专属于自己的"AI 辅助 + 刻意练习"学习系统?不是拒绝 AI,而是把 AI 的能力嵌入到有意识的学习框架里。这个问题没有通用答案,但每个工程师都值得认真想一想。
如果这篇文章对你有帮助,欢迎转发给同在思考这些问题的工程师朋友。