写点什么

在软件开发中应用 80:20 原则

  • 2013-11-19
  • 本文字数:2018 字

    阅读完需:约 7 分钟

Jim Bird 是一位经验丰富的软件开发经理、项目经理与 CTO,专注于软件开发与维护中疑难问题的解决、软件质量管理与安全领域。在过去的 15 年间,Jim 曾管理过团队建设与高性能的财务系统。他的主要兴趣在于如何帮助小团队更有效地构建真正的软件:高质量、安全、高性能且易使用。近日,Jim撰文谈到了如何在软件开发中应用流行的 80:20 原则,颇具代表意义。

很多经理都不想陷入太多的思考当中,他们喜欢简单的原则,快速且直接的审视问题的方式并能找准问题的方向。越简单,越好。其中最为有效的一个原则就是 80:20 原则

80% 的效果是由 20% 的原因导致的,或者是 80% 的结果来自于 20% 的努力。

这是收益递减的另一方面:相对于做得越多,得到越少来说,你可以实现做得少但得到多的结果,方式就是通过更加聪明而非更加努力的工作。

不用太费力你就能发现在软件开发中 80:20 原则的用武之地。比如说,80% 的性能改进是通过优化 20% 的代码实现的,虽然在性能优化这个领域实际的比率可能更加接近于 90:10,甚至是 99:1。不过,无论是 80:20、90:10 还是 70:30,这个原则本质上没什么差别。

80:20,谁使用什么,你需要交付的到底是什么

在软件开发中,另一个众所周知的 80:20 原则就是 80% 的用户只使用了 20% 的特性。这来自于 Standish Group 在 2002 年的一项研究成果,他们发现:

  • 45% 的特性是从来没有被使用过的
  • 19% 的特性很少为人使用
  • 16% 的特性有时会被使用
  • 只有 20% 的特性是被频繁使用的

这个发现对敏捷与精益开发产生了深远的影响,它鼓励人们将精力放在最小的特性集或是最小的产品上,即便在大规模的企业项目中亦如此。相对于设计与规划大量的特性来说,定义重要且有用的特性才是正确之道:定义好特性的优先级,然后以稳健的步伐尽快交付。

Standish Group 最新的研究成果表明缩小思考范围,交付更少的特性是促使软件项目成功的关键之所在。有超过 70% 的小项目是成功交付的,而很多大型项目在延迟交付、预算超支以及漏掉关键特性上的可能性要超出小项目的两倍之多。

80:20,Bug 与测试

代码质量、Bug 与测试是另一个适用于 80:20 原则的领域:

  • 80% 的 Bug 是由 20% 的代码造成的
  • 90% 的停机是由 10%(甚至更少)的缺陷造成的

Bug 总是集中爆发在某几部分代码中,特别是严重的 Bug;而大多数严重的问题都是由少数几个 Bug 导致的。

Windows 与 Office 中 80% 的错误与崩溃是由检测出的 20% 的 Bug 造成的

理解大多数严重的 Bug 发生在何处,为什么会在那里,该如何去做才能防止这些 Bug 的产生,你应该将时间花在这方面。还有些研究发现你所编写的一半代码是没有 Bug 的,而大多数 Bug 都出现在 10—20% 的代码中间,通常来说,这 10—20% 的代码是经常被改动的代码。每次发现代码中的 Bug 时就表明还有更多 Bug 需要修复。你发现的 Bug 越多,剩下的 Bug 也就越多,这是一种恶性循环。每次碰到那些高风险代码时,甚至在你尝试修复一些问题时,那么很有可能你会将事情搞得越来越糟而不是越来越好:当开发者修复容易出错的代码中的一个 Bug 时,有 20% 的机会他会引入新的 Bug,即所谓的副作用。

大多数容易出错的模块都是非常复杂的,也是很难理解的,因此也是难以修复的。有些 Bug 要比其他 Bug 更难以修复。有时是因为代码质量很差、有时是因为问题难以重现和调试、有时是因为他们隐藏得更深。

80:20,哪些代码被修改了,修改频率是多少

Michael Feathers 发现 80:20 原则也适用于代码随时间变化的频率:

80% 的修改发生在 20% 的代码上

很多代码一旦写完之后就再也不会被修改了,比如说静态与标准化的接口、基本的配置等等。还有些代码一直都在发生着变化:20% 的特性花了 80% 的时间,他们经常会根据需求的变化而发生变化;需要不断优化的核心代码、还有些代码会经常发生变化是因为出现了太多的 Bug。

向已有的方法添加代码要比添加新方法容易,向已有的类添加新方法要比添加新的类容易。

这样,很多系统最后都会有几个非常庞大的类,包含了大量的方法,随着代码的不断变更,这些类将会变得越来越大。

80:20 与编程时间

前80% 的代码只花了20% 的时间,而剩下的20% 的代码则花了其余的80% 的时间。完成某个功能通常并不会花太多时间,特别是采用迭代与渐进的方式、频繁且快速的交付的情况下。

不过在背后通常还会有大量工作等待你去完成,比如说处理边界情况、处理错误,确保系统的性能与可伸缩性,寻找并修复各种Bug,部署前的各种调整等等。客户通常并不理解为什么最后的20% 工作要花费那么多的时间。程序员也经常忘记这一点,因此在估算时就会发生各种偏差。这也是开发者经常出现估算错误的原因所在。

80:20 与软件开发管理

时刻谨记 80:20 原则可以节省你大量的金钱与时间,将精力专注于重要的事情上可以不断提升你成功的可能性。哪些事情是重要的呢?比如说重要的特性、大多数严重的 Bug 出现的代码区域(需要花费最多时间去修复的 Bug),经常会发生变化的代码。你与你的团队应该将注意力放在这些地方上才能确保最后的成功。

2013-11-19 09:472980
用户头像

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

关注

评论

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

深度理解:Redis Hash(散列表)实现原理

Java你猿哥

redis 开源 ssm hash 散列表

如何科学地利用MTTR优化软件交付流程?

SEAL安全

DevOps MTTR 企业号 5 月 PK 榜

一次错误的解码处理导致Netty堆外内存泄漏问题的分析

Java你猿哥

Java Netty ssm RSS 逻辑

刚入职的后端开发问我SpringBoot如何跨域配置?我表示

Java你猿哥

Java Spring Boot ssm 跨域

Django笔记三十八之发送邮件

Hunter熊

Python django 发送邮件

创建矢量图形:Patternodes 3 免激活版

真大的脸盆

Mac Mac 软件 矢量图形创作 创建矢量图形

GitHub发布即百万!字节内网超实用 java性能优化手册,star超十万

Java你猿哥

Java ssm jvm调优 Java性能优化

2023数博会丨软通智慧发布“一屏统揽”TongView 数字政府慧治平台解决方案

说山水

引领下一代云计算技术的变革:无服务器架构

xfgg

云计算 severless

2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次数的两类操作 如果元素是 偶数 ,除以 2 例如,如果数组是 [1,2,3,4] 那么你可以对最后一

福大大架构师每日一题

golang 算法 rust 福大大

华为云UniXcoder-VESO-v1问鼎CodeXGLUE榜单第一名

算法 代码 华为云 代码语义

使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

devpoint

node.js websocket GPT-4

硬核!阿里2023版Spring全家桶进阶笔记流出,堪称Java跳槽神器

Java你猿哥

spring Spring Boot spring security Spring全家桶 Spring Cloud Aliababa

GitHub上开源24小时获星96K的,从零到实战Java架构师成长手册

Java你猿哥

架构 架构师 高可用架构 高性能架构 高可扩展

解锁人机交互新技术 华为开发者联创日·全栈AI黑客松大赛等你来

说山水

5月书讯 | 《这就是ChatGPT》来了!

图灵教育

数学 书单 GPT

可逆计算理论中的Delta合并算法

canonical

为什么要用线程池?

javacn.site

Health Kit文档大变样,一起尝鲜!

HarmonyOS SDK

HMS Core

5月书讯 | 《这就是ChatGPT》来了!

图灵社区

数学 书单 书单推荐 GPT

500行代码手写docker-实现硬件资源限制cgroups

蓝胖子的编程梦

容器 k8s ,docker Cgroups #k8s

基于WebGPU的AI原生3D引擎迎来新机遇!Orillusion在GOTC上演讲!

Orillusion

开源 渲染引擎 元宇宙 webgpu AIGC

4 种 MySQL 同步 ES 方案,yyds!

Java你猿哥

Java MySQL sql elasticsearch Binlog

设计模式之模板方法模式

越长大越悲伤

设计模式

量子程序设计基础 | 从经典计算到量子计算

TiAmo

量子计算 经典计算

一块显存为 12GB 的 GPU 卡能够在CST 时域求解器仿真的最大网格数是多少?

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 cst仿真软件

前端开发如何更好的避免样式冲突?级联层(CSS@layer)

vivo互联网技术

CSS 级联 @layer

阿里架构组分布式架构技术使用心得:全在这一份文档里面了

Java你猿哥

架构 分布式 ssm 分布式架构 安全架构

Solaris Network:BSC上首个链上合成资产解决方案

鳄鱼视界

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

福大大架构师每日一题

福大大 ChatGPT 文心一言 讯飞星火

【1对1咨询】土木女生,挖掘个人优势转行程序员

程序员晚枫

程序员 求职 转行

在软件开发中应用80:20原则_技术管理_张龙_InfoQ精选文章