前言
“你在做什么?”我经常这样反问那些跑来问我问题的人们。然后他们就愣住了。.
做了许多年的开发,其实有很多人并不知道“自己在做什么”。《愚公移山》的故事里面,愚公为山所阻,苦于“出入之迂”,然后就决定“移山”。看起来伟大而风光的工程,可能只是拍拍脑袋的一时主意——如果只是觉得绕路太远,那么劈山开路岂不是更加经济?
愚公移山只是一种精神追求,而做工程却不是追求精神目标。我们的目标是完成工程,但是你现在环顾一下你的团队:有多少人的眼光是落在工程本身上的呢?
程序员正在调试代码,项目经理在忙着开会,市场经理在请客吃饭,老板可能还在来公司的路上……总之,你的身旁没有什么人关注工程本身。即便有一个人或几个人在像模像样地画着模型图,或者写着需求、分析与设计书,但是对于他们来说,这只是例行的工作,而不是出于工程本身的需要。
其实这也是我在几年前的状态,同时身兼主程、团队负责人和项目经理的时候,我列出的工作清单排满了上班与下班的时间。我甚至忙到不知道自己有多忙。直到我将自己的角色分解到“工程层状模型(EHM)”中,我才渐渐地梳理出自己的工作方法。
《大道至简》这本书的名字并没有什么奥妙。因为是先有了EHM,所以这本书根本上是随着EHM的层次来展开的。它的**版曾在《程序员》中选载过三期,那时我为了方便就以《从编程到工程》作为书名。后来出电子版时,才恢复到现在这个名字。而本质上来说,这本书还是讲的“从编程到工程”的各个环节。
至于“道”,其实在乎于你的认知。它不过是规律、本质的代名词。现在的书名,更像是一个以程序员出身的工程实践者,在历经10年后,终于领悟到“自己在做什么”时的一声感叹。
《大道至简》向你讲述两个内容:做什么和为什么做。“做什么”作为一种状态或者现象,通常是(阶段性)不变的,所以人们了解自己“在做什么”时大多只需要观察。简而言之,只需要自省,就可以了解自己的所作所为了。然而“为什么做”却相对更难于理解,因为这是“表象下的实质”,潜藏得很深:习以为常,便会根本上忘却“习”的来由。例如项目总监说要一份计划,你大概只需要拿一个以前做过的文档模板,很快就能写出一份项目计划案来。但在这个过程中,你已经忘掉了“项目计划案”真正存在的价值——写它的目的,并不是“完成工作”。
写一份项目计划案的时候,你的角色是项目经理,你的职责是计划与分工,你的目标是工程的时间、进度与质量的平衡。这份文档是工程的纲要,因此阅读群体是整个团队和项目干系人。所有这些,都可能导致文档的规格和措辞存在差异。
所以你需要认识“为什么做”。
这其实并不是非常困难。例如我在工程中经常问的问题是“可不可以不做”——哈哈,看起来我很偷懒似的。其实不然,。因为接下来我就会从不同的人那里得到“非做不可”的种种理由。
然而这是方法或者手法。《大道至简》并不告诉你这些具体的方法与手法。我只是叙述了基本的原理与思想。《大道至简》陈述的是一种途径、一个方面,以及一些探求途径、方面过程中的故事与思考。
做事有没有章法,在于你头脑够不够清醒;头脑够不够清醒,在于你是否视见到事物的本实。具体到如何做一件事(例如做软件工程)的方法与步骤,是本书所不能告诉你的。而反过来说,如果你认为你自己“足够清醒”,那么这本书原本也就不会告诉你更多。
你足够清醒吗?
第二版的增改
写这一版的《大道至简》,其实用掉的时间与整个**版差不太多。但新添加的内容,也就两章三节而已:
第六章,谁是解结的人;
第八章,你看得到工具的本质吗;
第四章第三节,沟通的三层障碍;
第九章第五节,审视AP和XP;
第十章第七节,细解“法”与“式”。..
此外,第二版的《大道至简》加入了一个有趣的部分,就是九幅四格漫画和一篇《愚公移山记》。
除了增加的内容之外,本版的《大道至简》还修改了一些章节的位置。例如第七章的“关注点”一节。因为EHM图提出来的不仅仅是一个“多层”的体系,而且它的“关注点”也是EHM体系的一个重要部分。因此放在一起来讲述,会使这个体系更加完整。
还有一些细部修改。例如**版说李冰与愚公处于“差不多同一时间”。这经不起考究,就改掉了。
关于新添加的章节
**版的EHM体系中有一个关注点没有详述。也就是“组织”。事实上在 “失败的过程也是过程”中,*后一节“工程不是做的,是组织的”,就是打 算延伸到“组织问题”进行讨论的。但写**版的时候,并没有就此展开。所 以有些读者在看**版时,觉得这一段没什么意义。
本版中添加的第六章“谁是解结的人”,讨论的就是组织和管理的问题。 承接上文而讨论“组织角色,分工明确,步调一致”等这些问题。为此,在综述EHM的第七章,也修改了“组织”小节的部分文字。
在本版中,我还添加了一章“审视XP和AP",对敏捷编程与极限编程做了一些讨论。我试图站在更中立的角度上来讨论AP、XP,以及传统的工程过程(例如RUP)。因为本书并不打算去迎合某种或者某些过程、方法与工具。
但即使如此,“敏捷(Agile)”也与本书表达的“灵活(Flexible)”的观点有相近的地方。其实本书在英文名上,就曾考虑过使用“Thinking In Flexible Engineering”这样的名字。我在这里特别补充这一点,是希望不要把本书的思想与AP和XP等同起来。
新添加的第八章“你看得到工具的本质吗”,占了不少的篇幅。其实,对于我自己来说,理解“语言只是工具”是一个顿悟的过程。但对于读者来说,是顿悟还是领悟,则更多的取决于思想方法与工程积累。我不能期望大家都能顿悟,所以就详写了这一章,希望能以渐进的说理,对我的思想脉络做一概括,并阐述工具之于工程的本末。
关于《愚公移山记》
在基本不影响原故事的前提下,我在本书中对愚公移山的故事进行了续。我在2005年4月就完成了本书的**版,7月赴西藏旅游时,在珠峰大本营扎营之夜构思了“愚公移山”的续写概要,但到10月发布本书**版(电子版)时,这篇续却没能够写出来。此次编写第二版,把这一年来在头脑中渐渐清晰的故事重理脉络,编撰成一篇文言,就是附录中的《愚公移山记》。为方便阅读,在本书附录中又附了一篇白话文的版本。
书中的九幅四格漫画,不但概括了故事的大意,也是整本书的框架骨骼。为了使得整个故事更加完整并具连续性,我对愚公移山中人物的历史背景进行了一些设定(姓氏的设定主要是为了避免在故事中出现“愚公n代”这样的写法)。这里先作一些交待:
愚公,复姓公输,祖上虞国人(今山西平陆县北)。后迁居到太行山北时以虞人自称,性情耿正,人称愚公。
智叟,复姓端木,魏国河曲人(今山西芮城西,风陵渡一带),后迁与愚公毗邻,仍以河曲人自称。
邻人京城氏,世居此地。有孀妻遗男。京城一氏的后代中,有很多复祖姓目夷的人。
序、前言及其他
这一版本,仍请蒋涛先生作序,替换了由他为本书**版(电子版)所写的序言。在请李维先生做**辞时,先生不辞辛劳,寄过来一份**序,因此,我敬而重之地做在本书的序中。本书的另一篇序,则是请我的老朋友王昊写的。
**版的“前言”以“后语”的形式在书末给出,这一版中保留了这个做法,具体的原因参见书末的“前言后语”。
此外,为了便于读者阅读理解本书,我也为新版写了这篇“再版前言”。