跳转至

软件工程

第一章 软件工程概述

  1. 什么是软件?软件和程序的区别是什么?

    1. 软件定义:程序、数据以及开发、使用和维护程序需要的所有文档的集合,也有定义为 计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必须的数据
    2. 程序:针对某个特定问题而用程序设计语言描述的适合计算机处理的语句序列
    3. 方法和规则:通常在文档中说明,并在程序中实现
    4. 文档:软件开发活动的记录,供人们交流和研究
    5. 什么是软件生存周期?划分生存周期的主要原则是什么?

    6. 定义:某个软件从被提出来并着手实现,最后到该软件报废或者停止为止

    7. 有三个阶段:计划时期,开发时期,运维时期
    8. 计划时期:
      1. 问题定义
      2. 可行性研究
    9. 软件开发时期:
      1. 需求分析
      2. 整体设计
      3. 详细设计
      4. 编码
      5. 测试
    10. 软件运维时期
    11. 何谓面向对象软件工程?简述它和传统软件工程的区别与联系。

    12. 面向对象的开发重点放在软件的生存周期的分析阶段,建立了对象模型

    13. 特点:开发阶段模糊,开发过程逐步求精,开发活动反复迭代
    14. 区别和联系
      1. 区别:传统的是面向过程,而面向对象不再是以功能划分为导向,而是以对象作为整个问题的分析中心
      2. 联系:两者都有分析,设计,编码,测试等环节,但是各个阶段的具体任务不同
    15. 面向对象的主要内容:对象 + 类 + 集成 + 通过消息彼此通信
    16. 什么是软件生存周期模型?试比较本章介绍的四种模型的优缺点,说明每种模型的使用范围。
模型 内容 特点
瀑布模型 也叫生存模型,或者线性顺序模型,将软件生存周期各个活动规定为线性顺序连接的若干模型。是以文档为驱动,适合需求很明确的软件开发 经典,需求变化不大,无风险管控
快速原型模型 首先快速建立一个模型,然后再用户使用基础上进行迭代改进 快速获取用户需求
增量模型 也叫渐增模型,是瀑布模型和快速原型模型的结合,是一种非整体开发的模型,把软件拆分为一系列增量组件,开发一部分,使用一部分 灵活,允许软件变化,无风险管控
螺旋模型 加入了风险分析,将瀑布和增量两种模型结合起来,是一种风险驱动的模型 加入风险分析

第二章 可行性研究

  1. 在软件开发早期阶段为什么要进行可行性研究?可行性研究的任务是什么?应该从哪几个方面研究目标系统的可行性?

    1. 目的:就是用最小的代价在尽可能短的时间内确定问题能否解决。 2. 任务:首先进行概要的分析研究,初步确定项目的规模和目标,确定项目的约束和限制,分析几种可能解法的利弊,从而判断原定系统的目标和规模是否现实,系统完成之后带来的收益是否值得投资开发这个系统( 概要研究,确定规模,确定约束,路径分析,进行判断,确定ROI)
    2. 成本-效益分析可用哪些指标进行度量?

    3. 基本概念: 成本收益分析:从经济角度考虑软件是否可行 成本:开发成本和运维成本

    4. 货币的时间价值:设存入货币\(p\)元,年利率\(i\),则n年后可以得到的钱\(F = p (1 + ni)\) ,其中不计算复利。则现在的价值为\(p = F/(1 + ni)\).
    5. 投资回收期:就是是累积的经济效益等于最初的投资费用所需要的时间。越短越值得投资。
    6. 纯收入:就是在整个生存周期内系统的累积经济效益(折合为现在值),与投资之差。如果<=0,则不值得投资开发。
    7. 例子:假设一个库存系统开发成本5000元,而系统建成之后每年可以节省2500元,5年一共节省12500元。
    8. 将来值 \((1 + ni)\) 现在值 累积现在值
      1 2500 1.08 2314.81 2314.81
      2 2500 1.16 2155.17 4469.98
      3 2500 1.24 2016.12 6486.10
      4 2500 1.32 1893.94 8380.04
      5 2500 1.40 1785.71 10165.75

则投资回收期:系统在两年可以节省4469.98元,剩下的530.03可以在第三年的\(530.03/2016.12 = 0.26\)年里完成,所以投资回收期:2.26年

纯收入:10165.75 - 5000 = 5165.75元。核心要点:全部转换为现在值来计算 3. 有人认为,只懂技术的分析员不一定能圆满完成可行性研究的任务。你同意这种看法吗?为什么?

Text Only
1
1. 同意,因为除了技术可行性之外,还包括经济可行性,操作可行性,社会方面的可行性研究,而只懂技术的分析员不一定能圆满完成这些任务。
  1. 在例2.2中,把投资改为6000元,每年节约金额改为2000元,年利率为6%,试计算投资回收期和纯收入。

    1. 投资回报期:3.39年
    2. 纯收入:2518.78元

第三章 需求分析

考大题:给需求,画出数据流图;伪代码转换为判定树,判定表

  1. 为什么要进行需求分析?需求分析要经过哪些步骤?

    1. 目的:确定系统必须完成哪些工作,是一个严格描述系统做什么的过程
    2. 步骤:
      1. 确定对系统的综合需求
        1. 功能需求
        2. 性能需求
        3. ......
      2. 分析系统的数据需求
        1. 建立数据模型:实体关系图:E-R图
        2. 描述数据结构:层次方框图
      3. 建立软件的逻辑模型
        1. 数据流图
        2. 数据字典
        3. E-R图
        4. 主要处理算法
      4. 编写软件需求规格说明书
        1. 目的:明确定义系统得需求,系统构成以及有关接口
        2. 需求说明相当于一份技术合同,是测试验收阶段的基准
      5. 需求分析评审
        1. 发现需求分析阶段的错误和缺陷,然后进行改进
    3. 需求分析阶段的基本任务是什么?怎样理解分析阶段的任务是决定“做什么”,而不是“怎样做”?

    4. 基本任务:回答系统必须做什么

    5. 需求分析实际上是调查,评价用户对软件需求的过程,目的在于净化软件的作用范围,也是分析软件系统构成的过程。因此需求分析是一个对用户意图不断进行揭示和判断的过程,它并不考虑具体实现,而是完整地,严密地描述应该做什么的过程。
    6. 分析人员:需要建立一个由用户、系统分析员和领域专家参加的联合分析小组,由领域专家来沟通。
    7. 需求分析规格说明书内容
      1. 引言
      2. 任务概述
      3. 数据描述
      4. 功能 + 性能需求 + 运行需求
      5. 其他
    8. 什么是结构化分析方法?该方法使用什么描述工具?

    9. 定义:结构化分析是一种从问题空间某种表示的映射方法,软件功能由数据流图表示,是结构化方法中重要的,被普遍采用的方法。

    10. 数据流图和数据字典 构成的逻辑模型。
    11. 什么是数据流图?其作用是什么?其中的基本符号各表示什么含义?

    12. 定义:是一种图形化技术,用于表示系统逻辑模型。简称DFD

    13. 作用:以直观地形式清晰描述了系统数据流动和处理过程
    14. 基本符号:
      1. 数据流:$ -> $ + 数据流名
      2. 数据存储:$ =$ + 文件名
      3. 数据处理:圆圈 + 加工名
      4. 数据源点或者终点:方框 + 实体名
    15. 画数据流图的步骤是什么?应该注意什么事项?

    16. 步骤

      1. 找到外部实体,也就找到了系统得源点和终点
      2. 找出外部实体的输入和输出数据流
      3. 在图的边上画出系统得外部实体
      4. 从外部实体的输出流开始,逐步画出变换数据的加工,直到外部实体所需的输入流,形成数据流的封闭
      5. 按照上述原则进行检查,修改
      6. 按照上述步骤,画出子图
    17. 注意事项:
      1. 只考虑静态,并且成功的情况
      2. 只考虑常规状态
      3. 不同于程序流程图,数据流图更粗粒度
      4. 父图子图要平衡
    18. 描述加工逻辑有几种工具?各是什么?写出其优缺点

    19. 结构化语言

      1. 特点:介于自然语言和程序设计语言之间
      2. 既有结构化程序的清洗易读的特点,又有自然语言简单易懂的特点
    20. 判定表
      1. 使用场景:当算法包含多重嵌套的条件选择的时候,判定表可以清晰地表示复杂的条件组合和对应动作之间的关系
      2. 组成部分:条件类别,条件组合,操作定义,操作执行
      3. 其中条件类别和条件组合可以打one-hot来辨别
    21. 判定树
      1. 定义:判定树是判定表的变种,也能清晰的表示复杂条件组合与对应动作之间的关系
      2. 也就是不同条件路径组合成的从根到叶子的路径,对应每一步选择
    22. 某高校计算机教材购销系统有以下功能

    23. 直接看答案

第四章 软件整体设计

  1. 系统的独立性,可以通过高内聚,低耦合进行判断,具体如下:

    1. 通过耦合程度的度量,可以把耦合程度分为

      1. 无直接耦合,也就是完全独立,但是一个系统中不可能所有的模块之间的没有任何连接
      2. 数据耦合:如果两个模块之间彼此通过参数交换信息,并且仅仅交换的是数据,则这种成为数据耦合。**数据耦合是理想的目标 **
      3. 特征耦合:如果把整个数据结构作为参数传递,而使用的模块并不使用全部,则出现了特征耦合
      4. 控制耦合:如果两个模块之间彼此传递的信息有控制信息,则称为控制耦合。 控制耦合往往是多余的,,把模块进行分解之后可以用数据耦合进行代替
      5. 公共环境耦合:两个系统通过公共数据环境相互作用,比如共享缓冲区。如果是单向的消费者-生产者模式,则是松耦合,如果为双向,则是紧密耦合 比较复杂,有风险
      6. 内容耦合:最高程度的耦合。比如一个模块访问另一个模块的内部数据,有代码之间的重复等。完全不要内容耦合

        1. 内聚:标志一个模块内部的各个元素彼此结合的紧密程度,是信息隐藏和局部化概念的自然扩展。理想内聚模块只做一件事情
      7. 偶然内聚,一组任务彼此之间的关系比较松散。

      8. 逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或者相似的一类,则成为逻辑内聚
      9. 时间内聚:如果一个模块包含的任务必须在同一个时间段内执行,就是时间内聚。此模块不太可能重用
      10. 通信内聚:如果所有模块中所有元素都使用同一个输入和输出数据,则成为通信内聚,即在同一个数据结构上操作。不能重用,需要拆分
      11. 顺序内聚:串行执行
      12. 功能内聚:模块内所有的处理元素属于一个整体,完成单一的功能。是最高程度的内聚
      13. 深度,宽度,扇入,扇出:
    2. 深度:软件结构中模块的层数,它表示控制的层数,在一定意义能粗略地反映系统的规模和复杂程度

    3. 宽度:同一层次上模块的最大个数
    4. 扇入:有多少个上级模块直接调用它
    5. 扇出:是一个模块直接调用的模块数目。经验证明,好的系统结构的平均扇出数一般是3-4,不能超过5-9
    6. 一般设计的比较好的软件结构,顶层扇出高,中层扇出较少,底层模块有高扇入。
    7. 软件总体设计说明书: 引言,任务概述,总体设计,接口设计,数据结构设计,运行设计,出错处理设计,安全保密设计,维护设计

第五章 软件详细设计

  1. 软件详细设计的基本任务是什么?有哪几种描述方法?
    1. 任务:
      1. 确定每个模块的使用的算法
      2. 数据结构
      3. 接口细节
      4. 测试用例
    2. 描述方法
      1. 图形工具:程序流程图,盒图(N-S),问题分析图(PAD)
      2. 表格工具: 判定表,判定树
      3. 语言工具:过程设计语言:PDL
  2. 程序的三种基本结构:顺序,循环,选择
  3. 伪代码转换为N-S盒图,以及PAD图
    1. 盒图:
      1. 基本成分:
        1. 顺序
        2. if-then-else
        3. case型多分支
        4. 循环
        5. 调用子程序
    2. PAD图:
      1. 定义:问题分析图,使用二维树形结构,只有顺序,循环,选择三部分。
      2. 方式:例如进行倒序选择排序的方式:首先把sort部分剥离出来,然后用def,同时把循环一层一层分隔出来,就是结果。
      3. 方向:从上到下,从左到右

第七章 软件测试

  1. 软件测试的基本任务是什么?简述测试的目标和基本原则

    1. 软件测试的基本任务: 根据软件开发各阶段的文档资料和程序内部结构,精心设计一组“高产”的测试用例,利用这些用例执行程序,找出软件中潜在的各种错误缺陷
    2. 测试一般不能发现全部错误,只能证明程序中存在错误,不能证明不存在错误
    3. 原则:输出输出,合理不合理全覆盖。程序员应避免测试自己的程序
    4. 简述静态测试与动态测试的含义。它们之间有什么不同点和相同点

    5. 静态测试: 指被测程序不在机器上运行,对模块的源代码进行研读,查找错误或收集一些度量数据,采用人工检测计算机辅助静态分析手段 对程序进行检测,只进行特性分析

    6. 动态测试: 通过运行程序发现错误,一般所讲的测试大多是指动态测试。一般包括黑盒测试白盒测试
    7. 异同点
      1. 相同:都可以用于进行软件测试
      2. 不同:一个在运行前,一个在运行时。前者用于预防,后者用于矫正。
    8. 黑盒测试的测试方法

    9. 定义:

      1. 黑盒测试:也称功能测试或数据驱动测试,它不考虑程序内部结构和处理过程。把被测程序看成一个黑盒子,只在软件接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求
      2. 白盒测试:也称结构测试或逻辑驱动测试。它需了解程序的内部结构和处理过程,要求对程序的结构特性做到一定程度的覆盖
      3. 两者都不可能做穷尽测试,只能进行选择测试。黑盒测试是确认性技术,白盒测试是验证性技术。
        1. 黑盒测试 方法有三种,等价分类法,边值分析法,错误推测法

    等价分类法:把程序的输入域划分为若干个数据类,据此导出测试用例。也就是每个等价范围内,只选几个用例,最后覆盖全部范围。需要经历划分等价类,选择测试用例两步。

    边界值分析法:针对各种边界情况设计测试用例,可以查出更多错误。

    错误推测法:考直觉和经验推测程序中可能出现的错误,从而有针对性的编写测试用例 4. 软件测试要经过哪些步骤?这些测试与软件开发各阶段之间有什么关系?

    1. 单元测试:对软件基本组成单元的测试,发现的是模块内编码的错误,测试方法以白盒为主,也分静态和动态。
    2. 集成测试:将单元按照要求组合起来进行测试,发现的是模块的错误,包括子系统测试和系统测试,分自顶向下和自底向上。
    3. 确认测试:检查开发软件是否满足规则说明书所确定的功能和性能需求,发现的是需求分析阶段的错误
    4. 给流程图,设计白盒测试用例。

    5. 白盒测试定义:测试用例是根据程序的内部逻辑来设计的。如果想用白盒法发现程序中所有的错误,则至少必须使程序中每种可能的路径都执行一次。对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次

    6. 白盒测试分两种,逻辑覆盖测试,以及路径测试。前者把注意力放在流程图的各个判定框上,后者重视测试对程序的执行路径的考察
    7. 逻辑覆盖测试法:
      1. 定义:逻辑覆盖测试法用流程图来设计测试,它考察的重点是图中的判定框(菱形框)。
      2. 覆盖强弱:
        1. 语句覆盖:要走过所有的菱形和矩形。对所有可能性的覆盖最少
        2. 判定覆盖:也就是走过所有的菱形和矩形,并且要走遍所有的菱形分支。但是对程序逻辑的覆盖程度仍然不高。
        3. 条件覆盖:要使用足够的测试用例,使得要走过所有的菱形和矩形,并且对菱形框中的条件,要取到各种可能得结果
        4. 判定条件覆盖:同时满足判定覆盖和条件覆盖
        5. 条件组合覆盖:使用足够的测试用例,使得每种菱形的条件的各种可能组合都出现至少一次。**条件组合覆盖仍然不能是程序的所有路径都覆盖到 **

第八章 软件维护

  1. 为什么软件需要维护?维护有哪几种类型?简述它们的维护过程。
    1. 原因:指软件系统交付使用以后,为了改正软件运行错误,或者因满足新的需求而加入新功能的修改软件的过程。
    2. 类型和过程:
      1. 改正性维护:改正软件性能上的缺陷,而进行诊断和改正错误的过程就叫做改正性维护
      2. 适应性维护:外部环境发生变化,为使软件适应这种变化,而去修改软件的过程就叫做适应性维护
      3. 完善性维护:用户提出了新的需求,为了满足这些要求,需要修改或再开发软件,再去修改软件,这种情况下进行的维护活动叫做完善性维护
      4. 预防性维护:为了防止软件失效而把软件进行修改的过程

第九章 面向对象

  1. 何谓面向对象软件工程?简述它和传统软件工程的区别与联系。 1.5答案

第十章 面向对象分析

  1. 面向对象的用例(功能)模型的用例之间的关系(把用例全部翻译成功能就可以)
    1. 用例模型的定义:用例(功能)模型往往是从用户需求的角度来描述系统,指明系统应该“做什么”,直接反映用户对目标系统的需求,描述数据在系统中的变换过程及系统的功能。
    2. 一个用例描述系统的一项功能,是参与者使用系统来达成目标时一组相关的成功场景(Scenario)和失败场景的集合
    3. 用例(功能)通常是由某个参与者来驱动执行,只有当外部的参与者与系统交互时,该功能才会发生作用
  2. 用例之间的关系:
    1. 包含:把共同的功能分离出来,称为一个单独的被包含功能,方便被多个功能复用
    2. 扩展:也就是把一个功能添加一个额外的功能
    3. 泛化:子功能继承父功能的行为和含义,还可以增加父功能没有的行为
    4. 使用:像调用函数一样,使用其他的抽象功能(用例)
  3. UML类图中,动态行为模型通常用哪些图建模,哪个图用在哪个场景中?
    1. 交互图包括顺序图和通信图,状态机包括活动图和状态图
    2. 顺序图(idea插件就是这个):
      1. 定义:按时间顺序的消息交换过程,体现出系统用例的行为,显示参与者如何采用若干顺序步骤与系统对象交互的模型
      2. 场景:在顺序图中,所有的系统都被当作黑盒子看待,顺序图的重点是参与者发起的跨越系统边界的事件。系统行为描述系统做什么,而不解释系统怎么做
    3. 通信图:
      1. 定义:描述类(对象)之间的关联及其彼此之间的消息通信
      2. 场景:通信图主要关心对象之间的交互
    4. 活动图:
      1. 定义:活动图在本质上是一种流程图,是它的一种扩展,但是不是完全一样
      2. 场景:
        1. 活动图能够表示并发活动的情形,而流程图不能。活动图是面向对象的,而流程图是面向过程的
        2. 和状态图的区别:
          1. 活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程。它的转换是自发地,不需要外部事件的驱动
          2. 状态图着重描述从一个状态到另一个状态的流程,主要有外部事件的参与。
    5. 状态图:
      1. 定义:
      2. 场景: