php程序员写bug,程序员的修炼-我们为什么会编写BUG

在最近的一周,我维护的业务系统出现了很多坏毛病,一周七天crash掉了4次,每次都需要都是因为一点很小的问题,触发了蝴蝶效应,导致整个系统全盘崩溃,于是产生除了叙述本篇的想法,当然这并不是为了掩盖我在Coding上的一些细节处理和职责疏忽,只是为了从根本的细节上去分析这些问题。

(一、)为什么会产生BUG

首先我们需要尝试理解一下什么Bug?

关于bug的解释

bug 是指任何计算机程序或硬件系统中的错误,故障或缺陷。错误会产生意外结果或导致系统意外运行

简单来说:bug就是程序出了问题,产生了意外的结果,没有按照预期的结果去运行。

产生Bug的原因有很多种:

开发者水平太低

不同的编译及运行环境

与需求方沟通不到位

马虎大意、考虑不周

放飞自我,Coding全靠自嗨

选择了错误的或者运行不稳定的第三方库

以上原因总结,主观和客观因素都会影响到Bug的产生,正如误差不可避免一般,我们应该对自己写出的代码进行测试、分析、"沟通".

(二、)如何尽量避免Bug

鉴于以上bug产出的原因,我们可以通过这些一些对策来避免Bug的产生,下面是一些常见原因分析和处理对策。

1.开发者水平太低

在进行系统的构建中,部分开发者可能通常因为开发经验过少,或者语言不熟悉,会编写错误的代码,然后未经过代码测试和审计,便进行提交和上线操作,导致了异常的引发

解决方案:

如果是语法错误,可通过一些ide的代码检测器,或者语法检查来检测代码可否正常运行.

如果是PHP等弱类型语言,可使用静态代码扫描工具来发现程序中明显的语法错误.

编写足够的测试用例,覆盖整个模块的语句

请求你的伙伴进行CodeReview(代码审计),来改善代码的质量和发现代码中的缺陷

2.不同的编译及运行环境

因为业务的拓展和服务支持,需要部署多个不同的运行环境中,如:转账系统,你在测试环境中转账了1000元给用户小明,小明却在生产环境中收到了这1000元,并成功进行提现,往往因为没有环境判断,导致了失误的操作!

解决方案:

1.在代码中多进行注释说明,标明哪些函数会在其他环境中操作和运行

2.加强环境逻辑判断

以下是我在使用的一些标注和说明,其他开发者或我本人再次阅览该代码时,就会得到一个清晰的运行结果.

/**

* 执行该函数时,会根据env环境进行处理,详细如下

* prod(生产环境):会启动队列对视频进行转码、截图、写入到生产数据库中操作.

* staging(预演环境):不会启动队列,但会写入staging数据库中

* test(测试环境):会启动队列对视频进行转码、截图、写入到测试数据库中操作.

*/

$video = $this->uploadVideo($file);

$queue = $this->videoQueue($video);

3.与需求方沟通不到位

这是经常程序员与产品对撕的一个很重要原因,TA想要A,而你却做出了B,于是你们产生了很大的争论

解决方案:

多进行沟通,需求进行反复确认,不要上手就进行编码,先进行分析。

通过PM系统,留存需求规划与变更记录,以便每一次业务更改,都得能与系统中的问题对上号.

4.马虎大意、考虑不周

编码时以为问题很小,修改代码,不走调试与测试流程,直接上线.

解决方案:

不要盲目过于自信,相信自己的主观判断,一定走测试流程,确保改动无误!(这是我之前经常犯的错,然后系统出了问题,我的fix commit从1变成了N....)

CodeReview(代码审计),这是一个最好的办法,当然需要耗费不少的人力,但是能最大的去降低缺陷和错误.

5.放飞自我,Coding全靠自嗨

解决方案:

这类朋友不适合做开发者,适合去做创造者!

6.选择了错误的或者运行不稳定的第三方库

有时候为了省略接入时间,往往会忽略掉一些大型库,因为业务的支持只用到了一小部分,所以我们有时候会去选择一些mini库,最后由于不稳定或方案不成熟,出现错误的运行结果

解决方案:

如果业务级别比较高的话,不建议采用冷门或者无人问津的mini库使用,因为出现问题的损失会更大.

进行反复测试,开发人员对核心代码进行阅览,确保正常无误.

自我组织编写或实现,但是学习和开发成本比较高,小型规模不建议采取.

(三、)多与代码进行"沟通"

“橡皮鸭调试法”是我在阅读《编写可读代码》一书中看到的一个技巧,我在一个人开发的时候会使用这个技巧,我认为是一个不错的选择.

4e5c77c3ac843bf0b74198fa32812152.png

(四、)总结

我们为什么会编写BUG,如果没有BUG?开发和测试不就失业了吗?当然这只是一句玩笑话。

在此引用知乎上一句很有意思的话.

8151e54fcad72a05aa261145e1d996e6.png

编码也亦如此,因为很多主观和客观的因素,导致程序执行了错误的逻辑,产生了不如预期的结果,作为一个合格的开发人员,我们应该尽力确保程序稳妥运行,减少失误和异常。

正如CZG提到的"你写的每一行代码,都是你的名片",我们每个人都义务去维护好这张名片,让其他人对这张名片充满敬畏之心,而不是"what shit code",诸君共勉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强人工智能和弱人工智能

来源:人机与认知实验室人工智能的一个比较流行的定义,也是该领域较早的定义,是由当时麻省理工学院的约翰麦卡锡在1956年的达特矛斯会议上提出的(对此有争议):人工智能就是要让机器的行为看起来就像是人所表…

51Nod - 1183 编辑距离

问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符 解析: 首先定义这样一个函数——edit(i, j),…

张亚勤2020寄语哥伦比亚大学毕业生:引领未知时代

(哥伦比亚大学巴特勒图书馆)2020年5月18日,人工智能和数字视频的世界级科学家和企业家,美国艺术与科学院院士、百度前总裁、清华大学智能科学讲席教授张亚勤博士,在哥伦比亚大学工程学院的毕业典礼上发表了主题演讲。张亚勤说:“面…

oracle跳过undo回滚段启动,[Oracle] 解析在没有备份的情况下undo损坏怎么办

如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的)&#…

String s=hello;s+=world;s变化了吗?原始的String对象的内容变了吗?

分析: String s"hello";s"world"; 引用变量s 一开始指向String对象("hello" :0x001); ("world":0x002); s拼接后,就重新指向String对象("helloworld":0x003); 答:s改变了,原始的String对象 "hello" 内容并没有改变…

科技部部长:基础研究是科技创新“总开关”

来源:中国新闻网中新社北京5月19日电 (记者 孙自法)“基础研究是科技创新的‘总开关’!”言及基础研究在中国科技发展、增强原始创新能力中的地位与作用,中国科学技术部部长王志刚这样概括道。国务院新闻办公室19日下午在北京举行加快建设创新…

php评论获取时间,WordPress函数comment_date获取评论发布时间

重要:本文最后更新于2019-01-10 08:41:31,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗。一般来说任何一条信息发布,发布时间就是它的重要组成部分。当评论者在你的WordPress网站发布评论留言时&…

从通用到专用,5G时代IP核的新故事

来源:半导体行业观察如同芯片在不断迭代,IP核也在不断进步。集成电路技术60年来基本遵循摩尔定律的演进规律。随着进入后摩尔时代,即两年一代技术更换的节奏开始放缓,设计和制造企业开始更加重视产品的多样化发展,而不…

连续信号与系统频域分析的matlab实现,实验十三 连续信号与系统频域分析的MATLB实现...

实验十三 连续信号与系统频域分析的MATLB实现 实验十三 连续信号与系统频域分析的 MATLAB 实现70实验十三 连续信号与系统频域分析的 MATLAB 实现一、实验目的 1. 掌握连续时间信号频谱特性的 MATLAB 分析方法;2.掌握连续系统的频率响应 MATLAB 分析方法方法。二、实…

[机器学习] Apriori算法

适用场合 Apriori算法包含两部分内容:1,发现频繁项集 2,挖掘关联规则。 通俗地解释一下,就是这个意思:1.发现哪些项目常常同时出现 2.挖掘这些常常出现的项目是否存在“如果A那么B”的关系。 举个例子:网店…

华为发布《自动驾驶网络解决方案白皮书》

来源:华为近日,全球分析师大会HAS 2020期间,华为面向全球发布《自动驾驶网络解决方案白皮书》,系统阐述未来网络架构、运维架构和其关键技术,通过网元、网络和云端的三层AI能力协同,使能网络走向极简超宽、…

linux服务器运维操作命令,Windows和Linux系统服务器运维基本操作指令

原标题:Windows和Linux系统服务器运维基本操作指令服务器总归是机械化设备,在运行过程中难免会出现一些问题,遇到这些问题怎么办?请运维人员代维修?即使请也会造成,运维人员维护不及时和成本太高的问题&…

百度大脑城市白皮书

来源 | 百度智能云(转载请注明来源)编辑 | 蒲蒲5月18日,百度智能云在大会上正式发布《百度城市大脑白皮书》。白皮书结合未来我国智慧城市发展重点,深入分析研究了我国智慧城市发展的背景和发展中的机遇,重点阐述了百度…

Python开发基础--- 进程间通信、进程池、协程

进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。 进程队列queue 不同于线程queue,进程queue的生成是用mu…

linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件

一、方案:Linux中使用sed命令或awk命令修改常规配置文件二、步骤:1、假设有一个a.txt,内容如下:#!/bin/bashaabbbccc#ddd2、如果想要把里面的内容bbb23输出成bbb55,可以这样做:sed s/bbb23/bbb55/g a.txt说…

当AI主播和人越来越像,我们该怎么办?

这个视频还原了一个有趣,但又值得思考的事情。当AI主播的声音变得和真人几乎一样,且富有情感,我们的阅读习惯是否会发生翻天覆地的改变?毕竟,相比图文类资讯,“聆听模式”不仅能给用户提供更沉浸式的阅读体…

linux 禁用 内核 驱动程序,Linux设备驱动程序学习----5.模块的初始化和关闭

模块的初始化和关闭1. 初始化函数模块的初始化函数负责注册模块所提供的任何设施,即可以被应用程序访问的新功能,可能是一个完整的驱动程序或者仅仅是一个新的软件抽象。初始化函数的定义通常如下所示:static int __init initialization_func…

python数据分析笔记中panda(2)

1 将手机号码分开为运营商,地区和号码段 1 from pandas import read_csv;2 3 df read_csv("H:\\pythonCode\\4.6\\data.csv");4 5 6 #转换成字符数据 方便用slice7 df[tel] df[tel].astype(str);8 9 #字符的抽取:根据已知列数…

刘忠范院士:新型研发机构建设成了口号

来源:科学网作者 | 郑金武编辑 | 宗华排版 | 华园● 刘忠范认为,如果只是单纯地再建一两所研究机构,在机制、理念上与现有的高校和研究院所没有差别,那就是在“1000”的基础上再加“1”,对现有的科研格局不会带来任何改…

launchMode

launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象&…