漫談企業(yè)應用項目的軟件開發(fā)過程 ——一個PRM系統(tǒng)實施的經(jīng)驗與教訓
時間:2003-12-07 14:23 來源:IBM DW中國 作者:曲俊生 閱讀:次
本文以一個PRM項目為例, 探討了目前國內(nèi)軟件開發(fā)企業(yè)在軟件開發(fā)過程中,尤其是企業(yè)應用系統(tǒng)項目開發(fā)中,面臨的問題以及如何利用敏捷軟件開發(fā)方法的解決方案。 一、 項目與公司背景
該項目是一個PRM (Partner Relationship Management)系統(tǒng),為世界著名的快速消費品品牌在中國大陸的合作伙伴提供訂單管理以及其它輔助功能。該系統(tǒng)原來是基于PHP實現(xiàn)的,已經(jīng)運行將近2年的時間,但是由于系統(tǒng)功能問題,需要對系統(tǒng)進行重新開發(fā),新的系統(tǒng)基于J2EE框架實現(xiàn)。
項目預期情況如下:
項目開始時間: 2002年7月1日
預期交付時間: 2002年9月1日
項目金額: 70萬RMB
項目開發(fā)商是亞洲領先的電子商務解決方案供應商,在J2EE架構的項目執(zhí)行方面有豐富的經(jīng)驗,結合RUP與Web Software Engineering形成了自己的一套電子商務項目實施方法論,并在多個項目中成功進行實施。
二、 項目實施情況
項目由于客戶預算等原因,原有的軟、硬件系統(tǒng)繼續(xù)使用,同時,應用系統(tǒng)平臺也采用開源項目。
項目部署時的系統(tǒng)情況如下:
硬件:
操作系統(tǒng): Solaris
主頻: 400M
內(nèi)存: 1G
硬盤: 20G
應用平臺:
Web服務器: Apache 1.3.21
應用服務器: Tomcat 4.0.6
數(shù)據(jù)庫服務器: Oracle 8.1.7
項目人員配置與項目規(guī)模:
項目團隊
項目經(jīng)理: 1
技術經(jīng)理: 1(兼)
客戶經(jīng)理: 1
開發(fā)人員: 4
測試人員: 2
HTML人員: 1(兼)
項目規(guī)模
Use Case: 32
代碼行數(shù): 65000
JSP頁面: 198
項目真實執(zhí)行情況:
開始日期: 2002/7/1
交付日期: 2002/9/2
驗收日期: 2003/5/8
維護時間: 230 人小時
目前項目盈利: 20000
目前,項目由于性能問題,仍然沒有驗收,維護時間日益增長,目前仍然有30萬左右的尾款沒有收到;更為嚴重的是,目前項目開發(fā)商正在投標的另一快速消費品行業(yè)著名客戶的合作伙伴與該客戶有很大的重疊,因此,對于潛在項目的招標造成一定的影響。
三、 經(jīng)驗與教訓
從項目規(guī)模中可以看出,該項目的時間還是比較緊張的;另外一方面,項目交付是在合同規(guī)定日期之前完成,而且通過了所有的功能測試。從一定意義上的講,項目的開發(fā)是取得了一定的成功的。
3.1 經(jīng)驗
在項目開發(fā)前,項目開發(fā)商已經(jīng)通過其它項目,實施了以XP為代表的敏捷軟件開發(fā)方法的部分最佳實踐,并取得了很大的成功。因此,在該項目的執(zhí)行過程中,項目開發(fā)商繼續(xù)采用了XP的部分實踐以及其它軟件開發(fā)方法中的推薦做法[1][2]:
每日晨會:在項目實施過程中,每天早晨開發(fā)小組都要參加一個持續(xù)15分鐘左右的會議,由項目經(jīng)理主持,聽取每個成員的進度,并根據(jù)進展情況,對于進度和資源進行調(diào)整。
由于會議是每天進行的,PM很容易從中獲得真實的項目情況-"掀開地毯下面的東西"[4],從而對風險有了較好的控制。
交叉審核:項目組在最初的時候原本是想采取"成對編程"的實踐,但是沒有獲得物理和管理上的支持,因此,只能采取交叉審核的方式進行。
需求獲。河蒔M和一名對于原有系統(tǒng)較熟悉的開發(fā)人員進行需求獲取和SRS (Software Requirement Specification) 的撰寫。技術經(jīng)理和其它開發(fā)人員進行需求的審核。
分析與設計:由一名開發(fā)人員進行系統(tǒng)框架的設計,其它人員進行審核;在系統(tǒng)框架設計進行過程中,由于系統(tǒng)去除訂單處理以外的其它部分比較獨立,因此,將其它模塊分配給開發(fā)人員,而將核心部分交與技術經(jīng)理進行分析與設計。開發(fā)人員在每個迭代周期內(nèi),都會在分析與設計做完后,每2人一組進行審核。
編碼:每天下班前,2人一組,對對方的代碼進行Review,發(fā)現(xiàn)問題及時解決。代碼Review的時候,語法與規(guī)則的檢查,通過Check Style的工具進行;開發(fā)人員將審查的重點放在功能實現(xiàn)與性能優(yōu)化等方面。
測試:在需求文檔形成以后,2個測試人員分布編寫分配模塊的Test Case;而在具體測試的時候,兩人交叉測試對方的模塊和更新文檔。
在系統(tǒng)開發(fā)Verification的各個階段,都有Check List,詳細的信息請查看參考文獻[3]。
測試先行:測試在軟件開發(fā)中的重要作用已經(jīng)得到了越來越多的重視,但是,由于習慣勢力的影響和對于"Test-Driven Development"的不熟悉,開發(fā)小組并沒有實施完全意義上的測試先行。
對于系統(tǒng)框架的核心類設計過程中,項目小組采取了TDD的方式進行開發(fā)。在后續(xù)的系統(tǒng)開發(fā)中,每個開發(fā)人員在進行開發(fā)前,首先要完成一個功能測試 ( Function Test ) 列表,將要完成的Use Case中的主要業(yè)務邏輯以及關聯(lián)邏輯都要羅列出來,在提交測試人員進行集成測試之前,開發(fā)人員需要保證完成Function List中的所有選項。
在每個開發(fā)人員的模塊完成并通過個人的功能測試后,測試人員進行集成測試,同時編寫測試腳本,并通過自動測試工具 (Rational Robot) 進行記錄。每天下班之前,測試人員會啟動測試工具,進行回歸測試。在第二天向PM和技術經(jīng)理提交測試報告并將Bug提交至Bug Trace系統(tǒng)(Rational Clear Quest),由PM進行Bug的分發(fā)。每個開發(fā)人員需要在下一個迭代周期完成前,修正前一個迭代內(nèi)分配的Bug。
持續(xù)集成:在測試先行的基礎上,開發(fā)一組平均每天都會進行已經(jīng)完成模塊與以后系統(tǒng)的集成。集成由專門的人員,在開發(fā)人員將已經(jīng)通過功能測試的源碼Check in到源碼控制系統(tǒng) (ClearCase) 中以后進行,在部署應用結束以后,通知測試人員進行集成測試。
小步發(fā)布:項目有專門的測試與發(fā)布服務器,每天都有集成的系統(tǒng)在運行和接受測試。由于沒有現(xiàn)場客戶,對于已經(jīng)發(fā)布的系統(tǒng),是由"客戶領域專家"(這個項目是由Business Development人員來充當這個角色)來進行審查的。他對于系統(tǒng)的意見和發(fā)現(xiàn)的問題,在經(jīng)過PM和技術經(jīng)理審核后,進入ClearQuest,分配給開發(fā)人員進行修改。
由于項目一開始就注意組織內(nèi)部以及與客戶的溝通和交流,同時采用了很多敏捷軟件開發(fā)過程的實踐,項目如期交付使用。
3.2 教訓
項目在交付以后,最初的兩個訂貨季節(jié)沒有出現(xiàn)功能與性能上的問題。但是,由于合同中有數(shù)據(jù)遷移的條款,在項目交付2月后,項目開發(fā)商將舊應用系統(tǒng)中的數(shù)據(jù)導入新系統(tǒng)以后,在下一個大的訂貨季節(jié)中,持續(xù)的出現(xiàn)性能上的問題。在代碼修改和硬件環(huán)境提高以后,系統(tǒng)性能目前獲得了一定的改善。
從項目驗收日期的日益推遲中,我們可以看出,該項目還是有很多地方做的不夠,例如:
系統(tǒng)二次開發(fā)效應:"第二個系統(tǒng)效應"是Brooks在《人月神話》中提出的一個普遍的問題,一般而言,第二個系統(tǒng)會傾向于過分設計[4]。
對于這個項目而言,沒有犯這個錯誤,卻發(fā)生了另外一種情況:舊系統(tǒng)中,對于訂單信息以及產(chǎn)品信息的展示,不管是多是少(系統(tǒng)頁面最多顯示上千條記錄),都是在一個頁面中顯示。這對于沒有明顯的層次結構,直接在Script中調(diào)用數(shù)據(jù)庫記錄的PHP來說,性能還是可以接受的。但是,新系統(tǒng)的設計中客戶提出考慮系統(tǒng)用戶習慣一致性的問題,就照搬了舊系統(tǒng)的頁面設計;同時,在架構設計上,對于這種頁面顯示大量數(shù)據(jù)的情況,也沒有給予充分的考慮,為后來的性能問題,埋下了伏筆。
教訓一:沒有考慮新平臺的影響,照搬舊系統(tǒng)的功能以及頁面設計。
非功能性需求:項目合同中主要描述的是系統(tǒng)功能性的需求,而沒有非功能性需求的規(guī)定;同時,在需求獲取解決,也沒有明確的了解系統(tǒng)的性能指標等非功能性需求。主要原因在于項目開發(fā)商之前沒有大規(guī)模業(yè)務系統(tǒng)開發(fā)的經(jīng)驗,對于非功能性需求沒有足夠的重視;同時,在測試階段,也沒有對于系統(tǒng)負載和性能做過測試。
因此,在項目交付以后,由于舊系統(tǒng)數(shù)據(jù)遷移后,數(shù)據(jù)量有了很大的增長,同時,在秋季的定購高峰中,有大量的并發(fā)用戶訪問,出現(xiàn)了下列問題:
數(shù)據(jù)庫死鎖;
大量數(shù)據(jù)計算與顯示頁面速度很慢,頁面要經(jīng)過5~10分鐘才能夠完全顯示;
上述兩種情況在少量負載的單元測試和集成測試中是不可能出現(xiàn)的。
教訓二:對于企業(yè)應用系統(tǒng),尤其是業(yè)務系統(tǒng),沒有切實注意負載、性能等非功能性需求。
效率與設計:在J2EE中,已經(jīng)成功的運用了很多設計模式的思想,為系統(tǒng)的開發(fā)提供了一個很好框架。但是,在項目的架構設計中,除了考慮可維護性、可復用性等問題以外,還要考慮代碼執(zhí)行效率的問題[5]。
隨著計算機硬件技術的發(fā)展,"莫爾定律"被一再的驗證,系統(tǒng)硬件的價格逐漸降低。對于很多使用J2EE架構或者JAVA技術的項目來說,解決性能與效率問題的解決方案就是增加硬件方面的投入。而實際上,軟件開發(fā)過程中優(yōu)劣算法之間的差距是靠硬件的投入平衡不了的。
該項目在系統(tǒng)維護期間,對代碼進行走查,修改了很多對于性能有影響的語句;同時,在框架設計中,尤其是數(shù)據(jù)庫操作方法,利用Cache原理,從一定程度上解決了性能的問題。
教訓三:系統(tǒng)框架設計只考慮面向對象和可維護性,沒有在完美的設計與高效率的代碼之間做出權衡。
數(shù)據(jù)庫設計:JAVA是純粹的面向對象語言,利用J2EE開發(fā)的項目,也強調(diào)首先進行OOAD的分析,首先有對象,然后再有數(shù)據(jù)庫的設計。DBA在項目中的作用,已經(jīng)遠遠沒有傳統(tǒng)的結構性編程中重要。而實際情況卻是遠非如此:大部分的業(yè)務系統(tǒng),如果要對系統(tǒng)的性能做出優(yōu)化,對數(shù)據(jù)庫層或者SQL語句進行優(yōu)化是關鍵的步驟之一。
對于這個PRM系統(tǒng),在數(shù)據(jù)庫的設計上并沒有經(jīng)過DBA的審查就開始進行開發(fā);而在性能問題出現(xiàn)以后,客戶增加了512M的內(nèi)存,也沒有請求DBA對Oracle的參數(shù)做相應的調(diào)整,造成了很大的資源浪費。
在項目維護過程中,依靠DBA的幫助,開發(fā)商對于數(shù)據(jù)庫系統(tǒng)參數(shù)、索引、存儲過程和SQL語句都做了一定的調(diào)整,這對于系統(tǒng)性能的提高起了很大的作用。
教訓四:在面向對象的軟件系統(tǒng)構建中,忽視數(shù)據(jù)庫設計以及DBA的重要作用。
客戶參與:在傳統(tǒng)的軟件開發(fā)過程中,一般情況下,客戶在簽訂合同后,項目交付前是很少有機會看到系統(tǒng)的,這樣就造成了系統(tǒng)交付后,客戶抱怨很多的情況;而在以XP為代表的敏捷軟件開發(fā)方法中,強化了客戶在軟件開發(fā)中的重要作用,XP更是提出了"現(xiàn)場客戶"的實踐,將客戶作為項目小組的一員,客戶對于項目的發(fā)布計劃、內(nèi)容和優(yōu)先級等方面有絕對的控制權。
對于這個PRM項目,由于客戶的原因,不可能采取"現(xiàn)場客戶"的實踐,但是,開發(fā)商的BD對于該客戶十分熟悉,完全可以作為客戶代表參與到項目中來,因此,開發(fā)商將客戶經(jīng)理作為項目組的一員。
實際情況是:開發(fā)過程中,客戶經(jīng)理由于業(yè)務拓展的原因,并沒有在項目上分配多少時間進行審查;而客戶在交付前也沒有花費很多的時間研究系統(tǒng),也沒有提交很多的反饋報告。在系統(tǒng)交付出現(xiàn)性能等問題后,客戶經(jīng)理與開發(fā)人員一起對于系統(tǒng)需求進行審查,提出了很多有參考性的意見。如果從一開始,就強化"現(xiàn)場客戶"的最佳實踐,就可以很早發(fā)現(xiàn)問題。
教訓五:客戶或者客戶經(jīng)理對于項目的參與力度不夠。
四、 結論
在基于J2EE的企業(yè)應用項目開發(fā)中,要注意以下問題:
權衡系統(tǒng)設計與性能指標,關注非功能性需求;
采取敏捷軟件開發(fā)過程,關注人(客戶和開發(fā)人員)在項目實施中的重要作用,如果可以的話,聯(lián)合實施XP的所有實踐;
五、 參考文獻
[1] Agile Software Development Alistair Cockburn
[2] Extreme Programming Explained - Embrace Change Kent Beck
[3] Software Verification and Validation for Practitioners and Managers Steven R. Rakitin
[4] The Mythical Man-Month Frederick P. Brooks Jr.
[5] Expert One-To-One J2EE Design and Development Rod Johnson
作者簡介:
曲俊生,某咨詢公司資深顧問。有近5年的軟件開發(fā)經(jīng)驗和2年的項目管理實踐。目前他的研究與開發(fā)興趣在J2EE, XP, TDD 以及Design Pattern。目前居住在上海,喜歡爬山、旅游等休閑活動,你可以通過junshengqu@yahoo.com.cn與他聯(lián)系。
該項目是一個PRM (Partner Relationship Management)系統(tǒng),為世界著名的快速消費品品牌在中國大陸的合作伙伴提供訂單管理以及其它輔助功能。該系統(tǒng)原來是基于PHP實現(xiàn)的,已經(jīng)運行將近2年的時間,但是由于系統(tǒng)功能問題,需要對系統(tǒng)進行重新開發(fā),新的系統(tǒng)基于J2EE框架實現(xiàn)。
項目預期情況如下:
項目開始時間: 2002年7月1日
預期交付時間: 2002年9月1日
項目金額: 70萬RMB
項目開發(fā)商是亞洲領先的電子商務解決方案供應商,在J2EE架構的項目執(zhí)行方面有豐富的經(jīng)驗,結合RUP與Web Software Engineering形成了自己的一套電子商務項目實施方法論,并在多個項目中成功進行實施。
二、 項目實施情況
項目由于客戶預算等原因,原有的軟、硬件系統(tǒng)繼續(xù)使用,同時,應用系統(tǒng)平臺也采用開源項目。
項目部署時的系統(tǒng)情況如下:
硬件:
操作系統(tǒng): Solaris
主頻: 400M
內(nèi)存: 1G
硬盤: 20G
應用平臺:
Web服務器: Apache 1.3.21
應用服務器: Tomcat 4.0.6
數(shù)據(jù)庫服務器: Oracle 8.1.7
項目人員配置與項目規(guī)模:
項目團隊
項目經(jīng)理: 1
技術經(jīng)理: 1(兼)
客戶經(jīng)理: 1
開發(fā)人員: 4
測試人員: 2
HTML人員: 1(兼)
項目規(guī)模
Use Case: 32
代碼行數(shù): 65000
JSP頁面: 198
項目真實執(zhí)行情況:
開始日期: 2002/7/1
交付日期: 2002/9/2
驗收日期: 2003/5/8
維護時間: 230 人小時
目前項目盈利: 20000
目前,項目由于性能問題,仍然沒有驗收,維護時間日益增長,目前仍然有30萬左右的尾款沒有收到;更為嚴重的是,目前項目開發(fā)商正在投標的另一快速消費品行業(yè)著名客戶的合作伙伴與該客戶有很大的重疊,因此,對于潛在項目的招標造成一定的影響。
三、 經(jīng)驗與教訓
從項目規(guī)模中可以看出,該項目的時間還是比較緊張的;另外一方面,項目交付是在合同規(guī)定日期之前完成,而且通過了所有的功能測試。從一定意義上的講,項目的開發(fā)是取得了一定的成功的。
3.1 經(jīng)驗
在項目開發(fā)前,項目開發(fā)商已經(jīng)通過其它項目,實施了以XP為代表的敏捷軟件開發(fā)方法的部分最佳實踐,并取得了很大的成功。因此,在該項目的執(zhí)行過程中,項目開發(fā)商繼續(xù)采用了XP的部分實踐以及其它軟件開發(fā)方法中的推薦做法[1][2]:
每日晨會:在項目實施過程中,每天早晨開發(fā)小組都要參加一個持續(xù)15分鐘左右的會議,由項目經(jīng)理主持,聽取每個成員的進度,并根據(jù)進展情況,對于進度和資源進行調(diào)整。
由于會議是每天進行的,PM很容易從中獲得真實的項目情況-"掀開地毯下面的東西"[4],從而對風險有了較好的控制。
交叉審核:項目組在最初的時候原本是想采取"成對編程"的實踐,但是沒有獲得物理和管理上的支持,因此,只能采取交叉審核的方式進行。
需求獲。河蒔M和一名對于原有系統(tǒng)較熟悉的開發(fā)人員進行需求獲取和SRS (Software Requirement Specification) 的撰寫。技術經(jīng)理和其它開發(fā)人員進行需求的審核。
分析與設計:由一名開發(fā)人員進行系統(tǒng)框架的設計,其它人員進行審核;在系統(tǒng)框架設計進行過程中,由于系統(tǒng)去除訂單處理以外的其它部分比較獨立,因此,將其它模塊分配給開發(fā)人員,而將核心部分交與技術經(jīng)理進行分析與設計。開發(fā)人員在每個迭代周期內(nèi),都會在分析與設計做完后,每2人一組進行審核。
編碼:每天下班前,2人一組,對對方的代碼進行Review,發(fā)現(xiàn)問題及時解決。代碼Review的時候,語法與規(guī)則的檢查,通過Check Style的工具進行;開發(fā)人員將審查的重點放在功能實現(xiàn)與性能優(yōu)化等方面。
測試:在需求文檔形成以后,2個測試人員分布編寫分配模塊的Test Case;而在具體測試的時候,兩人交叉測試對方的模塊和更新文檔。
在系統(tǒng)開發(fā)Verification的各個階段,都有Check List,詳細的信息請查看參考文獻[3]。
測試先行:測試在軟件開發(fā)中的重要作用已經(jīng)得到了越來越多的重視,但是,由于習慣勢力的影響和對于"Test-Driven Development"的不熟悉,開發(fā)小組并沒有實施完全意義上的測試先行。
對于系統(tǒng)框架的核心類設計過程中,項目小組采取了TDD的方式進行開發(fā)。在后續(xù)的系統(tǒng)開發(fā)中,每個開發(fā)人員在進行開發(fā)前,首先要完成一個功能測試 ( Function Test ) 列表,將要完成的Use Case中的主要業(yè)務邏輯以及關聯(lián)邏輯都要羅列出來,在提交測試人員進行集成測試之前,開發(fā)人員需要保證完成Function List中的所有選項。
在每個開發(fā)人員的模塊完成并通過個人的功能測試后,測試人員進行集成測試,同時編寫測試腳本,并通過自動測試工具 (Rational Robot) 進行記錄。每天下班之前,測試人員會啟動測試工具,進行回歸測試。在第二天向PM和技術經(jīng)理提交測試報告并將Bug提交至Bug Trace系統(tǒng)(Rational Clear Quest),由PM進行Bug的分發(fā)。每個開發(fā)人員需要在下一個迭代周期完成前,修正前一個迭代內(nèi)分配的Bug。
持續(xù)集成:在測試先行的基礎上,開發(fā)一組平均每天都會進行已經(jīng)完成模塊與以后系統(tǒng)的集成。集成由專門的人員,在開發(fā)人員將已經(jīng)通過功能測試的源碼Check in到源碼控制系統(tǒng) (ClearCase) 中以后進行,在部署應用結束以后,通知測試人員進行集成測試。
小步發(fā)布:項目有專門的測試與發(fā)布服務器,每天都有集成的系統(tǒng)在運行和接受測試。由于沒有現(xiàn)場客戶,對于已經(jīng)發(fā)布的系統(tǒng),是由"客戶領域專家"(這個項目是由Business Development人員來充當這個角色)來進行審查的。他對于系統(tǒng)的意見和發(fā)現(xiàn)的問題,在經(jīng)過PM和技術經(jīng)理審核后,進入ClearQuest,分配給開發(fā)人員進行修改。
由于項目一開始就注意組織內(nèi)部以及與客戶的溝通和交流,同時采用了很多敏捷軟件開發(fā)過程的實踐,項目如期交付使用。
3.2 教訓
項目在交付以后,最初的兩個訂貨季節(jié)沒有出現(xiàn)功能與性能上的問題。但是,由于合同中有數(shù)據(jù)遷移的條款,在項目交付2月后,項目開發(fā)商將舊應用系統(tǒng)中的數(shù)據(jù)導入新系統(tǒng)以后,在下一個大的訂貨季節(jié)中,持續(xù)的出現(xiàn)性能上的問題。在代碼修改和硬件環(huán)境提高以后,系統(tǒng)性能目前獲得了一定的改善。
從項目驗收日期的日益推遲中,我們可以看出,該項目還是有很多地方做的不夠,例如:
系統(tǒng)二次開發(fā)效應:"第二個系統(tǒng)效應"是Brooks在《人月神話》中提出的一個普遍的問題,一般而言,第二個系統(tǒng)會傾向于過分設計[4]。
對于這個項目而言,沒有犯這個錯誤,卻發(fā)生了另外一種情況:舊系統(tǒng)中,對于訂單信息以及產(chǎn)品信息的展示,不管是多是少(系統(tǒng)頁面最多顯示上千條記錄),都是在一個頁面中顯示。這對于沒有明顯的層次結構,直接在Script中調(diào)用數(shù)據(jù)庫記錄的PHP來說,性能還是可以接受的。但是,新系統(tǒng)的設計中客戶提出考慮系統(tǒng)用戶習慣一致性的問題,就照搬了舊系統(tǒng)的頁面設計;同時,在架構設計上,對于這種頁面顯示大量數(shù)據(jù)的情況,也沒有給予充分的考慮,為后來的性能問題,埋下了伏筆。
教訓一:沒有考慮新平臺的影響,照搬舊系統(tǒng)的功能以及頁面設計。
非功能性需求:項目合同中主要描述的是系統(tǒng)功能性的需求,而沒有非功能性需求的規(guī)定;同時,在需求獲取解決,也沒有明確的了解系統(tǒng)的性能指標等非功能性需求。主要原因在于項目開發(fā)商之前沒有大規(guī)模業(yè)務系統(tǒng)開發(fā)的經(jīng)驗,對于非功能性需求沒有足夠的重視;同時,在測試階段,也沒有對于系統(tǒng)負載和性能做過測試。
因此,在項目交付以后,由于舊系統(tǒng)數(shù)據(jù)遷移后,數(shù)據(jù)量有了很大的增長,同時,在秋季的定購高峰中,有大量的并發(fā)用戶訪問,出現(xiàn)了下列問題:
數(shù)據(jù)庫死鎖;
大量數(shù)據(jù)計算與顯示頁面速度很慢,頁面要經(jīng)過5~10分鐘才能夠完全顯示;
上述兩種情況在少量負載的單元測試和集成測試中是不可能出現(xiàn)的。
教訓二:對于企業(yè)應用系統(tǒng),尤其是業(yè)務系統(tǒng),沒有切實注意負載、性能等非功能性需求。
效率與設計:在J2EE中,已經(jīng)成功的運用了很多設計模式的思想,為系統(tǒng)的開發(fā)提供了一個很好框架。但是,在項目的架構設計中,除了考慮可維護性、可復用性等問題以外,還要考慮代碼執(zhí)行效率的問題[5]。
隨著計算機硬件技術的發(fā)展,"莫爾定律"被一再的驗證,系統(tǒng)硬件的價格逐漸降低。對于很多使用J2EE架構或者JAVA技術的項目來說,解決性能與效率問題的解決方案就是增加硬件方面的投入。而實際上,軟件開發(fā)過程中優(yōu)劣算法之間的差距是靠硬件的投入平衡不了的。
該項目在系統(tǒng)維護期間,對代碼進行走查,修改了很多對于性能有影響的語句;同時,在框架設計中,尤其是數(shù)據(jù)庫操作方法,利用Cache原理,從一定程度上解決了性能的問題。
教訓三:系統(tǒng)框架設計只考慮面向對象和可維護性,沒有在完美的設計與高效率的代碼之間做出權衡。
數(shù)據(jù)庫設計:JAVA是純粹的面向對象語言,利用J2EE開發(fā)的項目,也強調(diào)首先進行OOAD的分析,首先有對象,然后再有數(shù)據(jù)庫的設計。DBA在項目中的作用,已經(jīng)遠遠沒有傳統(tǒng)的結構性編程中重要。而實際情況卻是遠非如此:大部分的業(yè)務系統(tǒng),如果要對系統(tǒng)的性能做出優(yōu)化,對數(shù)據(jù)庫層或者SQL語句進行優(yōu)化是關鍵的步驟之一。
對于這個PRM系統(tǒng),在數(shù)據(jù)庫的設計上并沒有經(jīng)過DBA的審查就開始進行開發(fā);而在性能問題出現(xiàn)以后,客戶增加了512M的內(nèi)存,也沒有請求DBA對Oracle的參數(shù)做相應的調(diào)整,造成了很大的資源浪費。
在項目維護過程中,依靠DBA的幫助,開發(fā)商對于數(shù)據(jù)庫系統(tǒng)參數(shù)、索引、存儲過程和SQL語句都做了一定的調(diào)整,這對于系統(tǒng)性能的提高起了很大的作用。
教訓四:在面向對象的軟件系統(tǒng)構建中,忽視數(shù)據(jù)庫設計以及DBA的重要作用。
客戶參與:在傳統(tǒng)的軟件開發(fā)過程中,一般情況下,客戶在簽訂合同后,項目交付前是很少有機會看到系統(tǒng)的,這樣就造成了系統(tǒng)交付后,客戶抱怨很多的情況;而在以XP為代表的敏捷軟件開發(fā)方法中,強化了客戶在軟件開發(fā)中的重要作用,XP更是提出了"現(xiàn)場客戶"的實踐,將客戶作為項目小組的一員,客戶對于項目的發(fā)布計劃、內(nèi)容和優(yōu)先級等方面有絕對的控制權。
對于這個PRM項目,由于客戶的原因,不可能采取"現(xiàn)場客戶"的實踐,但是,開發(fā)商的BD對于該客戶十分熟悉,完全可以作為客戶代表參與到項目中來,因此,開發(fā)商將客戶經(jīng)理作為項目組的一員。
實際情況是:開發(fā)過程中,客戶經(jīng)理由于業(yè)務拓展的原因,并沒有在項目上分配多少時間進行審查;而客戶在交付前也沒有花費很多的時間研究系統(tǒng),也沒有提交很多的反饋報告。在系統(tǒng)交付出現(xiàn)性能等問題后,客戶經(jīng)理與開發(fā)人員一起對于系統(tǒng)需求進行審查,提出了很多有參考性的意見。如果從一開始,就強化"現(xiàn)場客戶"的最佳實踐,就可以很早發(fā)現(xiàn)問題。
教訓五:客戶或者客戶經(jīng)理對于項目的參與力度不夠。
四、 結論
在基于J2EE的企業(yè)應用項目開發(fā)中,要注意以下問題:
權衡系統(tǒng)設計與性能指標,關注非功能性需求;
采取敏捷軟件開發(fā)過程,關注人(客戶和開發(fā)人員)在項目實施中的重要作用,如果可以的話,聯(lián)合實施XP的所有實踐;
五、 參考文獻
[1] Agile Software Development Alistair Cockburn
[2] Extreme Programming Explained - Embrace Change Kent Beck
[3] Software Verification and Validation for Practitioners and Managers Steven R. Rakitin
[4] The Mythical Man-Month Frederick P. Brooks Jr.
[5] Expert One-To-One J2EE Design and Development Rod Johnson
作者簡介:
曲俊生,某咨詢公司資深顧問。有近5年的軟件開發(fā)經(jīng)驗和2年的項目管理實踐。目前他的研究與開發(fā)興趣在J2EE, XP, TDD 以及Design Pattern。目前居住在上海,喜歡爬山、旅游等休閑活動,你可以通過junshengqu@yahoo.com.cn與他聯(lián)系。
(責任編輯:admin)
頂一下
(0)
0%
踩一下
(0)
0%
相關內(nèi)容
最新內(nèi)容
推薦內(nèi)容