一、消除隱喻
1熬荆、隱喻
軟件開(kāi)發(fā)這件事情舟山,出現(xiàn)得很晚。距今只有幾十年的時(shí)間卤恳,關(guān)于它的定義累盗,我們可以簡(jiǎn)單地說(shuō):“就是把軟件做出來(lái)⊥涣眨” 這基本上等于什么都沒(méi)有說(shuō)若债。而軟件開(kāi)發(fā)究竟是怎么回事,大家也沒(méi)有搞明白拆融,于是隱喻就派上用場(chǎng)了蠢琳。當(dāng)你要向一個(gè)完全沒(méi)有概念的朋友,解釋什么是軟件開(kāi)發(fā)的時(shí)候镜豹,你無(wú)法向解釋建筑工程那樣把他帶到現(xiàn)場(chǎng)去看——案件開(kāi)發(fā)的現(xiàn)場(chǎng)傲须,你的朋友會(huì)以為軟件開(kāi)發(fā)就是一群人坐在電腦前面打鍵盤(pán)——你只能打比方:它就像是造一幢樓,有基礎(chǔ)趟脂,有結(jié)構(gòu)躏碳,有可以使用的房間,在這之前必須要設(shè)計(jì)散怖,最后一樣要通過(guò)驗(yàn)收菇绵,最終用戶就能夠住進(jìn)去——哦,不镇眷,是可以使用軟件的各種功能咬最。
這樣,你用上了一個(gè)隱喻:軟件開(kāi)發(fā)就像建筑工程欠动,或許極可以稱(chēng)之為軟件工程永乌。還有其它一些隱喻:比如手工作坊與軟件工藝惑申。我們不會(huì)說(shuō)建筑工程就像什么什么,它們都有自己鮮明的特點(diǎn)翅雏,不需要通過(guò)像什么什么來(lái)解釋圈驼。但是軟件開(kāi)發(fā),還是太年輕望几,也缺乏鮮明的特征绩脆,只能借助隱喻,我們才能向人們解釋它橄抹。在這條路上靴迫,很多人都已經(jīng)走得太遠(yuǎn),隱喻不但被用來(lái)向外行解釋什么是軟件開(kāi)發(fā)楼誓,居然被用來(lái)說(shuō)服自己人玉锌,軟件開(kāi)發(fā)就應(yīng)該像那個(gè)比喻的對(duì)象一樣,具有類(lèi)似的規(guī)范疟羹、過(guò)程主守、特征以及方法論。但是榄融,比喻只能是比喻丸逸。軟件開(kāi)發(fā)的方法論,只應(yīng)該從軟件開(kāi)發(fā)的本質(zhì)推導(dǎo)出來(lái)剃袍,而不是從一些隱喻里抄襲過(guò)來(lái)。
2捎谨、另一個(gè)隱喻
佛教有一種說(shuō)法:“佛法不過(guò)是一條渡船民效,過(guò)河之后,你就不再需要它了涛救∥沸希”尋求軟件開(kāi)發(fā)的本質(zhì),也許還是需要隱喻的幫助检吆,只是這些船能不能把你帶到彼岸舒萎,要仔細(xì)辨別。
設(shè)想這樣一個(gè)場(chǎng)景:在公安局的一個(gè)辦公室里蹭沛,你的對(duì)面坐著一個(gè)目擊證人臂寝,而你是一個(gè)犯罪肖像畫(huà)家。這個(gè)證人在講述他還記得的罪犯特征摊灭,你一邊提問(wèn)咆贬,一邊在紙上沙沙的畫(huà)著。一開(kāi)始的提問(wèn)與回答總是很概要性的帚呼√投校“圓臉”“不皱蹦,很瘦的長(zhǎng)臉”;“戴眼鏡眷蜈?”“是的”沪哺。在紙上出現(xiàn)了大致的輪廓之后,對(duì)話變得比較瑣碎酌儒,“眼睛再小一點(diǎn)辜妓?”“鼻子比這個(gè)大一些〗穸梗”漸漸的嫌拣,證人的話越來(lái)越少,而且不斷地端詳著紙上的那個(gè)人呆躲,而你還在做一些細(xì)小的修正异逐。突然,證人激動(dòng)地大叫起來(lái):“就是他插掂!就是這個(gè)人……”于是灰瞻,你的任務(wù)完成了!
這個(gè)過(guò)程像不像軟件開(kāi)發(fā)呢辅甥?有人也許會(huì)說(shuō)酝润,嗯,軟件開(kāi)發(fā)就是這樣的璃弄。不要销!其實(shí)軟件開(kāi)發(fā),并不是這樣的夏块,它應(yīng)該是這樣的……
你的朋友疏咐,晚上到你家來(lái)了∑旯“我昨天晚上做了一個(gè)夢(mèng)浑塞,夢(mèng)見(jiàn)了我這輩子見(jiàn)過(guò)的最美的女孩,你幫我把她畫(huà)出來(lái)吧政己∽煤荆”“她的臉是……”在一段又一段如夢(mèng)如幻的描述之后,你開(kāi)始畫(huà)起來(lái)歇由,過(guò)程與前面有點(diǎn)類(lèi)似卵牍,但是,似乎你的朋友沒(méi)有停下來(lái)的跡象沦泌,他不斷的要求你改進(jìn)辽慕,希望這個(gè)她能夠更加完美。終于赦肃,他放棄了:“就這樣吧溅蛉,雖然不是她公浪,但是已經(jīng)很像了〈啵”你長(zhǎng)吁了一口氣欠气,但是,你的朋友瘋了镜撩,他懇求你把這個(gè)女孩變成一個(gè)活人预柒,能跑能跳,能夠跟他交流袁梗,而且還能夠愛(ài)上他宜鸯。沒(méi)想到,其實(shí)你不是人遮怜,而是上帝淋袖,而且你大發(fā)慈悲,竟然真的滿足了他的要求锯梁。終于即碗,他滿意地回去了。但是陌凳,幾天之后剥懒,他又來(lái)了,他居然因?yàn)檫€不夠滿足合敦,又來(lái)了初橘!“上帝,”他懇求道充岛,“你能不能夠幫我把她改一下保檐,當(dāng)我……”隨后的日子里,他不斷地找到你裸准,要求你再完善完善他的女人。直到有一天赔硫,你發(fā)了一道閃電炒俱,劈死了這個(gè)貪得無(wú)厭的家伙。
不不爪膊,最后這一幕沒(méi)有出現(xiàn)权悟,因?yàn)楦鶕?jù)軟件開(kāi)發(fā)及維護(hù)合同,你不能劈死你的客戶M剖ⅰ(我敢打賭峦阁,是個(gè)程序員,就想過(guò)這么干耘成。)如果這個(gè)合同簽得不夠好榔昔,他真的有可能向你提任何要求驹闰。
3、消除隱喻
這個(gè)隱喻怎么樣撒会?這是對(duì)軟件開(kāi)發(fā)過(guò)程的一個(gè)好的描述嗎嘹朗?不,它還不夠好诵肛,而且我們不可能通過(guò)修正完善這個(gè)隱喻屹培,來(lái)得到一個(gè)對(duì)軟件開(kāi)發(fā)的準(zhǔn)確的描述。事實(shí)上怔檩,所有的隱喻都不夠好褪秀,都會(huì)扭曲軟件開(kāi)發(fā)過(guò)程的真相,都會(huì)使我們對(duì)軟件開(kāi)發(fā)的過(guò)程產(chǎn)生誤解薛训。
為什么會(huì)這樣呢媒吗?為什么一個(gè)挺像軟件開(kāi)發(fā)的隱喻會(huì)最終誤導(dǎo)我們呢?原因在于一個(gè)隱喻是一個(gè)完整的場(chǎng)景许蓖,這個(gè)場(chǎng)景中有很多相互交織的“概念要素”蝴猪。當(dāng)這些要素有很多在軟件開(kāi)發(fā)中出現(xiàn)時(shí),我們就會(huì)認(rèn)為這個(gè)隱喻很貼切膊爪,而當(dāng)一個(gè)隱喻越是貼切時(shí)自阱,這個(gè)隱喻中的其他一些在軟件開(kāi)發(fā)中不存在的要素,或者與軟件開(kāi)發(fā)相矛盾的要素米酬,就會(huì)打擾我們的分析沛豌,干擾我們的判斷。使得我們不再思考軟件開(kāi)發(fā)本身赃额,而是將思考建立在某個(gè)隱喻的場(chǎng)景中加派。這樣思考得到的結(jié)果,肯定存在著誤導(dǎo)的可能跳芳。再由于不同的隱喻互不相容——你無(wú)法想象一群工匠去建設(shè)現(xiàn)代化的高樓大廈芍锦,他們最多只能造些平房——因此,建立在各種隱喻基礎(chǔ)上的軟件開(kāi)發(fā)飞盆,至今沒(méi)有找到適合自己的方法論娄琉,倒是不同的隱喻之間互相打得火熱。
4吓歇、分析各種現(xiàn)有的隱喻:
1)工程隱喻
在各種隱喻中孽水,建筑工程與軟件開(kāi)發(fā)的關(guān)系最為密切,這個(gè)隱喻與軟件開(kāi)發(fā)的相似之處最多城看,因此影響也最為深遠(yuǎn)女气。這個(gè)隱喻有四個(gè)要點(diǎn):分解、分配测柠、設(shè)計(jì)和階段化炼鞠。
分解是一種極為深刻的思想缘滥,將整個(gè)過(guò)程分為幾個(gè)階段,將整個(gè)任務(wù)分解為幾個(gè)子任務(wù)簇搅,將系統(tǒng)分解為多個(gè)層次完域,多個(gè)模塊,將需求劃分為多個(gè)類(lèi)型等等瘩将。這樣的思路吟税,是解決復(fù)雜問(wèn)題的唯一正確的方法,一團(tuán)亂麻的需求姿现、任務(wù)肠仪、項(xiàng)目浦楣、設(shè)計(jì)哎甲,根本不可能成功舌厨。但是分解也意味著它最好第一次就劃分正確庙曙,當(dāng)任務(wù)被層層分解,變成了很多很多的子任務(wù)茵宪、模塊轿偎、子模塊轩触、類(lèi)的時(shí)候窘哈。你發(fā)現(xiàn)有一個(gè)子任務(wù)的分解有問(wèn)題,修改的困難可能極為驚人雌澄,而軟件開(kāi)發(fā)倚喂,在第一次就劃分正確的情況每篷,幾乎絕無(wú)僅有。
分配與分解一樣端圈,是工程隱喻所特有的焦读,當(dāng)一個(gè)需要完成的系統(tǒng),已經(jīng)被仔細(xì)的分解之后舱权,分解的粒度會(huì)達(dá)到一個(gè)人能過(guò)獨(dú)立完成的范圍矗晃,然后根據(jù)現(xiàn)有的資源以及任務(wù)的前后依賴(lài)關(guān)系,合理的分配給各有不同能力和特長(zhǎng)的人宴倍,沒(méi)有這樣的分配张症,項(xiàng)目同樣會(huì)一片混亂,而這個(gè)隱喻還包含一種(支配關(guān)系)啊楚,存在分配的人與被分配的人吠冤,層層分解的任務(wù)與層層分解的人力資源浑彰,使得整個(gè)項(xiàng)目成為一個(gè)嚴(yán)密的金字塔結(jié)構(gòu)恭理,而這樣的結(jié)構(gòu),往往使得項(xiàng)目的應(yīng)變能力與可能性郭变,隨著項(xiàng)目的擴(kuò)大而縮小颜价。
基于以上的兩個(gè)要點(diǎn)涯保,工程隱喻極為順理成章的推出了這樣一個(gè)結(jié)論:“必須嚴(yán)格的控制需求的變更,如果可能周伦,將所有的變更都頂回去夕春。”純正的軟件工程的思想中专挪,任何需求的變更都是不受歡迎的及志。
設(shè)計(jì)極為重要,無(wú)論是對(duì)于建筑還是對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō)寨腔,都是這樣速侈。但是設(shè)計(jì)與設(shè)計(jì)不同,在建筑行業(yè)迫卢,不體現(xiàn)設(shè)計(jì)師理念的建筑倚搬,會(huì)被稱(chēng)為沒(méi)有靈魂的“水泥塊”。但是在軟件開(kāi)發(fā)里乾蛤,如果開(kāi)發(fā)人員老是想著往程序里加入自己的東西每界,會(huì)被稱(chēng)為過(guò)度設(shè)計(jì)。但是由于軟件開(kāi)發(fā)對(duì)于建筑工程的模仿家卖,過(guò)度設(shè)計(jì)變得比比皆是眨层。
在建筑工程中,有著極為清晰的階段劃分篡九,分析谐岁、設(shè)計(jì)、施工榛臼、驗(yàn)收伊佃。最早的軟件工程,就是完全模仿這樣的階段而執(zhí)行的沛善。這樣的模仿航揉,后果是嚴(yán)重的,因?yàn)檫@樣的階段不是軟件開(kāi)發(fā)的特征金刁,強(qiáng)行套用帅涂,大多失敗。隨后的改進(jìn)似乎總也跳不出這個(gè)思維模式尤蛮,就像用無(wú)數(shù)的直線去擬合一條曲線媳友,用N多個(gè)正方形去拼出一個(gè)圓形。比如說(shuō)螺旋式開(kāi)發(fā)产捞,在一個(gè)螺旋中醇锚,還要搞出四個(gè)象限,使得軟件開(kāi)發(fā)的過(guò)程,不斷的重走這四個(gè)階段焊唬。但是恋昼,軟件開(kāi)發(fā)的過(guò)程,真的是像建筑工程一樣嗎赶促?
2)流水線隱喻
產(chǎn)生式編程和MDA液肌,是所有“銀彈”承諾中,最為大膽的兩種鸥滨。如果有一天世界大同嗦哆,萬(wàn)物升平,人間與天堂無(wú)異婿滓,那應(yīng)該就是MDA的時(shí)代來(lái)臨了吝秕。這兩種思路的理論依據(jù)(如果這能稱(chēng)之為理論的話)何在呢?其實(shí)還是一個(gè)隱喻:流水線空幻。當(dāng)然他們不會(huì)直接用普通的流水線來(lái)做比喻烁峭,而是一種比現(xiàn)代工業(yè)中最為先進(jìn)的柔性制造流水線還要先進(jìn)的“超級(jí)無(wú)敵自定義流水線”。用戶(對(duì)秕铛,就是最終用戶)可以選擇约郁、定義并且畫(huà)出那個(gè)“軟件裝配圖”(UML之類(lèi)的表示方法),就能直接組裝出用戶想要的軟件但两。但是鬓梅,這樣的隱喻其實(shí)無(wú)法用于軟件開(kāi)發(fā),甚至無(wú)法用于工業(yè)生產(chǎn)的大多數(shù)領(lǐng)域谨湘。在工業(yè)領(lǐng)域绽快,大多數(shù)流水線 還是用來(lái)生產(chǎn)有限種類(lèi)的產(chǎn)品,種類(lèi)多到一定程度之后紧阔,流水線的效率根本無(wú)法體現(xiàn)坊罢。當(dāng)然成本優(yōu)勢(shì)也無(wú)法體現(xiàn)。這還是一個(gè)零件的粒度問(wèn)題擅耽,大粒度的零件組合活孩,使得生產(chǎn)的可能種類(lèi)減少,而小粒度的零件乖仇,又使得裝配成本與效率無(wú)法體現(xiàn)憾儒,這樣的兩難,在軟件開(kāi)發(fā)上同樣存在乃沙,而且更加嚴(yán)重起趾,所以這顆子彈,不可能是“銀彈”警儒。
3)舞蹈隱喻
CMM本身不需要隱喻训裆,它的理論基礎(chǔ)來(lái)源于純正的軟件工程,所有軟件工程有關(guān)的隱喻,CMM都用得上缭保,但是CMM有它自身的特點(diǎn),主要是在CMM的實(shí)施方面蝙茶。我看到過(guò)一個(gè)關(guān)于CMM實(shí)施的隱喻:軟件開(kāi)發(fā)就像跳舞艺骂,軟件過(guò)程改進(jìn)就像是舞蹈編排,軟件開(kāi)發(fā)人員在過(guò)程改進(jìn)專(zhuān)家的知道下隆夯,就像舞蹈演員在舞蹈編導(dǎo)的知道下钳恕,學(xué)習(xí)新的節(jié)奏、動(dòng)作蹄衷。最后開(kāi)發(fā)出令消費(fèi)者滿意的軟件產(chǎn)品忧额。就像舞蹈演員為觀眾帶來(lái)出色的表演。這樣的隱喻愧口,為一個(gè)巨大的咨詢市場(chǎng)開(kāi)辟了道路睦番;最天才的舞蹈演員,也不能沒(méi)有編導(dǎo)的知道耍属,所以想要公司提高CMM等級(jí)托嚣,就必須找專(zhuān)家來(lái)做咨詢,果然巧妙厚骗!但是這樣的隱喻示启,卻經(jīng)不起推敲,舞蹈編排過(guò)程中领舰,演員們排練的目標(biāo)是達(dá)到編導(dǎo)的要求夫嗓,如果演出的效果不好,自然由編導(dǎo)負(fù)責(zé)冲秽。但是軟件開(kāi)發(fā)過(guò)程的改進(jìn)舍咖,如果也是為了博得咨詢專(zhuān)家的滿意,到時(shí)候軟件開(kāi)發(fā)出來(lái)不賺錢(qián)锉桑,那些專(zhuān)家可不會(huì)負(fù)責(zé)谎仲。他們?cè)缇唾嵉阶稍冑M(fèi),走人了刨仑。關(guān)鍵問(wèn)題在于郑诺,過(guò)程改進(jìn)只能是一種手段,它本身不能成為目的杉武,更不能想當(dāng)然的認(rèn)為辙诞,完美的過(guò)程就一定能帶來(lái)完美的產(chǎn)品。舞蹈編導(dǎo)不是觀眾轻抱,沒(méi)有一個(gè)編導(dǎo)敢保證自己的這次創(chuàng)作飞涂,一定能贏得觀眾的好評(píng),但是為什么現(xiàn)在CMM專(zhuān)家,就敢作出這樣的保證呢较店?當(dāng)舞蹈演員在一個(gè)“三角形的舞臺(tái)上”士八,完美的跌落的時(shí)候,誰(shuí)會(huì)為這樣的悲劇負(fù)責(zé)呢梁呈?
4)工匠婚度、工藝隱喻
說(shuō)到工程隱喻,現(xiàn)在大家自然會(huì)想到最近出來(lái)的《軟件工藝》這本書(shū)官卡。如果工程的隱喻有問(wèn)題蝗茁,那么工藝怎么樣?如果工程師的隱喻有問(wèn)題寻咒,那么工匠怎么樣哮翘?按照軟件工藝的說(shuō)法:“如果項(xiàng)目中的成員不具備執(zhí)行項(xiàng)目過(guò)程所必備的技能,那么縱有世界上最好的過(guò)程毛秘,也無(wú)法挽救項(xiàng)目失敗的命運(yùn)饭寺;與此相反,真正優(yōu)秀的開(kāi)發(fā)者叫挟,能夠讓任何過(guò)程佩研,發(fā)揮最大的作用∠既啵”真的就這么簡(jiǎn)單嗎旬薯?
工匠與工藝的隱喻,與工程相對(duì)适秩,但是這樣的對(duì)立绊序,并非如《軟件工藝》所理解的那樣,是由于不同的復(fù)雜程度而做出的不同的選擇秽荞。如果2000個(gè)人年的項(xiàng)目骤公,我們應(yīng)該采用工程的隱喻,5個(gè)人年的項(xiàng)目扬跋,我們應(yīng)該采用工藝的隱喻阶捆,那么50個(gè)人年呢?500個(gè)人年呢钦听?我們是不是有可能將兩種不同的隱喻像調(diào)雞尾酒一樣洒试,選取適合的比例,然后調(diào)制起來(lái)呢朴上?這樣具有的“顛覆性”的理論垒棋,我想作者也沒(méi)有考慮過(guò)如何與工程隱喻相調(diào)和吧?
在工藝隱喻中痪宰,還有幾個(gè)特點(diǎn)叼架,質(zhì)量畔裕、培訓(xùn)、高手乖订。
工藝隱喻扮饶,意味著工匠(程序員)會(huì)在自己的作品上簽名,并終生為之負(fù)責(zé)(這與XP是有區(qū)別的)這樣就能保證質(zhì)量乍构。但是我們知道甜无,手工制作就意味著質(zhì)量無(wú)法保證,第一次與第二次不同蜡吧,第二次與第三次不同,現(xiàn)代工業(yè)比起手工業(yè)來(lái)最大的進(jìn)步占键,就是能夠保證一個(gè)始終如一的質(zhì)量水平昔善。所謂為自己的作品負(fù)責(zé)的榮譽(yù)感,最多只能保證我能夠在“事發(fā)之后”找到人來(lái)修補(bǔ)畔乙,卻不能保證我免受這樣的損失君仆。軟件質(zhì)量更多的取決于一個(gè)開(kāi)發(fā)團(tuán)隊(duì)的能力,而不是他們?cè)敢鉃橹?fù)責(zé)的決心與榮譽(yù)感牲距。如果真的那么簡(jiǎn)單返咱,中國(guó)男足立了那么多次軍令狀了?早就該有成效了吧牍鞠?
培訓(xùn)開(kāi)發(fā)人員咖摹,當(dāng)然是非常重要的,但是現(xiàn)在軟件開(kāi)發(fā)中較多使用的“新手”难述,并非“工程隱喻”的罪過(guò)萤晴。作者設(shè)想的學(xué)徒的過(guò)程,也并不與軟件工程相矛盾胁后,這在日本的軟件工程實(shí)踐中店读,可以得到證實(shí)。不客氣的說(shuō)攀芯,這樣的浮躁屯断,不是軟件工程的責(zé)任,而是文化的問(wèn)題侣诺≈逞荩可悲的是,中國(guó)的軟件產(chǎn)業(yè)年鸳,較之美國(guó)剃氧,更為浮躁。
高手是寶貴的阻星,但同樣也是稀缺的朋鞍。一個(gè)公司或者一個(gè)項(xiàng)目團(tuán)隊(duì)已添,不可能全由高手組成,再者滥酥,對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō)更舞,所有的活都讓高手來(lái)干,也同樣是浪費(fèi)坎吻。在這里還要指出作者的自相矛盾之處缆蝉。一方面,作者強(qiáng)調(diào)“師—徒”式的培訓(xùn)瘦真,另一方面刊头,又想把低手從公司里趕出去。那么究竟該怎么做呢诸尽?如果一個(gè)項(xiàng)目?jī)?nèi)原杂,低手比高手還要多(這是幾乎是必然的)。這樣的項(xiàng)目應(yīng)該如何組織呢您机?任務(wù)如何劃分呢萌衬?作者沒(méi)有告訴我們卵沉。因?yàn)樵诠に嚴(yán)锩嬗北洌瑢W(xué)徒做的可能是毫不重要的盖高,甚至是重復(fù)的勞動(dòng),只是為了學(xué)習(xí)仲闽。但是在軟件企業(yè)脑溢,誰(shuí)來(lái)為這樣的學(xué)徒買(mǎi)單呢?
工藝的隱喻赖欣,新則新已焚志,好就未必。這本書(shū)畏鼓,就是那種“用隱喻來(lái)思考的產(chǎn)物”酱酬。真要照做,只怕危險(xiǎn)云矫。
5)敏捷的場(chǎng)景
敏捷開(kāi)發(fā)與其它模式不同膳沽,它似乎沒(méi)有隱喻,但是让禀,還記得我們是如何定義隱喻的嗎挑社?一個(gè)隱喻是一個(gè)完整的場(chǎng)景,這個(gè)場(chǎng)景中有很多相互交織的“概念要素”巡揍。 當(dāng)這個(gè)場(chǎng)景中多出了與軟件開(kāi)發(fā)無(wú)關(guān)的要素時(shí)痛阻,就會(huì)誤導(dǎo)我們。敏捷開(kāi)發(fā)是一個(gè)逼真的場(chǎng)景腮敌,這個(gè)場(chǎng)景不是像軟件開(kāi)發(fā)阱当,它就是軟件開(kāi)發(fā)俏扩,它沒(méi)有多出任何東西,因此弊添,這樣就完美了嗎录淡?不,它卻少了很多要素油坝。當(dāng)一個(gè)逼真的場(chǎng)景嫉戚,向你描述了一個(gè)成功的,但是卻卻少了很多要素的軟件開(kāi)發(fā)項(xiàng)目時(shí)澈圈,這樣的場(chǎng)景同樣會(huì)產(chǎn)生誤導(dǎo)彬檀,會(huì)使你認(rèn)為其他的要素,都是不重要的瞬女,至少是可以在大型項(xiàng)目中才需要考慮的窍帝。我說(shuō)的要素,并非CMM的KPA拆魏,或者RUP里的關(guān)鍵活動(dòng)盯桦,然后通過(guò)剪裁就能得到XP那樣的要素慈俯。而是指關(guān)鍵的概念渤刃,缺少關(guān)鍵概念,故事就會(huì)顯得虛假贴膘,那么在敏捷項(xiàng)目中卖子,缺少了什么呢?時(shí)間概念刑峡,成本概念以及分工概念洋闽。
在一個(gè)又一個(gè)的迭代周期中,什么時(shí)候突梦,項(xiàng)目算是完成呢诫舅?這個(gè)完成,由誰(shuí)來(lái)決定呢宫患?似乎敏捷開(kāi)發(fā)面對(duì)的是一個(gè)User Story集合刊懈,多一些,少一些娃闲,都沒(méi)關(guān)系的虚汛。如果用戶給定時(shí)間,功能的多少皇帮,就得由開(kāi)發(fā)人員決定卷哩。反之,如果用戶要求必須數(shù)量的功能属拾,開(kāi)發(fā)時(shí)間的多少就得由開(kāi)發(fā)人員決定将谊。這樣的項(xiàng)目冷溶,可以說(shuō)簡(jiǎn)直沒(méi)有壓力,這是咱們夢(mèng)寐以求的項(xiàng)目瓢娜,但是這可能嗎挂洛?
再說(shuō)成本概念,同樣的道理眠砾,合同是在開(kāi)發(fā)開(kāi)始之前簽訂的虏劲,但是按照敏捷開(kāi)發(fā)的場(chǎng)景,能開(kāi)發(fā)出多少東西褒颈,需要多少時(shí)間柒巫,都是不一定的。那么成本如何確定谷丸?如果成本無(wú)法確定堡掏,這個(gè)合同可能就會(huì)有一方要吃虧,這樣的合同刨疼,誰(shuí)去簽?zāi)兀?/p>
再說(shuō)分工概念泉唁,敏捷開(kāi)發(fā)是程序員提出的,而且完全是從程序員的角色出發(fā)揩慕,在他們的故事里亭畜,除了用戶,就只剩下了程序員迎卤,你也許會(huì)說(shuō)拴鸵,還有項(xiàng)目經(jīng)理呢!但是蜗搔,那只不過(guò)是一個(gè)名稱(chēng)而已劲藐,他不過(guò)就是一堆程序員里最有權(quán)威的那個(gè)。那么其他角色呢樟凄?你在敏捷開(kāi)發(fā)的故事里聘芜,看不到界面設(shè)計(jì)人員,看不到獨(dú)立的缝龄、專(zhuān)職的測(cè)試人員汰现,看不到數(shù)據(jù)庫(kù)管理人員(隨著設(shè)計(jì)的浮現(xiàn),也許項(xiàng)目進(jìn)行到40%時(shí)二拐,程序員中會(huì)有一個(gè)人服鹅,轉(zhuǎn)而承擔(dān)較多的數(shù)據(jù)庫(kù)管理的職責(zé),但是這并不一定)看不到產(chǎn)品經(jīng)理百新,看不到用戶手冊(cè)的編寫(xiě)人員企软,看不到客戶培訓(xùn)人員(XP認(rèn)為客戶會(huì)和程序員一起工作,但是那些沒(méi)來(lái)的可能誰(shuí)去培訓(xùn)呢饭望?)也許XP的支持者會(huì)說(shuō)仗哨,“嗨形庭,我們又不是要開(kāi)發(fā)巨型項(xiàng)目⊙崞”但是我要說(shuō)的是:“不管有多大的項(xiàng)目萨醒,一定會(huì)有不需要、也不應(yīng)該程序員做的事情苇倡「恢剑”作為一個(gè)軟件開(kāi)發(fā)的方法論,就必須包含對(duì)這些工作的探討旨椒,一個(gè)完全從程序員本位出發(fā)的晓褪,不考慮其他工作的方法論,不是一個(gè)完整的方法論综慎,這樣的場(chǎng)景如果被普遍模仿的話涣仿,也是相當(dāng)危險(xiǎn)的。
6)銀彈隱喻
《沒(méi)有銀彈》如此著名示惊,以至于無(wú)論它的贊同者還是反對(duì)者好港,都無(wú)法回避它的存在。但是銀彈究竟是什么呢米罚?“沒(méi)有銀彈”究竟意味著什么呢钧汹?
首先,“銀彈”是一個(gè)隱喻阔拳,它的本意是能夠殺死人狼(一種怪獸)的武器崭孤。用在軟件開(kāi)發(fā)里类嗤,銀彈是什么糊肠,用通過(guò)追問(wèn)“什么是軟件開(kāi)發(fā)中的人狼”來(lái)得到答案。在一個(gè)項(xiàng)目中(在一個(gè)村莊里)遗锣,出現(xiàn)了一個(gè)困難(出現(xiàn)了一頭人狼)货裹,如果任由困難存在,項(xiàng)目就會(huì)失斁ァ(如果沒(méi)有辦法趕走人狼弧圆,村民就會(huì)受害),一種方法出現(xiàn)了笔咽,解決了這個(gè)困難搔预,項(xiàng)目成功了(銀彈出現(xiàn)了,打死了人狼叶组,村民獲救了)拯田。所以我們可以這樣理解:銀彈就是能夠保證項(xiàng)目成功的方法。但是甩十,如果Brooks真的這樣簡(jiǎn)單的推出自己的結(jié)論船庇,那么大家都會(huì)說(shuō)吭产;“廢話,誰(shuí)不知道鸭轮,沒(méi)有一種方法能夠保證項(xiàng)目的成功臣淤?”Brooks的水平當(dāng)然遠(yuǎn)不止此。但是很多人對(duì)《沒(méi)有銀彈》的理解窃爷,卻事實(shí)上到此為止了邑蒋,然后他們就拿著這個(gè)結(jié)論,四處“傳道”開(kāi)來(lái)按厘。
Brooks更進(jìn)了一步(或者說(shuō)退了一步)寺董,他將保證項(xiàng)目成功的目的,弱化為提高項(xiàng)目效率的目的刻剥,并且給出了一個(gè)看起來(lái)能夠量化的標(biāo)準(zhǔn)“單一技術(shù)遮咖,十年之內(nèi),提高十倍以上的效率造虏∮蹋”(可靠性和簡(jiǎn)潔性根本無(wú)法量化,咱們先不討論)
但是漓藕,我們知道陶珠,如果一個(gè)論斷無(wú)法證實(shí),又無(wú)法證偽享钞,這個(gè)論斷就毫無(wú)意義揍诽。那么我們?nèi)绾文軌驒z驗(yàn)他的這個(gè)論斷呢?首先我們要能夠明確栗竖,什么是單一技術(shù)暑脆?軟件工程算單一技術(shù)嗎?CMM體系算嗎狐肢?CMM里的一個(gè)KPA呢添吗?UML算嗎?設(shè)計(jì)模式呢份名?XP呢碟联?還是XP中的結(jié)對(duì)編程呢?怎么才算單一僵腺?沒(méi)有界定鲤孵!也無(wú)法界定,包括Brooks辰如,也不能告訴我們普监,什么算單一技術(shù)?
然后我們還要確定,如何比較開(kāi)發(fā)效率鹰椒,如何量化锡移?嚴(yán)格的說(shuō),必須證實(shí)兩組能力漆际,知識(shí)水平淆珊,人數(shù),了解的信息都完全相同的人馬奸汇,在互不交流的情況下施符,同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目,都達(dá)到了一組項(xiàng)目的目標(biāo)(即不是不夠擂找,也不是超過(guò))戳吝,然后兩組人的開(kāi)發(fā)時(shí)間,是否相差十倍贯涎。
再者听哭,當(dāng)我們要證明單一技術(shù)的功效時(shí),必須保證這兩組人馬只在這一項(xiàng)技術(shù)上有區(qū)別塘雳,其他都一樣陆盘。
最后,當(dāng)我們要證明十年之內(nèi)的差別時(shí)败明,還要保證十年后的這組人馬隘马,與十年前的那組人馬使用相同的軟件、硬件設(shè)備妻顶。(十年前是什么操作系統(tǒng)酸员?WIN32?CPU呢讳嘱?486幔嗦?)這樣的研究,才能夠算是精確的驗(yàn)證呢燥。但是這樣的驗(yàn)證崭添,沒(méi)有寓娩,也不可能有人去進(jìn)行叛氨,自然這樣的論斷也就毫無(wú)意義!
可笑的是棘伴,居然有人寞埠,當(dāng)真去尋找銀彈的證據(jù),并且興奮的宣稱(chēng)找到了焊夸,最近還有一家著名的公司仁连,出版了一本的著名的雜志,名字就叫《銀彈》!但是饭冬,最可笑的還在于使鹅,Brooks居然還寫(xiě)了一篇《再論沒(méi)有銀彈》,宣稱(chēng)自己的論斷昌抠,已經(jīng)基本上成立了患朱。
如果事情到此為止,那么Brooks也不過(guò)就是跟大家開(kāi)了個(gè)玩笑罷了炊苫。但是Brooks更進(jìn)一步指出:“軟件開(kāi)發(fā)分為根本問(wèn)題與次要問(wèn)題裁厅,根本問(wèn)題占軟件開(kāi)發(fā)的90%的比重。而且很難被很好的解決侨艾≈春纾”一方面,我們要說(shuō):“這樣的認(rèn)識(shí)很有必要”唠梨,另一方面袋励,我們也要說(shuō):“這樣的論斷,毫無(wú)疑義当叭〔辶洌”因?yàn)樗炔荒鼙蛔C實(shí),又不能被證偽科展。90%從何而來(lái)均牢?如何證實(shí)?我們無(wú)法得知才睹。我相信徘跪,10年,10倍琅攘,根本就是他隨口說(shuō)出的一個(gè)數(shù)字垮庐,同樣的,90%也不過(guò)是一個(gè)“印象”坞琴。當(dāng)不得真哨查,作不得數(shù),也無(wú)法用來(lái)指導(dǎo)我們的實(shí)踐剧辐,更無(wú)益于我們提高軟件開(kāi)發(fā)水平寒亥。這樣的玩笑文字艇肴,竟然風(fēng)行世界睬棚,備受矚目拾稳,的確是軟件開(kāi)發(fā)的方法論锈麸,還處于蒙昧的“隱喻時(shí)代”的最好證明丑孩!
二引颈、追求定論
這篇文章的標(biāo)題就叫定論蛉抓,那么什么是定論呢扰才?就是不再有異議的結(jié)論。就是每個(gè)人都能同意的結(jié)論鳄梅。A方法比B方法好叠国,好在哪里?好多少戴尸?為什么好煎饼?我們追求定論,就是追求一種有效的比較和評(píng)價(jià)標(biāo)準(zhǔn)校赤。
軟件開(kāi)發(fā)有那么多方法吆玖,有那么多過(guò)程,那么多“最佳實(shí)踐”马篮,但是卻從來(lái)沒(méi)有定論沾乘,為什么沒(méi)有定論呢?因?yàn)檐浖_(kāi)發(fā)的“方法學(xué)”還處于蒙昧的“隱喻時(shí)代”浑测,各家各派翅阵,都從自己的隱喻出發(fā)來(lái)看問(wèn)題,所謂“雞同鴨講”迁央,指的就是這種情況掷匠。
但是追求定論的努力,并不是從我才開(kāi)始的岖圈。在此之前也有人追求過(guò)讹语,這樣的努力,統(tǒng)稱(chēng)為——“軟件度量”蜂科,這當(dāng)然是典型的西方觀點(diǎn):能夠量化顽决,就能夠比較;能夠比較导匣,就能夠改進(jìn)才菠。這樣的觀點(diǎn),一點(diǎn)沒(méi)錯(cuò)贡定,但是還少了前面一句赋访,首先要理解,才有可能量化缓待。如果我們不能真正理解軟件開(kāi)發(fā)的本質(zhì)蚓耽,就無(wú)法判斷哪些可以量化,如何量化命斧,以及度量得出的數(shù)據(jù)又該如何解釋?zhuān)瑪?shù)據(jù)的重要性如何田晚?不能回答這些問(wèn)題,追求定論国葬,依然是不可能的。
請(qǐng)?jiān)试S我先把話題扯遠(yuǎn)一點(diǎn),談一談管理學(xué)汇四,談一談泰勒以及泰勒之后的管理學(xué)接奈。
1.“科學(xué)管理”與“泰勒式管理”
泰勒是毫無(wú)疑問(wèn)的科學(xué)管理之父,為什么我會(huì)起這樣一個(gè)標(biāo)題呢通孽?“科學(xué)管理”和“泰勒式管理”還有什么不同嗎序宦?
所謂“科學(xué)管理”,在我看來(lái)背苦,就是以科學(xué)的方式研究管理互捌。而泰勒正是以這樣的方式研究如何進(jìn)行管理的第一人。在泰勒之前的所有管理行剂,無(wú)論好壞秕噪,都只是停留在經(jīng)驗(yàn)的層面,而經(jīng)過(guò)泰勒的科學(xué)方式的研究厚宰,管理也終于可以當(dāng)之無(wú)愧的稱(chēng)之為一門(mén)科學(xué)腌巾,而泰勒以這樣的研究方式,得出的結(jié)論铲觉,就可以稱(chēng)之為“泰勒式的管理”澈蝙,這兩者并不能等同。
我們知道撵幽,一個(gè)科學(xué)體系灯荧,包含兩個(gè)方面,假設(shè)(公理)與邏輯推論盐杂。從哲學(xué)上來(lái)說(shuō)漏麦,我們把假設(shè)稱(chēng)為世界觀,而把推出結(jié)論的方式况褪,稱(chēng)為方法論撕贞。無(wú)論誰(shuí)來(lái)研究管理,只要他運(yùn)用的是科學(xué)的邏輯的方法测垛,我們就可以稱(chēng)其為“科學(xué)管理研究”捏膨,而如果他的初始假設(shè)與泰勒的不同,那么他得出的結(jié)論食侮,就不是“泰勒式的管理”号涯,但卻肯定是“科學(xué)管理”。
無(wú)數(shù)的人可以有無(wú)數(shù)種不同的假設(shè)锯七,那么我們?nèi)绾闻袛嗄囊环N假設(shè)更為合理链快,得出的結(jié)論更有價(jià)值呢?答案是:通過(guò)解釋和預(yù)言眉尸。一套理論域蜗,必須自洽巨双,也就是僅僅依靠本體系內(nèi)已知的,有限的假設(shè)霉祸,通過(guò)邏輯推理筑累,能夠解釋所有已知的、相關(guān)的現(xiàn)象丝蹭。其次就是通過(guò)推理得出的預(yù)言慢宗,要能夠接受驗(yàn)證,并且不被證偽奔穿。兩種不同的假設(shè)得出的不同的預(yù)言镜沽,就能夠通過(guò)驗(yàn)證,判斷他們的勝負(fù)贱田。而在預(yù)言沒(méi)有被證偽前缅茉,該理論體系,就和其他尚未被證偽的理論一樣湘换,是有效的宾舅。而所謂的偽科學(xué),就是只能解釋?zhuān)瑹o(wú)法給出預(yù)言的理論彩倚。
“泰勒式的管理”筹我,首先被證明是有效的。通過(guò)發(fā)現(xiàn)或者發(fā)明某個(gè)具體崗位上的最佳辦法和最佳工具帆离,大幅度的提升了工作的效率蔬蕊。以搬運(yùn)生鐵為例,工場(chǎng)工人裁減數(shù)從400~600下降到140哥谷,人均工作量從每天16噸岸夯,上升到每天59噸,人均收入從每天1.15美元上升到每天1.88美元们妥,平均費(fèi)用從每噸0.072美元猜扮,下降到每噸0.033美元。另外還有更為重要的效果是在工人本身监婶,工人中喝酒的人大為減少旅赢,浪費(fèi)錢(qián)的人也少了,因此都比以前生活得更好惑惶,他們把自己的頂頭上司和教師煮盼,看成是最好的朋友而不是強(qiáng)逼他們做工的人。
泰勒的研究方式十分科學(xué)带污,他尋找并假設(shè)了影響工人效率的幾大因素:技能僵控、工具、激勵(lì)鱼冀、外部環(huán)境报破。并一一研究這些因素對(duì)于效率的影響悠就,進(jìn)而通過(guò)實(shí)驗(yàn)的效果來(lái)得出結(jié)論。這所有的一切泛烙,都沒(méi)有什么錯(cuò)理卑,只是當(dāng)時(shí)的科學(xué)研究翘紊,尚無(wú)法證偽泰勒的諸多假設(shè)蔽氨。而這些假設(shè),也只有通過(guò)更進(jìn)一步的科學(xué)研究帆疟,才有可能證偽鹉究。這個(gè)研究在管理學(xué)歷史上大大有名,被稱(chēng)之為:“霍桑試驗(yàn)”踪宠,由喬治.埃爾頓.梅奧主持自赔。
“霍桑試驗(yàn)”原本是一次典型的“泰勒式的科學(xué)試驗(yàn)”。根據(jù)科學(xué)的思維模式柳琢,一個(gè)待研究的系統(tǒng)绍妨,接受很多輸入變量,也產(chǎn)生很多輸出變量柬脸,在嚴(yán)密的他去、可控的、量化的輸入變量的變化情況下倒堕,觀察輸出變量的變化灾测,通過(guò)一系列的數(shù)據(jù)去分析系統(tǒng)可能的數(shù)學(xué)模型,而“霍桑試驗(yàn)”的第一階段垦巴,就是要研究各種外界工作條件媳搪,對(duì)生產(chǎn)率的影響。他們把女工分為試驗(yàn)組和控制組(始終不改變條件骤宣,以作對(duì)照)然后每次試驗(yàn)只改變一項(xiàng)條件秦爆,比如照明條件,工間休息時(shí)間和頻率憔披,工作日長(zhǎng)度等等等限。按照試驗(yàn)計(jì)劃,第3活逆、第10和第13試驗(yàn)期的工作條件將完全相同精刷。但實(shí)際記錄到的產(chǎn)量,卻分別是:2500蔗候、2800怒允、3000。這是完全不符合預(yù)測(cè)的锈遥,也不是簡(jiǎn)單的測(cè)量誤差可以解釋的纫事,更令人不解的是勘畔,對(duì)照組的產(chǎn)量也在持續(xù)的提高。
這究竟說(shuō)明了什么問(wèn)題丽惶?到底是哪里出錯(cuò)了炫七?梅奧是這樣分析這個(gè)問(wèn)題的:他認(rèn)為存在著兩種研究方法,“臨床式研究”和“實(shí)驗(yàn)室”式研究钾唬⊥蚰模“臨床式研究”的目的在于對(duì)事物的本質(zhì)形成正確的認(rèn)識(shí),并學(xué)會(huì)處理實(shí)際材料的技能抡秆,在此基礎(chǔ)上奕巍,進(jìn)一步區(qū)分哪些方面可以繼續(xù)進(jìn)行更詳細(xì)的“試驗(yàn)室”式研究。如果隨后的“試驗(yàn)室”方法由于排除了某些未知的重要因素而歸于失敗儒士,研究人員就應(yīng)當(dāng)回到“臨床式研究”中去的止,以便弄清自己忽略了哪些因素。
而在我看來(lái)着撩,所謂的“試驗(yàn)室”研究诅福,就是在不動(dòng)搖基本假設(shè)的前提下,進(jìn)行邏輯推理拖叙,對(duì)照現(xiàn)實(shí)氓润,豐富理論的細(xì)節(jié)。只有當(dāng)這一理論的預(yù)言失敗憋沿,或者出現(xiàn)無(wú)法解釋的現(xiàn)象時(shí)旺芽,基礎(chǔ)假設(shè)才會(huì)被置疑,研究者需要重新去尋找能夠解釋現(xiàn)有現(xiàn)象的新的假設(shè)辐啄,這樣的研究往往非常困難采章,而且一旦成功就一定意義非凡。這在科學(xué)哲學(xué)上壶辜,被成為“范式的轉(zhuǎn)換”悯舟。
科學(xué)范式的轉(zhuǎn)化,從來(lái)都不是科學(xué)的失敗砸民,而是科學(xué)的重要的抵怎,甚至是跨越式的進(jìn)步。在管理學(xué)上岭参,從“經(jīng)濟(jì)人”假設(shè)轉(zhuǎn)換為“社會(huì)人”假設(shè)反惕,就是這樣一次重要的進(jìn)步。但是卻有很多人演侯,既不了解科學(xué)進(jìn)步的規(guī)律姿染,也不了解管理學(xué)的演變,卻簡(jiǎn)單的認(rèn)為人際關(guān)系學(xué)派的興起秒际,就意味著科學(xué)管理學(xué)派的失敗和錯(cuò)誤悬赏,并進(jìn)而認(rèn)為科學(xué)管理學(xué)派的失敗狡汉,就意味著以科學(xué)方法研究管理底失敗,這樣的誤會(huì)闽颇,實(shí)在是太不應(yīng)該了盾戴。
2.探尋假設(shè)
在探尋軟件開(kāi)發(fā)以往的方法論背后的假設(shè)之前,首先要指出的是兵多,這些假設(shè)很難被發(fā)現(xiàn)尖啡,不是說(shuō)它們不存在,而是這些加上很少被看成是假設(shè)中鼠,往往作為理所當(dāng)然的一部分可婶,被排除在常規(guī)的思考范圍之外沿癞。讓我們來(lái)看幾段大家都很熟悉的文字吧援雇。
“大多數(shù)大型軟件項(xiàng)目都沒(méi)有達(dá)到預(yù)期的目標(biāo),交付推遲椎扬,預(yù)算超支惫搏,功能不完善。許多軟件項(xiàng)目徹底失敗了蚕涤】鹋猓”
——FDD
“當(dāng)前,軟件開(kāi)發(fā)的情況并不理想揖铜。很多系統(tǒng)最終不能交付茴丰,或者最終交付的系統(tǒng)經(jīng)常性地發(fā)生延期或者超出預(yù)算;系統(tǒng)常常不能滿足用戶的需要天吓,其結(jié)果是不得不一遍又一遍地開(kāi)發(fā)贿肩。”
——AM
“許多軟件項(xiàng)目龄寞,或許應(yīng)該說(shuō)大部分軟件項(xiàng)目實(shí)際的開(kāi)發(fā)周期比預(yù)期的要長(zhǎng)汰规,實(shí)際的花費(fèi)比預(yù)期的要多,實(shí)現(xiàn)的功能比預(yù)期的要少物邑。這造成了嚴(yán)重的質(zhì)量問(wèn)題溜哮。”
——某一本CMM的書(shū)籍
怎么樣色解,是不是似曾相識(shí)茂嗓?我敢肯定,你不只在一本書(shū)的序言部分科阎,看到過(guò)類(lèi)似的文字述吸。無(wú)論這本書(shū)寫(xiě)于70年代、80年代萧恕、90年代還是21世紀(jì)刚梭。情況一直都是這么“糟糕”肠阱。有趣的是,這些書(shū)都會(huì)在“痛說(shuō)軟件開(kāi)發(fā)現(xiàn)狀”之后朴读,轉(zhuǎn)而兜售自己的方案屹徘。當(dāng)然,在Brooks的《沒(méi)有銀彈》之后衅金,他們兜售的語(yǔ)氣謙虛了很多噪伊。作為一個(gè)文化現(xiàn)象來(lái)說(shuō),這非常值得細(xì)細(xì)品味氮唯。但是鉴吹,我們需要追問(wèn)的是:為什么?
難道軟件開(kāi)發(fā)是全世界最難的事情嗎惩琉?為什么失敗率如此之高豆励?如果我們?cè)谑褂昧藢映霾桓F的手段之后,還是不能提高成功率瞒渠,我們應(yīng)該怎么辦良蒸?其實(shí)也很容易,當(dāng)年我的一個(gè)老板就想出了一個(gè)絕妙的辦法伍玖,絕對(duì)簡(jiǎn)單嫩痰,就是將我自己的工作量估算乘2!我們的項(xiàng)目幾乎從不失敗窍箍,總是能夠在計(jì)劃時(shí)間內(nèi)完成串纺。于是我想,如果我們把全世界的軟件項(xiàng)目估算都乘以2的話椰棘。也許軟件開(kāi)發(fā)這個(gè)行當(dāng)讼昆,也能成為一個(gè)有尊嚴(yán)的職業(yè)副瀑。大家都會(huì)生活得更加幸福砂碉。
“這實(shí)在是太過(guò)分了眯牧!”也許有人會(huì)說(shuō):“你這是自欺欺人、掩耳盜鈴外恕、移靶就箭杆逗!”但是且慢生氣,生氣的人應(yīng)該冷靜下來(lái)反思:如果目標(biāo)如此難以達(dá)到鳞疲,會(huì)不會(huì)是目標(biāo)有問(wèn)題呢罪郊?當(dāng)然,事情沒(méi)有這么簡(jiǎn)單尚洽,如果把目標(biāo)直接乘2來(lái)提高成功率悔橄,全世界的老板都會(huì)發(fā)瘋的!我們要做的,是提高估算的準(zhǔn)確性癣疟。
“嘖嘖挣柬,還以為是什么了不得的結(jié)論呢!這個(gè)問(wèn)題早就有人研究了睛挚,不就是IT度量嗎邪蛔?”一定會(huì)有人站出來(lái)這么說(shuō)。但是扎狱,IT度量的研究侧到,提高了估算的準(zhǔn)確度了嗎?思路在這里被卡住了淤击。直到有一天匠抗,我看到了量子力學(xué)中的“測(cè)不準(zhǔn)原理”!
“測(cè)不準(zhǔn)原理”告訴我們污抬,在物理學(xué)中存在著很多對(duì)變量汞贸,當(dāng)我們想要精確測(cè)量其中一個(gè)變量時(shí),對(duì)另一個(gè)變量的測(cè)量誤差就會(huì)越來(lái)越大壕吹。但是著蛙,在軟件開(kāi)發(fā)里,我們是進(jìn)行估算耳贬,而不是進(jìn)行測(cè)量,而且也不存在一個(gè)和工作量相對(duì)的變量猎唁,當(dāng)工作量估算準(zhǔn)確時(shí)咒劲,它會(huì)變得模糊。簡(jiǎn)單地套用物理定律是行不通的诫隅,思路又卡住了腐魂。
突然有一天,我問(wèn)自己:“假設(shè)工作量已經(jīng)估算精確到了99.9999%會(huì)出現(xiàn)什么情況逐纬?”“不可能蛔屹!”“如果真的達(dá)到了這個(gè)精確度了呢?”我對(duì)自己窮追不舍豁生⊥枚荆“那只有一種情況,就是項(xiàng)目已經(jīng)接近完成了甸箱!”“我們估算完成時(shí)育叁,項(xiàng)目接近完成,這意味著什么呢芍殖?”“這毫無(wú)意義豪嗽,沒(méi)有一個(gè)項(xiàng)目會(huì)花這個(gè)多時(shí)間來(lái)估算,而且如果要這樣估算,估算本身要花多少時(shí)間都不知道龟梦∫В”停!我已經(jīng)想通這個(gè)問(wèn)題了计贰。
估算工作量也是一種工作成榜,同樣也需要工作量。對(duì)于大多數(shù)任務(wù)來(lái)說(shuō)蹦玫,估算所花費(fèi)的工作量赎婚,相對(duì)與總的工作量來(lái)說(shuō),幾乎可以忽略不計(jì)樱溉,或者說(shuō):為了能夠得到一個(gè)有指導(dǎo)價(jià)值的估算值挣输,所花費(fèi)的工作量,幾乎可以忽略福贞。但是撩嚼,對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō),這只是一個(gè)假設(shè)挖帘。我們假設(shè)對(duì)于軟件開(kāi)發(fā)的工作量估算完丽,同樣只需要花費(fèi)極少的工作量。但事實(shí)上拇舀,當(dāng)我們花費(fèi)三五天時(shí)間得出結(jié)論逻族,這個(gè)項(xiàng)目需要20個(gè)人月時(shí),我們估算的誤差骄崩,可能(甚至一定)會(huì)大于200%這就是我們這個(gè)行業(yè)顯得如此失敗的原因聘鳞。
為什么這個(gè)行業(yè)與其它行業(yè)不同呢?在建筑行業(yè)要拂,工程概預(yù)算的費(fèi)用抠璃,不超過(guò)總費(fèi)用的百分之一、甚至千分之一脱惰。為什么軟件項(xiàng)目的估算做不到這一點(diǎn)搏嗡?因?yàn)閮蓚€(gè)原因:
一是由于技術(shù)的復(fù)雜性,以及這個(gè)行業(yè)技術(shù)的飛速發(fā)展(也可說(shuō)尚未定型)拉一,同樣的需求采盒,采用不同的設(shè)計(jì),不同的技術(shù)實(shí)現(xiàn)舅踪,工作量相差極大纽甘。僅僅根據(jù)需求,無(wú)法估算出工作量抽碌。而隨著概要設(shè)計(jì)悍赢、詳細(xì)設(shè)計(jì)的層層分解决瞳,工作量估算的精確度的確會(huì)提高,但是對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō)左权,項(xiàng)目也越來(lái)越接近完成了皮胡。
二是由于需求的變動(dòng)性以及不可預(yù)測(cè)性。早期的估算赏迟、設(shè)計(jì)甚至代碼屡贺,都有可能作廢。一個(gè)項(xiàng)目實(shí)際上重做了N遍锌杀,在軟件開(kāi)發(fā)領(lǐng)域也是常有的事甩栈。估算的誤差,自然也就大到不可思議了糕再。
然而量没,絕大多數(shù)人沒(méi)有想過(guò)這個(gè)問(wèn)題,大家都自然而然的根據(jù)最初的工作量估算突想,來(lái)評(píng)價(jià)以后的工作殴蹄。
工作量/人員效率=項(xiàng)目時(shí)間
工作量×單位成本=項(xiàng)目成本
缺陷總數(shù)/工作量=軟件質(zhì)量
我們根據(jù)最初估算的工作量,來(lái)推出項(xiàng)目的時(shí)間猾担、成本和質(zhì)量目標(biāo)袭灯,我們假設(shè)工作量估算只花費(fèi)可以忽略不計(jì)的工作量,我們依據(jù)這些目標(biāo)來(lái)衡量項(xiàng)目的成敗绑嘹,然后我們發(fā)現(xiàn)大多數(shù)項(xiàng)目都失敗了稽荧,然后我們研究技術(shù)、改進(jìn)過(guò)程圾叼、尋找銀彈蛤克!最終,我們發(fā)現(xiàn)自己還是這么失斠奈谩!
是到了徹底反省我們的假設(shè)的時(shí)候了髓介。
(注:Brooks在《人月神話》中指出了另一個(gè)重要的假設(shè):人與月是可以互換的惕鼓。)
三、軟件開(kāi)發(fā)的特征
軟件開(kāi)發(fā)究竟是怎么一回事呢唐础?在我的前一個(gè)連載《敲響OO時(shí)代的喪鐘》里箱歧,我也討論到了軟件開(kāi)發(fā)的實(shí)質(zhì),自己引一段來(lái)用用一膨。
軟件開(kāi)發(fā)的定義:“軟件開(kāi)發(fā)呀邢,就是在一個(gè)受到限制的環(huán)境中,利用環(huán)境提供的可能性豹绪,修改或添加環(huán)境允許的各種狀態(tài)价淌,去滿足某一組需求。”
- 軟件開(kāi)發(fā)所處的環(huán)境蝉衣,不僅僅是一個(gè)限制括尸,同時(shí)也是一個(gè)可能性。軟件的能力病毡,局限性與硬件的能力濒翻,比如說(shuō),如果計(jì)算機(jī)沒(méi)有喇叭啦膜,那么任何軟件都不能使計(jì)算機(jī)播放音樂(lè)有送。但是,另一個(gè)必須考慮的方面是僧家,同樣有能力發(fā)聲的計(jì)算機(jī)雀摘,要想使他播放音樂(lè),可能很容易啸臀,也可能很困難届宠。用專(zhuān)業(yè)一點(diǎn)話來(lái)描述就是:“有些硬件的API設(shè)計(jì)很合理,有些則非常愚蠢乘粒⊥阕ⅲ”由于我們對(duì)于軟、硬件的定義是一個(gè)連續(xù)體灯萍,因此轧铁,這個(gè)觀點(diǎn)不只是可以用來(lái)評(píng)價(jià)硬件API設(shè)計(jì),也可以用來(lái)評(píng)價(jià)語(yǔ)言旦棉、虛擬機(jī)齿风、框架、平臺(tái)等等軟件的一個(gè)方面的優(yōu)缺點(diǎn)——是否有利于二次開(kāi)發(fā)绑洛,這是一個(gè)重要的評(píng)價(jià)標(biāo)準(zhǔn)救斑。
- 修改、添加狀態(tài)真屯,比較拗口脸候,其實(shí)就是編程的意思。在一個(gè)受限制的范圍內(nèi)編程绑蔫,我們需要考慮很多東西运沦,語(yǔ)法、接口配深、規(guī)范携添、內(nèi)存大小諸如此類(lèi),當(dāng)然篓叶,不同級(jí)別的烈掠,不同領(lǐng)域的編程羞秤,需要考慮的限制是有巨大差別的。軟件開(kāi)發(fā)的水平高低也就體現(xiàn)在向叉,滿足同樣的需求锥腻,有些方法速度更快,有些方面卻要慢很多母谎。而軟件開(kāi)發(fā)的方法的選擇瘦黑,受到很多因素的影響:環(huán)境限制,經(jīng)驗(yàn)多少以及對(duì)于需求的了解程度等等奇唤。
- 滿足需求幸斥,是啊咬扇!提起這個(gè)需求甲葬,每一個(gè)程序員都會(huì)有好多的苦水要倒出來(lái)。為什么滿足需求就這么難呢懈贺?因?yàn)榫眩瑢?duì)于程序員來(lái)說(shuō),那是另外一個(gè)世界(這是比較客氣的說(shuō)法)梭灿,那些提需求的家伙根本不懂怎么說(shuō)話(這個(gè)說(shuō)法稍為激烈一些)画侣,那是一些不知道自己要什么的蠢貨(你遇到過(guò)這樣的用戶嗎?)作為程序員堡妒,我知道我有很多同行配乱,非常苦惱于與客戶談需求這樣的任務(wù)——“至少電腦不會(huì)出現(xiàn)前后矛盾的邏輯錯(cuò)誤”——這就是做程序員的難處皮迟。如果我們不僅僅是抱怨的話搬泥,也必須承認(rèn),程序員是非常挑戰(zhàn)的職業(yè)伏尼,一個(gè)好的程序員忿檩,不但得是軟件開(kāi)發(fā)領(lǐng)域的專(zhuān)家,還得是他開(kāi)發(fā)的那一類(lèi)軟件所在領(lǐng)域的專(zhuān)家爆阶。但事實(shí)上休溶,其他行業(yè)的人,只需要做一種專(zhuān)家就能夠混得很好了扰她。
軟件開(kāi)發(fā)的實(shí)質(zhì),與軟件開(kāi)發(fā)的特征之間芭碍,還是有區(qū)別的徒役。畢竟我的前一篇文章,是從技術(shù)的角度出發(fā)來(lái)看軟件開(kāi)發(fā)窖壕,而現(xiàn)在我們的要討論的是從管理的角度來(lái)看待忧勿,它又有哪些特征呢杉女?
軟件開(kāi)發(fā)的管理特征,在外行看來(lái)鸳吸,也就是一堆人在做個(gè)東西熏挎。但是,軟件開(kāi)發(fā)的獨(dú)特之處就在于晌砾,軟件開(kāi)發(fā)是由一堆獨(dú)特的人坎拐,以獨(dú)特的方式,做獨(dú)特的東西养匈。我們先來(lái)看看軟件開(kāi)發(fā)哼勇,遇到了哪些獨(dú)特的困難:
1、溝通困難:同為軟件開(kāi)發(fā)呕乎,可能面對(duì)的思維模式积担,是完全不同的世界。比如二進(jìn)制的世界猬仁,函數(shù)的世界帝璧、邏輯的世界、過(guò)程的世界湿刽、對(duì)象的世界的烁、二維表的世界等等等等。在這些不同的世界中開(kāi)發(fā)軟件叭爱,需要的思考方式撮躁、思維習(xí)慣都是不同的。開(kāi)發(fā)項(xiàng)目大到一定程度以后买雾,不同的世界必須在一個(gè)完整的項(xiàng)目中和諧并存把曼,這些差異,有時(shí)候就會(huì)帶來(lái)溝通障礙漓穿。再加上技術(shù)與需求世界之間的差異嗤军,溝通成為一個(gè)非常重要的工作。軟件開(kāi)發(fā)中的人與事晃危,如何才能有效溝通叙赚,是一個(gè)非常重大的課題。
2僚饭、控制困難:程序員都是些怪人震叮,至少都是些聰明人。要讓他們聽(tīng)話鳍鸵,很難啊苇瓣。一個(gè)項(xiàng)目,要想順利進(jìn)行偿乖,程序員們能夠接受的击罪,必須是“穩(wěn)定而合理的命令”哲嘲。而在軟件開(kāi)發(fā)過(guò)程中,往往需求頻繁變動(dòng)媳禁,領(lǐng)導(dǎo)層層疊疊眠副,用戶花樣百出,計(jì)劃一改再改竣稽。程序員們經(jīng)常會(huì)接到朝令夕改的命令囱怕,而且還來(lái)自于那些莫名其妙,連說(shuō)話的邏輯都成問(wèn)題的家伙丧枪。如何才能知道光涂,那些小伙子是在嚴(yán)格地執(zhí)行命令而不是在那里磨洋工呢?
3拧烦、評(píng)價(jià)困難:要控制忘闻,必須要能夠賞善罰惡,但是在軟件開(kāi)發(fā)中恋博,何為善齐佳?何為惡?如何評(píng)價(jià)一個(gè)程序員的工作债沮?我們當(dāng)然可以在項(xiàng)目計(jì)劃該結(jié)束的時(shí)候炼吴,再去問(wèn)他們,做完了嗎疫衩?但是如果他們那時(shí)候沒(méi)有完成硅蹦,再要挽救就來(lái)不及了。必須在項(xiàng)目開(kāi)發(fā)過(guò)程中建立即使有效的反饋機(jī)制闷煤。以小而高密度的評(píng)價(jià)手段童芹,來(lái)對(duì)開(kāi)發(fā)過(guò)程進(jìn)行較為準(zhǔn)確的控制,這一切鲤拿,都必須建立在合理的評(píng)價(jià)機(jī)制的基礎(chǔ)上假褪。但是,這樣一套評(píng)價(jià)機(jī)制近顷,非常困難生音。什么才算是好的需求分析?好的代碼窒升?好的設(shè)計(jì)缀遍?好的測(cè)試用例?沒(méi)有定論饱须。舉個(gè)例子:兩三年前瑟由,在項(xiàng)目中加入EJB的成分,越多越好。現(xiàn)在呢歹苦?設(shè)計(jì)人員,隨時(shí)都可能被人指責(zé)濫用EJB督怜。這風(fēng)向變得也太快了殴瘦。
4、估算困難:這個(gè)在上一章我們也討論到了号杠,軟件開(kāi)發(fā)與其它行業(yè)的一個(gè)重大區(qū)別蚪腋,就在于對(duì)于軟件開(kāi)發(fā)的估算成本堂污,不能忽略不計(jì)瞧挤。想要估算變動(dòng)劇烈的項(xiàng)目的時(shí)間、人力单山、成本眼溶,簡(jiǎn)直就是不可能的任務(wù)悠砚。
怎么辦?
討論軟件開(kāi)發(fā)的特征堂飞,需要站在一個(gè)大的背景下來(lái)看灌旧。我以前考過(guò)PMP,在PMBOK中绰筛,軟件項(xiàng)目管理枢泰,是作為項(xiàng)目管理下的子課題來(lái)討論的÷霖看看下面這張圖:
按照PMBOK的知識(shí)結(jié)構(gòu)圖衡蚂,PMBOK已經(jīng)告訴了我們那么大一個(gè)園。而要進(jìn)一步搞好軟件的項(xiàng)目管理骏庸,我們只需要再掌握相關(guān)應(yīng)用領(lǐng)域的知識(shí)和實(shí)踐毛甲,就ok了。
這其實(shí)是大多數(shù)項(xiàng)目管理的理論敞恋,對(duì)于軟件項(xiàng)目管理的看法丽啡,所有的項(xiàng)目,都是項(xiàng)目硬猫。軟件項(xiàng)目與大多數(shù)其它項(xiàng)目补箍,大同而小異。至于差異部分啸蜜,往往被歸入“風(fēng)險(xiǎn)管理”的領(lǐng)域坑雅,就算是“一切盡在掌握了”。
而事實(shí)上衬横,軟件項(xiàng)目與其它項(xiàng)目的差異是如此之大裹粤,以至于由量變而導(dǎo)致了質(zhì)變,使得我們以傳統(tǒng)的工程項(xiàng)目管理的方式來(lái)管理軟件開(kāi)發(fā)項(xiàng)目蜂林,注定是要失敗的遥诉。
我們來(lái)看看這樣一個(gè)關(guān)鍵詞:“迭代”拇泣。這是其它的項(xiàng)目管理中,基本上不可能出現(xiàn)的概念矮锈,而在軟件項(xiàng)目管理領(lǐng)域霉翔,卻是幾乎每一種方法學(xué)中,都要極力強(qiáng)調(diào)的概念苞笨。這就是最大的區(qū)別债朵。如果我們能夠搞清楚迭代的本質(zhì),也就能夠搞清楚軟件項(xiàng)目與其它項(xiàng)目的本質(zhì)區(qū)別了瀑凝。
在我看來(lái)序芦,在軟件開(kāi)發(fā)的過(guò)程中,引入迭代粤咪,就是承認(rèn)谚中,軟件開(kāi)發(fā)需要承受大大小小的失敗,而減少失敗的辦法射窒,就是不跑步藏杖,不走路,盡可能的爬行脉顿,這樣就算跌倒蝌麸,也不會(huì)跌得太重。我們來(lái)看一個(gè)有趣的數(shù)據(jù)艾疟。這是我在竹筍炒肉的blog上看到的一段話来吩。
1994年,由于其非凡的軟件開(kāi)發(fā)能力和優(yōu)秀的軟件質(zhì)量蔽莱,SEL成為第一個(gè)因軟件過(guò)程的成就而贏得IEEE獎(jiǎng)勵(lì)的軟件開(kāi)發(fā)組織弟疆。與普通的軟件開(kāi)發(fā)組織相比,在同樣的軟件開(kāi)發(fā)條件下盗冷,NASA所開(kāi)發(fā)的軟件的質(zhì)量要好10到20倍怠苔。
這個(gè)成就是如何得出的呢?那么是怎樣的項(xiàng)目呢仪糖?我搜索了一個(gè)google柑司,找到另外一段話:
To put it a little differently, the average MIS shop would need about 14 calendar months and 110 staff-months to deliver a 100,000 line-of-code MIS system, and it would typically contain about 850 defects when delivered. The NASA SEL would deliver a system of that size with about the same amount of time and effort, but it would contain only about 50 defects.
也就是說(shuō),10萬(wàn)行代碼的一個(gè)MIS系統(tǒng)锅劝,他們花了110個(gè)人月攒驰,一共14個(gè)月,才完成故爵。平均下來(lái)玻粪,每個(gè)人每天大約需要寫(xiě)30行代碼!如果這樣也算成功的軟件項(xiàng)目管理的話,我以后只要將所有的項(xiàng)目工作量估算劲室,乘以10伦仍,就能同樣拿到IEEE的獎(jiǎng)勵(lì)了,如果我的老板允許的話痹籍。
各位一定非常驚訝(如果是讀過(guò)前面幾篇連載《定論》的人)呢铆,怎么這就完了呢?看著架勢(shì)蹲缠,應(yīng)該還早啊。
是啊悠垛,按照原定的計(jì)劃呢线定,的確是還早,但是那樣的寫(xiě)法确买,我自己都不知道會(huì)寫(xiě)到何年何月去了斤讥,因此打算結(jié)束這個(gè)東西,把我要表達(dá)的想法湾趾,一口氣跟大家說(shuō)了芭商,也是一種解脫。
總結(jié)我的想法搀缠,主要有以下幾點(diǎn):
1铛楣、現(xiàn)有的軟件開(kāi)發(fā)方法,都不是定論艺普,不過(guò)是你說(shuō)你的好簸州,我說(shuō)我的好罷了。要能夠得到定論歧譬,必須要有一種能夠判斷方法好壞的方法岸浑。也就是說(shuō),能夠判斷一個(gè)方法瑰步,用或不用矢洲,有多少好處。幾個(gè)方法比較缩焦,哪個(gè)能夠勝出的“檢驗(yàn)標(biāo)準(zhǔn)”读虏。
2、要能夠檢驗(yàn)軟件開(kāi)發(fā)方法的優(yōu)劣舌界,必須基于對(duì)于軟件開(kāi)發(fā)本質(zhì)的正確認(rèn)識(shí)掘譬,這樣才能量化兩個(gè)因素:軟件需求的復(fù)雜程度以及軟件開(kāi)發(fā)的實(shí)際工作量。而現(xiàn)在的軟件復(fù)雜度的度量呻拌,并未區(qū)分“需求”與“實(shí)際”的不同葱轩,或者“代碼行數(shù)”,或者“功能點(diǎn)”,都是如此靴拱。
3垃喊、在能夠正確度量需求復(fù)雜度與實(shí)際工作量之后,我們會(huì)發(fā)現(xiàn)袜炕,過(guò)去那么多號(hào)稱(chēng)是為了保證軟件順利開(kāi)發(fā)的手段本谜,往往只會(huì)壞事,耽誤事偎窘。但是乌助,完全不提前設(shè)計(jì)的方法,也并不可取陌知。
原文寫(xiě)于:2005年11月他托,最后其實(shí)是草草結(jié)束,并沒(méi)有寫(xiě)完仆葡。當(dāng)然赏参,后續(xù)我也一直在思考,直到最近沿盅,我又另外寫(xiě)了一篇《從軟件工程到研發(fā)管理》把篓,希望能夠把這個(gè)問(wèn)題思考明白。