以前我一直觉得,自己是一个学习很认真的人。
每学到一个新的知识点,看到一段新的代码,我都会告诉自己:
我要把它彻底搞懂,才能继续往下学。
如果文章说:
这段代码是用来做去重的。
我的脑子马上开始冒出各种问题:
为什么它能去重?
底层是怎么实现的?
时间复杂度是多少?
为什么作者这样写,而不是另一种写法?
如果换个场景,还能这样用吗?
这些问题如果没有答案,我就会觉得:
我其实没有学会。
于是,一个知识点可以研究几个小时。
我一直以为,这叫认真。
后来才发现,这种"认真",其实让我一直停在原地。
地图,不是城市
有一天,我突然想到一个特别有意思的比喻。
假设你准备去一个完全陌生的城市旅行。
现在有两种方式。
第一种
你坐在家里,打开地图。
开始研究:
每一条街。
每一个红绿灯。
每一个公交站。
每一家便利店。
甚至每一个公共厕所。
你告诉自己:
等我把整张地图研究透了,我再出发。
结果呢?
半年过去了。
你还坐在家里。
因为地图太复杂了。
总有新的细节值得研究。
第二种
有人第一天就出发了。
第一天。
知道酒店在哪里。
第二天。
知道地铁怎么坐。
第三天。
知道附近哪里有好吃的。
第五天。
开始认识一些小巷。
一个月以后。
他甚至知道:
哪条路下午不会堵车;
哪家咖啡店老板喜欢聊天;
哪条街晚上特别安静。
请问。
谁更了解这座城市?
答案几乎没有悬念。
一定是第二个人。
因为:
地图不是城市。
地图只是帮助你进入城市。
真正让你理解这座城市的,是不断在里面生活、行走、迷路,然后重新找到方向。
后来我发现,编程也是一样
一篇文章。
一段代码。
其实就是一张地图。
而我以前犯的错误,就是一直在研究地图。
却迟迟没有真正走进那座城市。
以前看到一段代码,我总会想:
这一行为什么这样写?
为什么不用另一种实现?
作者是不是还有更好的方案?
我觉得:
只有每一行都理解了,我才有资格继续学习下一节。
可是后来我发现。
真正让我成长的,不是研究这些代码。
而是在项目里不断写代码。
很多以前怎么都理解不了的问题。
过了几个月。
突然就懂了。
不是因为我突然变聪明了。
而是因为:
我终于走进了那座城市。
当有了真实的体验之后,地图上的那些符号,终于有了意义。
第一棵树,并不能代表整片森林
后来,我又想到另一个比喻。
学习,就像走进一片森林。
而我以前,总喜欢站在森林入口。
抱着第一棵树开始研究。
树皮为什么这样长?
树叶为什么是这个颜色?
树根为什么分叉?
树龄是多少?
研究得特别认真。
可问题是:
我一直站在森林入口。
我不知道森林里面有什么。
不知道哪里有河流。
哪里有山谷。
哪里有悬崖。
哪里有出口。
直到有一天,我终于愿意继续往前走。
走了很远以后。
我再回头看第一棵树。
突然发现:
它不再是一棵孤零零的树。
它属于整片森林。
原来它长在河边。
原来它旁边还有另一种树。
原来它的形状,是因为这里常年吹风。
很多以前看不懂的细节。
突然就有了答案。
不是不要研究细节,而是让细节长在全局里
以前我总觉得:
只要我足够努力,把每个细节都弄懂,我一定会学得更扎实。
后来我才意识到。
很多细节,并不是不能研究。
而是:
它们需要上下文。
脱离整个知识体系去研究一个细节,就像拿着一张城市地图,研究一个路口为什么这样设计。
答案当然存在。
但你没有走过那条路。
没有在那个路口等过红灯。
没有在那里迷过路。
所以,再详细的解释,也只是文字。
只有当你真正走过以后。
那个解释才会真正进入你的脑子。
所以,并不是:
先理解,再学习。
很多时候恰恰相反。
而是:
先学习,再理解。
我的学习观,也因此改变了
现在,每当我遇到一个新的知识点。
我都会提醒自己:
第一次学习。
目标不是把所有细节研究透。
而是:
建立地图。
先知道它是什么。
先知道它能解决什么问题。
先知道什么时候会用到它。
然后继续往前走。
等整片森林慢慢在脑海里形成。
再回来研究那些真正重要的细节。
这时候,你会发现:
以前需要花三个小时才能理解的问题。
现在,也许三分钟就懂了。
最后
后来,我给自己的学习原则,只留下了一句话:
不要因为想把第一棵树研究透,而一直站在森林入口。
先走进去。
因为真正让你理解森林的。
从来不是第一棵树。
而是整片森林。