• 【OO课下讨论】bug中的“二八定律”


    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们补充!


  • 相关阅读:
    OCP-052考试题库汇总(58)-CUUG内部解答版
    OCP-052考试题库汇总(57)-CUUG内部解答版
    OCP-052考试题库汇总(56)-CUUG内部解答版
    OCP-052考试题库汇总(55)-CUUG内部解答版
    OCP-052考试题库汇总(54)-CUUG内部解答版
    006 加密
    005 自定义Realm
    004 shiro的授权
    003 Shiro的认证
    002 shiro的三个核心API
  • 原文地址:https://www.cnblogs.com/SnowPhoenix/p/12513817.html
Copyright © 2020-2023  润新知