自学笔记——软件工程导论

本文探讨了软件工程的定义,涉及从结构化到面向对象的方法,以及软件生命周期、过程模型、估算技术、项目管理和质量保证等内容,强调了CMM模型在软件能力成熟度上的应用。
摘要由CSDN通过智能技术生成

0. 软件工程的定义

  • BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
  • IEEE:在软件工程术语汇编中的定义:软件工程是:1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;2.在1中所述方法的研究
  • FritzBauer:在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
  • 计算机科学技术百科全书》:软件工程是应用计算机科学数学逻辑学管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。其中,计算机科学数学用于构建模型与算法工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
  • 比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
  • ISO 9000对软件工程过程的定义是:软件工程过程是输入转化为输出的一组彼此相关的资源和活动。

1. 软件工程概论

1.1 软件危机

  • 软件危机简介
  • 产生软件危机的原因
  • 消除软件危机的途径

1.2 软件工程

  • 软件工程简介
  • 软件工程的基本原理
  • 软件工程方法学
    • 传统方法学/结构化模型
    • 面向对象方法学

1.3 软件生命周期

1.4 软件过程

  • 瀑布模型
  • 快速原型模型
  • 增量模型
  • 螺旋模型
    • ​​​​​​​
  • 喷泉模型
    • ​​​​​​​
  • Rational统一过程
    • ​​​​​​​
  • 敏捷过程与极限编程
    • ​​​​​​​
  • 微软过程
    • ​​​​​​​

2. 结构化

2.1 结构化分析

传统的软件工程方法学采用结构化分析技术来完成系统分析。

结构化分析技术主要有下述三个要点

  1. 采用自顶向下功能分解的方法
  2. 强调逻辑功能而不是实现功能的具体方法
  3. 使用图形(最主要的是数据流图)进行系统分析并表达分析的结果

系统分析包括

  1. 问题定义
  2. 可行性研究
  3. 需求分析
  • 可行性研究
    • ​​​​​​​目的
      • ​​​​​​​
    • 过程
  •  需求分析的任务
    • ​​​​​​​
  • 与用户沟通的方法
    • ​​​​​​​
  • 分析建模与规格说明
    • ​​​​​​​
  • 实体-联系图
    • ​​​​​​​
  • 数据流图
    • ​​​​​​​
  • 数据字典
    • ​​​​​​​
  • 状态转换图
    • ​​​​​​​
  • 其他图形工具
  • 验证软件需求
    • ​​​​​​​
  • 成本/效益分析
    • ​​​​​​​成本估计
    • ​​​​​​​​​​​​​​成本/效益分析方法
      • 纯收入
        • 在整个生命周期内系统的累计经济效益(折合成现在值)与投资只差。
      • 投资回收期
        • 使累积的经济效益等于最初的投资所需要用的时间。
      • 货币的时间价值
  • 形式化说明技术
    • ​​​​​​​

2.2 结构化设计

传统的软件工程方法学采用结构化设计技术完成软件设计工作。

结构化设计技术的基本要点

        软件系统由层次化结构的模块构成

        模块是单入口和单出口的

        构造和联结模块的基本准则是模块独立

        用图来描述软件系统的结构,并且使软件结构与问题结构尽量一致

软件设计

        概要设计

        详细设计

  • 软件设计的任务
    • ​​​​​​​概要设计
      • ​​​​​​​
    • 详细设计
      • ​​​​​​​
  • 分析与设计的关系
    • ​​​​​​​
  • 设计原理/准则
    • ​​​​​​​模块化与模块独立
      • ​​​​​​​
    • 抽象
    • 逐步求精
      • ​​​​​​​
    • 信息隐藏
      • ​​​​​​​
    • 局部化
      • ​​​​​​​
  • 度量模块独立性的标准
    • ​​​​​​​
  • 启发规则
    • ​​​​​​​
  • 描述软件结构的图形工具
    • ​​​​​​​
  • 面向数据流的设计方法
    • ​​​​​​​
  • 人机界面设计
    • ​​​​​​​
  • 过程设计
    • ​​​​​​​​​​​​​​
  • 过程设计的工具
    • ​​​​​​​
  • 面向数据结构的设计方法
    • ​​​​​​​
  • 程序复杂程度的定量度量
    • 价值:把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及开发该软件需要的工作量,因此定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;程序的定量复杂度可以作为模块规模的精确限度。
    • McCabe方法
    • Halstead方法

2.3 结构化实现

  • 编码
    • ​​​​​​​选择程序设计语言
      • ​​​​​​​
    • 编码风格
      • ​​​​​​​​​​​​​​
  • 测试
    • 软件测试基础
      • ​​​​​​​软件测试是为了发现程序中的错误而执行程序的过程
      • 设计测试方案的基本目标:确定一组最可能发现某个错误或某类错误的测试数据。
      • 软件测试的准则:
        • ​​​​​​​
      • 软件测试的方法
        • 黑盒测试/功能测试
          • 把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程.也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性.
        • 白盒测试/结构测试
          • 前提是可以把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程.这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作.
      • 软件测试的步骤
        • 整个软件系统除非是一个小程序,可一开始就作为一个单独的实体来测试.根据测试准则,测试过程必须分步骤进行.后一个步骤是前一个步骤的延续.通常的大型软件系统测试过程如下步骤组成
          • 模块测试/单元测试:发现并改正程序模块中的错误,保证每个模块作为一个单元能正确地运行.
          • 集成测试/组装测试
            • 子系统测试:把经过单元测试的模块装成一个子系统,在组装的过程中同时进行测试.
            • 系统测试:把经过测试的子系统组装成一个完整的系统并同时进行测试.
          • 验收测试/确认测试:把软件系统作为单一的实体进行测试,测试的目的是验证系统确实能够满足用户的需要.因此主要使用实际数据进行测试.
          • 平行运行:同时运行新开发出的系统和将被它取代的旧系统,通过比较新旧两个系统的运行结果来测试新系统.
    • 单元测试
      • ​​​​​​​测试重点
        • ​​​​​​​
      • 代码审查
        • ​​​​​​​​​​​​​​
      • 计算机测试
    • 集成测试
      • ​​​​​​​​​​​​​​
    • 白盒测试技术
      • ​​​​​​​典型技术
        • ​​​​​​​逻辑覆盖
          • ​​​​​​​
        • 控制结构测试
          • ​​​​​​​​​​​​​​
    • 黑盒测试技术
      • ​​​​​​​
        • ​​​​​​​等价划分
          • ​​​​​​​​​​​​​​
        • 边界值分析
          • ​​​​​​​​​​​​​​
        • 错误推测
          • ​​​​​​​
  • 调试/纠错:成功的测试的后果,测试发现错误之后排除错误的过程。
    • ​​​​​​​​​​​​​
      • 调试过程
      • 调试途径
        • ​​​​​​​回溯法
          • ​​​​​​​
        • 原因排除法​​​​​​​
          • ​​​​​​​
  • 软件可靠性
    • ​​​​​​​基本概念
      • ​​​​​​​定义:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
      • 软件的可用性
        • ​​​​​​​
    • ​​​​​​​估算平均无故障时间的方法
      • ​​​​​​​符号
        • ​​​​​​​
      • 基本假定
        • ​​​​​​​
      • 估算平均无故障时间
        • ​​​​​​​
      • 估计错误总数的方法
        • ​​​​​​​

3. 维护

在软件开发出来并交付用户使用之后,就进入了软件的运行维护阶段,软件生命周期的最后一个阶段。其基本任务是保证软件在一个相当长的时期内能够正确运行,可以持续地满足用户的需求。

软件工程的主要目标就是提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本。

3.1 软件维护的定义

软件维护就是在软件已经交付用户使用之后,为了改正软件中的错误或使软件满足新的需求而修改软件的过程。更具体地说软件维护包括下述四项活动。

  • 改正性维护:诊断和改正用户使用软件时所发现的软件的错误的过程。
  • 适应性维护:为了使软件和变化了的环境适当地配合而进行的修改软件的活动。
  • 完善性维护(占一多半):用户在使用软件的过程中,往往提出增加新功能或改变某些已有功能的活动,还可能要求进一步提高程序的性能。为了满足这类要求而修改软件的活动称为完善性维护。
  • 预防性维护(占比很小):为了提高未来的可维护性或可靠性而主动地修改软件的活动。

3.2 软件维护的特点

3.3 软件维护过程

  • 维护组织
    • ​​​​​​​
  • 维护报告
    • ​​​​​​​
  • 维护的事件流
    • ​​​​​​​
  • 保存维护记录
    • ​​​​​​​
  • 评价维护活动
    • ​​​​​​​

3.4 软件的可维护性

可以把软件的可维护性定性定义为:维护人员理解、改正、改动或改进这个软件的难易程度。

  • 决定软件可维护性的因素
    • ​​​​​​​
  • 文档
    • ​​​​​​​​​​​​​​
  • 可维护性复审
    • ​​​​​​​​​​​​​​

3.5 预防性维护

        

3.6 软件再工程(预防性维护)过程​​​​​​​

  • 库存目录分析
    • ​​​​​​​
  • 文档重构
    • ​​​​​​​
  • 逆向工程
    • ​​​​​​​分析程序以便再比源代码更高的抽象层次上创建出程序的某种描述的过程。也就是说,逆向工程是一个恢复设计结果的过程。
  • 代码重构
    • ​​​​​​​
  • 数据重构
    • ​​​​​​​
  • 正向工程
    • ​​​​​​​

4. 面向对象

4.1 面向对象方法学引论

  • 面向对象方法学概述
    • ​​​​​​​面向对象方法学的要点
      • ​​​​​​​
    • 面向对象方法学的优点
      • 与人类习惯的思维方法一致
      • 面向对象软件稳定性好
      • 面向对象软件可重用性好
      • 较易开发大型软件产品
      • 可维护性好
    • 面向对象的软件过程
  • 面向对象的概念
    • ​​​​​​​对象
      • ​​​​​​​定义
        • ​​​​​​​​​​​​​​
      • 基本特点
    • 其他概念
  • 面向对象建模
    • ​​​​​​​概念
      • ​​​​​​​
    • 三种模型
      • ​​​​​​​
  • 对象模型
    • ​​​​​​​
  • 动态模型
    • ​​​​​​​
  • 功能模型
    • ​​​​​​​
  • 三种模型之间的关系
    • ​​​​​​​

4.2 面向对象分析

  • 面向对象分析的基本过程
    • ​​​​​​​
  • 需求陈述
    • ​​​​​​​
  • 建立对象模型
    • ​​​​​​​
  • 建立动态模型
    • ​​​​​​​
  • 建立功能模型
    • ​​​​​​​
  • 定义服务
    • ​​​​​​​

4.3 面向对象设计

  • 面向对象的设计准则
    • ​​​​​​​
  • 启发规则
    • ​​​​​​​
  • 软件重用
    • ​​​​​​​
  • 系统分解
    • ​​​​​​​
  • 设计问题域子领域
    • ​​​​​​​
  • 设计人机交互子系统
    • ​​​​​​​
  • 设计任务管理子系统
    • ​​​​​​​
  • 设计数据管理子系统
  • 设计类中的服务
    • ​​​​​​​
  • 设计关联
    • ​​​​​​​
  • 设计优化
    • ​​​​​​​

4.4 面向对象实现

  • 程序设计语言
    • ​​​​​​​
  • 程序设计风格
    • ​​​​​​​
  • 面向对象的测试策略
    • ​​​​​​​
  • 设计测试用例
    • ​​​​​​​​​​​​​​

5. 软件项目管理

软件项目管理就是通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。

5.1 估算代码规模

  • 代码行技术
    • 较简单的定量估算软件规模的方法。根据以往开发类似产品的经验和历史数据来估计实现一个功能需要的源程序行数。
    • ​​​​​​​
  • 功能点技术
    • ​​​​​​​根据对​​​​软件信息域特性软件复杂性​​​​​​​的评估结果,估算软件规模。这种方法用功能点FP为单位度量软件规模。
      • ​​​​​​​功能点技术定义了信息域的5个特性​​​​​​​
        • ​​​​​​​输入项数:提供给程序的应用数据项的数目
        • 输出项数:程序输出的数据项数
        • 查询数:不改变内部数据的请求—相应对的数目
        • 主文件数:必须由系统维护的逻辑主文件的数目
        • 外部接口数:与其他程序共享的数据的数目
      • ​​​​​​​估算功能点的步骤
      1. ​​​​​​​计算未调整的功能点数UFP​​​​​​​​​​​​​​​​​​​​​
        1. ​​​​​​​把软件信息域的每个特性都划分为简单级、平均级或复杂级,并根据等级为每个特性分配一个功能点数。
        2. 然后,用下式计算未调整的功能点数UFPUFP=a1*Inp+a2*Out+a3*Inq+a4*Maf+a5*Inf
      2. 计算技术复杂性因子TCF​​​​​​​​​​​​​​
      3. 计算功能点 FP=UFP*TCF​​​​​​​​​​​​​​

5.2 估算工作量

软件开发工作量是软件规模(KLOC或FP)的函数,工作量的单位通常是人月(PM)。

  • 静态单变量模型
    • ​​​​​​​
  • 动态多变量模型/软件方程式
    • ​​​​​​​
  • COCOMO2模型/构造成本模型
    • ​​​​​​​

5.3 进度计划

  • 估算开发时间
    • ​​​​​​​
  • Gantt图
  • 工程网络图
    • ​​​​​​​
  • 估算工程进度
  • 关键路径
    • ​​​​​​​
  • 机动时间
    • ​​​​​​​

5.4 人员组织

  • 民主制程序员组
  • 主程序员组
    • ​​​​​​​
  • 现代程序员组
    • ​​​​​​​

5.5 质量保证

        

5.6 软件配置管理

5.7 能力成熟度模型CMM

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值