回想在学校的日子,每天每天似乎都在学习新知识,课堂上、教课书本里。而或许有一天你也会有和我一样的想法:“这些不是我想要的,我只是被迫接受,不得不接受啊”,这样的声音虽小,但也是“呐喊”了。我跟从内心,但又不得不得做出一副顺从的样子,把灌输进来的“知识”接受,考完试之后再排出体外。可这不影响,马克吐温有一句:

Don’t let your boy’s schooling interfere with his education.

本来学校只是我获取知识来源的小小一部分,或是给了我一个学习的氛围,而现在连这氛围也有着咄咄逼人的气息,全都变成一个目标–考研。所以学校作为我的知识来源也算彻底破灭了。

互联网(注意我这里说的互联网,在中国你只能体验到全世界最大的局域网)成了我获取知识的主要来源(当然也包括纸质的书本,但也可以从互联网获取嘛)。但是互联网上的知识”鱼龙混杂”,你需要良好的工具和分辨的能力,没有养分的知识大可不必接受。这篇文章就是为此而写,我总结了四个关键字:溯源、对比、实践、输出。如果你不想往下看,或是觉得我写的都是垃圾,那么四个关键字就够了,具体内容可自行脑补~

虽然我总结了这四个关键字,关键字很好用。但是关键字本身是对知识的总结,这一总结,难免会出差错或偏差。你可以把关键字看作是对知识的“投影”,如果知识是立体的,那么关键字就是它的一面投影而已。

溯源

到知识的源头去 如是说

那么知识的源头是什么?如果才能获取知识的源头?这些问题是非常难回答的,但若无法回答知识是什么,将难以设计能产生更多知识和有效利用知识的方法。

知识可以是书本,可以是大师的箴言,可以是口口相传的经验。知识是对事物的认知/想法,或是通过实践得到的既定事实。

维基百科中知识的定义如下:

知识是对某个主题确信的认识,并且这些认识拥有潜在的能力为特定目的而使用。意指透过经验或联想,而能够熟悉进而了解某件事情;这种事实或状态就称为知识。

我把知识分为几类:事实、经验、想法和联想:

  • 事实:自然科学中大大多是既定事实,比如光速为 C(299 792 458 m / s)。计算机科学、数学也是如此。这些知识是可以通过实践得知和验证的。
  • 经验:根据事实,进行推导,而被人们普遍接受的。比如一些生活常识、处事道理。
    • 注意:经验不一定是正确的。
  • 想法和联想:对于一个得到验证的正确算法,它也是事实,但是如果你要问:“最开始想出这个算法的大佬,是怎么回事?”,我只能说,人的想法和联想的产物也是知识,如果它得到认可或普及,或许可以变为事实和经验。
    • 注意:想法和联想也不一定是正确的,但有时却又无关对错。

事实可以通过实践来验证,你可以对它深信不疑,但也要小心某些伪装成事实的知识。事实的源头就是实践,实践出真知。

经验就比较难办了,你可以去实践经验,但是它不一定的对的,也就是用试错法。而有些经验是错误的,但却是有用的,比如某些职场潜规则和本地风俗,这类经验我不做评价,还请自行判断。

对于想法和联想要更加小心,你要意识到他们只是人(没错,我们也是人)的想法,它不会因为介质的变化而升华。比如,印刷在书上的作者自己的想法和联想;再比如本文,不会因为发布在微信公众号里或者我的博客里,就变成了正确的知识。要对这些想法保持质疑。

这样总结来说,知识的源头有两个:事实和人的想法和联想。

想法和联想的源头便是自于最初有这个想法的人,如果他/她是某个领域的大师,要跟随他的脚步很简单,去读他的作品吧。如果是英文的(不得不说,大部分知识的源头是英文的,特别是计算机领域的知识),最好去读英文原著。感受大师的风采,知识就像源源活水,每每令人流连忘返,豁然开朗。

对比

有时找出知识的源头并不容易,这样一味地去寻找反而误了时间,而又毫无收获。这时可以用“对比”的方法,比较各个版本的知识,分析它们的对错,可以进一步实践进行分辨。

最近在学编译原理,在讲到自顶向下语法分析的“左递归转化为右递归”时,不太理解。于是我比较了三个版本的说法。

  • 极客时间中的《编译原理之美》课程中写道:

    消除左递归,用一个标准的方法,就能够把左递归文法改写成非左递归的文法。以加法表达式规则为例,原来的文法是“add -> add + mul”,现在我们改写成:add -> mul add’;add’ -> + mul add’ | ε

  • 《编译器设计(Engineering a Compiler)》书中写道:

    对于直接左递归,我们可以分别重写各个产生式使之使用右递归,结果如下面右侧所示。
    Fee -> Fee α | β

    Fee -> β Fee'; Fee' -> α Fee' | ε

  • 英文维基百科中是这样的:

    Left Recursion Wiki

可以看到,三个版本可以分为两种形式:

  • 英文维基和《Engineering a Compiler》结论是一样的:Fee -> Fee α | β 变成 Fee -> β Fee'; Fee' -> α Fee' | ε

  • 《编译原理之美》课程中:Fee -> Fee α 变成 Fee -> α Fee'; Fee' -> α Fee' | ε

因为从左递归到右递归的转化公式是固定的,也算是既定的事实。而三个版本各自的可信度当然也不同,大概是英文维基百科 ~= 课程 < 《Engineering a Compiler》(国外大佬著作),所以我肯定是比较倾向相信《Engineering a Compiler》中的结论,而它离知识的源头也最近吧。

简单的说下结果,《Engineering a Compiler》中最为准确明了的结论。英文维基的也没错。《编译原理之美》课程中,少了一个| mul,也就是add -> add + mul | mul; 改写 add -> mul add';add' -> + mul add' | ε。这样这个问题的不确定性就解决了,因为公式是可以推导,只要进行进行推导便会发现错误所在。如果还不能发现,还可以实际进行编码,计算机会告诉你答案的。

这个例子(虽然不太通俗易懂)可以看到对比的两个步骤:可信度排名、归类、验证。对各个版本的知识进行排名,选出最可信的,作为参考。将相同结论的知识分为一类,你可以看到不同版本之前的差别在哪,而差别就是问题所在。通过推导、实践验证各类的正确性。


未完待续…