快速適應需求變化的軟件復用
板橋里人 http://www.jdon.com 2006/06/06
軟件復用本質是為了快速適應不斷變化的需求(adapt to changing needs ),兩者目標是一致的,但是當我們過于注重軟件復用(如組件復用component reuse又譯構件復用)時,千萬需要牢記:快速適應不斷變化的需求是根本目的,它的重要性要重于組件復用技術本身。本文試圖闡述兩者概念比較以及時下流 行的組件復用技術概要。
適應需求變化
現如今是一個計劃趕不上變化的時代,企業競爭力逐漸表現在企業適應變化能力的競爭,誰能更快適應市場的變化,誰就能夠在競爭中勝出,這種快速適應能力如果靠“人民戰爭”無疑是不現實的,軟件可以幫助我們來適應這種快速變化。
談到這里,稍微再說明一下國人軟件教育的誤區,不錯,軟件曾經是科學計算的工具,因此,我們非常注重軟件的算法和數據結構,甚至將之作為數學的衍生物, 但是,現如今已經成為一種幫助我們快速響應變化的有力工具,如果我們的教育背景中只有算法和數據結構,能夠編制出應付快速變化的軟件嗎?很顯然,他們是風 馬牛不相及,由此可見國人軟件概念和軟件教育的落后性,在這樣的軟件認識背景下,固然設計模式的崇高位置得不到確立,軟件設計被拋棄在腦后,編制出的大多 數企業軟件系統根本不具備應付變化的能力,程序員拒絕頻繁更改程序,甚至借助技術原因阻擾軟件的頻繁更改,這種軟件程序員和軟件用戶之間的矛盾可以稱為 miscommunication, miscommunication是導致軟件系統的失敗一個重要原因。
國內早就有著名言論:“不上ERP等死;上了ERP找死”,如果你的企業不上ERP,那么你的企業就不能借助軟件應付快速的市場等環境變化,那么必然會 被淘汰;但是,如果上了一個不注重“適應需求變化”的ERP軟件系統,那就是企業被僵化的ERP軟件框死,喪失了使用ERP的根本目的。
適應需求變化則成為現代軟件系統一個孜孜不倦的追求目標,那么如何實現呢?
原則 :給予人們可以裁剪他們系統的能力應適應需求變化,建立一個適應需求變化的系統,允許系統在一系列小的、可控制的步驟上進行改變。
組件誕生
將不變的通用的東西抽象出來,以達到在不同項目中重用復用,將我們有限的精力集中在項目具體變化和特點上。當然這些抽象復用的東西之間彼此必須是松耦合,這樣才能根據需求挑選組合。
讓我們先回顧一下軟件的發展史,軟件開發的發展史實際是一部我們思維不斷抽象拔高的發展過程,這種抽象概念非常類似于建模的思考方式:概要貼切地描述事物,忽視次要的細節。抽象體現在軟件開發上就是每個具體項目需要完成的代碼行數量越來越少。
從1970到1980這段時間,軟件開發從機器語言到匯編語言。進而發展到高級語言,甚至一些CASE工具,面向功能編程發展到面向對象編程,功能模塊重用細化到類的重用,類的重用是最初是通過設計模式實現的。
進入90年代中期,誕生了基于組件的開發模式(CBD:component based development),CBD將抽象概念帶往了一個新的方向,與減少代碼數量相反,CBD將功能各個方面細化分離到不同的、相互隔離層中,如表現層、 業務邏輯層、持久層、安全層以及核心層等,并且可以管理這些組件之間的依賴關系,通過這種分離,我們可以提純細化組件功能,進而產生可以重用的框架,如 Struts框架可以重用在大部分應用系統的表現層中,,Struts+JdonFramework+Hibernate是一個框架組合,代表一種架構設 計,這種架構設計其實可以重用在大部分應用系統,這種重用我稱之為架構級別重用。
組件復用
軟件組件(Software components)是軟件提供業務或技術功能的基本單元或元素,這些單元可以獨立地被部署、他們可以自我管理并且被虛擬部署到網絡的任何地方,業務組 件((Business components)執行業務邏輯、遵循一定的業務規則并且管理相應的數據(數據庫操作稱為manage corporate data);而技術組件(Technical components)則提供相應的平臺以便業務組件可以依賴其上運行,例如權限、組件管理等。
JdonFramework/Spring都屬于一種技術組件框架,而我們具體項目的業務層代碼如果能夠提煉可以復用,則是業務組件; JdonFramework/Spring則都提供了業務組件賴于運行的一些核心底層機制,特別是組件的管理,如組件的創建、組件的獲得、組件的資源管 理、組件的消亡等生命周期支持,所以,我們可以在JdonFramework/Spring中加入自己的業務組件,當然,JdonFramework還提 供了Session等狀態管理的支持功能,為業務組件提供了更廣闊的生命周期支持。
組件復用 技術以前是停留在編譯前期,也就是說:我們在編程時,導入所需要的其他組件Jar包,然后混同我們的項目編譯部署,但是這需要通過專業技術人員實現,很顯 然是不能適應原則中第一句:給予人們可以裁剪他們系統的能力應適應需求變化,這里的“人們”應該是指軟件最終用戶,應該給予用戶自己改變系統的能力,也就 是說:需要提供軟件系統運行時能夠動態改變自身的能力。
組件復用技術以前停留在軟件編譯階段,現在則更靠前,必須在軟件運行階段,當然對技術要求相當高,需要語言支持RTTI(簡單又神秘的Class.forName發揮作用了),這在"Evolution, Architecture, and Metamorphosis"一文中被認為是Metamorphosis,現在由于AOP技術出現,AOP有一種動態Weaving技術,實際就是在軟件運行時實現動態攔截,這樣給予終端用戶更大的改變系統能力,他們基本可以以動態插拔的概念實現多個組件的組合運行。在"AOP vs Decorator"一文中,我把編譯階段的組件組合方式(我更愿意稱為靜態組合)和運行時組合等兩種處理方式,合并稱為過濾器模式,如果你希望采取組件可插拔式的復用,就可以使用過濾器模式。
組件可插拔更換
為什么說組件的可插拔非常重要?
組件重用目的是為了更好地適應需求變化,但是有了組件重用不代表就快速適應需求變化,因為組件本身也會產生設計錯誤(提煉得不夠抽象或者組件很難以替 代),這就必然導致軟件系統得維護成本提高,那么快速適應需求變化的目標也就成為一紙空文。實踐證明:組件設計問題已經成為導致軟件開發失敗的一個主要因 素。
組件設計有兩個主要風險:組件提純的純度和組件的替代方式。提煉的純度也就是抽象的高度,組件的抽象程度越高,當然可重用范圍越廣,但是往往我們只有經歷多個項目后,才發現自己的組件提煉還欠火候,這實際是組件的提煉過程成本。
組件提練雖然取決于人為設計因素,但是在實現手段上也依賴于組件的替換方式,通過經常反復頻繁的微調和更換,才能將組件不斷提煉向理想狀態靠攏,所以, 必須有一種方便的組件替換方式提供頻繁更換支持,我們總不希望更換組件象以前更換汽車發動機火花塞一樣,需要拆開汽車,打開發動機那樣麻煩吧?
參考PC電腦硬件設計:更新CPU或內存條,只要直接插拔就可以,這些部件和母版都是一種松散的、可插拔的關系,如果軟件組件替換是動態的可插拔更加方 便終端用戶在軟件系統交付后,根據需求改變他們的系統。組件可插拔本質上是這些組件必須是最大化的松耦合,彼此依賴影響非常小,換句話說:如果實現了可插 拔更換,說明你的組件已經實現松耦合了。
那就有可能設計一種軟件框架:它能夠為每個部件提供非常棒的服務訪問,軟件組件是 松耦合'loosely coupled',這些組件的大部分通過幾行代碼就可以實現替換。目前這種方便的實現方式是使用XML進行組件的配置。
JdonFramework/Spring都是這樣的一種框架,JdonFramework更進步的是:JF框架本身的組件也是可以替換的,例如你希望 在JF中使用Spring的配置文件,那么你只要做一個Spring配置文件的解析組件,然后替換JF框架原來的XML解析器就可以了。無論 EJB2/EJB3等在這方面要稍遜于Ioc/AOP框架,對于支持EJB3的JBoss 4 這樣架構,需要動態更換AOP攔截器還不是很方便,因為JBoss 4本身組件沒有象JF那樣做到可插拔配置,不過,JBoss 5已經開始走上這條路,使用一個微核心來管理所有的可插拔組件,我曾經在"JBoss 5迎來中間件徹底的可配置時代"一文中提出組件是否方便替換是衡量一個組件框架的重要指標。
在最近的TheServerSide文章'Service Access' to the software components中,主要是談論了表現層組件的替換訪問方式,GIF這樣圖片組件不可以隨意控制調整,基本不能復用,但是通過SVG或XUI等支持XML組件動態替換技術的使用,則可以實現顯示圖形組件的復用。
SOA
在軟件運行時,給予用戶動態插拔式更換組件,達到復用的組件更加適合變化的需求,
這是軟件業追求的目標,而SOA(Service Oriented Architecture)則是從另外一種方向
也是在運行時提供用戶一種改變系統的能力。
SCBA(Services and Components Based Architecture), SCBA是通過減少需求變化帶來的傳遞損耗和時間來實現的,當需求變化時,SOA的服務將支持跟進變化和替換。
SCBA更強調的是一種業務過程重用,而且是跨組織跨多個專業域范圍的,例如我以前說的四色圖實際是對跨域范圍的業務總結,特別是ERP域范圍,大多數 企業系統都是由MI等四種原始模型組成的,例如JiveJdon3看上去只是一個論壇系統,實際不只是,它的Message模型可以重用在網站內容系統、 新聞發布系統、電子商務系統、倉庫管理系統、資源管理系統等跨域范圍中(部分已經實現)。
既 然業務過程和IT系統可以跨組織跨域重用,那么類似軟件系統的維護和開發就不必再重新開發,JiveJdon3的Message模型重用在新聞發布系統 中,我需要把JiveJdon3的項目拷貝到新聞發布系統中,然后再針對新聞發布系統特點做些裁剪修改,這這種復制業會帶來工作量和維護量,而SCBA則 可以解決這個問題,通過運行時single-copy reuse分享各種服務功能。
更多SOA重用可參考“Service Component White Paper”一文。
總結
本文總結了軟件復用的不同層次:設計復用、組件架構復用以及業務模型復用,復用技術 的不斷發展正是由于適應變化需求的要求不斷提高導致,本人從2002年開始從事復用技術研究,最初從復用層次底層設計模式開始,在國內媒體第一次全面分析了GoF設計模式(其中個別模式當時被天極網轉載), 經過這幾年發展,親身體會復用技術已經進入了一個新的階段。特寫此文作為小結。