老程序员解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的通用套路,希望对大家有帮助。

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不是很明显,那么就想办法增加他的破坏性,把现象放大,这在我们的系统压力测试时会经常遇到一种方法。千万别觉得自己的系统就几千日活,就把压力测试压得很低,结果,实际上线时,系统压力过大宕机的情况不在少数,这种问题很多大厂也出现过,还记得有一年抢红包,抢了点不开的事吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java.Bug模式详 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于跨平台语言 的需求 1.2 在快节奏的社会中学习 1.3 bug模式简述 1.4 小结 第2章 Bug、规范和实现方案 2.1 bug的概念 2.2 一体性规范 2.2.1 C++ 2.2.2 Python 2.2.3 ML 2.2.4 Pascal 2.3 规范的好处 2.4 实现方案与规范的差异 2.5 利用素材建立经济有效的规范 2.5.1 通过测试来排除 规范错误 2.5.2 单元测试的缺陷 2.6 小结 第3章 调试和开发过程 3.1 将调试当作科学试验 3.1.1 逐步规范化、整 合并发行软件 3.1.2 在设计上尽可能 保持简单 3.1.3 结对编程 3.1.4 及时的客户反馈 3.1.5 所有开发人员共 享程序代码 3.1.6 对任何可能产生 问题的代码进行测试 3.2 将调试测试程序并入到单元测 试集 3.3 展望:面向测试的语言 3.4 小结 第4章 调试和测试过程 4.1 可测试的设计模式 4.1.1 在模型中而不是 视图中保管代码 4.1.2 使用静态类型检 查发现错误 4.1.3 使用中介器封装 跨越断层线的功能 4.1.4 编写带有简短签 名和默认参数的方法 4.1.5 使用不修改内存 状态的存取器 4.1.6 通过接口定义程 序外组件 4.1.7 优先编写测试程 序 4.2 GlobalModel接口 4.3 小结 第5章 科学的调试方法 5.1 软件是永不磨损的机器 5.1.1 软件有多重 5.1.2 小异常引起大问 题 5.2 Bug模式可以加快诊断bug的速度 5.3 小结 第6章 关于bug模式 6.1 了bug模式的重要性 6.2 选择bug模式的原因 6.3 如何组织bug模式 6.4 Bug诊断的快速参考 第7章 Rogue Tile模式 7.1 Rogue Tile bug模式简述 7.1.1 症状 7.1.2 起因、决方法 和预防措施 7.2 提取代码的其他障碍 7.2.1 通用类型 7.2.2 面向方面的编程 技术 7.3 小结 第8章 随处可见的空指针 8.1 空指针异常不提供任何信息 8.2 难以捉摸的空指针 第9章 Dangling Composite模式 9.1 Dangling Comp osite bug模式简述 9.1.1 症状 9.1.2 起因 9.1.3 决方法和预防 措施 9.2 小结 第10章 Null Flag模式 10.1 Null Flag bug模式简述 10.1.1 症状 10.1.2 起因 10.1.3 决方法和预 防措施 10.2 健壮性和诊断证据的缺乏 10.2.1 在更好的位置 处理异常 10.2.2 处理式代码 10.3 小结 第11章 Double Descent模式 11.1 Double Descent bug模式简述 11.1.1 症状 11.1.2 起因 11.1.3 决方法和预 防措施 11.1.4 快速但不完善 的修正方法 11.1.5 真正的修正方 法 11.2 小结 第12章 Liar View模式 12.1 Liar View bu g模式简述 12.1.1 症状 12.1.2 起因 12.1.3 决方法和预 防措施 12.2 Liars并非仅出现在GUI程序 12.3 小结 第13章 Saboteur Data模式 13.1 Saboteur Data bug模式简述 13.1.1 症状 13.1.2 语法原因 13.1.3 语义原因 13.1.4 决办法和预 防措施 13.2 小结 第14章 Broken Dispatch模 式 14.1 Broken Dispatch bug简述 14.1.1 症状 14.1.2 起因 14.1.3 决方法和预 防措施 14.2 小结 第15章 Impostor Type模式 15.1 Impostor Type bug模式简述 15.1.1 症状 15.1.2 起因 15.1.3 决方法和预 防措施 15.2 混合模式 15.3 小结 第16章 Split Cleaner模式 16.1 Split Cleaner bug模式简述 16.1.1 症状 16.1.2 起因 16.1.3 决方法和预 防措施 16.2 小结 第17章 Fictitious Implementation模式 17.1 Fictitious Implementation bug模式简述 17.1.1 症状 17.1.2 起因 17.1.3 检测Fict.. itious Implementation 17.1.4 决方法和预 防措施 17.2 小结 第18章 Orphaned Thread模 式 18.1 Orphaned Thread bug模式简述 18.1.1 症状 18.1.2 起因 18.1.3 决方法和预 防措施 18.2 Orphaned Thread和GUI 18.3 小结 第19章 Run-on Initializatier模式 19.1 Run-on Initializatier bug模式简述 19.1.1 症状和起因 19.1.2 决方法和预 防措施 19.2 修正bug 19.3 小结 第20章 Platform-Dependent模式 20.1 Platform-Dependent bug模式简述 20.1.1 与供应商相关 的bug 20.1.2 与版本相关的.. bug 20.1.3 与操作系统相 关的bug 20.2 小结 第21章 诊断清单 21.1 基本概念 21.2 模式清单 第22章 用于调试的设计模式 22.1 最大化静态类型检查 22.1.1 尽可能设置final字段 22.1.2 将不可能被改 写的方法设为final 22.1.3 包括作为默认 值的类 22.1.4 利用已检查异 常确保所有客户端程序可处理异常情况 22.1.5 定义新的异常 类型来精确区分各种异常情况 22.1.6 利用特定State类 22.1.7 将类型转换和 instanceof测试降至最少 22.1.8 使用Singleton设计模式帮助最小化instanceof的使用 22.2 将引入bug的可能降至最 低 22.2.1 提取通用代码 22.2.2 尽可能实现纯 功能性方法 22.2.3 在构造函数中 初始化所有字段 22.2.4 出现异常情况 时立即抛出异常 22.2.5 出现错误时立 刻报告错误消息 22.2.6 尽早发现错误 22.2.7 在代码中置入 断言 22.2.8 尽可能在用户 可观察到的状态下测试代码 22.3 征程尚未结束 第23章 参考资料 附录 String-parsing列表构造 函数 术语表 附录页

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值