说起程序猿,总绕不开的一个话题就是bug,估计每个程序猿听到某某测试跑过来一脸淫笑的告诉你这个功能有个bug的时候,总有种恨不得掐死他的想法。其实程序猿跟bug的关系,感觉有点像父亲和儿子的关系,自己制造的bug,哭着也要自己解决,就像自己生的儿子,哪天又犯了错,就算气得恨铁不成钢,也要教育他帮他改正一样。好了,扯远了,按照一般程序猿的心理,bug再正常不过了,解决就是了。可是你想过,解决bug的时间和人力成本吗?

1、bug从修复到解决的流程

通常情况下,一个bug从发现到解决的流程应该是这几步:

这其中,发现bug的环节不可控,因为我们不知道什么时候会有bug提出来,我们能做的就是发现bug后用最少的时间和人力成本来解决这个bug(都说技术人员的kpi不好衡量,如果做好了形成了团队的规范准则,应该也可以算一个绩效点,因为可以提高工作效率,至于权重多少,需要配合实际数据来分配)。复现bug环节,简单的问题很好复现,可能比较耗成本又最容易忽视的环节应该是复现bug了,至于定位bug,修复bug和测试环节,因为天生自带主角光环,更容易被重视。那么,有没有办法尽可能减少这个环节的时间和人力成本呢?

2、为什么不要去复现bug?

1、bug复现可能概率很小

虽然我们在开发过程中遇到的大部分的bug都是能复现的,但并不能保证所有的bug都能100%复现,而且经常出现这种情况:用户在IE浏览器上浏览某个网站时,发现某个页面是一片空白,多刷新几次,又正常显示了,这种蛋疼的问题,如果偶尔1,2次出现,可能是网络原因,但如果经常出现,而且不同的网络场景,不同的用户都出现了,你还敢说是网络的原因吗?

再举个后台的例子:某天某个集群(3台服务器)中某个重要的服务突然宕机了,接到告警后赶紧先把服务重启了,然后查看了core dump的日志,发现程序中并没有死锁和阻塞的线程,而且JVM的GC日志也是正常的,吊诡的是没过多久,另外2台服务器也相继崩了,于是硬着头皮,把所有可能的原因排查后重新部署,继续运行了几天后,正当你以为这bug已经解决时,突如其来的告警短信又提醒你服务又相继挂掉了,这时候你是不是要奔溃?

这时候我们要帮助用户解决他的疑问,就必然要先复现用户的bug来定位问题,而用户的问题出现的场景,往往依赖于用户的操作系统、浏览器版本,机器上装的第三方软件,网络环境,执行操作的顺序,甚至是用户打开了多个网站和网页导致cookie混淆等等多个因素,可能就因为其中某个被我们忽视的因素的差别,就导致bug不能复现,这时候你是不是很绝望?

2、复现bug有可能成本太高

复现bug的成本,主要分为时间成本和人力成本,你需要模拟环境,mock数据,一步步debug找到问题再修复,这整个流程走下来,可能半天时间就没了,在这过程中,你可能会找用户或者产品经理详细了解他们的操作流程,或者造数据时需要请求dba帮忙导入数据,这里都会产生时间成本和人力成本。

3、为什么做好日志记录?

1、良好的日志规范,能快速有效的定位问题。

做开发最怕的就是线上系统出问题了,轻则留下产品和系统不安全可靠的不好印象,重则影响到公司的收入和口碑。当然了,线上bug总会存在,这很正常,但是我们要做到即使出现了问题,也要能快速定位问题修复,也就是要做到常说的4个9:99.99%,否则年终奖可能要打水漂了。说到打日志,想起了关于程序员写注释的一个悖论:程序员最讨厌自己的代码写注释,也最讨厌别人的代码不写注释。打日志可能觉得很麻烦,但记录一些关键步骤,关键参数,对于快速定位问题进行修复时大有裨益的。

2、日志打印真的很耗性能吗 ?

打日志意味着有磁盘IO,为什么mysql采用B+树而不是红黑树或者AVL树也是这个原因:为了减少IO次数。除非是一些高并发接口,否则这就是伪命题。一般系统日均QPS上万都很不错了,对于大部分公司而言,打日志带来的性能损耗是可以完全忽略不计的。

3、如何做好日志记录?

请参考日志圣经:《阿里JAVA手册之异常日志(异常处理 日志规约》,不再赘述。

后记:说来惭愧,半年没写博客了,曾经自己许下的豪言壮志又食言了,这篇文章从构思到最终成型也是断断续续写了一个月,其中很多原因。自从换了家公司,加班时间至少是上家公司的double time,连周末也成了大小周,累的哟,不过习惯就好,让自己忙起来可以做更多的事情。19年又开始了,计划周末再复盘下过去的一年,并规划下新的一年,人嘛,梦想还是要有的,要不然跟咸鱼有什么区别呢?有想一起交流技术和交朋友的欢迎加我微信:1194426086,希望一起进步。

谈谈对bug的一点想法,说说做好日志记录的重要性的更多相关文章

  1. Windows系统上release版本程序bug跟踪解决方案(1)-日志记录

    使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...

  2. Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法

    原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...

  3. 朋友,请待你的朋友——BUG好一点!

    程序猿嘛,难免会被BUG缠身,我相信,没有一个程序猿在被BUG缠身时是感觉轻松的,消灭BUG一定是你最大的愿望.本周,我们团队的项目进入调试阶段,各种BUG层出不穷,眼看下个周就要进行项目答辩会,所以 ...

  4. 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...

  5. 从一个bug谈谈psqlodbc游标的一点认识

    本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正. 关于该bug的修正代码可以看这里: https://git.postgresql.or ...

  6. 最近修bug的一点感悟

    写在前面话 项目从13年1月份,现场开发,4月中旬,项目开发接近尾声,三个开发,留两个在现场,我被调回公司,5月份现场一同事离职,只有一个同事在开发,结果PM想让这一个同事承担余下的开发和bug工作, ...

  7. 2017qcon大会的一点想法(安全人才如何不被淘汰?)

    2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...

  8. 关于WEB项目的一点想法

    有点失落.迷茫,差点在上班的时候发了火.原因是之前离职的一位同事,在代码里不加注释,而且百般偷懒,致使很多应该的验证没有验证,很多应该考虑到的情况没有考虑.因为是老员工,我相比他来说是新员工.气势上总 ...

  9. 大三CS狗一点想法

    本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...

随机推荐

  1. Kudu和HBase定位的区别

    不多说,直接上干货! Kudu和HBase定位的区别 Kudu 的定位是提供 “ast analytics on fast data” ,也就是在快速更新的数据上进行快速的查询.它定位 OLAP 和少 ...

  2. 我使用的brackets插件

    livereload atom dark theme autoprefixer auto save files on window blur beautify brackets file icons ...

  3. macOS 从睡眠中恢复出来之后没有声音的解决方案

    打开Active Monitor, 找到coreaudiod进程, 将其quit掉即可

  4. js日期格式转化

    如果出现日期格式: /Date(1442742059253)/ 可用下面js方法转化 function ChangeDateFormat(cellval) {        var date = ne ...

  5. 什么是css sprites,如何使用?

    css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片.背景图是否重复.背景图定位),显示图片,减轻服务器对图片的请求数量 优点: 1.减少网页的HTT ...

  6. orientationchange事件

    orientationchange事件 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize':

  7. iOS - The identity used to sign the executable is no longer valid

    ①.首先在xcode中的Build Settings中看有没有设置: ②.账号是不是多个人在用,个人开发者的账号只能绑定一台电脑,当另外一台电脑绑定了话,你的电脑就失效了.你确认下是不是这个原因造成的 ...

  8. 【起航计划 020】2015 起航计划 Android APIDemo的魔鬼步伐 19 App->Dialog Dialog样式

    这个例子的主Activity定义在AlertDialogSamples.java 主要用来介绍类AlertDialog的用法,AlertDialog提供的功能是多样的: 显示消息给用户,并可提供一到三 ...

  9. ecommerce学习

     http://blog.csdn.net/dhx20022889/article/details/8977121 

  10. JS兼用IE8的通过class名获取CSS对象组

    转自:Garon_InE 原生js方法“document.getElementsByClassName”在ie8及其以下浏览器中不能使用,所以写了一个兼容IE的方法. 完整的页面代码如下: testJ ...