为什么程序一定有bug,系统出现bug( 五 )


再复杂点的bug就是程序员拿高薪的根本了,只可意会,不可言传~
仅仅靠搜索引擎、其他网站那必然无法解决大量问题,因为很多问题是跟业务逻辑相关的,是没有直接答案的 。比如 游戏 开发有个界面一直无法显示,这个问题就不是百度可以解决的 。问题需要调试分析,这和破案非常像,但在开发过程中更有利的是问题有机会可以重现 。破案是逆向工程,需要反推 。解决代码问题不仅仅可以反推,也可以通过阅读代码正向分析 。下面说说如何debug一个业务逻辑问题 。回到刚刚的例子 , 有个界面一直出不来,我们如何快速去定位:
1.思考这个问题发生的可能性 。比如 游戏 内大量界面都是正常的,那么可以对比正常界面代码和异常界面代码的区别,这是对比法 。
2.假设创建正常界面和这个异常界面的逻辑代码是一样的,那么问题就落到了这两个界面内部 , 继续在内部重复上面的对比法进行判断 , 直到锁定最终位置 。
上面说的方法基本上可以杜绝卡在一个简单问题上,这是摆脱新手的一个过程 。选择使用对比法或者其他方法的前提都是基于观察和对项目的认识,所以,搜集“案发现场”是最关键的 。
其他的问题,不属于逻辑的,像其他网友说的那样,有些通过到github、stackoverflow等地方解决的 。这些问题也不是直接就去查找的,它通常也有个分析过程 。比如你使用了一个库,但是目前它不支持你的模块 。对于新手,就是直接百度或者google了 。实际上这样的问题也是有“案发现场”的 。对于作者提供的api接口的统一性和便捷程度去推断作者在相关支持模块的位置以及命名以及拓展 , 再尝试在文件夹中搜索 。如果都找不到 , 再去Google上获取更多的信息 。重复推断、分析,决定如何拓展或者绕过 。
综合上面的几种问题,可以看到的是都离不开对现场的观察和推理分析 。这种能力也被称为经验 。但是一般情况下你看不到它们这个分析过程,你能做的就是在实际环境中反复逼迫自己去思考 , 去训练 。这个推理的培养,不仅仅是对事情 , 也是对人 。
我在入行 游戏 开发的前期 , 也是类似的情况 。卡在不同种类的问题上,有些在简单逻辑,有些在别人的代码支持上 。后面解决的问题多了 , 就会发现里面共通的思维方式 。常用的一些方法如下:
1.对比法,比较正常与异常代码区别
2.二分查找法 。分段注释找问题,也会用在很多方面 。比如最近版本突然出了一个奇怪bug , 可以通过svn还原来定位 。这个还原不是一个一个版本还原,而是用二分法去还原 。
3.增加信息 。在怀疑的位置或者过程添加日志或者打断点辅助自己更好的推理 。
4.相似推理 。比如一个引擎在api、性能使用程度上都非常友好 , 那么它在别的地方也有可能相对表现比较好 。这时候如果有个功能我们的实现需要很复杂才能完成,那么就有可能是我们用错了 。相似推理不一定都能正确,但会提供一些帮助 。
以上 。