软件工程概述 | Personal Blog

软件工程概述

社会-技术系统

系统总体特性

  • 功能特性:当一个系统的所有子系统同时工作起来,整个系统整体将表现出它的实用性特征

  • 非功能特性:表现为在特定的操作环境中系统的表现行为;如可靠性,性能,安全性,信息安全性等

在同一个系统中将会有多个不同的组件,不同的组件之间会有不同程度的依赖;正是由于这些依赖性,当某一个组件出现错误或失误时,传播给与之相关性大的其他依赖组件的几率也较大;这就是在设计系统时需要注意的部分之一

系统工程

系统工程是描述、设计、实现、有效性检查、维护系统的一系列活动

  • 系统开发期间返工余地缩小:某些决策的确定将会导致之后的更改成本变得高昂

  • 学科的渗透:在一个复杂的系统中,需求、人员涉及不同的方面、学科

系统需求的定义

  • 抽象的功能需求:将具体的功能需求中的基本功能定义在抽象层次,以减少对其他子系统的影响

  • 系统特性

  • 系统不能有的性质

例如为了防止信息过剩,来不及处理,系统有时不能一次性给出过多信息

为了尽可能减少对正常工作的影响,需要对某些行为,某些性质进行禁止

系统设计

  • 分割需求:当一个系统足够大时,就需要分割总的需求为较小的,以便于软件的开发

  • 识别子系统:将独立地或联合地满足需求的子系统识别出来

  • 为子系统分配需求:当某些子系统是打包发售购买时,可能需要对子系统针对需求进行改写

  • 描述子系统功能:为了识别不同子系统之间的关系,将划分好的不同的需求有针对性地分配给子系统

  • 定义子系统接口:定义每个子系统提供的和需要的接口

系统建模

在系统需求和设计过程中,需要清楚地描述不同组件之间的关系,将其形式化地表现在图表或概念图中

子系统开发

系统集成

系统进化

系统退役

遗留系统

遗留系统是过去开发的,中途不断优化更新,存在有许多硬件软件人员依赖于遗留系统,而遗留系统过于臃肿,一时难以开发一个新的替换系统完美地、不冲突地接管原来的、现在的数据和使用者管理者

要求极高的系统

要求极高的系统指的是一旦失败,将对生命财产安全产生巨大损失的计算机系统

系统可依赖性

  • 可维修性:系统失败是不可避免的,为了防止系统失败之后不能尽快地修复并再次投入使用,需要在系统中提前放入能够诊断问题,研究失败并修复的组件

  • 可维护性:系统的使用过程中,新的需求不断出现,需要对系统不断地更改以达到用户的目的

  • 生存能力:在系统遭受攻击时,能够提供最低服务,减少因被攻击造成的损失

  • 容错: 当用户发生错误时,系统应能及时地检测,并最好避免用户出错

可用性和可靠性

安全性

安全性指系统不能伤害人员或系统环境,即使在发生失败的情况下

信息安全性

互联网很容易遭受外界的攻击,系统需要保证存放的数据不被泄露或破坏,也需要维持服务

软件过程

软件过程模型

瀑布模型

  1. 需求分析和定义:根据用户对目标的描述,建立系统的服务约束和目标

  2. 系统和软件设计:区分硬件和软件的需求,识别和描述软件系统的抽象和相互关系

  3. 实现和单元测试:检查每个单元是否符合自身的描述

  4. 集成和系统测试:将各单元组织整合并进行测试

  5. 运行和维护:在软件系统被安装并进入了实际的使用之后,对用户的新的需求或发现的错误进行修改与更正

进化式开发

  1. 探索式开发:其目标是与用户一起工作,共同探索系统需求,直到最后交付系统。从需求较清楚的部分开始,根据用户的建议逐渐向系统中添加功能

  2. 抛弃式原型:目标是理解用户需求,再给出系统的一个交换的需求定义,着重于对用户理解较差的部分的使用

进化式方法在应对用户紧急需要的情况下更加有效,也可以不断补充完善,当用户对系统需求有更多的理解后,能够很快地得到补充完善

但这种方法过程不可见,管理者需要经常交付,系统的结构由于频繁的变更也逐渐被损坏

基于组件的软件工程

  1. 组件分析:根据需求,找出能满足需求或部分需求的组件

  2. 需求修改:根据得到的组件信息,修改需求以满足需求,当需求不允许更改时,重新进行组件分析

  3. 使用复用的系统设计:设计系统框架,或者使用一些可以重复利用的组件与系统框架完成任务

  4. 开发和集成:将没有现有的组件自己开发,并将所有的组件组合在一起

过程反复

在软件的开发过程中,需求是在不断变化的,当需求变更时,就需要重新开发

  1. 增量式开发:客户大概地提出需要的服务,并说明各需求之间的重要性区别;用户不断地提出新的增量要求,一个增量完成并交付后,即可立即使用,无需等待整个系统实现

  2. 螺旋式开发:分为目标设置、风险评估、开发和有效性验证、规划

过程活动

软件描述

  1. 可行性研究:现有的技术是否能满足用户的要求

  2. 需求导出和分析

  3. 需求描述:在需求分析中收集的信息以文档的形式保存

  4. 需求有效性验证:检查需求实现、一致性和完备性

软件设计和实现

  1. 体系结构设计:确定系统由哪些子系统构成以及子系统之间的关系

  2. 抽象描述:子系统所提供的服务和运行范围

  3. 接口设计:为每个子系统写出与其他子系统之间的接口

  4. 组件设计:将服务分配给不同的组件

  5. 数据结构设计: 详细设计系统实现需要使用的数据结构

  6. 算法设计

软件有效性验证

  1. 组件测试:测试单个的组件,确保操作的正确性和组件独立性

  2. 系统测试: 找出组件间非预期的交互行为和组件接口问题

  3. 接收测试:使用客户提供的真实数据测试系统

软件进化

对硬件的更改是不经济的,而软件的变更可以发生在漫长的软件生命周期内