|
人們總是偏愛(ài)“大詞”。一個(gè)表達(dá)方式,如果聽(tīng)起來(lái)足夠響亮,寫在紙上能夠吸引眼球,那就會(huì)變成很多人的新寵。但同樣是這些大詞,經(jīng)過(guò)太多人的傳遞、消費(fèi)之后,原本的含義反而像硬幣上的圖案一樣被磨損殆盡:幾乎沒(méi)有人知道這些說(shuō)法到底是指什么了。在IT業(yè)界,“平臺(tái)(platform)”、“框架(framework)”、“構(gòu)架(architecture)”等等就是這種人見(jiàn)人愛(ài)的大詞。幾乎每個(gè)廠商都愿意請(qǐng)來(lái)其中的一位、甚至多位為自己推銷。久而久之,這些說(shuō)法似乎適用于各個(gè)領(lǐng)域、各個(gè)層面:所有的軟件系統(tǒng)都是“平臺(tái)”,所有的開發(fā)者都在自矜于獨(dú)有的“框架”。原本有確切意義的“好詞”,經(jīng)過(guò)這一番爭(zhēng)奪和濫用,也只能衰減為所謂的“buzzwords”,供市場(chǎng)營(yíng)銷人士們玩味了。 我想讓這些詞中的一個(gè)——“框架”——蕩污滌垢,重現(xiàn)青春。要完成這樣的任務(wù),必須動(dòng)用重典才行。軟件業(yè)圣經(jīng)《設(shè)計(jì)模式》對(duì)框架有如下定義:“A framework is a set of cooperating classes that make up a reusable design for a specific class of software(一個(gè)框架,就是一組相互協(xié)作的類,對(duì)于特定的一類軟件,框架構(gòu)成了一種可重用的設(shè)計(jì))”。這個(gè)定義雖然主要著眼于面向?qū)ο蟮能浖_發(fā),但已經(jīng)基本上給出了這個(gè)詞的核心含義:框架是軟件系統(tǒng)的設(shè)計(jì)、開發(fā)過(guò)程中的一個(gè)概念,它強(qiáng)調(diào)對(duì)以完成的設(shè)計(jì)、代碼的重復(fù)使用,并且,一個(gè)框架主要適用于實(shí)現(xiàn)某一特定類型的軟件系統(tǒng)。 為了更好地說(shuō)明框架是什么,也許還應(yīng)該看看框架不是什么。 框架不是現(xiàn)成可用的應(yīng)用系統(tǒng)。它仍是一個(gè)半成品,等待后來(lái)者做“二次開發(fā)”,實(shí)現(xiàn)為具體的應(yīng)用系統(tǒng)。 框架不是“平臺(tái)”。后者的概念更加浮泛和模糊——人們說(shuō)的一個(gè)平臺(tái),可以是一種操作系統(tǒng),一種應(yīng)用服務(wù)器,一種數(shù)據(jù)庫(kù)軟件,一種通信中間件等等,因此“平臺(tái)”幾乎成了所有系統(tǒng)軟件的統(tǒng)稱。在平臺(tái)的大家族中,框架的概念可能與近來(lái)人們常說(shuō)的“應(yīng)用平臺(tái)”最為接近,但平臺(tái)主要指提供特定服務(wù)的系統(tǒng)軟件,而框架則更側(cè)重于設(shè)計(jì)、開發(fā)過(guò)程,或者可以說(shuō),框架通過(guò)調(diào)用平臺(tái)提供的服務(wù)而起作用。 框架不是工具包(toolkit)/類庫(kù)(library) /API。目前流行的很多框架中,就包括了大量的類庫(kù)和API,但是調(diào)用API并不就是在使用框架開發(fā)。僅僅使用API時(shí),開發(fā)者完成系統(tǒng)的主體部分,并不時(shí)地調(diào)用類庫(kù)實(shí)現(xiàn)特定任務(wù)。而框架構(gòu)成了通用的、具有一般性的系統(tǒng)主體部分,“二次開發(fā)者”只是像做填空題一樣,根據(jù)具體業(yè)務(wù),完成特定應(yīng)用系統(tǒng)中與眾不同特殊的部分。 那么,在企業(yè)應(yīng)用系統(tǒng)開發(fā)中,框架具有什么樣的意義?要闡明這一點(diǎn),大概要看一看在這個(gè)領(lǐng)域里軟件開發(fā)方式的演變。在計(jì)算機(jī)應(yīng)用普及之前,只有少數(shù)大企業(yè)才負(fù)擔(dān)得起企業(yè)信息系統(tǒng)軟件,這一類的軟件開發(fā)也已委托定制(custom-made software)為主。在企業(yè)信息化基礎(chǔ)設(shè)施逐步完備之后,多數(shù)中、小企業(yè)也要在預(yù)算不高的前提下實(shí)施企業(yè)應(yīng)用系統(tǒng),按照以前的方式逐個(gè)定制開發(fā),是這種類型的企業(yè)難以承受的。因此,對(duì)于一些需求簡(jiǎn)明的系統(tǒng),往往會(huì)購(gòu)買現(xiàn)成軟件(shrink-wrapped software)解決問(wèn)題。但是各個(gè)企業(yè)具體業(yè)務(wù)不同,需求很難統(tǒng)一,現(xiàn)成軟件只能滿足最通用的情況和最一致的操作(比如財(cái)會(huì)系統(tǒng)、網(wǎng)站內(nèi)容發(fā)布系統(tǒng)等),對(duì)于頭緒眾多的業(yè)務(wù)處理就難以勝任了。 如何最大程度地萃取不同企業(yè)應(yīng)用系統(tǒng)的共性,重復(fù)使用已經(jīng)完成的設(shè)計(jì)和代碼,對(duì)企業(yè)應(yīng)用系統(tǒng)中典型場(chǎng)景給出最佳解決方案——這是一個(gè)“一般性”的問(wèn)題;如何讓一個(gè)早先完成的軟件產(chǎn)品貼切地適應(yīng)極為多變、復(fù)雜的企業(yè)需求——這是一個(gè)“特殊性”的問(wèn)題。作為對(duì)這一組沖突的一種解決方案,不少?gòu)S商推出了自己的企業(yè)應(yīng)用框架。這些框架往往是從大量的委托項(xiàng)目開發(fā)中精選出的系統(tǒng)“不變項(xiàng)”,因此具有很強(qiáng)的普適性和實(shí)用性。 目前,主流企業(yè)應(yīng)用框架中大都包含對(duì)以下問(wèn)題的現(xiàn)成解決方案: * 持久性(persistence):實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、處理,數(shù)據(jù)與對(duì)象映射,數(shù)據(jù)緩存(caching)。 以上諸方面中,除了前四項(xiàng)目前主要由應(yīng)用服務(wù)器解決之外,其他的部分本身都是專門的軟件開發(fā)領(lǐng)域。框架的作用,在于確定上述每種因素的具體技術(shù)實(shí)現(xiàn),并規(guī)定它們?cè)谙到y(tǒng)中的組織方式和協(xié)作方式,從而給出完整的企業(yè)應(yīng)用解決方案。 企業(yè)應(yīng)用框架的特點(diǎn)首先是,當(dāng)應(yīng)用框架確定之后,系統(tǒng)的整個(gè)構(gòu)架,也就是主體結(jié)構(gòu)就已經(jīng)固定。因此框架的選取往往是方案選型的首要問(wèn)題。 其次,人們常常聽(tīng)信“組件式開發(fā)”的一面之詞,認(rèn)為系統(tǒng)搭建的過(guò)程類似于搭積木,好像是用膠水代碼(glue code)拼合現(xiàn)成的組件或模塊。其實(shí)采用框架開發(fā)時(shí),系統(tǒng)的構(gòu)建過(guò)程更類似于填空——系統(tǒng)骨架早已完成,開發(fā)者填寫特定的代碼,由系統(tǒng)來(lái)調(diào)用?!对O(shè)計(jì)模式》中提到的“好萊塢原則(the Hollywood principle——Don‘t call us, we‘ll call you)”,非常符合我們談的這種情況。很多框架還允許下游廠商開發(fā)系統(tǒng)插件(plug-ins),以滿足特定需要——這是另一種形式的“填空”。 另外,對(duì)于實(shí)現(xiàn)具體應(yīng)用系統(tǒng)的二次開發(fā)者來(lái)說(shuō),不少任務(wù)都無(wú)需通過(guò)編程實(shí)現(xiàn)。比如要給一個(gè)業(yè)務(wù)模型增添一個(gè)新字段,或是要設(shè)置一種新的工作流程,這些工作都可以通過(guò)簡(jiǎn)單的圖形用戶界面(GUI)操作,或是修改部署描述符(DD),或是編寫腳本來(lái)完成。也就是說(shuō),相當(dāng)多(而不是全部)的開發(fā)任務(wù)是通過(guò)聲明/配置的(declarative),而不是編程的(programmatic)的方式實(shí)現(xiàn)的。系統(tǒng)往往會(huì)在啟動(dòng)或運(yùn)行時(shí)載入相關(guān)的配置,據(jù)此實(shí)現(xiàn)特定的功能。 企業(yè)應(yīng)用框架是菜場(chǎng)里的半成品。當(dāng)我們面對(duì)要么自己下廚、要么去飯館吃飯的選擇時(shí),我們往往會(huì)采取這種省時(shí)省力的折衷方案。但是選擇之所以為選擇,就因?yàn)槠渲锌隙ò瑢?duì)收益和代價(jià)的權(quán)衡,都隱含著復(fù)雜的利弊關(guān)系(pros and cons)。下面我們也來(lái)檢討一下企業(yè)應(yīng)用框架的情況: Pros: * 縮短開發(fā)周期 毫無(wú)疑問(wèn),采用框架的開發(fā),要比一切從頭做起快速、高效得多。通過(guò)一般化(generalization)和重用(reuse)機(jī)制,框架能最大限度地加快一個(gè)特定應(yīng)用系統(tǒng)的實(shí)現(xiàn)。 * 客戶化 如上所述,基于框架的系統(tǒng)有很多功能通過(guò)配置而不是編程實(shí)現(xiàn),這樣也給用戶帶來(lái)了一定便利。比如,企業(yè)內(nèi)部的IT人員經(jīng)過(guò)一定培訓(xùn),就能夠自己完成一種新的工作流程的設(shè)置。這對(duì)于不斷變化的業(yè)務(wù)需求是一個(gè)很理想的解決方案。 * 不重新發(fā)明輪子 框架對(duì)于大量典型場(chǎng)景給出了最優(yōu)的實(shí)踐。在具體開發(fā)時(shí),與其無(wú)視前人的成果,重新構(gòu)思答案,不如套用這些成熟、穩(wěn)定的做法。這不僅能加快開發(fā)進(jìn)度,更能夠提升系統(tǒng)的質(zhì)量和健壯性。 * 可維護(hù)性/知識(shí)共享 完全通過(guò)委托開發(fā)完成的系統(tǒng)很難由其他廠商維護(hù)??蚣芡嵌鄠€(gè)企業(yè)、大量開發(fā)者實(shí)踐的成果,因此能在一定程度上打破上述壁壘,增進(jìn)系統(tǒng)的可維護(hù)性。當(dāng)框架使用者形成社區(qū)之后,還能實(shí)現(xiàn)更高層次上的知識(shí)共享。 Cons: * 太多 半成品總有其代價(jià)。超市配好的一包菜里,老是又我們用不到的調(diào)料——但是我們卻不得不為之付費(fèi)。同樣,為了達(dá)到一般性和普適性,框架總比緊湊、貼切的特定應(yīng)用多出不少內(nèi)容。二次開發(fā)完成后,企業(yè)獲得的只是一種特定的實(shí)現(xiàn),卻要為所有的客戶化可能性付費(fèi),為所有用不上的功能付費(fèi)。這是一個(gè)相當(dāng)讓人尷尬的事實(shí)。 * 太少 框架總是一種限制。就像半成品菜限制了我們的烹調(diào)方法,框架也限制了我們實(shí)際應(yīng)用的可能性。當(dāng)框架本身設(shè)計(jì)的足夠普適時(shí),我們不太會(huì)感到類似的限制。但是,情況往往正好相反——面對(duì)一個(gè)足夠特殊的需求,二次開發(fā)者總有一種沖破框架的渴望。最后的解決辦法,往往是狡計(jì)、妥協(xié)和框架補(bǔ)丁的結(jié)合體。 * 效率 上面說(shuō)過(guò),基于框架的系統(tǒng)中,具體功能經(jīng)常是通過(guò)配置實(shí)現(xiàn)的。與硬編碼(hard-coded)的方式相比較,這雖然能提供很大的靈活性,但也往往犧牲了運(yùn)行時(shí)的效率。 * 鎖定 一個(gè)采用特定框架的系統(tǒng)幾乎肯定被鎖定在這個(gè)廠商的產(chǎn)品上。換言之,框架意味著all or nothing式的態(tài)度,很難調(diào)和兩種不同的框架,各取所長(zhǎng),更難把應(yīng)用系統(tǒng)從一個(gè)框架遷移到另一個(gè)——這往往要求系統(tǒng)的全部改寫。 * 學(xué)習(xí)曲線 一種框架也就是一種方言。要精通特定框架的開發(fā),你要熟悉其中的所有的用法、思路和弱點(diǎn)。對(duì)于開發(fā)者,這也意味著比較陡峭的學(xué)習(xí)曲線。 上面談到的種種弊端,還屬于一般開發(fā)框架共有的缺陷。對(duì)于市面上流行的很多企業(yè)應(yīng)用框架來(lái)說(shuō),更大的問(wèn)題是框架產(chǎn)品自身的價(jià)格過(guò)高。我在別處也講過(guò),企業(yè)應(yīng)用系統(tǒng)項(xiàng)目往往不能靠運(yùn)行安裝程序,再作簡(jiǎn)單的設(shè)置就完成,而是一個(gè)復(fù)雜、漫長(zhǎng)、不斷嘗試/修改的過(guò)程,或者說(shuō),更近似于一種服務(wù)而不是簡(jiǎn)單的產(chǎn)品銷售。但是框架廠商的產(chǎn)品(或者說(shuō)是半成品)價(jià)格過(guò)高,經(jīng)常就蠶食了整個(gè)系統(tǒng)的大部分開發(fā)預(yù)算,使方案總價(jià)偏重于框架本身而不是后期開發(fā)。對(duì)于需求不甚符合原有框架,需要大量開發(fā)的項(xiàng)目,或是需求本身不夠清晰的項(xiàng)目,這都幾乎肯定會(huì)導(dǎo)致整個(gè)項(xiàng)目的失敗。 軟件工程宗師F. Brooks曾經(jīng)表述過(guò)這樣一個(gè)道理:沒(méi)有銀彈(No Silver Bullet/NSB)。那意思是說(shuō),沒(méi)有一種萬(wàn)應(yīng)藥能夠戲劇性地提升軟件開發(fā)的效率和質(zhì)量。最近的很多輿論好像是專門和這個(gè)經(jīng)典論述抬杠,動(dòng)不動(dòng)就把一些特殊的解決方案奉為銀彈。對(duì)于企業(yè)應(yīng)用開發(fā)而言,基于框架的開發(fā)模式是多種選擇中的一種。在不少情況下,這種選擇是不錯(cuò)的,但同時(shí)應(yīng)該留意隨之而來(lái)的風(fēng)險(xiǎn),更不該以為,選定了框架就一定能保證項(xiàng)目成功。 很多企業(yè)應(yīng)用項(xiàng)目的難點(diǎn),在于客戶自身缺乏規(guī)范的企業(yè)管理制度和合格的計(jì)算機(jī)應(yīng)用水平。客戶不具備成型的業(yè)務(wù)流程,也無(wú)法明晰表達(dá)需求,不知道怎樣的應(yīng)用形式對(duì)自身業(yè)務(wù)更合理:這種需求不清、或是需求劇烈變更的困境是困擾大量企業(yè)應(yīng)用開發(fā)項(xiàng)目的癥結(jié)。簡(jiǎn)言之,企業(yè)應(yīng)用項(xiàng)目的成敗經(jīng)常是“業(yè)務(wù)”、“技術(shù)”、“管理”三種因素共同作用的結(jié)果,而單純引入框架,只能解決部分“技術(shù)問(wèn)題”。如果過(guò)于樂(lè)觀地估計(jì)框架在其中的作用,甚至認(rèn)為它能解決任何項(xiàng)目的任何問(wèn)題,這對(duì)于本領(lǐng)域的各個(gè)環(huán)節(jié)(廠商、項(xiàng)目開發(fā)商、企業(yè)客戶)都只能起到消極作用。 我個(gè)人的建議是:在搭建企業(yè)應(yīng)用系統(tǒng)時(shí),針對(duì)應(yīng)用情況不同、預(yù)算/時(shí)限不同、對(duì)系統(tǒng)指標(biāo)要求不同,有多種替代方案可以從中選擇。當(dāng)需求明確、固定,又有現(xiàn)成產(chǎn)品完全滿足需要時(shí),或者當(dāng)企業(yè)想要以極低預(yù)算消除某個(gè)業(yè)務(wù)瓶頸時(shí),應(yīng)該優(yōu)先考慮現(xiàn)成產(chǎn)品;在需求明確、固定,但很難被現(xiàn)成產(chǎn)品完全覆蓋時(shí),可以選擇應(yīng)用框架,并由合格開發(fā)商完成實(shí)施;在需求不夠明確,或者預(yù)感到需求會(huì)發(fā)生劇烈變更時(shí),采用開發(fā)源碼的應(yīng)用框架,從而避免高昂的初期投資,并“軟化”框架帶來(lái)的種種限制,是另一種可供選擇的思路。還是那個(gè)比方,一頓飯?jiān)趺闯?,究竟是下館子、買半成品或者全由自己動(dòng)手,還要視具體情形而定——我也希望,每個(gè)企業(yè)都能吃上可口順心的應(yīng)用大餐。 |
|
|