软件生存周期是由工程中产品生存周期的概念得来的。引入软件生存周期概念对于软件生产的管理、进度控制有着非常重要的意义,使软件生产有相应的模式、流程、工序和步骤。
在GB/T 11457—2006《信息技术 软件工程术语》中“软件生存周期”的定义为:“从设计软件产品开始到产品不能再使用时为止的时间周期。软件生存周期通常包括需求阶段、设计阶段、实现阶段、测试阶段、安装和验收阶段、运行和维护阶段,有时还包括引退阶段。”
国家标准GB/T 8566—2007《信息技术 软件生存周期过程》将软件生存周期划分为:可行性研究、项目计划、需求分析、总体设计、详细设计、编码实现(包括单元测试)、集成测试、确认测试、系统运行和维护。
软件生存周期的各阶段有不同的划分。软件规模、种类、开发模式、开发环境和开发方法都影响软件生存周期的划分。在划分软件生存周期阶段时,应遵循一定的规则,如各阶段的任务应尽可能相对独立,同一阶段各项任务的性质应尽可能相同,从而降低每个阶段任务的复杂程度,简化不同阶段之间的联系,有利于软件项目开发的组织和管理。
通过归纳,可以将软件生存周期分为 3 个大的阶段,即软件定义阶段,软件开发阶段和软件维护阶段。
1.软件定义阶段
软件定义阶段必须回答的问题是:需要软件解决的问题是什么?如果不知道问题是什么就试图解决这个问题,只会白白浪费时间和金钱,最终得出的结果很可能是毫无意义的。软件定义阶段是软件项目的早期阶段,主要是由软件分析人员和用户合作,针对有待开发的软件系统进行分析规划和规格描述,确定软件做什么,为今后的软件开发做好准备。软件定义时期的任务是了解用户的需求,确定项目的总体目标,考察和分析项目的可行性,导出实现项目目标应该采取的策略,以及系统必须完成的功能,并估计项目需要的资源和成本,制定工程进度表等。这个时期需要分阶段地进行以下工作:
(1)软件任务立项。软件项目一般始于任务立项,并需要以立项报告的形式针对项目的名称、性质、目标、意义和规模做出回答,以此获得对准备着手开发的软件系统的概括性描述。
(2)可行性研究。在软件任务立项报告被批准后,接着需要进行项目可行性分析。这个阶段要回答的关键问题是:“对于上一个阶段所确定的目标有行得通的解决办法吗?”为了回答这个问题,系统分析员需要在较抽象的高层次上进行分析和设计,对任务立项阶段所确定的目标进行可行性和必要性研究。可行性研究主要从技术可行性、经济可行性、操作可行性等方面进行分析,寻求一种或多种在技术、经济、操作和法律等各方面可行的解决方案,对各种可能方案做出必要的成本/效益分析,据此提出可行性分析报告,作为是否继续进行该项工程的依据。
(3)需求分析。这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。需求分析要求以用户需求为依据,从功能、性能、数据、操作等多个方面,对软件系统给出完整、准确、具体的描述,用于确定软件规格。其结果将以软件需求规格说明书的形式提交。软件需求分析是从软件定义到软件开发的关键步骤,其结论不仅是今后软件开发的基本依据,同时也是今后用户对软件产品进行验收的基本依据。
(4)制订项目计划。在确定项目可以进行以后,就需要针对项目的开展,从人员、组织、进度、资金、设备等多方面进行合理的规划,并以项目开发计划书的形式提交书面报告。项目开发计划涉及实施项目的各个环节,计划的合理性和准确性将关系项目的成败。
2.软件开发阶段
软件开发阶段的任务是设计实现已定义的、并经过需求分析的软件系统。通常将软件开发阶段划分为软件设计、软件实现和软件测试3个阶段。其中,软件设计又可分为总体设计和详细设计,编码是对软件的实现。软件测试又可分为单元测试、集成测试、确认测试和系统测试。将设计和实现分开的目的是在开发初期集中精力搞好软件结构设计,避免过早地为实现细节分散精力。
(1)总体设计。总体设计是建立系统的总体结构,从总体上对软件的结构、接口、全局数据结构、数据环境等给出设计说明,并以概要设计说明书的形式提交书面报告,其结果将成为详细设计与软件实现的基本依据。模块是总体设计时的基本元素,因此,总体设计的工作主要体现在模块的构成与模块接口等方面。结构化设计中的函数、过程,面向对象设计中的类、对象,它们都是模块。总体设计时并不需要说明模块的内部细节,但是需要进行全部的有关它们构造的定义,包括功能特性、数据特征、接口等。模块的独立性是一个有关质量的重要技术指标,可以使用模块的内聚性、耦合度等定性参数对模块独立性进行度量。
(2)详细设计。详细设计以总体设计为依据。它主要是确定软件结构中每个模块的内部细节,为编写程序提供最直接的依据。详细设计需要从实现每个模块功能的程序算法和模块内部的局部数据结构等细节内容上给出设计说明,并以详细设计说明书的形式提交书面报告。
(3)编码。编码是对软件的实现,以获得源程序基本模块为目标。编码必须按照详细设计说明书的要求逐个实现每个模块的功能。在基于软件工程的软件开发过程中,编码往往只是语言转译工作,即把详细设计中的算法描述语言转换成某种适当的程序设计语言。
(4)单元测试。为了方便调试,针对基本模块的单元测试也往往和编码结合在一起进行。单元测试也以详细设计说明书为依据,用于检查每个基本模块在功能、算法与数据结构上是否符合设计要求。
(5)集成测试。集成测试是根据总体设计中的软件结构,把经过单元测试的模块,按照某种选定的集成策略将系统组装起来,在组装过程中对程序进行必要的测试。
(6)确认测试。确认测试是以用户为主体,以需求规格说明书中对软件的定义为依据,由此对软件的各项规格进行逐项确认,以确保已经完成的软件系统与需求规格的一致性。在完成对软件的验收后,软件系统就可以交付使用了,开发人员需要以项目开发总结报告的形式对项目进行总结。
(7)系统测试。系统测试是将已经确认的软件、硬件等其他元素结合在一起,进行系统的各种集成测试和技术测试。其目的是通过与系统的需求相比较,发现所开发的软件与用户需求不符或矛盾的地方。系统测试是根据需求规格说明书来设计测试用例的。
3.软件维护阶段
运行阶段的任务是保障软件的正常运行,并对软件进行维护。为了排除软件系统中可能隐含的错误,适应用户需求及系统操作环境的变化,需要继续对系统进行修改或扩充。为了使系统具有较长的生命力,对于每项维护活动都应准确地记录下来,作为正式的文档资料加以保存。在适当的时候要对软件进行评价,如果经过修改或补充,软件仍不能适应新的需求,则该软件就应被新的软件所替代。
研究软件生存周期的目的是为了科学、有效地组织和管理软件的生产,从而使软件生产更可靠、更经济。采用软件生存周期来划分软件的工程化开发,使软件开发分阶段依次进行。前一个阶段任务的完成是后一个阶段工作的前提和基础,而后一个阶段通常将前一个阶段提出的方案进一步具体化。每个阶段结束之前都要接受严格的技术评审和管理评审。采用这种划分,使得每个阶段的工作相对独立,有利于简化问题,且便于不同人员分工协作。而且其严格的科学的评审制度保证了软件的质量,提高了软件的可维护性,从而大大提高了软件开发的生产率和成功率。