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