重读《人月神话》(12)-未雨绸缪(Plan to Throw One Away)

对程序员而言,一个不容忽视的事实是:任何系统都将经历变更,最初精心设计的软件也可能因不断的修补而变得面目全非。无论设计多么完美,随着时间推移,系统难免陷入混乱,只是程度和速度有所不同。因此,优秀的初始设计旨在延缓这一进程,减轻其带来的痛苦。我们应具备前瞻性,确保代码具备高度的可扩展性和易维护性,并对未来的重构保持开放心态。

唯一不变的就是变化本身

软件本质上与物理产品有着显著的不同。一方面,软件的“易于掌握”意味着它相对容易被复制和修改,这使得人们往往低估了开发和维护软件的实际复杂度。另一方面,“不可见性”指的是软件不像硬件那样有形,它的结构、逻辑和工作原理对于非专业人士来说难以直观理解,这也增加了沟通和管理上的难度。

对于大多数项目,第一个开发的系统并不合用。它可能太慢、太大,而且难以使用,或者三者兼而有之。将原型发布给用户的代价是高昂的,对于用户,使用极度痛苦;对于重新开发的人员,分散了精力;对于产品,影响了声誉,即使最好的再设计也难以挽回名声。


开发人员交付的是用户满意程度,而不仅仅是实际的产品。用户的实际需要和用户感觉会随着程序的构建、测试和使用而变化。


目标上的一些变化无可避免,事先为它们做准备总比假设它们不会出现要好得多。不但目标上的变化不可避免,而且设计策略和技术上的变化也不可避免。

为变更计划系统

如何为软件需求的频繁变更设计系统,是一个在理论界广泛探讨的问题,其讨论的深度和广度甚至超过了实际应用中的实践。

阶段化的变更管理同样至关重要,每个软件产品都应具有明确的版本编号,每个版本应设定具体的时间表和变更冻结日期,以此来界定哪些变更是当前版本范围内的,哪些则应留待下一版本处理。这种有序的方法不仅能够提高开发效率,还能确保软件质量。

为变更计划组织架构

对于大型项目,需要有一支由顶级程序员组成的“技术轻骑兵”,能够在项目高峰期迅速解决问题。高效的团队不仅团队的成员工作多样性而且可扩展性强,团队整体的灵活性高。

随着系统的变化,管理结构也需要相应调整,以促进管理人员和技术人员之间的互换性。作者提到了社会性的障碍,比如管理层对高级人员的过度保护,以及管理职位带来的额外威信,这些都会阻碍团队的有效协作。为了解决这些问题,一些实验室采取了取消职位头衔或设立双轨晋升体系的方式,旨在消除社会障碍,实现管理人员和技术人员之间的平等。

作者重申“外科手术队伍”式的软件开发团队,这种团队结构鼓励高级人才积极参与编程和开发,消除了社会障碍,增加了创造性乐趣。同时,这样的组织架构设计也有助于最小化成员间的接口,使系统更易于修改,当组织结构需要调整时,也能更加灵活地重新分配任务。

图片


IBM 的两条职位晋升线


前进两步,后退一步

在程序发布给客户使用之后,它不会停止变化。发布后的变更被称为“程序维护”,但是软件的维护过程不同于硬件维护。

软件维护不包括清洁、润滑和对损坏器件的修复。它主要包含对设计缺陷的修复。和硬件维护相比,这些软件变更包含了更多的新增功能,它通常是用户能察觉的。对于一个广泛使用的程序,其维护总成本通常是开发成本的 40%或更多。令人吃惊的是,该成本受用户数目的严重影响。用户越多,所发现的错误也越多。

图片

出现的 bug 数量是发布时间的函数

程序维护中的一个基本问题是——缺陷修复总会以(20-50)%的机率引入新的 bug。所以整个过程是前进两步,后退一步。


前进一步,后退一步

Lehman 和 Belady 对大型操作系统多个版本的历史进行了研究,揭示了软件系统随时间演变的一些重要规律。他们发现,虽然模块的数量随着版本号的增加呈线性增长,但受版本更新影响的模块数量却以指数级增长。这一现象导致系统架构逐渐被破坏,系统的混乱程度不断增加。随着时间推移,修复旧设计缺陷的工作量减少,而因早期维护活动中的错误引发的新问题却越来越多。最终,系统变得极其无序,修复工作变得越来越困难,甚至失去基础。尽管理论上系统始终可用,但实际上已无法继续作为进一步发展的基础。

此外,Lehman 和 Belady 通过统计模型的研究,得出了更为普遍的结论,这些结论得到了广泛的经验支持。Pascal C. S. Lewis 尖锐地指出,这一现象不仅限于软件系统,而是历史上许多伟大成就的共同命运。无论是构建文明、成立杰出机构,还是开发复杂的软件系统,最初的成功总是伴随着潜在的问题。一些致命的缺陷最终会导致系统崩溃,如同机器启动后不久便陷入停滞。因此,随着时间的推移,系统需要经历彻底的重新设计,以适应不断变化的环境和需求。

系统软件开发是减少混乱度(减少熵)的过程,所以它本身是处于亚稳态的。软件维护是提高混乱度(增加熵)的过程,即使是最熟练的软件维护工作,也只是放缓了系统退化到非稳态的进程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(附项目源码)python开发语言,基于python Web的高校毕业论文管理系统 51,计算机毕设程序开发+文案(LW+PPT)

摘 要 随着信息化技术的迅速发展,人类信息化文明的到来,为人类的日常生活以及日常生产活动提供了非常大的便利,有效地解决了很多曾经无法解决的问题。本次基于python Web的高校毕业论文管理系统的开发是针对我国传统的高校毕业论文管理模式沟…

计算机网络:网络层 —— 网络地址转换 NAT

文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…

C++进阶:unordered_map和unordered_set的使用

目录 一.unordered_set系列 1.1unordered_set类的介绍 1.2unordered_set与set的差异 二.unordered_map的系列 三.unordered_multimap/unordered_multiset 一.unordered_set系列 1.1unordered_set类的介绍 • unordered_set的声明如下,Key就是unordered_set底层…

【6G 需求与定义】ITU(国际电联)对全球6G标准的愿景

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码:");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

Windows 部署非安装版Redis

1.下载Redis https://github.com/microsoftarchive/redis/releases 选择下载zip包,如Redis-x64-3.0.504.zip,并解压 2.启动非安装版redis服务 进入到redis目录,打开cmd 执行命令 redis-server.exe redis.windows.conf 3.登录redis客户端…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网:www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构

文章目录 什么是 HTML ?HTML 的构成 ?什么是 HTML 元素?HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML ? HTML(超文本标记语言,HyperText Markup L…

网络编程 TCP编程 Linux环境 C语言实现

所有基于数据传输通信的程序,都会被分成两种角色: 1. 服务端:又称为服务器 server 提供一种通信服务的进程 基本工作过程是:1> 接收请求数据 2> 处理请求数据 3> 发送处理结果 2. 客户端:client 使用一种通…

第二十九章 Vue之插槽

目录 一、引言 二、默认插槽 2.1. 默认插槽基本语法 2.2. 完整代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. MyDialog.vue 2.3. 运行效果 三、插槽后备内容(默认值) 3.1. 插槽后备内容基本语法 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vu…

宠物领养救助管理软件有哪些功能 佳易王宠物领养救助管理系统使用操作教程

一、概述 佳易王宠物领养救助管理系统V16.0,集宠物信息登记、查询,宠物领养登记、查询, 宠物领养预约管理、货品进出库库存管理于一体的综合管理系统软件。 概述: 佳易王宠物领养救助管理系统V16.0,集宠物信息登记…

【ESP32+MicroPython】开发环境部署

本教程将指导你如何在Visual Studio Code(VSCode)中设置ESP32的MicroPython开发环境。我们将涵盖从安装Python到烧录MicroPython固件的整个过程,以及如何配置VSCode以便与ESP32进行交互。 准备工作 安装Python 确保你的计算机上安装了Pyth…

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…

mysql之命令行基础指令

一:安装好mysql后,注册好账号密码。 二:在命令行进行登录的指令如下 mysql -u用户名 -p 例如:mysql -uroot -p; 然后按下回车,进入输入密码。 三:基本指令: 1:查看当前账户的所有…

小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测

小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一…

论文概览 |《IJGIS》2024.09 Vol.38 issue9

本次给大家整理的是《International Journal of Geographical Information Science》杂志2024年第38卷第9期的论文的题目和摘要,一共包括9篇SCI论文! 论文1 A movement-aware measure for trajectory similarity and its application for ride-sharing …

青少年编程能力等级测评CPA Python编程(一级)

青少年编程能力等级测评CPA Python编程(一级) (考试时间90分钟,满分100分) 一、单项选择题(共20题,每题3.5分,共70分) 下列语句的输出结果是( )。 print(35*2) A&a…

Linux网络命令:它用于实时监控网络接口的状态变化的命令 ip monitor详解

目录 一、概述 二、使用 1、语法 2、对象类型 3、常用选项 4、获取帮助 三、 示例 1. 监视链路层变化 2. 监视所有的网络变化 3. 仅监视路由表的变化 4. 监视特定网络接口的状态变化: 5. 监视网络接口地址的变化 四、实际应用 五、其他事项 一、概述 …

从APP小游戏到Web漏洞的发现

一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下&#xff…