这么简单的bug,你改了2天?

大家好,我是Z哥。

“这个 bug 的问题不是很明显吗?怎么这么久才搞定?”

“就改一行代码,你怎么弄了这么久?”

我想上面的言语几乎每个程序员都听到过。特别是面对那些“稍懂技术”的同事的时候。

我觉得这篇文章特别适合你收藏一下,为什么呢。首先,当你再次遇到这种情况的时候,翻开这篇文章,可以帮助你降降火,让你冷静下来。其次,还能时不时地在朋友圈转发给你的“稍懂技术”的同事看看,给他一些暗示,哈哈。

很多人之所以会产生前面提到的这种误区,是因为他们潜意识里将工作量与代码量挂钩了。

他们脑海里的程序员像电视电影的中的那些黑客那样,palapala 地敲击键盘,疯狂地 coding,看上去都不带思考的,然后软件就写成了。

我们程序员当然清楚,事情并不是这样。不管是实现一个新功能还是修复一个线上 bug ,我们都不可能直接上手 coding,因为我们不知道代码应该写在哪,怎么写。

/01  实际修 bug 的过程是怎样的/

就以修复 bug 为例,常规的处理流程是这样的。

  1. 确定 bug 相关的环境信息。

  2. 梳理 bug 所在的整条业务链路。

  3. 分析 bug 在链路中的哪个环节产生。

  4. 调整代码,修复问题。

其中的每一个环节都存在着增加时间的因素,我们来一个个展开。

/02  每个环节影响时长的因素/

01  确定 bug 相关的环境信息

在这个环节最常见的情况是,反馈 bug 的人员无法清楚地描述 bug 所处的环境,甚至是描述出现错误(比如参杂了自己的主观猜测,屏蔽了一些重要信息)。

这会导致程序员排查 bug 的时候,方向就错了,被误导了。一旦方向错了,不管花再多时间,都是白白浪费掉的。

虽然说一线的业务人员,不懂技术是常态,但是不可否认的是,这的确会对修复 bug 的时间产生很大影响。

02  梳理 bug 所在的整条业务链路

如果恰好这条业务链路我很熟悉,甚至是实现业务逻辑的代码都是我写的。那么这里花费的时间就少得多。但是如果不是的话,我还需要花时间去梳理业务,然后找到业务对应的代码在哪些地方,它们之间是如何组成、协调的。

这里可能存在的大坑是,这块代码不但我不熟悉,并且前人写的代码过于草率。此时,在几百万、上千万行代码的项目中,找到相关的几千行代码,并且捋清楚它们之间的关系,这可是个大工程,并不比把这个功能重新推翻重做容易。

03  分析 bug 在链路中的哪个环节产生

大多数人应该都听过斯坦门茨在福特生产线上画一条线收了 1 万美元的故事。他给福特开出的收据是:画线 1 美元,知道画在哪 9999 美元。

解决 bug 也是这样过,分析 bug 产生的根本原因才是最困难的过程。

而且很多时候,一个 bug 所表现出来的现象与问题根源并没有直接关系。

比如,提交订单提示库存不足。其实并不是库存不足,而是请求库存 api 出现了异常,甚至是由于下游的库存 api 内部异常导致。这种层层依赖随着业务链路的延伸会变得更加复杂,这自然需要大量的时间去抽丝剥茧。

还有更夸张的情况是,完全没有关系。比如,提示 XXX 失败,实际却是 YYY 的问题,因为这个提示语句是从其他代码里 copy 过来的……(有遇到过这种情况的来评论区确认过眼神一下)

04  调整代码,修复问题

条条大路通罗马,一个问题往往也有很多种解决方案。修复得快不代表修复得好,找到最简单、最优雅的解决方案是需要经过思考的。

哪怕是看似在确定的地方去修改代码,如果你运气不好,碰巧要修改的 function 对外有 100 多个引用,而且你还需要改动传入的参数……

此时,你得祈祷不会遇到那种牵一发而动全身情况,细品一下下面这张图你就懂了。

就算运气不错,修改的地方很容易搞定,但是如果在这个过程中发现了一些写得有问题的代码,比如容错性差、性能差等情况。此时,作为有责任心的程序员,必须得出手去改掉啊。否则根据「墨菲定律」,后面还是得出问题,到时候如果自己还在负责这个项目的话,解决成本就更大了。

而且,有更多责任心的程序员,还会举一反三,去将自己知道存在同类问题隐患的代码都去改掉。这也需要更多的时间。

05  修复完后

作为有责任心的程序员,并且出于对自己的口碑负责,肯定不会将结果的验证完全交由测试人员来做。

所以,自己还得多花一些时间来验证,自认为容易出现问题的场景下是否还会出现问题。这,也需要时间。

/03  提高修复bug效率的方法/

当然,上面这些理由也不是我们懒于提高修复 bug 效率的借口,对于如何更高效地 Debug ,包括应对生产环境的 bug ,可以看看我之前的老文。

《系统坏了,慌不慌》

《如何提高Debug效率》

如果你想未雨绸缪,外加条件允许的话,建议把单元测试也做起来。

《聊聊单元测试》

好了,总结一下。

这篇呢,Z哥和你聊了为什么很多时候修复 bug 没有想象中的那么快。

因为在以下 4 个环节都存在着额外花费时间的事情。

  1. 确定 bug 相关的环境信息。

  2. 梳理 bug 所在的整条业务链路。

  3. 分析 bug 在链路中的哪个环节产生。

  4. 调整代码,修复问题。

所以,如果以后谁还说你为什么修 bug 那么慢,把这篇文章发给他。你说不出口的话,我替你说了。不过,后果自负哦~

其实大家都不喜欢修 bug ,特别是在低质量的代码中反复修复同一类型的 bug 。但是现实中,好像也有不少的人嘴上说着这样,但自己却总是在写这些低质量的代码?欢迎分享你与 bug 之间的精彩故事给我~

推荐阅读:

  • 我是如何保持长期写作的

  • 被同事嘲笑说技术方案没深度?

原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)

也可以分享我的公众号名片给有需要的朋友们。

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

android最好的3d游戏机,终极盘点:Android必玩十大超猛3D游戏

2010年即将过去,今年是Android平台的发展非常迅猛的一年,系统版本从2.1、2.2一路飙升至2.3,各种手机与平板设备也层出不穷。与此相对的当然就是应用软件的大爆发,根据AndroLib在本周二所公布的数字,Android Market目前…

要学习数据科学知识,这些信息需要知道(数据)

数据科学知识,分享数据干货,追逐科技前沿等方面另外,其他领域的学术进展,资讯以及合适的招聘要获取这些相关的信息,我们觉得这些平台非常的出色,推荐给大家。iNatureID:Plant_ihuman▲ 长按二维…

Csharp实例:武汉智能安检闸机数据接收和解析

项目介绍:本实例主要是接收安检闸机的数据解析并显示到界面上,只做功能实现,不做界面美化硬件:闸机一个、网线一根、电脑主机开发环境:vs2017 系统:win10涵盖知识点:tcp通讯、文件写入、多线程&…

墨迹天气android,墨迹天气Android产品分析

墨迹天气官网宣传图一、产品概况1、产品简介墨迹天气是一款免费天气预报工具,提供日出日落信息,六小时天气预报2、主要竞品天气通、最美天气、91黄历天气、知趣天气、懒人天气、琥珀天气二、体验环境手机:华为A199操作系统:Androi…

可编程的智能小车,100种玩法,让孩子玩出理科编程思维

▲数据汪特别推荐点击上图进入玩酷屋毫无疑问,数学、科学和计算机科学是解决21世纪现代问题的三大支柱。当现在各式各样的兴趣班和教育辅导班快要呈现饱和状态时,一种新兴的教育活动正如火如荼地进行着那就是少儿编程。少儿编程奇迹般的红火,…

我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。 首先来看看MediaPlayer的生命周期&#xff…

AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

AgileConfig 当初是设计给我自己用的一个工具,所以只设置了一道管理员密码,没有用户的概念。但是很多同学在使用过后都提出了需要多用户支持的建议。整个团队或者整个公司都使用同一个密码来管理非常的不方便。今天 AgileConfig 1.3.0 版本终于支持了多用…

每日一笑 | 马冬梅当上了百度投资董事???

全世界只有3.14 % 的人关注了数据与算法之美马东什么?(图片来源于网络,侵权删)

批处理解决局域网共享打印机问题

随着公司规模的扩大,人员流动性也越来越大。特别是业务这块,隔三差五的就来几个业务人员,一入职各种后勤工作都要给他们安排好。网络这块除了基本的网线,电话要通以外。最最后面的当然就是打印机的共享了。 先说说公司的网络环境。…

.NET MAUI 预览版 6 发布

原文:bit.ly/2SKad9g作者:.NET Blog - David译者:精致码农 - 王亮当我们还在从微软 Build 大会和 .NET 6 预览版 4 中缓过来的时候,我们在这里就开始分享我们在 .NET 6 预览版 5 中对 .NET 多平台应用程序开发框架(.NET MAUI)的持…

德国布线牛到不行?今天带你看看咱们中国的!

全世界只有3.14 % 的人关注了数据与算法之美相信不少人都有看过德国的布线,那整齐的感觉让人舒服。这是由BuzzFeed网站刊登的照片,从图片可以看出,德国工程师严谨的态度却是表现的淋漓尽致,让人大饱眼福,简直就是洁癖症…

Java进阶02 异常处理

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 程序很难做到完美,不免有各种各样的异常。比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足。…

每日一笑 | 对不起,我还没下班...

全世界只有3.14 % 的人关注了数据与算法之美(图片来源于网络,侵权删)

差异分析定位Ring 3保护模块

差异分析定位Ring 3保护模块 由于保护模块通常会Hook操作系统的原生DLL接口来进行保护,所以可以采用差异比较原生DLL文件和加载到内存中的原生DLL直接的差别来定位Ring 3模块。 在分析的过程中,为了防止被Ring 3保护模块发现,暂时可以先把除了…

html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...

JQuery UI Autocomplete(自动补全)功能在input前端设计中非常有用,最近一个项目正好用到,仔细研究了下组合框(combobox)的自动补全部分,官方地址是:https://jqueryui.com/autocomplete/#combobox。官方的功能需要一个额外下拉按钮…

Magicodes.IE 2.5.4.2发布

Magicode.IE,导入导出通用库,支持Dto导入导出、模板导出、花式导出以及动态导出,支持Excel、Csv、Word、Pdf和Html。Github:https://github.com/dotnetcore/Magicodes.IE码云(手动同步,不维护)&…

耗时6年的DK博物科普巨著,全面提升孩子的认知高度

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦,特别感谢这些年一直以来大家对我们的支持,才让我们越做越好。(点我参与送礼活动)小木每次带侄子去郊游时,侄子总是会不断地提问,“这是…

android fragmentstatepageradapter框架,安卓爬坑指南之FragmentStatePagerAdapter

一次开发中,用到了viewpager嵌套viewpager,结果就踩到了这么一个坑。先上图:image.png图片中显示的界面布局和遇到的问题是这样的:首页发现版块是一个fragment,这个fragment中放了一个viewpager,这个viewpa…

每日一笑 | 一个男人逐渐变心的过程

全世界只有3.14 % 的人关注了数据与算法之美(图片来源于网络,侵权删)

html 表格 左侧表头,左侧是表头的JS表格控件(自写,网上没有的)

今天,项目中要用到该表格,找了一遍,发现没有合适的,于是自己动手丰衣足食。最终呈现效果如上图,1、左侧是表头的表格数据展现,2、支持多行,多表头3、固定表头的功能4、能够支持标题5、获取表格中…