本文刊发在《程序员》杂志09年第三期上。讨论了三种不同背景下的软件工程方法。本文恢复了发表时(因为篇幅)删除掉的一些文字内容。
一、两本书
1997年,论文《大教堂与集市(The Cathedral and the Bazaar)》成为一篇挑战教义神权的战斗檄文。从那之后,开源与闭源的战火就从未熄灭过。那些日子里,一些教堂里的圣人也偶尔地裹了头帕,装成市贩的样子到集市中去探探行情;一些小贩们也变成了信众,走进教堂在胸口画下十字。
战场之外的少数鼓号者们,利用茶前饭后的一些时间争论着开源与闭源的精神、理想与抱负,或者在官方的或私底的文章中打打嘴仗。在这些争论之中,卡普尔决心用开源来实现自己数年前的梦想;微软则组织了更多更多的人工,开始打造下一代的帝国神器“Longhorn”。
总有理论家,也总有实干者;一些人在呐喊,一些人在流汗。Rosenberg开始忆述这些征战的背景,同时记录着这段推进的历史;他时时听着远处与近处的呼号,时时为种种理论、观念而迷茫。这段历史,延续了六年。六年之后,两打程序员,超过4732个Bug,产品却仍未定型;而微软帝国鼓号之下,推上台面的,是被称为“近10年来最失败的一款大型软件”的Vista。
有趣的是,Vista正是卡普尔在六年前为他的梦想而写下的第一个名字,后来项目更名为Chandler,再后来,卡普尔在2008年从项目中撤出了投资——项目或自此死亡,或如Mozilla怪兽一样在数年后重生。一切,已不得而知。
Rosenberg记录这段历史的书,就是《梦断代码》。这本书,是一部演义,一部短史,一部文鉴。
也是在1997年,微软出过一部名为《微软的秘密》的书。从这部书中,阿朱看到的是现实与理想的背离。阿朱认为“一个正规的软件帝国的规模开发做法,显然无法适用于三五个人十来杆枪的中国软件小作坊”。阿朱正视了自己所处的现状,从2002年开始,他空降一家公司,用了五年的时间,跳出教堂与集市之争,用作坊的法子,把一家公司由小做大,把三五个人的公司,做到三五十个人。我见到他的时候,他正在写博客,记录这一段经历,他反思:三五个人十来条枪,如何成为开发正规军?
作坊如何做成?又如何《走出软件作坊》?我看到眼前这本书,背负历史之重、正视现下之实。阿朱用他一贯快打快跑的作风,六个月就完稿、出版了这本书。
坊间出奇人,我说。
二、三种工程
“正统的工程有模有样,有形有实。他们有名字,例如RUP、CMMI。这些名字不是冠以“统一(Unified)”,就是缀以“标准(Standardization)”这样的词汇。这样的工程方法通常由名气很大、绝对的神级人物来诠释讲译,在其背景下还有国际性的、国家性的、军方的力量来支撑。
这样的工程宝典,通常如同圣经一样,金箔丹书,红绒覆面,非官学之士不可阅、不可论,妄议者或被施火刑以摧其躯体,或被召天雷以灭其神魂。
而“集市”的黑板,刚被早市上的油烟熏过,还覆着尘灰,落脚处有个不知是谁、用什么方法弄上的鞋底子印儿。在另一角上写着些小字,不知是那家顽童留下的粉笔,或干脆就是他留下的字迹:歪歪扭扭,不成样子。那些文字很简单,无有章法也不成逻辑,像口号一样,例如“人和交互重于过程和工具(*1)”。在更远的一个角落里,逐渐淡去而又顽固地隐现着更早一批的文字,恍惚是“程序无需工作得特别好……”(*2)。
集市里没有工作手册,黑板总是被快速地更新着。总有一群人来这里看看别人工作的法子、体验或咒骂,然后回去在卖菜切肉的间歇里想想。他们只能利用这些间歇,否则的话,他们可能就丢了生意饭碗,或不小心伤到了手脚指头。不过,他们也可能会在任何时候跳起来,冲到那块黑板前写下自己的言语,哪怕只是与三个月前另一个市贩相同的骂娘。
集市的远处还有一些作坊。小小的,三五个、十来个人工,做着不同样的或完全相同的东西:或送进教堂,或贩于集市。各家之间打着嘴仗、抢着客户,以及挑唆着小工倒戈(至于倒戈之后的去处,向来许着美好的愿景而又不尽实际)。作坊主们投以薄资,期以微利,朝夕喟叹;大工们如履薄冰,上期效主,下期慰民;小工们总在东张西望,佯工懒散,只待月薪入手。
坊间渐有成功者。但问之:汝何以功成?却无以对答。既不赖教堂之神典,亦非窥集市之秘技。遂以深问,复答之:实战。一战再战,久战成军。战法呢?无有法度,仅有手记一册而已。
我曾在评读《人月神话》的文字中说(*3),工程可以分广义工程与狭义工程。从广义的角度上来说,教堂里的话一句没错:人从哪里来?神赐。物从哪里来?神赐。万物皆是神赐,神从哪里来?本来就有。是啊,宇宙之大神啊,本来就有,逻辑上丝毫无错!但是,广义工程的结论,例如“食物是神赐的”向来就靠不得准。放在狭义工程里,比如这会儿你饿了,你呼三千遍上帝阿门,没用;念五千回《大悲咒》,还饿着。这时广义工程又说了:你喊得不诚实;你念错了经文。嗯,反正,在一个完整的、正常而严谨的逻辑体系里,还是他们对。
狭义工程,或者说具体工程,就是解决一个具体的工程目标。目标是什么?集市的黑板上没写,教堂里的经文里也没注。写黑板的人写字时或经文被译注之前,这个具体工程的目标还根本就没出现过。所以解决这个目标的人——比如阿朱,只能一步一步摸着走,看着象经文里讲的,就试试;与那块黑板上写的对得上号,也试试。两者都不靠的,自己夹着小心来。错了,自己抽自己耳光;对了,老板也不多发工资。
具体工程就是这样,只有做过了,才知道。没做过的,不管是教堂的还是集市的,都是瞎掰。
三、《梦断代码》讲的也是具体工程
不管是理想化的,还是神化的方法与论断,在《梦断代码》里都用到过。当然这些方法、论断也确如乩言一样灵验或失灵过。正因其灵验,以及偶尔的失灵,才让那些崇信者拜服与生畏(更何况一些崇信者原本就是这些方法与论断的始作俑者)。
《梦断代码》中的团队有一个绝对集市的名字:OSAF,也有绝对集市的原则:开源且接受大众的眼球(眼睛足够多,缺陷无处躲)。但是从直到这个项目开始之后的一年,这个团队还没有一个真正意义上的领导者:他们(包括那些从来不出现在团队中的志愿者们)总是在不停地开会、讨论,以及推翻上一次的开会与讨论。
团队的和产品的精神人物,是又出钱又做事的卡普尔。他声称了要做一个能打败一切PIM软件的PIM软件。简单的说,直到这个软件只剩下以自己为对手的话,这就是目标。类似的目标也出现过、成功过,例如Internet Explorer。所以,看起来卡普尔是要在开源界面打造一个类似的神器,所以在这样的精神感召下,一批热血之士“混成(混然天成的混成)”了这个团队。
卡普尔看着大家积极地讨论着他的“原始需求”,并接受了他们制造出来的更多的需求。这些目标堆积成山之后,卡普尔开心地聆听了第一任项目经理基尔默(或只是一个技术首领)的预期:我们,将在年底发布该软件的一个早期版本,预计明年年底或稍迟的时间即可以发布1.0。
他的预估太过乐观了。Rosenberg在后来说。(P76)。
在《大道至简》一书中,我写过:做了这么多年项目,当我一听到“那我们就开始开发吧”这句话,就哆嗦。因为,大多数人在说这句话的时候,连组织结构是什么都还没搞清楚呢。
果然,接下来OSAF团队陷入了“与组织作斗争”的阶段。没有决策者,这意味着任何一个“看起来像决策的东西”都可以能在你背转身去的时候被打破(P154);没有设计者,这意味着任何“看起来应该已有雏形的东西”其实都未曾现身(P132);没有跟踪与限制,这意味着任何人都可以停下手中的工作,去做另一件“看起来更要紧的工作”(所以他们制造了大把大把的工具并不停地废弃它们,P129);没有……是的,OSAF团队没有任何可以依赖的组织结构,直到一年之后,他们把项目组分成三个小组,并设立了正式的团队经理(P157、P158,由卡普尔兼任的)。
“别再继续发疯了!在书里,他们该错的都错了!”Rosenberg在后来说,(P158)“我自己也在怀疑,他们何时才能起步?要花多长时间?障碍是什么?”在这个时候,《梦断代码》的书正好写到一半。你可以猜测另一半的结果,或者干脆直接给它判了死刑。
但是真正的问题在哪里呢?是集市工程的失败么?问题是,《梦断代码》在后面还记叙了微软的“Longhorn”项目的失败,那里有着最具规模的教堂队伍,从神职人员到扫地的,一个不缺(据说连扫地的都至少是硕士以上学历,以备将来发展为扫地老僧)。
具体工程也会失败的,给一个工程冠以“具体”的名字,并不代表它就成功了。《梦断代码》讲述了一个具体工程的失败,失败的过程闪耀着光辉:集市的、教堂的,以及牛人、有钱人们的……无限光辉。
他们想做什么来着?
四、《走出软件作坊》是具体工程的成功案例
阿朱不是写书的人,他没有Rosenberg那么精彩的文笔。阿朱只说话,有时候甚至只是自言自语。《走出软件作坊》就是一本说话的书,他自语的,或说给别人听的。这些说过的话,他或者曾经说给过团队中的小伙儿们听,也或者说给自己听过。现在他不过是又说了一遍。说得不那么零碎了,有点条理,就成了书。
《走出软件作坊》几乎没有具体讲一个完整的工程项目的过程,但他讲了许多个过程中的片段。从这些片段中,你可以还原出阿朱的行事方法:客户不确定需求,他怎么做;员工开小差,他怎么做;要讲PPT,他怎么做;要培训架构师,他又怎么做……这些具体的做法,有些像是大教室中的经文一样让你耳熟,有些则在小黑板上也找不到。但阿朱就是这么做了,有效果,就用;没效果,他就老老实实地讲出来。
他的朋友笑了:“你的鬼招儿还不少啊。”(P218)
读书的我也笑过。阿朱的“鬼招儿”的确不少,但有无招法套路可循呢?练武术的人,总有一种思路,看过了人家的“招儿”,就不怕下场跟人家“过过趟儿”。招式有了形迹,也就有了应用的范围,有了范围就可以躲闪招架了。所以,以前练武的人都是闭了门练的,都是防着人家看:怕偷师学艺是个理由,更多的则是怕露了招式,被人拿捏了短长。
阿朱的《走出软件作坊》讲的大多是招式,但没有套路,大半都是见招拆招的。讲演PPT,东西是一套东西,讲给不同的人听,讲法还不同呢,大抵就是这个路子。你要是召个技术人员给客户讲PPT,他一声不问就跟着你去了,就是走在半路上你也得把他撵回公司;如果他问一句“都给谁讲呀”,这人就靠了一半谱;再问一句“为啥讲呀”,这事儿就成了一半了。
道理就是这个道理,连目的都不知道的事,别做。阿朱的每一篇文章,都先讲背景。讲客户的背景、讲公司发展的背景、讲团队素质的背景……然后在这些背景之下,还会讲行业的背景、甚至于具体的某个个人的特点……然后,他才讲那个“具体的招式”。
那能不一招指到痛处吗?再说了,这些背景,不也就是这些年来、这些小作坊里的背景吗?
所以,深有同感,深有痛感。读《走出软件作坊》的,常常有感,道理就在这里。
感是有感了,但是阿朱是怎么有“鬼招儿”的呢?阿朱讲了没?讲了。你自己去读。读不出来,那是看《梦断代码》这样的史书太多,或读《大教堂与集市》这样的宣言太多,或者《卡内基梅隆大学软件工程研究所推荐之XXX》这样的书研究得太深了。
书读得太多,就有了知见障。这是我常说的话。困于自己,疏离他人;看自己想看的,看不见自己不想看的。就成了常人了。我在“盛大与Delphi的10年情缘”(*4)上留的那句话,叫“所见即所得”,很多人直译作WYSIWYG,翻译得好,和词典一样准,但也碍于知见所障。
《走出软件作坊》作为具体工程的成功案例,我只看到阿朱剑之所指,始终如一。没有他那种眼光,《葵花宝典》给了你,自宫了你也练不成。
阿朱没自宫。
五、“具体工程”及其相关
“具体工程”是具体现实环境下的工程。在具体工程里,对环境的了解,比目标的设定更应靠前。比如说客户说要上RUP,你得先知道那里客户代表上一次听微软的课被忽悠的呢,还是他想在这个过程中锻炼一支懂RUP的队伍。再如业界在嚷嚷AP/XP,你的团队的小伙子们一个个急吼吼地也要上,你也得先看看他们是不是有那种交流沟通的能力,以及相互协作的态度。
背景,就是你的知识。这很复杂、混乱。你可能天文地理管理哲学兵法时局等等无限多,都要懂,因为这都是背景,都是能影响具体事务的因素。但你也可能实际懂得很少,那你至少要学会一样,就是听。听来的也是知识,没人不喜欢你听他说话的,所以你常常听也就成了博学家了。如果连听都不会,那么你就闭门写代码吧,计算机可以跟你交流,用代码。
具体工程要讲的,就是一个具体团队里的具体方法。一个管理者,一个工程的实践者什么都看不到,什么都不了解,什么都不学习,只以技术论英雄,只以王道服天下,都不成。权术可以弄,道理也要能讲。你既然管着项目,眼里就得有人、有事、有冲突,看不到活儿的,连小工都不如。
方法,就是你正在做的“这个行为”,而不是人家写在书上的“那个行为”。方法只有此时此地的好坏之别,没有哪本书上写着的有用无用。
具体工程要做的就是你的公司、老板或给你发钱的那个具体的人的目标。放在“绝对工程”的筐子里,“杀人”也可以是目标。如同《大道至简》里面把“XP”跟《极限战》一书并论,“战胜敌人抢到地”与“完成工程挣到钱”是一样的目标,没有荣耀不荣耀,也没有理想不理想。活下去,就是士兵的第一原则;打败他,就是将军的第一要务。
这就叫现实工程、具体工程,或狭义工程。我在《杀不死的人狼》一文中说过,狭义工程跟广义工程的首要目标与次要目标正好相反:狭义工程以实现工程目标(*5)为这个工程存在的根本价值,如果这项目标不能被达成,那么这个狭义的工程既不可能实施,也不可能为所谓广义工程产生任何价值。而广义工程以“软件活动的根本任务(*6)”为首要目标,至于一个公司的死活、一个产品的成败,却只是次要目标。
我们的大教堂打着种种旗号,让你去证明“神的存在,且食物是因你认识到神的存在而得的馈赠”,那个大神,就是广义工程的目标。不信你去看,Brooks把这个目标写得很清楚,你只不过是在证明它而已。很多人跟随着他们,只是因为他们多数时候在说着一些看来是真理的,或原本被你认为是真理的话(*7)。哦,还有那些在小黑板上写写画画的人们,他们看起来是无神论者,或者极端的反宗教主义者,那不过是因为他们不饿。
而你,现在还饿着。
Ν、其它
我手上已经堆了不少的书,我坚持,决不在没读完它们之前就写评论。当然,也许根本就不读,也许读完了也不写。写与不写,我向来没跟出版社的朋友们说确实过。
《梦断代码》的译者韩磊是我的朋友,《走出软件作坊》的作者阿朱也是我的朋友。事实上我们曾经都在同一个名为Delphi的战壕里抽过烟、闲过话。但是并非因为这样的缘故我才动手写这书评。我拿到《梦断代码》一书已经有近半年了,韩磊亲赠,待遇不谓不薄。但我放在手边闲看了这么久,一直却想不出个理由来谈谈它。直到阿朱的书出版,直到我品读到两本书之间的历史的、文化的、思想的差异,我才迸出一种激情来。我之所以评读这两册书,盖半的原因还是它们这些鲜明的对比,包括那最为鲜明的结果:成功与失败。
现实总在书外。我在接受ZDNET的访谈时(*8),正好与韩磊有过一个对话。我们讨论到了国内的工程现状。我们都意识到我们的背景:既不是大教堂,也不是集市。我们穿梭在大教堂与集市之中,时而做些相关的事情,既想着要进教堂又想着要去集市。但我们什么都不是。我们的背景下,我们讲人情关系,我们讲面子,我们讲“过得去”。我们这些模模糊糊的概念,在任何一本来自教堂的经籍,或来自小黑板的宣言里都没有。过去、曾经,我们抹去这些,我们试图把自己变得适合某本经籍或某个宣言,但我们发现,最终影响我们手边的“具体工程”的是现下的“具体团队”。这个团队有着固性的特点,如果我们要改造它,其结果是要以时间、成本为代价的。更明确的结果,就是项目的失败。
改变一只蚂蚁的路线都难,何况是人,更何况是一个团队。我们得承认(包括客户、需求方以及领导在内的)团队中的人情、关系,以及模糊的言辞,我们得具体地去分析它、消除它或利用它。但前提是我们要承认它的存在和短期内的难以消除,因为这正是我们文化的一个部分,一个成份。这,就是我们的本来面目。
《大道至简》最末写了一篇古文。古文里最后一段话里,写的是“车马无缰,道而驰之,无有倾覆”。那个“道”字,是个动词,很多人读错了。比如《梦断代码》以小黑板为道,或以无道而自以为有道,最后倾覆了。阿朱一路行来,无有盲然,寻见的道始终未曾偏离他的脚下,也未曾偏离他视野所及的方向。因为他一直知道自已在做什么,为谁做,为什么做;他一直知道自己的、团队的,以及那个具体工程的本来面目。这,就是他的眼光。
于是,《走出软件作坊》。
其它
- (1)《敏捷软件开发宣言(Manifesto for Agile Software Development)》。
- (2)《大教堂与集市》,译文自《梦断代码》P305。
- (3)“杀不死的人狼——我读《人月神话》”,在这里。
- (4)“盛大与Delphi的10年情缘”,http://act.sdo.com/Delphi/
- (5) 《人月神话》中,Books的对此的说法是:将需求表达为抽象实体,并在“一定范围”内映射成计算机的执行逻辑。这被Books设定为“软件活动的次要目标”。
- (6) 《人月神话》中,Books对“软件活动的根本任务”的定义是:根本任务的目标:抽象软件构成的复杂概念结构。
- (7)“真理根本是无路可循的,死的东西才是有路可循的,因为它是静止不动的。……真理是活的,互动的,不驻留的,既不在佛寺、教堂里,也没有任何宗教、上师或哲人能领你到那儿去,……”,《重新认识你自己》,克里希那穆提。
- (8) SD2.0大会技术内幕,http://soft.zdnet.com.cn/software_zone/2008/1112/1230437.shtml