软工导论简答题

TMaize 于 2025-01-16 发布 浏览量

软工导论

[TOC]

第一章 软件工程学概述

1. 软件危机

软件危机是指在计算机软件的开发和维护过程中遇到的一系列严重问题。(简答、填空)

2. 概述来说,软件危机包含两方面的问题

①如何开发软件,以满足对软件日益增长的需求;

②如何维护数量不断膨胀的已有软件。

3. 软件危机的典型表现

估满质维文本素

  1. 对软件开发成本和进度的估计常常很不准确
  2. 用户对“已完成的”软件系统不满意的现象经常发生
  3. 软件产品的质量往往靠不住
  4. 软件常常是不可维护的
  5. 软件通常没有适当的文档资料
  6. 软件成本在计算机系统总成本中所占的比例逐年上升
  7. 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势

4. 产生软件危机的原因

  1. 一方面与软件本身的特点有关

    a. 软件不同于硬件,管理和控制软件开发过程相当困难

    b. 软件在运行过程中不会因为使用时间过长而被用坏,如果运行中发现了错误,很可能是遇到了一个在开发时期引入的在测试阶段没能检测出来的错误

    c. 软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升

    d. 对用户要求没有完整准确的认识就匆忙着手编写程序

  2. 另一方面和软件开发与维护的方法不正确有关

5. 消除软件危机的途径

软件 = 程序+数据+文档

  1. 首先对计算机软件有一个正确的认识,软件是程序、数据及相关文档的完整集合
  2. 充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严格、各类人员协同配合、共同完成的工程项目
  3. 推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法
  4. 应该开发和使用更好的软件工具

6. 软件工程的本质特征(可能考)

软件工程是指导计算机软件开发和维护的一门工程学科

  1. 软件工程关注与大型程序的构造
  2. 软件工程的中心课题是控制复杂性
  3. 软件经常变化
  4. 开发软件的效率非常重要
  5. 和谐地合作是开发软件的关键
  6. 软件必须有效地支持它的用户
  7. 在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品

7. 软件工程的基本原理(可能考)

  1. 用分阶段的生命周期计划严格管理
  2. 坚持进行阶段评审
  3. 实行严格的产品控制
  4. 采用现代程序设计技术
  5. 结果应能清楚地审查
  6. 开发小组的人员应该少而精
  7. 承认不断改进软件工程实践的必要性

8.软件工程方法学

软件工程包括技术管理两方面的内容。

软件工程方法学包含3个要素:方法、工具和过程(选择、填空)

软件工程方法学,分别是传统方法学和面向对象方法学

与传统方法学相反,面向对象方法学把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密结合起来的方法。

面向对象方法 = 对象 + 类 + 继承 + 用消息通信

面向对象方法学的基本原则:尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法和过程,从而使描述问题的问题域和实现解法的求解域在结构上尽可能一致。

9. 软件过程

9.1 瀑布模型(成功点:文档驱动的模型)

特点:①阶段间具有顺序性和依赖性;②推迟实现的观点;③质量保证的观点

优点:

①可强迫开发人员采用规范的方法;

②严格地规定了每个阶段必须提交文档;

③要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。

9.2 快速原型模型(不带反馈环、线性顺序进行)

9.3 增量模型

优点:①能在较短的时间内向用户提交可完成部分工作的产品;②逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。

缺点:①在把每个新的增量构建集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品;②必须把软件的体系结构设计得便于按这种方式进行扩充,软件体系结构必须时开放的。

9.4 螺旋模型(使用快速原型)

在每个阶段之前都增加了风险分析过程得快速原型模型

9.5 喷泉模型(迭代和无缝)

第二章 可行性研究

1. 可行性研究过程的步骤

1、 复查系统规模和目标 – 复查问题,确保分析员正在解决的问题确实是要求他解决的问题

2、 研究目前正在使用的系统 – 了解现有系统能做什么,而不是了解他怎么做

3、 导出新系统的高层逻辑模型

4、 进一步定义问题

5、 导出和评价供选择的解法

6、 推荐行动方针

7、 草拟开发计划

8、 书写文档提交审查

2. 数据字典的内容

数据字典由4类元素的定义组成:

①数据流;②数据流分量(即数据元素);③数据存储;④数据处理

3. 定义数据的方法

数据元素组成数据的方式的3种基本类型:顺序、选择、重复(可选是增加的关系算符)

选择:从两个或多个元素中选取一个

重复:把指定的分量重复零次或多次

可选:一个分量是可有可无的(重复零次或一次)

4. 数据字典的用途

  1. 最重要的用途是作为分析阶段的工具
  2. 数据字典中包含的每个数据元素的控制信息是很有价值的
  3. 数据字典是开发数据库的第一步,而且是很有价值的一步

第三章 需求分析

1. 需求分析建立三大模型

  1. 数据模型 – 实体联系E-R图
  2. 功能模型 – 数据流图
  3. 行为模型 – 状态转换图
  4. 用层次的方式展示细节

2. 需求分析阶段 创建三大分析模型 + 得出 软件需求规格说明书

3. 验证软件需求正确性(4个方面):一致性、完整性、现实性、有效性

第五章 总体设计

系统设计阶段:确定系统的具体实现方案

结构设计阶段:确定软件结构

1. 总体设计阶段步骤

  1. 设想供选择的方案
  2. 选取合理的方案
  3. 推荐最佳方案 – 系统设计阶段
  4. 功能分解 – 结构设计阶段
  5. 设计软件结构
  6. 设计数据库
  7. 制定测试计划
  8. 书写文档
  9. 审查和复审

2. 总体设计启发规则(常考)

  1. 改进软件结构,提高模块独立性 –> 高内聚低耦合

  2. 模块规模应该适中

  3. 深度、宽度、扇出和扇入都应适当 –» 山兔表明有多个上级模块直接调用它

  4. 模块的作用域应该在控制域之内

    作用域定义为受该模块内一个判定影响的所有模块的集合

    控制域是这个模块本身以及所有直接或间接从属于它的模块的集合

  5. 力争降低模块接口的复杂程度
  6. 设计单入口单出口的模块 –> 警告不要出现内容耦合
  7. 模块功能应该可以预测

3. 面向数据流的设计方法设计步骤

根据数据流图得到软件结构

第一步 复查基本系统模型

第二步 复查并精化数据流图

第三步 确定数据流图具有变换特性还是事务特性

第四步 确定输入流和输出流的边界,从而孤立出变换中心

第五步 完成“第一级分解”

​ 控制模块$C_m$

​ 输入信息处理控制模块$C_a$,变换中心控制模块$C_t$,输出信息处理控制模块$C_t$

第六步 完成“第二级分解”

​ 第二级分解就是把数据流图中的每个处理映射成软件结构中的一个适当的模块,从变换中心的边界开始逆着输入通路向外移动,沿着输出通路向外移动。

第七步 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化

第六章 详细设计

1. 结构程序设计的经典定义

如果一个程序的代码块仅仅通过顺序、选择和循环这3中基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。

2. 人机界面4个设计问题

  1. 系统响应时间 – 长度和易变性
  2. 用户帮助设施 – 集成和附加
  3. 出错信息处理
  4. 命令交互

面向数据流的设计方法 – 根据数据流确定软件结构

面向数据结构的设计方法 – 根据数据结构设计程序处理过程

3. Jackson方法5个步骤

见书P132

  1. 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构;
  2. 找出输入数据结构和输出数据结构中有对应关系的数据单元; –> 所谓有对应关系是有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元,重复的次序和次数应该都相同才有可能有对应关系)
  3. 3条规则从描绘数据结构的Jackson图导出描绘数据结构的Jackson图;
  4. 列出所有操作和条件,并把他们分配到程序结构图的适当位置;
  5. 用伪码表示程序

第七章 实现

编码和测试统称为实现

1. 软件测试准则 – 6条准则

  1. 所有测试都应该能追溯到用户需求;
  2. 应该远在测试开始之前就制定出测试计划;
  3. 把Pareto原理应用到软件测试中,即测试发现的错误中的80%很可能是由程序中的20%模块造成的;
  4. 应该从“小规模”测试开始,并逐步进行“大规模”测试;
  5. 穷举测试是不可能的;
  6. 为了达到最佳的测试效果,应该由独立的第三方从事测试工作。

2. 测试步骤 – 5个步骤

  1. 模块测试:又称单元测试,发现的往往是编码和详细设计的错误,目的是保证每个模块作为一个单元能正确运行; – 开发人员数据库

  2. 子系统测试:把经过单元测试的模块放在一起形成一个子系统来测试,着重测试模块的接口;

  3. 系统测试:把经过测试的子系统装配成一个完整的系统来测试;发现的往往是软件设计中的错误,也可能发现需求说明中的错误。

    不管是子系统测试还是系统测试,都兼有检测和组装两层含义,通常称为集成测试。 – 测试人员数据库

  4. 验收测试:又称确认测试,用户主导,发现系统需求规格说明书中的错误。 – 用户数据库
  5. 平行运行:平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。

3. 单元测试的测试重点 – 5个方面

  1. 模块接口
  2. 局部数据结构
  3. 重要的执行通路
  4. 出错处理通路
  5. 边界条件

第八章 维护

1. 软件维护的定义

软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需求而修改软件的过程。

早期 – 改正性维护③

中后期 – 适应性维护 ②

完善性维护 – 增加新功能或修改已有功能(占比最大①)

预防性维护④

2. 决定软件可维护性的因素 – 5个因素

  1. 可理解性
  2. 可测试性
  3. 可修改性
  4. 可移植性
  5. 可重用性

文档是影响软件可维护性的决定因素 – 用户文档和系统文档

第九章 面向对象方法学

1. 面向对象方法学的基本原则

面向对象方法学的基本原则,是尽可能模拟人类习惯的思维方式,使描述问题的问题域与实现解法的求解域在结构上尽可能一致。

2. 面向对象方法四个要点:对象、类、继承和用消息通信

3. 面向对象方法学的优点

  1. 与人类习惯的思维方法一致
  2. 稳定性好
  3. 可重用性好
  4. 较易开发大型软件产品
  5. 可维护性好

4. 面向对象的概念(可能考名词解释)

4.1 对象*:对象是封装了数据结构以及可以施加在这些数据结构上的操作的封装体

对象是封装了数据结构以及可以施加在这些数据结构上的操作的封装体

对象的特点(简答)

  1. 以数据为中心
  2. 对象是主动的,是进行处理的主体
  3. 实现了数据封装
  4. 本质上具有并行性
  5. 模块独立性好 – 高内聚低耦合

4.2 类*:类是对具有相同属性和行为的一个或多个对象的描述。

4.3 实例*:实例就是由某个特定的类所描述的一个具体的对象。

4.4 消息*:三要素 – ①接收消息的对象,②消息名,③零个或多个变元

4.5 方法:方法就是对象所能执行的服务,也就是类中所定义的服务。

4.6 属性:类中所定义的数据,是对客观世界实体所具有的性质的抽象。

4.7 封装:信息隐藏

4.8 继承

4.9 多态性*:子类对象可以像父类对象那样使用,同样的消息即可以发送给父类对象也可以发送给子类对象。–同一消息不同对象不同效果

4.10 重载*:同名不同参

函数重载:在同一作用域内若干参数特征不同的函数可以使用相同的函数名字;

运算符重载:同一个运算符可以施加于不同类型的操作数上面。

5. 类与类之间的关系 – 4种关系、细分9个

  1. 关联

    普通关联

    关联的角色

    限定关联*

    关联类

  2. 聚集

    组合聚集

    共享聚集

  3. 泛化

  4. 依赖和细化

第十章 面向对象分析

对象模型是最基本、最重要、最核心的。

面型对象分析首要的工作,是建立问题域对象模型

三个子模型与5个层次P232

对象模型

1. 主题层
2. 类与对象层
3. 结构层
4. 属性层
5. 服务层

动态模型

功能模型

1. 建立对象模型的5项主要活动

找出类与对象、识别结构、识别主题、定义属性、定义服务

2. 面向对象分析的7个顺序

找出类与对象、识别结构、识别主题、定义属性、建立动态模型、建立功能模型、定义服务

3. 建立对象模型6个步骤

  1. 确定类与对象
  2. 确定关联
  3. 划分主题
  4. 确定属性
  5. 识别继承关系
  6. 反复修改

对象模型的五个层次:

主题层

类与对象层

结构层

属性层

服务层