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