1、第一章1.什么是软件工程?为了经济的获得可靠的,在实际机器上高效运行的软件,而建立和使用的好的工程原则。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程2.什么是软件危机?软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。3 产生软件危机的原因. 软件缺乏“可见性”,软件的开发过程的进展情况难以衡量,软件质量难以评价;. 软件维护意味着改正或修改原来的设计,使维护较难;. 软件规模大,须由多人分工合作,管理难度大;. 软件专业人员对软件开发和维护有
2、糊涂观念,常采用错误的方法和技术;(错误的认识和做法主要表现,(1)忽视软件需求分析的重要性;(2)忽视软件维护)4 软件工程的基本原理1) 用分阶段的生命周期计划严格管理;2) 坚持进行阶段评审;3) 实行严格的产品控制;4) 采用现代程序设计技术;5) 结果应能清楚地审查;6) 开发小组的人员应该少而精;7) 承认不断改进软件工程实践的必要性。5 软件生命周期分为三大阶段(8 个小阶段)(A) 软件定义阶段:a. 问题定义阶段:“要解决的问题是什么?”b. 可行性研究阶段:“对上一阶段所确定的问题是否值得去解?是否有可行的解决办法?”c. 需求分析阶段:“为解决这个问题,目标系统必须做什么
3、?”(B) 软件开发阶段:a.总体设计阶段:“应该怎样概括地实现目标系统?”b.详细设计阶段:“应该怎样具体地实现这个系统呢?”c.编码和单元测试阶段:写出正确的容易理解、易于维护的程序模块并仔细测试每个模块。d.综合测试:通过各类测试使软件达到预定要求。(C) 软件维护阶段:a 通过各种必要的维护活动使系统持久 地满足用户的需要。6 什么是软件 ?Software = Program + Data + Document软件( software)是能够完成预定功能,并对相应数据进行加工的程序 (Program)和描述程序及其操作的文档( document)。7 软件工程三要素: 过程、方法和工
4、具8 软件工程基本原则 在软件开发过程中,为了达到软件开发目标,必须遵循下列原则:抽象 模块化 信息隐藏 局部化一致性 完备性 可验证性第二章1 可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否有解,是否值得去解。2 可行性研究的三个方面:(1) 技术可行性:现有技术能够实现这个系统吗?(2) 经济可行性:经济效益能否超过开发成本?(3) 操作可行性:系统的操作方式在这个用户组织内行得通吗?3 数据流图(Data Flow Diagram,DFD)是描述系统中数据流程的图形工具和逻辑输出,它标识了一个系统的逻辑输入,以及把逻辑输入转换为逻辑输出所需的加工处理。4 数据流图的图符图
5、 1 是:数据 A 和 B 同时输入才能变换成数据 C图 2 是:数据 A 变换成 B 和 C图 3 是:数据 A 或 B,或 A 和 B 同时输入变换成 C图 4 是:数据 A 变换成 B 和 C,或 B 和 C图 5 是:只有数据 A 或只有数据 B(点不能 A、B 同时)输入时变换成 C图 6 是:数据 A 变换成 B 和 C,但不能变换成 B 和 C5 为数据流图(或数据存储)命名名字应代表整个数据流(或数据存储)的内容,而不是仅仅反映他的某些成分。不要使用空洞的、缺乏具体含义的名字(如“数据” 、 “信息” 、 “输入”之类) 。如果在为某个数据流(或数据存储)起名字是遇到了困难,则
6、很可能是因为对数据流图分解不恰当造成的,应该试试重新分解,看是否能克服这个困难。6 例子(P46)父图与子图的平衡,输入输出一致,加工与加工之间的关系。6 什么是系统流程图系统流程图是概括地描绘物理系统的传统工具。是用图形符号以黑盒子形式描绘组成系统的每个部件(程序、文档、数据库) 。它是物理流图而不是程序流程图7 符号(P39)8 系统流程图例子第三章1 需求分析阶段的任务: 在可行性分析的基础上,进一步了解确定用户需求。准确地回答 “系统必须做什么?” 的问题。获得需求规格说明书。2 状态转换图是干什么的? 状态转换图通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为;并指明了作
7、为特定事件的结果系统将要采用的动作。-建立系统行为模型3 初态只能有一个,中间态可有多个,终态可有 0 个或多个4 电梯状态转换图5 第四章1 非形式化:用自然语言来描述的;半形式化:用数据流图或实体-联系图建立模型;形式化:基于数学技术来描述系统性质.2 非形式化方法的缺点是什么?用非形式化的方法写的系统规格说明书,可能存在矛盾、二义性、含糊性、不完整性以及抽象层次混乱等问题。3 形式化方法的优点是什么?1.能够简洁准确地描述物理现象、对象或动作的结果;2.可以在不同的软件工程活动之间平滑地过渡;3.提供了高层确认的手段。可以使用数学方法证明设计是符合规格说明的且程序代码正确地实现了设计结果
8、。第五章1 总体设计是:解决“怎么做?”的问题,是概要性设计。2 启发规则有以下几条:1 软件结构提高模块独立性2 模块规模应该适中3 深度、宽度、扇出和扇入都应当适当(4)模块的作用域应该在控制域之内(5)力争降低模块接口的复杂程度(6)设计单入口单出口的模块(7)模块功能应该可以预测3 4 模块独立性模块化方法已经为所有工程领域所接受。模块化的主要优点是:模块化设计降低了软件系统的复杂性,使得系统容易修改;使得系统各个部分可以并行开发,从而提高了软件的生产率。提高模块质量在于提高模块独立性。5“模块” ,又称“构件” ,一般指用一个名字可调用的一段程序。它一般具有如下三个基本属性:6 耦合
9、性第六章1 什么是结构程序设计?2 判定表判定树:机3、PAD 图4、PAD 图伪代码:5、Jackson 图 6 改进的 Jackson 图7 判断结点: McCabe 方法 8 第七章1 渐增式与非渐增式各有何优、缺点?为什么通常采用渐增式?非渐增式测试一下子把所有模块放在一起,并把庞大的程序作为一个整体来测试,测试者面对的情况十分复杂。测试时会遇到许许多多的错误,改正错误更是极端困难,因为在庞大的程序中想要诊断定位一个错误是非常困难的。而且一旦改正一个错误之后,马上又会遇到新的错误,这个过程将继续下去,看起来好像永远也没有尽头。渐增式测试与“一步到位”的非渐增式测试想反,它把程序划分成小
10、段构造和测试,在这个过程中比较容易定位和改正错误;对接口可以进行更彻底的测试;可以使用系统话的测试方法。因此,目前在进行集成测试时普遍采用渐增式测试方法。2 自顶而下集成与自底而上集成各有何优、缺点?自顶而下集成优点:能够尽早发现系统主控方面的问题。缺点:无法验证存根程序是否完全模拟了下属模块的功能。自底而上集成优点:驱动程序较容易编写,能够尽早查出底层涉及较复杂的算法和实际的 I/O 模块中的错误。缺点:最后才能发现系统主控方面的问题。2 黑盒测试3 等价划分思想第八章1 软件维护的定义软件维护是指软件系统交付使用以后,为了改正错误或满足新的需求而修改软件的过程。2 软件维护的特点非结构化维
11、护:付出的代价很大,它是没有使用良好定义的方法学开发出来的软件的必然结果。结构化维护:3 软件维护过程:1 维护组织 2 维护报告 3 维护的事件流 4 保存维护记录 5 评价维护活动4 决定软件的可维护性的因素:1 可理解性 2 可测试性 3 可修改性 4 可移植性 5 可重用性5 软件的再工程过程: 6 按照不同的维护目的,维护工作可分成 4 类: 完善性维护、纠错性维护、适应性维护、预防性维护。7 成本估算 1) 自顶向下估算方法 优点: 是对系统级工作的重视,所以估算中不会遗漏系统级的诸如集成、用户手册和配置管理之类的事务的成本估算,且估算工作量小、速度快。缺点:是往往不清楚低层次上的
12、技术性困难问题,而往往这些困难将会使成本上升。2) 自底向上估算方法优点 :是对每一部分的估算工作交给负责该部分工作的人来做,所以估算较为准确。缺点:是其估算往往缺少与软件开发有关的系统级工作量,如集成、配置管理、质量管理和项目管理等,所以估算往往偏低。3) 差别估算方法优点:是可以提高估算的准确度;缺点: 是不容易明确“差别”的界限。8、Gantt 图只能表示任务之间的并行与串行的关系,难以反映多个任务之间存在的复杂关系,不能直观表示任务之间相互依赖制约关系,以及哪些任务是关键子任务等信息,因此,仅仅用 Gantt 图作为进度的安排是不够的。第九章1 三种模型之间的关系:功能模型与对象模型的
13、关系-对象模型描述了功能模型中的动作对象,数据存储以及数据流结构-功能模型中的处理对应于对象模型中的操作动态模型与对象模型的关系(1)状态转换驱使行为发生,这些行为在 DFD 中被映射成处理,它们同时与对象模型的操作相对应 (2)针对每个建立的动态模型描述了类实例的生命周期或运行周期动态模型与功能模型的关系-功能模型中的处理可能产生动态模型中的事件。2 模型元素与模型元素之间的连接关系也是模型元素,常见的关系有关联、泛化、依赖和聚合,其中聚合是关联的一种特殊形式。关联是描述两个或多个类之间的关系,链是关联的实例。3 一幅用例图包含的模型元素有系统、行为者、用例及用例之间的关系。用例图描述了系统
14、的功能需求,它是从执行者的角度来理解系统,由“执行者” 、 “用例”和“用例之间的关系”3 类模型元素构成。图中还有另外两种类型的连接,即使用和扩展关系,是两种不同形式的泛化关系。4、什么是用例?从本质上讲,一个用例是用户与计算机之间的一次典型交互作用。在 UML 中,用例被定义成系统执行的一系列动作(功能) 。用例有以下特点:用例捕获某些用户可见的需求,实现一个具体的用户目标。用例由执行者激活,并将结果值反馈给执行者。用例必须具有功能上的完整描述。5、如何确定用例:1、与系统实现有关的主要问题是什么?2、系统需要哪些输入/输出?这些输入/输出从何而来?到哪里去?3、执行者需要系统提供哪些功能?4、执行者是否需要对系统中的信息进行读、创建、修改、删除或存储?6、执行者:执行者是指用户在系统中所扮演的角色。执行者在用例图中是用类似人的图形来表示, 但执行者可以是人,也可以是一个外界系统7、注意:用例总是由执行者启动的。如何确定执行者: 谁使用系统的主要功能(主执行者)? 谁需要从系统获得对日常工作的支持和服务? 需要谁维护管理系统的日常运行(副执行者)? 系统需要控制哪些硬件设备? 系统需要与其它哪些系统交互? 谁需要使用系统产生的结果(值)?8 用面向对象方法开发软件,需要建立三种模型: 9