教材
《软件工程导论(第6版)》张海藩 牟永敏 编著;清华大学出版社
课程目标
第一讲
软件的定义
软件不是程序,而是程序、数据以及开发、使用和维护程序需要的所有文档的完整集合。
- 程序:是能够完成预定功能和性能的可执行的指令序列。
- 数据:是使程序能够适当处理信息的数据结构。
- 文档:是开发、使用和维护程序所需要的图文资料。
=软件的特点
- 逻辑产品,具有抽象性;其生产主要是开发研制;不存在磨损、消耗和老化等问题;是脑力劳动,开发效率低;成本昂贵,要进行质量控制;对硬件和环境的依赖性,提出可以执行性问题;是复杂的。
软件分类
不同的分类基准:具体介绍基于功能的不同分类。
- 系统软件:居于计算机系统中最靠近硬件的一层,例如编译程序和操作系统。
- 支撑软件:支撑软件的开发、维护与运行的软件。
- 应用软件:特定应用领域专用的软件。
=软件开发的几个时期
- 个人程序时期
- 程序设计完全凭程序员的经验和技艺以个人或小组方式进行。
- 软件作坊时期
- 多人分工合作开始出现,需要对项目进行管理开发。
- 软件的规模与复杂性也不断的增加。
- 软件质量差,可靠性难以保证;成本难以控制;可维护性差。
软件危机
- 软件危机定义:通常把在计算机软件的开发与维护过程中所遇到的一系列严重问题笼统地称为软件危机概括地说,软件危机包含以下两个方面的问题。
- 如何开发软件,以满足社会对软件日益增长的需求。
- 如何更有效地维护数量不断膨胀的已有软件。
- 软件危机典型表现
- 对软件开发成本和进度的估计不准确;用户不满意;质量不可靠;不可维护;缺文档资料;成本渐增;开发生产速度跟不上计算机应用普及深入趋势。
- 产生软件危机的原因
- 软件本身问题有关:管理和控制软件开发过程相当困难;测试阶段没能检测出全部错误;规模庞大,程序复杂性随规模增加指数上升;对用户要求认识不够,匆忙编写;实践中部分采用了错误的方法技术;忽视软件需求分析的重要性。
- 软件开发与维护的方法不正确有关:忽视软件配置其余成分;定义时期未正确全面理解用户需求;阶段越晚进行修改付出代价越大。
- 消除软件危机的途径
- 首先正确认识软件;各类人员协同配合完成;使用成功案例的技术和方法;开发使用更好的软件工具。
软件工程
- 软件工程定义:软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
- 软件工程方法学
通常把在软件生命周期全过程中使用的一整套技术方法的集合成为方法学(范型)。
- 传统方法学(结构化范型)
- 基本概念:采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务。
- 特点:按顺序完成每个阶段的任务;开始和结束都有严格标准。
- 面向对象方法学
- 基本概念:与上面相反,把数据和对数据的操作紧密的结合起来的方法。
- 基本原则:尽量模拟人类习惯的思维方式;描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能一致。
- 优点:降低了软件产品的复杂性;简化了软件的开发和维护工作;提高了面向对象软件的可重用性。
- 传统方法学与面向对象方法学对比
- 传统方法学以功能划分为导向面向过程,面向对象以对象作为整个问题分析的中心展开工作。
- 都把软件开发划分为:分析、设计、编码和测试等几个阶段,但各个阶段的具体工作不同。
软件生命周期
- 软件定义(系统分析)
- 问题定义:要解决的问题是什么;对用户访问调查,写书面报告,讨论修改得到客户确认。
- 可行性研究:问题有解决的办法么;是否继续这项工程。
- 需求分析:确定目标系统必须具备那些功能;得出经过用户确认的系统逻辑模型;用正式文档准确记录对目标系统的需求(规格说明书)。
- 软件开发
- 总体设计:应该怎样实现目标系统;对比得出最佳方案;设计程序的体系结构,即确定程序由哪些模块组成以及模块间的关系。
- 详细设计(模块设计):解法具体化;可以写出实际程序代码的详细规格说明书;详细设计每个模块,确定实现模块功能所需要的算法和数据结构。
- 编码和单元测试:写出容易理解维护的程序模块;对模块仔细的单元测试。
- 综合测试:各类测试(集成和验收测试)使软件达到预定要求;正式文档记录测试计划、方案和结果。
- (前两个系统设计,后两个系统实现)
- 软件维护
-
关键任务:各种维护活动使系统持久满足用户需求。
-
改正性维护,也就是诊断和改正在使用过程中发现的软件错误。
-
适应性维护,即修改软件以适应环境的变化。
-
完善性维护,即根据用户的要求改进或扩充软件使它更完善。
-
预防性维护,即修改软件,为将来的维护活动预先做准备。
软件过程
-
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。通常使用生命周期模型概括地描述软件过程。
-
(重点)瀑布模型 Waterfall Model(传统的和带反馈环的)
- 概念及特点
- 阶段间具有顺序性和依赖性:必须等前一阶段工作完成后,才能开始后一阶段的工作;前一阶段的输出文档就是后一阶段的输入文档。
- 推迟实现的观点:编码之前设置了系统分析与系统设计的各个阶段。
- 质量保证的观点:每个阶段都必须完成规定的文档;并进行评审。
- 适合于需求明确变化较小的软件项目。
- 优缺点
- 强迫开发人员采用规范的文档;严格规定了每个阶段必须提交的文档;每个阶段产品都经过质量验证。
- 前期的需求理解和设计缺陷错误后期才能被发现,提高了成本,易失败;开发人员与用户缺乏有效沟通。
- 概念及特点
-
(重点)快速原型模型 Prototype Model
- 概念及特点
- 快速建立起来的可以在计算机上运行的程序,完成的功能少于最终产品的。
- 不带反馈环,软件开发基本是线性顺序进行的。(原因有二:原型系统已经通过与用户交互而得到验证,不会进行较大的返工;建立原型系统已经学到了许多东西,发生错误的可能性小。)
- 适合于一些需求可变、模糊不定的软件系统开发。
- 优缺点
- 软件开发是线性顺序进行的;通常能满足用户真实需求。
- 追求速度而忽视了软件的总体质量和长期的可维护性;开发过程不便于管理。
- 概念及特点
-
(重点)增量模型 Incremental Model(渐增模型)
- 概念及特点
- 把软件产品作为一系列的增量构件来设计、编码、集成和测试。
- 第一个增量构件往往实现软件的基本需求。
- 适合于软件要求不明确,设计方案有一定风险的软件项目。
- 优缺点
- 客户可以不断看到软件产品,有足够时间学习适应新产品;多个构件并行开发,缩短开发时间;软件结构可拓展性好,便于日后升级
- 软件体系结构要做到开放;多个构件并行开发,具有无法集成的风险。
- 概念及特点
-
(重点)螺旋模型 Spiral Model
- 概念及特点
- 使用原型及其他方法来尽量降低风险(每个阶段都增加了风险分析过程的快速原型模型,即瀑布与快速的结合)
- 适用于内部开发的复杂大型软件项目;需要开发人员具有丰富的风险评估和知识经验。
- 优缺点
- 有利于已有软件的重用;专注于软件质量;减少测试带来的风险;软件开发与维护没有本质区别。
- 开发人员知识经
- 概念及特点