如何减少bug

通常的做法是通过更多的单元测试 (Unit test) 和code review,使得我们在开发阶段发现更多的问题,从而减少bug数。的确,开发人员经常单元测试,具有良好的测试和编程习惯,在每次check-in之前,或每次打baseline之前,项目组都有代码cross review,同级或跨级评审,自己代码每日评审能大大保证代码质量,在提交给测试组之前就消除大量的bug。但往往发现更大多数的bug是我们通过 Unit test和code review所不能发现的。为什么?
  1、首先是需求的不明确,比如客户原先对软件的部署的需求就是和一般软件一样,没啥特定需求,后来项目进行到后期部署阶段发现有更多的部署需求,比如Failover,并行部署,对vista的兼容性等等。这些都带来的新的问题和代码修改量。

  2、其次是需求理解的偏差,设计理解的偏差,比如一个员工对保险业务不熟悉,去开发保险业务IT系统的时候,往往开发出来的功能和实际业务需求相差很远。对需求理解的偏差,以及对设计理解的偏差,也有部分原因是因为沟通,没有良好的沟通,导致没有倾听客户的诉求和用户的反馈,和客户沟通的问题导致需求偏差,软件没有对客户产生价值,这种bug的比例非常高。

  3、再次是程序员本身能力的限制,比如代码前期都认真经过了单元测试和功能测试,但后期发现运行效率很低,性能不好,原因在于程序员是用他们不熟悉的语言进行开发,而且对性能设计没有经验,开发中根本没有性能上的考虑。如何保证一个程序员进入一个项目开发之前,已经掌握了足够的编程语言知识和技能,已经掌握了足够的业务知识?如果这些程序员经过技术和业务两方面的培训,可能会避免这方面的问题。

  4、最后是没有一套好的研发流程,质量管理体系,和配套的支持工具。这是最大的一个问题。如何找到一个适合自身公司文化和项目情况的process?

  总之,软件开发和编程是一项智力活动,从获得需求、理解需求、程序设计、程序编码(数据结构 + 算法)、单元测试、功能测试、提交的整个过程中,任何一步出现偏差都可能产生bug。

  当然,测试组的严格测试能保证软件的质量,但问题是如何主动防范bug?

  1、程序员的技术能力和经验很重要,比如:代码设计能力,良好的编程习惯,良好的数据结构和算法,编程规范的遵守,随时资源的释放,避免内存泄漏,避免导致性能下降的代码,异常处理,以及对维护、部署、可用性、性能、稳定性的全面,良好的文档和注释习惯等等。另外,项目采用新的架构、框架或技术(例如Spring, Castle, WCF),都会因为程序员不熟悉而引入更多的bug和风险。

  2、程序员的业务积累和经验很重要,大大有助于对需求的理解和把握。这非常关键。例如一个程序员做过老版本的银行清算系统,他不仅熟悉清算业务流程,而且知道老系统存在的问题,就会主动防止这些问题,准备高效的实现新系统。

  3、测试组的测试活动不仅仅是找出bug,而且要通过测试来规范项目开发过程,从而提高软件产品的质量。测试通过了,bug都改完了,项目结束了?其实测试组可以总结和分析下bug产生的原因和分布,这个bug list和分布图交给开发组长和开发人员,可以分析发现开发人员经常哪儿引入bug,从而在以后的开发活动中避免这些问题,实现项目组的积累。其实可能80%的bug分布在20%的模块,因此从各个方面分析bug的根源,可以总结出项目组可以改进的地方。

  最后,从根本上来说,作为软件产品与服务的提供者,只有真正理解客户的业务、顺应客户的需求才能提供令客户满意的产品与服务。应当以一个用户角色的眼光去重新审视为用户提供的技术解决方案和产品,是否是用户所真正关心的,是否真正解决了用户的问题。对于客户而言,最有价值的不是你掌握哪些技术,而是你能帮他们解决哪些问题,产生哪些价值。IBM推行OnDemand随需应变的服务, 因为在当今市场竞争日趋激烈的今天,“求变” 已经是必不可少的生存法则。这个求变的过程,需要软件公司到技术人员的蜕变,从灵活多变的业务,到随需应变的技术,不管客户的业务和管理流程、需求如何变化,技术都只是业务变革的推进动力和实现工具,bug free(无缺陷)的软件背后其实是对业务和需求的深刻理解和行业积累,先进的技术实力,完善的质量管理体系,和软件开发流程。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-28 07:49:29

如何减少bug的相关文章

如何减少代码中的BUG

问题描述 刚开始工作,代码中BUG总是一个一个.为了减少BUG,我增加了自己测试的时间.当然BUG少了一些,请问还有其它的思路么? 解决方案 解决方案二:买瓶杀虫剂放手边随时准备着解决方案三:与其事后修补,为何事先不弄得好一些呢很多的BUG都是由于很不好的编码习惯造成的,比如说:从来不对public方法传入的参数进行有效性或者非空检查之类的.解决方案四:自己积累一些框架,用的时候套用曾写过的代码...解决方案五:没事的,刚刚开始工作嘛,以后就会好的.BUG允许出现一次,但是下次我想不会再出现同样

app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答!

问题描述 app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答! app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答! 解决方案 出现bug就发布新的版本,客户端自动检查你的服务器,自动下载升级.另外开发过程中注意测试,减少bug

艾伟也谈项目管理,找出软件开发过程中的BUG,你需要火眼金睛

1)Bug大都出现在程序员的编码过程中.测试人员工作之一就是找出Bug,面对那些难以被人发现的Bug,测试人员通常会采取哪些手段?以您的经验,对广大测试人员有什么好的建议?对于开发人员,您有什么建议让他们减少Bug的产生? 之所以难以发现,大多是测试案例不够完整,检查测试案例是否全面覆盖了需求,等价类划得是不是够细有助于发现更多的问题. 如果已经发现的问题大多是猜测法发现的,那么惨了,这是一个天马行空的测试,所有的BUG都将是难以发现的BUG,碰运气吧.如果你真的是在这个不幸的团队,别伤心,你有

C++笔试题目大全(笔试宝典)(不断完善中)

1.new . delete . malloc . free 关系 delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数. malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符.它们都可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于 malloc/free

代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧

最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作UI界面.iOS应用是非常重视用户体验的,可以说绝大多数的应用成功与否与交互设计以及UI是否漂亮易用有着非常大的关系.而随着iOS开发发展至今,可以说在UI制作上大家逐渐分化为了三种主要流派:使用代码手写UI及布局:使用单个xib文件组织viewController或者view:使用StoryBoard来通过单个或很少的几个(关于这点稍后会进行展开)文件构建全部UI.应该使用哪种方式来制作UI已经是iOS开发中

网页制作需融入模块化的思维

最近被"模块化"缠身,又是文章又是PPT的,被逼着想了很多相关的东西.整理下我这段时间对于"模块化"的思考,大多都是我自己从事页面重构这份工作的经验和理解,在一定程度上存在局限性,也希望自己能温故而知新. "模块化"只是我们对于过去一直使用的技术.方法的一个新潮的称谓,就像"Ajax".不过做为页面重构发展的一种趋势,越来越被大家重视,不自觉也满口的"模块化",只是你真的理解什么是"模块化&quo

详细学习动态网页制作PHP技术的正则表达式

正则表达式难于书写.难于阅读.难于维护,经常错误匹配意料不到的文本或者错过了有效的文本,这些问题都是由正则表达式的表现和能力引起的.每个元字符(metacharacter)的能力和细微差别组合在一起,使得代码不借助于智力技巧就无法解释.      许多包含一定特性的工具使阅读和编写正则表达式变得容易了,但是它们又很不符合习惯.对于很多程序员来说,书写正则表达式就是一种魔法艺术.他们坚持自己所知道的特征并持有绝对乐观的态度.如果你愿意采用本文所探讨的五个习惯,你将可以让你设计的正则表达式经受的住反

为什么要编写单元测试?单元测试的优势及优点

为什么要编写单元测试?原因是单元测试有不少的优点,能够给我们的工作带来很大的帮助. 单元测试的优点 1.帮助开发人员编写代码,提升质量.减少bug.如果大家分析一下我们bug原因的构成,我想有会有一部分bug的原因是开发人员在编写工作代码的时候没有考虑到某些case或者边际条件.造成这种问题的原因很多,其中很重要的一个原因是我们对工作代码所要完成的功能思考不足,而编写单元测试,特别是先写单元测试再写工作代码就可以帮助开发人员思考编写的代码到底要实现哪些功能.例如实现一个简单的用户注册功能的业务类

使用Apache Geronimo和JMS构建事件驱动的框架

使用 Java 反射定义事件类型 当实时更改和事件发生时,对其作出响应是企业框架的重要需求.本文介绍了 Apache Geronimo 框架中采用的技术和机制,它们使应用程序和服务能够有效地响应实时刺激,然后跨架构虚拟层发送和接收事件. 开发人员试图使用传统顺序处理方法设计和构建动态工作流和集成系统时会遇到麻烦,因此,急需更适合的.事件感知的技术和工具.SOA 和事件驱动的编程可以解决这一复杂的难题. SOA 给出一个松散耦合的开发模型和运行时环境.它使服务提供者和服务消费者能够使用动态组件交互