谈谈对bug的一点想法,说说做好日志记录的重要性
说起程序猿,总绕不开的一个话题就是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的一点想法,说说做好日志记录的重要性的更多相关文章
- Windows系统上release版本程序bug跟踪解决方案(1)-日志记录
使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...
- Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...
- 朋友,请待你的朋友——BUG好一点!
程序猿嘛,难免会被BUG缠身,我相信,没有一个程序猿在被BUG缠身时是感觉轻松的,消灭BUG一定是你最大的愿望.本周,我们团队的项目进入调试阶段,各种BUG层出不穷,眼看下个周就要进行项目答辩会,所以 ...
- 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...
- 从一个bug谈谈psqlodbc游标的一点认识
本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正. 关于该bug的修正代码可以看这里: https://git.postgresql.or ...
- 最近修bug的一点感悟
写在前面话 项目从13年1月份,现场开发,4月中旬,项目开发接近尾声,三个开发,留两个在现场,我被调回公司,5月份现场一同事离职,只有一个同事在开发,结果PM想让这一个同事承担余下的开发和bug工作, ...
- 2017qcon大会的一点想法(安全人才如何不被淘汰?)
2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...
- 关于WEB项目的一点想法
有点失落.迷茫,差点在上班的时候发了火.原因是之前离职的一位同事,在代码里不加注释,而且百般偷懒,致使很多应该的验证没有验证,很多应该考虑到的情况没有考虑.因为是老员工,我相比他来说是新员工.气势上总 ...
- 大三CS狗一点想法
本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...
随机推荐
- TouchSlide 触屏滑动特效插件
TouchSlide 是纯javascript打造的触屏滑动特效插件,面向手机.平板电脑等移动终端,能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. 插件开源.体积小.简单实用.功能强大,是 ...
- React.js 小书 Lesson6 - 使用 JSX 描述 UI 信息
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson6 转载请注明出处,保留原文链接和作者信息. 这一节我们通过一个简单的例子讲解 React.j ...
- HDU 4009——Transfer water——————【最小树形图、不定根】
Transfer water Time Limit:3000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64u Subm ...
- 自定义HandlerMethodArgumentResolver参数解析器和源码分析
在初学springmvc框架时,我就一直有一个疑问,为什么controller方法上竟然可以放这么多的参数,而且都能得到想要的对象,比如HttpServletRequest或HttpServletRe ...
- Hibernate课程 初探一对多映射5-1 课程总结
1 单方一对多 xml one-to-many 配置 实体类 一方添加保存多方集合 2 单方多对一 xml many-to-one 配置 实体类 多方添加保存一方引用 3 常用属性 inver ...
- mybatis批量插入insert时报错
报错信息: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.此 RPC 请求中提供了过多的参数.最多应为2100 错误分析: 由于mybatis拼接的sql语句参数过多导致 解决办法 ...
- PHP中函数的定义与使用
函数是什么? 函数是一个被命名的.独立的代码段,它执行特定的任务,并可能给调用它的程序返回一个值. 函数是被命名的,每个函数都有唯一的名称. 函数是独立的,无需程序其他部分干预,函数便能执行自己的任务 ...
- SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1fa5519] was not registered for synchronization because synchronization is not active
Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1fa5519] w ...
- 学习html5 app项目开发
这周因为部门接了个小的html5 app case,所以从事android开发的我就接下了这个项目.与其说是项目需要,其实更大部分是我自己想要做html5 app,因为我对这个全新的平台已经好奇很久了 ...
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...