大型互联网公司资深开发者解Bug的通用套路
程序员在很多人的印象里是一份严(ku)谨(bi)的职业,也是一个被搞怪吐槽乐此不疲的职业,程序员们面对复杂的代码敲打电脑时连眉头都不会皱一下,但是有一个词却是他们痛苦的根源,它就是Bug。
记得刚毕业入行时,我们老大派给我和另外一个新来同事的第一件事就是修Bug,要不是在学校敲过几年代码,还真不知道如何下手!和我一起进公司的另外一个同事完全就是以“看戏者”的身份,看我搞了3个月,直到我们转正。实际上,很多时候,让一个新人去调Bug,真的是劳财伤命,浪费时间。尤其是一些大型系统的复杂性Bug,让一个新人去搞定,很多时候,这无异于在开一个大玩笑!这种决定往往取得的结果不是加快了项目的进度,反而会让这些年轻人备受打击,有时甚至会让新人们对人生产生怀疑。这绝对不是一个老程序解决Bug的套路。有人可能要反驳,我不能让他借助调Bug,了解下系统不行吗?对于有这种想法的,我只能说,你太高估别人了,你让一个有2,3年开发经验的人,去熟悉一个大型系统也不是件轻松的事情。若非天赋很高,那么很可能导致我们的新人,在进入公司后的实习期,处于缓慢进步甚至进步停滞的状态,天天盯着开发计划表里的Bug,丈二和尚摸不着头脑,不知所措,这种状态不管对公司还是个人发展都不利。鄙人认为合理的方式是,给新人把整个系统的结构粗讲一遍,再给分配一些简单的模块去开发比较好。
当然我们处理bug不光是为了自己,很多时候是因为被测试和领导盯着:
不同人对bug的反映
当程序员找 Bug 的时候
程序员调 Bug 的感觉,就是这样的一波未平,一波又起
叫新手程序员帮忙改 Bug
牛 X 程序员和 Bug 之间的 PK
开发人员在演示中如何隐藏 Bug
千万不要当程序员面说有bug
对于新手程序员而言,在复杂代码中找BUG是一个难点。下面我们总结下老从程序员解Bug的通用套路,希望对大家有帮助。
如果需要Java工程化、高性能及分布式、微服务、Spring,MyBatis,Netty源码分析资料的朋友可以加Java进阶群:591240817 群里有阿里大牛直播讲解技术,以及大型互联网公司架构技术的视频免费分享给大家。
1.IDE调试
根据项目特点和语言特点选择一个最合适的IDE,由于本人是做C++出身,最喜欢用的莫过于Visual Studio 了,这款微软开发的IDE,自从研发出来,就被称为宇宙第一编译器,能编译调试C/C++、C#、F#、Python、JavaScript、Qt、iOS等多种语言的开发。目前的VS2017还原生支持远程跨平台的软件开发,这无疑给我们常年奋战在linux/Unix黑匣子开发环境,使用G++调试的C/C++程序猿们带来了福音。
2.重构大法。
如果你发现无论如何也找不到BUG,而且代码只是复杂,本身不是很长,直接重写代码吧!重构大法是解决爆炸性bug的绝招。
3.printf大法
大家都说printf大法(也称cout大法)好,我也这么觉得!把需要验证的参数打印出来,不仅直观,而且方便调试。
4.日志大法
日志大法,法力无边。一个成熟的系统少不了日志模块,懂得和善于使用日志大法调bug的同学,恭喜你,你已经步入中级程序员的行列。
5.小黄鸭调试法
小黄鸭不懂程序,所以我们可以向他解释每一行程序的作用,以此来激发灵感。
6.二分定位法
把程序逻辑一点点注释掉,看看还会不会出问题,类似二分查找的方法,逐步缩小问题范围。
7.模拟现场法
模拟现场,有时候我会问自己,如果我要实现bug描述的现象我要怎么写代码才行?比如:我遇到一个死锁问题,但是检查代码发现所有的锁都是配对的,没有忘记解锁的地方,而且锁很简单就是一个普通的临界段, 保护几行赋值语句而已。这样的代码怎么写才能让他死锁呢?我想如果让我故意制造这样一个现象,只有在上锁的时候强制杀掉线程了。既然这样就可以去看看有谁 强杀线程了没有。
8.制作调试工具
此方法在很多大厂比较常见,一个是快速迭代的要求,一个是大厂的通用框架比较成熟,当然工具的适用性比较强。
9.优先解决可重现的bug
可重现的bug,优先解决,多调试测试几次,把容易解决的bug先解决掉,亦可以减少bug数量,也可以减少干扰。
10.放大现象。
有些bug不是很明显,那么就想办法增加他的破坏性,把现象放大,这在我们的系统压力测试时会经常遇到一种方法。千万别觉得自己的系统就几千日活,就把压力测试压得很低,结果,实际上线时,系统压力过大宕机的情况不在少数,这种问题很多大厂也出现过,还记得有一年抢红包,抢了点不开的事吗?