本文刊發在《程式員》雜志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)“殺不死的人狼——我讀《人月神話》”,http://blog.csdn.net/aimingoo/archive/2007/03/12/1526396.aspx
(*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