bug中的“二八定律”

本文主要为讨论2020/3/17下午OO课讨论的第三个思考题设立

有一个经典的经验性原则,叫帕累托原则,也称为二八定律。这个原则在经济、社会和科技等多个领域都有精彩的应用和解释。在代码质量方面也有这样的观察:80%的bug集中在20%的模块中,针对这个现象,请思考:

  • 为什么会出现这种bug聚集效应?
  • 这样的20%模块是否具有什么共性特征?

二八定律

首先看一下百度百科怎么说:
二八定律又名80/20定律、帕累托法则(Pareto‘s principle)也叫巴莱特定律、朱伦法则(Juran's Principle)、关键少数法则(Vital Few Rule)、不重要多数法则(Trivial Many Rule)、最省力的法则、不平衡原则等,被广泛应用于社会学及企业管理学等。
二八定律是19世纪末20世纪初意大利经济学家帕累托发现的。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二八定律。
其实从二八定律这么多别称,我们就能看出不少端倪:
  • 二八定律在很多领域都基本成立,具有一定普适性
  • 二八定律反映的是重要问题的分布规律
  • 二八定律如果被运用得当,可以节省不少成本就能获得理想的回报
二八定律告诉我们,重要的部分往往只是少数,如果我们能抓住这个重要的部分——抓住主要矛盾,那么我们的精力、经济、时间投入的收益将会大大提高。重要部分到底是不是整整的20%,其实倒不是关键。

bug中的二八定律

在代码质量方面,人们有这样的观察:80%的bug集中在20%的模块中。
自己辛辛苦苦写了好几千行代码,十好几个文件,一跑测试,bug满天飞,然后自己对着这么一坨自己都不知道谁写的代码一顿骚操作,又一顿骚操作,然后甚至还重写了某个文件,终于修好了这些让人欲罢不能的bug,结果windows资源管理器一看,
 

好嘛,合着大部分文件最后一次修改都是好几天之前了。那么问题来了:

为什么会出现这种bug聚集效应?

私以为,主要可能有这么几个原因:
  • 比较简单的模块不容易写出问题,比如1+1=?这种问题大家想出错都难。
  • IDE给开发者提供了强大的辅助能力,就算是python、javascript这种动态类型的语言,现在的IDE也能在我们coding时提供一定的提示和检查。代码补全功能使得变量尽管很长我们也基本不会拼错,函数调用的参数提示使得参数基本都会写在正确的位置,IDEA甚至提供了get/set方法一键生成、接口/抽象方法一键添加等更加高级的功能。大量工作实际上都是IDE完成的。这大大降低了程序员犯低级错误的空间,这些低级错误显然是不会遵守二八定律的,只要写代码就有机会犯这些错误,而IDE的辅助帮助我们规避了大部分平均分布的错误,那么就导致错误会更加高级。
  • 复用。尤其是OOP编程的时候,OOP的一条哲学就是“避免重复造轮子”,代码复用一方面加快了开发速度,而另一方面也把容易出错的代码集中到了被复用的代码上。
  • “祸不单行”。一个地方出现了bug,往往意味着这一部分在我们构思的时候就出现了问题,没有认真思考好这一部分应该是什么样的,就匆匆撸键盘开搞了,砍柴不磨刀的代价可能就是一顿猛砍啥都没砍断。

这样的20%模块是否具有什么共性特征?

从聚集效应的原因,我们可以反向找出容易出bug的模块具有怎样的特征:
  • 算法复杂的模块。问题本身难度高,开发者就更容易犯错。
  • 造轮子的代码。没有啥参考,没有啥别的轮子可以用,复杂度就上来了,很多细枝末节的部分就容易被忽略。
  • 和其它模块交互频繁而复杂的模块。写这些模块的时候不仅要考虑自己模块本身的业务逻辑,还要熟悉所交互的模块的逻辑。尤其需要与几天前写的/别人写的/没有文档/没有注释/该private的方法也都给public的的模块进行交互的情况下,写本模块的代码的时候所需要考虑的东西就会相当庞杂。东西一多,就有很多地方考虑不到,就容易引发“祸不单行”式的bug,哪哪都是洞,补好一个又漏了另一个。

我们怎样利用这样的性质?

bug的二八定律可以给我们在测试的时候提供很大的帮助:
* 分模块测试,给不同模块以不同的测试强度,给难的模块比较仔细的测试,给简单的模块简单测试,甚至大部分简单模块只需要在整体测试中进行测试即可。
* 整体测试的时候针对易错模块设置测试数据。比如写了很复杂的sin()**2+cos(x)**2化简模块,就添加sin(x)**2+cos(x)**来诱发不正确的化简;写了复杂的提取公因式化简,就添加x*+3*x**2+3*x+1测试一下能否把3*(x+1)**2这种不合法输出给剔除掉(题目要求表达式因子不能有指数)。

最后

开发过程时时刻刻便随着与bug的对抗,研究bug的出现规律,可以帮助我们写出鲁棒性更好的程序。
本人才疏学浅,多多少少有所欠缺。谨以此文抛砖引玉,欢迎dalao们补充!

【OO课下讨论】bug中的“二八定律”的更多相关文章

  1. 【OO第三次课下讨论】农场主的饲料分配问题

    需求分析与项目设计   本思考题的设计需求是力图找到一个简单且可行的饲料分配方案,由于不涉及到饲料价格或者是营养均衡之类的优化问题,因此在假设总的饲料量必能满足所有动物的热量需求的前提下,我们只需要采 ...

  2. OO博客总结——OO落下帷幕

    OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...

  3. 【SEO 决胜网络索引】 课程大纲及第一部分第一课:网络营销战略中的索引

    内容简介 1.课程大纲 2.第一部分第一课: 网络营销战略中的索引 3.第一部分第二课预告: 索引是什么 课程大纲 现在是网络为王的时代,人们越来越离不开互联网: SEO(Search Engine ...

  4. 20175221 MyCP(课下作业,必做)

    MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...

  5. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?

    <JavaScript 深入浅出>系列: JavaScript 深入浅出第 1 课:箭头函数中的 this 究竟是什么鬼? JavaScript 深入浅出第 2 课:函数是一等公民是什么意 ...

  6. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...

  7. 20175221 《Java程序设计》迭代和JDB(课下作业,选做):

    20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...

  8. 20175333曹雅坤MyCP(课下作业,必做)

    MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin ...

  9. ###20175311MyCP(课下作业,必做)

    MyCP(课下作业,必做) 作业题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...

随机推荐

  1. JVM相关 - 深入理解 System.gc()

    本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的 我们经常在面试中询问 System.gc() 究竟会不会立刻触发 Full GC,网上也有很多人给出了答案,但是这些答 ...

  2. CMD(命令提示符)的基本操作(文件夹)

    打开CMD窗口,接下来将介绍如何使用CMD来创建.删除.修改.查看文件夹(目录) ps:以下所有文件夹将统一写成目录 1.1 使用CMD创建空目录(为了更好的演示,本文皆以D盘为当前路径),命令如下: ...

  3. go 在crontab里面运行报错 解决方案

    问题背景 你高高兴兴的写好了一个go脚本,放到你的服务器上,打算定期运行这个脚本,你打开crontab -e, 然后输入: */1 * * * * go run /root/test/main.go ...

  4. 记录core中GRPC长连接导致负载均衡不均衡问题 二,解决长连接问题

    题外话: 1.这几天收到蔚来的面试邀请,但是自己没做准备,并且远程面试,还在上班时间,再加上老东家对我还不错.没想着换工作,导致在自己工位上做算法题不想被人看见,然后非常紧张.估计over了.不过没事 ...

  5. Java程序员必备后台前端框架--Layui【从入门到实战】(一)

    layui入门使用及图标的使用 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] [编程工具:IDEA] 下载Layui与文件分析 下载直接去官网下载即可 文件分析 下载完成后,解压会 ...

  6. 2.2 Python3基础-基本数据类型

    >>返回主目录 源代码 # 基本数据类型 # Number类型:如何查看变量的数据类型? name = 'Portos' print(type(name)) # 结果:str print( ...

  7. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  8. css导航条的设计

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  9. python中对类的方法中参数self的理解

    我们通过下面的代码来对参数self进行理解 #coding:utf-8 2 class washer(): 3 def wash(self): 4 print("洗衣服") 5 p ...

  10. TEB 、TIB、PEB--Vista 32

    TEB struct TEB typedef struct _TEB { NT_TIB NtTib; PVOID EnvironmentPointer; CLIENT_ID ClientId; PVO ...