当前位置: 首页 > news >正文

Bug剖析

Bug剖析

• 所有的Bug报告有以下的基本要求:
• 标题。要简略。
• 指派。谁来处理这个问题。
• 重现步骤。问题再次出现的相关步骤。
• 优先级别。问题的紧迫性与重要性。
• 严重程度。问题所产生的后果。
• 解决方案。怎么解决问题。
其他很多方面对修复问题及明白其深层次原因也很有帮助,但以上基本准则简练得多。下面我们来对每条准则逐一展开讨论,消除这些疑惑。

标题及指派

标题应该简明扼要,一句话就详尽说明问题的唯一性,使Bug报告的检索及标识变得简单。“点击取消按钮,屏幕就清空了”是个差劲的标题。“关闭编辑框,清空屏幕”就是个很好的标题。后者简短得多,而且对问题的出处及发生时间提供了具体的信息。
当你要创建一份新的Bug报告时,你必须指定具体人选来解决其中问题。但是,即使你这个团队的每个人都很了解,你也不应该将一个Bug指定给其中某一位,除非你是开发团队的一员。相反,你应该将此任务交给这整个团队。通常的做法是在Bug报告中指定责任方或团队作为默认选择。默认的选择通常是“主导”或“会诊”团队。不会再有更好的了。要相信这些团队,他们会知道问题由谁来解决。
作者注:有些团队希望将所有Bug都指派给团队中的某些个人,这样可保证没有Bug被遗漏。但是,他们还是必须确认将Bug指派给“主导”或“会诊”团队以确保Bug未被遗漏。毕竟,团队外部人员并不知道软件还有其他什么功能。
作为惯例,所有Bug必须指派给能对其进行经常性检查的个人或团队。因为,大多数优先团队会每天开例会,我还是偏好将Bug指定给“主导”或“会诊”团队为默认选择。

重现步骤

没什么比一份Bug报告没有清晰的重现步骤更让人郁闷了。就像你的亲友对你说:“你知道该怎么办!”,没有给你更多解释。这让我很茫然,不知道怎么办。悲催了。
Bug重现步骤应是言简意赅——一言中的。同时要包含软件创建编号(通常是单独列出的),你的工作环境(操作系统版本、所用浏览器及其他相关的细节)以及一些先备条件(像先注册个Xboxcom金牌账号等)。
有时你不能确定Bug是怎么发生的,因为它有时是间歇性的或跟某种特定的状态相关。这种情况下,列出创建编号、运行环境及配置等信息,接着描述下当时的情况,以说明具体的Bug重现步骤无法确定。

注:我们有些内部工具,如Watson与Autobug,它们可以自动生成Bug报告。诚然,用这些工具生成Bug重现步骤有其局限性,但是它们通常仍可以提供些堆栈跟踪信息、创建编号、环境及其他相关的信息,且它们对隔离问题有帮助。

在简洁的Bug重现描述后,你必须指出什么是你希望发生的(“期望”),及事实发生了什么(“事实”)。所有的重现步骤包括这三方面——配置、期望结果及实际结果。这样当别人在看这份Bug报告时就知道到底哪里出错了及怎么重现它。
通常一张图、一段视频顶上千句文字,有很多工具可以对屏幕进行图片及视频抓取。将这些文件附到Bug报告中,这些文件就是一份能妥善修复Bug的报告与含糊不清的报告之间的区别。
作者注:如果一个问题可以用4个步骤讲清楚而你在Bug报告里却用了15个步骤,这是让人相当恼火的。不仅仅是因为4步很简单,容易理解,而且这样可以使开发者及测试者快速找到Bug。重现Bug用的时间越少,在确认Bug的原因上所花时间也越少(可能出现Bug的步骤少了),同样在确认Bug已被修复上所用的时间也越少。

优先级别

对于优先级别意义的讨论一直没完没了,这种级别的范围值通常为0~3。说实在的,你可以把时间更好地用到其他地方去。这里还是说些简单的准则,以此为基础阐明优先级别。
• 优先级别一旦设定则不宜再改,除非Bug本身角色变换了。如果级别1意味着:“在目前的冲刺阶段或里程碑期间修复”,级别2意味着:“到下一个冲刺阶段或里程碑期间再修复,”那么在每个冲刺结束时,你必须更新Bug的优先级别,这样不仅很浪费时间,而且改变了Bug的“最后一次变更时间”,这会丧失很多重要信息。
• 优先级别必须容易指定并区分。你不会想让你的团队花大量的时间争论每一个Bug的优先级别吧。它必须是显而易见的,不管是在写Bug报告或读Bug报告的时候。
• 优先级别必须易记且易操作。人们不需要问:“下一个Pri 2是什么?”,人们也不需要问哪种级别需要做什么。
基于以上三条准则,一般普遍接受以下优先级别的定义。

Pri 0 一个需引起严重关注的致命错误。不存在变通办法,是一个不可逾越的Bug 只有解决了这个问题或找到了变通办法,你才能安心 Pri
1 一个需引起严重关注的致命错误 必须在当前的冲刺阶段或里程碑期间解决 Pri 2 一个严重的错误 必须在产品发布前解决 Pri
3 一般性错误或建议 最好在产品发布前解决 Pri
0通常有碍测试、部署或其他对时间敏感的工作。你必须给开发者或团队发邮件并电话告知他们,或者直接过去跟他们谈,直到有人解决这个问题。如果有变通办法,Pri
0就必须改成Pri 1。

注:确实有开发团队对优先级别有非常多的定义。有的从Pri 1开始,而不是Pri 0;有的不遵从我在本章开始时列出的准则,或者在一个单独的区域提示Bug信息。
如果你查看另一个团队的工作项目数据库,确定你使用的是他们的定义。这些定义通常显示在工具提示上或帮助窗口中。

严重程度

严重程度比优先级别简单得多,但是它还是经常被搞混。严重程度指的是问题所产生的影响范围,不关乎“有多么严重”这样的问题。其定义是:

• 严重程度1。某问题引起系统崩溃或客户数据丢失。
• 严重程度2。某问题引起的故障阻断了后续操作。
• 严重程度3。某问题引起操作不便或界面显示不完整。
注意,严重程度与优先级别是相互独立的——换句话说,严重程度与优先级别毫无关系。优先级别1的Bug比级别2的Bug更重要,不管其严重程度如何。显示一些不合适的内容就是严重程度3但也可能是优先级别1;系统崩溃后用户强行重启就是严重程度1同时也可能是优先级别3。工程师声称一个未致系统崩溃的Bug的严重程度是1,因为严重程度很高。你完全没必要成为他戏弄的笑料。如果你这样就白痴了。

解决方案

Bug报告中最重要且经常被混淆的部分是“解决方案”——说明如何解决问题。解决了一个Bug意味着你不再关心这个问题。当Bug的发现者确认这个方案能修复这个Bug时,你也不打算再作更多的处理。
在你发布产品前,如果对一个问题需要做更多的处理,即使这不是你的团队的责任,那这个Bug还是要引起关注,并指定你团队里的一个人继续跟踪相关事宜。

以下是解决方案部分可能包含的内容:

• 意图。Bug报告描述了所需处理的细节,按预先意图进行。
• 重复。这个Bug与报告中先前指出的Bug有相同的起因及非常相似的用户体验。不要像分析一个旧Bug一样分析新Bug——不管这个新的Bug报告看起来会多精美,除非你想与Bug发现人为敌并丧失“首先发现Bug”的机会。
• 外部性。一个Bug是由你控制能力之外的原因引起的,则你可以在Bug未修复之前发布产品。如果你团队之外的人没有修复这个问题,使你的产品发布不了,那么保持对这个Bug的关注并指定你团队里的某人进行跟踪,找到其他团队中存在的问题。
• 已修复。Bug修复了。这是我最喜爱的解决方案。
• 不再发生。你不能让Bug在之前说过的创建版本及环境中再次发生。声称“在我的机子上运行没什么问题”并不代表Bug解除了——随时与Bug发现人保持沟通。
• 延期。你不想在这个版本中修复Bug。延期是偷懒者的借口,他们总说明天我会写个测试单元。真正的工程师会时刻关注这个Bug并会在Bug报告里留出一个“等待修复”专区来指出下一个改进版本,只要他们真的想修复这个问题。
• 不修复。你不再修复Bug。这是我第二种得意的解决方法——这说明你有丰富的经验判知哪些Bug不需要修复。通常是因为修复本身会带来比Bug更多的问题。
当你在解决一个Bug时,你必须在解决方案中有段描述。这段描述是很重要的。这样可使解决方案少些争论,Bug重现时就更易理解,使你与你的公司免于因为这个问题成了公众热议的话题。这在我之前的一个团队中曾发生过——我们使这个公司免于千夫所指,因为我们的解决方案中对一个出现不合适内容的Bug作了描述,以说明我们并非蓄意而为。

当一个Bug被解决,它将被自行指派给发现它的人。如果这个人不是开发团队的人员,那这个Bug必须指定给另一个团队中的人,这个人可以跟Bug发现者核实解决方案。但你不能总是指望团队外部的人能及时周到地确认解决方案。当然,如果这个解决方案不怎么令人满意,那么这个Bug应被重新激活。

过犹不及

Bug报告中还有很多其他区域。我说过用“创建”及“环境”两个区域记录Bug相关信息以及用“等待修复”区域来说明什么时候处理Bug。还有一些区域用来跟踪记录底层原因,这个Bug是怎么被发现的,Bug是在产品或服务的哪个方面发生的,潜在的安全威胁以及其他信息。

设定好Bug报告的必要条件,少则缺,多则无益。要求太多人们会怨声四起而拒绝完成Bug报告——两种极端都会对你及你的客户不利。

Bug报告要易写且易读,这样会促使他们在发现问题的时候制定清晰的Bug报告。使用一些Bug模板对于一些内容的编写是很有帮助的。对于我们在乎的工程师及客户来说,规范的Bug报告使一个问题在用户发现前消灭于萌芽状态,没有比这更好的礼物了。

相关文章:

Bug剖析

Bug剖析 • 所有的Bug报告有以下的基本要求: • 标题。要简略。 • 指派。谁来处理这个问题。 • 重现步骤。问题再次出现的相关步骤。 • 优先级别。问题的紧迫性与重要性。 • 严重程度。问题所产生的后果。 • 解决方案。怎么解决问题。 其他很多方面对修复问题…...

HI3516DV500 相机部分架构初探

Hi3516DV500 是一颗面向视觉行业推出的高清智能 Soc。该芯片最高支持 2 路 sensor 输入,支持最高 5M30fps 的 ISP 图像处理能力,支持 2F WDR、多级降噪、六轴防 抖、多光谱融合等多种传统图像增强和处理算法,支持通过 AI 算法对输入图像进行实…...

训练yolo系列出现问题mAP, R, P等为零

1. 问题 40系列显卡训练yolo系列出现问题,loss正常,但mAP,R,P等为零。 环境:ultralytics版本为8.3.9,cuda11.8, torch2.4。 40系列显卡网上说可以使用cuda低于11.7的,自己测试了下…...

数字媒体技术基础:色度子采样(4:4:4、4:2:2 、4:2:0)

在数字视频处理中,色度子采样 Chroma Subsampling可以用于压缩视频文件的大小,同时在大多数情况下保持较高的视觉质量,它的原理基于人类视觉系统对亮度 Luminance比对色度 Chrominance更加敏感这一特点。 一、 采样格式的表示方法 色度子采样…...

tkinter库的应用小示例:文本编辑器

tkinter库的应用小示例:文本编辑器 要 求: 创建一个文本编辑器,功能包括,创建、打开、编辑、保存文件。一个Button小组件,命名为btn_open,用于打开要编辑的文件,一个Button小组件,命名为btn_s…...

信息抽取数据集处理——RAMS

引言 RAMS数据集(RAMS:Richly Annotated Multilingual Schema-guided Event Structure)由约翰斯霍普金斯大学于2020年发布,是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件,涵盖了139种不同的事件类型和65种…...

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…...

openpyxl -- 简介

文章目录 介绍核心类 介绍 开源的python读写Excel的工具库,由志愿者在业余时间维护;安装,pip install openpyxl;官方文档地址源码地址issues列表默认openpyxl不能保证抵御大量的xml攻击,为抵御这些攻击需安装defusedxml&#xff…...

滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用

全文目录: 前言8.3 JSON与全文检索1. JSON数据类型的使用1.1 JSON 数据类型概述1.2 JSON 数据的插入与查询1.3 JSON 常用函数与操作1.4 JSON使用的优缺点与性能考虑 2. 全文索引与全文检索2.1 全文索引概述2.2 全文检索的使用2.3 全文检索模式2.4 全文索引优化与性能…...

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...

2024年09月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 下列代码中,输出结果是( ) #include<iostream> using namespace std; i...

Web自动化Demo-PHP+Selenium

1.新建工程 打开PhpStorm新建工程如下&#xff1a; 打开终端输入如下命令安装selenium&#xff1a; composer require php-webdriver/webdriver 2.编写代码 <?php require vendor/autoload.php;use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver…...

Python速成笔记——知识(GUI自动化处理屏幕和按键输出)

处理屏幕 获取屏幕快照 函数:pyautogui.screenshot(); 【注】该函数返回包含一个屏幕快照的Image对象; 分析屏幕快照 函数:pyautogui.pixel(); 【注】 传递一个坐标的元组,函数返回坐标对应像素点的RGB值(RGB元组) 函数:pyautogui.pixelMatchesColor() 【注】 函数第一…...

计算机是如何输入存储输出汉字、图片、音频、视频的

计算机是如何输入存储输出汉字、图片、音频、视频的 为了便于理解&#xff0c;先了解一下计算机的组成。 冯诺依曼计算机的五大组成部分。分别是运算器、控制器、存储器、输入设备和输出设备。参见下图&#xff1a; 一、运算器 运算器又称“算术逻辑单元”&#xff0c;是计算…...

springboot系列--web相关知识探索五

一、前言 web相关知识探索四中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索四中主要研究了复杂参数底层绑定原理。本次主要是研…...

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…...

【论文阅读笔记】Bigtable: A Distributed Storage System for Structured Data

文章目录 1 简介2 数据模型2.1 行2.2 列族2.3 时间戳 3 API4 基础构建4.1 GFS4.2 SSTable4.3 Chubby 5 实现5.1 Tablet 位置5.2 Tablet 分配5.3 为 tablet 提供服务5.4 压缩5.4.1 小压缩5.4.2 主压缩 6 优化6.1 局部性组6.2 压缩6.3 缓存6.4 布隆过滤器6.5 Commit日志实现6.6 T…...

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十一&#xff09;–rpm管理和计划任务 一、rpm管理&#xff08;重点&#xff09; 1、rpm管理 作用&#xff1a; rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…...

【C++几种单例模式解读及实现方式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、单例是什么&#xff1f;二、解读1.懒汉式2.饿汉式3.static变量特性4.call_once特性 总结 前言 单例模式几乎是每种语言都不可少的一种设计模式&#xff0c…...

QT开发--串口通信

第十六章 串口通信 16.1 串口通信基础 串口通信主要通过DB9接口&#xff0c;适用于短距离&#xff08;<10米&#xff09;。关键参数包括&#xff1a; 波特率&#xff1a;每秒传输bit数&#xff0c;如9600。数据位&#xff1a;信息包中的有效数据位数。停止位&#xff1a;…...

数据库(至少还的再花两天 )

1 连接查询 左连接 右连接 2 聚合函数 SQL 统计求和 求最值 count sum avg max min 3 SQL关键字 limit 分页 group by 分组 distinct 去重 4 Select执行顺序 from where group by order by 5 数据库三范式 原子性 唯一性 直接性 6 存储引擎 MyISAM InnoDB 7 …...

网络安全公司及其主要产品介绍

以下是一些全球领先的网络安全公司及其主要产品介绍&#xff1a; 一、思科&#xff08;Cisco&#xff09; 思科是全球最大的网络设备供应商之一&#xff0c;其网络安全产品以企业级解决方案为主&#xff0c;覆盖多种安全需求。 Cisco ASA&#xff08;Adaptive Security Appli…...

orjson:高性能的Python JSON库

在Python中处理JSON数据是一项常见任务,标准库的json模块虽然功能齐全,但在性能方面还有提升空间。今天我要向大家介绍一个出色的第三方JSON库 - orjson。 orjson简介 orjson是一个快速、正确的Python JSON库。它具有以下主要特点: 性能卓越 - 在序列化和反序列化方面都比标准…...

常见几大排序算法

排序算法是计算机科学中的基本算法&#xff0c;它们将一个无序的数组或列表按特定顺序进行排列&#xff08;如升序或降序&#xff09;。常见的排序算法可以根据其时间复杂度、空间复杂度和适用场景分类。以下是几种常见的排序算法&#xff1a; 1. 冒泡排序&#xff08;Bubble …...

Linux下CMake入门

CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具&#xff0c;主要用于管理构建过程。CMake 不直接构建项目&#xff0c;而是生成特定平台上的构建系统&#xff08;如 Unix 下的 Makefile&#xff0c;Windows 下的 Visual Studio 工程&#xff09;&#xff0c;然后…...

网络资源模板--Android Studio 实现简易记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…...

根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化

文章目录 函数组件的特点props组件间的传值父传子看上例子传父兄弟组件传值祖先组件传值 插槽基础插槽具名插槽作用域插槽 样式操作**CSS Modules** 生命周期useRef常用hookuseStateuseEffectuseContextuseReduceruseMemouseCallback 高阶组件什么时候使用 react性能问题和优化…...

HTML(六)超链接

HTML讲解&#xff08;一&#xff09;body部分_html body-CSDN博客 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>title</title> </head><body><a href"https://blog.csdn.net/2301_8034953…...

【Coroutines】Implement Lua Coroutine by Kotlin - 2

Last Chapter Link 文章目录 Symmetric CoroutinesNon-Symmetric Coroutine SampleSymmetric Coroutine SampleHow to Implement Symmetric CoroutinesWonderful TricksCode DesignTail Recursion OptimizationFull Sources Symmetric Coroutines in last blog, we have talk…...

java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方&#xff08;本次10月份活动福利&#xff0c;免费提供下载&#xff0c;自行到对应的方式1下载&#xff0c;csdn的0积分下载&#xff09; java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频) 基于Java的扫雷游戏…...