Linux正處于一個(gè)發(fā)展的瓶頸,期待打開(kāi)“應(yīng)用”的僵局。本文的三位作者記錄下了他們開(kāi)發(fā)銀行Linux前端系統(tǒng)的思考和體驗(yàn),非常具有借鑒價(jià)值。
2004年被稱為是Linux應(yīng)用推廣的開(kāi)端之年。剖開(kāi)歷史巨大的橫斷面,諸多的Linux應(yīng)用項(xiàng)目如繁星,開(kāi)始隱隱出現(xiàn)在巨大的蒼穹下。它們中的許多注定只是流星,劃過(guò)天際,轉(zhuǎn)眼消逝不見(jiàn)。但回溯歷史,又有多少看似細(xì)微末節(jié)的小事件,卻具有開(kāi)啟歷史巨變的因果機(jī)緣。
2004年年初,交通銀行中國(guó)香港分行和高陽(yáng)科技有限公司決定聯(lián)合開(kāi)發(fā)Linux前端系統(tǒng),歷時(shí)共8個(gè)月。這是國(guó)內(nèi)銀行業(yè)第一次在關(guān)鍵業(yè)務(wù)應(yīng)用中大規(guī)模使用Linux平臺(tái)。長(zhǎng)期以來(lái),大家對(duì)Linux是否適用于處理關(guān)鍵企業(yè)應(yīng)用一直存有疑慮,國(guó)外也少有先例。Linux正處于一個(gè)發(fā)展的瓶頸,只有打開(kāi)“應(yīng)用”這個(gè)僵局,Linux才會(huì)像奔流之水,浩浩蕩蕩,蔓延開(kāi)來(lái)。因此,這個(gè)項(xiàng)目具有很好的實(shí)驗(yàn)和示范效應(yīng)。結(jié)合開(kāi)發(fā)Linux前端系統(tǒng)的經(jīng)驗(yàn),我們將從架構(gòu)設(shè)計(jì)和技術(shù)手段兩個(gè)不同的角度來(lái)探討Linux應(yīng)用開(kāi)發(fā)所面臨的一些共性問(wèn)題和解決辦法。希望記錄的這一點(diǎn)感悟與體會(huì),不會(huì)被湮沒(méi)在漫漫歷史塵埃之中,而是為后來(lái)者貢獻(xiàn)一點(diǎn)微光,照亮他們繼續(xù)前行。
“可定制”前端VS“編程型”前端
銀行是信息化開(kāi)展最早的行業(yè),傳統(tǒng)的手工簿式記賬早已被電腦所取代。走進(jìn)任何一家銀行網(wǎng)點(diǎn),首先映入眼簾的,就是一排排電腦以及在電腦前忙碌的工作人員。這些部署在各營(yíng)業(yè)網(wǎng)點(diǎn)或部門的電腦系統(tǒng)就稱作銀行網(wǎng)點(diǎn)前端系統(tǒng),行內(nèi)的人習(xí)慣稱其為柜面系統(tǒng)。
前端系統(tǒng)完成的功能極其復(fù)雜,既包括對(duì)輸入和輸出的展示和控制,也包括外設(shè)驅(qū)動(dòng)、數(shù)據(jù)校驗(yàn)、通訊和代碼翻譯等功能、還需要實(shí)現(xiàn)諸如現(xiàn)金箱管理、交易沖正、對(duì)賬、報(bào)表打印、消息通知以及交易的復(fù)核、授權(quán)等業(yè)務(wù)功能。
Linux前端系統(tǒng)除了要滿足上述功能之外,還把目標(biāo)定位為一套“可定制”的前端系統(tǒng),這有別于國(guó)內(nèi)銀行普遍采用的所謂“編程型前端”。
所謂編程型前端是指每一個(gè)交易都需要寫一個(gè)前端程序。隨著銀行業(yè)務(wù)種類和業(yè)務(wù)復(fù)雜度的增加,這種前端系統(tǒng)的弊病就顯露無(wú)疑了——程序人員不得不花費(fèi)大量的時(shí)間來(lái)編寫數(shù)目龐大的前端程序,而且一旦業(yè)務(wù)變化或者要新增功能,又需要重新修改調(diào)試程序,從而影響了整個(gè)銀行電腦系統(tǒng)的穩(wěn)定性和靈活性。
“可定制”的前端系統(tǒng)是指使用者不需要編寫程序,利用前端系統(tǒng)的定制工具直接在電腦屏幕上設(shè)置輸入畫(huà)面和輸出格式,同時(shí)定義好流程,一個(gè)交易的前端部分就完成了。這種前端系統(tǒng)的優(yōu)點(diǎn)顯而易見(jiàn)—靈活、易于擴(kuò)展、維護(hù)方便。
上個(gè)世紀(jì)90年代后期,逐漸有公司開(kāi)始研發(fā)這種產(chǎn)品化的前端系統(tǒng),比較著名的有高陽(yáng)的IFS,藍(lán)天的OFP,以及韓國(guó)的Efinax和美國(guó)的S1 TELLER等系統(tǒng)。當(dāng)然這些系統(tǒng)都運(yùn)行在Windows或Unix平臺(tái)上,在Linux上開(kāi)發(fā)還沒(méi)有先例。
舊系統(tǒng):耶穌的十字架
企業(yè)應(yīng)用開(kāi)發(fā),遇到的第一個(gè)問(wèn)題就是如何實(shí)現(xiàn)與舊系統(tǒng)的兼容性。圣經(jīng)記載,耶穌罹難之時(shí),背上的十字架承載了過(guò)去一切的罪孽與苦難。同樣,舊系統(tǒng)也是任何新應(yīng)用項(xiàng)目不得不背負(fù)的沉重十字架。開(kāi)發(fā)企業(yè)應(yīng)用軟件不像平地起高樓,也不是在白紙上畫(huà)最新最美的圖畫(huà),而是像舊城改造:要在一大片老城區(qū)中推倒一小塊,重起新樓,但同時(shí)又要適應(yīng)原有的規(guī)劃布局,還要考慮道路的排列,地下管線的銜接。猶似建筑學(xué)上的最高境界,不僅要新穎獨(dú)特,還要講求和周圍環(huán)境和諧統(tǒng)一。
銀行前端系統(tǒng)只是龐大的銀行IT網(wǎng)絡(luò)中的神經(jīng)末梢,必須與數(shù)據(jù)中心的各后臺(tái)業(yè)務(wù)處理系統(tǒng)相配合,才能完成銀行業(yè)務(wù)流程的處理。因此,替換前端系統(tǒng)就如同替換多米諾骨牌中的一張,同時(shí)又要保證其他骨牌不能倒掉。
比較傳統(tǒng)和保險(xiǎn)的做法是移植加改造。即盡量保留原來(lái)的程序架構(gòu)不變,在這個(gè)基礎(chǔ)上增加新的功能或修改原來(lái)的處理邏輯。但對(duì)需要遷移到Linux平臺(tái)上的應(yīng)用系統(tǒng)而言,這種方法不太可行,主要原因在于平臺(tái)間的差異。相對(duì)于原來(lái)運(yùn)行在Unix上的系統(tǒng),Linux需要處理圖形化的界面;相對(duì)于在Windows或OS/2上運(yùn)行的系統(tǒng),Linux又是類Unix的內(nèi)核,在事件驅(qū)動(dòng)和消息處理等機(jī)制上完全不同。因此,開(kāi)發(fā)Linux前端系統(tǒng)只能另起爐灶,重新開(kāi)始。但如何能將變化僅僅局限在系統(tǒng)內(nèi)部,而不影響與其他業(yè)務(wù)系統(tǒng)的正確連接和整個(gè)IT架構(gòu)的穩(wěn)定呢?
方法一是采用快速原型法。先開(kāi)發(fā)出一個(gè)滿足接口要求的原型系統(tǒng),重點(diǎn)在接口模塊,系統(tǒng)內(nèi)部則只需要實(shí)現(xiàn)框架功能。在這個(gè)原型系統(tǒng)的基礎(chǔ)上不斷測(cè)試和調(diào)整,使其能實(shí)現(xiàn)原系統(tǒng)的所有接口功能,可以與其他舊系統(tǒng)無(wú)縫銜接。預(yù)先解決接口問(wèn)題后,就完全屏蔽掉了外部的影響,以后的設(shè)計(jì)就可以專注于系統(tǒng)的內(nèi)部結(jié)構(gòu)。
方法二是需要使用輔助工具進(jìn)行大量的自動(dòng)測(cè)試和驗(yàn)證。例如:港交行的業(yè)務(wù)系統(tǒng)共有34個(gè)子應(yīng)用,2000多個(gè)交易,如果手工調(diào)試和測(cè)試每一個(gè)交易和功能點(diǎn),工作量將會(huì)十分龐大。而且單靠人工,也無(wú)法進(jìn)行精確的比對(duì)來(lái)確定系統(tǒng)運(yùn)行的正確性。而通過(guò)我們開(kāi)發(fā)的一套調(diào)試工具和自動(dòng)測(cè)試工具,就可以自動(dòng)完成輸入數(shù)據(jù)的準(zhǔn)備,模擬交易流程,校驗(yàn)輸出結(jié)果等工作。
技術(shù)模式:向左轉(zhuǎn)還是向右轉(zhuǎn)?
Linux應(yīng)用開(kāi)發(fā)所面臨的第二個(gè)問(wèn)題通常是技術(shù)模式的選擇。站在技術(shù)的十字路口,道路向兩個(gè)方向延伸。一條路是采用瀏覽器模式(Browser/Server),另一條路是采用傳統(tǒng)的C/S (Client/Server) 客戶機(jī)模式,瀏覽器模式是如今比較流行和標(biāo)準(zhǔn)的架構(gòu),但C/S模式也有它的優(yōu)勢(shì),二者各有千秋,向左轉(zhuǎn)還是向右轉(zhuǎn)?其實(shí),正所謂水無(wú)常勢(shì),事無(wú)定規(guī),一切皆取決于具體的業(yè)務(wù)需求和特點(diǎn),不同的應(yīng)用需要采用不同的路線。銀行前端系統(tǒng)的特性決定了C/S之路更合適一些。
首先是前端系統(tǒng)對(duì)處理效率的要求高。瀏覽器模式走HTTP協(xié)議和使用Java,效率肯定比不上C++實(shí)現(xiàn)的C/S架構(gòu),而且C/S結(jié)構(gòu)可以充分利用Client的處理能力,在Client層就對(duì)數(shù)據(jù)進(jìn)行處理,不用全部提交到Server端,這樣可以減少Server的負(fù)載和功能,使Server端具有很好的伸縮性,可以不囿于地域和行政架構(gòu)的限制,部署在總分行到網(wǎng)點(diǎn)的任何一層,通訊模塊則可以根據(jù)實(shí)際需求靈活配置。
其次,C/S模式對(duì)外設(shè)的處理比瀏覽器方便和強(qiáng)大許多,瀏覽器對(duì)外設(shè)的控制能力很弱,且不方便操作,而前端系統(tǒng)則會(huì)頻繁使用打印機(jī)、密碼鍵盤等外設(shè)。同時(shí),采用C/S模式可以實(shí)現(xiàn)更靈活的處理,只需增加出口,就可以使前端系統(tǒng)更易于功能擴(kuò)展。
當(dāng)然,瀏覽器模式的一大好處是Client端不用維護(hù)。但只要有完善的自動(dòng)化的版本維護(hù)工具,C/S模式下也可以解決這個(gè)問(wèn)題。
積木和郵局
應(yīng)用開(kāi)發(fā)還必須解決的另一個(gè)大問(wèn)題是采用何種系統(tǒng)結(jié)構(gòu),也就是如何劃分系統(tǒng)的層次以及如何將程序模塊組織在一起。對(duì)于一個(gè)由成百上千個(gè)程序組成的龐大應(yīng)用系統(tǒng),如果設(shè)計(jì)不好,其內(nèi)部就會(huì)像蛛網(wǎng)一樣,錯(cuò)綜復(fù)雜,糾纏在一起,給系統(tǒng)的穩(wěn)定性帶來(lái)較大的隱患。
隨著面向?qū)ο笤O(shè)計(jì)方法的流行,利用類的封裝和繼承特性,可以方便地建立積木式的模塊結(jié)構(gòu),使各模塊間具有清晰和簡(jiǎn)單的邊界,并采用一致標(biāo)準(zhǔn)的外部接口。但要實(shí)現(xiàn)這種松耦合的組合方式,就必須有一個(gè)在模塊間負(fù)責(zé)傳遞消息的樞紐,也就是實(shí)現(xiàn)一個(gè)類似“郵局”的功能。在Windows平臺(tái)上,可以直接使用Windows的消息機(jī)制。但Linux本身則沒(méi)有提供一個(gè)統(tǒng)一的異步消息調(diào)度機(jī)制,必須由應(yīng)用實(shí)現(xiàn)該功能。因此,需要在應(yīng)用層建立一個(gè)調(diào)度器(Dispatcher)和消息隊(duì)列,其功能是實(shí)現(xiàn)一個(gè)抽象的“郵局”功能,根據(jù)各模塊傳來(lái)的消息類型和消息代碼,把消息轉(zhuǎn)發(fā)給相應(yīng)的模塊進(jìn)行處理。
利用這種組件化的設(shè)計(jì)不僅使系統(tǒng)具備靈活、可組裝的產(chǎn)品特性,而且有利于分組設(shè)計(jì)和編程。
同樣,那些與具體業(yè)務(wù)相關(guān)的功能和特殊需求也應(yīng)該與普通處理區(qū)分開(kāi)來(lái),放入獨(dú)立的程序模塊,通過(guò)動(dòng)態(tài)庫(kù)的形式掛接到系統(tǒng)中,從而保證核心的穩(wěn)定性和整個(gè)系統(tǒng)的可擴(kuò)展性。
雙刃Linux
解決好設(shè)計(jì)階段的幾個(gè)基本問(wèn)題之后,接下來(lái)就需要利用Linux的接口和環(huán)境開(kāi)發(fā)應(yīng)用程序。
Linux是一把雙刃劍。
“開(kāi)源”是Linux最鋒利的刀刃。 “開(kāi)源”使Linux能為大家所熟知和了解,在Linux上開(kāi)發(fā)應(yīng)用軟件可以充分利用操作系統(tǒng)的特點(diǎn)和優(yōu)勢(shì),避免各類軟件陷阱,使應(yīng)用軟件不僅在效率上,而且在穩(wěn)定性和安全性等許多方面都能夠得到進(jìn)一步提升。
同樣,由于Linux具有非常靈活的配置特性,可以把Linux操作系統(tǒng)和應(yīng)用軟件打包做在一起,進(jìn)行統(tǒng)一的版本升級(jí)、管理和維護(hù)。從而避免了由于操作系統(tǒng)和應(yīng)用軟件分離和不匹配而帶來(lái)的維護(hù)上的困難。
還有,Linux擁有最廣泛的硬件支持。利用這種特性,Linux前端系統(tǒng)實(shí)現(xiàn)了可以同時(shí)支持字符終端、普通PC和NC三種客戶機(jī)模式。
但是,Linux的刀刃也有傷及自身的時(shí)候。Linux根植于深厚的黑客文化土壤之中,開(kāi)源社區(qū)的黑客們習(xí)慣于單兵作戰(zhàn),而且喜歡從最底層開(kāi)始編碼,但企業(yè)級(jí)的應(yīng)用軟件卻需要大規(guī)模的協(xié)同開(kāi)發(fā),而且是盡量利用現(xiàn)有的函數(shù)庫(kù)和類庫(kù)來(lái)迅速構(gòu)建應(yīng)用。Windows之所以能占據(jù)99%以上的桌面系統(tǒng)市場(chǎng),VB、DELPHI這樣的快速開(kāi)發(fā)工具功不可沒(méi)。而Linux這十年來(lái)盡管贊譽(yù)很多,卻始終未能得到迅速的推廣和普及,其原因就是缺少像VB、DELPHI這樣的集開(kāi)發(fā)、調(diào)試、測(cè)試和管理于一體的IDE(集成開(kāi)發(fā)環(huán)境)工具。
因此,進(jìn)行Linux應(yīng)用開(kāi)發(fā)必須擯棄習(xí)慣的開(kāi)發(fā)方法,盡量選擇簡(jiǎn)單易用,并能實(shí)現(xiàn)協(xié)同工作的開(kāi)發(fā)工具。2003年Borland公司推出了基于Linux的IDE工具軟件Kylix。使用界面和類庫(kù)與DELPHI和C++ BUILDER基本兼容。Kylix秉承了BORLAND公司其他產(chǎn)品一致的特點(diǎn),簡(jiǎn)單、方便、快速,而且提供了強(qiáng)大的類庫(kù)支持。根據(jù)我們使用的經(jīng)驗(yàn),使用Kylix開(kāi)發(fā)應(yīng)用軟件比其他編程方法在效率上高兩倍以上,而且工程質(zhì)量也能得到大大提升。