文章 44
浏览 11238
软件工程笔记

软件工程笔记

软件工程


  1. 软件的定义:软件是计算机系统中与硬件相辅相成的另一部分,它包括程序、相关数据以其说明文档。需要注意的是软件不等于程序。

  2. 软件的本质特性:

    • 复杂性
    • 一致性
    • 可变性
    • 不可见性
  3. 软件工程:

    1. 将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护过程,即将工程化应用于软件开发和管理之中
    2. 对 i.中所选方法的研究。
  4. 软件工程的主要内容:

    1. 技术方面:研究软件开发方法、软件开发过程、软件开发工具
    2. 管理方面:主要研究软件项目管理学、软件经济学、软件心理学
  5. 软件工程的三个基本要素:

    1. 过程
    2. 方法
    3. 工具
  6. 软件危机:计算机软件开发和维护过程中所遇到的一系列严重问题

    1. 已完成的软件不满足用户的需求
    2. 软件产品的质量没有保证
    3. 开发进度不能保障,交付时间一拖再拖,开发成本超出预算
    4. 软件没有适当的文档
    5. 软件的可维护程度低
  7. 软件开发方法:

    • 结构化方法
    • 面向对象方法
  8. 软件过程:软件过程是一系列开发活动,将用户的需求转化为用户满意的产品。主要包括:可行性分析、项目计划、需求分析、总体设计、详细设计、编码测试、运行维护等阶段。

  9. 软件过程有哪些经典模型:

    1. 瀑布模型
    2. 原型化模型
    3. 迭代式模型
    4. 增量模型
    5. 可转换模型
  10. 敏捷开发:是一种基于更紧密的团队协作、能够有效应对快速变化需求,快速交付高质量软件的迭代和增量的新型软件开发方法。

  11. 敏捷开发特点:

    1. 更关注协作
    2. 更关注质量
    3. 更关注可工作的产品
    4. 更关注全才化的专才
    5. 基于实践而非理论
  12. 为什么敏捷开发比传统的方法好:

    1. 传统的瀑布模型是从需求出发,假设需求是固定不变的,用需求估计所需要的资源和时间。整个开发过程是以计划驱动的。
    2. 敏捷方法认为需求是不确定的,根据固定的时间和资源估计出实现的产品特性,根据产品的价值来驱动。
    3. 传统的方法虽然产生了很多设计文档,但是最终交付的产品是很难满足用户需求的。
    4. 而敏捷开发方法是在开发过程中构建演化,逐渐逼近用户满意的产品。

软件需求


  1. 软件需求作用:无论在自顶向下的软件开发过程中,还是采用自底向上的软件开发,软件需求都是软件开发的工作基础。

  2. 需求:一个需求是一个有关”要予构造“的陈述,描述了待开发产品/系统功能上的能力、性能参数或者其他性质。

  3. 软件需求的基本性质:

    • 必要的
    • 无歧义的
    • 可测的
    • 可跟踪的
    • 可测量的
  4. 软件需求的内容:

    • 功能上的能力
    • 性能参数
    • 其他性质
  5. 需求的分类:

    • 功能
    • 性能
    • 外部接口
    • 设计约束
    • 质量属性
  6. 需求的获取:

    • 自悟
    • 交谈
    • 观察
    • 小组会
    • 提炼
    • 综合运用
  7. 需求规约:是一个软件/产品/系统所有需求陈述的正式文档,是一个软件产品/系统的概念模型。

  8. 需求规约性质:

    • 重要性和稳定性程度
    • 可修改的
    • 完整的
    • 一致的
  9. 需求规约的作用:

    • 事实上的技术合同书
    • 管理控制点
    • 受控制的起点
    • 是验收测试和用户指南的起点
  10. 需求分析模型:理解需求,表达需求的模型

  11. 需求验证:对需求进行评审,通过在需求的基本性质方面进行评审。

  12. User Story:不使用技术语言,而是采用一定的语法形式以客户能够明白的简短明了的形式去描述需求的方法。

    • As a
    • I want
    • so that

软件结构化分析方法


  1. 结构化分析:

    • 结构化分析方法
    • 结构化设计方法
    • 结构化程序设计方法
  2. 结构化分析过程

    1. 建立系统的功能模型
    2. 建立数据字典
    3. 给出加工小说明
  3. 需求规格说明书内容:

    1. 引言
    2. 概述
    3. 数据流图、数据字典、加工说明
    4. 接口
    5. 性能需求
    6. 属性
    7. 其他需求
  4. 启发式规则

    1. 提高模块独立性
    2. 模块规模适中
    3. 深度、宽度、扇入、扇出适中
    4. 模块的作用域力争在控制域内
    5. 降低模块接口的复杂度
    6. 模块功能应该可以预测

软件测试


  1. 软件测试的目的:

    1. 预防错误
    2. 发现错误
  2. 软件测试的原则:

    1. 所有的测试都应该追溯到用户
    2. 在测试工作开始之前,要进行测试计划的设计
    3. 测试应从小规模开始,逐步转向大规模
    4. 穷举测试是不可能的
    5. 为了尽可能的发现错误,应由独立的第三方来测试
    6. 测试只能保证尽可能多的发现错误,无法保证发现所有的错误
  3. 白盒测试种类:

    • 路径测试
    • 语句测试
    • 分支测试
    • 条件组合测试
  4. 黑盒测试和白盒测试的区别:

    • 白盒测试:白盒测试也称结构测试或逻辑驱动测试,他是知道产品的内部工作过程,通过测试来检测产品内部动作是否按照规格说明书的规定来正常运行的。
    • 黑盒测试:黑盒测试也称功能测试或数据驱动测试,他是已知产品所应具有的功能,通过测试来检验每个功能是否能正常使用。完全不考虑程序的内部机构和内部特性,在程序的接口进行测试。
  5. 软件测试的步骤:

    1. 整体测试
    2. 单元测试
    3. 集成测试
    4. 确认测试
    5. 系统测试

UML 图


UML

面向对象设计与设计模式


面向对象设计原则

  1. 找到应用中需要变化之处,把变化的部分封装起来,不和无需变化的代码混在一起。
  2. 针对接口编程
  3. 少用继承,多用关联
  4. 对修改关闭,对扩展开放

单例模式

一个类仅有一个实例

  1. 构造函数私有
  2. 持有自己类型的属性(静态属性)
  3. 对外提供获取实例的静态方法
  • 什么时候采用单例模式:
  1. 需求中明确要求
  2. 一个类所有属性唯一,且只能访问不能修改
  3. 一个类没有属性
  • 优点:节省内存

策略模式

一个系统有许多许多类,而区分它们的只是他们直接的行为。

  1. 一个接口
  2. 多个实现了接口的不同类
  3. 使用时,主类通过传入不同类型的参数,使用不同的方法
  • 优点:
  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

软件工程管理


人员组织与管理

项目组形式
  1. 民主式:
  • 优点:小组成员地位平等,大家说了算,容易激发大家的创造力,有利于攻克技术难关
  • 缺点:
    1. 每个成员都要进行沟通,要求组内成员不能太多
    2. 缺乏领导,没法解决意见分歧的问题
  • 适用场景:规模小、能力强、适应共同工作的开发组
  1. 主程序员式
  • 人员

    • 主程序员:是技术熟练,有经验的开发人员,对系统负全部责任,负责指导其他程序员。程序员之间没有沟通渠道,所有接口问题由主程序员处理。
    • 后备程序员:负责测试
    • 编程秘书:负责文档
    • 其他程序员:在主程序员指导下,完成详细编程工作
  • 优点:项目组人员分工明确,简化了成员之间的沟通,提高了工作效率

  • 缺点:主程序员必须具备较高的管理才能和技术能力

  1. 现代程序员式
  • 人员:取消主程序员的行政工作(技术组长),设置一名行政组长负责项目管理。在项目规模较大时,把成员分成若干小组,每组有主程序员和行政组长,整个项目由产品经理管理技术组长和行政组长。
  • 优点:职责范围明确,技术组长处理技术问题,行政组长处理非技术问题。
协调和沟通方式
  1. 直接交流
  2. 电话
  3. 电子邮件
  4. 会议
  5. 论坛
  6. 书面报告

可行性研究

  • 步骤:
  1. 复查系统的规模、目标和限制
  2. 研究正在使用的系统问题
  3. 导出新系统的高层逻辑模型
  4. 进一步定义问题
  5. 导出和评价供选择的解决方案
  6. 推荐行动方针
  7. 草拟开发计划
  8. 书写可行性研究报告,提交复查
要素:经济、技术、法律和社会环境
  • 经济可行性(成本分析)
  1. 源代码行数:

    1程序的最小规模sa,最大规模sb,最有可能的规模sm
    2loc =  ( sa + 4 * sm + sb ) / 6
    
  2. 基于功能点的估算方法:

    1. 未调整的功能共有五个考虑的维度:输入项数(a1)、输出项数(a2)、查询数(a3)、主文件数(a4)、外部接口数(a5)。

    2. 为每个维度分配一个系数 b

    3. 计算未调整的功能点(UFP)为

      1UFP = a1 * b1 + a2 * b2 + a3 * b3 + a4 * b4 + a5 * b5
      
    4. 技术复杂因子(TCF)有 14 个考虑的维度,计算过程为:

      1TCF = 0.65 + 0.01 × (f1 + f2 + ... +f14)
      
    5. 计算功能点数(PF):

      1PF = UPF * TCF
      
收益分析
  • 货币的时间价值

    用利率形式表示货币的时间价值。假设年利率为 i,如果现在存入 P 元

    • 则 n 年后可以得到的钱数为:
    F=P(1+i)^n
    • 如果 n 年后能收入 F 元钱,那么这些钱的现在价值是:
    P=F/(1+i)^n
  • 纯收入

    纯收入 = 折合现价的总收入 - 当前投资额
  • 投资回收期(累积的经济效益等于收回最初投资所需要的时间)

    投资回收期=TN-1 + ((投资值-TZ)/到收回投资的年份的净现金流量)
    TN:累计现在值大于投资值的年
    TZ:TN-1年的累计现在值

软件项目管理

软件项目管理的内容主要包括:人员的组织与管理,软件度量,软件项目计划,风险管理,软件质量保证,软件过程能力评估,软件配置管理等

软件配置管理

  • 软件过程的文档(总称为软件配置)

    • 程序(源代码、可执行程序)
    • 文档(分析、设计、测试、用户指南)
    • 数据
  • 软件过程管理

    1. 标识
    2. 版本控制
    3. 变化控制
  • 软件质量的因素

    1. 正确性
    2. 健壮性
    3. 可靠性
    4. 性能
    5. 易用性
    6. 清晰性
    7. 可扩展性

故障树分析


故障树分析


标题:软件工程笔记
作者:Hanmengnan
地址:https://www.wendau.com/articles/2020/05/24/1588396047808.html