【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

软件开发中变更的真正代价

  • 2014-02-06
  • 本文字数:2051 字

    阅读完需:约 7 分钟

Jim Bird 是一位经验丰富的软件开发经理、项目经理与 CTO,专注于软件开发与维护、软件质量与安全等领域中疑难问题的解决。在过去的 15 年间,Jim 曾管理过团队建设并主导过高性能的财务系统的建设。他的主要兴趣在于如何提升小团队的效率以构建真正的软件:高质量、安全、可靠、高性能及适应性强。近日,Jim 撰写了一篇博文,谈到了软件开发中变更所带来的影响以及真正的代价,同时还谈到了如何降低变更的代价。

当软件已经设计、编码、测试与实现完毕后,如果要对其进行修改或是修复,那么代价是怎样的呢?关于这个问题存在两种截然相反的观点。一种观点认为越晚修改成本就越高,修改的代价会达到指数级;另一种观点则认为应该尽可能晚地做修改,因为修改软件的代价本质上是水平变化的。那么究竟哪种观点才是正确的呢?我们该如何做呢?

指数级的变更代价

回到上个世纪80 年代初,Barry Boehm 发布了一些统计数字( Software Engineering Economics, 1981 ),表明修改或修复软件的代价会随着时间的流逝呈现出指数级的变化,可以在这里查看变化曲线。

Boehm 的这个结论是根据 70 年代在 TRW 与 IBM 采用瀑布模型的项目数据而得出的,他发现当从需求分析转到架构、设计、编码、测试与部署阶段时,修改软件的成本会逐步增加。当尚处在需求定义阶段时,如果发现了需求上的错误而进行修改时,其代价几乎可以忽略不计。不过,如果等到完成了设计、编码和测试并将软件交付给客户后,那修改的代价可以达到之前的 100 倍以上。

这里要补充几点。首先,大型项目的代价曲线会更高一些(在小型项目中,代价曲线差不多是 1:4 而不是 1:100)。修改成本能达到 100 倍的项目并不常见,Boehm 称之为架构崩溃,这指的是项目基础的架构就是完全错误的(可伸缩性、性能以及可靠性等),而且是在客户已经开始使用系统并遇到严重的操作问题时才发现的。这些分析基于的是 30 年前的少量数据采样,那时编写代码的成本非常高,也很消耗时间,同时缺乏高效的工具。

从那之后还有不少人做了相关的研究,结果也都与 Boehm 的发现很类似,至少基本的观点是一致的,那就是发现问题的时间越晚,修复问题的代价就越高。这些研究成果被很多书籍所引用,比如说 Steve McConnell 的代码大全等,用于证明尽早执行审查和测试的重要性

总而言之,原则就是发现错误的时间越早,修改的成本就越低。Bug 在软件生态链中存活的时间越长,它对整个软件造成破坏性就越大。由于需求是最先确定的,因此需求上的缺陷就可能驻留系统更长的时间,修改的代价也更高。

水平的变更代价

规则随着开发逐步转向迭代式和增量式而发生了变化。

Boehm 认为如果我们能够提前考虑清楚风险并以增量的方式设计和构建软件(使用他称之为的螺旋模型而不是顺序化的瀑布式模型),那么我们就能尽早发现错误了。

更加现代化、轻量级的敏捷开发方式背后也是同样的想法。在 Extreme Programming Explained(第 1 版)中,Kent Beck 认为最小化修改的代价是极限编程的一个目标,水平化的修改代价曲线是“XP 的技术前提”:

  • 在某些情况下,随着时间的流逝而导致的指数级的修改代价可以水平化。如果我们能将代价曲线水平化,那么关于开发软件的最佳方式的旧假设就站不住脚了。
  • 你可以在过程的后期做出重大的决策,推迟决策的代价,从而尽可能确保决策的正确性。你只需要实现需要实现的东西,你可以引入能够简化现有代码并使得后续编码变得更简单的设计元素。

重要的是你要知道 Beck 并没有说 XP 会将代价曲线水平化,他的意思是如果团队向着这个方向努力,那么是可以将修改代价曲线变成水平的。

反馈的重要性

Scott Amber 认为在敏捷开发中代价曲线是可以水平化的,不过这并非因为简单设计,而是因为对于迭代式、增量开发很重要的反馈循环。敏捷方法优化了团队中的反馈,开发者与客户坐在一起进行持续的面对面沟通。诸如测试先行的开发、结对编程与持续集成等技术实践使得这些反馈变得更加紧密。

不过,真正重要的是从使用系统的用户当中获得反馈信息,只有这样你才能确定自己是否是正确的,是否遗漏了某些东西。设计、构建以及从真正的用户获得反馈的时间越久,将软件交付给用户所需的时间和工作量就会越多,变更的成本也会越高。

变更的真正代价

变更的代价真的是指数级么,还是水平化的。答案其实是介于二者之间的一个状态。

时至今日,软件变更的代价肯定不如 30 年前那么高了。我们现在可以做得更好,使用更好的工具、更好的开发方式。降低变更成本的关键因素有下面几点:

  • 尽快将软件交付给客户使用。我不相信有哪个组织每天会对软件做 10 次、50 次,甚至是 100 次变更,不过你肯定也不想等待几个月,甚至是几年才收到用户的反馈吧。少量交付,频繁交付。
  • 我们知道即便事先做了周密的规划和设计也无法确保一切都是正确无误的。请在理解需求和设计上花上足够的时间,这样可以确保我们是基本正确的,能够在后面帮助我们节省大量的时间。
  • 无论是采用迭代、增量的开发模式还是顺序开发模式,不管是通过测试先行的开发与结对,还是需求讲座和代码审查,只要有可能就提早找出错误,这样会降低后期的修改成本。
2014-02-06 11:011901
用户头像

发布了 88 篇内容, 共 258.7 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

码哥字节

Redis 核心技术与实战 Redis 热点key 缓存服务 3月月更

Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink

Apache SeaTunnel

大数据 大数据平台 apache 社区 Apache SeaTunnel #开源项目

基于Laravel模块化极速开发框架 免费开源CMS

ModStart开源

产品帮助中心对SaaS行业的作用

小炮

SaaS平台 帮助中心

Gartner发布中国IaaS PaaS市场服务报告,天翼云强势入选

天翼云开发者社区

深度解读「无影云电脑远程办公解决方案」

阿里云弹性计算

远程办公 无影云电脑

IT运维工具难用吗?有没有简单易操作的?

行云管家

运维 IT运维

阿里巴巴云原生大数据运维平台 SREWorks 正式开源

阿里云大数据AI技术

大数据 自动化运维 大规模网络运维

开学季 | 飞桨AI Studio课程学习,小白也可以成为一名优秀的算法工程师!

百度开发者中心

春招进行时!当代大学生求职行为大赏

易观分析

求职 招聘 春招

架构实战营模块八消息队列mysql数据库设计

刘洋

架构实战营 #架构实战营 「架构实战营」

电路模型和电路定律 (Ⅲ)

謓泽

3月月更

保姆级SpringBoot+Vue图片上传到阿里云OSS教程

沉默王二

Spring Boot

限量独家!濒危动物数字藏品免费发放!

百度开发者中心

设计一个 SaaS 系统需要考虑的4个关键点

Im胡子

系统架构 SaaS SaaS设计 SaaS系统架构

建木小故事

Jianmu

开源 后端 持续集成 建木CI

如何理解基础服务和通用服务

Im胡子

基础服务 通用服务 基础服务边界

两会“数字经济”高频出位,博睿数据为企业数字转型提供有力引擎

博睿数据

多场景推进 服务网格在联通的落地实践(下)

百度开发者中心

前端培训之常见算法分享

@零度

前端算法

美国法院最新判决:未经 OSI 许可的开源是「假开源」!

腾源会

开源 腾源会

MongoDB与亚马逊云科技扩大全球合作

MongoDB中文社区

mongodb

IT运维工具难用吗?有没有简单易操作的?

行云管家

云计算 运维 IT运维

百度希壤元宇宙平台上线首个汽车数字展厅,领克探索汽车营销新方式

百度开发者中心

什么是目标关键词?

源字节1号

前端开发 后端开发 SEO优化 网站开发

春分耕种时,AI“现身”田间地头

百度开发者中心

APICloud App开发教程之云修复功能

YonBuilder低代码开发平台

APP开发 APICloud 热更新

中国版Postman:Apifox

Liam

程序员 Jmeter Postman API swagger

“后疫情时代”支付厂商发力B端已成共识,市场规模破3千亿!

易观分析

产业支付

ModStartCMS Laravel9 模块化建站系统 v3.5.0 多图字段支持,系统优化升级

ModStart开源

iOS开发面试的43道最新面试题,让你稳拿大厂offer!

iOSer

ios iOS面试 ios开发 iOS面试题

软件开发中变更的真正代价_研发效能_张龙_InfoQ精选文章