设计演化与设计
轉(zhuǎn)載請(qǐng)保留作者信息:
作者:88250
Blog:http:/blog.csdn.net/DL88250
MSN & Gmail & QQ:DL88250@gmail.com
我認(rèn)為,要成為優(yōu)秀的軟件設(shè)計(jì)者,學(xué)習(xí)軟件設(shè)計(jì)的演化(尤其是設(shè)計(jì)演化)比學(xué)習(xí)軟件設(shè)計(jì)更為重要。只有從演化的過程中才能看清設(shè)計(jì)的本質(zhì)。
?
以往,我們只注重設(shè)計(jì),認(rèn)為設(shè)計(jì)是優(yōu)質(zhì)軟件制造的必要條件。但好的設(shè)計(jì)往往是依靠設(shè)計(jì)者多年從事此行的經(jīng)驗(yàn),特別是所謂的“大規(guī)模軟件”,此類軟件的設(shè)計(jì)過于依賴于經(jīng)驗(yàn),過于依賴于人的個(gè)體行為。這樣的依賴過于具體。
?
記得OO原則中有一條 Dependence Inversion:抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。如果把軟件設(shè)計(jì)比作是細(xì)節(jié),而設(shè)計(jì)演化比作是抽象的話,可以這樣理解:設(shè)計(jì)演化不應(yīng)當(dāng)依賴于涉及本身,設(shè)計(jì)本身應(yīng)該依賴于設(shè)計(jì)演化。為什么這么說呢?
?
總所周知,軟件設(shè)計(jì)的產(chǎn)出物是一系列的設(shè)計(jì)文檔,最終產(chǎn)物是源代碼,即軟件設(shè)計(jì)的產(chǎn)出物是源代碼。關(guān)于軟件設(shè)計(jì)到底是什么的討論一直沒有最權(quán)威的定義。但我一直堅(jiān)信“源代碼就是設(shè)計(jì)”的論斷(Jack W.Reeves 1992, 什么是軟件設(shè)計(jì)),設(shè)計(jì)過程中產(chǎn)生的文檔只能算是輔助文檔,它們根本不是設(shè)計(jì)。
?
假若你也同意以上觀點(diǎn),那么一些問題出現(xiàn)了,其中我認(rèn)為有一個(gè)問題是至關(guān)重要的:目前任何源代碼都是特定語言編寫的,代碼一旦編寫完畢,無論合理運(yùn)用了多少優(yōu)秀的模式,最后也是難于擴(kuò)展的和維護(hù)的。
?
設(shè)計(jì)是軟件過程的一部分,從宏觀設(shè)計(jì),即架構(gòu)設(shè)計(jì)層次上看,設(shè)計(jì)必須要選定技術(shù)方案。一點(diǎn)點(diǎn)很關(guān)鍵,但技術(shù)方案是相當(dāng)具體的,技術(shù)方案不只會(huì)對(duì)設(shè)計(jì)產(chǎn)生影響,也會(huì)對(duì)設(shè)計(jì)的演化產(chǎn)生巨大的影響。這樣的做法就是讓演化強(qiáng)烈依賴于設(shè)計(jì)了。
?
因此,我認(rèn)為正確的做法應(yīng)該是讓設(shè)計(jì)依賴于演化,也就是應(yīng)該重視軟件設(shè)計(jì)的演化過程,而不是重視設(shè)計(jì)。這一點(diǎn)就是 Kent Beck 所提到的“從迭代中演化架構(gòu)”,但這一觀點(diǎn)引起了太多的爭論。
?
前不久,作為架構(gòu)設(shè)計(jì)師與主程序員,我參與了一個(gè)詞典項(xiàng)目。這個(gè)項(xiàng)目提出了一種新穎的詞典服務(wù)方式,圍繞開放式、以用戶在線工作平臺(tái)為目標(biāo)而展開。在設(shè)計(jì)前期,我花了很多時(shí)間分析需求。而實(shí)際上,所有“需求”都是我假設(shè)出來的。客戶只說了要做一個(gè)這樣的創(chuàng)新項(xiàng)目。在與項(xiàng)目經(jīng)理商量后,我們決定以XP方式進(jìn)行項(xiàng)目。
?
開始時(shí),我們以用戶素材(User Story)的方式歸納了需求,排序了它們,并以Java作了實(shí)現(xiàn)。隨著迭代的進(jìn)行,代碼開始變多,集成開始稍微有些復(fù)雜了。最令人頭疼的問題是我們自己定義的需求時(shí)常被我們自己更改,甚至一些在迭代1中認(rèn)為是系統(tǒng)特性的需求,卻在迭代2的計(jì)劃中將它整個(gè)刪除!
?
為了適應(yīng)這樣的經(jīng)常性“手術(shù)”,我們不斷地重構(gòu)代碼,并逐漸形成了自己的可擴(kuò)展、類插件式的應(yīng)用框架,其核心是一系列的抽象工廠與一系列的抽象接口層次。后來,在查閱了關(guān)于Java的可擴(kuò)展應(yīng)用后,我突然想起
了eclipse!我們的應(yīng)用就是需要這樣一個(gè)類插件系統(tǒng),以方便擴(kuò)展新的特性。在翻閱了eclipse的底層框架——OSGi的規(guī)范與一些參考文檔后,我決定將我們的項(xiàng)目遷移到OSGi上來。
?
遷移過程是無痛的,因?yàn)槲覀兊a(chǎn)生的設(shè)計(jì)一直擁有低耦合、組件化的特征;遷移過程也是痛苦的,因?yàn)槲覀儝仐壛藥缀跛形覀冏约嚎蚣艿拇a。不過,這次演化是成功的,因?yàn)槲覀兊哪康倪_(dá)到了,系統(tǒng)在OSGi框架上運(yùn)行地很好!
?
我的經(jīng)驗(yàn)與Garmma(eclipse項(xiàng)目負(fù)責(zé)人)是比不了的。當(dāng)時(shí)eclipse2.x到eclipse3.0的時(shí)候不知道小了多少?zèng)Q心、做了多少時(shí)間與調(diào)研。的確,軟件演化同任何生物進(jìn)化一樣,其過程是痛苦的,但結(jié)果應(yīng)該是美好的!
?
舉上面的例子,我只想說明一個(gè)事實(shí):軟件設(shè)計(jì)演化遠(yuǎn)遠(yuǎn)比軟件設(shè)計(jì)本身重要。敏捷方法,尤其是XP,它能讓你感覺到什么是真正的軟件設(shè)計(jì)!
?轉(zhuǎn)載于:https://www.cnblogs.com/lanzhi/archive/2008/04/20/6470357.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
- 上一篇: 在 ASP.NET 使用 jQuery
- 下一篇: WSSv3 Technical Arti