修改BUG心得

2023-11-03

 

 一、

1、写第一版时就杜绝这些的发生。

2、思维要开阔,

3、修改BUG,写代码的人都很厉害,不管是写界面还是底层。不要以人做的模块的难易来断定人。

 

 

二、

今天让项目经理找到些bug,但都是无关紧要的,最主要是因为在作页面的时候,业务逻辑不是很清晰,需求描述的不好,所以我自己做起来也有麻烦,当然,不是我没错,只是以后我做项目经理,对以后自己下属的要求,就一定要到位,不然bug太多也是头疼的事。

还有件事,我们在做项目的时候,没有字典,规定什么的,开发起来没有统一的向导。我觉得在性能要求不是非常苛刻的情况下,有很多比如是否啊,表示状态的一些数据库中的数据最好就直接用中文来表示,因为最近改的bug中,很多都是应该显示  '否'的都显示成了 ‘0’,直接就从数据库中读取出来。

做程序员最讨厌的就是修改,因为可能页面做完的时间太久,很多都不记得了。如果要是叶面比较复杂,那程序员就更头晕。所以,如果看叶面逻辑实现比较复杂的画,以后肯定要修改的,那就最好在cs文件下面写上些对这叶面的注释。

今天遇到的bug中,有个页面布局问题,就是想控件距离左边几个位置,后来领导告诉我,直接切换成中文的全角,记住是全角的中文,然后空格,这样html中就能显示出空格,而不要使用 

在 js中,没有trim这方法,今天找到一个,共享:

function trim()
  {
      return this.replace(/(^/s*)|(/s*$)/g, ""); 
  }

trim(): 功能除去字符串开头和末尾的空格或其他字符。

 

在项目中,是有些统一规范,比如表格的字段,如果是定长,就是居中,不定长居左,钱 居右、、、、、

 

 

 

三、

 

一.前言


我发现很多程序员都在改bug,总在改bug。但是很多人没有思考过什么是修改bug的正确方法,如何高效率的修改bug,如何避免改了一个bug又被测出另外一个bug(我称为连环bug);还有就是,为什么我们的系统越做越不稳定了,bug越改越多了。
我总结了一下经验和大家分享。(本人一直在做windows平台下C++系统的工作,文章对C++更有针对性)

作为一个程序员,少不了要修改bug,甚至每天都要修改bug。也许你在维护一个老系统,也许你的专职就是修改bug或者你自己写的代码总是被测试人员测出问题,bug总是伴随在程序员的身边。

有的人对修改bug有抵触情绪,说:这么烂的系统,还不如重写了,要是我来写代码,哪里会有这些烂bug。
有的人麻木了,说:反正bug改不完,干一天算一天
还有的人轻蔑的说:有bug,就改呗,哪有软件没bug的,立马动手改


修改bug是一件非常能锻炼人的工作,一般不需要一个团队去修改一个具体的bug,所以修改bug更能提现一个人的综合能力。希望这个系列的文章能对那些天天和bug做伴的朋友有一些帮助。


二.bug的定义和分类


站在能改掉bug的角度上,我对bug做了如下分类:

我把bug分为三大类:

1.逻辑错误(有出现,不能重现)

只要是有出现的bug,不管是功能错误,内存错误的crash等,基本都是逻辑错误。那些不能轻易再现的错误都属于这一类。
要想正真改掉一个bug,请你重现它。不论用什么手段,重现它。否则,你不能对比验证你在之后修改的结果。不能验证修改的结果,你敢说你一定改对了吗。
这个系列的文章一个基本前提就是:bug一定能重现。
至于如何重现一个诡异的bug,我在以后其他系列的文章专门写点东西。

2.逻辑错误(有出现,能重现)

a.明确原因:

bug拿到手,就非常清晰的理解上下文逻辑,知道需要在哪里做什么样的修改;正确估计所做的修改对他相关模块、逻辑的影响(做到这点不容易)。
或者bug非常简单,比如:笔误、字符串拼写错误,界面图片对齐等。

b.不明原因:

这种bug的修改也是我在后面文章要大书特书的。
不明确bug产生的真正原因,只知道一个判断或者调用就有bug了,或者误解了bug产生的原因。看图中误改的箭头,这种情况下做的修改是工作效率低下的主要因素,连环bug也是这么诞生的。
一个不明确产生bug正真原因的修改,会造成无法预计的风险(看箭头)。
知道导致bug的表面调用,但是不理解代码上下文,对于直接修改表面调用造成的其他隐患没有正确估计的bug,也属于不明原因的bug。
一个只对bug表面调用逻辑做修改,不思考所有相关逻辑的行为,是要付出沉重代价的。
修改bug是非常简单的,但是明确一个bug的原因有时是很难的。

c.内存错误导致的逻辑错误:

内存错误是C++老生常谈的问题了:泄露,越界等。
由于A处的内存错误导致,即使本来正确的B处逻辑,也会出现异常状态。(有些新手可能不太理解这句话,有什么问题就问吧)
特别是那些检测不出来的内存错误:B处逻辑被你改穿了,A处还是有越界,等B处逻辑被你保护死了,又发现C处逻辑又坏了,多么可怕啊。严重影响工作效率。
内存错误的难点在于,如何认识到你手头的这个逻辑错误是由一个毫不相关的内存错误导致的。
后面的文章我会谈到怎么修改内存错误。

3.泄漏和越界,资源释放问题

a.能检测出内存错误:

有些泄露用IDE能检测出来,还可以借助boundschecker等工具。这些问题,在调试过程中就能体现。

b.不能检测出内存错误:

C++的数组越界。除非你用STL或者Boost库的数组来写代码。
C风格的数组的性格,我们改变不了。
一句话,C++是给明白人用的。
不明白的人拿起你的vc,建一个Dialog工程,定义一个成员int m_test[16];在构造函数写m_test[16] = 1;跑跑看吧。


三.修改bug的前提


再次强调,一定要重现bug,无论是谁反馈的,你要能亲眼见到bug
有些特例:比如,前方做实施半夜1点电话你,说:重大事故啦,快改下什么什么的类型,不然人家数据要全没啦,你快改!!有经验的人,第一时间会利用vpn或者其他方式连到现场,亲眼看看。实在看不到现场的,除非你非常明确前方人员表达的意思;除非你对代码熟悉的能背诵了,早就预料到会有这一天,那你敢改就改吧

2009-03-14
--------------------------------------------------(未完待续,下篇:bug的修改流程)----------------------------------------

欢迎大家访问我的博客,我会在博客中连载。

四、

上篇中我对bug做了3大分类:能重现的逻辑错误,不能重现的逻辑错误和潜在的内存错误。

 

这篇文章是我总结关于逻辑错误的修改流程,也算是后面文章的一个总领。


流程如图:

 

1 重现

 

再次强调这个是修改bug的前提。

 

2 明确事发点

 

就是明确导致一个bug产生最直接的一个调用或者一个判断。
明确了事发点后有两种情况,就是上图中的分支。
有些bug,在明确了事发点后就立刻知道原因了,这个大家都有体会;有些就不是这么简单了。
定位事发点的方法下篇文章有详细介绍。

 

3 整理代码

 

有些事发点逻辑错综复杂,一点注释也没有,也没有文档,或者代码风格很差。整理下代码,能减缩进就减点,太长的函数分割一下。。。就是为了提高阅读性。

因人而异,如果你觉得你的阅读能力超强,不整理也无所谓。
但是千万不要自作聪明的就开始做点“保护”,这个步骤不要让逻辑受一点影响。

 

4 分析原因

 

具体情况具体分析。这个步骤有时候是最难的,但是一定要明确原因。不明原因或者误解原因bug的修改后果是有极大风险的。
可参考《如何修改bug(一)-bug的分类和定义》。

 

5 确定方案

 

可行性、所做修改对其他模块和逻辑的影响需要周密思考、测试和验证。有些方案看上去很好,正真做进去了才发现时间白花了。在解决一些关于性能方面问题的时候往往会发生拿错方案的惨案
有时候方案很多,都可行,难以抉择,那就具体情况具体分析了。

 

6 修改代码

这一步,是所有步骤中最简单的,就是码字。

 

7 验证

程序员保证自己工作效率和质量的关键步骤。你不想总被别人测出问题吧,或者你也不想问题最多的模块总是你在改的吧。

 

小结

 

bug千奇百怪,不是每个bug都需要经历所有流程的。每个步骤都有它的难点。
有些bug难在事发点的定位,比如多线程,异步逻辑中的bug;
有些bug难在原因很难分析,多数是你看不懂代码;
有些bug难在你不敢改,那是你的修改方案没有做好充分的分析。
。。。
其实会者不难,后面我会细细道来,和大家一起分享。


2009-03-18
--------------------------------------------------(未完待续,下篇:明确事发点)----------------------------------------

 

 

 

 

 

 



 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改BUG心得 的相关文章

  • 谈谈To B业务的难点

    最近有个说法 中国互联网的新增长点是 To B业务 而一个经常被提及的事实是 中美互联网巨头对比 在To C业务上的收益和市值近乎并驾齐驱 虽有差距 但至少是可以相提并论的 而在To B业务上 美国巨头的市场规模 比起中国的同类公司 高两个
  • STM32CubeMX之emWin移植

    前面两章介绍了SDRAM和LTDC的使用 本篇文章将介绍emWin移植到STM32 硬件环境 STM32F429IGT6 软件环境 STM32CubeMX v5 5 0 HAL库版本 STM32CubeF4 Firmware Package
  • 什么叫泛型?有什么作用?

    作者 Java3y 链接 https www zhihu com question 272185241 answer 366129174 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 一 什么是泛型 Jav
  • MySQL的B+树索引和hash索引的区别

    简述一下索引 索引是数据库表中一列或多列的值进行排序的一种数据结构 索引分为聚集索引和非聚集索引 聚集索引查询类似书的目录 快速定位查找的数据 非聚集索引查询一般需要再次回表查询一次 如果不使用索引就会进行全表扫描 还有可以进行多字段组成联
  • svn历史版本操作说明

    svn历史操作简写说明 操作的字母缩写为R 一般我们常见的操作为 A D M R A add 新增 C conflict 冲突 D delete 删除 M modify 本地已经修改 G modify and merGed 本地文件修改并且
  • centos安装gcc时出现问题:Delta RPMs disabled because /usr/bin/applydeltarpm not installed.

    解决办法 此问题安装Deltarpm包 增量 RPM 套件 即可解决 当然您也可以先使用一下命令 查看是哪个包提供applydeltarpm yum provides applydeltarpm yum install deltarpm y
  • 我见过的最糟糕代码

    作者 Mehdi Zed 在本文 将向读者展示一些作者见过的一些最糟糕的代码 除非你希望被同事和用户讨厌 否则这些 魔鬼 永远都不应该被放到人间 我们会发现 通过一些好的实践 其实很容易避免它们 01 魔鬼代码 需要改进的代码与所谓的 魔鬼
  • 2023年Node.js全网详细下载安装的最新教程

    文章目录 1 文章引言 2 下载安装 3 检查是否安装成功 4 补充说明 1 文章引言 今天准备写下载和安装vue js的博文 但安装vue js的前提是要安装node和npm 我们在安装node js时 会自动安装的npm包管理器 接下来
  • [深度学习]Part2 数据清洗和特征工程Ch06——【DeepBlue学习笔记】

    本文仅供学习使用 数据清洗和特征工程Ch06 1 特征工程 1 1 特征工程介绍 1 2 特征预处理 1 2 1 数据清洗 1 2 1 1 数据清洗 预处理 1 2 1 2 数据清洗 格式内容错误数据清洗 1 2 1 3 数据清洗 逻辑错误
  • linux kernel development 3rd

    很早就听说这本书了 但是一直未看 现在稍微看看 第3章 1 vfork与fork不一样 但是也没多大作用 不看也罢 2 进程pcb task struct保存在process kernel栈的底端 而而thread info在栈顶端 不知具
  • C语言.表白神器.爱你之心之闪耀

    前言 爱你之心之闪耀 这个名字比较沙雕哈哈哈 爱你之心之闪耀 前言 爱心函数的选取 爱心函数1 爱心函数2 简单爱心 粒子发射原理 爱心结构 一些宏 初始化 init 创建若干爱心并初始化 setHeart 展示爱心 showHeart 爱
  • Vue3的使用

    1 安装命令步骤 vue create 命令 接下来我们创建 runoob vue3 app 项目 vue create runoob vue3 app 执行以上命令会出现安装选项界面 Vue CLI v4 4 6 Please pick
  • 解决升级JDK后:找不到sun.misc.Unsafe的类文件

    原因 JDK9以后已经将sun misc Unsafe弃用 同时改进了lib文件的存储方式 将sun misc Unsafe全部存储在了jdk unsupported里面 解决 手动添加弃用的类文件 在编译时 携带参数 add module
  • 运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数

    运维Shell脚本小试牛刀 一 运维Shell脚本小试牛刀 二 运维Shell脚本小试牛刀 三 cd dirname 0 pwd 命令详解 运维Shell脚本小试牛刀 四 多层嵌套if elif elif else fi 蜗牛杨哥的博客 C
  • react 字段拼接

    Array from columns el index1 gt
  • 正确解决:坑爹的0xc000007b

    1 出现0xc000007b 应用程序无法正常启动 其根本原因是缺乏所需要的DLL 提供了错误版本的dll相当于没有DLL 提示完全一样 2 网上有人说缺乏dx运行环境 如果属实 也是因为缺乏dx相关的dll 所以根本原因 在低一点 3 与
  • PyCharm运行Python代码时出现“未找到模块”错误

    PyCharm运行Python代码时出现 未找到模块 错误 在PyCharm中执行Python脚本时 有时会出现 ModuleNotFoundError No module named XXXX 错误 这种错误是因为在项目中没有安装对应的

随机推荐

  • C++求vector中的最大值

    习惯了Python的编程以后 再回过头来写C 感觉头都被搞大了 Python是一门高级语言 而C 是一门偏底层的语言 所以Python一行解决的问题用C 也许需要好几行 比如在一个列表中找最大值的问题 如果是Python的话 那么代码大概是
  • (二十八)业绩归因之Brinson模型

    单期Brinson模型 一个时期的基金收益可以分为四个部分 资产配置收益 个股选择收益 交互收益和基准组合收益 先构建4个概念性的组合 Q1 Q4 基准收益组合和实际投资组合 Q2 积极资产配置组合 这表示基金经理能自主选择资产配置的比例
  • 定时器中断控制LED状态实验

    一 STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器 PSC 驱动的 16 位自动装载计数 CNT 构成 STM32 的通用定时器可以被用于 测量输入信号的脉冲长度 输入捕获 或者产生输出波 输出比较和 PW
  • C++虚函数详解

    C 虚函数详解 前言 C 的特性使得我们可以使用函数继承的方法快速实现开发 而为了满足多态与泛型编程这一性质 C 允许用户使用虚函数 virtual function 来完成 运行时决议 这一操作 这与一般的 编译时决定 有着本质的区别 虚
  • 毕业设计-基于 MATLAB 的医学超声图像处理仿真平台设计与研究

    目录 前言 课题背景和意义 实现技术思路 一 平台的总体设计 二 医学超声图像处理仿真平台算法概述及 GUI 实现 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设
  • 管理的核心是什么?这里有一套科学、高效的团队管理法则

    员工就该牢牢约束才能管好 对于员工的管理尺度令许多管理者头大 管紧了 容易让员工产生反叛心理 甚至导致人员的流失 管的松了 员工好像又不怎么用心工作 其实在这里 很多管理者经常有一个误区就是 管理就是控制和约束 但实际上有效的管理是对员工的
  • MES系统最全介绍来了

    制造型企业在生产过程中 或多或少都会遇到以下生产问题 1 生产现场管理混乱 造成人力资源和物流的浪费 2 生产进度不透明 给业务和跟单带来诸多不便 3 不能及时了解产品不良率 质量控制难度大 4 仓储管理不规范 造成材料积压过多 物料查找麻
  • VMware Workstation 16 在此主机上不支持嵌套虚拟化 修复方法

    一 准备工作 已安装 VMware Workstation 16 Pro 以上版本 操作系统为 Windows 10 以上版本 设备已联网 并能访问到 VMware 官方服务器 二 操作步骤 1 升级 VMware Workstation
  • 想拿 20k 无压力?Android开发必读的一篇文章!

    程序员分很多种类和等级 如果要提高达到20k的概率 有两个条件如果满足的话 则很容易达到 1 一线城市 北上广深杭 2 互联网行业 如果你非得抬杠 我要在三线城市 做外包要赚20k的话 很难 我自己也做不到 所以 如果你要做程序员的话 必须
  • [Spring Boot]02 使用IDEA快速构建Spring Boot工程

    新建 Spring Initializr 项目 选择 Spring Initializr 如下图选择SDK和URL 点击NEXT 填写项目信息Group和Artifact 什么是Group和Artifact Group 是项目组织的唯一标识
  • MySQL高级篇_第18章_主从复制

    1 主从复制概述 1 1 如何提升数据库并发能力 在实际工作中 我们常常将 Redis 作为缓存与 MySQL 配合来使用 当有请求的时候 首先会从缓存中进行查找 如果存在就直接取出 如果不存在再访问数据库 这样就提升了读取的效率 也减少了
  • [vulnerhub] easy_cloudav write up

    摘要 0x1 靶机 192 168 88 13 靶机下载地址 https download vulnhub com boredhackerblog easy cloudantivirus ova 攻击机 192 168 88 8 每周六都会
  • Unity3D 移动物体方式总结

    简述 在Unity 3D中很多时候我们会想要移动一个物体到别的位置 如让想人物跑动起来 或者想要移动相机来跟随人物 有很多种方法可以改变物体的坐标 实现移动的目的 移动的本质是在每一帧中修改物体的position 在这里把之前使用过的移动物
  • python项目开发中首先要学习的几个知识点

    python项目开发中首先要学习的几个知识点 1 知识点 python中的推荐命名规范 python项目的推荐目录结构 python中 init py的作用 python中在不同文件夹 同一个文件夹两种情况下如何引用另一个 py文件 pyt
  • U-Net实现医学图像分割(pytorch)

    刚开始学习pytorch框架时候 在github上下载过大佬的图像分割代码来训练自己数据集 但是却经常报错 后面在kaggle上下载了一个比较简洁易理解的分割代码 又根据自己的需求进行了修改评价指标 网络框架搭建以及可视化功能编写 本文的主
  • 如何将LaTeX公式拷贝到Word中

    LaTeX可以方便地用来编辑公式 但是它的排版需要编译以后才能看到 Word就在公式编辑上着实让人觉得麻烦 但是Word可以及时显示你所编辑的内容 本文介绍一种方法来帮助你将LaTeX源码直接在Word中转化为公式 方法 有两种方法可供选择
  • Scikit-learn之支持向量机

    Scikit learn之支持向量机 1 支持向量机简介 2 SVM在sklearn中的实现 2 1 实现目标 2 2 实现步骤 2 3 线性核函数 2 4 多项式核函数 2 5 高斯核函数 2 6 总结 1 支持向量机简介 SVM 支持向
  • TCP三次握手和四次挥手以及11种状态

    1 三次握手 置位概念 根据TCP的包头字段 存在3个重要的标识ACK SYN FIN ACK 表示验证字段 SYN 位数置1 表示建立TCP连接 FIN 位数置1 表示断开TCP连接 三次握手过程说明 1 由客户端发送建立TCP连接的请求
  • 一个案例讲解 CSS 布局两个注意点

    这篇文章回顾一下 CSS 基础布局中两个注意点 有如下布局 例如我们想给 main wrapper 内部添加上下边距 让 content 不至于紧贴盒子边缘 一种可能的方案 给 content 设置 margin 我们添加了上下各 50px
  • 修改BUG心得

    一 1 写第一版时就杜绝这些的发生 2 思维要开阔 3 修改BUG 写代码的人都很厉害 不管是写界面还是底层 不要以人做的模块的难易来断定人 二 今天让项目经理找到些bug 但都是无关紧要的 最主要是因为在作页面的时候 业务逻辑不是很清晰