2002 年 3 月 01 日 方法論對(duì)軟件開(kāi)發(fā)而言意味著什么?我們?nèi)绾慰创浖_(kāi)發(fā)中的方法論?方法論能夠成為軟件開(kāi)發(fā)的救命稻草嗎?在讀過(guò)此文后,這些疑惑就會(huì)得到解答。 在第一篇文章中,我們來(lái)了解標(biāo)題中的一些詞的含義。
方法論的英文為Methodology,詞典中的解釋為"A series of related methods or techniques"我們可以把它定義為軟件開(kāi)發(fā)(針對(duì)軟件開(kāi)發(fā))的一整套方法、過(guò)程、規(guī)則、實(shí)踐、技術(shù)。關(guān)于方法論的出現(xiàn)的問(wèn)題,我很贊同Alistair Cockburn的一句話(huà),"方法論源于恐懼。"出于對(duì)項(xiàng)目的超期、成本失控等等因素的恐懼,項(xiàng)目經(jīng)理們從以前的經(jīng)驗(yàn)出發(fā),制定出了一些控制、監(jiān)測(cè)項(xiàng)目的方法、技巧。這就是方法論產(chǎn)生的原因。 在Agile Software Development一書(shū)中,作者提到了方法論的十三個(gè)要素,基本能夠函蓋方法論的各個(gè)方面:
它們之間的關(guān)系可以用一幅圖來(lái)表示: 圖 1. 方法論的十三個(gè)要素 ![]() 很多的方法論,都涉及了上面列舉的十三要素中的部分要素,因此,我們可以把方法論看作是一個(gè)抽象的、無(wú)窮的超集,而現(xiàn)實(shí)中的方法論都是指超集的一個(gè)有限的子集而已。它們之間的關(guān)系就好像有理數(shù)和1到100之間的整數(shù)的關(guān)系一樣。不論是XP,還是UI設(shè)計(jì)經(jīng)驗(yàn)之類(lèi),都屬于方法論的一個(gè)子集,只是這兩個(gè)子集之間有大小的差別而已。我們還應(yīng)該看到,討論一個(gè)完備的方法論是沒(méi)有意義的,因此這種方法論鐵定不存在,就好像你視圖窮舉出所有的有理數(shù)一樣荒唐。因此,我們關(guān)于一個(gè)通用的方法論的說(shuō)法也是無(wú)意義的。好的方法論,比如說(shuō)XP、水晶系列,它們都有一個(gè)適合的范圍,因?yàn)樗鼈兞私庖稽c(diǎn),自己并不是一個(gè)無(wú)所不能的方法論。 在現(xiàn)實(shí)中,我們其實(shí)不斷的在接觸方法論。比如說(shuō),為了控制項(xiàng)目的進(jìn)度,項(xiàng)目經(jīng)理要求所有的開(kāi)發(fā)人員每周遞交一份詳細(xì)的進(jìn)度報(bào)告,這就是一種方法、一種技巧。如果把開(kāi)發(fā)過(guò)程中的這些技巧系統(tǒng)的組織起來(lái),就能夠成為一種方法論。你可能會(huì)說(shuō),那一種方法論的產(chǎn)生也太容易了吧。不,這樣產(chǎn)生的方法論并沒(méi)有太大的實(shí)用價(jià)值,沒(méi)有實(shí)用價(jià)值的方法論根本就沒(méi)有存在的必要。因此,一個(gè)成功的方法論是要能夠?yàn)槎鄠€(gè)的項(xiàng)目所接受,并且能夠成功實(shí)現(xiàn)軟件的交付的方法論。 我和我的同事在實(shí)踐中做了一些試驗(yàn),希望能夠把一些好的方法論應(yīng)用于開(kāi)發(fā)團(tuán)隊(duì)。試驗(yàn)的結(jié)果很無(wú)奈,方法論實(shí)施的效果并不理想,一開(kāi)始我們認(rèn)為是方法本身的原因,到后來(lái),我們發(fā)現(xiàn)事情并不是這么簡(jiǎn)單。在試驗(yàn)的過(guò)程中,開(kāi)發(fā)人員一致認(rèn)同方法論的優(yōu)勢(shì)所在,但是在實(shí)施過(guò)程中,鮮有堅(jiān)持的下來(lái)的。在Agile Software Development中,我發(fā)現(xiàn)作者遇到了和我們一樣的問(wèn)題。 Alistair Cockburn在和大量的項(xiàng)目團(tuán)隊(duì)的訪談之后,寫(xiě)成了Agile Software Development一書(shū)。在訪談之前,他篤定自己將會(huì)發(fā)現(xiàn)高度精確的過(guò)程控制是成功的關(guān)鍵所在,結(jié)果他發(fā)現(xiàn)事實(shí)并非如此,他把他的發(fā)現(xiàn)歸結(jié)為7條定律。而我在實(shí)際中的發(fā)現(xiàn)也包含在這七條定律中,總結(jié)起來(lái)就只有兩點(diǎn):溝通和反饋。 只要能夠保證良好的溝通和即時(shí)的反饋,那么開(kāi)發(fā)團(tuán)隊(duì)即使并沒(méi)有采用先進(jìn)的方法論,一樣可以成功。相反,那些"高質(zhì)量"的團(tuán)隊(duì)卻往往由于缺乏這兩個(gè)因素而導(dǎo)致失?。ㄎ覀冞@里指的失敗是用戶(hù)拒絕使用最終的軟件)。最有效,而成本也最低的溝通方法就是面對(duì)面(face to face)的溝通,而隨著項(xiàng)目團(tuán)隊(duì)的變大,或是另外一些影響因素的加入(比如地理位置的隔絕),面對(duì)面的溝通越來(lái)越難實(shí)現(xiàn),這導(dǎo)致溝通的的成本逐漸加大,質(zhì)量也慢慢下降。但這并不是說(shuō)非面對(duì)面的溝通不可,重要的是我們需要知道不同的溝通方式的成本和質(zhì)量并不相同。XP方法尤為強(qiáng)調(diào)面對(duì)面的溝通,通過(guò)現(xiàn)場(chǎng)客戶(hù)、站立會(huì)議、結(jié)對(duì)編程等方式來(lái)保證溝通的有效。在我的經(jīng)驗(yàn)中,一個(gè)開(kāi)發(fā)團(tuán)隊(duì)其實(shí)是需要多種溝通方式的結(jié)合的。完全的面對(duì)面的溝通對(duì)某些團(tuán)隊(duì)來(lái)說(shuō)是很難實(shí)現(xiàn)的,那么問(wèn)題的關(guān)鍵就在于你如何應(yīng)用溝通的方式來(lái)達(dá)到你希望的效果。在前不久結(jié)束的歐萊雅創(chuàng)業(yè)計(jì)劃大賽上,有一支團(tuán)隊(duì)特別引人注目,他們彼此間素未謀面,僅僅憑借Internet和電話(huà)完成了高效的合作。他們雖然沒(méi)有使用面對(duì)面的溝通方式,但是仍然達(dá)成了既定的目標(biāo)。軟件開(kāi)發(fā)也是一樣的,面對(duì)面的溝通是非常有必要的,但其它的溝通方式也是需要的。 再看反饋,不論是控制進(jìn)度,還是保證客戶(hù)的滿(mǎn)意度,這些活動(dòng)都需要管理成本。軟件開(kāi)發(fā)中的管理成本的一個(gè)通性就是伴隨有中間產(chǎn)出物(intermediate delivery)。比如說(shuō)我們的需求規(guī)約、分析文檔、設(shè)計(jì)文檔、測(cè)試計(jì)劃,這些都屬于中間產(chǎn)出物。中間產(chǎn)出物的增加將會(huì)帶來(lái)效率下降的問(wèn)題,因?yàn)殚_(kāi)發(fā)人員的時(shí)間都花在了完成中間產(chǎn)出物的工作上,花在給軟件新功能上的時(shí)間就減少了。而中間產(chǎn)出物的主要目的是兩個(gè),一個(gè)是為了保證軟件如客戶(hù)所愿,例如需求規(guī)約;另一個(gè)是為了作為團(tuán)隊(duì)中的其他成員工作的輸入,例如開(kāi)發(fā)計(jì)劃、測(cè)試計(jì)劃等。因此,我們也可以針對(duì)這兩點(diǎn)來(lái)商討對(duì)策,一種是采用迭代的思想,提高軟件發(fā)布的頻率,以保證客戶(hù)的需求被確實(shí)的滿(mǎn)足,另一種就是縮小團(tuán)隊(duì)的溝通范圍,保證成員能夠從其他人那里得到新的思路,而不是撰寫(xiě)規(guī)范的內(nèi)部文檔(內(nèi)部文檔指那些僅為內(nèi)部開(kāi)發(fā)人員之間的溝通所需要的文檔)。 因此,一個(gè)軟件項(xiàng)目的成功和你采用的開(kāi)發(fā)方法論并沒(méi)有直接的關(guān)系。
我們根據(jù)把擁有大量artifact(RUP官方翻譯為工件,意思是軟件開(kāi)發(fā)過(guò)程中的中間產(chǎn)物,如需求規(guī)約、設(shè)計(jì)模型等)和復(fù)雜控制的軟件開(kāi)發(fā)方法稱(chēng)為重型(Heavy Weight)方法,相對(duì)的,我們稱(chēng)artifact較少的方法為輕型(Light Weight)方法。在傳統(tǒng)的觀念中,我們認(rèn)為重型方法要比輕型安全許多。因?yàn)槲覀冎韵氤鲋匦头椒?,就是由于在中大型的?xiàng)目中,項(xiàng)目經(jīng)理往往遠(yuǎn)離代碼,他無(wú)法有效的了解目前的工程的進(jìn)度、質(zhì)量、成本等因素。為了克服未知的恐懼感,項(xiàng)目經(jīng)理制定了大量的中間管理方法,希望能夠控制整個(gè)項(xiàng)目,最典型的莫過(guò)于要求開(kāi)發(fā)人員頻繁的遞交各種表示項(xiàng)目目前狀態(tài)的報(bào)告。 在Planning XP一書(shū)中有一段討論輕重型方法論的精辟論述,它把重型方法論歸結(jié)為一種防御性的姿態(tài)(defensive posture),而把輕型方法論歸結(jié)為一種渴望成功(Plan to win)的心態(tài)。如果你是采用了防御性姿態(tài),那么你的工作就集中在防止和跟蹤錯(cuò)誤上,大量的工作流程的制定,是為了保證項(xiàng)目不犯錯(cuò)誤,而不是項(xiàng)目成功。而這種方法也不可謂不好,但前提是如果整個(gè)團(tuán)隊(duì)能夠滿(mǎn)足前面所提到的兩個(gè)條件的話(huà),項(xiàng)目也肯定會(huì)成功,但是重型方法論的一個(gè)弊端就在于,大家都在防止錯(cuò)誤,都在懼怕錯(cuò)誤,因此人和人之間的關(guān)系是很微妙的,要達(dá)到充分的溝通也是很難的。最終,連對(duì)人的評(píng)價(jià)也變成是以避免錯(cuò)誤的多寡作為考評(píng)的依據(jù),而不是成就。我們?cè)谧鲈囼?yàn)的時(shí)候,一位項(xiàng)目經(jīng)理開(kāi)玩笑說(shuō),"方法論源自項(xiàng)目經(jīng)理的恐懼,這沒(méi)錯(cuò)。但最糟糕的是整個(gè)團(tuán)隊(duì)只有項(xiàng)目經(jīng)理一個(gè)人恐懼,如果能夠做到人人的恐懼,那大家也就沒(méi)有什么好恐懼的了。"這句話(huà)提醒了我們,如果一個(gè)團(tuán)隊(duì)的精神就是力求成功,那么這支團(tuán)隊(duì)的心態(tài)就和其它的團(tuán)隊(duì)不同了,尤其是對(duì)待錯(cuò)誤的心態(tài)上。根本就沒(méi)有必要花費(fèi)大量的精力來(lái)預(yù)防錯(cuò)誤,錯(cuò)誤犯了就犯了,即時(shí)改正就可以了。這其實(shí)就是渴望成功的心態(tài)。
管理,被稱(chēng)為科學(xué)和藝術(shù)的融合體,而管理的藝術(shù)性部分很大程度的體現(xiàn)為人的管理上。我說(shuō),方法學(xué),一樣是科學(xué)和藝術(shù)的融合體。這是有依據(jù)的,其實(shí)方法論和管理學(xué)是近親關(guān)系,管理學(xué)中有一門(mén)分支是項(xiàng)目管理,而在軟件組織中,項(xiàng)目管理是非常重要的,方法學(xué)就是一種針對(duì)軟件開(kāi)發(fā)的一種特定的項(xiàng)目管理(或是項(xiàng)目管理的一個(gè)子集)。 重型方法最大的一個(gè)問(wèn)題就在于他不清楚或忽略了藝術(shù)這個(gè)層次,忽視了人的因素,把人做為一個(gè)計(jì)量單位,一種資源,一種線(xiàn)性元素。而人的要素在軟件開(kāi)發(fā)中是非常重要的,軟件開(kāi)發(fā)實(shí)際上是一種知識(shí)、智力的轉(zhuǎn)移過(guò)程,最終形成的產(chǎn)品是一種知識(shí)產(chǎn)品,它的成本取決于開(kāi)發(fā)者的知識(shí)價(jià)值,因此,人是最重要的因素。而人這個(gè)要素是很難衡量的,每個(gè)人都有不同的個(gè)性、想法、經(jīng)驗(yàn)、經(jīng)歷,這么多復(fù)雜的因素加在一起,就導(dǎo)致了人的不可預(yù)見(jiàn)性。因此,我們強(qiáng)調(diào)管人的藝術(shù)。 最簡(jiǎn)單的例子是,在重型方法中,我們的基本假設(shè)是對(duì)人的不信任。項(xiàng)目經(jīng)理要控制項(xiàng)目。但不信任就會(huì)產(chǎn)生很多的問(wèn)題,比如士氣不高,計(jì)劃趕不上變化,創(chuàng)新能力低下,跳槽率升高等等。人都是希望被尊重的,技術(shù)人員更看重這一點(diǎn),而很多公司也口口聲聲說(shuō)自己多么多么以人為本,可是采用的卻是以不信任人為前提的開(kāi)發(fā)方法,言行不一。我們說(shuō)敏捷方法的出發(fā)點(diǎn)是相互信任,做到這一點(diǎn)是很難的,但是一旦做到了,那這個(gè)團(tuán)隊(duì)就是非常具有競(jìng)爭(zhēng)力的。因此,這就產(chǎn)生了一個(gè)問(wèn)題,在沒(méi)有做到完全的相互信任之前,我們到底相不相信他人呢,這就是我提到的藝術(shù)性的問(wèn)題,什么時(shí)候你要相信人?什么時(shí)候你不相信人,這些都是需要權(quán)衡的問(wèn)題,也都是表現(xiàn)你藝術(shù)性的問(wèn)題。
敏捷代表著有效和靈活。我們稱(chēng)那些輕型的、有效的方法為敏捷方法。在重型方法中,我們?cè)谝恍┎槐匾⒅貜?fù)的中間環(huán)節(jié)上浪費(fèi)了太多的精力,而敏捷則避免了這種浪費(fèi)。我們的文章將會(huì)重點(diǎn)的討論敏捷(Agile)方法論的思想,敏捷這個(gè)名字的前身就是輕型。目前已經(jīng)有了一個(gè)敏捷聯(lián)盟,他們制定了敏捷宣言:
而我對(duì)敏捷的理解包括了幾個(gè)方面:
敏捷其實(shí)也有輕重之分,關(guān)鍵在于是否能夠做到有效和靈活。因此,敏捷方法論提倡的一個(gè)思想是"剛好夠(barely sufficient)"。不過(guò)這個(gè)"剛好夠"可不是那么容易判斷的。一支8個(gè)人的團(tuán)隊(duì)采用XP方法,隨著方法的熟練使用,團(tuán)隊(duì)的能力在不斷的增強(qiáng),能夠處理的問(wèn)題越越來(lái)越復(fù)雜,也許他們能夠處理采用重型方法的20個(gè)人團(tuán)隊(duì)能夠處理的問(wèn)題??墒侨绻麍F(tuán)隊(duì)的人數(shù)突然增加到12人,這支團(tuán)隊(duì)肯定就會(huì)出問(wèn)題,他的表現(xiàn)可能還不如那支20個(gè)人的團(tuán)隊(duì)了。人數(shù)增加了的時(shí)候,原先的方法肯定還做適當(dāng)?shù)恼{(diào)整,比如說(shuō),在原先的敏捷方法上增加一些重型方法的技巧。我們不能夠要求一支6個(gè)人的團(tuán)隊(duì)和一支20個(gè)人的團(tuán)隊(duì)用同樣的方法,前者可能采用輕一些的敏捷方法,后者可能采用重一些的敏捷方法,關(guān)鍵的問(wèn)題在于,兩支團(tuán)隊(duì)都把重點(diǎn)放在溝通、反饋、頻繁交付軟件這些關(guān)鍵的因素上,也就是做到有效和靈活。
架構(gòu)(Architecture)(也有被稱(chēng)為體系結(jié)構(gòu)的)是軟件設(shè)計(jì)中非常重要的一個(gè)環(huán)節(jié)。軟件開(kāi)發(fā)的過(guò)程中只要需求和架構(gòu)確定之后,這個(gè)軟件就基本上可以定型了。這就好比骨骼確定了,這個(gè)人的體形就不會(huì)有很大的變化。因此我選擇了架構(gòu)設(shè)計(jì)來(lái)討論敏捷軟件開(kāi)發(fā)(需求我已經(jīng)寫(xiě)過(guò)了)。我們?cè)谇懊嬗懻撨^(guò)超集和子集的概念,因此我們接下去要討論的架構(gòu)設(shè)計(jì)也是一個(gè)很小的子集。方法論如果沒(méi)有經(jīng)歷過(guò)多個(gè)項(xiàng)目的檢驗(yàn)是不能稱(chēng)為成功的方法論的,我也并不認(rèn)為我的架構(gòu)設(shè)計(jì)就是一個(gè)好的方法論,但引玉還需拋磚,他的主要目的是為了傳播一種思想。因此,我采用了模式語(yǔ)言(PLOP)做為寫(xiě)作架構(gòu)設(shè)計(jì)的形式,主要的原因就是模式是一種很好的組織思想的方法。 因此,在我們接下去的歷程中,我們集中討論的東西就圍繞著架構(gòu)、方法學(xué)、敏捷這三個(gè)要素展開(kāi)。這篇文章并不是討論如何編碼實(shí)現(xiàn)軟件架構(gòu)的,也不要單純的把它看作架構(gòu)設(shè)計(jì)的指南,其實(shí)文中的很多思想來(lái)自于方法論,因此提到的很多架構(gòu)設(shè)計(jì)的思想也適用于其它工作,如果能夠了解這一點(diǎn),看這篇文章的收獲可能會(huì)更多一些。
|
聯(lián)系客服