【OO课下讨论】bug中的“二八定律”
bug中的“二八定律”
有一个经典的经验性原则,叫帕累托原则,也称为二八定律。这个原则在经济、社会和科技等多个领域都有精彩的应用和解释。在代码质量方面也有这样的观察:80%的bug集中在20%的模块中,针对这个现象,请思考:
- 为什么会出现这种bug聚集效应?
- 这样的20%模块是否具有什么共性特征?
二八定律
- 二八定律在很多领域都基本成立,具有一定普适性
- 二八定律反映的是重要问题的分布规律
- 二八定律如果被运用得当,可以节省不少成本就能获得理想的回报
bug中的二八定律
为什么会出现这种bug聚集效应?
- 比较简单的模块不容易写出问题,比如1+1=?这种问题大家想出错都难。
- IDE给开发者提供了强大的辅助能力,就算是python、javascript这种动态类型的语言,现在的IDE也能在我们coding时提供一定的提示和检查。代码补全功能使得变量尽管很长我们也基本不会拼错,函数调用的参数提示使得参数基本都会写在正确的位置,IDEA甚至提供了get/set方法一键生成、接口/抽象方法一键添加等更加高级的功能。大量工作实际上都是IDE完成的。这大大降低了程序员犯低级错误的空间,这些低级错误显然是不会遵守二八定律的,只要写代码就有机会犯这些错误,而IDE的辅助帮助我们规避了大部分平均分布的错误,那么就导致错误会更加高级。
- 复用。尤其是OOP编程的时候,OOP的一条哲学就是“避免重复造轮子”,代码复用一方面加快了开发速度,而另一方面也把容易出错的代码集中到了被复用的代码上。
- “祸不单行”。一个地方出现了bug,往往意味着这一部分在我们构思的时候就出现了问题,没有认真思考好这一部分应该是什么样的,就匆匆撸键盘开搞了,砍柴不磨刀的代价可能就是一顿猛砍啥都没砍断。
这样的20%模块是否具有什么共性特征?
- 算法复杂的模块。问题本身难度高,开发者就更容易犯错。
- 造轮子的代码。没有啥参考,没有啥别的轮子可以用,复杂度就上来了,很多细枝末节的部分就容易被忽略。
- 和其它模块交互频繁而复杂的模块。写这些模块的时候不仅要考虑自己模块本身的业务逻辑,还要熟悉所交互的模块的逻辑。尤其需要与几天前写的/别人写的/没有文档/没有注释/该private的方法也都给public的的模块进行交互的情况下,写本模块的代码的时候所需要考虑的东西就会相当庞杂。东西一多,就有很多地方考虑不到,就容易引发“祸不单行”式的bug,哪哪都是洞,补好一个又漏了另一个。
我们怎样利用这样的性质?
最后
【OO课下讨论】bug中的“二八定律”的更多相关文章
- 【OO第三次课下讨论】农场主的饲料分配问题
需求分析与项目设计 本思考题的设计需求是力图找到一个简单且可行的饲料分配方案,由于不涉及到饲料价格或者是营养均衡之类的优化问题,因此在假设总的饲料量必能满足所有动物的热量需求的前提下,我们只需要采 ...
- OO博客总结——OO落下帷幕
OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...
- 【SEO 决胜网络索引】 课程大纲及第一部分第一课:网络营销战略中的索引
内容简介 1.课程大纲 2.第一部分第一课: 网络营销战略中的索引 3.第一部分第二课预告: 索引是什么 课程大纲 现在是网络为王的时代,人们越来越离不开互联网: SEO(Search Engine ...
- 20175221 MyCP(课下作业,必做)
MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...
- JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
<JavaScript 深入浅出>系列: JavaScript 深入浅出第 1 课:箭头函数中的 this 究竟是什么鬼? JavaScript 深入浅出第 2 课:函数是一等公民是什么意 ...
- alibaba druid 在springboot start autoconfig 下的bug
alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...
- 20175221 《Java程序设计》迭代和JDB(课下作业,选做):
20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...
- 20175333曹雅坤MyCP(课下作业,必做)
MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin ...
- ###20175311MyCP(课下作业,必做)
MyCP(课下作业,必做) 作业题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
随机推荐
- Vuex入门、同步异步存取值进阶版
关注公众号查看原文: 1. vueX介&绍安装 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...
- vue3使用路由
下载 npm install vue-router@4 配置路由 暴露出一个createRouter方法,用来创建路由对象 通过defineAsyncComponent方法来实现路由的懒加载(文章1. ...
- 破败之王杀人戒bug原理剖析(从底层存储来解释)
今儿看到了破败之王的bug,一级团杀了人变成了对面,然后送塔,戒指就变成了很夸张的层数. 视频如下: https://www.bilibili.com/video/BV1yr4y1A7Mo 一开始我也 ...
- Chrome OS超便捷安装指南
Chrome OS是一款Google开发的基于PC的操作系统. Google Chrome OS是一款基于Linux的开源操作系统.Google在自己的官方博客表示,初期,这一操作系统将定位于上网本. ...
- TensorFlow学习(2)
TensorFlow学习(2) 一.jupyter notebook的安装和使用 1. 什么是jupyter notebook jupyter notebook(http://jupyter.org/ ...
- POJ_2253 Frogger 【最短路变形】
一.题目 Frogger 二.分析 题意关键点就是那个青蛙距离.就是所有1到2的点的路径中,每条路径都可以确定一个最大值,这个最大值就是青蛙要跳的青蛙距离,然后要求这个青蛙距离最小值. 其实就是最短路 ...
- Java并发编程之并发关键字
volatile 保证可见性 一个线程修改volatile变量的值时,该变量的新值会立即刷新到主内存中,这个新值对其他线程来说是立即可见的 一个线程读取volatile变量的值时,该变量在本地内存中缓 ...
- Baolu Aggregate TPS Report
1.说明 这是一个基于JMeter官方的Aggregate Report的监听器改进而来的监听器!!! 2.插件背景 早在很久之前,宝路就曾经改造过JMeter的Aggregate Report 的源 ...
- 在docker容器中使用cplex-python37
技术背景 线性规划是常见的问题求解形式,可以直接跟实际问题进行对接,包括目标函数的建模和各种约束条件的限制等,最后对参数进行各种变更,以找到满足约束条件情况下可以达到的最优解.Cplex是一个由IBM ...
- 【linux】驱动-6-总线-设备-驱动
目录 前言 6. 总线-设备-驱动 6.1 概念 6.2 工作原理 6.3 总线 6.3.1 总线介绍 6.3.2 注册总线 6.4 设备 6.4.1 设备介绍 6.4.2 设备注册.注销 6.5 驱 ...