说起程序猿,总绕不开的一个话题就是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. spring DelegatingFilterProxy管理过滤器

    安全过滤器链 Spring Security的web架构是完全基于标准的servlet过滤器的.它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有 ...

  2. 05-spring整合jdbc-jdbc模板对象JdbcTemplate

    1 演示JdbcTemplate模板对象 1 导包 2 准备数据库 3 书写UserDao package www.test.dao; import java.util.List; import ww ...

  3. machine learning 线性回归实战

    matlab 线性回归实战 统一 输入时列向量 输出也是列向量 中间的过程可以出现行向量或者列向量,但是不能影响输入和输出为列向量 参数运算的输入都不会只是一个实数,要么是列向量,要么是一个矩阵 对于 ...

  4. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  5. join() 和 sleep() 区别

    来源于<Java多线程编程核心技术> 一.join() 作用 在很多情况,主线程创建并启动子线程,如果子线程中需要进行大量的耗时计算,主线程往往早于子线程结束.这时,如果主线程想等待子线程 ...

  6. Tomcat实现Session共享

    一个Tomcat中有多一个web应用,然后想共享session,只需在host中加上 <Valve className="org.apache.catalina.authenticat ...

  7. 浅谈windows.onload()与$(document).ready()

    浏览器加载完DOM后,会通过javascript为DOM元素添加事件,在javascript中,通常使用window.onload()方法. 在jquery中,则使用$(document).ready ...

  8. Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  9. 登录mysql数据库出现 : ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ER或者忘记密码

    1.     在安装mysql的文件目录中找到配置文件my.ini  ,然后右击用记事本打开 2.     打开后,搜索mysqld关键字 找到后,在mysqld下面添加skip-grant-tabl ...

  10. IE浏览器在线更新GitHub客户端

    在IE中输入网址:http://github-windows.s3.amazonaws.com/GitHub.application