J2EE項(xiàng)目風(fēng)險(xiǎn)
一、概述
當(dāng)您開始著手一個(gè)企業(yè)級(jí)JAVA項(xiàng)目的時(shí)候,您必須對(duì)很多方面進(jìn)行權(quán)衡:供應(yīng)商關(guān)系,為保證完整性在設(shè)計(jì)和開發(fā)階段的過(guò)度設(shè)計(jì)。每個(gè)都會(huì)帶來(lái)與生俱來(lái)的的一些風(fēng)險(xiǎn),其中一些是非常明顯的,而其他則不怎么明顯。但是所有這些風(fēng)險(xiǎn)都是可以避免的。在Humphrey Sheil的這篇文章中,他分析了有可能對(duì)企業(yè)級(jí)JAVA項(xiàng)目的成功造成威脅的10個(gè)風(fēng)險(xiǎn),并且描述了避免方法。
在我當(dāng)程序員、高級(jí)程序員和系統(tǒng)構(gòu)架師的各個(gè)時(shí)期,我見(jiàn)證了許多企業(yè)級(jí)JAVA項(xiàng)目的喜怒哀樂(lè)!當(dāng)我思考到底是什么導(dǎo)致項(xiàng)目失敗或者成功的原因的時(shí)候,我發(fā)現(xiàn)很難找到一個(gè)完美的答案,因?yàn)闉樗械能浖?xiàng)目定義什么是成功是很難的。J2EE項(xiàng)目也不例外。而且,項(xiàng)目的成敗不是絕對(duì)的。在這篇文章中,我將展示影響企業(yè)級(jí)Java項(xiàng)目成敗的前10個(gè)風(fēng)險(xiǎn),并將他們展示給您。
一些風(fēng)險(xiǎn)會(huì)延遲項(xiàng)目的速度,一些則是錯(cuò)誤的岔路,另外一些則會(huì)使項(xiàng)目完全失敗!但是,只要有好的準(zhǔn)備、有關(guān)的知識(shí)儲(chǔ)備以及對(duì)其有一定了解的知道者,這都是可以避免的。
這篇文章的結(jié)構(gòu)很簡(jiǎn)單;我將對(duì)每個(gè)風(fēng)險(xiǎn)按照下面的格式講述:
風(fēng)險(xiǎn)名稱:描述風(fēng)險(xiǎn)的一行文字。
項(xiàng)目階段:風(fēng)險(xiǎn)發(fā)生的項(xiàng)目階段。
受影響的項(xiàng)目階段:在很多情況下,風(fēng)險(xiǎn)是影響項(xiàng)目的后邊階段的。
征兆:風(fēng)險(xiǎn)的相關(guān)征兆。
方案:如何避免這種風(fēng)險(xiǎn)以及將其對(duì)項(xiàng)目的影響降低到最小。
備注:我沒(méi)有在前邊條目中提到的但是必須要提醒的關(guān)于風(fēng)險(xiǎn)的一些東西。
我們將在企業(yè)級(jí)Java項(xiàng)目的重要的階段檢查每個(gè)風(fēng)險(xiǎn)。項(xiàng)目涉及到的階段有:
選擇服務(wù)提供商:在開始J2EE項(xiàng)目之前選擇最好的工具組合-從應(yīng)用服務(wù)器到什么品牌的咖啡。
設(shè)計(jì):嚴(yán)格的瀑布方法學(xué)模型和“編碼然后運(yùn)行”方法都依賴于設(shè)計(jì):我進(jìn)行足夠的設(shè)計(jì)然后就可以開始開發(fā)了。我對(duì)設(shè)計(jì)階段進(jìn)行全面思考以保證在開始開發(fā)之前我已經(jīng)思考了所有的問(wèn)題和解決方案。但是、我并不害怕在這個(gè)階段編碼,有時(shí)這是回答有關(guān)性能和模塊性問(wèn)題的唯一途徑。
開發(fā):在這個(gè)階段我們前期階段的工作的效果將會(huì)顯現(xiàn)出來(lái)。好的工具加上好的設(shè)計(jì)并不意味著開發(fā)階段會(huì)很順利,但是確實(shí)有幫助!
穩(wěn)定性負(fù)載測(cè)試:在這個(gè)階段,系統(tǒng)構(gòu)架師和項(xiàng)目經(jīng)理要將系統(tǒng)特性凍結(jié),開始關(guān)注于構(gòu)建質(zhì)量,并保證系統(tǒng)的重要參數(shù)指標(biāo)滿足要求-并發(fā)用戶數(shù),失敗次數(shù)等。但是,質(zhì)量和性能不能在前邊的階段被忽略。您不可能寫低質(zhì)量或運(yùn)行速度緩慢的代碼留到以后再去修正。
維護(hù):這其實(shí)并不是工程的一個(gè)階段,它只是一個(gè)時(shí)間段。這個(gè)階段都涉及到了準(zhǔn)備階段。前期的錯(cuò)誤(糟糕的設(shè)計(jì)以及開發(fā)階段對(duì)供應(yīng)商的錯(cuò)誤選擇)將會(huì)顯現(xiàn)出對(duì)你項(xiàng)目構(gòu)成威脅。
圖一顯示了項(xiàng)目各個(gè)階段的不同的風(fēng)險(xiǎn)(特別是對(duì)后期造成的風(fēng)險(xiǎn))
好了,先不管別的亂七八糟的東西了,咱們開始看一看10個(gè)最大的風(fēng)險(xiǎn)吧!
二 風(fēng)險(xiǎn)分析
(一)風(fēng)險(xiǎn)1:不懂Java、EJB或者J2EE。
我將逐條分析前面所說(shuō)的三個(gè)東西。
描述:不懂Java。
工程階段:開發(fā)。
受影響階段:設(shè)計(jì),穩(wěn)定階段,維護(hù)階段。
受影響的系統(tǒng)特性:可維護(hù)性、可量測(cè)性以及性能。
現(xiàn)象:寫JDK核心API已經(jīng)有的函數(shù)和類。
不知道下面所列的這些東西(下邊列出的只是一些例子而已):垃圾收集;什么時(shí)候?qū)嵗龝?huì)被垃圾收集――懸掛引用問(wèn)題;Java中的繼承機(jī)制(或者他們的折衷選擇);方法覆蓋和重載;為什么 java.lang.String(這里它替代了你喜歡用的類)會(huì)導(dǎo)致糟糕的性能;Java的引用傳遞(與EJB中的傳值相比較);使用==與實(shí)現(xiàn)equals() 方法這種非初級(jí)應(yīng)用相比較;Java在不同平臺(tái)上的不同的線程調(diào)度策略(例如空閑還是非空閑);綠色線程與本地線程的比較;熱點(diǎn)(為什么舊有的性能調(diào)節(jié)技術(shù)否定熱點(diǎn)優(yōu)化);JIT以及什么時(shí)候好用的JIT變得不好用(例如不安裝JAVA_COMPILER的時(shí)候您的代碼仍然完好的運(yùn)行等等);Collections API
RMI(遠(yuǎn)程方法調(diào)用)
解決方案:
您必須加深java的相關(guān)知識(shí),特別是關(guān)于它的強(qiáng)項(xiàng)和弱項(xiàng)。Java已經(jīng)超越了語(yǔ)言的范疇。理解它相當(dāng)于理解一個(gè)平臺(tái)(JDK和相關(guān)工具)。具體來(lái)說(shuō),如果您還沒(méi)有取得Java程序員認(rèn)證您必須去取得-您會(huì)驚訝的發(fā)現(xiàn)您還這么多不了解的。如果把這做為你項(xiàng)目組并且將它推行到每一個(gè)人就更好了,而且也更有趣。如果有可能的話家里一個(gè)郵件列表來(lái)討論Java技術(shù)并且保證它的活躍那就更好了。(我工作國(guó)的每個(gè)公司都有這樣的郵件列表,但是他們大部分由于沒(méi)有足夠的人氣而奄奄一息)。向你的開發(fā)同事學(xué)習(xí)――這就是最好的來(lái)源。
備注:
如果您或者您的開發(fā)團(tuán)隊(duì)成員不懂這門語(yǔ)言以及這個(gè)平臺(tái)的話,您能希望您的團(tuán)隊(duì)能開發(fā)出成功的企業(yè)級(jí)Java程序嗎?高級(jí)的Java程序員使用EJB和J2EE將會(huì)非常容易。相反,低級(jí)的或者是經(jīng)驗(yàn)不足的程序員則會(huì)將J2EE系統(tǒng)弄得質(zhì)量很差。
描述:不懂EJB
項(xiàng)目階段:設(shè)計(jì)
項(xiàng)目影響階段:開發(fā)、運(yùn)行
影響到的系統(tǒng)特性:可維護(hù)性
現(xiàn)象:EJB只被使用一次(特別是返回到等待池衷的無(wú)狀態(tài)會(huì)話Bean)
不可重用的EJB
不知道程序員要做什么,容器能提供什么。
不符合規(guī)范的EJB(使用線程,調(diào)用本地方法,嘗試訪問(wèn)IO等等)。
解決方案:
Description: Not understanding J2EE
為了增加您對(duì)EJB的知識(shí),請(qǐng)拿出一個(gè)周末的時(shí)間看一下EJB規(guī)范(1.1版有314頁(yè))。然后閱讀2.0規(guī)范以了解1.1規(guī)范沒(méi)提供了什么而2.0提供了什么。特別要注意告訴做為應(yīng)用程序開發(fā)者的您在EJB中怎樣做才是規(guī)范的做法的那些章節(jié)。
備注:
不要從供應(yīng)商的角度看EJB世界。你一定要了解EJB規(guī)范和特定容器的EJB實(shí)現(xiàn)之間的差別。這將有利于您在必要的時(shí)候?qū)㈤_發(fā)經(jīng)驗(yàn)用到其他供應(yīng)商(或其他版本)上去。
項(xiàng)目階段:設(shè)計(jì)
項(xiàng)目影響階段:開發(fā)
受到影響的系統(tǒng)階段:可維護(hù)性,可擴(kuò)展性,性能
現(xiàn)象:
一切都是EJB的設(shè)計(jì)。
使用手動(dòng)事務(wù)管理而不是使用容器提供的機(jī)制。
定制安全機(jī)制――J2EE平臺(tái)提供了盡可能完善的集成化的安全構(gòu)架,從頭到尾我們很少用到它的全部功能。
解決方案:
學(xué)習(xí)J2EE的關(guān)鍵部件以及它們優(yōu)缺點(diǎn),并把它們列成表格形式。弄清楚它們的每項(xiàng)服務(wù),記住“知識(shí)就是力量”。
備注:
只有知識(shí)才能修補(bǔ)這些錯(cuò)誤。一個(gè)好的Java程序員將會(huì)是一個(gè)好的EJB開發(fā)者。您掌握的J2EE和Java的知識(shí)越多,您在設(shè)計(jì)和實(shí)現(xiàn)階段做的就會(huì)更好。這些將會(huì)在設(shè)計(jì)階段開始顯示作用。
風(fēng)險(xiǎn)2:過(guò)度設(shè)計(jì)(使用EJB還是不使用)
項(xiàng)目階段:設(shè)計(jì)
受影響項(xiàng)目階段:開發(fā)
受影響系統(tǒng)特性維護(hù)、擴(kuò)展性,性能
征兆:
過(guò)大的EJB
開發(fā)者無(wú)法解釋他們的EJB在做什么以及他們之間的關(guān)系。
不可重用的EJB、組件或者服務(wù)
本應(yīng)該使用已有事務(wù)的時(shí)候EJB啟動(dòng)了一個(gè)新的事務(wù)
為了安全,把數(shù)據(jù)獨(dú)立級(jí)別設(shè)太高
解決方案:
對(duì)過(guò)度設(shè)計(jì)的解決方案直接來(lái)自于極限編程(XP)方法學(xué)。用最小的設(shè)計(jì)和編程來(lái)滿足需求,除此之外其他的不考慮。除非你需要明確知道今后可能的需求,如將來(lái)的負(fù)載要求,或者系統(tǒng)在最高負(fù)載下的表現(xiàn),否則大可不必為系統(tǒng)將來(lái)的情況做太多考慮或猜測(cè)。另外,J2EE平臺(tái)已經(jīng)定義了可伸縮性及出錯(cuò)恢復(fù)等特性,可以讓服務(wù)器系統(tǒng)為你進(jìn)行處理。
在最小的系統(tǒng)中,系統(tǒng)由一個(gè)個(gè)小的組件組成,每個(gè)組件完成一個(gè)單獨(dú)的工作。這樣系統(tǒng)的可重用性得到改善,系統(tǒng)的穩(wěn)定性也同樣得到改善。而且,系統(tǒng)的可維護(hù)性得到增強(qiáng),并且未來(lái)新的需求的加入也將變得更簡(jiǎn)單。
備注:
除了采用上邊的解決方案,也可以采用設(shè)計(jì)模式。它們可以顯著改善您系統(tǒng)的設(shè)計(jì)。EJB模型本身也廣泛的使用了設(shè)計(jì)模式。例如,每個(gè)EJB的Home接口都是Finder和Factory模式的例子。遠(yuǎn)程接口則是真實(shí)Bean的代理,對(duì)于提供容器的能力也是至關(guān)重要的,這些容器截取調(diào)用信號(hào)并提供諸如透明負(fù)載均衡的服務(wù)。忽略設(shè)計(jì)模式的價(jià)值將會(huì)讓是非常危險(xiǎn)的。
另外一個(gè)我常常警告的風(fēng)險(xiǎn)就是為了EJB而使用EJB。在你的應(yīng)用中的某一部分可能并不需要EJB,甚至你的整個(gè)應(yīng)用都不需要。這是過(guò)度設(shè)計(jì)所走的極端,而且我確實(shí)也目睹了一些良好的servlet和JavaBean應(yīng)用被重構(gòu)為EJB,而這樣做并沒(méi)有很好的技術(shù)上的理由。
風(fēng)險(xiǎn)3:沒(méi)有將業(yè)務(wù)規(guī)則和邏輯表現(xiàn)形式相分離
項(xiàng)目階段:設(shè)計(jì)
受影響項(xiàng)目階段:開發(fā)
受影響系統(tǒng)特性維護(hù)、擴(kuò)展性,性能
征兆:
過(guò)大的沒(méi)有邊界的Jsp
您發(fā)現(xiàn)您在業(yè)務(wù)邏輯發(fā)生變化的時(shí)候在編輯JSP頁(yè)面。
顯示上的改變迫使你修改并重新部署EJB和其他后臺(tái)組件
解決方案:
J2EE平臺(tái)使你有機(jī)會(huì)將表示邏輯和導(dǎo)航控制相分離,進(jìn)而與業(yè)務(wù)規(guī)則相分離。這叫做Model 2框架。如果您已經(jīng)陷入這個(gè)陷阱,您可以使用重構(gòu)。
備注:
可以使用具有一致性的設(shè)計(jì)來(lái)進(jìn)行用戶界面框架的連接(例如taglibs)浙江有助于您在您的項(xiàng)目中將業(yè)務(wù)規(guī)則和邏輯表現(xiàn)形式相分離,不需要您創(chuàng)建一個(gè)新的GUI框架,現(xiàn)在已經(jīng)有很多穩(wěn)定的實(shí)現(xiàn)。對(duì)他們一次進(jìn)行評(píng)估,然后選出一個(gè)最符合您需要的框架來(lái)。
風(fēng)險(xiǎn)4: 沒(méi)有在開發(fā)環(huán)境中進(jìn)行適當(dāng)?shù)呐渲?/SPAN>
項(xiàng)目階段:開發(fā)
受影響的項(xiàng)目階段: 運(yùn)行、并發(fā)、成熟期
受印象的系統(tǒng)特征:你的權(quán)衡
征兆:
經(jīng)過(guò)多日或數(shù)周的時(shí)間才能過(guò)渡到成熟系統(tǒng)
風(fēng)險(xiǎn)存在與過(guò)渡期,帶有很多不確定性,有些主要的功能場(chǎng)景沒(méi)有被測(cè)試到
實(shí)際系統(tǒng)中的數(shù)據(jù)和開發(fā)、測(cè)試中的數(shù)據(jù)不同
無(wú)法在開發(fā)者機(jī)器上進(jìn)行組建
應(yīng)用行為在開發(fā)、穩(wěn)定化及產(chǎn)品環(huán)境中各不相同
解決方案:
風(fēng)險(xiǎn)4的解決方案是忠實(shí)地在開發(fā)環(huán)境中配置實(shí)際的環(huán)境,讓開發(fā)所用環(huán)境接近于要實(shí)施產(chǎn)品的環(huán)境。如果客戶的運(yùn)行環(huán)境是JDK 1.2.2和Solaris 7,那么不要使用JDK 1.3 和Red Hat Linux進(jìn)行開發(fā)。而且不要在一個(gè)應(yīng)用服務(wù)器開發(fā)而在另一種應(yīng)用服務(wù)器中運(yùn)行。使用實(shí)際產(chǎn)品的數(shù)據(jù)進(jìn)行測(cè)試,而不要依靠于手工錄入的模擬數(shù)據(jù)。如果產(chǎn)品數(shù)據(jù)很敏感,則要使之變得不敏感,然后把它配置起來(lái)。開發(fā)中未能預(yù)期到的產(chǎn)品數(shù)據(jù)將對(duì)以下過(guò)程產(chǎn)生破壞:
數(shù)據(jù)校驗(yàn)規(guī)則
系統(tǒng)測(cè)試行為
系統(tǒng)組件構(gòu)建(特別地包括:EJB-EJB以及EJB-數(shù)據(jù)庫(kù))
最為糟糕的是,這樣還可能產(chǎn)生異常、空指針,以及你從沒(méi)見(jiàn)過(guò)的問(wèn)題。
備注:
開發(fā)者常常將安全問(wèn)題留到穩(wěn)定階段才解決(程序界面很好的運(yùn)行,我們現(xiàn)在加上用戶校驗(yàn)的東西吧)。要防止這樣的陷阱產(chǎn)生,你也可以花費(fèi)同樣多的時(shí)間在業(yè)務(wù)邏輯中改進(jìn)安全性。
成熟期是一個(gè)復(fù)雜的過(guò)程,其中充滿了各種非技術(shù)的和技術(shù)的問(wèn)題。你可能會(huì)陷于想不到的一大堆問(wèn)題中,這就是成熟化所意味的一切。開發(fā)及穩(wěn)定化環(huán)境過(guò)程為你提供了制造更多這樣的問(wèn)題,以及發(fā)現(xiàn)這樣的問(wèn)題的地方,不斷去做,就可以大大減少風(fēng)險(xiǎn)。
你做的工程越多,你就越能了解什么是可行的,什么是不可行的。你可以對(duì)工程問(wèn)題進(jìn)行記錄,以避免同樣的錯(cuò)誤重復(fù)發(fā)生。
風(fēng)險(xiǎn)5:選擇錯(cuò)誤的供應(yīng)商
項(xiàng)目階段:供應(yīng)商選擇
受影響項(xiàng)目階段:設(shè)計(jì),開發(fā),維護(hù),測(cè)試,運(yùn)行
受影響系統(tǒng)特性:性能,可維護(hù)性,穩(wěn)定性。
征兆:
開發(fā)者花費(fèi)大量時(shí)間跟開發(fā)工具腳勁而不是使用他們進(jìn)行高效率的開發(fā)。為了解決已知的或未知的Bug,系統(tǒng)需要重構(gòu),并且不同的開發(fā)工具幾乎無(wú)法整合(應(yīng)用服務(wù)器和IDE,IDE和調(diào)試器,源碼控制和構(gòu)架工具等等)
對(duì)于IDE,調(diào)試器等,開發(fā)者會(huì)贊同使用他們喜歡的工具。
解決方案:
為了避免風(fēng)險(xiǎn)5,您需要一個(gè)好的供應(yīng)商選擇流程,風(fēng)險(xiǎn)10也適用于此。
對(duì)于IDE,唯一的評(píng)估它的途徑就是使用它。評(píng)估J2EE實(shí)現(xiàn)的唯一途徑就是構(gòu)建一個(gè)試驗(yàn)并對(duì)您關(guān)心的系統(tǒng)的特性進(jìn)行試驗(yàn)。您肯定不希望您花費(fèi)了3個(gè)月時(shí)間開發(fā)并進(jìn)行了培訓(xùn)后才發(fā)現(xiàn)系統(tǒng)有很多的bug。
如果在開發(fā)過(guò)程中,您對(duì)您的工具集有疑問(wèn)怎么辦呢?當(dāng)然一些工具肯定會(huì)比另一些表現(xiàn)好。如果你現(xiàn)則了不滿足您要求的應(yīng)用服務(wù)器,那么請(qǐng)吸收它然后修改開發(fā)規(guī)范。如果IDE不好用,請(qǐng)降低代碼標(biāo)準(zhǔn)(使用制表符還是空格)。讓開發(fā)者選擇使他們更高效的開發(fā)工具。
備注:
要知道最好的供應(yīng)商和工具不是對(duì)一個(gè)特殊任務(wù)的一次性工作。您要經(jīng)常進(jìn)行市場(chǎng)評(píng)估。例如,我在過(guò)去的12個(gè)月中使用了四個(gè)不同的IDE,這依賴于我的應(yīng)用服務(wù)器、平臺(tái)還有是否編寫EJB。
風(fēng)險(xiǎn)6:不了解供應(yīng)商
項(xiàng)目階段:供應(yīng)商選擇
受影響項(xiàng)目階段:供應(yīng)商選擇之后的所有階段-設(shè)計(jì),開發(fā),維護(hù),測(cè)試,運(yùn)行
受影響系統(tǒng)特性:可維護(hù)性,可擴(kuò)展性,性能
征兆:
開發(fā)時(shí)間比預(yù)想的長(zhǎng)了超過(guò)33%,開發(fā)者重新發(fā)明輪子――開發(fā)供應(yīng)商已經(jīng)提供的需求的特性。
解決方案:
為了避免不了解供應(yīng)商造成的風(fēng)險(xiǎn),訂閱所有供應(yīng)商提供的資源,您可以在郵件列表、新聞組和版本備注(特別是已修正的bug列表)中得到您評(píng)估需要的信息。
一旦確定了供應(yīng)商,請(qǐng)盡快開始培訓(xùn),在項(xiàng)目開始前越早越好。下一步,構(gòu)建一個(gè)快速模型來(lái)證明,從而打消開發(fā)團(tuán)隊(duì)的顧慮。構(gòu)建EJB并部署它們,然后在表達(dá)層(Swing GUI, JSP等等)中調(diào)用他們。如果您在進(jìn)行系統(tǒng)開發(fā)的時(shí)候才進(jìn)行開發(fā)環(huán)境的搭建,那么環(huán)境搭建常常會(huì)造成麻煩。我看到過(guò)這樣的項(xiàng)目,他們沒(méi)有一個(gè)構(gòu)建流程,“我們沒(méi)有時(shí)間了”。當(dāng)團(tuán)隊(duì)必須工作到11點(diǎn)的時(shí)候表現(xiàn)的更為明顯,每晚他們只是將程序拼起來(lái)然后運(yùn)行。磨刀不誤砍柴工-這樣做會(huì)節(jié)省你很多時(shí)間。有人會(huì)說(shuō)“我們計(jì)劃中中沒(méi)有安排這個(gè)時(shí)間”,我說(shuō)“您的計(jì)劃中沒(méi)有不去這么做的時(shí)間”
備注:
不同的供應(yīng)商對(duì)J2EE的特定的實(shí)現(xiàn)技術(shù)是不同的。讓我們看看一個(gè)兩個(gè)供應(yīng)商的例子:IBM和BEA。IBM采用圖形化的WebSphere環(huán)境,恰恰相反,BEA則為WebLogic提供很多的命令行工具。IBM的WebSphere使用IIOP進(jìn)行通訊,并拋出CORBA異常(對(duì)程序員非透明),WebLogic則沒(méi)有采用CORBA底層構(gòu)架而是默認(rèn)使用t3協(xié)議。
WebSphere與Visual Age是緊密結(jié)合在一起的,而Weblogic則是可以使用多種IDE的。您可以使用幾乎任何IDE進(jìn)行WebLogic的開發(fā)。
他們之間是還是有不同點(diǎn)的。你是一種應(yīng)用服務(wù)器的專家并不意味著你是其他應(yīng)用服務(wù)器的專家。上述各點(diǎn)體現(xiàn)在各個(gè)方面:IDE、調(diào)試器、構(gòu)建工具,配置管理等等。在一個(gè)特定工具上熟悉的人可以在評(píng)估該提供商的競(jìng)爭(zhēng)對(duì)手產(chǎn)品時(shí)具有一些便利。但是這并不意味著您可以把程序在不同程序之間進(jìn)行無(wú)縫鏈接。因此,您必須花費(fèi)一些時(shí)間來(lái)熟悉這些工具。
風(fēng)險(xiǎn)7:沒(méi)有考慮可擴(kuò)展性和性能
項(xiàng)目階段:設(shè)計(jì)
受影響項(xiàng)目階段:可擴(kuò)展性,性能,可維護(hù)性
征兆:無(wú)法接受的慢速的系統(tǒng)(不應(yīng)該服從重構(gòu))
服務(wù)器端被很強(qiáng)的負(fù)載所壓迫,導(dǎo)致不能充分發(fā)揮集群技術(shù)的全部?jī)?yōu)勢(shì)。
解決方案:
在這個(gè)風(fēng)險(xiǎn)中,我們接近我們系統(tǒng)性能的可擴(kuò)展性需求-我們?cè)谀_始開發(fā)之前要知道您需要什么參數(shù)。如果您需要每秒50個(gè)并發(fā)事務(wù)數(shù),而您的實(shí)體Bean只能提供40個(gè),那么您需要尋找其他可選的解決方案,例如存儲(chǔ)過(guò)程、批處理或者重寫聯(lián)機(jī)事務(wù)處理系統(tǒng)。
您要讓供應(yīng)商參與到系統(tǒng)性能需求中去――他們知道他們產(chǎn)品的強(qiáng)項(xiàng)和弱項(xiàng),這樣可以對(duì)您有相應(yīng)的幫助。
備注:
沒(méi)有為可擴(kuò)展性和性能進(jìn)行設(shè)計(jì)看起來(lái)與第二個(gè)風(fēng)險(xiǎn)(過(guò)度設(shè)計(jì))相沖突。實(shí)際上他們是互為補(bǔ)充的。對(duì)于風(fēng)險(xiǎn)2我提倡只實(shí)現(xiàn)真正需要的功能。通過(guò)說(shuō)明性能和可測(cè)試性要求,您可以設(shè)定需求的上界。
如果您認(rèn)為可擴(kuò)展性是一個(gè)重點(diǎn)要求的話,您就需要首先選用一個(gè)帶集群支持的應(yīng)用服務(wù)器,可能還需要一個(gè)事務(wù)緩沖池支持。您還需要象EJB這樣的業(yè)務(wù)組件引擎,因?yàn)槟梢猿浞掷梅?wù)器的系統(tǒng)構(gòu)架。在這一點(diǎn)上極限編程將不會(huì)有任何問(wèn)題,在極限編程中系統(tǒng)是用來(lái)滿足客戶的功能和行為要求的。
風(fēng)險(xiǎn)8:缺乏開發(fā)過(guò)程控制。
項(xiàng)目階段:開發(fā)
受影響階段:維護(hù),運(yùn)行
受影響系統(tǒng)特征:可維護(hù)性,代碼質(zhì)量。
現(xiàn)象:
項(xiàng)目計(jì)劃看起來(lái)象瀑布模型:首先根據(jù)草案設(shè)計(jì)系統(tǒng),然后我們就坐下來(lái)開始漫長(zhǎng)的編碼。因?yàn)闃?gòu)建過(guò)程不存在,所以構(gòu)建成了一個(gè)夢(mèng)魘。構(gòu)建的日子也就是停止開發(fā)的日子,因?yàn)槲覀兪裁炊紱](méi)得到。
組件在集成之前沒(méi)有經(jīng)過(guò)足夠的測(cè)試。集成測(cè)試意味著將兩個(gè)不穩(wěn)定的組件捆在一起,然后到調(diào)試器的堆棧樹中去觀察他們。
解決方案:
一個(gè)好的軟件方法學(xué)將會(huì)節(jié)省您的生命。我已經(jīng)提過(guò)了XP;在參考資料章節(jié)中我給出了相關(guān)的站點(diǎn)。在那里您會(huì)對(duì)XP有更深入細(xì)致的了解。
備注:
我無(wú)法想象我不使用Junit進(jìn)行單元測(cè)試和Ant進(jìn)行構(gòu)建的日子(這兩個(gè)免費(fèi)工具支撐著XP方法學(xué))。如果想了解更多關(guān)于Junit和Ant,請(qǐng)參考資源這一章。
風(fēng)險(xiǎn)9:使用框架失敗
項(xiàng)目階段:開發(fā)
受影響項(xiàng)目階段:開發(fā)、維護(hù)、運(yùn)行
受影響系統(tǒng)特征:維護(hù)性,可擴(kuò)展性,代碼質(zhì)量
征兆:
核心類庫(kù)中的Bug在代碼中多次使用
沒(méi)有設(shè)定日志標(biāo)準(zhǔn),所以輸出不能此采用腳本進(jìn)行讀取和分析
錯(cuò)誤的或不協(xié)調(diào)的異常處理。我再有的站點(diǎn)看到,終端用戶可以看到系統(tǒng)的低級(jí)錯(cuò)誤;例如當(dāng)用戶要將他們購(gòu)物車中的商品付費(fèi)的時(shí)候出現(xiàn)一個(gè)SQLException 的stack trace。用戶應(yīng)該怎么辦呢?難道要求他給數(shù)據(jù)庫(kù)管理員打電話,然后要求他修改主鍵約束錯(cuò)誤?
下面的任務(wù)必須以某種方法進(jìn)行處理,并且要成為任何構(gòu)架的第一目標(biāo):
日志:
異常處理
奪得到某些資源的連接(例如數(shù)據(jù)庫(kù)、命名服務(wù))
構(gòu)建Jsp 頁(yè)面
數(shù)據(jù)校驗(yàn)
解決方案:
我對(duì)輕量級(jí)框架非常情有獨(dú)衷,實(shí)際上,我在JavaWorld上的第一篇文章就是《框架節(jié)省時(shí)間》,它討論的就是企業(yè)及Java環(huán)境衷的框架。如果您已經(jīng)在開發(fā)了,那么通過(guò)使用一個(gè)框架您仍然能夠收獲頗豐。在重做這些東西的時(shí)候,您將會(huì)遇到諸如錯(cuò)誤處理和日志之類的錯(cuò)誤,但是從長(zhǎng)遠(yuǎn)來(lái)看這會(huì)大大節(jié)省時(shí)間和金錢。
備注:
當(dāng)在選擇框架和基礎(chǔ)組件開發(fā)的時(shí)候,您必須思考他們的不同的重用級(jí)別。第一級(jí)別的重用率時(shí)0.9甚至更高,也就是說(shuō)項(xiàng)目中90%將會(huì)用到它。
風(fēng)險(xiǎn)10:項(xiàng)目計(jì)劃和設(shè)計(jì)建立在市場(chǎng)炒作上,而非實(shí)際的技術(shù)上。
備注:一開始我沒(méi)有把風(fēng)險(xiǎn)10加上來(lái),后來(lái)我發(fā)現(xiàn)很多人都對(duì)企業(yè)級(jí)Java有誤解,特別是對(duì)于剛剛解除這個(gè)領(lǐng)域的人。
項(xiàng)目階段:所有受影響的階段,特別是供應(yīng)商選擇階段尤甚。
受影響項(xiàng)目階段:所有階段。
受影響系統(tǒng)特性:可維護(hù)性,可擴(kuò)展性,設(shè)計(jì)質(zhì)量,編碼質(zhì)量。
征兆:
因?yàn)?/SPAN>EJB是可移植的所以在技術(shù)選型方面不重視。
在供應(yīng)商選擇時(shí)沒(méi)有進(jìn)行產(chǎn)品試驗(yàn)
在項(xiàng)目生命周期衷需要更換開發(fā)工具。
解決方案:
別輕信項(xiàng)目外任何有即得利益人得說(shuō)法。也就是說(shuō):不要輕信供應(yīng)商(除非您對(duì)他們非常了解),不要輕信白皮書(因?yàn)樗麄兪枪?yīng)商花錢買的)。如果您需要真正得建議,那么請(qǐng)查找關(guān)于它得相關(guān)評(píng)論。甚至,可以下載您想評(píng)估得工具,在上邊試著開發(fā)一個(gè)小的系統(tǒng)原型。不要運(yùn)行工具中自帶的例子(每個(gè)好一點(diǎn)的供應(yīng)商都會(huì)加上這個(gè))。
為了概括總結(jié),花一定的時(shí)間為您的項(xiàng)目選擇正確的供應(yīng)商和工具集。縮小您的選擇范圍到三四個(gè)供應(yīng)商,然后進(jìn)行測(cè)試。對(duì)您選擇的IDE、應(yīng)用服務(wù)器進(jìn)行為時(shí)一周的測(cè)試和構(gòu)建。熟悉您將要用來(lái)開發(fā)項(xiàng)目的工具。
三 總結(jié)
只有這10個(gè)風(fēng)險(xiǎn)需要注意嗎?
10只是一個(gè)武斷的與其他風(fēng)險(xiǎn)分割開的數(shù)字而已,還有很多其他的風(fēng)險(xiǎn)。我就能說(shuō)出很多。但是即使如此,如果您能說(shuō)出我這列出的這些風(fēng)險(xiǎn),我就可以保證您的項(xiàng)目會(huì)非常優(yōu)秀而且必定成功。
如果還有我不想讓您獨(dú)這篇文章的原因就是:這不是經(jīng)驗(yàn)和計(jì)劃的代替品。如果您沒(méi)有經(jīng)驗(yàn),那么請(qǐng)去積累。不要依賴項(xiàng)目開發(fā)中的培訓(xùn)會(huì)起多大的兆月年個(gè)。在開發(fā)前請(qǐng)做好心理準(zhǔn)備。請(qǐng)Java和J2EE指導(dǎo)者對(duì)你們團(tuán)隊(duì)進(jìn)行全程指導(dǎo)、把握項(xiàng)目方向,并和較少經(jīng)驗(yàn)的團(tuán)隊(duì)人員一起成長(zhǎng)。
最后,我寫的越多我想到需要說(shuō)的東西越多:
軟件工程的社會(huì)因素
單元測(cè)試與集成測(cè)試(什么時(shí)候進(jìn)行測(cè)試?)
設(shè)計(jì)模式
異常處理
唉,不能再寫了。等待著新文章吧,祝君好運(yùn)!
結(jié)論:
這里列出了10個(gè)風(fēng)險(xiǎn),他們能夠概括您進(jìn)行企業(yè)級(jí)java開發(fā)的時(shí)候遇到的大部分問(wèn)題。我堅(jiān)信,您在開發(fā)過(guò)程中,還會(huì)面對(duì)很多其他的缺陷,但是我也堅(jiān)信我已經(jīng)概括了主要的問(wèn)題。我們翻個(gè)個(gè),將10個(gè)風(fēng)險(xiǎn)按著優(yōu)先級(jí)排序:
不懂Java,不懂EJB,不懂J2EE
過(guò)度設(shè)計(jì)(使用EJB還是不使用)(設(shè)計(jì)模式)
沒(méi)有將業(yè)務(wù)規(guī)則和邏輯表現(xiàn)形式相分離
開發(fā)時(shí)沒(méi)有部署
選擇了錯(cuò)誤的供應(yīng)商
不了解您的供應(yīng)商
沒(méi)有設(shè)計(jì)可擴(kuò)展性和系統(tǒng)性能
陳舊的開發(fā)過(guò)程
沒(méi)有使用框架
項(xiàng)目計(jì)劃和設(shè)計(jì)建立在市場(chǎng)炒作上,而非實(shí)際的技術(shù)上。
原文:
http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-ten.html
英文水平有限,請(qǐng)多指教