文章是我在读《程序员的修炼之道:从小工到专家》这本书的时候看到的一篇我觉得比较优秀的序言,所以分享出来,也便于自己阅览,序言如下如下:
程序员心底的小声音
编程大约有三个境界,新手、高手和高不成低不就的中手。这三个境界,大致和王国维先生划定的做学问的三个境界一一对应。一般来说,如果不经过几十万行的代码的锤炼(衣带渐宽终不悔,为伊消得人憔悴),或者长期在一个高手团队里面打磨切磋,那么无论怎么样的理论熟悉,打字熟练,考试全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》这本书,和其他几本书一起,实在是很好的“小声音汇编”。
▶Washington University Ph.D.candidate 徐宥