问题描述
对于通过考试是有用的,除此之外的用途就很可疑了。至少我自己后来做科研和工作所用的知识,有 80% 以上是靠自学,而不是在考试周强记下来的。
特别是编程,背什么 i= ++i-- 的效果之类的知识真没有什么卵用。 甚至看教材上知识,都是没有什么用的。大部分有用的知识,都是通过边做边学得到的,看书只是辅助。
对于比较难以边做边学的领域,看书学习和记忆知识也要讲究策略,先
以下内容节选自 @Thoughts Memo 汉化组的译文《论学习的广度与深度》
从做中学与「看书学习」
我从小就是个程序员。和大多数程序员一样,我特别喜欢「从做中学」。面对新的编程语言,我不会先去啃手册,而是直接动手尝试写点什么,遇到问题时再现学现用。这种方法对我来说有很多好处。它让我得到快速的反馈和奖励,让我的学习活动更贴近我真正的目标(编写程序)。当我确实需要「看书学习」时,我也更有动力,因为那是为了解决我遇到的具体问题。而且,实际动手的过程在认知上也很有帮助:要在实践技能如编程方面建立流畅性,我们必须在许多经验中归纳并学习模式。
哪些材料可以用这种方式学习?这种学习风格会带来哪些问题?我还没有好的答案。目前,我只能分享一些粗略的观察。
我十几岁就开始写 C 语言,但总是遇到程序因为「错误的内存访问」崩溃的问题。我花了好长时间盯着代码,试探性地修改程序,想找出 bug 的原因。但我完全摸不着头脑。原因是我根本就不懂指针和内存分配这些概念。我写指针就像照搬,把别的程序里的代码复制过来用,自己却不知道它们是干嘛的。光靠「尝试写程序」是解决不了这个问题的。我需要静下心来好好学习这方面的概念知识,这些在我有的几本书里都讲到了,但我以前都没怎么看。不幸的是,那时候我已经养成了不好的习惯:依赖从做中学,没耐心去研究艰深的概念性材料。我用了好几年时间才慢慢补上这些知识漏洞。类似的问题在我后来「学习」OpenGL 的时候又出现了,那时我主要是通过模仿教程里的代码来学。尽管我有很多概念上的漏洞,但我还是做出了一些复杂的游戏。但越来越多时候,我遇到了难以克服的障碍。后来在大学,我自己实现了一些机器学习系统,但对它们如何运作一知半解。不久,我又陷入了困境,不知道问题出在哪里。
这个故事的寓意并不是说,在动手做一些严肃的项目之前,我应该先从头到尾读完一本教科书。实际上,那些动手实践的工作确实激发了我对这个领域的热情,并且也让我掌握了一些真正的技能。如果有一个导师能直接告诉我:「噢,你遇到困难是因为你不懂指针。读读这几页书,然后我们聊聊,我再建议你接下来看什么。」这样我就不用再沮丧几年了。
我的编程故事之所以可能,因为编程是个特殊的领域,哪怕你懂得很少,也能开始做些有意义的事。烹饪也是如此。有这种特性的主题特别适合从做中学。学习的问题大多变成了如何安排一些辅助活动,来弥补在理解概念上的空缺。根据我的经验,最可能的失败模式是,我在概念学习上花的时间太少,因为我无法觉察自己的知识缺口带来的影响,或者无法看到获得某些理解的潜在价值。
另一方面,对于大多数主题,我开始深入研究前,都需要一定程度的「看书学习」。面对这种情况,我有自己的一套方法。
一种方法是,我把最初的「看书学习」当作是画地图。我先粗浅地阅读,弄清楚我想做什么项目,需要学哪些东西才能做起来。这样一来,我再去深入阅读这些片段,相信我会得到一些有意义的活动作为回报。
还有一种方法是让自己爱上那些概念本身。我之前对数学不太感兴趣,主要是因为我只接触过糟糕的数学书和教师。我把数学当做工具,就像是为了编程而不得不吃的西兰花。但后来,我遇到了充满美感和震撼的数学讨论,发现自己很容易沉浸其中,不再需要特定的项目作为动力。我多希望早点遇到这样的数学呀。
大家经常问我,记忆系统真有必要吗?如果某个想法真的重要,难道不是自然就会在工作中用到吗?如果不重要,忘了不是更好?我常用的几个回答其实和之前的讨论有关:
- 很多时候,自然的学习环境并不会明显地暴露出我们对某个概念的理解漏洞。即便你现在对某个概念掌握得很好,但这种环境也不一定能全面巩固你的理解,尽管这些细节将来可能派上用场。
- 记忆系统能帮你更快地「启动」,达到能自然运用这些知识的水平。
- 当你觉得某个想法很有趣或引人深思时,即使你目前的项目用不到它,深入探究它本身也是有意义的。
但我认为,这些反对意见也揭示了记忆系统的一些重要问题。复习往往感觉枯燥乏味,跟我真正感兴趣的事情没什么关联。很经常,对某个想法的讨论让我着迷,但当记忆系统里的相关卡片出现时,我却提不起兴趣。而且,跟技能有关的练习似乎效果不佳,可能是因为我并不是在实际使用这些知识的环境中进行练习。我认为,无论是更熟练地运用现有系统,还是创造新的系统级改进,我们都有可能解决这些问题。