
你好，我是月影。

专栏更新过半啦，我也收到了一些基础薄弱的用户反馈，说这门课难学。今天，我特意邀请了爱民老师，来和我们分享他的学习方法、心得。你可能会好奇，为什么今天没有音频。我希望你能静下心来，花上十几分钟，跟随着爱民老师一起思考学习的道理。

> 
<p>昔闻人言：天下之事，最轻易者莫过于求学，最恒难者，莫过于问道。予深以为然。<br>
&nbsp;<br>
——引言</p>


你好，我是周爱民。今天出现在这个课堂上，并不是因为我对月影兄所讲的“可视化”有着怎样的经验，也并没有什么应用技能或理论思想能和你交流。我在这里，想要与你讲的是“如何学习”。即便鼓了很大的勇气才领下这个题目，也不是因为我很善于学习。我在学习这件事上，是一个只会用笨功夫的人，没有什么技巧能跟你讲。

那我究竟为什么要来讲这个话题，又有什么可以跟你讲的呢？

这就要从同学们的感受说起了。“很难”，这大概是许多同学对月影这门课的直接感受。而这个感受，与引言中所谓“天下最轻易者”实在是天差地别。而我历来认为学习不同于问道：问道恒难，而学习甚易。这便是我想跟你聊一聊的道理。尤其重要的是，只要把这个道理听明白了，我想你学习起来也就轻松了。

正如我前面说过的，这不是学习的技巧，而是学习的道理。

## 为什么你会觉得难

很多人知道，我不是计算机专业出身的。在我决定自学计算机时，也并没有老师领路，因此，我需要自己解决的第一个问题便是：自修的话，先选什么课程。当时我是拿了计算机专业几年的课程表来看，然后把它们之间的关系理顺，最后决定先花一个学期单单只看一门《数据结构》。之所以这么选，是因为其它课程好像都要用到它，看起来也都与它有关。至于这其中的原因，我当时却是不明白的，因为没有人教，也没有人可以问。

那个时候，这门课用的是Pascal，我没有语言基础，学校的电脑上也没有这个语言，所以我基本是手写代码，脑袋编译。至于一段代码运行的正确性，对不起，没有上机测试，所以我也不知道。就这样忽忽的学了一个学期，我去考了试，得了70多分。

于是，我的《数据结构》的底子就这样扎下了。自那以后，我在计算机语言、应用这方面，再没遇到比当时更难的困境。这其中的道理很简单，**只要扎实基础，循序渐进，几乎所有语言与代码方面的问题，我们都可以一点点啃下去**。 直到如今，如果有人去看我写的那本《程序原本》，就能看得出这个硬底子还在。

当然，一定会有同学说：我的《数据结构》成绩比你还好，但一样觉得很难啊！

这是正常的。上面我说的这个道理，其实只说了一层。要知道我从业二十多年来，像《数据结构》这样一门一门、一本一本啃下来的课，也并不止一个。如今看起来学什么都容易，只不过是积腋成裘的结果罢了。在这个过程中，但凡我觉得有“非常之疑难”者，无不是中间少啃了那么一本两本“《数据结构》”。也就是说，**那些称得上“疑难不懂”的，其实都只是缺了几门知识，少花了几次笨功夫而已**。所以要学好月影这门课，且先不说他如何讲，你只要笃定一个笨想法就可以了：你看到不懂的名词，必然是少学了几门功课；看到不懂的话语，必然是少推断了几个逻辑，等等如此。

有着这些种种不懂，也就当然有种种能懂的知识。你把这些坑坑洞洞都补起来，自然也就懂了。只要你愿意像在学校里一样地去做笨功夫，这些缺失的知识又怎么算得上难呢？

## 为什么你会听不明白

不过很多人所面对的，倒不见得是“难”，而是所谓“疑”。疑难二字，其实并不是同一个东西：你攀山越岭时，所感觉到的便是“难”，只要努力，一座座地翻过去，总还是可以到达的。而你隔岸观花时，那种似是而非才是“疑”。

之所以有“疑”，并不是目力不济，而是心志不济。

在《[程序原本](https://github.com/aimingoo/my-ebooks)》这本书的前言致谢中，我感谢了我的小学数学老师，因此便有同学问我其中的缘故。我说：那本书中，所用到的数学知识，止于小学足矣。然而这本书却是我在极客时间开设《[JavaScript核心原理解析](https://time.geekbang.org/column/intro/100039701)》一课的基础，所以如今反观这本书、这门课程，其实在数学知识上都是“止于小学足矣”。

所以我很想问，都这样了，为什么还有人觉得“难”？又或者问，既然已是“如此这般地不难”了，那么你所“疑”的，又是什么呢？

但凡我们受过高等教育的，又或者写过几年程序的，都不妨把自己看成是“有知识、有经验”的人。这很正常，我们本来就是靠着这些知识与经验吃饭的，这都是看家底儿的东西。然而，这些东西“正确”吗？**我们之所“疑”的，往往就是所“见到”的与我们所“知道”的之间的矛盾**。比如说在《JavaScript核心原理解析》中，第一讲便是说“引用”这个概念的，然而ECMAScript中的所谓“引用”，与一般语言中的“引用”是似是而非的。所以，从这门课一开始，就有无数同学深陷于这一个概念之中，用既有的知识来解释它：有解释为指针的，有解释为结构的，有解释为类型的，……不一而足。

**为什么有“疑”？其实这是缘于我们对“已知”的不疑。**当这种不疑与面前的真相矛盾时，我们就怀疑了、拒绝了、不可接受了。学习中怕的不是看不懂，而是明明表面什么都看得懂，心底里却什么都不接受。这才可怕，这才畏怯，这才寸厘不进。

这也是很多课程“学不明白”的根由：你从一开始，就放不下那些你认为“对”的东西；既然你认为已看到的是对的，那么眼前所学的，又是什么呢？

所以**要解决学习中的“疑”，反倒是放开态度，认为自己什么也不懂，心志坚定地跟着眼前这位老师的步子一点点看，一遍遍练**。这个过程，**并不是要怀疑自己，而是要敢于舍弃自己**。相信他人既然可以为师，必有所长，必不吝于教，无有成见地去学习，才能学有所得，进而更新自己。

在《[大道至简](https://book.douban.com/subject/11874745/)》中说过“问道于盲”的故事：只要你愿意闭上眼睛，你也可以向盲人问道。睁开眼问，这止于眼前的所谓“真相”，便是你的疑难了。

## 为什么你觉得什么也没学会

其实月影这门课还有一个副标题，是“系统掌握图形学与可视化核心原理”，这与《JavaScript核心原理解析》有一个关键词的重合。并且，事实上在我那门课程的开篇中，我还专门提到这门课的要点是“体系性（系统）”，这算得上另一处巧合。

不过，“核心原理”+“体系性”却并不见得是“你觉得难”的根源。说到这里，恐怕又有不少人要跳起来反对了：都讲“核心原理”了，还不难啊？！

其实核心原理通常来说真的不难。例如密码学，核心原理就是映射变换；图形学，核心原理就是点（位置/坐标）等等。同样的，“体系性”也并不难，例如月影的课程，体系性就摆在那里了，你去看看课程目录就知道了。所以无论是体系，还是核心原理，都不是这些课程让你觉得难的真正原因。

这让我想起了《大道至简》这本书最后有一个“问智”的桥段。起首的一问是“何谓愚”，书中说的是：不知道事情的起始，也不知道它的终点，就是所谓的“愚”了。而在我看来，一门课程要是学不好、学不懂、学不通，起步上的错处，就在你对于要学会的东西“不知其始、非知所终”。

不管是什么课程，你得先知道老师“想讲什么”，这就是结果。如果一个课程你知道了结果，并且又假设结果是对的，那么学习它的方法就是按照老师所讲的内容，一步步推演过去就好了。这个过程是确定的，结果也是确定的，你所需的无非是推演中所缺的几门功课，以及一点耐心而已。所谓前人、所谓先行者，其实无非就是比你多走了一遍路途而已，所以只要我们放下自我的姿态，亦步亦趋地跟着老师讲的往前走，那么这个结果总是能看到的。

学习之“易”也就在于此：总有一个确定的过程，以及一个确定的结果。但是，这往往还不够。因为如果老师只教你这个结果，那也只是最低一等的“师”。无论如何，真正的“良师”，会帮助你解决“不知起始”的问题。——于此，你真正还需要知道的是老师“为什么要教”。一旦你知道了“教的目的”，也就知道了复核自己“学的结果”的方法，这就是相互印证了。如果学习不知道起始、不知道目的、不知道印证，那么怎么学都是茫茫然。

而核心原理和体系性的“易”也就在于此：核心原理总是一个简单的结论，你所学的，只是这个结论得到的过程；体系性总是一种明确的结构（组合），你所学的，只是将这个结构组织起来的方法。所以最终来说，你就是要得到一个核心推论的过程，以及了解它所涉及的那些领域之间的关系而已。

多数情况下，就结果来说，你甚至可以从课程目录，以及每章的小节中直接读到它们。那么不管它与你既有的知识是否有冲突，将这门课程粗略地看过去，拿了这样的结果（核心过程与结构关系）就可以了。

**不过，学习这样的课程，不要在“结果”上花功夫，从过程上去找、去看方法，才是正途。**

## 道理我都懂

正如引言中所说，学习这件事情，其实真的不是很难。至于是不是“天下最轻易者”，我可不敢跟古人去论争。所以在今天的分享里，我也只是想把一些似难实简的地方跟你说说：**其一，你可能只是缺了点知识，要补课；其二，你可能只是宥于所知，请开放思想；其三，你可能只是埋头学习，而忘了要学会的是什么。**

是的，我知道已经有人开始在说：“道理我都懂……”。

这种腹诽，实在是这么些年来我最怕见到的。因为持这种态度者，大多都是不愿下苦功夫的人。所以我希望读到这里，心底下还叹着“道理我都懂”的朋友，能再回到第一小节，从苦功夫做起。要知道**古往今来之有成就者，不过将学习持之以恒而已，哪里有什么技巧**。

不过如果要舍了学习不谈，只想拿个现成的东西去用，那么作为程序员，最好的地方是在GitHub，而不是在极客时间。我想，这个看起来众所周知的答案，便是我对那些急于掩卷而去的人，最后的劝慰了。
