软件项目的管理流程

软件项目的管理流程,第1张

导语:关于软件项目的管理流程,相关人员来了解一下吧。下面是我收集整理的软件项目管理流程,供各位阅读和参考。

一、     风险评估

软件项目风险是指在整个项目周期中所涉及的成本预算、开发进度、技术难度、经济可行性、安全管理等各方面的问题,以及由这些问题而对项目所产生的影响。项目的风险与其可行性成反比,其可行性越高,风险越低。软件项目的可行性分为经济可行性、业务可行性、技术可行性、法律可行性等四个方面。而软件项目风险则分为产品规模风险、需要风险、相关性风险、管理风险、安全风险等六个方面:

1      产品规模风险

项目的风险是与产品的规模成正比的,一般产品规模越大,问题就越突出。尤其是估算产品规模的方法,复用软件的多少,需求变更的多少等因素与产品风险息息相关:

(1)  估算产品规模的方法

(2)  产品规模估算的信任度

(3)  产品规模与以前产品规模平均值的偏差

(4)  产品的用户数

(5)  复用软件的多少

(6)  产品需求变更的多少

2      需求风险

很多项目在确定需求时都面临着一些不确定性。当在项目早期容忍了这些不确定性,并且在项目进展过程当中得不到解决,这些问题就会对项目的成功造成很大威胁。如果不控制与需求相关的风险因素,那么就很有可能产生错误的产品或者拙劣地建造预期的产品。每一种情况对产品来讲都可能致命的,这些的风险因素有:

(1)  对产品缺少清晰的认识

(2)  对产品需求缺少认同

(3)  在做需求分析过程中客户参与不够

(4)  没有优先需求

(5)  由于不确定的需要导致新的市场

(6)  不断变化需求

(7)  缺少有效的需求变化管理过程

(8)  对需求的变化缺少相关分析等

3      相关性风险

许多风险都是因为项目的外部环境或因素的相关性产生的。控制外部的相关性风险, 能缓解策略应该包括可能性计划,以便从第二资源或协同工作资源中取得必要的组成部分,并觉察潜在的问题,与外部环境相关的因素有:

(1)  客户供应条目或信息

(2)  交互成员或交互团体依赖性

(3)  内部或外部转包商的关系

(4)  经验丰富人员的可得性

(5)  项目的复用性

4      技术风险

软件技术的飞速发展和经验丰富员工的缺乏,意味着项目团队可能会因为技巧的原因影响项目的成功。 在早期,识别风险从而采取合适的预防措施是解决风险领域问题的关键,比如:培训、聘请顾问以及为项目团队招聘合适的人才等。关于技术主要有下面这些风险因素:

(1)  缺乏培训

(2)  对方法、工具和技术理解的不够

(3)  应用领域的经验不足

(4)  对新的技术和开发方法应用不熟悉

5      管理风险

尽管管理问题制约了很多项目的成功,但是不要因为风险管理计划中没有包括所有管理活动而感到惊奇。在大部分项目里,项目经理经常是写项目风险管理计划的人,他们有先天性的不足——不能检查到自己的错误。因而,使项目的成功变得更加困难。如果不正视这些棘手的问题,它们就很有可能在项目进行的某个阶段影响项目本身。当我们定义了项目追踪过程并且明晰项目角色和责任,就能处理这些风险因素:

(1)  计划和任务定义不够充分

(2)  对实际项目状态不了解

(3)  项目所有者和决策者分不清

(4)  不切实际的承诺

(5)  不能与员工之间的进行充分地沟通

6      安全风险

软件产品本身是属于创造性的产品,产品本身的核心技术保密非常重要。但一直以来,我们在软件这方 面的安全意识比较淡薄,对软件产品的开发主要注重技术本身,而忽略了专利的保护。软件行业的技术人员流动是很普遍的现象,随着技术人员的流失、变更,很能会导致产品和新技术的泄密,致使我们的软件产品被它公司窃取,导致项目失败。而且在软件方面关于知识产权的认定目前还没有明确的一个行业规范,这也是我们 软件项目潜在的风险。

7      回避风险的方式

(1)  以开发方诱导能保证需求的完整,使需求与客户的真实期望高度一致。再以书面方便形成《用户需求》这一重要的文档,避免疏漏造成的损失在软件系统的后续阶段被逐步地放大。

(2)  设立监督制度,项目开发中任何较大的决定都必须有客户参与进行的,在该项目中项目监督由项目开发中的质量监督组来实施。

(3)  需求变更需要经过统一的负责人提出,并且要用户需求的审核领导认可,需求变更应该是定期而不是随时的提出,而且开发方应该做好详细的记录,让客户了解需求变更的实际情况。

(4)  控制系统的复杂程度,过于简单的系统结构,对用户来使用比例会有明显的折扣,甚至造成软件寿命过短。反之,软件结构的过于灵活和通用,必然引起软件实现的难度增加,系统的复杂度会上升,这又会在实现和测试阶段带来风险。适当控制系统的复杂程度有利于降低开发的风险。

(5)  从软件工程的角度看,软件维护费用约占总费用的55%~70%,系统越大,该费用越高。对系统可维护性的轻视是大型软件系统的最大风险。在软件漫长的运营期内,业务规则肯定会不断发展,科学的解决此问题的做法是不断对软件系统进行版本升级,在确保可维护性的前提下逐步扩展系统。

(6)  设定应急计划,每个开发计划都至少应该设定一个应急预案去应对出现突发情况和不可遇知的风险。

二、     成本预算

1      成本预算方式

(1)  自上而下的预算方法

自上而下的预方法主要是依据上层、中层项目管理人员的管理经验进行判断,对构成项目整体成本的子项目成本进行估计,并把这些判断估计的结果传递给低一层的管理人员,在此基础上由这一层的管理人员对组成项目的子任务和子项目的成本进行估计,然后继续向下一层传递他们的成本估计,直到传递到最低一层。

使用此预算方式,在上层的管理人员根据他们的经验进行的费用估计分解到下层时,可能会出现下层人员认为上层的估计不足以完成相应任务的情况。这时,下层人员不一定会表达出自己的真实观点,不一定会和上层管理人员进行理智地讨论,从而得出更为合理的预算分配方案。在实际中,他们往往只能沉默地等待上层管理者自行发现问题并予以纠正,这样往往会给项目带来诸多问题。

自上而下更适用于项目启动的前期,与真实费用相差在30% ~ 70%之间。

Scrum使用自上而下的成本预算方式,它不会立即精确地确定成本,而是以最大限度容纳客户对未来产品要求所产生的变更。

(2)  自下而上的预算方法

自下而上方法要求运用WBS(Work Breakdown Structure,工作分解结构)对项目的所有工作任务的时间和预算进行仔细考察。最初,预算是针对资源(团队成员的工作时间、硬件的配置)进行的,项目经理在此之上再加上适当的间接费用(如培训费用、管理费用、不可预见费等)以及项目要达到的利润目标就形成了项目的总预算。自下而上的预算方法要求全面考虑所有涉及到的工作任务,更适用于项目的初期与中期,它能准备地评估项目的成本,与真实费用相差在5% ~ 10%之间。

注解:WBS

WBS是面向提交成果对项目的分解,从提交成果的列表可以确定每个提交成果需要执行的活动。Scrum会对WBS进一步细化,把一个迭代分解为一个或多个的工作包,再把工作包分解为细小的开发任务(一般开发任务的开发周期在15个工作小时以内)。

2      确定项目支出

总体成本预算就是结合下列多个成本预算方式综合计算的开发成本:

(1)  零基数预算

在成本预算的初期应该使用零基数的计算原则,而不可以使用类似于:以上一年总体费用加上20% 这样粗略的方式计算项目成本。

(2)  软硬件成本、物品成本

物品成本是指类似于:服务器(RAM 硬盘 CPU NIC卡 RAID簇)成本、维护成本、机房租金、光纤通讯成本、软件成本等的成本。

计算成本时需要考虑组装硬盘需时的长短,技术人员需要具备的质素,产品供应商能否提供保证质量,管理时是否需要额外的管理人员这些多方因素。

(3)  软件许可证成本

(4)  外包成本

当使用类似:视频、短信、移动电信类服务、门户网站等子项目时可以考虑以外包形式完成,以降低开发成本。

(5)  人力资源成本

计算人力资源成本时应该使用以最高和最低的工作效率估算平均效率的方式,计算出人力资源的平均成本。

(6)  维修保养成本

三、     客户沟通的过程

从客户沟通的方向出发来看,软件项目可分为:需求识别、方案定制、项目实施、项目结束等4个不同的阶段,各个阶段都具有不同的沟通重点。

1  需求识别阶段

(1)  文本沟通

在需求识别的前期,应该通过问卷、原型展示、界面展示、逻辑处理展示、准化文档模板等方式进行全方位多角度的分析,随时将不明确之处反馈给客户,以期待客户解答。并以文本记录的方式建立需要分析书,并要求客户审核需求分析书,以达到需要分析与客户的真实期望高度一致的结果。

(2)  业务逻辑沟通

在进行业务沟通时,应该了解客户的行业语言,以促进业务分析的过程,越过应用需求和开发之间的鸿沟。沟通过程提倡以草图或者可视信息化的方式进行, 针对不同层面的企业用户提供最适合的 *** 作界面。以多角度的方式思考问题,要抓住需求重点,尤其是客户方领导所关注的创新类和实用类需求。

(3)  需求变更的规范化管理

需求变更在软件开发类项目中是可以理解的,但必须对需求变更做好规范化的管理,以避免出现需求无止境变更的风险。需求变更必须由统一的负责人提出,并且由用户需求的审核领导者认可。需求变更的提出应该是定期而不是随时的,开发方应该做好详细的文本记录,让客户了解需求变更的实际情况和开发方为之所付出的成本代价。

2  方案定制阶段

该阶段项目的主要任务是与客户共同制定一个以前期明确的需求、双方的资源、项目开始的阶段、实施的时间约定、项目费用限制等为基础的具有可 *** 作性的项目计划,从本阶段开始争取客户全面参与项目的管理,并以双方的共同利益考虑项目实施的具体计划与风险规避。

3  项目实施阶段

在该阶段,软件项目团队应该与客户共同领导项目的实施。同时,项目团队应实时评估客户满意度,并通过持续改进的方式提高客户满意度,还应要求客户参加必要的培训,以及在必要时检查项目产品。在出现客户的需求变更前,应主动与客户沟通交流,使客户充分了解项目的每个环节,以及变更带来的影响,减少需求变更。如果出现客户需求变更,应与客户一起共同解决由变更引起的成本、进度、质量变化。

4  结束阶段

该阶段主要进行项目成果的移交,并把系统交付给维护人员,帮助客户实现商务目标,结清各种款项。完成这些工作后应该进行项目评估,审核此项目的成果并总结项目经验。

5  售前人员注意事项

在产品型项目作为开发成果时,相关销售人员应该注意:对产品的推销不应该过分承诺。如果过分承诺,会给后续的项目实施带来困难;一旦承诺没有兑现,也会降低客户满意度,影响今后合作。如果有附加承诺,一定要以文本形式记录,让实施项目经理知晓并传达给项目组成员。

注解:在软件项目中,需要明确以下四种客户角色

A   要明确最终使用部门和用户,要去了解他们现有的工作方式,要让他们知道项目的目标框架,知道项目要解决他们的哪些困难,但绝对不是全部困难,这样可以较好的控制项目范围。

B   要明确需求的提出者,他或者他们要能够代表最终客户群体。提出产品需求的这类客户要具有一定的技术、业务能力和权威,能够真正代表最终客户团队的意愿和想法,最好有IT基础,能够用IT语言描述问题和需求,以利于双方的沟通、协作,避免产生歧义。

C   要明确做需求确认的中层领导,他要把握方向。软件开发项目是解决实际生产或者管理问题,同时 也是领导系统建设的具体实现,做需求确认的客户领导,既要了解高层领导的系统建设要点和方向,又要谙熟具体业务和生产管理实际。如果是这样的客户领导来把 握和决策,对企业软件开发项目的顺利进展作用非凡。

D   要明确谁来对成品提意见,谁来验收。项目验收环节,是项目的收尾环节,如果验收的人对项目初期的需求目标不了解,会从态度和产品实际使用效果上对验收产生负面的影响,对提供产品的企业关闭项目非常不利。根据实践总结,由需求提出人和确认人来做项 目的验收工作,能够促进项目的顺利完成,避免延期。

四、     需求分析

1     需求分析的过程

需求过程包括需求开发和需求管理2个部分:

(1)  需求开发就是对开发前期的管理,与客房的沟通过程,可以分为4个阶段:需求获取、需求分析、编写需求和需求验证。

(2)  需求管理:就是软件项目开发过程中控制和维持需求约定的活动。包括:变更控制、版本控制、需求跟踪、需求状态跟踪。

2      需求的层次

需求的层次包括:业务需求、用户需求、功能需求、非功能需求等4个方面。

3     需求开发阶段的重点

(1)  提取业务对象

业务对象是指系统使用的真实对象,例如一个供应链管理 (Supply Chain Management ,简称SCM) 业务对象主要包括:生产批发商、零售商、送货商、顾客多个层次。

(2)  提取业务流程

在了解业务逻辑的过程中,应该列举出所开发软件模块的各自职能,并细化每个工作流程,深入分析业务逻辑。

(3)  性能需求

在分析的前期应该注意客户对所开发软件的技术性能指标,如存储容量限制、运行时间限制、安全保密性等。

(4)  环境需求

环境需求是指软件平台运行时所处环境的要求,如硬件方面:机型、外部设备、数据通信接口;软件方面:系统软件,包括 *** 作系统、网络软件、数据库管理系统方面;使用方面:使用部门在制度上, *** 作人员上的技术水平上应具备怎样的条件。

(5)  可靠性需求

对所开发软件在投入运行后发生故障的概率,应该按实际的运行环境提出要求。对于重要的软件,或是运行失效会造成严重后果的软件,应提出较高的可靠性要求。

(6)  安全保密要求

在需求分析时应当在这方面恰当地做出规定,对所开发的软件给予特殊的设计,使其在运行中,其安全保密方面的性能得到必要的保证。

(7)  用户界面需求

为用户界面细致地规定到达的要求。

(8)  资源使用需求

开发的软件在运行时和开发时所需要的各种资源。

(9)  软件成本消耗与开发进度需求

在软件项目立项后,根据合同规定,对软件开发的'进度和各步骤的费用提出要求,作为开发管理的依据。

(10) 开发目标需求

预先估计以后系统可能达到的目标,这样可以比较容易对系统进行必要的补充和修改。

4      需求分析的任务

需求分析的主要任务是借助于当前系统的逻辑模型导出目标系统的逻辑模型,其流程如下:

(1)  确定对系统的综合需求(功能、性能、运行、扩充需求)

(2)  制作产品需求文档 (PRD)

(3)  分析系统的数据需求(概念模型、数据字典、规范化)

(4)  导出目标系统的详细的逻辑模型(数据流图、数据字典、主要功能描述)

(5)  开发原形系统

(6)  从PRD提取编制软件需求规格说明书(SRS)

注解:SRS格式

1引言  2系统概述(项目背景、系统目标、核心业务流程) 3术语说明  4系统结构(架构图、功能图)

5主体功能与业务逻辑(重点) 6接口需求(内部、外部接口、) 7网络总体设计(拓扑网络、主机、组网)

8运行环境(Linux、Windows、IIS、 WebLogic、Tomcat、OLAP、OLTP、JDK 80 、NET Framework 40等)

五、     面向对象程序设计(略)

1      设计原则

(1)  SRP单一职责链

每个类都应该只负责做一件事。

(2)  OCP开封闭合原则

软件的实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。

(3)  LSP替换原则

子类必须能替换他们的基类型。

(4)  DIP依赖倒置原则

高层模块不应该依赖于低层模块,二者都应该依赖于接口与抽象类。抽象不应该依赖于细节,细节应依赖于对象。

(5)  ISP接口隔离原则

不应该强迫客户依赖于并未使用的接口,而应该把胖接口分离。

2      实现UML建模

(1)  业务对象的提取

(2)  根据SRS、CRC等实现用况建模

(3)  实现业务顺序图

(4)  建立类图,根据用况图建立对象之间的关联

(5)  绘制活动图、实现协作图、状态图

六、     开发管理

1      建立项目计划

(1)  设计总体架构

针对系统的实施需要,采取适当的且成熟的框架结构。

(2)  控制可扩展度

扩展度过大,将提高系统的复杂程度,延长开发时间;扩展度过低,会直接影响系统的二次开发与维护。控制系统的可扩展性,能提高开发效率,降低系统维护的难度。

(3)  建立基础设施

合理分配部署软、硬件等基础设施所需要的时间与成本(例如:服务器的订购安装、光纤接入、软件平台订购)。

(4)  划分开发任务

利用WBS(Work Breakdown Structure,工作分解结构)对可交付结果进行分类与划分。每个项目都能划分为多个不同阶段,每个阶段又可以分为多个工作包(Work Package),工作包是WBS里最小的可交付结果,最后从工作包中分解出多个开发任务列表。

(5)  部署开发进度

一个项目应该按进度划分为多个开发阶段,每个阶段的开发周期一般在30~60个工作日以内。在此阶段内应该与客户举行协商会议,制定产品路线图,在开发过程中邀请客户积极参与并提出反馈意见。然后把该时段内的开发任务按照开发难度,依赖性,重要性等多方条件划分为多个迭代周期。

在Scrum 敏捷软件开发原则中,应该把每个迭代任务进一步细分为多个开发任务列表,再开发任务分配给组员各自负责,而开发时间应该控制在15个工作小时以内。如果开发时间超出15个工作小时,应该考虑把开发任务再度细化。开发任务建议应该由组员自主选择,而不要使用强制分配的方式。

(5)  测试项目成果

每个工作包都应该同步部署测试工作,提高项目的质量。对出错BUG的工作包应该由测试人员以文本方式记录,向开发人员展示错误所在,让开发人员及时进行修改。

2      管理开发团队

(1)  组建团队

按照工作任务与项目时间的前提条件建立团队,按团队职责分配人员,一般团队人数应该控制在8~12人之间。当团队人数超过15人时,应该考虑把团队分解成2个独立团队,负责不同的开发任务。

(2)  分配开发任务

在每个迭代周期内(一般是15~30个工作日),应该把每个工作包进一步细分为多个开发任务,再开发任务分配给组员各自负责,开发时间应该控制在15个工作小时以内。如果开发任务的开发时间超出15个工作小时,应该考虑把任务再度细化。而开发任务应该以自由选择的方式分配给每个组员。

(3)  监督开发进度

在迭代的前期举行一次会议,让组员了解开发的进展及流程,并以自主选择的方式分配开发任务。期间可使用Microsoft Project等工具记录开发流程的进展,在每个工作包完成开发后应该进行性功能的测试,并以文本方式记录测试结果。

每天举行一次15分钟的站立会议,让组员交待昨天已完成的开发任务,当天将要做的任务,与开发过程中所遇到的问题。并在每周末举行一次例行会议,交待总体进程。

在迭代末期举行一次冲刺会议,总结项目的进展,交行已完成的任务,回顾该迭代周期内所遇到的问题,为下一个迭代做好准备。

(4)  系统测试

对每个已完成的工作包进行适时的测试,保证系统质量与性能。对测试结果进行文本的记录,并把测试结果与绩效工资收入挂钩,并以真实数据计算组员的绩效收入。

(5)  解决开发中所遇到的问题

对开发人员进行前期培训,可适当按工作能力分配任务,指导组员的开发。当遇到问题时应该在当天的站立会议时即时提出,并在15个工作小时内解决所遇到的问题以防止问题进一步扩大。

3      监管产品质量

(1)  质量需要的是计划、设计而并非审查的。在产品建立的初级,必须与“质量保证”(QA)的部门进行协商,以正式文档的方式,决定恰当的质量策略和标准。

(2)  在开发过程中使用TDD(测试驱动开发)的模式,提高开发质量。测试人员应该以文本方式记录bug,并与开发人员共同工作的,把突出的缺陷演示给开发人员,以提高修改的效率。

(3)  在每个迭代的结束时进行一次产品效果的演示,从客户、使用者、高层领导中收集反馈信息。在团队内部举行评审会议,分析测试结果,了解产品性能,为下次迭代所需要做的改进做好计划。

4      修改项目计划

(1)  在产品需要识别阶段,应该以文档形式记录产品功能与开发流程,在开发计划需要修改时,应该与客户共同探讨,让客户了解计划修改对项目进度所造成的影响。

(2)  项目计划的修改应该由统一的负责人提出,并且由用户需求的审核领导者认可。需求变更的提出应该是定期而不是随时的。

(3)  计划的变更应该做好详细的文本记录,让客户了解需求变更的实际情况和开发方为之所付出的成本代价。

七、     产品交付

1      项目的后期审核

在项目开发最终完成后,对开发人员来说可算是放下工作的重担,但对项目经理来说这往往是项目的关键时刻。前期的风险评估、成本预算、需求分析、软件设计都是为了引导项目走向这一时刻,此时所有的目光都将投向项目管理人员。你可能发现大量而琐碎的工作将要在几个小时内完成,此刻项目经理更需要保持清醒与镇定,把最后的工作视为微型项目来对待。细致地对项目进行后期的审核,分析项目成果、项目团队的效率、可交付产品的价值,以此审核结果可作为项目管理经验总结的一部分。

2      质量评审

在项目交付前,应该把项目交给相关的“质量保证”(QA)部门进行质量评审,并邀请典型用户感受产品的质量。

3      项目的最终交付

正常情况下在项目的前期就会订立项目交付的协议,项目交付方式分为非正式验收与正式验收两种。一般在项目完成后都会先进行非正式验收,让客户体会项目的质量并提出反馈意见,最后在客户肯定产品质量后再以书面协议的形式进行正式的产品验收。

4      项目的最终报告

在项目的最后,应该制定项目的最终报告,此报告可以视为是对该项目一个记录,但报告不必包含项目的所有方面。一般最终报告应该包含以下方面:

(1)  最初引进项目时的初期项目视图

(2)  对该项目的价值评估及支持性信息

(3)  项目的范围

(4)  项目的开发流程及WBS

(5)  项目的会议记录

(6)  项目变更的报告及变更的理由

(7)  与项目相关的沟通过程文件

(8)  项目的审核报告与客户验收报告

(9)  项目成员的表现报告

(10) 项目的最终成果

1、按是否查看程序内部结构分为:

(1)黑盒测试(black-box

testing):只关心输入和输出的结果

(2)白盒测试(white-box

testing):去研究里面的源代码和程序结构

2、按是否运行程序分为:

(1)静态测试(static

testing):是指不实际运行被测软件,而只是静态地检查程序代码、界面或文档可能存在的错误的过程。

静态测试包括:

对于代码测试,主要是测试代码是否符合相应的标准和规范。

对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。

对于文档测试,主要测试用户手册和需求说明是否真正符合用户的实际需求。

(5)动态测试(dynamic

testing),是指实际运行被测程序,输入相应的测试数据,检查输出结果和预期结果是否相符的过程

3、按阶段划分:

(1)单元测试(unit

testing),是指对软件中的最小可测试单元进行检查和验证。

桩模块(stud)是指模拟被测模块所调用的模块,驱动模块(driver)是指模拟被测模块的上级模块,驱动模块用来接收测试数据,启动被测模块并输出结果。

(2)集成测试(integration

testing),是单元测试的下一阶段,是指将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部门。

集成测试就是用来检查各个单元模块结合到一起能否协同配合,正常运行。

(3)系统测试(system

testing),指的是将整个软件系统看做一个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。

系统测试的主要依据是《系统需求规格说明书》文档。

(4)验收测试(acceptance

testing),指的是在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序。

验收测试又分为a测试和beta测试,其中a测试指的是由用户、

测试人员、开发人员等共同参与的内部测试,而beta测试指的是内测后的公测,即完全交给最终用户测试。

4、黑盒测试分为功能测试和性能测试:

1)功能测试(function

testing),是黑盒测试的一方面,它检查实际软件的功能是否符合用户的需求。

包括逻辑功能测试(logic

function

testing)

界面测试(UI

testing)UI=User

Interface

易用性测试(usability

testing):是指从软件使用的合理性和方便性等角度对软件系统进行检查,来发现软件中不方便用户使用的地方。

兼容性测试(compatibility

testing):包括硬件兼容性测试和软件兼容性测试

2)性能测试(performance

testing)

软件的性能主要有时间性能和空间性能两种

时间性能:主要指软件的一个具体事务的响应时间(respond

time)。

空间性能:主要指软件运行时所消耗的系统资源。

软件性能测试分为:

一般性能测试:指的是让被测系统在正常的软硬件环境下运行,不向其施加任何压力的性能测试。

稳定性测试也叫可靠性测试(reliability

testing):是指连续运行被测系统检查系统运行时的稳定程度。

负载测试(load

testing):是指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性。

压力测试(stress

testing):是指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。(Validate

the

system

or

software

can

allowed

the

biggest

stress)

5、其他测试类型:

回归测试(regression

testing)是指对软件的新的版本测试时,重复执行上一个版本测试时的用例。(When

a

new

build

or

release

is

deployed,

repeat

all

the

test

cases

which

has

executed

in

the

last

build

or

release)

冒烟测试(smoke

testing),是指在对一个新版本进行大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。(validate

the

major

function

is

deployed

or

not

in

software

of

system

when

a

new

build

or

release

is

implement)

随机测试(random

testing),是指测试中所有的输入数据都是随机生成的,其目的是模拟用户的真实 *** 作,并发现一些边缘性的错误。(means

or

all

the

test

data

is

random,

to

validate

the

some

edge

bugs)

[编辑本段]基本信息

软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己的定义: 软件工程(1)、BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。 (2)、IEEE在软件工程术语汇编中的定义:软件工程是:1将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;2在1中所述方法的研究 (3)、FritzBauer在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。 目前比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。 (4)、《计算机科学技术百科全书》中的定义:软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。

[编辑本段]目标

软件工程的目标是:在给定成本、进度的前提下,开发出具有可修改性、有效性、可靠性、可理解性、可维护性、可重用软件工程性、可适应性、可移植性、可追踪性和可互 *** 作性并且满足用户需求的软件产品。追求这些目标有助于提高软件产品的质量和开发效率,减少维护的困难。下面分别介绍这些概念。 (1)可修改性(modifiablity)。容许对系统进行修改而不增加原系统的复杂性。它支持软件的调试与维护,是一个难以达到的目标。 (2)有效性(efficiency)。软件系统能最有效地利用计算机的时间资源和空间资源。各种计算机软件无不将系统的时/空开销作为衡量软件质量的一项重要技术指标。很多场合,在追求时间有效性和空间有效性方面会发生矛盾,这时不得不牺牲时间效率换取空间有效性或牺牲空间效率换取时间有效性。时/空折衷是经常出现的。有经验的软件设计人员会巧妙地利用折衷概念,在具体的物理环境中实现用户的需求和自己的设计。 (3)可靠性(reliability)。能防止因概念、设计和结构等方面的不完善造成的软件系统失效,具有挽回因 *** 作不当造成软件系统失效的能力。对于实时嵌入式计算机系统,可靠性是一个非常重要的目标。因为软件要实时地控制一个物理过程,如宇宙飞船的导航、核电站的运行,等等。如果可靠性得不到保证,一旦出现问题可能是灾难性的,后果将不堪设想。因此在软件开发、编码和测试过程中,必须将可靠性放在重要地位。 (4)可理解性(understandability)。系统具有清晰的结构,能直接反映问题的需求。可理解性有助于控制软件系统的复杂性,并支持软件的维护、移植或重用。 (5)可维护性(maintainability)。软件产品交付用户使用后,能够对它进行修改,以便改正潜伏的错误,改进性能和其他属性,使软件产品适应环境的变化,等等。由于软件是逻辑产品,只要用户需要,它可以无限期的使用下去,因此软件维护是不可避免的。软件维护费用在软件开发费用中占有很大的比重。可维护性是软件工程中一项十分重要的目标。软件的可理解性和可修改性有利于软件的可维护性。 (6)可重用性(reusebility)。概念或功能相对独立的一个或一组相关模块定义为一个软部件。软部件可以在多种场合应用的程度称为部件的可重用性。可重用的软部件有的可以不加修改直接使用,有的需要修改后再用。可重用软部件应具有清晰的结构和注解,应具有正确的编码和较低的时/空开销。各种可重用软部件还可以按照某种规则存放在软部件库中,供软件工程师选用。可重用性有助于提高软件产品的质量和开发效率、有助于降低软件的开发和维护费用。从更广泛的意义上理解,软件工程的可重用性还应该包括:应用项目的重用,规格说明(也称为规约)的重用,设计的重用,概念和方法的重用,等等。一般来说,重用的层次越高,带来的效益也就越大。 (7)可适应性(adaptability)。软件在不同的系统约束条件下,使用户需求得到满足的难易程度。适应性强的软件应采用广为流行的程序设计语言编码,在广为流行的 *** 作系统环境中运行,采用标准的术语和格式书写文档。适应性强的软件较容易推广使用。 (8)可移植性(portability)。软件从一个计算机系统或环境搬到另一个计算机系统或环境的难易程度。为了获得比较高的可移植性,在软件设计过程中通常采用通用的程序设计语言和运行环境支撑。对依赖于计算机系统的低级(物理)特征部分,如编译系统的目标代码生成,应相对独立、集中。这样,与处理机无关的部分就可以移植到其他系统上使用。可移植性支持软件的课重用性和课适应性。 (9)可追踪性(tracebility)。根据软件需求对软件设计、程序进行正向追踪,或根据程序、软件设计对软件需求进行逆向追踪的能力。软件可追踪性依赖于软件开发各个阶段文档和程序的完整性、一致性和可理解性。降低系统的复杂性会提高软件的可追踪性。软件在测试或维护过程中或程序在执行期间出现问题时,应记录程序事件或有关模块中的全部或部分指令现场,以便分析、追踪产生问题的因果关系。 (10)可互 *** 作性(interoperability)。多个软件元素相互通信并协同完成任务的能力。为了实现可互 *** 作性,软件开发通常要遵循某种标准,支持折衷标准的环境将为软件元素之间的可互 *** 作提供便利。可互 *** 作性在分布计算环境下尤为重要。 软件工程活动是“生产一个最终满足需求且达到工程目标的软件产品所需要的步骤”。主要包括需求、设计、实现、确认以及支持等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件体系结构,包括子系统、模块以及相关层次的说明、每一模块接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。支持活动包括修改和完善。伴随以上活动,还有管理过程、支持过程、培训过程等。

[编辑本段]过程

生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。

[编辑本段]原则

软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。软件工程的原则有以下四项软件工程师基本原则:

1)选取适宜开发范型

该原则与系统设计有关。在系统设计中,软件需求、硬件需求以及其他因素之间是相互制约、相互影响的,经常需要权衡。因此,必须认识需求定义的易变性,采用适宜的开发范型予以控制,以保证软件产品满足用户的要求。

2)采用合适的设计方法

在软件设计中,通常要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现,以达到软件工程的目标。

3)提供高质量的工程支持

“工欲善其事,必先利其器”。 在软件工程中,软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。

4)重视开发过程的管理

软件工程的管理,直接影响可用资源的有效利用,生产满足目标的软件产品,提高软件组织的生产能力等问题。因此,仅当软件过程得以有效管理时,才能实现有效的软件工程。 这一软件工程框架告诉我们,软件工程的目标是可用性、正确性和合算性;实施一个软件工程要选取适宜的开发范型,要采用合适的设计方法,要提供高质量的工程支撑,要实行开发过程的有效管理;软件工程活动主要包括需求、设计、实现、确认和支持等活动,每一活动可根据特定的软件工程,采用合适的开发范型、设计方法、支持过程以及过程管理。根据软件工程这一框架,软件工程学科的研究内容主要包括:软件开发范型、软件开发方法、软件过程、软件工具、软件开发环境、计算机辅助软件工程(CASE) 及软件经济学等。

[编辑本段]基本原理

自从1968年提出“软件工程”这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。美国著名的软件工程专家巴利·玻姆(Barry Boehm)综合这些专家的意见,并总结了美国天合公司(TRW)多年的开发软件的经验,于1983年提出了软件工程的七条基本原理。 玻姆认为,这七条原理是确保软件产品质量和开发效率的原理的最小集合。它们是相互独立的,是缺一不可的最小集合;同时,它们又是相当完备的。 人们当然不能用数学方法严格证明它们是一个完备的集合,但是可以证明,在此之前已经提出的100多条软件工程准则都可以有这七条原理的任意组合蕴含或派生。下面简要介绍软件工程的七条原理:

1、用分阶段的生命周期计划严格管理

这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。 玻姆认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。

2、坚持进行阶段评审

统计结果显示: 大部分错误是在编码之前造成的,大约占63%错误发现的越晚,改正它要付出的代价就越大,要差2到3个数量级。 因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。

3、实行严格的产品控制

开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。

4、采纳现代程序设计技术

从六、七时年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。

5、结果应能清楚地审查

软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限, 尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。

6、开发小组的人员应少而精

开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。 这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少的多; 当开发小组为N人时,可能的通讯信道为N(N-1)/2, 可见随着人数N的增大,通讯开销将急剧增大。

7、承认不断改进软件工程实践的必要性

遵从上述六条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,玻姆提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的 软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。

[编辑本段]方法学

软体工程的方法有很多方面的意义。包括专案管理,分析,设计,程序的编写,测试和质量控制。 软件工程师软体设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。 著名的重量级开发方法包括ISO9000,CMM,和统一软体开发过程(RUP)。 轻量级的开发过过程没有对大量正式文档的要求。着名的轻量级开发方法包括极限编程(XP)和敏捷流程(AgileProcesses)。 根据《新方法学》这篇文章的说法,重量级方法呈现的是一种防御型的姿态。在应用重量级方法的软体组织中,由于软体项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生恐惧感,不得不要求程式设计师不断撰写很多“软体开发文档”。而轻量级方法则呈现“进攻型”的姿态,这一点从XP方法特别强调的四个准则—“沟通、简单、反馈和勇气上有所体现。目前有一些人认为,重量级方法合于大型的软体团队(数十人以上)使用,而“轻量级方法”适合小型的软体团队(几人、十几人)使用。当然,关于重量级方法和轻量级方法的优劣存在很多争论,而各种方法也在不断进化中。 一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软体取决于很多因素,同时受到环境的制约。

[编辑本段]主要课程

外语、高等数学、线性代数、高等代数、电子技术基础、离散数学、计算机引论(C语言)、数据结构、C++程序设计、JAVA程序设计、Delphi程序设计、汇编语言程序设计、算法设计与分析、计算机组成原理与体系结构、数据库系统、计算机网络、软件工程、软件测试技术、软件需求与项目管理、软件设计实例分析、CMM/ISO9000等。 另外,还包括 *** 作系统、软件体系结构概论、设计模式、多媒体技术基础、UML建模、概率论、大学英语等,部分院校还会包括大学物理,工程制图,数值分析等。

[编辑本段]发展方向

敏捷开发(Agile Development)被认为是软体工程的一个重要的发展。它强调软体开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。 敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如CMM/PSP/TSP。 面向侧面的程序设计(Aspect Oriented Programming,简称AOP)被认为是近年来软体工程的另外一个重要发展。这里的方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。

[编辑本段]需求分析

软件工程中包含需求、设计、编码和测试四个阶段,其中需求工程是软件工程第一个也是很重要的一个阶段,本文以医院管软件工程需求分析理系统为例详细介绍了需求工程的构成和进行方法。 首先人们必须了解需求工程和其他项目过程的关系: 图1需求与其他项目过程的关系 软件需求包括三个不同的层次-业务需求、用户需求和功能需求-也包括非功能需求:业务需说明了提供给客户和产品开发商的新系统的最初利益,反映了组织机构或客户对系统、产品高层次的目标要求,它们在项目视图与范围文档中予以说明;用户需求文档描述了用户使用产品必须要完成的任务,这在使用实例文档或方案脚本说明中予以说明;功能需求定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了业务需求。 需求工程分为了需求开发和需求管理两个阶段:下面就以这两个阶段说明: 一,需求开发 需求开发又分为需求获取、需求分析、编写规格说明书和需求验证。以下列出和讲解分析常规的步骤,当然应按照项目的大小和特点等实际情况我们应该自己确定合适的步骤。 1.需求获取: 1)确定需求开发过程:确定需求开发过程确定如何组织需求的收集、分析、细化并核实的步骤,并将它编写成文档。对重要的步骤要给予一定指导,这将有助于分析人员的工作,而且也使收集需求活动的安排和进度计划更容易进行。 2)编写项目视图和范围文档:项目视图和范围文档应该包括高层的产品业务目标,所有的使用实例和功能需求都必须遵从能达到的业务需求。项目视图说明使所有项目参与者对项目的目标能达成共识。而范围则是作为评估需求或潜在特性的参考。 表1项目视图和范围文档的模板 a、1背景在这一部分,总结新产品的理论基础,并提供关于产品开发的历史背景或形势的一般性描述。 a、2业务机遇描述现存的市场机遇或正在解决的业务问题。描述商品竞争的市场和信息系统将运用的环境。包括对现存产品的一个简要的相对评价和解决方案,并指出所建议的产品为什么具有吸引力和它们所能带来的竞争优势。 a、3业务目标用一个定量和可测量的合理方法总结产品所带来的重要商业利润,把重点放在给业务的价值上。 a、4客户或市场需求描述一些典型客户的需求,包括不满足现有市场上的产品或信息系统的需求。提出客户目前所遇到的问题在新产品中将可能(或不可能)出现的阐述,提供客户怎样使用产品的例子。确定了产品所能运行的软、硬件平台。 a、5提供给客户的价值确定产品给客户带来的价值,并指明产品怎样满足客户的需要。 a、6业务风险总结开发(或不开发)该产品有关的主要业务风险,例如市场竞争、时间问题、用户的接受能力、实现的问题或对业务可能带来的消极影响。预测风险的严重性,指明你所能采取的减轻风险的措施。 b1项目视图陈述编写一个总结长远目标和有关开发新产品目的的简要项目视图陈述。项目视图陈述将考虑权衡有不同需求客户的看法。它可能有点理想化,但必须以现有的或所期待的客户市场、企业框架、组织的战略方向和资源局限性为基础。 b2主要特性包括新产品将提供的主要特性和用户性能的列表。强调的是区别于以往产品和竞争产品的特性。可以从用户需求和功能需求中得到这些特性。 b3假设和依赖环境在构思项目和编写项目视图和范围文档时,要记录所作出的任何假设。通常一方所持的假设应与另一方不同。 c1首次发行的范围总结首次发行的产品所具有的性能。描述了产品的质量特性,这些特性使产品可以为不同的客户群提供预期的成果。c2随后发行的范围如果你想象一个周期性的产品演变过程,就要指明哪一个主要特性的开发将被延期,并期待随后版本发行的日期。 c3局限性和专用性明确定义包括和不包括的特性和功能的界线是处理范围设定和客户期望的一个途径。列出风险承担者们期望的而你却不打算把它包括到产品中的特性和功能。 d1客户概貌客户概述明确了这一产品的不同类型客户的一些本质的特点,以及目标市场部门和在这些部门中的不同客户的特征。 d2项目的优先级一旦明确建立项目的优先级,风险承担者和项目的参与者就能把精力集中在一系列共同的目标上。达到这一目的的一个途径是考虑软件项目的五个方面:性能、质量、计划、成本和人员。e产品成功的因素明确产品的成功是如何定义和测量的,并指明对产品的成功有巨大影响的几个因素。不仅要包括组织直接控制的范围内的事务,还要包括外部因素。如果可能,可建立测量的标准用于评价是否达到业务目标 3)用户群分类:产品的用户在很多方面存在着差异,例如:用户使用产品的频度、他们的应用领域和计算机系统知识、他们所使用的产品特性、他们所进行的业务过程、他们在地理上的布局以及他们的访问优先级。根据这些差异,你可以把这些不同的用户分成小组。用户类不一定都指人,你可以把其它应用程序或系统接口所用的硬件组件也看成是附加用户类的成员。以这种方式来看待应用程序接口,可以帮助你确定产品中那些与外部应用程序或组件有关的需求。将用户群分类并归纳各自特点为避免出现疏忽某一用户群需求的情况,要将可能使都有所差异。详细描述出它们的个性特点及任务状况,将有助于产品设计。 4)选择产品代表:择每类用户的产品代表为每类用户至少选择一位能真正代表他们需求的人作为那一类用户的代表并能作出决策。这对于内部信息系统的开发是最易实现的,因为此时,用户就是身边的职员。而对于商业开发,就得在主要的客户或测试者中建立起良好的合作关系,并确定合适的产品代表。他们必须一直参与项目的开发而且有权作出决策。每一个产品代表者代表了一个特定的用户类,并在那个用户类和开发者之间充当主要的接口。 5)建立核心队伍:建立起典型用户的核心队伍把同类产品或产品的先前版本用户代表召集起来,从他们那里收集目前产品的功能需求和非功能需求。这样的核心队伍对于商业开发尤为有用,因为你拥有一个庞大且多样的客户基础。与产品代表的区别在于,核心队伍成员通常没有决定权。 6)确定使用实例:让用户代表确定使用实例从用户代表处收集他们使用软件完成所需任务的描述-使用实例,讨论用户与系统间的交互方式和对话要求。在编写使用实例的文档时可采用标准模版,在使用实例基础上可得到功能需求。 一个单一的使用实例可能包括完成某项任务的许多逻辑相关任务和交互顺序。因此,一个使用实例是相关的用法说明的集合,并且一个说明是使用实例的例子。在描述时列出执行者和系统之间相互交互或对话的顺序。当这种对话结束时,执行者也达到了预期的目的。 对于一些复杂的使用实例,画出图形分析模型是有益的,这些模型包括数据流程图、实体关系图、状态转化图、对象类和联系图。 使用实例的描述并不向开发者提供他们所要开发的功能的细节。为了减少这种不确定性,需要把每一个使用实例叙述成详细的功能需求。每一个使用实例可引伸出多个功能需求,这将使执行者可以执行相关的任务;并且多个使用实例可能需要相同的功能需求。使用实例方法给需求获取带来的好处来自于该方法是以任务为中心和以用户为中心的观点。比起使用以功能为中心的方法,使用实例方法可以使用户更清楚地认识到新系统允许他们做什么。 每一个使用实例都描述了一个方法,用户可以利用这个方法与系统进行交互,从而达到特定的目标。使用实例可有效地捕捉大多数所期望的系统行为,但是你可能有一些需求,这些需求与用户任务或其他执行者之间的交互没有特定的关系。这时你就需要一个独立的需求规格说明。 7)召开应用程序开发联系会议:召开应用程序开发联系会议应用程序开发联系会议是范围广的、简便的专题讨论会,也是分析人员与客户代表之间一种很好的合作办法,并能由此拟出需求文档的底稿。该会议通过紧密而集中的讨论得以将客户与开发人员间的合作伙伴关系付诸于实践。 8)分析用户工作流程:分析用户工作流程观察用户执行业务任务的过程。画一张简单的示意图(最好用数据流图)来描绘出用户什么时候获得什么数据,并怎样使用这些数据。编制业务过程流程文档将有助于明确产品的使用实例和功能需求。你甚至可能发现客户并不真地需要一个全新的软件系统就能达到他们的业务目标。 9)确定质量属性:确定质量属性和其它非功能需求在功能需求之外再考虑一下非功能的质量特点,这会使你的产品达到并超过客户的期望。对系统如何能很好地执行某些行为或让用户采取某一措施的陈述就是质量属性,这是一种非功能需求。听取那些描述合理特性的意见:快捷、简易、直觉性、用户友好、健壮性、可靠性、安全性和高效性。你将要和用户一起商讨精确定义他们模糊的和主观言辞的真正含义。 10)检查问题报告:通过检查当前系统的问题报告来进一步完善需求客户的问题报告及补充需求为新产品或新版本提供了大量丰富的改进及增加特性的想法,负责提供用户支持及帮助的人能为收集需求过程提供极有价值的信息。 11)需求重用:跨项目重用需求如果客户要求的功能与已有的产品很相似,则可查看需求是否有足够的灵活性以允许重用一些已有的软件组件。

Visual Studio Team System 建模策略与 FAQ

适用于:

Microsoft Visual Studio Team System

摘要:客户和合作伙伴迫切希望了解 Microsoft 对于模型驱动开发的策略,及其对 Visual Studio Team System 的支持。当向他们解释我们的策略时,他们经常表现出对某些相同主题的兴趣,并引出一些相同的关注点。本文,我们讲述模型驱动开发的策略,以及开发人员通常会涉及到的一系列问题与解答。首先的五个问题涉及到我们策略的主要结构,我们将对其进行详细的回答与解释。其他的常见问题均集中于最后一部分的常规 FAQ 部分中。

本页内容

为什么建模?

如何在模型驱动的开发中使用 DSL?

UML 如何?

MDA 如何?

软件工厂是什么?

其他常见问题

为什么建模?

客户曾经告诉我们,他们在 80 年代和 90 年代初所购买的多数 CASE 工具不能为开发过程增加足够的价值。由购买的工具带来的利益并未实现,甚至好的产品也会被过度夸耀的技术承诺所掩盖。

如果工具支持的模型不能反应代码以及其他的实现产品,那么这些工具很快就会被摒弃。如果工具支持的模型用于生成代码,那么当开发人员根据生成的代码增添其他代码时,工具通常不能与之同步。尽管这些工具为生成的代码提供了很好的"往返行程",但最终开发人员还是身陷于解决此类问题的错综复杂的情况中。因为 CASE 工具试图以超高级别的抽象(与底层实现平台相对)进行 *** 作,所以这些问题经常变得更糟。这会导致生成大量代码,由于混合了手写代码和生成的代码,因此要解决这些问题更加困难。

尽管存在这些问题,但是与某些软件开发过程有关的一个观点是 - 应用建模可以让开发更轻松。我们的目标是改变开发人员看待建模价值的方式。要将他们的观点(建模是一个在真正开始开发之前不太重要的有用活动)改变为承认建模是一个重要的、主要的开发任务,并且不是主要集中于文档的活动。当将模型视为首要的开发产品时,由于可以使用更强大的应用程序抽象,因此开发人员会编写更少的常规代码。模型驱动的开发也因此顺理成章地更加高效和灵活。此外,其他涉及到的开发人员(从业务分析师、架构师、设计师到网络的用户以及系统管理专业人员)会发现建模对其所负责的任务会产生增值。当模型以这种方式横跨开发和运行时活动时,人员之间的交流可以得到优化,且可跟踪性使得能够跨越生命周期的任何阶段。我们坚信,以这种方式确立建模的主要位置,最终可以改变软件开发的经济性,并且保证软件系统能够满足业务的需要。该模型驱动开发的方法由 Microsoft 首创,是名为软件工厂 的产品的一部分。

注 软件工厂的深入说明,请参阅“Software Factories: Assembling Applications with Patterns, Models, Frameworks and Tools”,作者为 Jack Greenfield 和 Keith Short,以及 Steve Cook 和 Stuart Kent。

返回页首

如何在模型驱动的开发中使用 DSL?

Microsoft 已经从过去的行业经验中有所收获,并且避免了 CASE 的缺陷,这是通过采纳基于下列想法的模型驱动开发实现的:

模型应该是项目中首要的产品 - 不仅仅是一些快过时的文档。模型有精确的语法,通常利用图形化工具易于进行编辑和浏览,并且包含确定模型中特定于域的概念如何映射到其他实现产品的语义,这些实现产品包括代码、项目结构和配置文件等。按照这种方法,模型非常类似于源代码文件,而且它与其他实现产品同步的机制非常类似于编译器。

模型表示一组抽象,它以定义完善的开发内容为开发人员提供支持。例如,考虑这样一个任务:生成一个通过 Web 服务与组件进行连接的、面向服务的应用程序。要构建这样一个应用程序,假设给定开发人员必须关注的所有其他任务,在这种情况下,根据服务合同和开发人员之间交流的信息,该开发人员可以只关注定义整个应用程序连接性。为软件架构师的应用程序设计器提供的 Visual Studio Team Edition 完全支持开发的个各个方面,并管理应用程序连接性模型和所有其他产品(WSDL 文件、项目文件、代码文件、配置文件等)之间的关系。必须开发这些产品以实现由模型定义的互联。按照这种方式设计作为源产品的模型,具有额外的好处 - 提供对其他分散细节的整体视角,并且能够让不同团队(包括设计、构建和部署复杂、现代化应用程序)之间的沟通更加顺畅。

由于模型能够提炼并聚合大量产品中的信息,因此它们能够更轻松地支持一致性检查和其他形式的分析。例如,一个应用程序连接模型可以支持协定协议验证、安全性分析或性能分析。

通过一个与编辑类似的过程可以实现模型,在该过程中,由编译器生成的代码、配置文件和其他实现产品均不能进行手工编辑。然而,较普遍的情况是,模型可以由生成产品和手工编辑产品的组合实现。在这种情况下,非常重要的一点是,仔细管理使生成和手工编辑产品相互适应的方法。如上所述,不能有效做到这一点是 CASE 产品的一个主要不足之处。我们已经使用了一些技术来确保生成的产品和手工编辑产品保持独立,并且当生成工具需要套用代码时,决不会与由开发人员添加的代码发生冲突。这些技术包括,使用类委托和继承,特别是使用"部分类" - 它是 Visual Studio 中 NET 语言的一个新特性,利用成形的任务已经进行了特别定义。

我们将以这些方式定义的建模语言称为 Domain Specific Languages 或 DSL。可以将 DSL 想象为一种用来解决一些清晰确认问题的小规模、高集中化的语言。这里所说的问题是分析师、架构师、开发人员、测试人员或系统管理员必须要处理的问题。开发人员已经熟知的 DSL 示例是:用于数据 *** 作的 SQL 和用于 XML 文档结构定义的 XSD,等等。另一个来自 Visual Studio Team Edition for Software Architects 的示例是,用于对数据中心硬件和宿主软件配置的逻辑结构进行建模的 DSL。该 DSL 及其相关的图形设计器可以用于设计时(配置应用程序以与其部署目标相匹配)的验证,在问题可以更容易地解决时向开发人员发出警告。

找到备选 DSL 的好办法是明确开发人员使用的模式,然后将其封装到建模语言中,或将软件框架中的概念作为建模语言中的抽象表层化,然后能够生成可扩展整个框架的少量代码。这些技术允许我们控制生成代码的数量和复杂度,从而为开发人员提供真正意义的价值,而无需争论对 CASE 产品的刻画。

最近,Microsoft 发布了 DSL 工具 - 使客户和合作伙伴能够通过 Visual Studio 中的相同的技术构建 DSL,这些技术用于构建与 Visual Studio Team Edition for Software Architects 一起发行的建模工具。可以将该技术认为是"构建工具的工具",简化了定义 DSL 的任务,并降低了为工具构建图形化编辑器和编译器的代价和技能

返回页首

UML 如何?

多数理解我们就模型驱动开发这一观点的人员,把我们假想为将重点放在 DSL 上,这一假设将我们置于一个与 UML 对立的位置。我们希望对这一不正确的想法予以澄清。在 UML 之前,各种各样的建模方法缺乏生产效益,这些方法最终形成 UML 10,这是在软件开发中使用模型方面向前迈进的重要一步。

但是不管是出于什么原因,UML 和基于 UML 工具的存在没有显著改变开发人员构建应用程序的方式。或者说,没有为开发人员生产效率提供明显的帮助。自从 Microsoft 提供了一个最可用的 UML 工具(基于 Visio 的工具)- 最先与 Visual Studio Enterprise Architect 一起提供,我们对该工具的使用进行了开发人员的(不仅限于我们的客户)匿名调查。我们发现,只有很少数人声明其任务支持 UML 工具,大部分使用者仅使用类图表。当我们训练这部分声明使用类图表的人员时,实际使用它们生成代码的数量很少。

除了在 Visual Studio Team Edition for Software Architects 中的模型驱动的开发工具之外,这是驱动因素之一。我们真正想要进行的是开发人员和架构师很难发现的任务,并找出建模工具可能为其增值并提供帮助的办法。我们强烈支持 UML 符号和图表。在 Microsoft 中任意的开发人员办公地点走走,就会发现白板上密布着 UML 类图表以及序列图表。我们不仅在规范文档中、在很多其他为演示准备的图表中使用 UML 符号,甚至还会将 UML 符号记录在自助餐厅的餐巾纸上。要支持客户的这些需要以生成文档和概念化草图,我们将继续在 Visual Studio 中提供 UML 工具集。事实上,通常在 Microsoft 内,我们使用 UML 的目的很多(例如用于文档或概念共享),但几乎从未 有任何一个是出于以下目的,这些文档是软件开发的实际产物。

办公室和走廊里相同的白板也布满了随意写下的代码。但在这里再次声明这都是草稿。这些代码很少能正确指示程序源代码编译。这对开发人员而言是重大的区别。任意一种有助于实际软件开发的产品必须能够进行数字化 *** 作。源代码有定义完善的语法,易于理解的语义(通常由编译器的转换以较低级的代码或中间语言定义),并且能够由编译器、调试器和重构程序进行一致性 *** 作。要有益于开发人员,模型必须 有与源代码相同的状态。模型还必须有精确的语法、易于理解的语义,以及定义完善的到源代码或其他定义完善模型的映射。它必须不仅 限于文档。

例如,采用 Visual Studio Team Edition for Software Architects' Application Designer。它不仅仅是文档,虽然它以该目的进行使用。它更希望使开发人员(或架构师)能够将注意力集中于系统的某一部分;而不是面向服务的体系结构中服务间的连接。她可以在构建项目、WSDL 文件、代码和架构之前设计系统的该部分,或要求工具文档化服务间的连接(如果这些产品已经存在)。由于连接信息分散于众多开发产品之中,因此整体视图(如图表)提供了基本的使用,尽管所有传递的信息可能因对实施产品的仔细检查而减少。应用程序设计器有定义完善的语法(它的 DSL 元模型)和可预知的、始终同步的到各种实施产品的映射。基础设计器框架承担应用程序设计器图表编译器的作用,非常类似于与源代码文件相关的传统编译器的作用。

但是,为什么我们不能只将这种新的服务连接"语言"构建为对 UML 的扩展呢?特别是对 UML 20 的改进呢?

当然,当我们看出采取 UML 20 规范的趋势时,我们意识到,它依旧不能成为文档之外其他事物的基础是有原因的。由于更加复杂的子语言,UML 20 规范已经增加了标准的复杂性,但是它依旧不能以一种自然的方式解决现代应用程序开发的关键问题,例如,数据库设计、测试、部署、面向服务、基于组件的开发以及用户界面结构。由于没有自然的 UML 子语言满足服务连接的需求,因此我们必须利用现有 UML 子语言中的构造型和标记来重新描述我们的应用程序设计 DSL。这会导致在已由业界众多膨胀、复杂的规范描述的设计中极其复杂的模型。利用标准的 UML 符号(其中,对应于任何已经扩展的子语言中现有的形状都可以重用),对于图表的可读性和清晰度而言是一种折中方案。最后,我们会纠缠于规范中关键内容缺乏精确度以及 UML 中固有的类型系统不匹配(较之于 Net 和 XML 语言)之中。

由于这些原因,我们选择利用一个为特定目的构建的元模型来定义应用程序设计 DSL,该模型本身作为相关元模型家族中的一员进行定义。这为服务连接提供了自然且精确的基础,以及到基础实施产品(当然包括一些代码)的高保真映射。对于其他关注的开发任务,我们已经得到了相同的结论,并因此产生了与其他白皮书中所述相似的类设计器和逻辑数据中心设计器的 DSL。对可扩展 DSL 的支持,构建为一系列具有定义完善的 DSL 与其他开发产品间的映射,最终成为 Microsoft 模型驱动开发策略的基础。

综上所述,我们推荐在以下情况下使用 UML 和基于 UML 的工具:

草图。

白板。

餐巾纸。

文档。

不直接与代码相关的概念性绘图。

我们推荐在以下情况中使用恰当定义的 DSL 和基于 DSL 的工具:

从中生成代码的精确抽象。

映射到框架和组件中变化点的精确抽象。

DSL 之间的精确映射。

具有到其他 DSL 或代码产品的精确指明映射的概念性绘图。

我们不推荐将上述几点用于详细编程逻辑的可视化编程(或至少在近几年之内)。

返回页首

MDA 如何?

MDA 是 OMG 的一个授权品牌,它基于利用模型驱动开发的 UML。它重点强调与平台无关的模型以及衍生出的技术。根据 OMG FAQ,

"MDA 是编写规范和开发应用程序的一种新方式,它基于平台无关的模型 (PIM)。完整的 MDA 规范包括,一个基于 UML 模型的确定无关平台、一个或更多特定于平台的模型 (PSM) 以及接口定义集,它们分别描述基本模型如何在不同的中间件平台上实现。完整的 MDA 应用程序包括,一个确定的 PIM、一个或更多的 PSM 以及完整的实施,应用程序开发人员决定支持的每个平台均对应一个 PSM。"

MDA 由 OMG 定义,仅解决实际问题的一个小子集,这些问题必须用于驱动有效的模型驱动的开发。一个有效的模型驱动开发方法必须能够解决编程问题,例如:

可以开发哪些类型的系统?由于不同系统之间存在着明显的差异,因此模型驱动开发方法必须能够辨别这些差异。要有效实现,首先描述要解决的问题,然后标识可以解决问题的特定技术,显示适合解决方案的每一种技术,各种技术如何协调工作以完成解决方案。

给定类型系统的体系结构是什么?这个问题的答案不仅仅是考虑可以使用的技术,而且还涉及识别这些技术的特性(对设计系统的每个部分都很重要),以及配置每种技术的用法。这是软件体系结构的主题,已被公认为软件生命周期中最重要的定律之一。软件体系结构定义了为系统提供其结构以及定义其质量属性的高级设计决策。由于模型最初用于描述系统重要部件的体系结构,因此模型应该更紧密地与软件体系结构开发相集成。

需要为给定类型的系统继续哪方面的建模?由于不同系统的体系结构有非常大的差异 ,因此没有单独的模型集能够有效描述所有可能的系统。因此,这个问题的答案将因系统类型而异。我们的观点是:每个目标平台上单个的 PIM 和单个的 PSM,所有的开发均利用一个由 MDA 指定的常规目的建模语言,足以支持由模型驱动开发承诺的非常高级别的自动化。软件生命周期中丰富的自动化需要大量其他类型的模型,例如以下这些模型:

捕获、分析和管理需求;标识需求之间的跟踪关系,体系结构设计和实现结构,能够进行需求已实施的验证,以及在需求变更时支持对产生影响的分析。

以下列方式定义软件体系结构:支持安全性、性能和可靠性分析以及其他格式的评估;能够从组件启用预知的系统程序集,以及有效、可逆地逐步从需求和部署进行转换。

定义可执行的系统组件如何打包,标识部署环境中每个组件都需要的资源类型,以及将组件绑定到这些资源类型的特定实例。

定义测试用例、测试数据集、测试工具和其他产品,更易于评估利用模型开发的软件的质量,以管理和显示测试结果。

标识模型和其他产品间的跟踪关系,更易于在系统宕机时支持对业务影响的分析,将系统配置为满足需求,并加强系统配置期间的约束。

定义用于构建可执行文件的源产品的配置,更易于版本化这些配置,以与缺陷报告和具有特定版本的特性变更需求相关联。

模型驱动的技术如何与代码为主的开发技术集成?模型用于辅助开发人员实现任务,例如查询和导航代码基、调试、分析、覆盖分析、模式化应用程序和重构,并且可以紧密集成到面向文件的开发环境。

此外,除了上述说明的原因,强调利用发布的 UML 元模型是我们的问题所在。最后,尽管强调平台无关是某些客户所关注的,但是我们了解到更多的是他们有关对生产率、可预见性、安全性、管理以及部署和管理应用程序的有效方式的需求。然而,我们绝对赞同有关构建应用程序而使用的模型是 MDA 的中心,且重要的是模型间定义完善的映射,我们识别以下值,模型可为其提供构建跨具有互 *** 作组件的平台的应用程序。

某些进行模型驱动开发的组织接受对术语 MDA 更广泛的解释,而不是由 OMG 描述的解释;的确,如我们所述,他们必须这样做才能获得成功。使用任意的 OMG 规范以实现模型驱动的开发,是 MDA 典型的应用,无论是否包含 PIM 和 PSM。例如,某些组织发现 OMG 的 MOF 规范是 MDA 的关键。该观点取决于用 MOF 定义的新的建模语言,而不是在 UML 中预定义的建模语言,且该观点与我们的方法极其相似。我们将支持与其他平台上普遍采用的 UML 和 MOF 工具进行交互,通过 XMI 或是通过本机格式,帮助客户成功利用它们进行模型驱动的开发。

返回页首

软件工厂是什么?

正如前面提到的,我们对于模型驱动开发的方法是 Microsoft 称之为软件工厂 的一部分。取代了一般的、一种规模满足所有需要的方法,软件工厂使用自定义的 DSL 集合,从而提供自定义的抽象集以满足系统(例如,电子商务、金融交易或国内银行应用程序)特定领域的需要。有了软件工厂,模型不仅可以用于分析和设计,而且还支持跨越整个软件生命周期(甚至是运行时)的各种类型的计算。这是软件工厂的基本原则,并且还是 Microsoft 的 Dynamic Systems Initiative (DSI) 的基本原则。DSI 实现并完成软件工厂计划。

您可以将软件工厂认为是包含并扩展 MDA,这里对 MDA 的定义比基于 PIM 和 PSM 的正式定义范围更广泛。软件工厂超越了一般的平台独立性,并且特定的模型可解决前面部分中说明的其他问题。

利用图形化观点,软件工厂为特定的系统定义专门的方法。每个观点都为系统范围内的成员定义生命周期的某部分,例如需求获取、数据库设计或服务协定定义。工厂与每个观点的可再次使用部分相关联,并在对系统家族范围内团队开发成员观点的上下文中传递它们,这样就不需要搜索应用程序部分,能够启动验证并支持手工和自动指导设置。

观点图被称为软件工厂架构,与在一层抽象(系统的一部分)上完成的工作相关,或在生命周期的一个阶段内,在其他层(或其他部分和阶段)上完成的工作相关。观点图可用于从其他产品(特别是从模型)完全或部分生成产品(包括模型、源代码、配置文件等);在开发阶段保持产品同步;验证手工开发的产品;评估需求失败或变更后的影响;组织并应用模式及其他最佳实践;捕获系统开发期间的元数据以支持系统 *** 作和维护;提供其他形式的指导和管理。

软件工厂自动化可再次使用部分的打包和交付,可再次使用部分包括,模型和模型驱动的工具、其他类型工具(例如,向导、模板和实用程序)、开发过程、实施组件(例如,类库、框架和服务)以及内容部分(例如,模式、样式表、帮助文件、配置文件和文档)。由于软件工厂架构是一个模型,因此可以通过工具来 *** 作软件工厂。创建规模较大的软件工厂,可通过合并较小的工厂以及通过自定义一般的工厂实现工厂的特殊化。

构建软件工厂与构建架构很类似。包括要使工厂更易于开发人员应用的获取和实现模式以及其他最佳实践。与通过手工从头开始构建系统相比,使用工厂更有效,这是因为使用工厂不扫描希望找到可重用组件的目录和存储库,在系统体系结构和开发过程的上下文中立即可用的开发下,使用工厂的开发人员具有可重用的组件适用于系统的各个部分。

当然,软件工厂计划不仅仅局限于 Microsoft 和我们提供的产品。相反,我们将软件工厂作为客户和合作伙伴这一广泛群体的基础,在我们提供的基础之上构建自定义的工厂,并且将工厂组件提供给这一群体中的其他成员。

客户和合作伙伴对软件工厂计划的响应是很积极的。我们建议,将软件工厂作为现代化组织的最佳发展方向,希望改善其与业务期望一致的开发方法,并且我们提供了 Visual Studio Team Edition for Software Architects、DSL 工具和 VSTS 中其他的新功能,作为软件工厂计划的首选产品。

以上就是关于软件项目的管理流程全部的内容,包括:软件项目的管理流程、软件测试的方法有哪几种、软件工程论文等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9816642.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存