软件=程序+数据+文档
- 程序:计算机可以接受的一系列指令,运行时可以提供所要求的功能和性能
- 数据:使得程序能够适当操作信息的数据结构
- 文档:描述程序的研制过程,方法和使用的图文资料
软件的本质特性:复杂性,一致性,可变性,不可见性
软件工程的三要素:方法,工具,过程
软件危机的表现:客户不满意,风险与成本问题,项目过程失控,无力管理团队
产生软件危机的原因:
- 软件开发过程困难
- 软件在运行时可能会出现在测试阶段没有检测出的错误
- 软件的复杂程度随规模的增加橙指数上升
- 对软件开发运行维护的轻视,维护方法不正确
软件工程概念:软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
软件工程的目标:创造足够好的软件
软件分析是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言表达出来的过程,基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可。
软件工程生命周期:
软件定义阶段:1.问题定义 2.可行性分析 3.需求分析 。
软件开发阶段:1.总体设计 2.详细设计 3.编码 4.单元测试 5.综合测试 。
运行和维护阶段 1.运行维护(改正性维护,适应性维护,完善性维护,预防性维护)
软件过程:软件生命周期所涉及的一系列相关过程,是指一套关于项目的阶段、状态、方法、技术和开发、维护软件的人员以及相关Artifacts(计划、文档、模型、编码、测试、手册等)组成。包含基本过程类、支持过程类、组织过程类。
- 基本过程类包括获取过程、供应过程、开发过程、运作过程、维护过程和管理过程。
- 支持过程类包括文档过程、配置管理过程、质量保证过程、验证过程、确认过程、联合评审过程、审计过程以及问题解决过程。
- 组织过程类包括基础设施过程、改进过程、培训过程
软件工程开发方法:
- 面向过程:算法为基本构造单元,自顶向下,将功能和数据一定程度分离
- 面向对象:类为基本单元,对象是类的实例化,对象之间以消息传递为基本手段
- 面向构件
- 面向服务应用业务过程由服务组成,而服务由构建组成
软件开发的基本策略:
- 软件复用:不必从零做起,复用已有构建,具有较高质量
- 分而治之:将复杂问题分解为若干简单问题,逐个解决
- 逐步演进
- 优化拆中:优化软件各个质量特性(运行速度,资源利用等),协调各个质量特性,实现整体质量最优
软件工程的Wasserman规范
- 抽象
- 软件构件方法
- 用户界面原型化
- 软件体系结构
- 软件过程
- 软件复用
- 度量
- 工具与集成环境
软件质量:
- 软件过程:过程质量
- 软件产品:内部质量,外部质量
- 产品效用:使用质量
如何实现软件的高质量
- 高质量的软件设计
- 规范的编码
- 有效的测试
单元测试
对软件中的最小可测试单元进行检查和验证(好比城墙的每一块砖)单元测试内容:
- 模块接口:对通过所有被测模块的数据流进行测试
- 局部数据结构:检查模块中数据结构是否正确使用和定义
- 边界条件:检查数据流或控制流中条件或数据处于边界时的出错可能性
- 独立路径:检查可能引发错误的路径和进行错误处理的路径
- 出错处理:检查由计算错误,判定错误,控制流错误导致的程序错误
单元测试原则:
- 快速的
- 独立的
- 可重复的
- 自我验证的
- 及时的
单元测试过程:
- 确定要做的单元测试
- 编写或修改单元测试用例
- 执行单元测试
- 根据结果修改或增加单元测试
- 直到满足测试质量
黑盒测试法:
把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性。黑盒测试又称为功能测试,包含等价类划分法、边界值法、错误推测法、因果图法等。
白盒测试法:
是把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。白盒测试又称为结构测试,包含逻辑覆盖法和基本路径测试法。
使用代码覆盖率作为测试衡量标准
测试用例的重要性
- 降低软件测试成本
- 保证测试工作质量
- 评估和检验测试机效果
测试用例设计:
- 具有代表性和典型性
- 寻求系统设计和功能设计的弱点
- 既有正确输入也有错误或异常输入
- 考虑用户实际的诸多使用场景
等价类划分:
将输入域分为尽可能多少的若干子域,两两互不相交
举个栗子
软件模型
瀑布模型
- 阶段间具有顺序性和依赖性:
两重含义: ①必须等前一阶段的工作完成之后,才能开始后一阶段的工作; ②前一阶段的输出文档就是后一阶段的输入文档,因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。 - 每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。
瀑布模型优点
- 可强迫开发人员采用规范的方法
- 严格地规定了每个阶段必须提交的文档
- 要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证
瀑布模型缺点
- 开发过程一般不能逆转,否则代价太大
- 实际的项目开发很难严格按该模型进行
- 客户往往很难清楚地给出所有的需求,而该模型却要求如此
快速原型模型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
快速原型方法可以克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险,具有显著的效果。
增量模型使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
优点
- 能在较短时间内向用户提交可完成部分工作的产品。
- 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。
缺点
- 由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。
- 在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而使软件过程的控制失去整体性。
螺旋模型把它看作在每个阶段之前都增加了风险分析过程的快速原型模型
喷泉模型
敏捷开发
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态
结构化分析:
结构化分析方法适合于数据处理类型软件的需求分析。 其要点是"自顶向下"地开发系统,由整体到各组成部分,由表及里,由抽象到具体,逐步求精.
结构化程序设计的特点:
- 整个程序模块化。
- 每个知模块只有一个入口和一个出口。
- 每个模块都应能单独执行,且无死循环。
- 采用自顶向下。逐步求精的方法。
概要设计
概要设计的主要任务是把需求分析得到的系统扩展用例图转换为软件结构和数据结构,建立起目标系统的逻辑模型。
基本任务:
- 设计软件系统结构
- 进行数据结构及数据库的设计
- 编写概要设计的文档
- 评审
软件测试要经过的步骤是:单元测试→集成测试→确认测试→系统测试。
单元测试对源程序中每个最小可测试单元进行检查,检查各个模块是否正确实现规定的功能,从而发现模块在编码中或算法中的错误。该阶段涉及编码和详细设计文档。
集成测试是为了检查与设计相关的软件体系结构的有关问题,也就是检查概要设计是否合理有效。
确认测试主要是检查已实现的软件是否满足需求规格说明书中确定了的各种需求。
系统测试是把已确认的软件与其他系统元素(如硬件、其他支持软件、数据、人工等)结合在一起进行测试。以确定软件是否可以支付使用。
面向对象如何实现模块独立性,其耦合和内聚的含义是什么?
通过耦合和内聚实现,因为对象是由数据及可以对这些数据施加的操作所组成的统一体,而且对象是以数据为中心的,因此,对象内部各种元素彼此结合得很紧密。内聚性相当强,由于完成对象所需要的元素(数据和方法)基本上都被封装在对象内部,它与外界的联系自然就比较少。因此,对象之间的耦合通常比较松。联系越紧密,耦合性越强,独立性越差。高内聚低耦合也因此用作衡量一个软件好坏的标准。
简述文档在软件工程中的作用?
(1)提高软件开发过程的能见度
(2)提高开发效率
(3)作为开发人员阶段工作成果和结束标志
(4)记录开发过程的有关信息便于使用与维护;
(5)提供软件运行、维护和培训有关资料;
(6)便于用户了解软件功能、性能。
面向对象的特征是:
(1)对象唯一性。每个对象都有自身唯一的标识,在对象生存期中,其标识不变,不同的对象不能有不同的标识。
(2)封装性。是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类
(3)继承性。是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。
(4)多态性。是指相同的操作或函数过程可以作用于多种类型的对象上并获得不同的结果。