第一章软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。软件危机的表现:(1)软件开发进度和成本难以控制。(2)软件产品难以满足用户的需求。(3)软件质量难以得到保证。(4)软件产品难以进行维护。(5)软件的文档资料难以管理。(6)软件产品的生产率难以得到提高。软件危机出现的原因:一方面是软件自身特点,另一方面是开发软件和使用软件的人员。(1)对软件开发缺乏正确的理论指导。(2)软件开发人员与用户缺乏充分的交流。(3)对软件开发过程缺乏整体认识。(4)对软件产品缺乏有效一致的质量评价标准。软件工程发展的四个阶段:(1)传统软件工程阶段:用工程化思想指导软件项目开发逐步为业界所理解和接受。(2)面向对象软件工程阶段:这一阶段的发展是以“对象”为基础展开的。(3)过程工程的软件工程阶段:提出对软件项目管理的计划,实施,监控,成本核算,质量保证以及软件配置的技术和过程,逐步形成了过程软件工程,并衍生出群体过程和个体过程两个子类。(4)构建工程的软件工程阶段:重视发展软件体系结构,软件设计模式,系统交互性,标准化等领域的重用,积极提倡基于软构件的开发方法。软件工程的概念:应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品和定义,开发,发布和维护的工程或进行研究的学科。软件工程三要素:方法,工具,过程。简答第一大题衡量软件质量的因素:(1):可理解性:它对软件体系结构,数据程序的描述清晰和易于掌握的程度。(2)功能性:它是软件所实现的功能和达到的性能与满足用户实际需求的程度(3)安全性:它是软件具有的自身保护能力的程度。(4)可靠性:它是软件在给定的时间、空间、外部环境等条件下,按照设计须有,成功运行的能力。(5)有效性。它是软件能充分利用计算机时间、空间、宽带等资源的能力。(6)可扩充性;它是软件在功能或性能发生变化时,系统改变的容易程度。(7)可维护性,它是软件出现异常时,对系统进行修改、改进、删除、增加等操作,并恢复系统正常运行的能力。(8)可重用性,它是软件的部分或整体被其他系统利用的程度(9)可移植性,它是将软件系统有一个软件或硬件环境转移到另一个软件或硬件环境的容易程度。软件的七大基本原理1,用分阶段的生命周期计划严格管理。2,坚持进行阶段评审。3,执行严格的产品质量控制4,采用现代程序设计技术5,结果应能清楚地审查。6,开发人员应少而精。7,承认不断改进软件工程的必要性软件实现的是一个从现实问题域(输入)到信息域的解(输出)的过程,在此过程中包括程序、数据、文档、以及它们之间的联系软件生命周期六个阶段1,可行性与计划研究阶段。2需求分析阶段。3,设计阶段。4,实现阶段。5,测试阶段、6,运行和维护阶段软件过程模型:(1)瀑布模型:1、特点:简单、严格(每一阶段过程都始于前一阶段过程的结束,每一阶段结束后都进行技术审查和管理复查)、顺序、质量保证。2、适用领域:瀑布模型是一次性单向开发,难以适应软件需求不明确或出现变动的情况。(2)原型模型:1、特点:快速、符合用户预期。2、适用领域:原型模型不适宜开发大型软件项目,是在需求不明确的情况下开发的。(3)增量模型:1、特点:灵活性(可以按照用户需求有选择地先开始进行系统中重要部分内容的分析与设计)、降低风险。2、适用领域:需求不明确、开发功能多、开发时间长的系统。(4)螺旋模型:将原型模型和瀑布模型相结合,并第一个引入风险分析机制,是迭代式开发过程。特点:1、风险分析,螺旋模型首次采纳风险分析,让开发者和客户能较好地对待和理解每一次迭代所带来的风险,降低软件开发中的技术、管理和成本的风险。2、特别适应大型复杂系统的开发,能及时发现开发过程中出现的风险,并能尽早地规避风险,或给出消除风险的方案。(5)喷泉模型:1、特点:开发阶段的相互重叠、支持重用、不严格的阶段划分,增量式开发、对象驱动。2、适用领域:用于面向对象软件开发,并支持重用。(6)敏捷过程模型:1、特点:简单(以快速、简单、使用、满足用户需求为要旨)、变化(敏捷过程模型要能反映这种变化,并将变化及时反映在软件的设计和实现中)、有目的的建模(多与团队人员沟通,与客户沟通,保证建模的正确性和足够详细)、快速反馈(在开发过程中,自己所做的工作,与别人合作,都应该及时得到反馈,快速反馈是建立在团队合作的基础上)2、优点:综合瀑布模型和原型模型的优点,在保证减少错误的前提下,快速得到用户系统,在每个阶段都引入风险分析。快速开发、建模,不但能够促进个人和团队开发人员之间的沟通。第二章基本的需求分析任务是:定义软件的适用领域和必须满足的约束(需求发现),确定系统功能、性能、领域等内容,确定软件与其他成分间的借口和通信(需求分析),建立数据模型、功能模型和行为模型(建模),最终定义需求规格说明书,并经技术审查和管理复审,用作评价确认测试和质量评估的依据。系统中最主要的、最基本的要求是功能需求。定义逻辑模型:通过定义逻辑模型,把问题域中的问题转换为信息领域问题。需求分析的原则:软件人员要从用户角度考虑软件需求;以流程为主线;尽量重用软部件;划分需求的优先级;需求变更要及时反馈;需求分析的内容:功能需求,性能需求,领域需求,其他需求。功能需求:描述系统提供的服务和在特定条件下的行为,包括系统登陆、输入、响应、输出、异常等,有事还需要特别的说明系统不应该做什么。通过功能需求分析,划分出系统必须完成的所有功能。软件的功能描述满足完整性和一致性。性能需求:规定了软件系统必须满足在时间上或空间上的约束,通常包括系统响应时间,主存容量,储存容量,安全性,压力等方面的需求。领域需求:与软件系统的具体应用范围有关,它是对需求中的功能或数据在领域上需要的特别实现,具有特殊性。其他需求:是软件系统有关的外在约束,如法律需求,道德需求,外部数据交换需求,预期需求等。需求工程过程中的活动:需求工程过程是一个可行性研究、需求获取、需求分析与建模、需求评审的迭代过程。可行性研究:是需求工程最初的计划阶段,目的不是确定问题如何去解,而是确定问题是否值得去解。可行性分析主要包括四个方面的内容:(1)技术可行性:从问题的复杂性、现有技术、技术所需代价、技术风险等三个方面出发。(2)操作可行性。(3)经济可行性:运用软件成本估算技术(成本/效益分析等方法)判断是否盈利。(4)法律可行性。需求分析与建模:采用软件开发方法提供的图形工具,用形式化或半形式化的定义来描述初步需求,确保需求的完整性、正确性和一致性,将目标系统的物理模型转换为详细模型。需求工程的管理:存在两大难题:一是需求确认困难,二是需求不断变更。对传统的需求变更管理过程来说,主要包括软件配置、软件基线和变更审查。软件配置项主要有两类:一是属于产品自身需要的内容,如开发文档、代码、数据等;二是为软件产品服务的内容,如进度计划,人员安排,报告等。软件基线由一组软件配置组成,当软件配置处于稳定状态后(如需求文档经过评审以后),就确定了这组软件配置项的基线。需求获取技术:(1)个别会议和小组会议:小组会议则体现了用户群组的集思广益。W5H2原则(Why:为什么要开发该系统?,What:系统将要开发的功能是什么?,When:什么时候开发?,Who:系统由谁负责?系统会有哪些相关的人、事务或其他系统?Where:所开发的业务处于整个系统的什么位置?,How:完成系统的开发目标技术上采用何种方法?管理上如何进行?,Howmuch:开发系统需要那些资源?需要多少?)(2)调查问卷。(3)面向用例的场景分析:访谈和问卷调查是一种抽象的需求描述,存在用户描述模糊,分析员工不理解甚至误解的情况。用户的一次手工操作就是一个用例。场景让分析员实际模拟了用户的操作流程,但需要注意防止场景陷阱。(4)快速原型技术:快速原型技术的基本思想是,在系统的开发时期就让用户尽早地接触系统,对系统原型进行评估,指出不足之处并提出修改意见。快速原型有两种不同类型:抛弃型原型法和演化型原型法。演化型原型法是无风险机制,任然是迭代的。结构化需求分析和建模:主要目的是减少分析时的错误,通过自定向下地建立系统逻辑模型,降低系统设计时的复杂性,提高系统的可维护性。结构化分析的核心是数据。包括:实体关系模型,数据流图,状态转换图。面向对象的数据建模:数据建模给出了软件开发过程中与各部分设计有关的所有数据对象。数据对象包括实体、实体属性和实体间关系。实体关系模型(ER)是结构化建模的可视化图形工具,他描述了数据对象(实体),对象属性和对象间关系。关系和基数:基数表明数据对象在关系上的数量约束,在ER模型中,关系用菱形表示,它通常是一个动词或动宾短语。基数关系(一对一一对多多对多)数据流图是结构化建模中最流行的功能建模工具。建模的基本过程:(1)确定系统的外部信息源,数据源或外部系统的接口。(2)画出顶层(0层)DFD图。(3)第一次精化:划分系统的子系统。(4)逐层求精:对各子系统进一步精化。面向状态转换的行为建模:行为建模是所有需求分析办法的操作性原则,系统状态的改变状态转换图来描述。STD图中的状态分为初态,终态,中间状态和复合状态。状态变换是由事件或条件触发的。STD图定义了3个标准事件,它们都没有参数:(1)entry事件:用于说明转换到该状态的特定动作。(2)exit事件:用于说明触发该状态的特定动作。(3)do事件:用于说明处于当前状态时执行的动作。数据字典:以结构化方式定义了在数据建模、功能建模和行为建模过程中设计的所有数据信息、控制信息。词条描述:详细说明了数据和控制信息在系统内的传播途径,它包括数据流词条,数据元素词条,加工词条和存储文件词条等内容。定义式特点:清晰、准确、无二义地定义数据。Warnier图用树形结构表示数据的层次结构,利用顺序,选择和重复三种结构对应数据的层次分解,并指出可以从数据层次结构导出程序结构。加工逻辑:也称为过程说明,用于描述DFD中加工部分的流程或算法。加工逻辑的形式主要有过程描述语言、判断树和判断表等。过程描述语言也称为伪码语言,它是一种介于自然语言和形式语言之间的结构化语言。第三章软件设计的目标就是要构造一个高内聚、高可靠性、高维护性和高效的软件模型。软件设计的依据是需求规格说明和数据规格说明,并将它们映射为软件设计的内容。一般把软件设计分为概要设计和详细设计两个子阶段。概要设计包括:体系结构设计、界面设计和数据设计。模块化设计的指导思想是分解、抽象、求精、信息隐藏和模块独立性。界面设计的任务主要包括用户特性研究、用户工作分析、界面任务分析、界面类型确定和界面原型评估。分布式结构存在的不足:复杂性、安全性、运行状态难以确定。出选择:体系结构设计:确定各子系统模块间的数据传递、调用关系。界面设计:包括与系统交互的人机界面设计以及模块间、系统与外部的接口关系。数据设计:包括数据库、数据文件、全局数据结构的定义。体系结构设计是软件设计的早期活动,它的作用集中在两点:1、提供软件设计师能预期的体系结构描述2、数据结构、文件组织、文件结构体现了软件设计的早期抉择,这些抉择将极大地影响着后续的软件开发人员,影响着软件产品的最后成功。抽象:抽象是指对软件设计不同层次的理解,它与分解是解决问题的两个方面。分解是对问题细节的表述,抽象则忽略问题的细节,抓住问题的本质。抽象根据对象类型的不同,分为对实体对象抽象、接口抽象和设计模式抽象。模块独立性由内聚性好人耦合度两个指标来评价。内聚性高或耦合度低,独立性就强。内聚性:偶然内聚:模块间功能偶然聚集在一起,导致模块的不易理解,不易修改维护。逻辑内聚:将逻辑相关的功能放在同一模块内,由模块参数来决定执行哪一个功能。时间内聚:各任务间彼此无联系,但由于需要在同一时间运行而聚集在一起。过程内聚:按照过程描述,在同一模块内至上而下的组织各任务。通信内聚:模块中各成分引用共同的数据,即模块内的功能使用统一输入数据。顺序内聚:各成分中,前一部分的输出是下一部分的输入,它们彼此具有较高的依赖性。功能内聚:共同完成一个具体功