[TOC]

计算机科学导论学习笔记

第 4 部分 计算机软件与算法

此部分包含第78910章,包含了计算机操作系统、问题求解算法、程序设计语言之旅、软件工程等相关知识,加深我们对开发的认识,为后续开发打下一个基础。

原文地址: https://mp.weixin.qq.com/s/ggyIE-ZbT0AeosCN0wZ0mA

第 10 章 软件工程

此节介绍软件工程概念以及软件生命周期为起点,以及开发过程中的两个模型(瀑布模型和增量模型)。

在1969年第一届国际软件工程会议,恰巧是第一台计算机诞生30年之际,定义了软件工程是建立在利用合理的工程方法和原则来获得在真实机器上工作的可靠软件。

10.1 软件生命周期

(1) 生命周期概念

描述:软件生命周期是软件工程的基本概念,软件和其他的产品一样,周期性地重复着一些阶段。

  • 开发:由开发者小组根据设计要求开发软件。

  • 使用和修改:由于在软件使用中发现错误、设计改变规则或公司本身发生变化。

  • 过时:因效率低下、语言过时、 用户需求的重大变化或其他因素而导致软件失去它的有效性。

WeiyiGeek.软件生命周期

WeiyiGeek.软件生命周期

(2) 开发过程模型

在软件生命周期中,开发过程包括4个阶段:分析、设计、实现和测试,并且有多种模型,此处讨论最常见的两种模型,即瀑布模型和增量模型

瀑布模型: 它是一种非常流行的模型,开发过程只有一个方向的流动。意味则前一个阶段结束,才能开始后面一个阶段。

例如,整个工程的分析阶段应该在设计阶段开始前完成,整个设计阶段应该在实现阶段开始前完成。

优点:在下一个阶段开始前每个阶段已经完成,在测试阶段整个系统整体功能已经完成。

缺点:问题定位难,如果过程中中有一部分有问题,则必须检查整个过程。

增量模型:它是企业中最常用的模型,由开发者根据初始需求进行开发,后续在由需求是在进行开发,这就是我们常说的模块化开发。

WeiyiGeek.瀑布模型与增量模型

WeiyiGeek.瀑布模型与增量模型

10.2 分析阶段

整个开发过程始于分析阶段,此阶段生成规格说明文档,即说明了软件要做什么,它使用两种独立的方法,其依赖于实现阶段是使用 过程编程还是对象编程

(1) 面向过程分析

1) 数据流图: 显示了系统中数据的流动,使用4种符号来表示。

方形盒: 表示数据源或数据目的
带圆角的矩形: 表示过程(数据上的动作)
末端开口的矩形: 表示数据存储的地方
箭头表示: 数据流

2) 实体图:实体关系图是分析阶段使用的另一个建模工具,此图主要用于数据库的设计。

3) 状态图: 提供了另外一种有用的工具,其通常用于当系统中的实体状态在响应事件时将会改变的情况下。

WeiyiGeek.数据流图与状态图

WeiyiGeek.数据流图与状态图

(2) 面向过程分析

1) 用例图: 系统用户视图,它显示了用户与系统间的交互,常常使用四种组件表示,即系统、用例、动作者和关系

系统(用矩形表示)执行功能。
系统中的行动(圆角的矩形表示)由用例显示。
动作者:是使用系统的某人或某事。
关系:使用线条联系动作者与行动,但它们并不需要表示人类。

2) 类图:经过分析下一步就是创建系统类图,主要是考虑系统涉及的实体。

3) 状态图:在类图完成之后,就可以为类图中的每个类准备状态图,其与面向过程分析中的状态图相同。

WeiyiGeek.用例图与类图

WeiyiGeek.用例图与类图

10.3 设计阶段

设计阶段定义系统如何完成在分析阶段所定义的需求,即到底怎么做,此阶段中系统所有的组成部分都被定义。

(1) 面向过程设计

在面向过程设计中,即要设计过程也要设计数据,并且整个系统被分解成一组过程或模块

1) 结构图:主要用于说明模块间的关系,例如图中的 10.8。

2) 模块化:将大项目分解成较小的部分,以便能够容易理解和处理,即意味着将大程序分解成能互相通信的小程序,通常在代码开发时要求低耦合高内聚

  • (低)耦合:耦合是对两个模块互相绑定紧密程度的度量,通常为了让模块尽可能地独立,我们需要让其松散耦合。

    例如,A模块与B模块存在依赖关系,当A模块发生改变时,B模块仍然可以正常工作,那么就认为A与B是低耦合的。

    优点:松散耦合的模块更可能被重用,不容易在相关模块中产生错误,并且在系统需要修改时,允许我们只修改需要改变的模块,而不会影响到其它模块。
    开发原则:软件系统中模块间的耦合必须最小化。

  • (高)内聚:内聚是程序(模块内部)中处理过程相关紧密程度的度量,通常需要尽可能最大化软件系统模块间的内聚。

    例如,系统中存在A、B两个模块进行交互,如果修改了A模块,不影响B模块的工作,反之,修改了B模块也不影响A模块工作,即A、B模块都各司其职,那么我们就认为A模块有足够的内聚。

    优点:我认为高内聚的模块是实现低耦合的前提,因为一个模块实现某一个功能不依赖于其他模块,从而提高程序的可靠性。
    开发原则:软件系统模块间的内聚必须最大化。

(2) 面向对象设计

在面向对象设计中设计阶段,通过详细描述类(Class)的细节,例举出其对象的属性以及方法动作的细节。

WeiyiGeek.结构图

WeiyiGeek.结构图

10.4 实现阶段

此阶段在瀑布模型中,通常是在设计阶段完成之后,其主要为面向过程设计中的模块编写程序或者编写程序单元,换言之,根据需求开始写代码🤓。

(1) 语言选择

通常在企业中都有相应的技术开发栈,例如 C 系列、Java 系(当前最多)、Go 系(次之)、Python 系,对应不同的开发需求、侧重点选择一种开发语言,使得开发周期变短。

(2) 软件质量

高质量的软件系统是一个能满足用户需求、符合组织操作标准和能高效运行在为其开发的硬件上的一个软件。

软件质量能够划分成三个广义的度量∶可操作性、可维护性和可迁移性

  • 1) 可操作性:涉及系统的基本操作,具有有多种度量方法准确性、高效性、可靠性、安全、及时性和适用性
  • 2) 可维护性:以保持系统正常运行并及时更新为参照,具有有多种度量方法可变性、可修正性、适应性,可测试性
  • 3) 可迁移性:指把数据和(或)系统从一个平台移动到另一个平台并重用代码的能力,有有多种度量方法重用性、互用性、可一移植性
WeiyiGeek.软件质量

WeiyiGeek.软件质量

10.5 测试阶段

此阶段主要是在上线前尽可能发现错误,意味着良好的测试策略能发现最多的错误,通常有白盒测试与黑盒测试两种。

(1) 白盒测试

或叫玻璃盒测试,即内部开发测试人员,知道或者拿到软件分析文档,设计文档,以及有开发的源程序代码, 程序就像玻璃盒子,其中的每件事都是可见的。

白盒测试需要保证至少满足下面4条标准:

  • 每个模块中的所有独立的路径至少被测试过一次。

  • 所有的判断结构(两路的或多路的)每个分支都被测试。

  • 每个循环被测试。

  • 所有数据结构都被测试。

WeiyiGeek.软件测试与基本测试示例

白盒测试有多种测试方法,其中最常见是基本路径测试控制结构测试(逻辑测试)

基本路径测试:由Tom McCabe提出的,它是一种软件中每条语句至少被执行一次的方法。

控制结构测试:它比基本路径测试更容易理解并且包含基本路径测试,例如下方不同类的测试。

  • 条件测试:用来检査是否所有的条件都被正确设置。
  • 数据流测试:用来检査被用在赋值语句左边的变量的值。
  • 循环测试:用来检查循环的正确性。
(2) 黑盒测试

即我们在不知道其程序分析文档、设计文档以及拿不到程序源代码时进行的测试,通常在业务上线前需要进行黑盒的安全渗透测试,换言之,程序就像看不见内部的黑盒。

穷尽测试:在输入域(路径、输入、传参出)中的使用所有可能的值去测试软件。

随机测试:在输入域的值的子集来测试,子集选择的方式(值在输入域上的分布)是非常重要的。

边界值测试:当遇到边界值时错误经常发生,即我们常说的缓冲区溢出,可能会对代码程序致命的错误。

10.6 软件文档

企业内部中在开发初始阶段便有许多开发设计文档,随着业务的迭代也有自己的Bug管理文档,所以说软件的正确使用和有效维护离不开文档,所以文档是一个持续过程。

通常软件有三种独立的文档:用户文档、系统文档和技术文档

用户文档:即用户手册的文档,它告诉用户如何一步步地使用此软件。

系统文档:即定义软件本身,其目的是为了让原始开发人员之外的人能够维护和修改软件包(接盘侠 😳)。

在分析阶段,收集的信息应该仔细地用文档记录

在设计阶段,最终版本中用到的工具必须记录在文档中。

在实现阶段,代码的每个模块都应记录在文档中。

在测试阶段,对最终产品使用的每种测试,连同它的结果都要记录在文档中。

技术文档: 即软件系统的安装部署,通常由专业的技术人员进行参考。