应用以上任何一种技术之前,都应当对错误的征兆进行全面彻底的分析,得出对出错位置及错误性质的推测,再使用一种适当的排错方法来检验推测的正确性。 2、回溯法
该方法适合于小规模程序的排错。即一旦发现了错误,先分析错误征兆,确定最先发现“症状”的位置。然后,从发现“症状”的地方开始,沿程序的控制流程,逆向跟踪源程序代码,直到找到错误根源或确定错误产生的范围。 3、 原因排除法
原因排除法是通过演绎和归纳,以及二分法来实现的。
演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。演绎法排错是测试人员首先根据已有的测试用例,设想及枚举出所有可能出错的原因作为假设。然后再用原始测试数据或新的测试,从中逐个排除不可能正确的假设。最后,再用测试数据验证余正气假设确定出错的原因。
归纳法是一种从特殊扒断出一般的系统化思考方法。其基本思想是从一些线索(错语征兆或与错误发生有关的数据)着手,通过分析寻找到潜在的原因,从而找出错误。
二分法实现的基本思想是,如果已知每个变量在程序中若干个关键点的正确值,则可以使用宣传语句(如赋值语句、输入语句等)在程序中的某点附近给这些变量赋正确值,然后运行程序并检查程序的输出。如果输出结果是正确的,则错误原因在程序的前半部分;反之,错误原因在程序的后半部分。对错误原因所在的部分重复使用这种方法,直到将出错范围缩小到容易诊断的程序为止。
需要注意的一个实际问题是,调试的成果是排错,为了修改程序中错误,往往会采用“补丁程序”来实现,而这种做法会引起整个程序质量的下降,但是从目前程序设计发展的状况看,对大规模的程序的修改和质量保证,又不失为一种可行的方法。 习题3
一、 选择题
1、 软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是
A、概要设计 B、详细设计 C、可行性分析 D、需要分析 2、下面不属于软件工程的3个要素的是
A、工具 B、过程 C、方法 D、环境
3、检查软件产品是否符合需求定义的过程称为
A、确认测试 B、集成测试 C、验证测试 D、验收测试
4、数据流图用于抽象描述一个软件逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是
A、控制流 B、加工 C、数据存储 D、源和潭 5、下面不属于软件设计原则的是
A、抽象 B、模块化 C、自底向上 D、信息隐蔽 6、程序流程图(PFD)中的箭头代表的是
A、数据 流 B、控制 流 C、调用关系 D、组成关系
7、下列工具中为需求分析常用工具的是
A、PAD B、PFD C、N-S D、DFD 8、在结构化方法中,软件功能分解属于列软件开发中的阶段是
A、详细设计 B、需求分析 C、总体设计 D、编程调试 9、软件调试的目的是
A、发现错误 B、改正错误 C、改善软件的性能 D、挖掘软件的潜能 10、软件需求分析阶段的工作,可以分为四个方面:需求获取,需求分析,编写需求规格说明书,以及
A、阶段性报告 B、需求评审 C、总结 D、都不正确 二、填空题
1、软件是程序、数据和 的集合。
2、Jackson方法是一种面向 的结构化方法。 3、数据流图的类型有 和事务型。
4、软件工程研究的内容主要包括: 技术和软件工程管理。 5、软件开发环境是全面支持软件开发全过程的 集合。 软件工程基础
3.1软件工程基本概念 一、软件定义与软件特点
计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。基中,程序是软件开发人员根据用户需求开发的用程序设计语言描述的、适合计算机执行的指令(语句)序列。数据是使程序能正常操纵信息的数据结构。文档是与程序开发、
维护和使用有关的图文资料。可见软件由两部分组成:一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。
国标(GB)中对计算机软件的定义为:与计算机系统的操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。
软件在开发、生产、维护和使用等方面与计算机硬件相比存在明显的差异。深入理解软件的定义需要了解软件的特点: (1) 软件是一种逻辑实体,而不是物理实体具有抽象性。
(2) 软件的生产与硬件不同,它没有明显的制作过程。一旦研制开发成功,可以大量拷贝同一内容的副本。所以对软件的控制,必须着重在软件开发方面下功夫。
(3) 软件在运行、使用期间不存在磨损、老化问题。
(4) 软件的开发运行对计算机系统具有依赖性,受计算机系统的限制这导致了软件移植的问题。 (5) 软件复杂性高,成本昂贵。 (6) 软件开发涉及诸多的社会因素。
软件按功能可以分为:应用软件、系统软件、支撑软件(或工具软件)。应用软件是为解决特定领域的应用而开发的软件。系统软件是计算机管理自身资源,提高计算机使用效率并为计算机用户提供各种服务的软件。支撑软件是介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括辅助和支持开发和维护应用软件的工具软件。 二、软件危机与软件工程
软件工程概念的出现源自软件危机。
所谓有软件危机四伏是泛指在计算机软件开发和维护过程中所遇到的严重问题。实际上,几科所有的软件都不同程度地存在这些问题。
随着计算机技术的发展和应用领域的扩大,计算机硬件性能/价格比和质量稳步提高,软件规模越来越大,复杂程度不断增加,软件成本逐年上升,质量没有可靠的保证,软件已成为计算机科学发展的“瓶颈”。 具体地说,在软件开发和维护过程中,软件危机主要表现在:
(1) 软件需求的增长得不到满足。用户对系统不满意的情况经常发生。
(2) 软件开发成本和进度无法控制。开发成本超出预算,开发周期大大超过规定日期的情况经常发生。 (3) 软件质量难以保证。
(4) 软件不可维护或护程度非常低。 (5) 软件的成本不断提高。
(6) 软件开发生产率的提高赶不上硬件的发展和应用需求的增长。 总之,可以将软件危机归结为成本、质量、生产率等问题。
软件工程就是试图用工程、科学和数学的大批量与方法研制、维护计算机软件的有关技术及管理方法。
关于软件工程的定义,国标(GB)中指出,软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具文档、实践标准的工序。
1993年IEEE(Institute of Electrical &Electronic Engineers ,电气和电子工程师学会)给出了一个更加综合的定义:“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中”。
软件工程包括3个要素:即方法、工具和过程。方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。
软件工程的核心思想是把软件产品看作是一个工程产品来处理。
开发软件不能只考虑开发期间的费用,而且应考虑软件生命周期内的全部费用。因此,软件生命周期的概念就变得特别重要。在考虑软件费用时,不仅仅要降低开发成本,更要降低整个软件生命周期的总成本。 三、软件工程过程与软件生命周期
1、软件工程过程(Software Engineering Process)
ISO9000定义:软件工程过程是把输入转化为输出的一组彼此相关的资源和活动。
定义支持了软件工程过程的两方面内涵。其一,软件工程过程是指为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工程活动。基于这个方面,软件工程过程通常包含4种基本活动: (1) P(plan)——软件规格说明。规定软件的功能及其运行时的限制。 (2) D(do)——软件开发。产生满足规格说明的软件。
(3) C(check)——软件确认。确认软件能够满足客户提出的要求。
(4) A (action)——软件演进。为满足客户的变更要求,软件必须在使用的过程中演进。
通常把用户的要求转变成软件产品的过程也叫做软件开发过程。此过程包括对用户的要求进行分析,解释成软件需求,把需
求变换成设计,把设计用代码来实现并进行代码测试,有些软件还需要进行代码安装和交付运行。 其二,从软件开发的观点看,它就是使用适当的资源(包括人员、硬软件工具、时间等),为开发软件进行的一组开发活动,在过程结束时将输入(用户要求)转化为输出(软件产品)。
所以,软件工程的过程是将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。软件工程过程应确定方法使用的顺序、要求交付的文档资料、为保证质量和适应变化所需要的管理、软件开发各个阶段完成的任务。 2、软件生命周期(software life cycle)
通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。一般包括可行性研究与需求分析、设计、实现、测试、交付使用以及维护等活动。
还可以将软件生命周期分为软件定义、软件开发及软件运行维护三个阶段。软件生命周期的主要活动阶段是:
(1) 可行性研究与计划制定。确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠性以及接口等方面的可能方案,制定完成开发任务的实施计划。
(2) 需求分析。对待开发软件提出的需求进行分析并给出详细定义。编写软件规格说明书及初步的用户手册,提交评审。
(3) 软件设计。系统设计人员和程序设计人员应该在反复理解软件需求的基础上,给出软件的结构、模块和划分、功能的分配及处理流程。在系统比软件复杂的情况下,设计阶段可分解成概要设计阶段和详细设计阶段。编写概要设计说明书、详细设计说明书和测试计划初稿,提交评审。
(4) 软件实现。把软件设计转换成计算机可以接受的程序代码。即完成源程序的编码,编写用户手册、操作手册等面向用户的文档,编写单元测试计划。
(5) 软件测试。在设计测试用例的基础上,检验软件的各个组成部分。编写测试分析报告。
(6) 运行和维护。将已交付的软件投入运行,并在运行使用中不断地维护,根据新进出的需求进行必要而且可能的扩充和删改。
四、软件工程的目标与原则 1、软件工程的目标
软件工程的目标是,在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。
软件工程需要达到的基本目标应是:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护费用;能按时完成开发,及时交付使用。
基于软件工程的目标,软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。 (1) 软件开发技术
软件开发技术包括:软件开发法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。软件开发方法学是根据不同的软件类型,按不同的观点和原则,对软件开发中应遵循的策略、原则、步骤和必须产生的文档资料都做出规定,从而使软件的开发能够进入规范化和工程化的阶段,以克服早期的手工方法生产中的随意性和非规范性做法。 (2) 软件工程管理
软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。
软件工程管理是软件按工程化生产时的重要环节,它要求按照预选制定的计划、进度和预算执行,以实现预期的经济效益和社会效益。
软件工程经济学是研究软件开发中成本的估算、成本效益分析的方法和技术,用经济学的基本原理来研究软件工程开发中的经济效益问题。
软件心理学是软件工程领域具有挑战性的一个全新的研究视角,它是从个体心理、人类行为、组织行为和企业文化等角度来研究软件管理和软件工程的。 2、软件工程的原则
为了达到上述的软件工程目标,在软件开发过程中,必须遵循软件工程的基本原则。这些基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
(1) 抽象。抽取事物最基本的特性和行为,忽略非本质细节。采用分层次抽象,自顶向下,逐层细化的办法控制软件开发过程的复杂性。
(2) 信息隐蔽。采用封闭技术,将程序模块的实现细节隐藏起来,使模块接口尽量简单。
(3) 模块化。模块是程序中相对独立的成分,一个独立的编程单位,应有良好的接口定义。模块的大小要适中,模块过大会使模块内部的复杂性增加,不得对模块的理解和个性也不得模块的调试和重用。模块太小会导致整个系统表示过于复杂,不利于控制系统的复杂性。
(4) 局部化。要求在一个物理模块内集中逻辑上相互关联的计算资源,保证模块间具有松散的耦合关系,模块内部有较强的内骤性,这有助于控制角的复杂性。
(5) 确定性软件开发过程中所有概念的表达应是确定的、无歧义且规范的。这有助于人与人的交互不会产生误解
和遗漏,以保证整个开发工作的协调一致。
(6) 一致性。扬程序、数据和文档的整个软件系统的各模块应使用已知的概念、符号和术语;程序内外部接口应保持一致,系统规格说明与系统行为应保持一致。
(7) 完备性。软件系统不丢失任何重要成分,完全实现系统所需的功能。
(8) 可验证性。开发大型软件系统需要对系统自顶向下,逐层分解。系统分解应遵循容易检查、测评、评审的原则,以确保系统的正确性。
五、软件开发工具与软件开发环境
现代软件工程方法之所以千里马实施,其重要的保证是软件开发工具的环境的保证,使软件在开发效率、工程质量等多方面得到改善。软件工程鼓励研制和采用各种先进的软件开发方法、工具和环境。工具和环境的使用进一步提高了软件的开发效率、维护效率和软件质量。 1、 软件开发工具 2、 软件开发环境
软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。
计算机辅助软件工程(CASE,computer aided software engineering)是当前软件开发环境中富有特色的研究工作和发展方向。CASE将各种软件工具、开发机器和一个慧放开发过程信息的中心数据库组合起来,形成软件工程环境。CAS3E的成功产品将最大限度地降低软件开发的技术难度并使软件开发的质量得到保证。