说起程序猿,总绕不开的一个话题就是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. http 中的缓存

    如何判断缓存新鲜度 If-Modified-Since告诉服务器, 在服务器中的响应报文中有一个Last-Modified字段, 如果两者一直则表示在浏览器中缓存的文件是最新的, 可以直接使用浏览器缓 ...

  2. POJ 2594 —— Treasure Exploration——————【最小路径覆盖、可重点、floyd传递闭包】

    Treasure Exploration Time Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64 ...

  3. HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】

    Ice_cream’s world II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  4. 记一次无法登录 wine QQ

    入Linux坑第X天,过了五一小长假,回来布置我的环境,本来不应该装一些不必要的东西分自己心,但还是装上,以便不时之需. 把输入法装好后,就安装了QQ,查过资料,都说wine_QQ国际版可以使用,于是 ...

  5. Chrome调式技巧

    1. 使用alert()调试 2.  console 基本输出 console.log("打印字符串"); console.error("我是个错误"); co ...

  6. Spring课程 Spring入门篇 4-2 Spring bean装配(下)之Autowired注解说明1

    课程链接: 1 解析 2 代码演练 1 解析 1.1 @Required注解 该注解适用于bean属性的set方法 1.2 @Autowired 作用: 是为了把依赖的对象,自动的注入到bean里 使 ...

  7. elasticsearch结构化查询过滤语句-----4

    1.之前三节讲述的都是索引结构及内容填充的部分,既然添加了数据那我们的目的无非就是增产改查crudp,我先来讲讲查询-----结构化查询 我们看上图截图两种方式: 1)第一种,在索引index5类型s ...

  8. ActiveMQ实例2--Spring JMS发送消息

    参考文章:http://my.oschina.net/xiaoxishan/blog/381209#OSC_h3_7 一,步骤参照参考文献 二.新建的项目 三.补充 web.xml <?xml ...

  9. select标签使用 三目运算符

    <td> <select id="roleName" name="roleName" class="input" styl ...

  10. [转]QT 4.8 静态库编译方法

    最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向 ...