社会-技术系统
系统总体特性
-
功能特性:当一个系统的所有子系统同时工作起来,整个系统整体将表现出它的实用性特征
-
非功能特性:表现为在特定的操作环境中系统的表现行为;如可靠性,性能,安全性,信息安全性等
在同一个系统中将会有多个不同的组件,不同的组件之间会有不同程度的依赖;正是由于这些依赖性,当某一个组件出现错误或失误时,传播给与之相关性大的其他依赖组件的几率也较大;这就是在设计系统时需要注意的部分之一
系统工程
系统工程是描述、设计、实现、有效性检查、维护系统的一系列活动
-
系统开发期间返工余地缩小:某些决策的确定将会导致之后的更改成本变得高昂
-
学科的渗透:在一个复杂的系统中,需求、人员涉及不同的方面、学科
系统需求的定义
-
抽象的功能需求:将具体的功能需求中的基本功能定义在抽象层次,以减少对其他子系统的影响
-
系统特性
-
系统不能有的性质
例如为了防止信息过剩,来不及处理,系统有时不能一次性给出过多信息
为了尽可能减少对正常工作的影响,需要对某些行为,某些性质进行禁止
系统设计
-
分割需求:当一个系统足够大时,就需要分割总的需求为较小的,以便于软件的开发
-
识别子系统:将独立地或联合地满足需求的子系统识别出来
-
为子系统分配需求:当某些子系统是打包发售购买时,可能需要对子系统针对需求进行改写
-
描述子系统功能:为了识别不同子系统之间的关系,将划分好的不同的需求有针对性地分配给子系统
-
定义子系统接口:定义每个子系统提供的和需要的接口
系统建模
在系统需求和设计过程中,需要清楚地描述不同组件之间的关系,将其形式化地表现在图表或概念图中
子系统开发
系统集成
系统进化
系统退役
遗留系统
遗留系统是过去开发的,中途不断优化更新,存在有许多硬件软件人员依赖于遗留系统,而遗留系统过于臃肿,一时难以开发一个新的替换系统完美地、不冲突地接管原来的、现在的数据和使用者管理者
要求极高的系统
要求极高的系统指的是一旦失败,将对生命财产安全产生巨大损失的计算机系统
系统可依赖性
-
可维修性:系统失败是不可避免的,为了防止系统失败之后不能尽快地修复并再次投入使用,需要在系统中提前放入能够诊断问题,研究失败并修复的组件
-
可维护性:系统的使用过程中,新的需求不断出现,需要对系统不断地更改以达到用户的目的
-
生存能力:在系统遭受攻击时,能够提供最低服务,减少因被攻击造成的损失
-
容错: 当用户发生错误时,系统应能及时地检测,并最好避免用户出错
可用性和可靠性
安全性
安全性指系统不能伤害人员或系统环境,即使在发生失败的情况下
信息安全性
互联网很容易遭受外界的攻击,系统需要保证存放的数据不被泄露或破坏,也需要维持服务
软件过程
软件过程模型
瀑布模型
-
需求分析和定义:根据用户对目标的描述,建立系统的服务约束和目标
-
系统和软件设计:区分硬件和软件的需求,识别和描述软件系统的抽象和相互关系
-
实现和单元测试:检查每个单元是否符合自身的描述
-
集成和系统测试:将各单元组织整合并进行测试
-
运行和维护:在软件系统被安装并进入了实际的使用之后,对用户的新的需求或发现的错误进行修改与更正
进化式开发
-
探索式开发:其目标是与用户一起工作,共同探索系统需求,直到最后交付系统。从需求较清楚的部分开始,根据用户的建议逐渐向系统中添加功能
-
抛弃式原型:目标是理解用户需求,再给出系统的一个交换的需求定义,着重于对用户理解较差的部分的使用
进化式方法在应对用户紧急需要的情况下更加有效,也可以不断补充完善,当用户对系统需求有更多的理解后,能够很快地得到补充完善
但这种方法过程不可见,管理者需要经常交付,系统的结构由于频繁的变更也逐渐被损坏
基于组件的软件工程
-
组件分析:根据需求,找出能满足需求或部分需求的组件
-
需求修改:根据得到的组件信息,修改需求以满足需求,当需求不允许更改时,重新进行组件分析
-
使用复用的系统设计:设计系统框架,或者使用一些可以重复利用的组件与系统框架完成任务
-
开发和集成:将没有现有的组件自己开发,并将所有的组件组合在一起
过程反复
在软件的开发过程中,需求是在不断变化的,当需求变更时,就需要重新开发
-
增量式开发:客户大概地提出需要的服务,并说明各需求之间的重要性区别;用户不断地提出新的增量要求,一个增量完成并交付后,即可立即使用,无需等待整个系统实现
-
螺旋式开发:分为目标设置、风险评估、开发和有效性验证、规划
过程活动
软件描述
-
可行性研究:现有的技术是否能满足用户的要求
-
需求导出和分析
-
需求描述:在需求分析中收集的信息以文档的形式保存
-
需求有效性验证:检查需求实现、一致性和完备性
软件设计和实现
-
体系结构设计:确定系统由哪些子系统构成以及子系统之间的关系
-
抽象描述:子系统所提供的服务和运行范围
-
接口设计:为每个子系统写出与其他子系统之间的接口
-
组件设计:将服务分配给不同的组件
-
数据结构设计: 详细设计系统实现需要使用的数据结构
-
算法设计
软件有效性验证
-
组件测试:测试单个的组件,确保操作的正确性和组件独立性
-
系统测试: 找出组件间非预期的交互行为和组件接口问题
-
接收测试:使用客户提供的真实数据测试系统
软件进化
对硬件的更改是不经济的,而软件的变更可以发生在漫长的软件生命周期内