一.软件维护
1.软件可修改性和软件维护
产品交付给用户并投入运营之后,接下来的工作被看做软件维护。
因为软件不存在“磨损”的情况,所以与其他工程学科相比,软件维护只需要完成少量的使用帮助、故障解决等工作——但并不意味着维护是简单的工作,相反,人们需要经常修改软件~
2.软件维护的类型
在实践中,软件最为常见且不可避免的变更情景有:
- 问题发生了改变:软件被创建的目的在于解决用户问题,随着时间变化问题可能会发生改变
- 环境发生了改变:软件的正常使用需要依托于一个特定的软硬件环境~
- 软件产品中存在缺陷:软件总会遗留一些问题,很难100%达到目标~
被广泛接受的维护类型如下:
- 完善性维护:为了满足用户新的需求,增加软件功能而进行的软件修改活动
- 适应性维护:为了使软件能够适应新的环境而进行的软件修改活动
- 修正性维护:为了排除软件产品中遗留的缺陷而进行的软件修改活动
- 预防性维护:为了让软件产品在将来可维护,提升可维护性的软件修改活动
3.软件维护的高代价性
在软件发展趋势上,人们花费在软件上的成本逐渐超过硬件并最终占有支配地位,人们在软件维护上花费的成本也逐渐超过了软件开发(从需求到交付)~
维护代价高的原因主要来源于如下两个方面:
- 变更的频繁性
- 维护的困难性:程序理解and影响分析
4.开发可维护的软件
软件维护师为了以成本效益有效的方式支持软件系统运营而需要的活动的统称,这些活动包含交付之前的活动和交付之后的活动:
- 交付之前的活动主要是进行规划,以保证软件系统在交付之后能够正常运营并获得技术支持
- 交付之后的活动主要是进行软件修改、用户培训和使用帮助
5.软件维护过程与活动
- 问题/修改的标识、分类:主要任务是进行变更管理
- 分析:为后续的修改确定一个基本的规划
- 设计:依据变更分享的结果和已有系统的信息,完成对系统设计的变更
- 实现:该步骤的主要任务是根据变更的设计,完成代码实现
- 回归/系统测试:确保对变更的修改不会带来连锁的负面效应
- 验收测试:由用户、客户或者指定的第三方来验证系统是否满足用户的变更请求
- 移交:该步骤的主要任务是将修正的系统发布永远按照好运营
二.软件误解
1.演化与维护
描述了软件交付之后的软件修改活动,明确定义了软件开发与软件维护的界限:
2.软件演化定律
演化式开发的程序需要被反复地修改,它的软件结构和程序代码要能适应需求的快速修改迭代和渐进增量扩展~
- 持续变化:一个大学软件系统要不进行不断的变化,要不用处会越来越少
- 不断增加的复杂度,随着软件系统的发展,它的复杂性会不断增加,除非进行一定的工作来维持或降低复杂度
- 系统的质量将出现下滑,除非进行一定的工作来适应环境变化
3.软件演化生命周期模型与演化活动
- 初始开发:按照传统的软件开发方式完成第一个版本的软件产品开发,第一版的软件产品可以实现全部需求,不过通常只包含部分非常重要和紧急的最高优先级要求
- 演化:在完成初始开发之后,软件产品就进入了演化阶段,该阶段可能会有预先安排的需求增量
- 服务:服务阶段的软件产品不再持续得增加自己的价值,而知识周期性地修正已有地缺陷
- 逐步淘汰:开发者已经不再提供软件产品的任何服务,即不再继续维护该软件
- 停止:一个软件正式退出使用状态后就进行停止状态
三.软件维护与演化的常见技术
简单来说,软件维护与演化主要包含两个要点:程序理解与修改实现~
1.遗留软件
在过去的发展中,人们积累了大量的遗留软件,对这些遗留软件进行维护是一件非常困难的事,原因有以下几点:
- 软件可能非常古老,并且规模很大
- 已经被严重的修改过
- 基于过时的技术
- 没有可用的文档
2.逆向工程
分析目标系统,标识系统的部件及其相互关系,并且使用其形式或者更高层的抽象创建系统表现的过程——基本原理是抽取软件系统的需求与设计而隐藏实现细节,然后再需求与设计的层次上描述软件系统,以建立对系统更加准确和清晰的理解~
3.再工程
逆向工程的猪獒关注点是理解软件,但并不修改软件——再工程恰恰相反,它主要关注如何修改软件,不会花费很大力气理解软件。