未知的必然、必要和必需

发布于 2017-11-25  24 次阅读


by XIAOLAI on 2010/05/20

上学的时候,每个班级里都有“最爱钻牛角尖”的人。他们误以为任何时候,在任何事情上都应该“刨根问底”,不把一切都搞清楚决不罢休──并把这种态度当作不可放弃的真理一般对待。正因为如此,他们“全然无法忍受任何未知的存在”,所以要“问个不休”,“苦思冥想”,用尽全部精力,乃至于已经没有剩余的脑力去想起另外一个显而易见的事实:他们和任何人一样,从来没有在任何一个问题上“全知全晓”

其实,只不过是程度不同而已,大多数人都多多少少有“钻牛角尖”的习惯──因为对未知的恐惧早已根植在人类的基因之中。人们害怕未知。一切未知的、不可知的因素都会严重威胁人们的安全感。

未知因素给人们带来的心理压力远远超出本能的想象。假设有一个未知因素存在,X,它可能导致A、B两种情况,这时候,“可能这样、可能那样”的犹豫就已经可能造成巨大的心理压力。而如若还有第二个未知因素,Y,它也可能导致两种情况,C或者D,那么X和Y共同存在的结果就可能有AC、AD、BC、BD四种情况……如果再有第三个未知因素,Z,又可能导致E、F两种情况,那么总计的可能性就有8种(23)排列组合……也就是说,随着未知因素数量的增加,这些因素所引发的可能性将呈几何级数增加──这就是未知之所以可怕的根源。

进入任何一个新的领域之时,这种压力都使得新手窒息。而已经在那个领域里浸泡过一段时间的人往往早已忘记了这种恐惧和压力的存在,抑或懒得,抑或不屑,去向新手解释,帮助新手削减压力。更多的时候,那些“老手”实际上并不是懒得或者不屑,而是“没想到连这个也竟然需要解释”。这就好像是我们每个人小时候都是挣扎了很久才学会如何系鞋带的,可是早已经忘了那竟然是个需要挣扎才能学会的事情。而另外一些老手是因为“很早就学会”所以没想到“竟然还有人连这个都不会”。这就好像有些很小就学会游泳的人,很可能会误以为谁都会游泳,他们会这么想:“怎么可能连这个都不会么?!”……

比如,自学编程的人,可能会在教程编纂者全然没想到的地方卡壳。当Google API的文档编纂者穷尽力气去写一个“想让任何人都看得懂”的文档的时候,他们不知道有一些新手看到以下的代码,先被“foo”、“bar”这两个词给卡住了,一个疑问浮现在脑海:它们是什么意思?为什么要取这样的名字?

foo('bar', {
...
}
, 200, null)

事实上,这两个“怪词”充斥在许多“入门读物”之中却又几乎从来没有人针对这样的疑问提供充分的解释。

// C/C++ code
#include <stdio.h>
 
int main()
{
   char foo[] = "Hello,";
   char bar[] = "World!";
   printf("%s %s\n", foo, bar);
 
   return 0;
}

去Wikipedia看看Foobar究竟是什么意思。

事实上,很多人都不明白为什么循环(Loop)代码块里,起始变量名称是“i”?事实上,谁都不是很确定。据猜测,“i”可能是“index”这个单词的首字母。而循环嵌套的时候,第二层循环的起始变量名称通常用“j”,这就不是什么单词的首字母了,只是因为“j”在英文字母表中排在“i”之后而已……在其它的领域也一样。比如,学英语的时候,很多初学者都为此疑惑过:“为什么‘John’这个名字会被翻译成‘约翰’?就算是音译,这也差太远了吧?”这些只是最常见的几个例子而已。但凡自学过任何一点技能的人,都能理解这种可能的“牛角尖陷阱”几乎无处不在。

然而,为了进步,我们必须忍受一定的未知。首先,我们要知道我们就不可能全能全知。有些时候,有些疑问是没有答案的──就好像“先有鸡还是先有蛋?”一样。而另外一些时候,即便有了答案,也不见得是我们能够搞懂的。比如在自学编程的时候,学到流程控制(Control Flow)之时,了解到除了“顺序”(Sequence)之外,只用“分支”(Branch)和“循环”(Loop)就能够完成一切的流程──初学者多少都会好奇,这是怎么证明的呢?这当然是经过严谨的证明才被广泛接受的,然而,究竟有多少初学者可以看懂那证明过程呢?── 这里有Böhm, Jacopini于1966年发表的论文的PDF版:Flow diagrams, turing machines and languages with only two formation rules。这样的时候,并不是“反对问为什么”,而是说,“暂时不用去问为什么”可能更划算

其次,我们要知道未知分为两种:一种是永远不能解决的,另外一种是在可预见的未来也许能够解决的。对一个人来说,超过100年就算是“永远”了。所以,第一种未知对个人来说,意义不大;而第二种却是我们必须面对的。学习的难度也存在于此,“第一章的内容需要后面某一章的知识才能够深入了解”,这是几乎所有高难知识体系的普遍特征。也就是说,在第一章,我们会有无数的疑问,可是,这些疑问并不是以当时的知识可以全部解决的;需要我们继续前行,用未来获得的知识解释今天的疑问。这就是为什么那些“爱钻牛角尖”的人最终吃亏的重要原因了──他们想“马上解决当时不可能解决的问题”。事实上,做人难也是一样的道理──小时候就要做一些事情,而为什么要做这样的事情,只有长大之后才知道……所以,很多人长大之后才发现自己少做了很多该做的事情,自己把自己的人生给扭曲掉了。

一个相对有效的解决策略是:有问题解决不了,暂时先把它记下来,而后继续前行。注意,一定要记下来。很多人没有记录的良好习惯,乃至于曾经有过思考(有疑问,就是思考的起点)不过后来却仅因为“忘了”而失去获得答案的机会。继续前行,并不意味着忽略这些问题和疑问,因为它们被记在本子上;而又因为它们被记录了下来,所以可以经常被拿出来重新审视(Review),不一定什么时候、什么地方、因为什么由头,它们之中的一部分就突然有了清楚的解决方案。当然,更可能的原因只有一个:你一直在前行,你一直在积累,你一直在成长;所以,到有了答案的那一刻,你不再是当初无能为力的你。再次重生