软件工程与计算总结(二十一)软件维护与演化

news2024/11/15 15:56:15

一.软件维护

1.软件可修改性和软件维护

产品交付给用户并投入运营之后,接下来的工作被看做软件维护。

因为软件不存在“磨损”的情况,所以与其他工程学科相比,软件维护只需要完成少量的使用帮助、故障解决等工作——但并不意味着维护是简单的工作,相反,人们需要经常修改软件~

2.软件维护的类型

在实践中,软件最为常见且不可避免的变更情景有:

  • 问题发生了改变:软件被创建的目的在于解决用户问题,随着时间变化问题可能会发生改变
  • 环境发生了改变:软件的正常使用需要依托于一个特定的软硬件环境~
  • 软件产品中存在缺陷:软件总会遗留一些问题,很难100%达到目标~

被广泛接受的维护类型如下:

  • 完善性维护:为了满足用户新的需求,增加软件功能而进行的软件修改活动
  • 适应性维护:为了使软件能够适应新的环境而进行的软件修改活动
  • 修正性维护:为了排除软件产品中遗留的缺陷而进行的软件修改活动
  • 预防性维护:为了让软件产品在将来可维护,提升可维护性的软件修改活动

3.软件维护的高代价性

在软件发展趋势上,人们花费在软件上的成本逐渐超过硬件并最终占有支配地位,人们在软件维护上花费的成本也逐渐超过了软件开发(从需求到交付)~

维护代价高的原因主要来源于如下两个方面:

  • 变更的频繁性
  • 维护的困难性:程序理解and影响分析

4.开发可维护的软件

软件维护师为了以成本效益有效的方式支持软件系统运营而需要的活动的统称,这些活动包含交付之前的活动和交付之后的活动:

  • 交付之前的活动主要是进行规划,以保证软件系统在交付之后能够正常运营并获得技术支持
  • 交付之后的活动主要是进行软件修改、用户培训和使用帮助

5.软件维护过程与活动

  • 问题/修改的标识、分类:主要任务是进行变更管理
  • 分析:为后续的修改确定一个基本的规划
  • 设计:依据变更分享的结果和已有系统的信息,完成对系统设计的变更
  • 实现:该步骤的主要任务是根据变更的设计,完成代码实现
  • 回归/系统测试:确保对变更的修改不会带来连锁的负面效应
  • 验收测试:由用户、客户或者指定的第三方来验证系统是否满足用户的变更请求
  • 移交:该步骤的主要任务是将修正的系统发布永远按照好运营

二.软件误解

1.演化与维护

描述了软件交付之后的软件修改活动,明确定义了软件开发与软件维护的界限:

2.软件演化定律

演化式开发的程序需要被反复地修改,它的软件结构和程序代码要能适应需求的快速修改迭代和渐进增量扩展~

  • 持续变化:一个大学软件系统要不进行不断的变化,要不用处会越来越少
  • 不断增加的复杂度,随着软件系统的发展,它的复杂性会不断增加,除非进行一定的工作来维持或降低复杂度
  • 系统的质量将出现下滑,除非进行一定的工作来适应环境变化

3.软件演化生命周期模型与演化活动

  • 初始开发:按照传统的软件开发方式完成第一个版本的软件产品开发,第一版的软件产品可以实现全部需求,不过通常只包含部分非常重要和紧急的最高优先级要求
  • 演化:在完成初始开发之后,软件产品就进入了演化阶段,该阶段可能会有预先安排的需求增量
  • 服务:服务阶段的软件产品不再持续得增加自己的价值,而知识周期性地修正已有地缺陷
  • 逐步淘汰:开发者已经不再提供软件产品的任何服务,即不再继续维护该软件
  • 停止:一个软件正式退出使用状态后就进行停止状态

三.软件维护与演化的常见技术

简单来说,软件维护与演化主要包含两个要点:程序理解与修改实现~

1.遗留软件

在过去的发展中,人们积累了大量的遗留软件,对这些遗留软件进行维护是一件非常困难的事,原因有以下几点:

  • 软件可能非常古老,并且规模很大
  • 已经被严重的修改过
  • 基于过时的技术
  • 没有可用的文档

2.逆向工程

分析目标系统,标识系统的部件及其相互关系,并且使用其形式或者更高层的抽象创建系统表现的过程——基本原理是抽取软件系统的需求与设计而隐藏实现细节,然后再需求与设计的层次上描述软件系统,以建立对系统更加准确和清晰的理解~

3.再工程

逆向工程的猪獒关注点是理解软件,但并不修改软件——再工程恰恰相反,它主要关注如何修改软件,不会花费很大力气理解软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOday8

#include <head.h>//要发送数据的结构体类型 struct msgbuf {long mtype; /* 消息类型*/char mtext[1024]; /* 正文数据 */}; //宏定义正文大小 #define SIZE sizeof(struct msgbuf)-sizeof(long) int main(int argc, const char *argv[]) {key_t key;if((keyft…

oracle-AWR报告生成方法

AWR报告生成方法 1. 以oracle用户登陆服务器 2. 进入到要保存awr报告的目录 3. 以sysdba身份连接数据库 sqlplus / as sysdba4. 执行生成AWR报告命令 ?/rdbms/admin/awrrpt.sql5. 选择AWR报告的文件格式 6. 选择生成多少天的AWR报告 7. 选择报告的快照起始和结束ID 8. 输入生…

Java 对象是什么样子的?

Java 对象是什么样子的&#xff1f; class Student{ int age; String name; }Student s new Student(18, “zhangsan”); 这里的 s 变量&#xff0c;就是我们常说的引用&#xff0c;这里是强引用。指向对象中的 Java对象。 很多人可能认为&#xff0c;堆中存储了 age 18, na…

Linux学习之进程一

目录 一&#xff0c;什么是进程&#xff1f; 1.何为pcb&#xff08;process control block&#xff09;&#xff1f; 2.linux的task_struct 二&#xff0c;了解task_struct的核心字段 标识符 ps指令 getpid指令 ppid&#xff08;parent process id&#xff09; getppid…

DASFAA2023 | 关系数据库和图数据库关键技术融合趋势

编者按&#xff1a; 本期论文导读为大家介绍近年来关系数据库和图数据库关键技术的融合趋势及代表性工作。相关内容来自DASFAA 2023 Tutorial “Fusion of Relational and Graph Database Techniques: An Emerging Trend”&#xff0c;由北京交通大学刘钰博士、中北大学郭青松…

【持续更新】tutorial-Linux-Markdown-etc(Linux、命令、Markdown、md、Tex、LaTex)

1. Linux命令 1.1 常用 查看文件夹下文件数量: ls -l | wc -l7zip: 解压&#xff1a;7z x compressed_file.7z -o/path/to/destination # 注意-o和目标路径是连起来的&#xff0c;没有空格压缩&#xff1a;7z a compressed_file.zip destination_path conda 查看 conda 拥有的…

@JsonCreator(mode = JsonCreator.Mode.DELEGATING) @JsonValue解释

@JsonCreator(mode = JsonCreator.Mode.DELEGATING)public MessageId(Long id) {this.id = id;}<

【中级网络工程师】下午网络配置题

目录 dis ip routing-table 路由表如何查看 静态路由配置&#xff1a; rip和ospf配置 ACL配置 定义ACL过程 关键字traffic-filter inbound 和 traffic-filter outbpund 两种安装模式 DHCP服务 基于全局分配&#xff1a; 基于接口分配&#xff1a; 如何将划分的VLAN和创…

如何确认栈中申请的变量地址

一般一个程序被加载到内存后执行而成为一个进程。进程在内存中是分区域加载的&#xff0c;分别是代码段、数据段、bss段等等。 函数中定义的变量一般存在于栈中。现在我们通过实验验证一下&#xff0c;函数中定义的变量&#xff0c;到底存在与进程哪个位置。 1.测试程序 #in…

opencv入门到精通——图片,视频,摄像头的读取与保存

简介 OpenCV是一个流行的开源计算机视觉库&#xff0c;由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包&#xff0c;可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C语言编写&#xff0c;同时也支持Python、Java、C等…

unity操作_碰撞器 c#

碰撞器Collider 在场景中选择一个物体Cube 观察检查器Inspector 自带Cube会默认挂载盒子碰撞器Box Colilider 增加组件可以增加更多中碰撞器 Edit Collider 编辑碰撞器形状 Is Trigger选项 Is Trigger &#xff1a;是否是触发器&#xff0c;如果启用此属性 则该碰撞体将用于触…

分享一下微信小程序里的预约链接怎么做

微信小程序是一种无需下载安装即可使用的应用程序&#xff0c;它依托于微信平台&#xff0c;为用户提供了更加便捷的使用体验。在小程序中&#xff0c;我们可以制作预约链接&#xff0c;以便用户直接在微信中进行预约&#xff0c;提高服务效率。下面我们将探讨如何制作微信小程…

RabbitMQ中的核心概念和交换机类型

目录 一、RabbitMQ相关概念二、Exchange类型三、RabbitMQ概念模型总结 一、RabbitMQ相关概念 Producer&#xff1a;生产者&#xff0c;就是投递消息的一方。生产者创建消息&#xff0c;然后发布到RabbitMQ中。消息一般可以包含两个部分&#xff1a;消息体和附加消息。 消息体…

利用Nginx可视化管理工具+Cpolar实现本地服务远程访问

文章目录 前言1. docker 一键安装2. 本地访问3. Linux 安装cpolar4. 配置公网访问地址5. 公网远程访问6. 固定公网地址 前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外…

nextjs-一个基于React的全栈框架

一、nextjs基本介绍 Next.js是一个基于React的轻量级框架&#xff0c;用于构建React应用程序。它在React的基础上提供了一些增强功能&#xff0c;包括服务器渲染&#xff08;SSR&#xff09;、静态生成&#xff08;SSG&#xff09;、路由等。Next.js的目标是简化React应用程序…

工业自动化控制通信协议Profinet系列-2、编译p-net在虚拟机树莓派上运行示例

工业自动化控制通信协议Profinet系列-2、编译p-net在虚拟机树莓派上运行示例 文章目录 工业自动化控制通信协议Profinet系列-2、编译p-net在虚拟机树莓派上运行示例一、前言二、树莓派虚拟机编译安装测试1、树莓派desktop下载及虚拟机安装2、下载编译安装p-net及运行demo程序 三…

【Javascript保姆级教程】if判断语句的三种形式

文章目录 前言一、if语句1.1 怎么使用1.2 示例代码1.3 示例代码2 二、if...else语句2.1 怎么使用2.2 示例代码2.3 示例代码 三、if...else if...语句3.1 怎么使用3.2 示例代码3.3 示例代码 总结 前言 嗨&#xff0c;欢迎来到Javascript保姆级教程&#xff01;在编写代码时&…

学习笔记1——SSM的基础知识

SSM的基础知识 cs架构&#xff1a;多个客户端可以访问一台服务器 请求&#xff1a;协议&#xff1a;//主机[: 端口][/路径][?查询参数] http就是一种协议&#xff0c;https是一种带加密的协议更加安全一点主机&#xff1a;localhost端口号&#xff1a;因为tomcat和mysql都是…

Babylonjs学习笔记(二)——创建基本材质

书接上回&#xff0c;这里讨论给网格添加材质&#xff01;&#xff01;&#xff01; 准备好材质 1、创建材质球 /*** 创建网格材质* param scene 场景对象* returns 材质对象*/ const createGroundMaterial(scene:Scene):StandardMaterial>{const texArray:Texture[] []// …

计网----数据包在传输中的变化过程,单播组播和广播,APR协议,APR代理,免费ARP,DNS协议,路由数据转发过程

计网----数据包在传输中的变化过程&#xff0c;单播组播和广播&#xff0c;APR协议&#xff0c;APR代理&#xff0c;免费ARP&#xff0c;DNS协议&#xff0c;路由数据转发过程 一.数据包在传输中的变化过程&#xff08;在同一个路由器下&#xff09; 1.传输数据时&#xff0c…