在阿里巴巴的晋升会议上,评委经常会问:“你的成功可以复制吗?”我最初做评委时基本不会问这样的问题,因为我认为这样的问题很虚,工作完成就行了,不需要那么多道理。
然而随着时间的推移,我发现这的确是一个好问题。因为它可以区分出你是碰巧把事情做对了,还是你具备了一直做对事情的能力,二者是有本质区别的。碰巧做对,说明你的能力可能还不足,换一种情景,你就不一定能应付。因此,好的晋升制度不仅要考查成绩,更重要的是考查能力。对从事脑力劳动的技术人员来说,“能力”主要指的是“思维能力”。
正所谓“有道无术,术尚可求也,有术无道,止于术”。如果说我的第一本书《代码精进之路:从码农到工匠》主要是关于编程技艺——“术”层面的,那么本书则主要是关于技艺背后的底层思维——“道”层面的。
说到“道”,大家可能会想到“道可道,非常道”,觉得它“玄之又玄”。然而我这里所说的“道”更侧重于“道理”,即我们做事背后的道理、思维方式是什么。思维能力是比解决具体问题更重要的能力。问题也许各有不同,但思维方式可以复制和迁移。我们一旦掌握了正确的思维方式,便可以举一反三、触类旁通。
例如,我们都知道编程的时候命名很重要,也很难,可为什么会这样呢?如果要深挖其背后的原因,将是一个非常有趣的话题,甚至可以和哲学有关。命名工作中暗含了抽象思维能力和语言哲学,语言本身是抽象的符号,比如当你说“花”的时候,指的并不是某一朵具体的玫瑰花、郁金香,而是花的抽象概念。一朵具体的花虽然看得见、摸得着,但总会有凋零消亡的时候,而“花”这个字作为精神实体将永不会消亡。所以,抽象的花和具体的花到底哪个才是本真呢?这是一个哲学问题。
抛开哲学争论,就“花”这个字而言,它是提取了所有花的共性的抽象符号。命名之所以难,是因为你要经历一个提取共性、归纳要义,并赋予恰当名称的抽象思维过程。因此,要想真正做好命名,除了要掌握一些命名技法,还需要更深层次的修炼——提升抽象思维能力。
又如,有些人说话重点突出、易于理解,而有些人则前言不搭后语,让人不知所云;有些人写文章、写邮件思路清晰、有条理,而有些人的文章则词不达意、东拼西凑;有些人写的代码结构清晰、可读性强,而有些人写的代码则是一团乱麻、难以维护……问题的本质在于逻辑思维和结构化思维的差异,可逻辑思维和结构化思维又是什么呢?这些思维能力是可以习得和提高的吗?
维特根斯坦在《逻辑哲学论》中说,思维本身就能解决问题,我们所要做的,就是观察它是如何做到的。
认知水平有4个层次,从低到高依次是“不知道自己不知道、知道自己不知道、知道自己知道、不知道自己知道”。“不知道”并不糟糕,最糟糕的是“不知道自己不知道”,而因为缺少对自身思维的观察和培养,所以很多人对思维的认知尚处于“不知道自己不知道”的层次。
这种无意识会导致我们很多时候盲目地做事。虽然一些人“996”工作很辛苦,但也许大部分工作内容是无意义的重复,在工作过程中,思维能力并没有得到锻炼和提高。这样的人即使侥幸晋升成功,他的能力水平仍然停留在低层次。
就像混沌大学创始人李善友教授说的,没有好的思维模型,再多的知识积累也是低水平的重复。成人学习的目的不是获取更多的信息量,而是学习更好的思维模型。
综上,本书的首要目的就是打破“不知道自己不知道”的思维禁锢,把软件设计中会用到的各种思维能力显性化地呈现出来,让你意识到原来有这么多思维模型在软件设计中发挥着至关重要的作用。
一个人如果永远躺在自己的认知盲区,那么既得不到锻炼,更无法提高。只有意识到这些思维能力的存在,我们才有可能去学习、练习和提升。
我也是从这样的认知盲区中走过来的,自从意识到思维能力的重要性之后,便开始主动地学习各种思维方法,并努力将这些思维方法运用到软件设计中。在探索和学习的过程中,我发现讲思维能力的书有很多,讲软件设计的书也有很多,然而却没有一本将思维能力和软件设计相结合的书。君子求诸己,既然没有现成的书,那就只能靠自己一点一点去摸索。摸索的过程虽然要付出大量的时间和精力,但也充满乐趣,这是学习、成长和认知突破的乐趣。功夫不负有心人,你现在看到的这本书便是我“上下求索”的结果。
实际上,在本书出版之前,我已经在多个场合做过不少于十次的有关“程序员的底层思维”的分享和演讲,令我欣慰的是,每次分享都能得到很好的反馈。为此,我还专门在阿里巴巴内部开设了思维训练的培训课,课后有同学留言:“这样的课程应该被纳入新人入职的必修课”。
我想,这门课程之所以能够引发大家的共鸣、使大家获得启发,是因为其中涉及的曾经困扰我的问题亦困扰着很多人。既然我有幸能从这些困惑中走出来,那么我希望这些经验同样可以帮助你。