📋 PM | 软件的本质与软件工程科学

这里来探讨一下有关软件的本质与软件工程科学的一些概念

软件工程的定义

软件工程就是用系统性的、规范化的、可定量的过程化方法去开发和维护软件。

导致 software crisis 本质原因、表现,与克服软件危机的方法

Software crisis 软件危机 是由于软件的大量需求与软件生产力效率之间的矛盾以及软件系统的复杂性与软件开发方法之间的矛盾,通俗来说,就是日益增长的需求使得软件生产力效率跟不上,需求的增多使得软件系统的复杂度提高,现有的软件开发方法无法应对。

其表现在几个方面:

  • 项目运行超出预算
  • 项目运行超出时间
  • 软件质量低落
  • 软件通常不匹配需求
  • 项目无法管理,且代码难以维护

克服软件危机的方法:

  • 正确认识计算机软件的内涵,以正确的态度对待软件
  • 采用工程项目管理方法实施软件开发的组织管理,让软件开发成为一种组织良好、管理严密、协同配合的工程活动
  • 采用成熟的软件开发技术和方法,开发和使用适当的软件工具,不做无用功。

软件生命周期

软件的生命周期可以分为:沟通、计划、建模、构建和部署。他们之间线性、迭代、演进和平行关系又会产生不同的模型,如瀑布模型、V 模型、原型设计、增量模型、螺旋模型等。

瀑布模型可以划分为:需求分析、设计、实现、测试、集成、部署、维护

V 模型是瀑布模型的变种,允许软件过程中环节的回顾调整。

螺旋模型是一种演进模型,为版本递增软件的快速开发提供了可能,其主要特征为循环地增加系统定义和实现的复杂度而降低风险以及用一组锚点里程碑保证利益获得灵活和满意的系统解决方案。

SWEBoK 的 15 个知识域

An Overview of the SWEBOK Guide

软件工程实践的知识域:

  • Software Requirements (软件需求):表达了对软件产品的需求和约束,这些需求和约束有助于解决一些现实世界的问题。// 其知识域包括软件的获取、协商、分析、验证和规范。
  • Software Design (软件设计):设计是定义系统或组件的体系结构、组件、接口和其他特征的过程、以及该过程的结果。其过程还包含了对软件需求进行分析然后生成软件内部结构极其行为的描述,作为构建软件的基础。// 其知识域包括:设计过程和最终产品
  • Software Construction (软件构造):通过详细设计、编码、单元测试、集成测试、调试和验证相结合,对工作软件进行详细的构建。// 其知识域包括:软件建设的基本原理;管理软件建设;构建技术;实际考虑;软件构建工具。
  • Software Testing (软件测试):一种评估产品质量以及通过识别缺陷来改进产品质量的活动。// 其知识域包括:软件测试的基本原理;测试技术;人机用户界面测试和评估;测试相关方法;实际考虑。
  • Software Maintenance (软件维护):包括增强现有的功能,使得软件在新的环境中运行以及修正缺陷。// 其知识域包括:软件维护的基本原理(维护的性质的需求、维护类别、维护成本);软件维护的关键问题(技术问题、管理问题、维护成本估算、软件维护的量度);维护过程;维护技术;灾难恢复技术;软件维护工具。
  • Software Configuration Management (软件配置管理):一门在不同时间点识别系统配置的学科。// 其知识域包括:SCM 过程的管理;软件配置识别、控制、状态解释、审计;软件发布管理和交付;软件配置管理工具。
  • Software Engineering Management (软件工程管理):包括计划、协调、测量、报告和控制一个项目或程序,确保软件的开发和维护是系统的、规范化的、可定量的。
  • Software Engineering Process (软件工程过程):软件生命周期的定义、实现、评估、定量、管理和改进。
  • Software Engineering Models and Methods (软件工程模型和方法):软件工程技术和管理的原理、原则、方法
  • Software Quality (软件质量):是软件生命周期一个普遍存在的关注点。
  • Software Engineering Professional Practice (软件工程专业实践):软件工程师必须具备的知识、技能和态度,以便以专业、负责和道德的方式实践软件工程

软件工程教育需求:

  • Software Engineering Economics (软件工程经济学):在业务环境中做出决策,以使技术决策与组织的业务目标保持一致。
  • Computing Foundations (计算基础):为软件工程实践提供的必要的计算基础背景
  • Engineering Foundations (工程基础):为软件工程实践提供的必要的工程基础背景
  • Mathematical Foundations (数学基础):为软件功能实践提供必要的数学基础背景

CMMI 的五个级别

  • Level 1 - Initial:无序,自发生产模式,其过程不可预测。
  • Level 2 - Managed:已管理,根据项目的特征进行管理,建立了基本的项目管理过程来跟踪费用、进度和功能。
  • Level 3 - Defined:已定义,根据组织的标准制定具有前瞻性的管理,将软件管理和工程过程文档化、标准化,并综合成该组织的标准软件过程。其产品的生产在整个软件过程中是可见的
  • Level 4 - Quantitatively Managed:量化管理,分析对软件过程和质量的数据,然后对过程和产品进行定量的管理和控制。
  • Level 5 - Optimizing:优化,对过程的量化反馈,用新思想、新技术使其持续改进

CMMI 与 SWEBok

CMMI 全称为能力成熟度模型集成,其本质上就是衡量软件工程的成熟度的五个级别。CMMI 可以帮助企业确认当前软件工程处于的级别并且对其进行管理和改进,增强软件的开发和改进能力。其目的就在于使得软件可以在限定时间和预算内完成并且保证其高质量。CMMI 分为五个级别,分别是无序、已管理、已定义、量化管理和优化,这五个级别对于软件工程的管理规范一级比一级要严格,是一个渐进性的模型框架,指导了企业对于现有的软件工程进行评估和改进以及开始新的系统性规范化的软件工程。其主要关注点在于:成本效益、明确重过程集中和灵活性。

SWEBoK 全称为软件工程知识体系,为软件工程的系统性规范性以及可量化性在 15 个方面的知识域提供了理论基础,指导了软件工程的发展。其意义在于在软件开发过程中指导定位相关的知识。

对分析、设计的理解。

分析是对问题和需求的调查研究

设计是满足需求的概念上的解决方案

面向对象的分析与设计的优势。

面向对象的分析与设计可以在设计中映射出现实世界中的对象和实体,使得我们可以更好地去理解应该如何去做。

UML(统一建模语言)的作用,以及主要的图例。

UML 是标准的图形表示法,有三种作用

一是作为草图:非正式、不完整的图,借助可视化语言的功能,可以用于探讨问题或解决方案空间的复杂部分。

二是作为蓝图:相对详细的设计图,用于逆向工程中对现有代码可视化或者是前向工程中的代码生成

三是作为编程语言:完成软件系统可执行规格的说明。

其具体的种类有:

  • 用例图:用户角度:功能、执行者
  • 静态图:系统静态结构
    • 类图:概念及关系
    • 对象图:某种状态或时间段内, 系统中活跃的对象极其关系
    • 包图:描述系统的分解结构
  • 行为图:系统的动态行为
    • 交互图:描述对象间的消息传递
      • 顺序图:强调对象间消息发送的时序
      • 合作图:强调对象间的动态协作关系
    • 状态图:对象的动态行为。状态-事件-状态迁移-相应动作
    • 活动图:描述系统为完成功能而执行的操作序列
  • 实现图:描述系统的组成和分布状况
    • 构件图:组成部件及其关系
    • 部署图:物理体系结构及软件单元的对应关系

从软件本质的角度,解释软件范围(需求)控制的可行性

​ 软件生成是易变、不可见、独特的智力生产,而软件本身又具有复杂性、不可见性、不一致性、可变性。在开发过程中,我们没有一个样品作为参考标准,甚至在项目完成时也无法写出完善的软件需求规格说明书。软件范围对于客户和开发者都是模糊的,因此我们需要对项目进行软件范围控制。

​ 由于软件的本质是易变的,需求决定了软件最终的形态,我们对需求进行控制就可以控制软件的形态。根据 2/8 法则,我们只需要细化 20%的有效需求,就可以满足 80%的客户需要。因此,在软件开发的一开始就控制软件的需求是十分合理的。

瀑布模型、增量模型、螺旋模型(含原型方法)的优缺点

从项目特点、风险特征、人力资源利用角度思考

瀑布模型

瀑布模型和核心在于把软件生存周期的各项活动划分为固定的顺序并且连接的阶段性工作,将功能的实现与设计分开,便于分工协作

优点

  • 瀑布模型具有直观的活动流,可以降低软件开发的复杂程度,提高软件开发过程中的透明性,提高软件开发过程的可管理性。
  • 瀑布模型是文档驱动的,推迟了软件实现,强调在软件实现前必须进行分析和设计工作。
  • 以项目的节点阶段评审和文档控制为手段有效地对整个开发过程进行指导,保证了阶段之间的正确衔接,能够及时发现并纠正开发过程中存在的缺陷,使产品达到预期的质量要求。

缺点

  • 强调过程活动的线性顺序
  • 缺乏灵活,尤其无法解决软件需求不明确或不准确的问题
  • 风险控制能力较弱
  • 瀑布模型中的软件活动是文档驱动的,当阶段之间规定过多的文档时,会极大地增加系统的工作量
  • 文档有时并不能正确反映实际的情况,管理人员如果仅仅以文档的完成情况来评估项目的完成进度,往往会得到错误的结论

增量模型

增量模型特点在于开发人员可以分批次地将产品进行提交

优点

  • 增强客户对系统的信心
  • 降低系统失败风险
  • 提高系统可靠性
  • 提高系统的稳定性和可维护性

缺点

  • 建立初始模型时,作为增量基础的基本业务服务的确定有一定难度
  • 增量粒度难以选择

螺旋模型

螺旋模型的特点在于他兼顾了快速原型迭代的特征以及瀑布模型的系统化与严格监控,引入了风险分析。

优点

  • 针对大型软件项目开发,引入了明确的风险管理机制,能够避免或减轻大型项目诸多的风险。
  • 结合了瀑布模型和快速原型方法,将瀑布模型的多个阶段转化到多个迭代过程中,以降低项目的风险

缺点

  • 比较难说服外部客户接受和相信风险分析结果并做出相关反应
  • 风险分析存在一定的成本,对于小项目耗费成本百分比较大
  • 失误的风险分析坑了带来更大的风险

简述统一过程三大特点,与面向对象的方法有什么关系?

统一过程的三大特点为:

  • 软件开发是一个迭代过程
  • 软件开发是由 Use Case 驱动的
  • 软件开发是以架构设计为中心的

统一软件开发过程(RUB),是一个面向对象且基于网络的程序开发方法论。而面向对象软件过程(OOSP)同样是把开发中面向过程的方面和其他开发的组件整合在一个统一的框架中。而面向对象的方法则属于这些方法论框架当中处理部分对象的方法。

简述统一过程四个阶段的划分准则是什么?每个阶段关键的里程碑是什么?

统一过程可以把一个项目分为四个不同的阶段:

  • 构思阶段
    • 包括用户沟通和计划活动两个方面,开发人员定义项目的范围及其业务用例。
    • 其关键的里程碑为生命周期目标
  • 细化阶段
    • 包括用户沟通和建模活动,重点是创建分析和设计模型,强调类的定义和体系结构的表示。开发人员更详细地分析项目的需求并定义其架构基础
    • 其关键的里程碑为生命周期结构
  • 构建阶段
    • 将设计转化为实现,并进行集成和测试。开发人员创建应用程序设计和源代码
    • 其关键的里程碑为初始功能
  • 移交阶段
    • 将产品发布给用户进行测试评价,并收集用户的意见,之后再次进行迭代修改产品使之完善。开发人员将系统交付给用户。
    • 其关键的里程碑为产品发布

软件企业为什么能按固定节奏生产、固定周期发布软件产品?它给企业项目管理带来哪些好处?

因为软件企业内部都有一套完善的软件工程的开发过程方法论,提供了在开发组织中分派任务和责任的纪律化方法,使并且规范了整个软件开发流程。指导了多人在一定的时间内完成指定的任务,使得企业可以按固定节奏生产并且固定周期发布软件产品,它给企业项目管理提供了一套方法论,使得企业可以平稳地输出以及顺利地运营。

项目管理实践

看板使用

这是我们的团队的 Kanban,里面包含了团队任务和个人任务。当前的任务就是确定文档和开发规范。

66ACC5DCE5DDDDC01A9572116360485B

UML 绘图工具练习

UML 和模式应用(原书第二版)P7

1552984326619

实现贴图

1552984337664

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// DiceGame类
DiceGame
--
die1: Die
die2: Die
--
play()

// Die类
Die
--
faceValue: Int
--
getFaceValue(): int
roll()

// 箭头
lt=->
r1=1
r2=2
土豪通道
0%