码农与程序员区别1——快速定位bug与修复bug
前言
每个程序员的成长总是伴随着各种各样的BUG。在最初阶段的语法bug,到后面逻辑繁杂的业务bug,此类逻辑bug如果有迹可查还好,最怕就是它无迹可查,又极难重现。本文根据作者、作者的狐朋狗友一干人等开发经验,介绍一些bug的快速定位与快速修复。本文主要以PHP为主,因为作者更多的时间还是在与最好的语音打交道。本文每个阶段都将分为三部分,分别是介绍、示例、与解决。
目录
初级语法bug
介绍
初级语法BUG,就是编写代码时候,遇到编译器报错。例如PHP的换行没有加分号,js的无效对象的值得引用。此类的bug是最容易发现并且修复的,毕竟编译器已经将bug出现的原因及行数都送到脸上了,这都不会那就需要加紧学习了。下面介绍一些常见实例。
示例
- 像一般的分号错误,稍微有代码提示的IDE就会进行判断。
经常会出现的类型错误
$t = '1562996654a'; echo date('Y-m-d H:i:s', $t);
这种错误的话,只把错误内容读一遍,不懂英文就将错误内容翻译一下,然后对比着行数,就可以解决了。途中的错误信息是
A non well formed numeric value encountered
,翻译过来就是遇到格式不正确的数值
,所以只需把$t进行一次类型转换或者字符过滤。就可以解决掉该错误。$t = 'aaaaa'; $t = intval($t); if ($t === 0) { throw new Exception("时间戳不允许为0或时间戳类型错误"); } echo date('Y-m-d H:i:s', intval($t));
函数类型错误与函数缺少参数
class Friend { public $name; } function test(Friend $a, $b, $c, $d) { echo $a->name; return $b + $c + $d; } $f = new Friend(); $f->name = 'g'; echo test(null, 1, 'a', '2');
代码中出现的问题有几处,其余几个很普通,有一个需要特别注意的就是
null不是对象类型
,必须函数参数默认可以为空才能使用null
,不然会出现错误。callable
同理,数组下标不存在或对象
class a { } $a = new a(); echo $a->a;
这个类BUG一样的,翻译一下错误内容,找到相应行数,对对象属性或数据下标 用isset
或empty
判断即可。
总结
示例中很多已经解释了。对相应的错误内容与错误行数,进行排查,就可以修复了。
业务BUG
介绍
代码在实际运行中,未出现常见的语法问题,但是却在一连串的业务处理后,没有得到相应的结果。例如订单金额计算,最后少了0.1元;拼团抢购,购买成功人数超过库存;微信jssdk验证失败等等。以上能说出的已经是有部分相应解决方案了,毕竟已经碰到了,还有说不出的,没遇到过的BUG有时候即便最熟悉的业务的程序员,也极为头痛。总结而言,就是程序员秃顶的原因所在。
示例
- 缓存冲突
曾今遇到过一个问题,同一套缓存被另外一个人偷偷使用,导致微信accesstoken与ticket互刷,无法使用微信。找BUG找到头皮发麻,最后发现有人和我一起出现这个问题,才解决。在开发程序时候,尤其共用某些配置,一定要团队一些协约好该类配置。
- 微信jssdk
一般初学者使用微信sdk时候容易遇到的问题。后端取host
与js取host
少一个/
,导致微信校验错误。碰到此类错误,还是多咨询已经经常开发的人为妙。 - 第三方API 请求body解析失败
一般再使用第三方API时候,body主体使用json,然是请求是也使用的json,但是就是请求失败,不通过。这种一定要多查文档,因为json对象与json字符串还有body要求格式关系。 - 拼团,砍价,抽奖等高并发情景超出奖池
这种问题需要对每一条语句进行排序,主要排查对象还是再SQL语句,知晓sql update 何如工作以及合理使用事务
,一般奖池更新,需要查出符合条件奖品进行更新中奖者,但是新手会在查的时候是对的,但是更新时候,未设置更新条件,sql update 也是有 where 条件的
. - 多服务协同处理时候,使用同一个数据库,导致两边事务互锁,一直等待。
首先,多服务使用同一个数据库就已经是BUG
了,已经是设计缺陷了。然后,两边同时开启事务更是问题,需要对病句进行出,必须要事务,既然是同一套数据库,为何不在一起处理。所以服务拆分时候要小心数据库。
总结
业务BUG更多的还是团队沟通与细节,还有经验的不足导致的,更多的情况下,碰见这种问题,不能死钻牛角尖,需要对BUG区域进行逐一排查,一个人思路不清晰,就使用小黄鸭
思路。小黄鸭是什么请自行百度 程序员 小黄鸭
设计BUG
无需多言,要有点自己想法,怼产品就完事。
BUG排查方法
- 普通BUG看编译器就行了
- 一个好的IDE可以省去80%垃圾BUG
- 学会善用xdebug
- 不管如何,日志不怕多,一定要全
- 排查BUG要记住
语言执行顺序
,例如PHP是从上倒下,那么排查也应该是从上倒下,一步一步,根据日志数据,进行合理分析,像类
的话,记住set
与get
还有__construct
等特殊方法。 - 大多数BUG是业务BUG,还是要提前了解业务需求,不要因为自己的想法,与产品的需要的不一致,导致最后设计出错。然后就是一步错,全盘错
- 千万不要过度设计,有时候过度设计,也是bug出现的原因之一
- 排查BUG不能心急。容易秃顶
- 所有BUG理论上不应该重复出现,重复出现就是自身的原因,如果说是一个团队,那么重复出现,其实也是团队的问题。
结论
总的来说,所有的bug更多的还是经验不足,与开发时候考虑不周导致出现的问题。在修复BUG的同时,我们还需要在自己信用的小本本
上记上一笔,防止以后重复出现,毕竟每一个程序员都有一个伟大的梦。
如果说各位有什么自己特殊的技巧与经验,欢迎分享!