1、分析和理解程序、修改程序和重新验证程序。经过分析,全面、准确、迅速地理解程序是决定维护成败和质量好坏的关键。有如下几种方法:分析程序结构图、数据跟踪、控制跟踪及其它方法。在将修改后的程序提交用户之前,需要通过静态确认、计算机确认和维护后的验收,保证修改后的程序的正确性。3.从供选择的答案中选出同下列各叙述关系最密切的字句。A.软件从一个计算机系统或环境转移到另一个计算系统或环境的容易程度。B.软件在需要它投入使用时能实现其指定的功能的概率。C.软件使不同的系统约束条件和用户需求得到满足的容易程度。D.在规定的条件下和规定的一段期间内,实现所指定的功能的概率。E.尽管有不合法的输入,软件仍能继续
2、正常工作的能力。可测试性可理解性可靠性可移植性可使用性兼容性容错性可修改性可接近性一致性4.软件可移植性是用来衡量软件的( A )的重要尺度之一。为了提高软件的可移植性,应注意提高软件的( B )。采用( C )有助于提高( B )。为了提高可移植性,还应( D )。使用( E )语言开发的系统软件具有较好的可移植性。A.通用性效率质量人机界面B.使用的方便性简洁性可靠性设备独立性C.优化算法专用设备表格驱动方式树型文件目录D.有完备的文件资料选择好的宿主计算机减少输入输出次数选择好的操作系统E.COBOLAPLCSQL5.下面有关软件维护的叙述有些是不准确的,请将它们列举出来。要维护一个软件
3、,必须先理解这个软件。阅读别人写的程序并不困难。如果文档不齐全也可以维护一个软件。谁写的软件就得由谁来维护这个软件。设计软件时就应考虑到将来的可修改性。维护软件时一件很吸引人的创造性工作。维护软件就是改正软件中的错误。维护好一个软件是一件很难的事情。二、简答题1.某些软件工程师不同意“目前国外许多软件开发组织把60%以上的人力用于维护已有的软件”的说法,他们争论说:“我并没有花费我的60%的时间去改正我所开发的程序中的错误”。请问,你对上述争论有何看法?2.为什么大型软件的维护成本高达开发成本的4倍左右?3.某软件公司拟采取下述措施提高他们开发出的软件产品的可维护性。请判断哪些措施是正确的,哪
4、些措施不正确。(1)在分析用户需求时同时考虑维护问题。(2)测试完程序后,删去程序中的注解以缩短源程序长度。(3)在软件开发过程中尽量保证各阶段文档的正确性。(4)编码时尽量多用全局变量。(5)选用时间效率和空间效率尽可能高的算法。(6)尽可能利用硬件特点以提高程序效率。(7)尽可能使用高级语言编写程序。(8)进行总体设计时加强模块间的联系。(9)尽量减少程序模块的规模。(10)用数据库系统代替文件系统来存储需要长期保存的信息。(11)用CASE环境或程序自动生成工具来自动生成一部分程序。(12)尽量用可重用的软件构件来组装程序。(13)使用先进的软件开发技术。(14)采用放错程序设计技术,在
5、程序中引入自检能力。(15)把与硬件及操作系统有关的代码放到某些特定的程序模块中。4.假设你的任务是对一个已有的软件做重大修改,而且只允许你从下述文档中选取两份:(a)程序的规格说明;(b)程序的详细设计结果(自然语言描述加上某些设计工具表示);(c)源程序清单(其中有适当数量的注解)。你将选取哪两份文档?为什么这样选取?5.当一个十几年前开发出的程序还在为其用户完成关键的业务时,是否有必要对它进行再工程?如果对它进行再工程,经济上是否划算?6.代码重构与正向工程有何相同之处?有何不同之处?第五章习题解答1.A., B., C., D., E., F, G, H, I其中,A、B、C答案顺序可
6、互换,D、E、F答案顺序可互换,G、H、I答案顺序可互换。对于软件产品来说,有4个方面影响着产品的质量,即开发技术、过程质量、人员素质及成本、时间和进度等条件。这4个方面因素对产品质量究竟有多少影响又取决于项目的项目的规模和项目的类型。重视软件过程的质量是近年来质量管理理论和实践的新发展,但不能把产品质量的控制与过程质量的控制相对立起来。重视软件过程质量的控制,其部分原因可能是,相对于产品质量的控制来说,过程质量的控制是先期的、主动的、系统的,而产品质量的控制是事后的(产品已经生产出来)、被动的(发现了不合格产品只能报废或采取其它补救措施)、个别的(逐个产品的质量检验)。3. A., B.C.
7、, D., E.论述A是指可移植性。可移植性的定义是:将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所需工作量的大小。论述B是指可使用性。可使用性的定义是:程序方便、实用、及易于使用的程度。用户一有请求,就能对每一个操作方式作出解释,始终如一地按照用户的要求运行。计算其按用户请求实现指定功能的概率,是一种度量准则。论述C是指兼容性。有两类基本的兼容性:向下兼容和交错兼容。向下兼容是软件新版本保留它早期版本的功能的情况;交错兼容是共同存在的两个相关但不同的产品之间的兼容性。软件可以在不同系统约束和不同用户需求下完成指定的工作。论述D是指可靠性。可靠性的定义是:一个程序按
8、照用户的要求和设计目标,在给定的一段时间内正确执行的概率。论述E是指容错性。容错性的定义是:系统出错(机器临时发生故障或数据输入不合理)时,能以某种预定方式,做出适当处理,得以继续执行和恢复系统的能力。4. A., B., C., D., E.软件可移植性是用来衡量软件质量的重要尺度之一。为了提高软件的可移植性,应注意提高软件的设备独立性。采用表格驱动的方式有助于提高软件的设备独立性。为了提高可移植性,还应有完备的文档资料。使用C语言开发的系统软件具有较好的可移植性。5.软件维护人员通常不是改软件的开发人员,这给软件维护带来很大的困难。特别是有些软件在开发时没有遵循软件开发的准则,没有开发方法
9、的支持,维护这样的软件就更困难。下面列举一些与软件维护有关的问题。要维护一个软件,首先必须要理解它。而理解一个别人编写的程序通常是很困难的,尤其是对软件配置(指各种相关的文档)不齐全的软件,理解起来就更加困难。需要维护的软件往往缺少合格的文档,或者文档资料不齐全,甚至根本没有文档。在软维护中,合格的文档十分重要,它有助于理解被维护的软件。合格的文档不仅要完整正确地反映开发过程各阶段的工作成果,而且应当容易理解并应与程序源代码一致。而错误的文档会把对软件的理解引入歧途。在软件维护时,不要指望得到原来开发该软件的人员的帮助。开发人员开发完一个软件后,往往会从事另一软件的开发,甚至已离开原开发单位。
10、即使原来的开发人员还在,也可能时间太久而忘却了实现的细节。多数软件在设计时没有考虑到将来的修改,这给软件的修改造成了困难。而且在修改软件时很可能引入新的差错。软件维护通常不是一件吸引人的工作。从事维护工作常使维护人员缺乏成就感,这也严重影响维护工作,从而影响了维护质量的提高。1.答:首先,软件维护并非仅仅是改正程序中的错误,它还包括为了使软件适应变化了的环境而修改软件的活动,以及为了满足用户在使用软件的过程中提出的扩充或完善软件的新需求而修改软件的活动,甚至包括为了提高软件未来的可维护性或可靠性而主动地修改软件的活动。实际上,为了消除程序中潜藏的错误而进行的改正性维护,仅占全部维护活动的1/5
11、左右。其次,目前国外许多软件开发组织把60%以上的人力用于维护已有的软件”,指的是软件开发组织内人力分配的整体状况。至于具体到软件组织内的每位软件工程师,则分工各不相同。有些人专职负责软件维护工作,他们的全部工作时间都花费在维护已有软件产品的工作上;另一些人专职负责软件开发工作,他们并不花费时间去维护已有的软件产品;还有一些人可能既要从事软件开发工作又要兼管软件维护工作。第三,软件维护人员并非只负责维护自己开发的程序,通常,一名维护人员参与多个软件产品的维护工作。2.答:软件维护不像一般产品维修那样仅限于排除用户在使用产品的过程中遇到的故障。事实上,当用户在使用软件产品的过程中遇到了故障时,软
12、件维护人员必须进行改正性维护活动以诊断并改正软件中潜藏的错误;当运行软件的环境改变了的时候,软件维护人员必须适当地修改软件(即进行适应性维护),以使软件适应新的运行环境;当用户在使用软件的过程中提出增加软件功能或提高软件性能的要求时,软件维护人员必须对软件进行完善性维护,以满足用户的新需求。此外,在资源允许的情况下,对某些关键的老程序还可能主动地进行预防性维护。由于软件维护涵盖的范围很广(与一般产品维修有点类似的改正性维护仅占全部维护活动的20%左右),软件维护的工作量和成本自然就很高。一般产品的维修比较简单,用好部件替换被用坏了的部件就可以了。软件维护比一般产品维修要困难得多,实际上,不论是
13、哪种类型的维护,都必须修改原来的设计和程序代码。修改之前必须深入理解待修改的软件产品,修改之后还应该进行必要的测试,以保证所做的修改是正确的而且没有副作用。如果是改正性维护,还必须预先进行调试以确定错误的准确位置。从上面的叙述可知,软件维护远比一般产品维修要艰巨复杂得多。由于在正真动手修改软件设计和程序代码之前,必须进行许多准备工作(非生产性活动),在修改之后还要进行必要的测试(包括回归测试),因此,软件维护的一个显著特点就是生产率大幅度下降。这种情况在维护没有用软件工程方法学指导而开发出来的老程序时更严重。上述事实进一步加大了软件维护的工作量和成本。3.答:(1)正确。在分析用户需求的同时考
14、虑维护问题,列出将来可能变更或增加的需求,就可以在设计时为将来可能做的修改预先做一些准备,使得在用户确实提出这些维护要求时,实现起来比较容易一些。(2)不正确。程序中的注解是提高程序可理解性的关键的内部文档,删去程序中的注解必然会降低程序的可读性和可理解性,从而降低软件的可维护性。(3)正确。完整准确的文档对提高软件的可理解性有重要贡献,保证文档的正确性是提高软件可维护性的关键。(4)不正确。程序中使用的全局变量多,不仅违背局部化原理而且会使得具有公共环境耦合的模块数量增多,从而降低程序的可理解性、可修改性和可测试性,因此,这样的软件可维护性较差。(5)不正确。一般说来,效率高的算法的可理解性
15、较差,选用效率尽可能高的算法将降低软件的可维护性。事实上,程序的效率能够满足用户的需求就可以了,没有必要盲目地追求尽可能高的效率。(6)不正确。程序对硬件特点依赖越多,运行程序的硬件变更时适应性维护的工作量也就越大。(7)正确。用高级语言编程时,用户可以给程序变量和程序模块赋予含义鲜明的名字,通过名字能够比较容易地把程序对象和它们所代表的实体联系起来。此外,高级语言使用的概念和符号更符合人的习惯。上述事实都使用高级语言编写的程序更容易阅读,因此也就更容易维护。(8)不正确。模块间耦合越紧密,程序就越难理解和修改,修改后测试也比较困难。因此,加强模块间的联系将降低软件的可维护性。(9)不正确。程
16、序模块的规模很小,就会使程序中包含的模块很多,这将使模块间的接口数量大大增加,从而增加了理解、修改和测试程序的难度,降低了软件的可维护性。(10)正确。数据库系统比文件系统使用起来更方便、更安全,用数据库系统代替文件系统来存储需要长期保存的信息,可减少差错,降低改正性维护需求的数量。此外,使用数据库系统的程序比使用文件系统的程序更容易修改。上述事实表明,用数据库系统代替文件系统来存储需要长期保存的信息,将提高软件的可维护性。(11)正确。自动生成的程序段没有差错,对软件的改正性维护需求自然将减少。当因用户的需求变更而需要修改程序时,可以先修改相应部分的规格说明,然后用CASE环境或程序自动生成
17、工具自动生成需改动的程序,显然,这样做可以降低维护的工作量。(12)正确。可重用的软件构件基本上没有错误,用这样的构件组装成的程序可靠性高,改正性维护需求自然就比较少。此外,可重用的软件构件适应性强,应用范围广,容易使它适应新需求,因此,用这样的构件组装成的程序也较容易实现适应性或完善性维护。(13)正确。用先进的软件技术开发出来的软件容易理解、容易修改、容易重用,因此,可维护性较好。(14)正确。在程序中引入自检能力可以显著提高软件的可靠性,因此将明显减少改正性维护需求的数量。(15)正确。把和硬件及操作系统有关的代码放到某些特定的程序模块中,可以把因环境变化而必须修改的程序代码局限在少数模
18、块内,从而更容易修改和测试。4.答:通常,“对一个已有的软件做重大修改”意味着对软件功能做较大变更或增加较多新功能,这往往需要修改软件的体系结构。因此,了解原有软件的总体情况是很重要的。程序的规格说明书准确地描述了对软件系统的数据要求、功能需求、性能需求、可靠性和可用性要求、出错处理需求、接口需求、约束、逆向需求及将来可能提出的需求,对了解已有软件的总体情况有很大帮助。在对已有软件做重大修改之前仔细阅读、认真研究这份文档,可以避免许多修改错误。因此,应该选取这份文档。有经验的软件工程师通过阅读含有适当数量注解的源程序,不难搞清程序的实现算法,没有描述详细设计结果的文档并不会给维护工作带来太大困
19、难。此外,为了修改程序代码,原有程序的清单是必不可少的。因此,为了对这个软件做重大修改,应该选取的第二份文档是源程序清单。5.答:既然这个老程序目前还在为其用户完成关键的业务工作,可见它的业务重要程度相当高。但是,在十几年年软件工程还不像现在这样深入人心,软件过程管理还不成熟,那时开发出的软件往往可维护性较差。一般说来,用户的业务工作将持续相当长时间,也就是说,这个程序很可能还要继续服役若干年,在这么长的时间里它肯定还会经历若干次修改。与其每次花费很多人力物力来维护这个老程序,还不如在现代软件工程方法学指导性再造这个程序(即对它进行再工程)。粗看起来,在这个老程序还能正常完成用户的业务工作时重
20、新开发它,在经济上似乎很不划算,其实不然。理由如下:、老程序的可维护性差,每次维护它将花费很高的代价。在现代软件工程指导下开发出的软件的可维护性较好。此外,在再工程过程中可以建立起完整准确的文档,这进一步提高了软件的可维护性。因此,再工程之后每次维护它的代价将比再工程之前低很多,也就是说,可以节省很多人力物力。正在工作的老程序相当于一个原型,软件工程师从它那里可学到许多知识,从而大大提高了开发生产率。用户拥有长期使用该程序的丰富经验,容易提出对它的改进意见。通过再工程实现了用户的这些新需求之后,往往在相当长的一段时间内不需要再维护。现有的软件再工程工具可以自动完成一部分再工程工作。6.答:代码重构和正向工程都需要重新设计数据结构和算法,并且需要重新编写程序代码,这些是代码重构和正向工程相同的地方。通常,代码重构并不修改程序的体系结构,它只修改某些模块的设计细节和模块中使用的局部数据结构,并重新编写这些模块的代码。如果修改的范围扩展到模块边界之外并涉及到程序的体系结构,则代码重构变成了正向工程。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1