最近一周,我维护的业务系统出现了很多不好的问题。每周7天死机4次,每次都因为一个小问题需要用到。蝴蝶效应被触发,导致整个系统崩溃,于是萌生了描述这篇文章的想法。当然,这并不是要掩盖我在Coding工作中的一些细节和疏忽,而是要从根本的细节上分析这些问题。(1.)为什么会出现BUG?首先,我们需要尝试了解什么是错误?Bug的解释Bug是指任何计算机程序或硬件系统中的错误、故障或缺陷。错误会产生意想不到的结果或导致系统意外运行。简单地说:错误是程序出现问题,产生意想不到的结果,不能按预期工作。产生bug的原因有很多:开发人员水平太低,不同的编译和运行环境不到位,与需求方的沟通不到位,草率、粗心、自我放纵。coding靠的是自信,选择了错误的或者不稳定的第三方库中总结了以上原因。主观因素和客观因素都会影响bug的发生。正如错误是不可避免的,我们应该测试、分析和“交流”我们编写的代码。(2.)如何尽可能避免错误。针对以上bug输出的原因,我们可以通过这些对策来避免bug的发生,下面是一些常见的原因分析和对策。1、开发人员水平太低。在系统搭建过程中,一些开发者经常会因为开发经验太少或者不熟悉语言而写错代码,未经代码测试和审核就提交上线,导致引发异常。解决方法:如果是语法错误,可以使用一些ide代码检测器或者语法检查来检测代码是否可以正常运行。如果是PHP等弱类型语言,可以使用静态代码扫描工具来查找程序中明显的语法错误。编写足够多的测试用例来覆盖整个模块的语句,并要求您的合作伙伴进行CodeReview(代码审计)以提高代码的质量并发现代码中的缺陷。2.不同的编译和运行环境由于业务的扩展和服务支持,需要部署多个不同的运行环境。比如在转账系统中,你在测试环境中给用户小明转了1000元,而在生产环境中小明收到了这1000元并成功提现。往往因为没有环境判断,导致误操作!解决方法:1、在代码中多做注释,说明哪些函数会在其他环境下运行运行2、加强环境逻辑判断。下面是我正在使用的一些注解和说明,当其他开发者或者我自己再次阅读代码时,他们会得到一个清晰的运行结果。/***执行该函数时,会根据env环境进行处理,具体如下*prod(生产环境):Yes启动队列进行转码、截图、写入视频到生产数据库。*staging(预览环境):队列不会启动,但会写入staging数据库*test(测试环境):队列会启动处理视频转码,截图,写入测试数据库。*/$video=$this->uploadVideo($file);$queue=$this->videoQueue($video);3、与需方的沟通不到位。这是程序员和产品经常撕裂的一个很重要的原因。TA想要A,你却做出了B,所以你们大吵一架。先写代码,再分析。通过PM系统,做好需求规划和变更记录,让每一次业务变更都能够匹配系统中的问题。4.草率、考虑不周的编码,认为问题很小,修改代码,不调试直接用测试过程上线。解决办法:不要盲目自信,相信自己的主观判断,通过测试过程确保修改无误!(这是我以前经常犯的错误,后来系统出了问题,我的fixcommitFrom1toN...)CodeReview(代码审计),这是最好的方法。当然,这需要大量的人力,但可以最大限度地减少缺陷和错误。5.放飞自我,Coding完成自助解决方案:没有这样的朋友不适合开发者,适合创作者!6、选择了错误或不稳定的第三方库。有时为了节省查阅时间,往往会忽略一些大型图书馆。库,因为只用到一小部分业务支持,所以我们有时会选择一些mini库,最后由于不稳定或者解决方案不成熟,出现错误的运行结果。解决方案:如果业务水平比较高,不建议使用冷门或者冷门的迷你库,因为出了问题损失会更大。反复测试,开发人员阅读核心代码,确保正常无误。自组织编写或实现,但学习和开发成本比较高,小规模不推荐。(3.)与代码更多的“交流”《橡皮鸭调试法》是我在《编写可读代码》这本书上看到的一个技巧,我自己开发的时候也会用到这个技巧,我觉得是个不错的选择。(4.)总结一下我们为什么写BUG,如果没有BUG呢?开发和测试不会失业吗?当然这只是个玩笑。这里引用知乎上一段很有意思的话。编码也是如此。由于很多主观和客观因素,程序执行了错误的逻辑,产生了不符合预期的结果。作为一名合格的开发人员,我们应该尽最大努力保证程序稳定运行,减少错误和异常。正如CZG提到的“你写的每一行代码都是你的名片”,我们每个人都有义务维护这张名片,让别人对这张名片产生敬畏之心,而不是“什么狗屁代码”,让我们鼓励每一个人其他!
