大家好,我是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 之间的精彩故事给我~

推荐阅读:

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

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

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

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

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

可以试试点击「阅读原文

这么简单的bug,你改了2天?相关推荐

  1. 如何使用Leangoo进行简单的BUG管理

    大家都知道,Leangoo是一款很简洁高可视化的项目管理工具,它的优点就是以看板为核心,功能强大!用Leangoo实现一个简单的bug管理系统,是非常简单的事情! 创建项目看板 首先,我们先创建一个b ...

  2. 关于ssl证书:pem转成crt文件的最简单方法:直接改后缀名!

    关于ssl证书:pem转成crt文件的最简单方法:直接改后缀名! 把 xxx.pem改成xxx.crt

  3. wr720n刷成网络打印_方便实用!教你如何简单把 usb打印机改成无线打印机!

    原标题:方便实用!教你如何简单把 usb打印机改成无线打印机! usb打印机改成无线打印机 只需三大步骤就可以搞定: 第一.硬件准备 首先你需要有一个带USB接口,能刷openwrt的路由器. 小编用 ...

  4. Leader 对我说:「bug 是改不完的」,这几个意思?

    大家好,我是校长. 在知乎上看到一个特别有意思的话题: 很多 leader 向我传授职业经验的时候都说过 "bug 是改不完的",他们是想告诉我什么?我是认同这句话的,但是在我看来 ...

  5. 我在信息学奥赛上,用Bug直接改了验算数据,拿了满分算作弊嘛?

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处. 本文约1700字,建议阅读5分钟 信息学奥赛上用Bug改数据拿了满分! 在线考试,一道题太难做不出来,怎么办,是多少写点还 ...

  6. spring和mybatis结合做简单的增删查改系统_springbootamp;amp;vue简单的景点信息管理系统...

    springboot&&vue简单的景点信息管理系统 这两天闲着没有什么事,就根据陈哥的教程,试着写了一个springboot和vue的简单的景点信息管理系统.也就大致实现了最基本的增 ...

  7. 呵呵,一个bug你改了两天?难吗?

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 来源:网络 我大中国的程序员攻城师们遇到最难调试的b ...

  8. 使用Ajax实现简单的增删查改前端Ajax传的值,后端如何获取

    实现查询和增删改 一.Ajax最基本语法 二.增删查改 1.查询(Get请求) 2.增删改(Post请求) 三.后台(MVC/WebForm) 1.MVC(Post请求) 2.WebForm(Post ...

  9. 分享一些简单的删查改sql语句

    1.一些简单的按时间查询sql select * from 表名 where RKSJ>'2019-04-03'; 查询大于9月7号的数据 select * from 表名 where rksj ...

最新文章

  1. Android React Native 笔记(一):基础
  2. tab选项卡在鼠标经过时实现切换延迟
  3. 农村女人与城市女人的差别
  4. Java面试题:线程实现的两种方式及匿名内部类实现
  5. android source镜像源_【转载】Celadon快速上路指南Part2:编译Celadon镜像
  6. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节4:I/O软件层次结构
  7. 离开载具_迷你世界 自制火箭试飞成功 飞行载具不负众望
  8. laravel获取当前的url以及当前的基础域名方法汇总
  9. jacob 详解 语音_JAVA 实现Jacob语音播报
  10. linux cp 复制目录下文件到另一个目录下
  11. 转录组测序技术及结果解读(一)——测序样品设置及选择
  12. 刘万祥老师讲如何利用条件格式色阶制作数据地图
  13. 人脸识别活体检测sdk 百度 python_Python百度人脸识别SDK的使用
  14. Web前端之响应式 Gulp 中文网
  15. 苹果6严重卡顿_苹果手机iOS系统: 如果开放系统降级通道会怎么样?
  16. context.write
  17. 217公斤小伙不堪重负切胃减肥
  18. 如何给学生选择好的台灯?分享国AA级照度的护眼台灯
  19. 【视频异常检测-论文阅读】Anomaly Detection in Video via Self-Supervised and Multi-Task Learning
  20. 苹果可能在全球开发者大会上发布其AR设备

热门文章

  1. java dateutil 获取时间戳_java DateUtil工具类时间戳类型转换详解
  2. BZOJ.3265.志愿者招募加强版(费用流SPFA)
  3. IntelliJ IDEA代码分屏显示
  4. MVC中提交表单的4种方式
  5. 数据结构——不相交集(并查集)
  6. Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析
  7. AMD and CMD are dead之KMD.js依赖可视化工具发布
  8. Unity中Time.deltaTime的含义及其应用
  9. 从Firefox控制您喜欢的音乐播放器
  10. 全局照明算法基础——从辐射亮度到渲染方程