程序员的修炼我们为什么会编写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库使用,因为出现问题的损失会更大.进行反复测试,开发人员对核心代码进行阅览,确保正常无误.自我组织编写或实现,但是学习和开发成本比较高,小型规模不建议采取.(三、)多与代码进行"沟通"“橡皮鸭调试法”是我在阅读《编写可读代码》一书中看到的一个技巧,我在一个人开发的时候会使用这个技巧,我认为是一个不错的选择. (四、)总结我们为什么会编写BUG,如果没有BUG?开发和测试不就失业了吗?当然这只是一句玩笑话。在此引用知乎上一句很有意思的话. 编码也亦如此,因为很多主观和客观的因素,导致程序执行了错误的逻辑,产生了不如预期的结果,作为一个合格的开发人员,我们应该尽力确保程序稳妥运行,减少失误和异常。 正如CZG提到的"你写的每一行代码,都是你的名片",我们每个人都义务去维护好这张名片,让其他人对这张名片充满敬畏之心,而不是"what shit code",诸君共勉!

August 19, 2019 · 1 min · jiezi

如果在我学编程时有人告诉我这些该多好【译】

趁着元旦休假+春节,尝试把2018年期间让我受益的一些文章、问答,翻译一下。欢迎指正、讨论,希望对你也有所帮助。原文链接:Things I Wish Someone Had Told Me When I Was Learning How to Code说明:这一篇最没有干货学习编程前,思考下你想要用代码编写什么要知道,如何编写代码主要是关于如何构建事物,了解你的最终目标会让学习路径更将清晰。如果你的目标只是“学习编程”,而不清楚最终程序的种类,以及它们如何让生活更美好,那你可能会觉得过程充满沮丧。我有点惭愧地承认,我学习计算机科学的动机之一是想证明自己很聪明,希望能够获得聪明人才能从事的工作。我也喜欢数学和理论(这本书曾在我敏感的年龄引起了我的注意),编程与之不谋而合。不过,在我找到将技术与我真正喜爱的事物(比如音乐和文学)联系起来的方法之前,这种状态维持不了多久。那么,你学习写代码是为了编写什么?网站?游戏? iPhone应用程序?成立一个创业公司一夜暴富?交互很牛的软件?还是希望能够给领导留下深刻印象,亦或用脚本跑一些繁琐的任务,这样你就能忙里偷闲看水獭图片了(译者注:不是很懂这个趣味)?也许你只是希望更有竞争力,在简历中能写上会编程,或者学习编程只是你的一项自我教育的计划。所有这些都是值得的目标,不过你要找到属于自己的那一个,研究明白。编程并不神秘其实编程跟其他技能没啥区别。就像学英语,先学词汇和语法。也有点像数学,特定函数解决特定问题。还有点像各种工艺和制作技术,随着技艺的发展,针对不同场景和任务开发出不同的技术、工具,也总结出不同情况下的最佳实践,随你选用。这家伙(非常聪明,我很喜欢看他的文章)觉得,在编程领域,真正的程序员和其他人之间有一条明显的边界线,边界线区分出了两拨人的编程智慧。这条线就包括指针和递归。我在学校学到的指针和递归知识,当我学会它们的时候,仿佛颅内高潮了——正是这种智力上的愉悦感,让我想要深入学习计算机科学。但是,在课堂之外,需要学习新概念才能完成项目的机会越来越少,帮人越来越多地完成有意思的项目,可后来几乎都学不到新的概念了。没有必要怀疑自己是否足够聪明。当然,项目越复杂,需要的水平也越高,但这些在其他领域也一样。除非写代码成为你的本职工作,否则你也不必把递归理解的很透彻才能完成项目开发。第一次运行不起来很正常第二次、第三次可能还是跑不起来第一次学习编程,你很可能遇到这样的情况:认为自己已经正确地写好了配置,也检查再三,但是代码仍然运行错误。你也不知道从哪入手修复,错误信息(能有错误信息就算幸运了)也显示“去你的吧”。很可能在你就在这放弃了,因为你认为自己不是这块料。我深有同感,在我第一次编译运行C++代码的时候,我得到的错误信息是“segmentation fault”。其实这种经历对所有水平的程序员都很常见,甚至跟你的智力水平、编码经验都没啥关系。作为初学者或者老手都会遇到这种情况。主要的区别是,你要如何应对这种情况。我发现,编程新手和有经验的程序员的最大区别是信念:相信程序出错时出于逻辑错误,是有迹可循的;相信bug可以被解决,相信总会有途径解决眼下的问题。相信让代码正常运行的方法虽然暂时没找到,但耐心钻研,肯定能让程序跑起来。总有人会说你这样做不对花括号另起一行,花括号不要另起一行。用tab缩进,不要用tab缩进。你应该使用存储过程,不过实际上存储过程没啥用。你应该写注释,好代码不需要注释。这些互斥的建议会一直伴随着你。问题总是存在多解的,没有唯一正确的方法。很多程序员喜欢推广他们的个人偏好,但是选择并不唯一。大家一直告诉我我是错的,而我一直试图弄清楚错在哪,这让我早期职业生涯感到压力的一个方面。团队协作过程更是免不了有人反对你的编码方式。有时候反对你的人是对的,你要深入了解,看看为什么对,为什么错。有的时候呢,你才是对的,反对意见只是想挑起一个毫无意义的争论,那就直接忘掉它,按着编码规范该怎么写怎么写。也总有人会说你不是真正的程序员HTML不是真正的代码。如果你不用vi,那算啥写代码。真正的程序员都会写C,没人做Windows开发。有些东西你永远不会,你不应该干这个。你不是真正的程序员。编码这件事对不同人而言意味着不同的东西,相比过去,现在也发生了很多变化。而且很有意思的一点是,越来越成熟的工具、框架和开源代码,让新手和老手都更容易开发项目。使用这些工具和框架会被认为不是“真正的程序员”。这背后的阴谋是因为如果大家都称自己是程序员,那程序员这个称号就变得没意义了。这种自设门槛的行为害处颇大。放手去使用简单的工具开发项目吧。基于Stencyl或者GameMaker开发游戏没啥不妥,第一次编程是写HTML和Excel宏也没问题的。坚持该坚持的事情并不会有坏处。随着你越写越顺手,自然会发现更好用的工具。而且,大多数时候很少有人看你的具体实现,也不知道你用了哪些组件和工具。别让极客头衔阻碍你再读一遍前一段内容吧。我曾经非常担心自己被认为不是”真正的极客“,尤其是在学校,会担心我的着装、我的立场或者自己的读物和选择的软件不够极客。行胜于言关于如何学习编程的文章很多。你可以通过书本、交互式学习或者调试其他人的代码来学习概念。而且,你也有很多编程语言来选择哪个开始学习。市面上有很多自学编程的课程或者论坛。这些学习过程之后最常见的抱怨就是你可以快速地学习完初学者的知识,然后学习曲线突然就变得陡峭了。之后想要取得进步,变得非常困难。你知道如何写输出文本的代码,但不知道怎么开始写一个真正有用的项目。也可能会觉得自己学得比较僵硬,没有真正领会精髓,责备学习材料不够好。当你进入这个阶段,市面上大多数的教程和资料都没用了,因为那些材料面对的受众是非常初级的初学者。你当前的困惑是”不知道自己还不知道什么“,不知道自己接下来改如何更进一步。我想说的是,无论你按照哪个教程学编程,你都会碰到学习曲线变陡这堵墙。唯一的解决办法就是坚持不懈。你要学习更多的知识,尝试更多新鲜事物,逐步解决如何构建有用的项目。如果你都知道为什么学习编程,那你一定会找到接下来进步的路。梅花香自苦寒来,宝剑锋从磨砺出。我之前强调的信念,在这个阶段就会派上用场。保持耐心,坚持不懈,最终会找到答案。

January 17, 2019 · 1 min · jiezi