码农与程序员区别1——快速定位bug与修复bug

teamvx 2019-11-05

前言

每个程序员的成长总是伴随着各种各样的BUG。在最初阶段的语法bug,到后面逻辑繁杂的业务bug,此类逻辑bug如果有迹可查还好,最怕就是它无迹可查,又极难重现。本文根据作者、作者的狐朋狗友一干人等开发经验,介绍一些bug的快速定位与快速修复。本文主要以PHP为主,因为作者更多的时间还是在与最好的语音打交道。本文每个阶段都将分为三部分,分别是介绍、示例、与解决。

目录

初级语法bug

介绍

初级语法BUG,就是编写代码时候,遇到编译器报错。例如PHP的换行没有加分号,js的无效对象的值得引用。此类的bug是最容易发现并且修复的,毕竟编译器已经将bug出现的原因及行数都送到脸上了,这都不会那就需要加紧学习了。下面介绍一些常见实例。

示例

  1. 像一般的分号错误,稍微有代码提示的IDE就会进行判断。

    码农与程序员区别1——快速定位bug与修复bug

  2. 经常会出现的类型错误

    $t = '1562996654a';
    echo date('Y-m-d H:i:s', $t);

    码农与程序员区别1——快速定位bug与修复bug

    这种错误的话,只把错误内容读一遍,不懂英文就将错误内容翻译一下,然后对比着行数,就可以解决了。途中的错误信息是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));
  3. 函数类型错误与函数缺少参数

    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');

    码农与程序员区别1——快速定位bug与修复bug

    代码中出现的问题有几处,其余几个很普通,有一个需要特别注意的就是null不是对象类型,必须函数参数默认可以为空才能使用null,不然会出现错误。callable同理,

  4. 数组下标不存在或对象

    class a
    {
    
    }
    
    $a = new a();
    echo $a->a;

    码农与程序员区别1——快速定位bug与修复bug
    这个类BUG一样的,翻译一下错误内容,找到相应行数,对对象属性或数据下标 用issetempty判断即可。

总结

示例中很多已经解释了。对相应的错误内容与错误行数,进行排查,就可以修复了。

业务BUG

介绍

代码在实际运行中,未出现常见的语法问题,但是却在一连串的业务处理后,没有得到相应的结果。例如订单金额计算,最后少了0.1元;拼团抢购,购买成功人数超过库存;微信jssdk验证失败等等。以上能说出的已经是有部分相应解决方案了,毕竟已经碰到了,还有说不出的,没遇到过的BUG有时候即便最熟悉的业务的程序员,也极为头痛。总结而言,就是程序员秃顶的原因所在。

示例

  1. 缓存冲突

    曾今遇到过一个问题,同一套缓存被另外一个人偷偷使用,导致微信accesstoken与ticket互刷,无法使用微信。找BUG找到头皮发麻,最后发现有人和我一起出现这个问题,才解决。在开发程序时候,尤其共用某些配置,一定要团队一些协约好该类配置。

  2. 微信jssdk
    一般初学者使用微信sdk时候容易遇到的问题。后端取host与js取host少一个/,导致微信校验错误。碰到此类错误,还是多咨询已经经常开发的人为妙。
  3. 第三方API 请求body解析失败
    一般再使用第三方API时候,body主体使用json,然是请求是也使用的json,但是就是请求失败,不通过。这种一定要多查文档,因为json对象与json字符串还有body要求格式关系。
  4. 拼团,砍价,抽奖等高并发情景超出奖池
    这种问题需要对每一条语句进行排序,主要排查对象还是再SQL语句,知晓sql update 何如工作以及合理使用事务,一般奖池更新,需要查出符合条件奖品进行更新中奖者,但是新手会在查的时候是对的,但是更新时候,未设置更新条件,sql update 也是有 where 条件的.
  5. 多服务协同处理时候,使用同一个数据库,导致两边事务互锁,一直等待。
    首先,多服务使用同一个数据库就已经是BUG了,已经是设计缺陷了。然后,两边同时开启事务更是问题,需要对病句进行出,必须要事务,既然是同一套数据库,为何不在一起处理。所以服务拆分时候要小心数据库。

总结

业务BUG更多的还是团队沟通与细节,还有经验的不足导致的,更多的情况下,碰见这种问题,不能死钻牛角尖,需要对BUG区域进行逐一排查,一个人思路不清晰,就使用小黄鸭思路。小黄鸭是什么请自行百度 程序员 小黄鸭

设计BUG

无需多言,要有点自己想法,怼产品就完事。

BUG排查方法

  1. 普通BUG看编译器就行了
  2. 一个好的IDE可以省去80%垃圾BUG
  3. 学会善用xdebug
  4. 不管如何,日志不怕多,一定要全
  5. 排查BUG要记住 语言执行顺序,例如PHP是从上倒下,那么排查也应该是从上倒下,一步一步,根据日志数据,进行合理分析,像的话,记住setget还有 __construct等特殊方法。
  6. 大多数BUG是业务BUG,还是要提前了解业务需求,不要因为自己的想法,与产品的需要的不一致,导致最后设计出错。然后就是一步错,全盘错
  7. 千万不要过度设计,有时候过度设计,也是bug出现的原因之一
  8. 排查BUG不能心急。容易秃顶
  9. 所有BUG理论上不应该重复出现,重复出现就是自身的原因,如果说是一个团队,那么重复出现,其实也是团队的问题。

结论

总的来说,所有的bug更多的还是经验不足,与开发时候考虑不周导致出现的问题。在修复BUG的同时,我们还需要在自己信用的小本本上记上一笔,防止以后重复出现,毕竟每一个程序员都有一个伟大的梦。
如果说各位有什么自己特殊的技巧与经验,欢迎分享!

相关推荐