(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的成功产品将最大限度地降低软件开发的技术难度并使软件开发的质量得到保证。
3.2结构化分析方法
软件开发方法是软件开发过程所遵循的方法和步骤,其目的在于有效地得到一些工作产品,即程序和文档,并且满足质量要求。软件开发方法包括分析方法、设计方法和程序设计方法。 一、 需求分析与需求分析方法 1、 需求分析
软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。需求分析的任务是发现需求、求精、建模和定义需求的过程。需求分析将创建所需的数据模型、功能模型和控制模型。 (1)需求分析的定义
A、用户解决问题或达到目标所需的条件或权能;
B、系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件或权能; C、一种所映A、或B所描述的条件或权能的文档说明。
由需求体魄 定义可知,需求分析的内容包括:提炼、分析和仔细审查已收集到的需求;确保所有利益相关者都明白其含义并找出其中的错误、遗漏或其他不足的地方;从用户最初的非形式化需求到满足用户对软件产品的要求的映射;对用户意图不断进行提示和判断。 (2)需求分析阶段的工作
需求分析阶段的工作,可以概括为四个方面:
A、 需求获取 需求获取的目的是确定对目标系统的各方面需求。涉及到的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。
B、 需求分析 对获取的需求进行分析和综合,最终给出系统的解决方案和目标系统的逻辑模型。
C、 编写需求规格说明书 需求规格说明书作为需求分析的阶段成果,可以为用户、分析人员和设计人员之间的交流提供方便,可以直接支持目标软件系统的确认又可以作为控制软件开发进程的依据。
D、 需求评审 在需求分析 的最后一步,对需求分析阶段的工作进行得审,验证需求文档的一致性、可行性、完整性和有效性。
2、 需求分析方法 常见的需求分析方法有:
A、 结构化分析方法。主要包括:面向数据流的结构化分析方法(SA—Structured analysis),面向数据结构的Jackson方法(JSD—Jackson system development method),面向数据结构的结构化数据系统开发方法(DSSD—Data structured system development method)。
B、 面向对象的分析方法(OOA—Object-Oriented method)。
从需求分析建立的模型的特性来分,需求分析方法又分为表态分析方法和动态分析方法。 二、 结构化分析方法
1、 关于结构化分析方法
结构化分析方法是结构化程序设计理论在软件需求分析阶段的运用。
对于面向数据流的结构化分析方法,按照DeMarco的定义,“结构化分析就是使用数据流图(DFD)、数据字典(DD)、结构化英语、判定表和羊定树等工具,来建立一种新的、称为结构化规格说明的目标文档。”
结构化分析方法的实质是着眼于数据流自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具建立系统的逻辑模型。
结构化分析的步骤如下:
A、 通过对用户的调查,以软件的需求为线索,获得当前系统的具体模型; B、 去掉具体模型中非本质因素,抽象出当前系统的逻辑模型;
C、 根据计算机的特点分析当前系统与目标系统的差别,建立目标系统的逻辑模型; D、 完善目标系统并补充细节,写出目标系统的软件需求规格说明; E、 评审直到确认完全符合用户对软件的需求。 2、 结构化分析的常用工具
(1) 数据流图(DFD—Data Flow Diagram)
数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。
数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。数据流图中的主要图形元素与说明如下: 加工(转换)。输入数据经加工变换产生输出。
数据流沿箭头方向传送数据的通道,一般在旁边标注数据流名。 存储文件(数据源)。表示处理过程中存放各种数据的文件。 源,潭。表示系统和环境的接口,属系统之外的实体。
一般通过对实际系统的了解和分析后,使用数据流图为系统建立逻辑模型。建立数据流图的步骤如下: 第1步:由外向里:先画系统的输入输出,然后画系统的内部。 第2步:自顶向下:顺序完成顶层、中间层、底层数据流图。 第3步:逐层分解。
为保证构造的数据流图表达完整、准确、规范,应遵循以下数据流图的构造规则和注意事项: ① 对加工处理建立惟一、层次性的编号,且每个加工处理通常要求既有输入又有输出; ② 数据存储之间不应该有数据流; ③ 数据流图的一致性。 ④ 父图、子图关系与平衡规则。 (2)数据字典(DD—Data Dictionary)
数据字典是结构化分析方法的核心。数据字典是对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。数据字典把不同的需求文档和分析模型紧密地结合在一起,与各模型的图形表示配合,能清楚地表达数据处理的要求。
概括地说,数据字典的作用是对DFD中出现的被命名的图形元素的确切解释。通常数据字典饮食的信息有:名称,别名、何处作用/如何使用、内容描述、补充信息等。 (3) 判定树
使用判定树进行描述时,应先从问题定义的文字描述中分清哪些是判定的条件,哪些是判定的结论,根据模仿材料中的连接词找出判定条件之间的从属关系、并列关系、选择关系,根据它们构造判定树。 (4) 判定表
判定表与判定树相似,当数据流图中的加工要依赖于多个逻辑条件的联欢会,即完成该加工的一组动作是由于某一组条件联欢会的组合而引发的,使用判定表描述比较适宜。判定表由四部分组成,基本条件,条件项,基本动作,动作项 三、 软件需求规格说明书
软件需求规格说明书(SRS, software Requirement Specification) 是需求分析阶段的最后成果,是软件开发中的文档之一。 1、 软件需求规格说明书的作用 ① 便于用户、开发人员进行理解和交流。 ② 反映出用户问题的结构,可以作为软件开发工作的基础和依据。 ③ 作为确认测试的验收的依据。 2、 软件需求规格说明书的内容 一、 概述
二、 数据描述 ? 数据流图 ? 数据字典
? 系统接口说明 ? 内部接口 三、 功能描述 ? 功能 ? 处理说明 ? 设计的限制 四、 性能描述 ? 性能参数 ? 测试种类
? 预期的软件响应 ? 应考虎的特殊问题 五、 参考文献目录 六、 附录
其中,概述是从系统的角度描述软件的目标和任务。 数据描述是对软件系统所必须解决的总是作出的详细说明
功能描述中描述了为解决用户问题所需要的每一项功能的过程细节。对每一项功能要给出处理说明和在设计时需要考虑的限制条件。
在性能描述中说明系统应达到的性能和应该满足的限制条件,检测的方法和标准,预期的软件响应和可能需要考虑的特殊问题。
参考文献目录中应包括与该软件有关全部参考文献,其中包括前期的其他文档、技术参考资料、产品目录手册以及标准等。 附录部分包括一些补充资料。 3、软件需求规格说明书的特点 ① 软件需求规格说明书是确保软件质量的有力措施,衡量软件需求规格说明书质量好坏的标准、标准的优先级及标准的内涵是: ② 正确性。体现待开发系统的真实要求。 ③ 无歧义性。对每一个需求只有一种解释,其陈述具有惟一性。 ④ 完整性。包括全部有意义的需求,功能的、性能的、设计的、约束的,属性或外部接口等方面的需求。 ⑤可验证性。描述的每一个需求都是可以验证的,即存在有限代价的有效过程验证确认。 ⑥ 一致性。各个需求的描述矛盾。 ⑦ 可理解性。需求说明书必须简明易懂,尽量少包含计算机的要领和术语,以便用户和软件人员都能接受它。 ⑧可修改性。每一个需求的来源、流向是清晰的,当产生和改变文件编制时,可以方便地引证每一个需求。 3.3 结构化设计方法
一、 软件设计的基本概念 1、 软件设计的基础
软件设计是软件工程的重要阶段,是一个把软件需求转换为软件表示的过程。软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务,即软件设计是确定系统的物理模型。 软件设计的重要性和地位概括为以下几点: ① 软件开发阶段(设计、编码、测试)占据软件项目开发总成本绝大部分,是在软件开发中形成质量的关键五一节; ② 软件设计是开发阶段最重要的步骤,是将需求准确地转化为完整的软件产品或系统的惟一途径; ③ 软件设计作出的决策,最终影响软件实现的成败; ④ 设计是软件工程和软件维护的基础。
从技术观点来看,软件设计包括软件结构设计、数据设计、接口设计、过程设计。其中,结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部、软件和协作系统之间以及软件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。
从工程管理角度来看,软件设计分两步完成:概要设计和详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。
软件设计的一般过程是:软件设计是一个迭代的过程;先进行高层次的结构设计;后进行低层次的过程设计;穿插进行数据设计和接口设计。
2、 软件设计的基本原理
软件设计遵循软件工程的基本目标和原则,建立了适用于在软件设计中应该遵循的基本原理和与软件设计有关的概念。 (1)抽象
抽象是一种思维工具,就是把事物本质的共同特性提取出来而不考虑其他细节。软件设计中考虑模块化解决方案时,可以定出多个抽象级别。抽象的层次从概要设计到详细设计逐步聊低。在软件概要设计中的模块分层也是由抽象到具体逐步分析和构造出来的。 (2)模块化
模块化是指把一个待开发的软件分解成若干个小的简单的部分。如高级语言中的过程、函数、子程序等。每个模块可以完成一个特定的子功能,各个模块可以按一定的方法组装起来成为一个整体,从而实现整个系统的功能。 模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。
为了解决复杂的问题,在软件设计中必须把整个问题进行分解来降低复杂性,这样就可以减少开发工作量并降低开发成本和提高软件生产率。但是划分模块并不是越多越好,因为这会增加模块之间接口的工作量,所以划分模块层次和数量应该避免过多或过少。 (3)信息隐蔽
信息隐蔽是指,在一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。 (4)模块独立性
模块独立性是指,每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。是评价设计好坏的重要度量标准。衡量软件的模块独立性作用耦合性和内聚性两个定性的度量标准
○1内聚性:内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。内聚是从功能角度来度量模块内的联系。 内聚有如下的种类,它们之间的内聚性由弱到强排列为:
偶然内聚 逻辑内聚 时间内聚 过程 通信内聚 顺序内聚 功能内聚
内聚性是信息隐蔽和局部化概念的自然扩展。一个模块的内聚性越强则该模块的模块独立性越强。作为软件结构设计的设计原则,要求生一个模块的内部都具有很强的内聚性,它的各个组成部分彼此都密切相关。 ○2耦合性:耦合性是模块间互相连接的紧密程度的度量。
耦合性取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口。耦合可以分为下列几种,它们之间的耦合度由高到低排列为:
内容耦合:如一个模块直接访问另一模块的内容,则这两个模块称为内容耦合。
公共耦合:若一组模块都有访问同一全局数据结构,则它之间的耦合称之为公共耦合。 外部耦合:一组模块都访问同一全局简单变量(而不是同一全局数据结构),且不通过参数表传递该全局变量的信息,则称为外部耦合。
控制耦合:若一模块明显地把开头量、名字等信息送入另一模块,控制另一模块的功能,则为控制耦合。
标记耦合:若两个以上的模块都需要其余某一数据结构子结构时,不使用其余全局变量的方式而是用记录传递的方式,即两模块间通过数据结构变换信息,这样的耦合称为标记耦合。
数据耦合:若一个模块访问另一个模块,被访问模块的输入和输出都数据项参数,即两模块间通过数据参数交换信息,则这两个模块为数据耦合。
非直接耦合:若两个模块没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,则称这两个模块为非直接耦合。非直接耦合独立性最强。
耦合性越强,独立性越弱,希望模块之间的耦合表现为非直接耦合方式。但是,由于问题所固有的复杂性和结构化设计的原则,非直接耦合往往是不存在的。
耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有得提高模块的独立性。
3、 结构设计方法
与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各成分之间的内部联系的技术。也就是说,结构设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体有清楚定义的问题。
结构化设计方法的基本思想是将软件设计成由相对独立、单一功能的模块组成的结构。 二、 概要设计
1、 概要设计的任务 软件概要设计的基本任务是: (1) 设计软件系统结构
在需求分析阶段,已经把系统分解成层次结构,而在概要设计阶段,需要过去时一步分解,划分为模块以及模块的层次结构。划分的具体过程是: ① 采用某种设计方法,将一个复杂的系统按功能划分成模块。 ② 确定每个模块的功能。