我们生活在一个获取知识越来越快的时代。
以前遇到一个不会的问题,要翻书、查文档、逛论坛,甚至折腾一下午。
现在打开 AI,输入一句:
Java 的 synchronized 到底锁的是什么?
几秒钟以后,答案就摆在面前。
再复杂一点也没关系。
JVM、Redis、MySQL、分布式事务、网络协议、操作系统、算法……几乎所有已经被人类总结过的知识,都可以在极短时间内被检索、整理,然后送到你的眼前。
从这个角度看,我们似乎进入了一个学习速度前所未有的时代。
但我越来越觉得:
知识获得得越快,人反而越需要主动慢下来。
因为“看到了答案”和“真正会了”,中间隔着非常远的距离。
一眼看懂,是学习中最大的错觉
学习计算机的时候,经常会出现一种很奇怪的感觉:
看别人解释时觉得特别简单。
synchronized (lock) {
// 临界区
}
哦,不就是拿锁吗?
Redis 分布式锁:
SET lock_key random_value NX EX 30
哦,不就是 NX 保证不存在时才能写入,再加个过期时间吗?
反转链表:
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
四行代码。
似乎一分钟就学会了。
可一旦把页面关掉,让自己重新写一遍,脑袋立刻空白。
更麻烦的是,有时候代码甚至还能默写出来,但别人追问一句:
为什么?
就答不上来了。
为什么 synchronized 修饰普通方法锁的是当前对象?
为什么静态方法锁的是 Class 对象?
为什么 Redis 解锁不能简单 DEL key?
为什么链表反转一定要先保存 next?
为什么 wait() 会释放锁,而 sleep() 不会?
这些问题才真正决定了一个知识点有没有进入自己的大脑。
所以我现在越来越警惕一种状态:
“我看懂了。”
很多时候,它真正表达的是:
“别人说的时候,我能跟上。”
而不是:
“这个东西已经属于我了。”
大脑需要的不是答案,而是摩擦
真正能够留下来的知识,往往都有一点“费劲”。
你需要停下来。
想一会儿。
猜一个答案。
猜错。
重新看。
再运行一次代码。
然后突然发现:
哦,原来是这里。
这种过程看起来很慢。
甚至有点笨。
但偏偏就是这种“不顺畅”,最容易产生真正的理解。
比如学习线程同步。
直接记:
synchronized修饰实例方法锁this,修饰静态方法锁Class。
当然可以。
十秒钟就记住了。
但如果真的拿几个对象出来:
Demo d1 = new Demo();
Demo d2 = new Demo();
然后一个线程执行:
d1.methodA();
另一个线程执行:
d2.methodA();
再问自己:
它们会互相等待吗?
你需要先判断:
methodA 锁谁?
↓
锁 this
↓
d1 的 this 和 d2 的 this 一样吗?
↓
不一样
↓
所以不是同一把锁
这就慢多了。
可是当这种推导真正走过几遍以后,“锁对象”这个概念就不再是一句话。
它变成了脑子里的一套模型。
以后碰到:
synchronized(this)
synchronized(Demo.class)
synchronized(lock)
你不会再努力回忆某条八股文。
你只需要问:
两个线程抢的是不是同一个对象?
这时候,知识才真正开始变成能力。
快速获取知识,慢速建立模型
AI 出现以后,我觉得学习方式需要发生一个很重要的变化。
以前最大的问题是:
找不到答案。
现在最大的危险却是:
答案来得太容易。
一个以前需要折腾两个小时的问题,现在可能两分钟就解决了。
这当然是好事。
但如果把节省下来的时间继续用来疯狂摄入新的知识:
上午 JVM
中午 Redis
下午 Kafka
晚上 MySQL
睡前再看两个算法
最终很容易得到一种奇怪的结果:
什么都见过。
什么都能说两句。
但真的让你从零开始分析问题,又什么都不确定。
所以 AI 时代真正高效的学习方式,可能反而是:
快速获得信息,慢速消化信息。
让 AI 帮你节省:
- 搜索资料的时间
- 查 API 的时间
- 找示例代码的时间
- 阅读大量重复文章的时间
- 排查低级错误的时间
然后把这些时间重新投资到:
- 自己推导
- 自己写代码
- 自己预测执行结果
- 自己发现错误
- 自己解释为什么
- 过几天重新做一次
AI 可以把老师请到你面前。
但理解这件事,仍然没人能代替你完成。
不要一次学十步
我以前很容易产生一种冲动:
既然已经开始学了,那就一次性学完整一点。
比如学 Redis 分布式锁。
刚知道:
SET key value NX EX 30
马上继续:
Lua 原子解锁
RedLock
主从复制
锁续期
WatchDog
脑裂
fencing token
结果就是越看越多,越看越乱。
后来发现更有效的方法其实很朴素:
一次只解决一个问题。
比如:
为什么要
NX?
弄明白。
然后:
为什么一定要设置 TTL?
弄明白。
然后:
为什么 value 不能随便写个 1?
弄明白。
然后:
为什么解锁不能直接 DEL?
弄明白。
最后再把这些东西连起来。
这看起来比“一下午学完 Redis 分布式锁”慢很多。
但几天以后,如果别人突然问:
为什么 Redis 锁的 value 要放随机值?
你还能从“防止误删别人的锁”一路推导出来。
那才叫学会。
错误不是学习的副产品
很多人学习的时候害怕犯错。
做题最好一次就对。
代码最好一次就运行成功。
面试题最好看到就会。
但我现在越来越觉得:
没有犯过错的知识,通常也是最脆弱的知识。
因为错误会留下边界。
比如 SQL:
ORDER BY sum_amount
LIMIT 3;
第一次可能觉得完全没问题。
直到结果出来以后才发现:
MySQL 默认是升序。
自己要找的是金额最高的三个人,却把金额最低的三个人查出来了。
于是你真正记住的不是:
DESC = 降序
而是:
ORDER BY不写方向时默认 ASC,所以“Top N 最大值”一定要检查有没有 DESC。
这种知识特别牢。
因为它不是别人告诉你的。
是你亲手踩出来的。
所以错题集真正重要的从来不是“记录正确答案”。
而是记录:
我当时为什么会那样想?
只要这个错误模型还存在,下一次换一层皮,它还会再次出现。
慢,不代表磨蹭
当然,“慢慢学”也很容易走向另一个极端。
一个知识点研究三天。
一个概念非要把历史、源码、论文全部读完。
每行代码都想追到 JVM 汇编。
这同样没有必要。
真正有价值的慢,并不是学习速度慢。
而是:
在最关键的地方不着急。
简单的地方快速通过。
知道了
↓
能用了
↓
继续
遇到决定整个知识体系的核心概念时,再停下来。
等等
↓
这里为什么?
↓
如果换一种情况呢?
↓
我能不能自己预测结果?
↓
能不能不用原话解释?
所以所谓“唯慢不破”,并不是要求所有事情都慢。
而是:
输入可以快,理解必须慢。
一个很好用的判断标准
以后学完一个知识点,可以暂时不要问自己:
我记住了吗?
而是问四个问题:
1. 我能用自己的话解释吗?
不用书上的定义。
不用 AI 的原话。
像跟朋友聊天一样解释。
2. 我能预测它的行为吗?
给一段没见过的代码,我能不能提前判断结果?
如果结果和预期不一致,为什么?
3. 我能解释为什么不能换一种写法吗?
比如:
为什么
wait()必须配合 synchronized?
为什么 UNIQUE(user_id, product_id) 不能随便拿来做订单幂等?
为什么 HashMap 的 key 重写 equals 时通常也必须重写 hashCode?
能够回答“为什么不能”,往往比知道“应该怎么写”更重要。
4. 过几天以后,我还能重新推出来吗?
忘记一点并不可怕。
最重要的是还能重新推出来。
真正成熟的知识体系不是:
什么都不会忘。
而是:
即使忘了细节,也知道从哪里重新把答案推出来。
学习最终是在脑子里修路
第一次接触一个知识点,就像在森林里踩出一条路。
很难走。
到处都是树。
第二次走,会稍微清楚一点。
第三次。
第四次。
第五次。
慢慢地,这条路越来越明显。
直到某一天,你几乎不用思考就知道应该往哪里走。
这时候我们通常会说:
我会了。
而今天的 AI,可以瞬间把你送到森林另一头。
它甚至可以告诉你终点在哪里。
但如果你从来没有亲自走过中间那条路,下次没有导航的时候,你还是不知道怎么过去。
所以我越来越相信:
天下知识,唯慢不破。
不是因为慢本身有什么值得崇拜的。
而是因为人的理解,本来就需要时间。
答案可以被压缩。
资料可以被总结。
搜索可以被 AI 替代。
但一个概念在脑子里从“听说过”,到“看得懂”,再到“能使用”,最后变成“可以自由推导”,这个过程依然无法真正跳过。
技术变化越来越快。
新的框架、新的模型、新的工具还会不断出现。
也许未来获取知识只需要一秒钟。
但越是如此,我反而越想提醒自己:
别急着翻下一页。
先确认这一页,真的已经属于自己了。
评论
正在加载评论…