前言
为什么写本书
19年前夏日的一天,我正在宿舍里看一本关于禅宗的书。一位朋友走过来,他注意到了书的封面,然后好奇地问我禅宗是什么。当时我也说不清楚,只是觉得禅宗很像唯心主义者的一道逻辑题。
禅宗的心髓是悟,在禅宗思想推广的历史上,有很多具体生动的故事阐释了这个概念。最有名的是六祖慧能的偈句:“菩提本无树,明镜亦非台。本来无一物,何处惹尘埃?”。“本来无一物”——说明了慧能在洞悉事物本质上的境界(后来这首诗的境界又被超越了)。
禅宗的历史就是种种境界被建立和被超越的过程。为了达到无法超越的最高境界,参禅者们发明了机锋公案、棒喝直指、扬眉瞬目、拳打脚踢、斩蛇杀猫这样一些辅助手段,这些手段可以让人快速通过量变到质变的一刹那(没有可以解释的过程),直达内心顿悟。进入顿悟状态后,所有语言、文字和思想都成了阻碍。
唯一例外的词——想入非非——可以作为那种境界的缩影。想入非非的意思是说,那种至高无上的境界不是我们头脑中可以想到的,因为可以想到是一种阻碍;也不是我们头脑中无法想到的,因为无法想到是指除了可以想到之外的。非非,表示否定了否定,这里的双重否定不代表肯定。想入非非,把没有边界的思想通过一种特殊的方式表达了出来。
在这些年的软件开发生涯中,禅宗那种积极反思、不断追求完美境界的精神一直影响着我。凭着这种精神,我把软件开发变成了乐趣。有两个原因使这种转变成为可能:第一,我把想象力和创造力结合了起来;第二,我的软件开发思想已经比较成熟和完整了。这两点很重要。想象力和创造力的运用使人的精神得到了满足,而软件开发思想则使任何事情在开始之前都有了一个合理的解释。合理与满足会给你带来乐趣。
我写本书的主要目的也有两个:第一,回顾自己的软件开发生涯;第二,与读者朋友们分享我自己的体验和感受。我希望在你阅读完本书后,可以发现如何品尝软件开发的乐趣,如何从千头万绪变得线索明朗,如何从复杂世界进入简单世界。
我还想在本书中表达以下几个观点。
首先,思想是解决一切问题(包括软件开发中的问题)的根本。Robert C.Martin在Agile Software Development: Principles, Patterns, andPractices的中文版序言中表达了一个思想,即软件是美的(我喜欢阅读序言,因为那里通常是和作者心灵最接近的地方)。而我想表达的思想是,在你熟悉的软件开发领域,软件不仅是美的,还是简单的。领悟到软件开发中的简单之美是解决软件开发问题的钥匙。在我看来,思想是一种坚定不移的信仰,并且是在经过了足够的实践检验后形成的。在软件开发过程中,稳定的思想会使所有的力量汇聚到一个有效的方向。
其次,思想是一盏明灯,但有时也会成为一种桎梏。像参禅者一样不断追求完美的境界,使思想成为你自己不断成长的体验。
最后,思想必须转换成习惯。我不是个真正意义上的实用主义者(本质上是个追求内驱力的理想主义者),但是在实践中运用思想比停留在思考层面显然更有乐趣。
总之,构建一套完整的思想体系是软件开发能力成熟的标志。只有思想成熟,才会使你的一言一行、举手投足、细节决策等在复杂的实践中收放自如。
软件开发思想的成熟,还需要操作层面上的大力支持。我们不妨以方法论为例来看看软件开发中的问题。
很多软件开发人员在实践中经常处于一种混乱状态。所谓混乱状态,就是当出现问题的时候没有人知道怎么做才算最好,或者人们之间缺乏足够的信任和共识,或者大家不断地讨论却得不到满意的解决方案。
对于软件开发老手而言,经验是帮助他们保持清醒并走出混乱状态的安全绳。可是,要想依靠经验来持续地造福一个团队就比较难。
事实上,造成混乱状态的原因有很多。本书中的所有内容都是在尝试从各个层面来谈论这个话题。如果单从方法论的层面来看主要有两个原因。
首先,没有操作性强的方法论的指导。
软件开发者的很多工作和努力都基于个人经验的积累。即便某些经验丰富的软件开发者掌握了一些必要的方法论知识,也不能在组织范围内有意识地推广,从而成为有实用价值的共享体验。
其次,有经验的软件开发者获取知识和使用知识的方法无法系统地传递给软件开发新手。
无法传递知识,会使新手们在软件开发领域的成长起点变得很低。在这种情况下,软件开发项目的成功通常依赖于个人英雄主义、人海疲劳战和运气。
当你经常对软件开发中的某些现象,如无休止地加班、返工、资源紧张等产生迷惘时,应该停下来认真思考;当你认真思考后仍然没有明确的解决之道,不妨看看别人的想法。
好,还是看看本书里写了些什么吧。
本书不是一本关于方法论的理论性书籍(尽管我已经尝试在大量的思考上进行一些理论归纳),也不是一本关于具体技术的操作手册。本书为读者呈现的是我在软件开发实践中的思考和体验,目的在于探究实践中的问题的根源,并给出思想上的解决之道。
本书以软件开发的基本顺序为主线,以简单、想象和文化的开发思想为线索,以为软件开发实践提供指导价值为目标。本书力图做到传递经过组织的、可操作的软件开发经验,使软件开发领域的新手减少知识(软件开发思想)积累中的弯路,也使软件开发领域的老手可以对照自己的经验把可能的困惑降到最低。有一些例子为那些有趣的思考提供支持。
在本书中,我会尝试对简单、想象和文化做一些形而上的思考。这些思考会比较抽象,但却是很多话题的基础。
本书面向的读者
每个人的一生都在获取知识。有些知识来自于被动接受,有些知识来自于主动学习。知识有不同的类型,而学习知识又有不同的方法。
显然,本书也会提供一些知识。
在推荐谁应该阅读本书之前,了解本书提供的知识类型是很有用的。同时,在获取知识之前对知识本身进行一些思考也有助于学习效率的提升。很多领域内的行家都善于此道。
李敖就是一位获取知识的大师,我非常欣赏他的学习方法。来看看他获取知识的特点:
- 目标简单、稳定;
- 围绕目标思考和行动(持续不断地收集历史资料);
- 享受内心自由乐趣,不盲从权威;
- 经过特训的大脑,善于知识归类和检索。
他一生都在阐述一个论题,论据的丰富程度达到人生的极限。你可以从主观出发不赞同他的思想,但是却无法对抗那些论据。
李敖是一位历史学家,他所学习的知识类型与软件行业不同。事实上,即便在软件行业内部,知识也有不同的类型。知识类型的不同,决定了学习方法的不同,最终对人的能力和培养提出不同的要求。
下表列出了软件开发中各种工作类型的要求。所有的定义都是非充分性的和非全面性的。它们表达出了我个人的一些偏重。关注这些偏重,对于实现我们最终的目标(成熟的软件开发能力)是有意义的。
在后续的章节中,读者可以体会到这些定义形成的思路。如果仔细阅读,你还会发现,有很多的文字都在间接地解释——这些能力在软件开发中应该是怎样的,以及为什么有助于软件开发工作。
本书提供的知识类型与上表中的知识类型有千丝万缕的联系。但是,本质上又不同于其中的任何一项。相较于务实的软件开发工作,本书提供的知识更接近于虚。所以,我把本书提供的知识类型称作思想型。
当你追溯一切问题的根源时,哲学总是追溯的源头。而当你从事软件开发工作时,当你面对软件开发中的迷惘和失败时,当你寻求解决问题的途径时,你也许会在追溯的过程中用到本书提供的知识。
所以,本书的读者,主要是那些在实际工作中陷入迷惘或存在困惑的软件开发者、管理者和企业经营者。
对于软件开发者来说,他们已经有了一定的软件开发技能,但是还没有或很少有成功的软件开发经历;他们对于软件开发工作存在着抱怨,有一些模糊的或零星的改革想法;他们热爱软件开发工作,但是感觉工作缺少乐趣;他们希望有一个明确的方向、一段可以借鉴的经历、一个行之有效的方法和一种超越以往的境界。
对于管理者和企业经营者来说,他们不满组织生产能力的现状,他们有着变革的决心,对于不成熟的软件开发能力带来的成本也有着切肤之痛,但是对于如何构建一个合理有效的软件开发环境没有思路。
本书主要是为以上三种人准备的。
遗憾的是,世上不存在可以供你直达目标的操作手册。每个人实现目标的方式都是不同的。除了最后一步的领悟之外,有效信息收集和经验积累是必需的基础。
什么样的信息是有效的呢?
- 简洁明确的思想表述;
- 层次清晰的分类信息;
- 令人信服的论证过程。
我一直在努力尝试,希望能为读者提供这样的有效信息。
另外,本书是我的经验之谈和人生体验。我的想法是,也许本书会让你产生共鸣,也许不会。但是有一点我可以许诺,本书的内容是前面表述的各种想法的实现,是独特的和真实的。
就软件开发而言,我根本不顾忌什么,没有任何让我盲从的权威。本书中所有的想法都是自己的真实体验,借鉴来的想法也都经过了自己的“咀嚼”。
本书中的所有内容基本上都以思想讨论为主,伴之一些验证有效的技术实践。思想讨论的内容往往会超出专业和行业的范畴,所以我期望有更多的人来参与这种形式的思想交流。
总而言之,如果你乐意,你可以阅读本书。
如何阅读本书
对于读者而言,没有什么比知道如何阅读一本书更重要的了。很多书都是有价值的,从书店中得到它只是第一步。如果不清楚如何阅读这本书最有效,书的价值就不会轻易地转移到读者身上。这一小节将会告诉你如何阅读本书。
可以想象,得到一本书时,有些读者因为欠缺领域经验而需要点拨,有些读者由于相同的体验而产生共鸣,有些读者可以站在更高的层次上对书的内容进行批判。无论哪一类的读者,都期望快速清晰地获得作者的写作思路。
从作者的角度,最诚实的做法就是直白的交流。我认同一种精神,全力表明自己的想法,直到某些读者可以清楚地认识到自己是反对这种想法为止。当然,我也相信另外一些读者会赞同它。基于这种精神,本书中所有问题的表述都是断言式的,不留有任何引申和狡辩的空间。
本书中大多数章节的第一部分是实践场景,场景中包含了虚构的情节和虚构的人物。你可以把这些场景单独挑选出来,当作一篇描写软件开发者生活的文学作品。你也可以忽略这些场景,这不会影响你获取本书中的知识。
场景是一个理想中的美好故事,它不能传递明确的知识信息。写作这个场景故事的主要目的,是想说明现实中的软件开发活动比本书中涉及的讨论要复杂和生动得多。例如,一个人的些许想法可能会给软件开发带来极大的影响。我不是一个不可知论者,即便在复杂多变的现实场景中,简单的原则同样能产生有效的影响。
我一直在考虑一个问题:
业界有很多流行的方法论,也有很多大师的软件开发思想,可是在实践中,好像还是有很多组织找不到方向。比方说,敏捷开发,我真的没有看到多少成功的案例。我知道的是,大家在不断地缩减Scope,不断地提升Schedule评估的时间,从而来适应传统的管理方式。我也听到很多管理者在议论哪种方法论是最好的,好像实施了某种方法论就可以解决所有的问题,可是问题仍然在那里没有变,只是换了个形式。
所以我想,问题的根源也许不在这里。我觉得,无论方法论也好,管理理论也好,都是技术层面的。这些技术层面的东西来自于很多大师长期的总结和提炼,本身是非常好的,但是它们有复杂的上下文,例如在敏捷开发中没有提到或者强调的——注重个体文化、专业化思想以及多元化价值认同等。所以,一旦割裂上下文,机械来运用这些方法论,效果就总是不好。
在本书中,我想从实践者的角度来强调这一点,通过强调软件开发思想和文化来尝试连接实践和方法论。
场景故事也是在这个想法上产生的,我很想反映现实的复杂性,在这种复杂性场景中,读者可以发现自己熟悉的人和事,我希望可以产生共鸣。然后,我想推荐用简单的思想和一些文化反思来应对它,至于效果如何,那肯定是仁者见仁智者见智了。
在大多数章节场景故事之后的第二部分,我会首先列出作者写作本章节的中心思想。这些中心思想是断言式的、概括式的。读者需要通过阅读本章节后续展开论述的内容来了解中心思想的具体含义。
本书想要传递的思想是,用简单的原则、富于想象的精神、文化的视角来认识软件开发。请在阅读时始终关注这个核心思想。
我的E-mail地址是:jianni@hotmail.com,欢迎读者朋友的来信。