討論:敏捷開發(fā)真的對架構(gòu)設(shè)計(jì)不利嗎?
目前有很多程序開發(fā)人員都認(rèn)為敏捷開發(fā)會幫助項(xiàng)目更快的完成,但是本次討論卻要從反方向來進(jìn)行探討。希望這些對大家有所幫助。
增量迭代開發(fā)(敏捷實(shí)踐之一,它意味著每次迭代的產(chǎn)出只是本次迭代范圍內(nèi)的需求)真的不利于產(chǎn)生好的設(shè)計(jì)嗎?Scrum真的提倡“忽視架構(gòu)問題”嗎?如果沒有敏捷技術(shù)實(shí)踐的話,架構(gòu)設(shè)計(jì)能有效的演化嗎?測試先行式的開發(fā)真會產(chǎn)生優(yōu)雅的設(shè)計(jì)嗎?在紅綠條提示下的重構(gòu)循環(huán)只在局部小范圍內(nèi)有效嗎?
來自Net Objectives的Alan Shalloway就利用Scrum構(gòu)建應(yīng)用的經(jīng)驗(yàn)向ScrumDevelopment yahoo group的成員提出一些問題,問題之一就是“他們是否找到代碼質(zhì)量是依靠什么來保證的?”
當(dāng)我在課程中或在那些討論“向已建系統(tǒng)中追加新特性”的會議中提出這個問題時(shí),每個人都認(rèn)為這屬于集成成本。我想,這是因?yàn)榇蠖鄶?shù)人不會編寫那些融入了很多設(shè)計(jì)模式的具有良好的擴(kuò)展性、足夠靈活并且易維護(hù)的代碼。這些人中,大部分也沒有使用過Scrum。
Shalloway隨后詳細(xì)解釋了他的觀點(diǎn):
……正如Scrum所告訴我們的,他們(指在Scrum團(tuán)隊(duì)中的開發(fā)者)根據(jù)客戶價(jià)值一次只開發(fā)系統(tǒng)的一小部分,如果團(tuán)隊(duì)中有高級架構(gòu)師的話,就會組織得更好。很多開發(fā)者有一種很好的意識,即他們會回頭看一下是否應(yīng)該做一些改動,使架構(gòu)更合理。但更多的人并不知道,假如代碼是通過拷貝、粘貼并修改(甚至改得面目全非)得來的,那么這會帶來很多冗余。此時(shí),Template Method可能是一個比較好的解決方案。
也許我悲觀了一些,但我的感覺是,假如你沒有注意熵的話,就意味著它們會達(dá)到你不期望的地步。在你的案例中,你正在使用Scrum來改善很多團(tuán)隊(duì)忽視的東西。所以,我的問題是:
大家忽視它了嗎?
如果真是這樣,它會引來問題嗎?
到目前為止,這些反應(yīng)都表明很多使用Scrum的團(tuán)隊(duì)有這個問題,甚至那些堅(jiān)持寫測試和進(jìn)行重構(gòu)的團(tuán)隊(duì)也有同樣的問題。那些沒有使用多少有些變化的敏捷技術(shù)實(shí)踐的團(tuán)隊(duì),可能會有更大的麻煩。(請記住:Scrum 與開發(fā)技術(shù)沒有必然的聯(lián)系,你可以使用傳統(tǒng)方法開發(fā)軟件,也可以用XP,或者其它技術(shù)實(shí)踐,只要你在Scrum的框架之內(nèi)使用就可以了)
接下來,讓我們討論一下現(xiàn)實(shí)中,Red-Green-Refactor loop是如何發(fā)揮作用的?一個團(tuán)隊(duì)在寫測試和重構(gòu)方面深有心得,就會有一個好的設(shè)計(jì)嗎?Paul Jones 的blog中有一篇關(guān)于TDD如何創(chuàng)建了混沌代碼(Ravioli Code),宣稱用TDD開發(fā)出來的代碼是低耦合的代碼:
我想,很多TDD和測試先行的理想主義者和宣傳者寫出了的確經(jīng)過充分測試的代碼,但還是很難理解。
Jones并不想撼動TDD,因?yàn)榕c其測試目的相比,TDD實(shí)際上更關(guān)注于設(shè)計(jì)。但這還是會帶來一個有趣的事情。在使用這些實(shí)踐的敏捷社區(qū)中,好在哪里呢?隨著社區(qū)的成長,這些實(shí)踐帶來的麻煩比其帶來的好處還多嗎?與傳統(tǒng)開發(fā)技術(shù)相比,這些工具被不正確的使用是否更危險(xiǎn)?
最后,讓我們假設(shè):我們正在恰當(dāng)?shù)厥褂肧crum和TDD。畢竟,象Ron Jeffries 在《We Tried Baseball and It Didn't Work》一文中所呈現(xiàn)的,我們不能因?yàn)樽约簺]有正確地使用它而將不好的結(jié)果強(qiáng)加給它。TDD會產(chǎn)生好的設(shè)計(jì)嗎?對于使用Red-Green-Refactor loop的做法,重構(gòu)可以說是一種局部優(yōu)化技術(shù)。我們優(yōu)化局部的設(shè)計(jì)。本質(zhì)上,這等同于steepest descent algorithm,也就意味著重構(gòu)幾乎總是會帶來次優(yōu)設(shè)計(jì),就象使用TDD來做“數(shù)獨(dú)游戲”一樣。
現(xiàn)在是我們用批判的眼光來重新審視我們的這些實(shí)踐的時(shí)候了嗎?
【編輯推薦】