(“高级语言怎么来的“ 系列仍然有后续,这篇是临时插入)

程序员心底的小声音

编程大约有三个境界,新手,高手,和高不成低不就的中手。这三个境界,大致和王国维先生划定的做学问的三个境界一一对应。 一般来说,如果不经过几十万行的代码的锤炼(衣带渐宽终不悔,为伊消得人憔悴),或者长期在一个高手团队里面打磨切磋,那么无论怎么样的理论熟悉,打字熟练,考试全A,编程起来,都应该算是中手。一个中手如果机缘很好,得到高人亲自指点,则能很快成长为高手,如果没有这样的机缘,那就要在“众里寻她千百度”这个层次苦苦的求索锤炼很久,才能“蓦然回首”。

读书是一种很好弥补没有高手在场的方法,都说书是最好的老师嘛。 可是现实是,高手写给中手的书很少。 在任何行业,适合新手的入门的书很多,适合中手的书就很少。 原因有两个,一来高手极少愿意耐心的的指点成长秘诀,就算写了,也是蜻蜓点水,因为这些经验啊结论啊,都被他们本身提炼成了珠玑,他们觉得最重要的也就是这么寥寥几句,也没有太多的废话好写。 而读者如果没有类似的经历,则看到这些珠玑,只是觉得把玩颇为有趣而已,极少能有同感。 鲜有高手,能把技术书写成散文集,如 Brooks 一样,在《人月神话》中把经验教训和经历背景等一一道来,并且从这些经历中抽出一般性的知识。 所以,高手的风格一般是浮光掠影概括一下大致自己领会到的几个原则和教训。 这些寥寥数语的珠玑,对于其他高手来说一看就懂,但是对于中手来说就很难以理解。 所以很多高手写出来的给中手看的书就曲高和寡。 二来,中手其实水平差异巨大,偏好也各不一样,有的或许根本认识不到自己应该走的成长轨迹,有的认为这些书籍是片面知识,所以把不喜欢的书都给扔垃圾堆了,光捡自己喜欢的书看;有的未必看得上高手的经验,认为高手说的那些自己也早就领悟到了。所以,也不喜欢购买这些书籍。这两个原因,就造成了高手提携中手的书在市场上很少见到。

不过这样的书倒不是没有,比方说在编程领域, 我至少可以推荐四本这类的书,这四本分别是

《Pragmatic Programmer》, 《The Art of UNIX Programming》, 《Elements of Programming Style》 和 《The Productive Programmer》. 这四本书,都是高手所写,都属于高手指导中手的典范。第二第三本我原先都介绍过。 而第四本余晟同学的书评比我写得好几百倍,所以我就以 《Pragmatic Programmer》 为例说明这个问题。

我们前面说了,对于中手,特别是在“寻她千百度”这个层次的中手来说,或许本身已经捡到了一些珠玑,或许对于像 《Pragmatic Programmer》 里面说的那些 Tip,有的是深有同感的。 比如 DRY (Don’t Repeat Yourself 不要重复你自己), 基本上大家都知道,可是在实际中(至少我自己)还是不停的一次一次的犯错误,做事情不符合 DRY 原则(一次一次犯这个错误本身也是一个 DRY 错误, 因为 DRY 原则要求你对于每种错误你只能犯一次)。 读到的时候深有同感, 写代码的时候却忘到 Java 国去了,这还真不是个案,是非常普遍的现象。

能不能让正确的原则指挥正确的行动本身,其实就是区分是否是高手的一个显著标志。 试想,两个都了解 KISS 原则的程序员在一起写代码,高手的代码必然是自然流露出 KISS 的优雅,而中手或许需要旁人提醒和多次重构,才能达到理想的状态。 出现这个问题的原因很明显–中手没有完全内化 KISS 原则,所以尚且不能“运用自如”。 内化是一个非常复杂的认知过程,本身涉及到大脑中 mind set 和 paradigm 的切换, 所以必然不是一个简单的隔夜就能完成的过程,这也就是为啥能够“消得人憔悴”,但是切换一旦完成,实践中就会自然流露出这种新的认识,也就是到了一个新的境界,发现灯火阑珊处。

那么原则和知识的内化这个过程怎么能够加速呢?也就是说,怎么较快的到达高手境界呢? 可以肯定的说,光靠对自己说我“下次一定按照这个原则这样做”是不行的。认知科学认为,频繁的高强度的外部刺激和自主的有意识的反复提醒是加速内化的两个重要方法。 第一个方法需要外部环境的支撑。 试想,如果一个程序员不是天天和复杂文本处理打交道,他必然没有足够外部刺激来熟悉和内化正则表达式; 如果一个程序员不是天天和极度复杂的大项目打交道,用全自动编译环境和自动单元测试也显得无甚必要,所以,除非你正好掉进了一个天天有高强度训练的环境,否则全靠第一点是不可能的。 尤其是自学一门语言和一门技术的程序员,往往在没有高强度训练之前就拿着这些技能投入工作了,因此想成为某方面的高手,只能采取第二条路,就是有意识的强化实践和反复提醒。

《圣经》里有个故事,说一个人在沙漠里,信心丧失的时候,突然听到 “A Still Small Voice” (平静的小声音), 即上帝的启示。这个平静的小声音把他从绝望中拉了回来。 其实对于这个人来说,他本身的实践能力在 “平静的小声音” 出现前后并没有多大的改变,唯一的不同就是他知道该怎么做了。

内化一个知识或者认识的时候所循的路径也是一样的。 我们常常会“忘了”应该怎么正确的做一件事情(这个地方的“忘了”,指我们之前从书中或者其他渠道读到看到了正确的原则或方法,但是在那一刻脑子里压根没考虑这个原则或方法,因为这个原则或方法压根没有亲自实践过,所以根本不是自己的一部分,不属于自己)。 在这个时候, 如果突然有一个平静的小声音跳出来,说,“嘿,你是不是该遵循这个原则,用这个方法?” 无需说,我们对问题的思考就能顿时全面起来, 也会更加深刻的理解原先读到看到的不属于自己的原则和方法。当然,我们更加感兴趣的是,如何能够在身边没有高手和上帝发出这样的平静的小声音的时候,自己发出这样的小声音?

怎么靠自己呢,记得鲁迅小朋友破坏公物在课桌上刻的“早”么?是的,我们需要抽象出一些简单的词句和规则,靠记忆和不断的提醒,小规模的内化这些小声音,让这些简单的小声音能够时刻从大脑里跳到耳边,提醒自己。 具体来说,在阅读上面的几本书,尤其是阅读 《Pragmatic Programmer》 的时候,如果仅仅是以普通的浏览的方式阅读,就会很简单的陷入 “啊,这个我知道了,啊,那个我了解了,恩,这个以后要注意” 的套路中。 这样的阅读方式,只会强化原有的自己已经知道的部分,而不大可能把“以后要注意” 这部分全部内化。所以,自负的读者读完了之后必然觉得“哈哈,高手不过如此,大部分我也知道嘛”,而不是“是的,我还有不少要注意”。 这两个态度,就把高手和易于满足的中手永恒的隔开了。 我觉得,想要内化这些小声音,还是要靠实践,如果不实践,即使你把这些小声音写在 100 块钱的高档笔记本上也没有用。我个人觉得,理想的阅读状态应该是先大致理解和记住里面的 Tip, 然后每周争取实践 2-3 个 Tip。其实如此做完一圈也就是半年,在这一圈之后就会记住所有的 Tip 的内容,这时候,小声音就成了自己的一部分了。然后在剩下的几年里,只要时时有这些小声音挑出来,告诉你,“要自动频繁的测试”,或者“别手动做繁琐的工作”,你会很快的被强迫转换到高效而优雅的工作状态。 到了那个时候,这些小声音就再也不会跳出来了,因为你早就自然的遵守这些小声音的要求了。

《Pragmatic Programmer》 和 《The Elements of Programming Style》 这些书里面的 Tip 都不是来自上帝的话语,却都是值得随声带着的小声音。 其实只要是处理过实际问题,编过几万行程序,大多程序员都差不多都会有或深刻或浅显的对各个 Tip 都感悟,而且我相信或许对有些 Tip 的认识能比原书的作者还要深刻,这是很正常的。 事实上每一个 Tip 只是一句话而已,对这一句话的理解层次, 则完全不这一句话能够覆盖的。 比如说,一天写了两个 Hello Word 的程序员也会领悟到 DRY, 一个刚刚重构扔掉掉几千行重复代码的程序员也领悟到 DRY, 而这两个 DRY 所在的认识层面, 必然是不一样的。 再好比说我在“编程珠玑番外篇”这个系列里面写的有些文字,看上去很有道理,但我本人对这些文字的认识可能比我的读者要浅, 但是这倒不妨碍引发读者思考。 即使有些牛人觉得上面这几本书的作者在某些原则上的认识不够深刻,或者觉得作者只是在罗列一些小碎片,读这些书,特别是 《Pragmatic Programmer》 这本书的那些小 Tip,依然是有益的, 因为他或许能触发你高于作者的思考,然后在你脑中形成更加圆润的珠玑。而对于像我这样属于中手下游平时又没有大项目训练的人,《Pragmatic Programmer》 这本书,和其他的几本书一起, 实在是很好的“小声音汇编”。