你好,我是月影。

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


昔闻人言:天下之事,最轻易者莫过于求学,最恒难者,莫过于问道。予深以为然。
 
——引言

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

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

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

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

为什么你会觉得难

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

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

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

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

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

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

为什么你会听不明白

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

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

在《程序原本》这本书的前言致谢中,我感谢了我的小学数学老师,因此便有同学问我其中的缘故。我说:那本书中,所用到的数学知识,止于小学足矣。然而这本书却是我在极客时间开设《JavaScript核心原理解析》一课的基础,所以如今反观这本书、这门课程,其实在数学知识上都是“止于小学足矣”。

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

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

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

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

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

在《大道至简》中说过“问道于盲”的故事:只要你愿意闭上眼睛,你也可以向盲人问道。睁开眼问,这止于眼前的所谓“真相”,便是你的疑难了。

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

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

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

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

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

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

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

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

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

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

道理我都懂

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

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

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

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