本文以一个PRM项目为例, 探讨了目前国内软件开发企业在软件开发过程中,尤其是企业应用系统项目开发中,面临的问题以及如何利用敏捷软件开发方法的解决方案。
一、 项目与公司背景
该项目是一个PRM (Partner Relationship Management)系统,为世界著名的快速消费品品牌在中国大陆的合作伙伴提供订单管理以及其它辅助功能。该系统原来是基于PHP实现的,已经运行将近2年的时间,但是由于系统功能问题,需要对系统进行重新开发,新的系统基于J2EE框架实现。
项目预期情况如下:
项目开始 http://www.csai.cn 2002年7月1日
预期交付 http://www.csai.cn 2002年9月1日
项目金额: 70万RMB
项目开发商是亚洲领先的电子商务解决方案供应商,在J2EE架构的项目执行方面有丰富的经验,结合RUP与Web Software Engineering形成了自己的一套电子商务项目实施方法论,并在多个项目中成功进行实施。
二、 项目实施情况
项目由于客户预算等原因,原有的软、硬件系统继续使用,同时,应用系统平台也采用开源项目。
项目部署时的系统情况如下:
- 硬件:
- 操作系统: Solaris
- 主频: 400M
- 内存: 1G
- 硬盘: 20G
- 应用平台:
- Web服务器: Apache 1.3.21
- 应用服务器: Tomcat 4.0.6
- 数据库服务器: Oracle 8.1.7
项目人员配置与项目规模:
- 项目团队
- 项目经理: 1
- 技术经理: 1(兼)
- 客户经理: 1
- 开发人员: 4
- 测试人员: 2
- HTML人员: 1(兼)
- 项目规模
- Use Case: 32
- 代码行数: 65000
- JSP页面: 198
项目真实执行情况:
- 开始日期: 2002/7/1
- 交付日期: 2002/9/2
- 验收日期: 2003/5/8
- 维护 http://www.csai.cn 230 人小时
- 目前项目盈利: 20000
目前,项目由于性能问题,仍然没有验收,维护时间日益增长,目前仍然有30万左右的尾款没有收到;更为严重的是,目前项目开发商正在投标的另一快速消费品行业著名客户的合作伙伴与该客户有很大的重叠,因此,对于潜在项目的招标造成一定的影响。
三、 经验与教训
从项目规模中可以看出,该项目的时间还是比较紧张的;另外一方面,项目交付是在合同规定日期之前完成,而且通过了所有的功能测试。从一定意义上的讲,项目的开发是取得了一定的成功的。
在项目开发前,项目开发商已经通过其它项目,实施了以XP为代表的敏捷软件开发方法的部分最佳实践,并取得了很大的成功。因此,在该项目的执行过程中,项目开发商继续采用了XP的部分实践以及其它软件开发方法中的推荐做法:
每日晨会:在项目实施过程中,每天早晨开发小组都要参加一个持续15分钟左右的会议,由项目经理主持,听取每个成员的进度,并根据进展情况,对于进度和资源进行调整。
由于会议是每天进行的,PM很容易从中获得真实的项目情况-"掀开地毯下面的东西",从而对风险有了较好的控制。
交叉审核:项目组在最初的时候原本是想采取"成对编程"的实践,但是没有获得物理和管理上的支持,因此,只能采取交叉审核的方式进行。
需求获取:由PM和一名对于原有系统较熟悉的开发人员进行需求获取和SRS (Software Requirement Specification) 的撰写。技术经理和其它开发人员进行需求的审核。
分析与设计:由一名开发人员进行系统框架的设计,其它人员进行审核;在系统框架设计进行过程中,由于系统去除订单处理以外的其它部分比较独立,因此,将其它模块分配给开发人员,而将核心部分交与技术经理进行分析与设计。开发人员在每个迭代周期内,都会在分析与设计做完后,每2人一组进行审核。
编码:每天下班前,2人一组,对对方的代码进行Review,发现问题及时解决。代码Review的时候,语法与规则的检查,通过Check Style的工具进行;开发人员将审查的重点放在功能实现与性能优化等方面。
测试:在需求文档形成以后,2个测试人员分布编写分配模块的Test Case;而在具体测试的时候,两人交叉测试对方的模块和更新文档。
在系统开发Verification的各个阶段,都有Check List,详细的信息请查看参考文献。
测试先行:测试在软件开发中的重要作用已经得到了越来越多的重视,但是,由于习惯势力的影响和对于"Test-Driven Development"的不熟悉,开发小组并没有实施完全意义上的测试先行。
对于系统框架的核心类设计过程中,项目小组采取了TDD的方式进行开发。在后续的系统开发中,每个开发人员在进行开发前,首先要完成一个功能测试 ( Function Test ) 列表,将要完成的Use Case中的主要业务逻辑以及关联逻辑都要罗列出来,在提交测试人员进行集成测试之前,开发人员需要保证完成Function List中的所有选项。
在每个开发人员的模块完成并通过个人的功能测试后,测试人员进行集成测试,同时编写测试脚本,并通过自动测试工具 (Rational Robot) 进行记录。每天下班之前,测试人员会启动测试工具,进行回归测试。在第二天向PM和技术经理提交测试报告并将Bug提交至Bug Trace系统(Rational Clear Quest),由PM进行Bug的分发。每个开发人员需要在下一个迭代周期完成前,修正前一个迭代内分配的Bug。
持续集成:在测试先行的基础上,开发一组平均每天都会进行已经完成模块与以后系统的集成。集成由专门的人员,在开发人员将已经通过功能测试的源码Check in到源码控制系统 (ClearCase) 中以后进行,在部署应用结束以后,通知测试人员进行集成测试。
小步发布:项目有专门的测试与发布服务器,每天都有集成的系统在运行和接受测试。由于没有现场客户,对于已经发布的系统,是由"客户领域专家"(这个项目是由Business Development人员来充当这个角色)来进行审查的。他对于系统的意见和发现的问题,在经过PM和技术经理审核后,进入ClearQuest,分配给开发人员进行修改。
由于项目一开始就注意组织内部以及与客户的沟通和交流,同时采用了很多敏捷软件开发过程的实践,项目如期交付使用。
项目在交付以后,最初的两个订货季节没有出现功能与性能上的问题。但是,由于合同中有数据迁移的条款,在项目交付2月后,项目开发商将旧应用系统中的数据导入新系统以后,在下一个大的订货季节中,持续的出现性能上的问题。在代码修改和硬件环境提高以后,系统性能目前获得了一定的改善。
从项目验收日期的日益推迟中,我们可以看出,该项目还是有很多地方做的不够,例如:
系统二次开发效应:"第二个系统效应"是Brooks在《人月神话》中提出的一个普遍的问题,一般而言,第二个系统会倾向于过分设计。
对于这个项目而言,没有犯这个错误,却发生了另外一种情况:旧系统中,对于订单信息以及产品信息的展示,不管是多是少(系统页面最多显示上千条记录),都是在一个页面中显示。这对于没有明显的层次结构,直接在Script中调用数据库记录的PHP来说,性能还是可以接受的。但是,新系统的设计中客户提出考虑系统用户习惯一致性的问题,就照搬了旧系统的页面设计;同时,在架构设计上,对于这种页面显示大量数据的情况,也没有给予充分的考虑,为后来的性能问题,埋下了伏笔。
教训一:没有考虑新平台的影响,照搬旧系统的功能以及页面设计。
非功能性需求:项目合同中主要描述的是系统功能性的需求,而没有非功能性需求的规定;同时,在需求获取解决,也没有明确的了解系统的性能指标等非功能性需求。主要原因在于项目开发商之前没有大规模业务系统开发的经验,对于非功能性需求没有足够的重视;同时,在测试阶段,也没有对于系统负载和性能做过测试。
因此,在项目交付以后,由于旧系统数据迁移后,数据量有了很大的增长,同时,在秋季的定购高峰中,有大量的并发用户访问,出现了下列问题:
数据库死锁;
大量数据计算与显示页面速度很慢,页面要经过5~10分钟才能够完全显示;
上述两种情况在少量负载的单元测试和集成测试中是不可能出现的。
教训二:对于企业应用系统,尤其是业务系统,没有切实注意负载、性能等非功能性需求。
效率与设计:在J2EE中,已经成功的运用了很多设计模式的思想,为系统的开发提供了一个很好框架。但是,在项目的架构设计中,除了考虑可维护性、可复用性等问题以外,还要考虑代码执行效率的问题[5]。
随着计算机硬件技术的发展,"莫尔定律"被一再的验证,系统硬件的价格逐渐降低。对于很多使用J2EE架构或者JAVA技术的项目来说,解决性能与效率问题的解决方案就是增加硬件方面的投入。而实际上,软件开发过程中优劣算法之间的差距是靠硬件的投入平衡不了的。
该项目在系统维护期间,对代码进行走查,修改了很多对于性能有影响的语句;同时,在框架设计中,尤其是数据库操作方法,利用Cache原理,从一定程度上解决了性能的问题。
教训三:系统框架设计只考虑面向对象和可维护性,没有在完美的设计与高效率的代码之间做出权衡。
数据库设计:JAVA是纯粹的面向对象语言,利用J2EE开发的项目,也强调首先进行OOAD的分析,首先有对象,然后再有数据库的设计。DBA在项目中的作用,已经远远没有传统的结构性编程中重要。而实际情况却是远非如此:大部分的业务系统,如果要对系统的性能做出优化,对数据库层或者SQL语句进行优化是关键的步骤之一。
对于这个PRM系统,在数据库的设计上并没有经过DBA的审查就开始进行开发;而在性能问题出现以后,客户增加了512M的内存,也没有请求DBA对Oracle的参数做相应的调整,造成了很大的资源浪费。
在项目维护过程中,依靠DBA的帮助,开发商对于数据库系统参数、索引、存储过程和SQL语句都做了一定的调整,这对于系统性能的提高起了很大的作用。
教训四:在面向对象的软件系统构建中,忽视数据库设计以及DBA的重要作用。
客户参与:在传统的软件开发过程中,一般情况下,客户在签订合同后,项目交付前是很少有机会看到系统的,这样就造成了系统交付后,客户抱怨很多的情况;而在以XP为代表的敏捷软件开发方法中,强化了客户在软件开发中的重要作用,XP更是提出了"现场客户"的实践,将客户作为项目小组的一员,客户对于项目的发布计划、内容和优先级等方面有绝对的控制权。
对于这个PRM项目,由于客户的原因,不可能采取"现场客户"的实践,但是,开发商的BD对于该客户十分熟悉,完全可以作为客户代表参与到项目中来,因此,开发商将客户经理作为项目组的一员。
实际情况是:开发过程中,客户经理由于业务拓展的原因,并没有在项目上分配多少时间进行审查;而客户在交付前也没有花费很多的时间研究系统,也没有提交很多的反馈报告。在系统交付出现性能等问题后,客户经理与开发人员一起对于系统需求进行审查,提出了很多有参考性的意见。如果从一开始,就强化"现场客户"的最佳实践,就可以很早发现问题。
教训五:客户或者客户经理对于项目的参与力度不够。
四、 结论
在基于J2EE的企业应用项目开发中,要注意以下问题:
权衡系统设计与性能指标,关注非功能性需求;
采取敏捷软件开发过程,关注人(客户和开发人员)在项目实施中的重要作用,如果可以的话,联合实施XP的所有实践;
引用
作者简介:
曲俊生,某咨询公司资深顾问。有近5年的软件开发经验和2年的项目管理实践。目前他的研究与开发兴趣在J2EE, XP, TDD 以及Design Pattern。目前居住在上海,喜欢爬山、旅游等休闲活动,你可以通过junshengqu@yahoo.com.cn与他联系。
分享到:
相关推荐
《中国联通PRM系统规范》是中国联通BSS3.0架构中的一个重要组成部分,主要涉及合作伙伴管理系统的业务流程和技术标准。PRM,即Partner Relationship Management,是企业用来管理与合作伙伴关系的一种信息技术解决...
PRM(Plant Resource Manager)是横河电机提供的一种工厂资源管理系统,旨在实现工厂智能化和科学化管理。该系统可以管理 FF 和 HART 两种不同协议的设备,并提供高效的设备维护和管理功能。 PRM 系统的主要特点是...
PRM系统的结构主要由三个部分组成: * PRM现场通讯服务器 * PRM数据服务器 * PRM用户端 PRM现场通讯服务器提供了开放的OPC接口功能,支持FOUNDATION Fieldbus(FF)和HART协议的智能数据,提供了强大的设备管理和...
PRM文件是Microchip公司16位微控制器系列HCS12(MC9S12)的一种特定格式的编程资源文件。它主要用于描述和配置MC9S12XS128这款高性能微控制器的寄存器映射、中断向量、外围模块功能等关键参数。在深入理解MC9S12XS...
压缩包内的文件包括"prm.bat"和"prm.sh",这两个脚本文件分别用于Windows和Linux环境下的启动操作,方便用户在不同的操作系统上快速运行PRM-DUL。"prm.jar"是Java可执行文件,它是PRM-DUL的核心部分,负责执行数据...
PRM算法的基本思想是构建一个包含起点和目标点的随机样点集合,然后在这组样点之间建立边,形成一个稀疏图。机器人可以在这个图中寻找从起点到目标点的最短路径。下面将详细解释PRM算法的核心步骤以及MATLAB代码中的...
文档提到了一种多媒体投影仪,型号为PRM-35,同时还包括PRM-35A、PRM-35C、PRM-35AV1以及PRM-35CV1版本。这些信息指出了产品的具体型号以及可能的变种,这对于用户了解自己的设备型号非常有帮助。此外,文档中提到了...
PRM(Peripheral Register Manual)是飞思卡尔为这些单片机提供的一个重要参考文档,它详细阐述了硬件外设寄存器的结构、功能及使用方法。本文将结合"prm.zip"压缩包中的"prm.c"文件,深入解析AC系列单片机的PRM使用...
本应用笔记讨论使用Vicor之V·I晶片预稳压及电压转换模块的设计习要以符合功率系统上单个系统要求低电压、多路电流及多个电压的挑战。Vicor的V·I晶片能顾及这些挑战。实行V·I晶片方案的两个主要组件是预稳压模块...
main.m是传统PRM和改进PRM的100次仿真对比实验,其中传统PRM的采样点数k分别为45、90 tradition_PRM.m是传统PRM算法 conrner_PRM.m是基于Shi-Tomasi角点检测的改进PRM算法 bmp图片是假定的地图 对于路径的平滑...
总的来说,安装Zabbix PRM组件是一项涉及多个步骤的任务,包括安装和配置各种组件,以及解决依赖关系。确保遵循官方文档或者可靠的教程进行操作,以确保系统稳定运行。正确配置和使用Zabbix,可以帮助企业实现高效、...
PRM,即Oracle DUL(Data Utility Library)与图形用户界面(GUI)的结合,为数据库管理员提供了一种强大的恢复工具。 Oracle DUL是Oracle公司提供的一个开源命令行工具集,用于处理数据库的物理层操作,如数据文件...
总的来说,这个"RHEL5 gcc软件包prm"是为了解决RHEL5用户在安装GCC时可能出现的依赖问题,提供了一站式的解决方案。通过使用这个集成包,用户可以更轻松地搭建开发环境,进而编写、编译和调试C和C++程序。
CJ1W-PRM21是一款由OMRON公司生产的PROFIBUS通讯主站单元,主要应用于工业自动化领域。该操作手册提供了一份详细的用户指南,用于指导用户如何正确安装、配置和使用CJ1W-PRM21模块。在深入了解这款模块的技术细节和...
【标题】"dec_prm.rar" 是一个PRM文件,其中包含了C语言编写的射击小游戏源代码。PRM在这里可能是指项目或者程序的简写,它通常用于标识或组织特定的开发工作。 【描述】提到这个小游戏是用C语言编写的,C语言是一...
在PRM(Probabilistic Roadmap)路径规划中,先构建一个离散的节点网络,然后寻找这些节点之间的连接,形成一条路径。PRM和RRT的主要区别在于,RRT是连续地生成和扩展树,而PRM则是在整个配置空间中预先随机选择一定...