首页 理论教育软件工程:计算机导论第2版的重要目标

软件工程:计算机导论第2版的重要目标

【摘要】:简言之,软件工程是研究软件的工程化生产的技术和方法。软件维护费用在软件开发费用中占有很大的比重。可维护性是软件工程中一项十分重要的目标。

软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。简言之,软件工程是研究软件的工程化生产的技术和方法。

软件工程的目标是在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求的软件产品。追求这些目标有益于提高软件产品的质量和开发维护效率,减少后期维护的难度和成本。

(1)适用性:软件在不同的系统约束条件下,使用户需求得到满足的难易程度。

(2)有效性:软件系统能最有效地利用计算机的时间和空间资源。人们把系统的时、空开销作为衡量软件质量的一项重要技术指标。在很多情况下,在追求时间有效性和空间有效性时会发生矛盾,这时要么牺牲时间有效性换取空间有效性,要么牺牲空间有效性换取时间有效性。时间、空间折中是经常采用的技巧。

(3)可修改性:允许对系统进行修改而不增加原系统的复杂性。它支持软件的调试和维护,是一个难以达到的目标。

(4)可靠性:能防止由概念、设计和结构等方面的不完善造成的软件系统失效,具有挽回操作不当造成软件系统失效的能力。

(5)可理解性:系统具有清晰的结构,能直接反映问题的需求,避免对问题理解的二义性。可理解性有助于控制软件系统的复杂性,支持软件的维护、移植或重用。

(6)可维护性:软件交付使用后,能够容易地对它进行修改,以改正潜藏的错误,提高软件性能,使软件产品适应新环境的变化。软件维护费用在软件开发费用中占有很大的比重。可维护性是软件工程中一项十分重要的目标。

(7)可重用性:把概念或功能相对独立的,且在多处使用的一个或一组相关模块定义为一个软部件,用时可组装在系统的相应位置,从而降低软件开发的工作量。

(8)可移植性:软件从一个计算机系统或环境搬到另一个计算机系统或环境的难易程度。可移植性可提高软件的适用范围,提高软件的覆盖面的重要属性。这需要软件具有较高的相对硬件的独立性,与硬件的关系越松散越好,与硬件彻底无关是最理想的状态。

(9)可追踪性:根据软件需求对软件设计、程序进行正向追踪,或根据软件设计、程序对软件需求逆向追踪的能力。

(10)可互操作性:多个软件元素相互通信并协同完成任务的能力。

一般软件开发流程分为需求分析、概要设计、详细设计、程序编码、软件测试、软件交付、验收和维护等8 个阶段,具体划分也与软件的规模有直接关系,尽管划分阶段的多少和具体名称不尽相同,但软件开发过程基本涵盖了这些内容,不会有大的变化。

1.需求分析

(1)系统分析员初步了解用户需求,然后列出要开发的软件系统的功能模块,罗列每个功能模块有哪些小功能模块,有些用户比较明确地提出软件相关界面时,在这里可初步定义少量界面。

(2)系统分析员深入了解和分析需求,形成一份用户需求分析报告文档。该文档要清楚列出系统大致的功能模块,以及功能模块包含的小功能模块,还要列出相关的界面和界面功能。

(3)系统分析员向用户再次确认需求,根据用户提出的问题,修改用户需求分析报告,经用户签字确认后作为下一步概要设计工作的依据。

2.概要设计(www.chuimin.cn)

开发者依据用户需求分析报告对软件系统进行概要设计(又叫系统设计、总体设计)。概要设计需要对软件系统的总体架构进行设计,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为软件的详细设计奠定基础。需要对硬件进行设计的,要给出硬件需求清单。

3.详细设计

在概要设计的基础上,开发者需要进行软件系统的详细设计。在详细设计中,描述实现具体模块所涉及的主要算法、数据结构、类的层次结构及调用关系,需要说明软件系统各个层次中的每一个程序(每个模块或子程序)的设计思路,以便进行编码和测试。应当保证软件的需求完全得以实现。详细设计应当足够详细,最终形成软件系统详细设计报告。

4.程序编码

在程序编码阶段,开发者根据软件系统详细设计报告中对数据结构、算法分析和模块实现等方面的设计要求,开始具体的程序编写工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/2,通常为1/3。所谓“磨刀不误砍柴工”,设计过程完成得好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心考虑的,也许一个小模块的问题会影响整体进度,让很多程序员被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug 永远存在,必须面对这个问题。

5.软件测试

测试编写好的程序系统,除编码过程中小段程序需要测试外,小模块组装成大模块也需要测试,后者是更重要的测试。交给用户使用后,要逐一确认每个模块的功能。软件测试有很多种类型:按照测试执行方,可以分为内部测试和外部测试(又叫白盒测试和黑盒测试);按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常操作情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。总之,测试同样是项目研发中一个相当重要的步骤,根据软件的规模不同,测试的时间有长有短,因为永远都会有不可预料的问题存在。测试完成后,需要提交验收的帮助文档,整体项目才算完成。

6.软件交付

在软件测试证明软件达到要求后,软件开发者应向用户提交开发的目标安装程序、数据库的数据字典、用户安装手册、用户使用指南、需求报告、设计报告、测试报告等双方合同约定的文档和程序代码。

用户安装手册应详细介绍安装软件对运行环境的要求,安装软件的定义和内容,客户端、服务器端及中间件的具体安装步骤,安装后的系统配置过程等内容。

用户使用指南应包括软件的使用流程、操作步骤、相应业务功能、操作过程介绍、特殊提示和注意事项等内容,若有需要还应举例说明。

7.验收

用户验收无误后,开发者和用户分别在验收报告上签字,这标志着项目开发工作的正式结束。

8.维护

根据用户需求的变化或环境的变化,应对应用程序进行全部或部分的修改。一般用户会委托开发者或自己配备程序员,专门负责软件的升级和修补工作,因为很难避免系统不存在瑕疵。用户的需求也是不断变化的,软件运行环境(硬件和系统)也是在不断更新的,要保持软件正常运行,适应新的变化,就要不停地跟踪软件的运行状况,持续迭代升级,直到软件被彻底淘汰为止。

人类社会正在步入“万物皆可互联、一切皆可编程”的新时代,软件代码将成为一种最为重要的资产形式,软件编程将成为一种最为有效的生产方式。软件定义将迅速引发各个行业的变革。从软件定义无线电、软件定义雷达、软件定义网络、软件定义存储、软件定义数据和知识中心,到软件定义汽车、软件定义卫星,再到软件定义制造、软件定义服务,软件定义将成为科技发展的重要推手,极大地提高各行各业的智能化程度和整个社会的智能化水平。