在前面已經(jīng)提到,在開發(fā)CRM應(yīng)用系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)時一定要以客戶信息為核心,一方面是為企業(yè)提供一個良好的易于操作的用戶界面,另一方面是提高開發(fā)的可控性,減少開發(fā)成本與風(fēng)險。以客戶信息為核心,所有的模塊的內(nèi)容都是圍繞客戶,這樣也使得應(yīng)用系統(tǒng)的可拓展性大為提高,維護(hù)性加強(qiáng)。對于開發(fā)人員,尤其是系統(tǒng)分析員,所有的功能內(nèi)容對于他來說都是一種“插件”,各個模塊功能之間的耦合性大為降低,很顯然會使整個的開發(fā)過程更加易于控制。
在各個模塊的具體開發(fā)實施中,銷售模塊是基礎(chǔ),他負(fù)責(zé)管理賬戶、機(jī)會等信息,并且經(jīng)過銷售人員的銷售活動的信息支持,對于客戶的信息(如需、購買行為等)的補(bǔ)充,就可以實時的給與市場人員以信息支持,從而隨時把握銷售策略,便于及時調(diào)整。從某種意義上講,應(yīng)該說銷售管理、服務(wù)管理、呼叫中心以及電子商務(wù)這四個模塊都是作為市場模塊的信息支持,同時反過來,市場管理策略也給與其余企業(yè)活動以策略支持。要實現(xiàn)這一點(diǎn),就必須在數(shù)據(jù)結(jié)構(gòu)地設(shè)計上以客戶信息為核心數(shù)據(jù)。
CRM應(yīng)用系統(tǒng)各個模塊之間的關(guān)系在企業(yè)業(yè)務(wù)上關(guān)系非常緊密,但是作為一個非常龐大和復(fù)雜的系統(tǒng),我們不能按照一般傳統(tǒng)的軟件工程觀念,在各個模塊之間通過接口通信,這樣會帶來應(yīng)用系統(tǒng)在開發(fā)、擴(kuò)充以及維護(hù)方面等很多的問題。正確合理的方案是將客戶視做一個對象,將客戶資源作為操作的核心。
CRM應(yīng)用系統(tǒng)各模塊的技術(shù)要求
基于客戶對于CRM應(yīng)用系統(tǒng)的實際需求以及考慮到系統(tǒng)的未來拓展性、可維護(hù)性,CRM應(yīng)用系統(tǒng)各個模塊中除了呼叫中心可以做成客戶/服務(wù)器(C/S)體系模式之外,其他模塊都應(yīng)該做成瘦客戶端(瀏覽器)/服務(wù)器(B/S)模式。經(jīng)過了反復(fù)的論證并且通過與別的技術(shù)方式的比較,我們最終確定采用在J2EE平臺上開發(fā)CRM應(yīng)用系統(tǒng)的技術(shù)方案。一方面是因為作為一種比較成熟的技術(shù)規(guī)范,相對于微軟的.NET來說,它的開發(fā)要更加安全、成本更低,另一方面,我從很久就一直跟蹤分布式開發(fā)的技術(shù),對于J2EE的開發(fā)非常熟悉。(當(dāng)時還沒有相關(guān)的中文版書籍)。因此,比較了幾種開發(fā)平臺之后,我們決定采用J2EE。在這種開發(fā)平臺上,我們將業(yè)務(wù)邏輯抽象出來,寫成組件,然后將其發(fā)布到服務(wù)器上,再通過前臺程序的開發(fā)程序員開發(fā)前臺界面,調(diào)用后臺的商務(wù)邏輯。
市場管理、銷售管理、服務(wù)管理之所以采用分布式的開發(fā),一方面是滿足業(yè)務(wù)人員的辦公需要,可以不受地域的限制,隨時隨地地辦公,另一方面也是為了降低開發(fā)的成本與維護(hù)成本。因為我們看到,在呼叫中心模塊中有銷售管理、服務(wù)管理等內(nèi)容,同時電子商務(wù)模塊中又有其余模塊的商務(wù)邏輯,我們將其抽象出來,一是組件復(fù)用,二是減少開發(fā)工作量同時減少風(fēng)險。
二、J2EE
J2EE概述
任何一個有經(jīng)驗的Java平臺開發(fā)人員,都會知道這個平臺具有非常強(qiáng)大的功能和非常高的綜合程度,并且發(fā)展非常迅速。Java平臺的許多應(yīng)用程序接口(API)為各種應(yīng)用程序設(shè)計和系統(tǒng)級別程序設(shè)計提供了豐富的功能。J2EE是一種技術(shù)規(guī)范,他給開發(fā)人員提供了一種工作平臺,它定義了整個標(biāo)準(zhǔn)的應(yīng)用開發(fā)體系結(jié)構(gòu)和一個部署環(huán)境,在這個體系結(jié)構(gòu)中,應(yīng)用開發(fā)者的注意力集中在封裝商業(yè)邏輯和商業(yè)規(guī)則上,一切與基礎(chǔ)結(jié)構(gòu)服務(wù)相關(guān)的問題以及底層分配問題都由應(yīng)用程序容器或者服務(wù)器來處理。甚至,從屬于事務(wù)、持久化、安全等等方面的應(yīng)用組件的運(yùn)行時屬性都可以使用高度靈活的聲明方法在部署環(huán)境中定制(一般采用XML)。這個平臺提供了一個簡化的開發(fā)模型,它具有工業(yè)強(qiáng)度的可拓展性,支持合理的集成和靈活的部署,與開發(fā)商和應(yīng)用服務(wù)器無關(guān)。
J2EE組成部分
對于開發(fā)人員來說,J2EE平臺提供給他們的就是三種,Jsp、Servlet、EJB這三種開發(fā)方式。
Jsp
Jsp其實是一種高層的Servlet。他與以往的其他網(wǎng)頁編寫腳本有很大的相似性,但是只是在執(zhí)行時有一些不同。Jsp引擎將它和它所在的HTML文件一起合成Servlet的代碼,然后它的執(zhí)行就和Servlet的一樣了:先編譯成.class文件,然后由支持java虛擬機(jī)的服務(wù)器來執(zhí)行,然后輸出結(jié)果。
我們在使用Jsp中可以使用JavaBean來進(jìn)行更加靈活的處理。
Servlet
Servlet可以被看作是服務(wù)器端的applet,它通過ServletResponse以及ServletRequest這兩個對象來輸出和接收用戶傳遞的參數(shù),然后在內(nèi)部的方法中執(zhí)行操作,如訪問數(shù)據(jù)庫、訪問別的Servlet方法、調(diào)用EJB等等,然后將處理結(jié)果返回給客戶端?梢酝ㄟ^集成化的開發(fā)工具來進(jìn)行開發(fā)。在一般的工具中都已經(jīng)構(gòu)建好一個框架,程序員只需要熟悉html標(biāo)簽以及熟悉一般的java語言就可以進(jìn)行開發(fā)了。
EJB
EJB如果除去它的語言特點(diǎn)外,我想對于大多數(shù)有比較豐富編程經(jīng)驗的開發(fā)人員來說應(yīng)該可以輕松理解,他非常類似于微軟的DCOM。他有一個自己要存活要活動的一個容器,為了可以讓客戶進(jìn)行透明調(diào)用,而不必關(guān)心位置,他還必須有一個本地和遠(yuǎn)程接口,同時還應(yīng)該有一個相關(guān)的配置文件,以便告訴容器她要怎樣的活法。對于開發(fā)人員來說,如果采用一種集成化的開發(fā)工具,如JBuilder,就可以大大減少工作量。在JBuilder中通過配置相關(guān)的服務(wù)器路徑、容器信息,我們可以通過它的模板來完成一個EJB組件的開發(fā)以及分發(fā),非常方便也非常簡單。
在開發(fā)過程中,建議的開發(fā)方式是在會話bean內(nèi)部調(diào)用實體bean,因為實體bean沒有狀態(tài)但是對數(shù)據(jù)庫的親和,而會話bean中有我們?yōu)榱丝刂瞥绦蚨枰纳舷挛男畔,因此,我們可以結(jié)合這兩種bean的所有優(yōu)點(diǎn),來比較輕松的進(jìn)行開發(fā)。比如在會話bean中用實體bean進(jìn)行數(shù)據(jù)庫的訪問同時會話bean用來保存客戶的上下文信息。
J2EE各組成部分在開發(fā)CRM應(yīng)用系統(tǒng)中的腳色
我們已經(jīng)提到過,開發(fā)一個健壯的、可拓展的CRM應(yīng)用系統(tǒng)中的各個模塊,除了呼叫中心外我們都將采用瀏覽器/服務(wù)器模式。因此,下面的模式是除了呼叫中心模塊之外的方式:
瀏覽器----〉Jsp腳本文件----調(diào)用----〉Servlet---調(diào)用---〉EJB----訪問數(shù)據(jù)庫----〉處理返回。
其中Jsp屬于前臺開發(fā)人員進(jìn)行的開發(fā)內(nèi)容,也就是提供給客戶的用戶界面,要求是美觀,使用性強(qiáng),便于操作;
Servlet、EJB為后臺開發(fā)人員開發(fā)的具有可以重用性的包含商務(wù)邏輯的組件,也就是說,他們主要是進(jìn)行企業(yè)的商務(wù)邏輯的處理。要求是開發(fā)的程序一定要健壯,充分注意到業(yè)務(wù)邏輯的獨(dú)立性與組合性。
在開發(fā)CRM系統(tǒng)時,前面已經(jīng)說過,系統(tǒng)分析員自身對于J2EE技術(shù)的把握深度,對于CRM系統(tǒng)業(yè)務(wù)的理解程度將極大的決定了系統(tǒng)的成功與否。就是在做系統(tǒng)分析時一定要做到將功能完全細(xì)化到Servlet、EJB組件所封裝的商務(wù)邏輯中去,并且要反復(fù)論證其合理性與獨(dú)立性。
J2EE各技術(shù)實現(xiàn)CRM應(yīng)用系統(tǒng)的特點(diǎn)
Jsp相對來說比較簡單,但是在開發(fā)過程中系統(tǒng)分析員一定要注意盡可能少地將商務(wù)邏輯放到Jsp文件中,有幾個原因,一是Jsp文件本身的可維護(hù)性比較差,尤其是如果不采用的方式的開發(fā),將會極大的增加開發(fā)與維護(hù)成本。因此,在前臺的Jsp開發(fā)中首先要劃分出版面,然后將版面分割成不同的部分,用不同的被包含文件來最終組成用戶界面。另外要注意的一點(diǎn)是某些與程序邏輯實現(xiàn)無關(guān)的動態(tài)內(nèi)容最好放在數(shù)據(jù)庫中,而不要放在文件中。所以在開發(fā)前臺的Jsp文件時系統(tǒng)分析員要注意下面的幾個問題:
1)劃分版面的界面邏輯,用包含文件的方式給程序員確定開發(fā)代碼;
2)盡量不將商務(wù)邏輯放在Jsp文件中,所有的業(yè)務(wù)處理都要調(diào)用后臺的組件;
3)當(dāng)涉及到的界面邏輯較多的時候,要給程序員設(shè)計JavaBean來進(jìn)行處理,而不是在Jsp文件中直接嵌入java代碼,否則會造成Jsp文件的可讀性非常差,維護(hù)與調(diào)試異常困難。
Servlet作為在服務(wù)器后臺進(jìn)行處理的組件,除了業(yè)務(wù)上商務(wù)邏輯要獨(dú)立、完整、可組合的、準(zhǔn)確等的要求外,還有一個很重要的要求:就是線程安全性。顯然,我們都知道Servlet相比通用網(wǎng)關(guān)接口CGI有著明顯的優(yōu)點(diǎn)就是可以維護(hù)一個線程池,不用每一次都要創(chuàng)建一個新的線程,但是可能很多程序員都會意識不到一個經(jīng)常會遇到的問題:實例變量在所有的線程之間是共享的,并且如果存在著Servlet鏈互調(diào)時,就會發(fā)生數(shù)據(jù)錯誤。因此系統(tǒng)分析員一定要鼓勵程序員多注意利用Java提供的方法(如聲明自己的類實現(xiàn)了Runnable接口或者采用同步synchronized技術(shù)等)解決線程的問題,另外還要注意的是數(shù)據(jù)庫的連接問題,因為如果頻繁的訪問數(shù)據(jù)庫會造成數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān)同時使客戶端的回饋速度變慢,因此要注意利用預(yù)先分配連接并在釋放以后能夠回收的連接池。所以,在開發(fā)Servlet也要注意下面的3個問題:
1)鼓勵程序員關(guān)注線程安全問題(如采用聲明自己的類實現(xiàn)了Runnable接口或者采用同步synchronized技術(shù)等解決線程的問題);
2)數(shù)據(jù)庫的訪問要充分利用JDBC技術(shù)的預(yù)先分配連接并在釋放以后能夠回收的連接池;
3)鼓勵系統(tǒng)分析員將商務(wù)邏輯劃分成單個的獨(dú)立的可通用的可重用的商務(wù)邏輯組件,在實際的程序中通過Servlet鏈來完成某項商務(wù)邏輯。
EJB實際上單就程序的寫作方面要比Servlet簡單的多,它使程序員只需要關(guān)心要實現(xiàn)的是甚麼就可以了,而不必關(guān)心事務(wù)的處理,底層的操作等等問題。但是也還是有一些編程方面的要求:
1)最好能夠在程序中將所有的static字段都聲明為final型的,這樣可以保證多個實例出現(xiàn)時語義的不一致問題;
2)注意線程問題,同Servlet;
3)不使用文件系統(tǒng)。EJB組件可以通過環(huán)境命名上下文用一種標(biāo)準(zhǔn)的方法進(jìn)行環(huán)境實體查詢,基本上是不用文件系統(tǒng)。
4)禁用socket來進(jìn)行監(jiān)聽和接收連接,或者用其進(jìn)行多路發(fā)送。
5)不可能用awt函數(shù)來完成鍵盤的輸入和輸出,如果有的話,應(yīng)該是向控制臺輸出控制信息,因為組件是用來在服務(wù)器端完成某一項商務(wù)邏輯的。
三、技術(shù)層面控制J2EE平臺架構(gòu)開發(fā)CRM的過程
在J2EE平臺上開發(fā)CRM應(yīng)用系統(tǒng),是一個非常優(yōu)秀的方案,一方面J2EE是一項比較成熟的技術(shù)規(guī)范,各大IT服務(wù)器、中間件廠商也都大力推崇并支持,盡管微軟大力推出.NET,但是畢竟.NET是一項新的技術(shù)規(guī)范,如果在其上進(jìn)行開發(fā)的話,風(fēng)險顯然要大得多,而J2EE目前卻正是在走向成熟。
正像任何事情一樣,在先進(jìn)的J2EE平臺上開發(fā)CRM應(yīng)用系統(tǒng)必須要有一個良好的實施過程,在這個過程當(dāng)中,有一個非常重要的腳色:系統(tǒng)分析員。系統(tǒng)分析員自身對于J2EE技術(shù)的掌握深度、對RM應(yīng)用系統(tǒng)的業(yè)務(wù)理解程度很大得影響了開發(fā)的過程,甚至可以毫不夸張的說,系統(tǒng)分析員自身的素質(zhì)決定了開發(fā)的成功與否,這是一個非常關(guān)鍵的因素。 首先是系統(tǒng)分析員對于客戶的需求的理解程度,只有深入的理解了客戶的需求,才能夠?qū)⑸虅?wù)邏輯很好的劃分;其次是系統(tǒng)分析員的思維是否嚴(yán)密,是否嚴(yán)謹(jǐn),是否具有很強(qiáng)的邏輯思維能力,因為這涉及到將商務(wù)邏輯進(jìn)一步細(xì)化成獨(dú)立的可重用的業(yè)務(wù)邏輯與使用邏輯。第三是其是否對于J2EE技術(shù)有著非常深的掌握,這是實施CRM的另外一個重要之處,因為在整個的開發(fā)過程中,其實重心就在服務(wù)器端組件的開發(fā)上,一個系統(tǒng)能否穩(wěn)定,高效的運(yùn)行,很大程度上取決于開發(fā)技術(shù)上是否規(guī)范與合理,而系統(tǒng)分析員在實施編碼階段的主要職責(zé)就是負(fù)責(zé)檢查程序員的程序代碼。
在開發(fā)過程中另外一個注意的是開發(fā)人員的分工。在J2EE平臺上的開發(fā)與一般的軟件開發(fā)概念不同,它有著嚴(yán)格的分工:
1)系統(tǒng)分析員;
2)后臺組件開發(fā)程序員(主要是Servlet與EJB);
3)后臺服務(wù)器實施技術(shù)人員(主要負(fù)責(zé)組件的管理);
4)后臺組件測試人員;
5)前臺用戶界面程序員(主要是jsp程序員+美工);
6)前臺測試技術(shù)人員;
在實際的實施過程中,后臺服務(wù)器實施技術(shù)人員可以充當(dāng)后臺組件測試人員的腳色,同樣,前臺用戶界面程序員可以充當(dāng)前臺測試技術(shù)人員,因為他的頁面中所包含的邏輯比較少。
總結(jié)一下,關(guān)鍵的幾點(diǎn):
1、商務(wù)邏輯一定要劃分的非常合理,原則是一個組件中應(yīng)該只含有一種商務(wù)邏輯,一般的商務(wù)邏輯應(yīng)該是通過幾個組件的協(xié)同合作來實現(xiàn)的(如何劃分,如何組合就是看系統(tǒng)分析員的功底了。
2、分工一定要明確,除了上面所列出的腳色充當(dāng)之外,盡量避免前臺程序員與后臺程序員的腳色互換,否則很可能造成商務(wù)邏輯組件之間的耦合,而這是絕對不允許的,否則隨著開發(fā)過程的進(jìn)行,就會發(fā)現(xiàn)越來越難以控制應(yīng)用的開發(fā)。所以在開發(fā)過程中一定要注意組件的商務(wù)邏輯的獨(dú)立性與唯一性,系統(tǒng)分析員和項目負(fù)責(zé)人一定要嚴(yán)格把關(guān),這一點(diǎn)非常非常重要。
四、國內(nèi)CRM系統(tǒng)目前存在的問題以及采用J2EE技術(shù)進(jìn)行的解決方案
我們研究過國內(nèi)幾家CRM系統(tǒng),學(xué)習(xí)到很多的東西,但同時也發(fā)現(xiàn)一些問題,現(xiàn)在舉幾個例子:
- 大而全,但是各個功能做的太過于簡單,無法實用。
- 缺乏集成能力,無法將網(wǎng)頁、電郵、電話、傳真等集成。
- 沒有與客戶的互動渠道。
賽迪網(wǎng)技術(shù)社區(qū)