模式影響之20年
本文首次發(fā)布在IEEE軟件雜志,由InfoQ和IEEE計(jì)算機(jī)社會(huì)為您呈現(xiàn)。
在軟件開發(fā)中,好的建議是可遇不可求的。通用設(shè)計(jì)原則可以指導(dǎo)我們,但現(xiàn)實(shí)總是逼著我們,在看起來相互沖突的目標(biāo)之間妥協(xié),比如,可擴(kuò)展性和可維護(hù)性與規(guī)模和復(fù)雜性。同樣的,現(xiàn)有代碼庫(kù)可以在很大程度上讓我們避免重復(fù)造輪子,但想要初級(jí)開發(fā)者輕松組合那些現(xiàn)有組件來做項(xiàng)目,依然不現(xiàn)實(shí)。
設(shè)計(jì)模式幫助我們縮小了這種差距:對(duì)特定情形下重復(fù)出現(xiàn)的問題,它記錄了不錯(cuò)的解決方案。設(shè)計(jì)模式討論影響方案設(shè)計(jì)的主要因素,而不提供現(xiàn)成復(fù)制粘貼的代碼片段。Web應(yīng)用的性能和安全就是這樣的例子:加解密算法增強(qiáng)了安全性,但引入了處理開銷。就如你兄長(zhǎng)教你如何做正確的事情一般,Ward Cunningham曾經(jīng)描述了最佳的設(shè)計(jì)模式。1
盡管模式很流行,但作為設(shè)計(jì)手法的影響,比作為特殊的軟件產(chǎn)品的影響更加難以定量描述。本文主要闡述了模式匯編會(huì)議20年后,可用模式的廣泛性和部分模式對(duì)開源軟件的影響深度。
模式起源
受建筑師和哲學(xué)家Christopher Alexander啟發(fā), 在1987年,Kent Beck和Ward Cunningham共同編寫了設(shè)計(jì)Smalltak窗口程序的小模式語言。1993年,Beck和Grady Booch發(fā)起的一次科羅拉多山區(qū)度假,發(fā)展成了非盈利性Hillside組織。而該組織通過一系列的PLoP(編程模式語言大會(huì)),推動(dòng)了模式匯編工作。PLoP已成功舉辦了20年,在這個(gè)過程中,誕生了很多成功的模式論文和書籍。
1994年,Erich Gamma和他的同事合著的《設(shè)計(jì)模式》一書,把模式的概念宣傳給更廣泛的人群;到目前為止,該書已經(jīng)以13種語言,賣出了50萬本。2兩年以后,F(xiàn)rank Buschmann和他的同事合著了《面向模式的軟件架構(gòu)》系列3第一卷;緊接著,Martin Fowler出版了他的《分析模式》。4(深入閱讀的資料可在別處獲取。5-9)“模式形式”的成功,甚至令一些作者和出版商無故給書的標(biāo)題上加上“模式”二字,我們覺得這是成功的代價(jià)。2013年的亞馬遜網(wǎng)站上,在計(jì)算機(jī)和技術(shù)類圖書中,搜索關(guān)鍵詞“模式”,結(jié)果產(chǎn)生了超過5500個(gè)不同的條目(包括少數(shù)不相關(guān)的視覺模式檢測(cè)條目)。
圍繞模式的早期炒作已經(jīng)塵埃落定,人們意識(shí)到,模式既不能代替設(shè)計(jì)技巧,也不能解決所有問題。盡管如此,根據(jù)實(shí)際經(jīng)驗(yàn)精心提煉的模式,能提供很有價(jià)值的相關(guān)建議。因?yàn)楝F(xiàn)做現(xiàn)學(xué),往往不是現(xiàn)實(shí)項(xiàng)目的可選項(xiàng),而模式提供了學(xué)習(xí)別人經(jīng)驗(yàn)的一種方式。
沒有模式疲勞的跡象
模式領(lǐng)域的普遍多樣性,使得有記載的模式的數(shù)目很難確定。Linda Rising的《模式年鑒2000》列出了超過1000種模式。10由Hillside組織贊助的PLoP大會(huì)已經(jīng)接受了超過1500篇模式論文。大會(huì)論文的提交率一直穩(wěn)定在每年100份左右。保守估計(jì)每篇論文4種模式,再加上所有的書籍和封面設(shè)計(jì),移動(dòng)應(yīng)用開發(fā),自適應(yīng)系統(tǒng),可持續(xù)架構(gòu),領(lǐng)域特定模式,元架構(gòu),工作流,容錯(cuò)系統(tǒng)和安全。
大多數(shù)人認(rèn)可的模式定義為:特定上下文中,某問題的成熟解決方案。在《建筑的永恒之道》中,Christopher Alexander闡明道:“簡(jiǎn)而言之,模式是,在同一時(shí)間,世界上發(fā)生的事物,創(chuàng)建這個(gè)事物的規(guī)則以及必須創(chuàng)建該事物的時(shí)刻。”11模式給出了可復(fù)用的解決方案,也提供了方案的好處和它的權(quán)衡,并封裝了成熟的最佳實(shí)踐的知識(shí)。
例如,很多集成體系架構(gòu)都使用Broker模式,它扮演客戶端和服務(wù)端中間人的角色,負(fù)責(zé)處理消息路由,包括序列化和反序列化消息內(nèi)容。2Web的通訊基礎(chǔ)架構(gòu)就實(shí)現(xiàn)了這種模式;類似YAWL的工作流引擎也包含了豐富的實(shí)現(xiàn)。12
很多模式只是模式庫(kù)的一部分,例如雅虎的UI庫(kù)和安全模式網(wǎng)站。很多公司,包括亞馬遜,谷歌,IBM,Lucent,微軟,甲骨文和西門子,都寫有相似的模式集合,它們中的部分可從書籍或網(wǎng)站獲取。IBM的電子商務(wù)分類編目模式就是模式集合的一個(gè)例子,除許多其他重復(fù)設(shè)計(jì)外,WebSphere產(chǎn)品系中的ESB(企業(yè)服務(wù)總線)實(shí)現(xiàn)還以它為特色。13基于彼此構(gòu)建的、相互關(guān)聯(lián)的模式的集合可形成模式語言,它能支撐具有生產(chǎn)力的,領(lǐng)域特定的開發(fā)過程。14甚至還有一個(gè)編寫模式的模式語言。15
企業(yè)集成模式
模式在軟件架構(gòu)和設(shè)計(jì)上的成功,激勵(lì)了人們嘗試把它們更緊密的集成到編程工具中以提高生產(chǎn)力,更緊密的整合進(jìn)設(shè)計(jì)和實(shí)現(xiàn)的思維方式中。不幸的是,大部分嘗試都失敗了,因?yàn)槟J皆局皇侨祟愔g記錄和傳遞知識(shí)的媒介,不是一個(gè)編程結(jié)構(gòu)。盡管如此,有些模式語言確實(shí)直接影響了軟件方案的建立過程。
大約在2003年,ESB這個(gè)術(shù)語,由于描述SOA(面向服務(wù)的體系結(jié)構(gòu))集成平臺(tái)獲得了人們的關(guān)注。ESB產(chǎn)品在不同服務(wù)之間路由、過濾和轉(zhuǎn)換XML消息;它們代表的是實(shí)現(xiàn)Broker模式的傳統(tǒng)企業(yè)應(yīng)用集成產(chǎn)品的演變。諷刺的是,盡管ESB產(chǎn)品的目標(biāo)是整合不同的企業(yè)應(yīng)用,但是缺乏描述這種方案設(shè)計(jì)的共同詞匯。
圖1 Apache Camel核心代碼隨時(shí)間增長(zhǎng)情況。Java代碼庫(kù)的線性增長(zhǎng)意味著穩(wěn)定的提交者社區(qū)和可持續(xù)的發(fā)展。JavaScript的代碼量在2009年跳躍式增長(zhǎng)之后,開始放緩;同樣的情況也發(fā)生在JavaScript類庫(kù)和框架的可用性上。
開源ESB實(shí)現(xiàn)的開發(fā)者們想要填補(bǔ)這種空缺,但很快就發(fā)現(xiàn),EIP(企業(yè)集成模式)提供了從集成風(fēng)格到消息路由和轉(zhuǎn)換的、條理清楚的65個(gè)模式詞匯7。而這些詞匯能夠描述大部分有意義的ESB解決方案。因此,在缺乏ESB工業(yè)標(biāo)準(zhǔn)的情形下,開源項(xiàng)目把EIP詞匯作為了事實(shí)上的標(biāo)準(zhǔn)。
開源ESB產(chǎn)品
在2005年,隨著開源ESB產(chǎn)品的出現(xiàn),幾乎有一打的開源ESB產(chǎn)品,已經(jīng)在它們的產(chǎn)品級(jí)領(lǐng)域特定語言或編程模型中,嵌入了EIP語言。最廣泛使用的例子有Mule,Apache Camel,WSO2 ESB,Spring Integration和OpenESB。
開源項(xiàng)目的性質(zhì)使得跟蹤它的代碼量相對(duì)容易很多。但是,跟蹤市場(chǎng)占有率卻相對(duì)比較困難,因?yàn)殇N售數(shù)據(jù)并不存在,下載次數(shù)也被鏡像站點(diǎn)、緩存或者自動(dòng)下載所扭曲。13Apache Camel包含大約89萬行代碼,由62個(gè)提交者,6年時(shí)間,18000次個(gè)人提交所創(chuàng)建。Java代碼庫(kù)一直呈現(xiàn)驚人的線性增長(zhǎng)(圖1),這意味著穩(wěn)定的提交者群體始終如一的參與。在開源核心部分的商業(yè)版本(如Red Hat版,Talend版)中,添加的設(shè)計(jì)或運(yùn)行時(shí)管理工具也顯著的擴(kuò)大了代碼庫(kù)。
Apache Camel由Maven Central提供的下載量平均每月大概25000次,2013年7月達(dá)到峰值,超過30000次。這個(gè)數(shù)字高于YAWL,它的下載量在2010年大約每月1000次。13Mule報(bào)告說,在它的官方站點(diǎn)有360萬次下載,但并不能說明這都是由個(gè)人用戶發(fā)起的下載。
社區(qū)參與給開源的成功提供了另外一個(gè)深刻的度量。Apache Camel在2007年首次發(fā)布后,它的社區(qū)發(fā)帖量呈直線上升,穩(wěn)定在每月大概2500貼。這表明它是一個(gè)協(xié)作解決問題和促進(jìn)產(chǎn)品演變的健康社區(qū)。與此相比,Mule社區(qū)首頁(yè)顯示,它擁有15萬成員,但論壇發(fā)帖總量卻只有26600。
作為設(shè)計(jì)工具的模式
融入產(chǎn)品的EIP詞匯流行開來之后,有些ESB項(xiàng)目更進(jìn)一步,在他們的設(shè)計(jì)工具中,采用EIP模式骨架作為其中的可視語言。例如,在Redhat Fuse集成開發(fā)環(huán)境或Mule Studio中,開發(fā)者可以使用EIP圖標(biāo)語言。跟以前不同,對(duì)異步消息解決方案的簡(jiǎn)單管道過濾器架構(gòu)風(fēng)格,努力“可視化編程”的嘗試,使這種可視化模式組合顯得很自然。圖2顯示了可視化的Camel路由:它通過消息路由器,把傳入的消息轉(zhuǎn)發(fā)給兩個(gè)可能的消息端點(diǎn)之一。現(xiàn)在,ESB開發(fā)者可以使用EIP詞匯來思考、設(shè)計(jì)、交流和實(shí)現(xiàn)他們的解決方案。
圖2 在Redhat Fuse集成開發(fā)環(huán)境中,使用EIP7中可視化模式語言創(chuàng)建消息解決方案。消息從基于文件的消息端點(diǎn)發(fā)出;在基于內(nèi)容的路由器中,根據(jù)消息內(nèi)容所指明的城市,轉(zhuǎn)發(fā)給兩個(gè)消息端點(diǎn)之一。基于內(nèi)容的路由器模式,描述了一種可復(fù)用設(shè)計(jì):根據(jù)消息內(nèi)容,把消息路由給正確的接受者。
圖3 玩印有EIP的撲克。可視化模式語言允許交互式的、近乎好玩的模式用法。每張牌上都印有模式圖標(biāo)、名稱和解決方案。
在首屆CamelOne大會(huì)上贈(zèng)送的EIP撲克牌(圖3),可能是迄今為止最有創(chuàng)意的模式改編了。每張牌上都印有模式語言中的一個(gè)模式和方案陳述。很高興能看到,為增進(jìn)人們交流和合作而創(chuàng)建的設(shè)計(jì)模式,能以這種平易近人的、有用方式來到架構(gòu)師和工程師的手中。
我們以上介紹的統(tǒng)計(jì)數(shù)據(jù)表明,在過去的20年里,模式語言對(duì)軟件設(shè)計(jì)社區(qū)有著廣泛的影響。然而,很多模式研究的問題都還沒有答案。例如,好的模式并不總是那么容易找到,它需要做更多的工作,去組織和分類大量現(xiàn)有模式。我們還設(shè)想,也許使用語義維基技術(shù),模式語言能夠制作工具。最終,以模式為中心的設(shè)計(jì)工具,能保證比單純的組件和連接器的畫圖工具,對(duì)軟件工程師更有吸引力。
模式社區(qū)會(huì)失去動(dòng)力嗎?我們不這樣認(rèn)為:現(xiàn)存的模式語言,就像EIP一樣,將會(huì)繼續(xù)被實(shí)現(xiàn)為領(lǐng)域特定語言。而沒有發(fā)現(xiàn)模式的領(lǐng)域還依然存在。例如,應(yīng)用之間(通過技術(shù)協(xié)議)和人類之間(如通過社交網(wǎng)絡(luò))的典型會(huì)話,都應(yīng)能以模式的形式予以保存。模式的未來是光明的,我們誠(chéng)邀您來塑造它,不管是通過促進(jìn)模式工具的開發(fā),還是以模式的形式,書寫和分享您的設(shè)計(jì)智慧。
參考
1. W. Cunningham, “Tips for Editing Patterns,” Dec. 2002.
2. E. Gamma et al., Design Patterns, AddisonWesley Professional, 1994.
3. F. Buschmann et al., PatternOriented Software Architecture, Volume 1: A System of Patterns, John Wiley & Sons, 1996.
4. M. Fowler, Analysis Patterns: Reusable Object Models, AddisonWesley Professional, 1996.
5. J. Kerievsky, Refactoring to Patterns, AddisonWesley Professional, 2004.
6. M. Fowler, Patterns of Enterprise Application Architecture, AddisonWesley Professional, 2002.
7. G. Hohpe and B. Woolf, Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions, AddisonWesley Professional, 2004.
8. E. Evans, Domain Driven Design: Tackling Complexity in the Heart of Software, AddisonWesley Professional, 2003.
9. V. Vernon, Implementing DomainDriven Design, AddisonWesley Professional, 2013.
10. L. Rising, The Pattern Almanac 2000, AddisonWesley, 2000.
11. C. Alexander, The Timeless Way of Building, Oxford Univ. Press, 1979.
12. M. Adams, A.H.M. ter Hofstede, and M. La Rosa, “Open Source Software for Workflow Management: The Case of YAWL,” IEEE Software, vol. 28, no. 3, 2011, pp. 16–19.
13. M. Keen et al, Patterns: Implementing an SOA Using an Enterprise Service Bus, IBM, 2004.
14. F. Buschmann, K. Henney, and D. Schmidt, “Past, Present, and Future Trends in Software Patterns,” IEEE Software, vol. 24, no. 4, 2007, pp. 31–37.
15. G. Meszaros and J. Doble, A Pattern Language for Pattern Writing, Hillside Group.
關(guān)于作者
Gregor Hohpe是Allianz SE的首席企業(yè)家構(gòu)師和Hillside組織的成員。郵箱:info@enterpriseintegrationpatterns.com。
Rebecca WirfsBrock是WirfsBrock Associates的主席和Hillside組織的財(cái)務(wù)主管。郵箱:rebecca@wirfsbrock.com。
Joseph W. Yoder是The Refactory公司和Hillside組織主席。郵箱:joe@refactory.com。
Olaf Zimmermann教授是位于Rapperswil的Eastern Switzerland大學(xué)應(yīng)用科學(xué)系Institute forSoftware機(jī)構(gòu)的研究合作伙伴。郵箱:ozimmerm@hsr.ch。
本文首次發(fā)布在IEEE軟件雜志。IEEE軟件的任務(wù)是創(chuàng)建領(lǐng)先和未來的軟件從業(yè)人員社區(qū)。該雜志提供準(zhǔn)確、實(shí)用、前沿的軟件開發(fā)信息,以確保工程師和管理人員掌握快速變化的技術(shù)。
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自Let'sCoding.cn
本文鏈接地址: 模式影響之20年
posted on 2014-05-03 04:28 Rolandz 閱讀(1177) 評(píng)論(3) 編輯 收藏