以前我一直觉得,自己是一个学习很认真的人。

每学到一个新的知识点,看到一段新的代码,我都会告诉自己:

我要把它彻底搞懂,才能继续往下学。

如果文章说:

这段代码是用来做去重的。

我的脑子马上开始冒出各种问题:

  • 为什么它能去重?

  • 底层是怎么实现的?

  • 时间复杂度是多少?

  • 为什么作者这样写,而不是另一种写法?

  • 如果换个场景,还能这样用吗?

这些问题如果没有答案,我就会觉得:

我其实没有学会。

于是,一个知识点可以研究几个小时。

我一直以为,这叫认真。

后来才发现,这种"认真",其实让我一直停在原地。


地图,不是城市

有一天,我突然想到一个特别有意思的比喻。

假设你准备去一个完全陌生的城市旅行。

现在有两种方式。

第一种

你坐在家里,打开地图。

开始研究:

  • 每一条街。

  • 每一个红绿灯。

  • 每一个公交站。

  • 每一家便利店。

  • 甚至每一个公共厕所。

你告诉自己:

等我把整张地图研究透了,我再出发。

结果呢?

半年过去了。

你还坐在家里。

因为地图太复杂了。

总有新的细节值得研究。


第二种

有人第一天就出发了。

第一天。

知道酒店在哪里。

第二天。

知道地铁怎么坐。

第三天。

知道附近哪里有好吃的。

第五天。

开始认识一些小巷。

一个月以后。

他甚至知道:

  • 哪条路下午不会堵车;

  • 哪家咖啡店老板喜欢聊天;

  • 哪条街晚上特别安静。

请问。

谁更了解这座城市?

答案几乎没有悬念。

一定是第二个人。

因为:

地图不是城市。

地图只是帮助你进入城市。

真正让你理解这座城市的,是不断在里面生活、行走、迷路,然后重新找到方向。


后来我发现,编程也是一样

一篇文章。

一段代码。

其实就是一张地图。

而我以前犯的错误,就是一直在研究地图。

却迟迟没有真正走进那座城市。

以前看到一段代码,我总会想:

这一行为什么这样写?

为什么不用另一种实现?

作者是不是还有更好的方案?

我觉得:

只有每一行都理解了,我才有资格继续学习下一节。

可是后来我发现。

真正让我成长的,不是研究这些代码。

而是在项目里不断写代码。

很多以前怎么都理解不了的问题。

过了几个月。

突然就懂了。

不是因为我突然变聪明了。

而是因为:

我终于走进了那座城市。

当有了真实的体验之后,地图上的那些符号,终于有了意义。


第一棵树,并不能代表整片森林

后来,我又想到另一个比喻。

学习,就像走进一片森林。

而我以前,总喜欢站在森林入口。

抱着第一棵树开始研究。

树皮为什么这样长?

树叶为什么是这个颜色?

树根为什么分叉?

树龄是多少?

研究得特别认真。

可问题是:

我一直站在森林入口。

我不知道森林里面有什么。

不知道哪里有河流。

哪里有山谷。

哪里有悬崖。

哪里有出口。

直到有一天,我终于愿意继续往前走。

走了很远以后。

我再回头看第一棵树。

突然发现:

它不再是一棵孤零零的树。

它属于整片森林。

原来它长在河边。

原来它旁边还有另一种树。

原来它的形状,是因为这里常年吹风。

很多以前看不懂的细节。

突然就有了答案。


不是不要研究细节,而是让细节长在全局里

以前我总觉得:

只要我足够努力,把每个细节都弄懂,我一定会学得更扎实。

后来我才意识到。

很多细节,并不是不能研究。

而是:

它们需要上下文。

脱离整个知识体系去研究一个细节,就像拿着一张城市地图,研究一个路口为什么这样设计。

答案当然存在。

但你没有走过那条路。

没有在那个路口等过红灯。

没有在那里迷过路。

所以,再详细的解释,也只是文字。

只有当你真正走过以后。

那个解释才会真正进入你的脑子。

所以,并不是:

先理解,再学习。

很多时候恰恰相反。

而是:

先学习,再理解。


我的学习观,也因此改变了

现在,每当我遇到一个新的知识点。

我都会提醒自己:

第一次学习。

目标不是把所有细节研究透。

而是:

建立地图。

先知道它是什么。

先知道它能解决什么问题。

先知道什么时候会用到它。

然后继续往前走。

等整片森林慢慢在脑海里形成。

再回来研究那些真正重要的细节。

这时候,你会发现:

以前需要花三个小时才能理解的问题。

现在,也许三分钟就懂了。


最后

后来,我给自己的学习原则,只留下了一句话:

不要因为想把第一棵树研究透,而一直站在森林入口。

先走进去。

因为真正让你理解森林的。

从来不是第一棵树。

而是整片森林。