`
neora
  • 浏览: 183828 次
  • 性别: Icon_minigender_1
  • 来自: 墨尔本
文章分类
社区版块
存档分类
最新评论

写给我的团队成员(一)——什么是BUG?

阅读更多

      我知道你们都很忙。忙得连给代码写注释的时间都没有,哪有时间做总结呢?还是我来替大家做一些总结吧。我最近会找时间写一系列的短文,在email给你们的同时会发送到你们常去的JavaEye上。如果你抽空看看,对你和我们团队都有好处。今天我写了第一篇。

 

写给我的团队成员(一)—— 什么是BUG?

 

      什么是BUG?每个写过代码或者使用过软件的人似乎都知道它是什么。然而,我们的很多工作年限有限的开发人员总是简单认为:程序跑通了,自己测了N遍了就很少有BUG了。这是个危险的观念,没有理解深刻这一点的人会在自己的进步过中走很多弯路。更会给产品和团队带来各种大大小小的危机。

 

      对抗BUG是我们程序员永恒的主题,要在这场战斗中获胜,首先要做到“知己知彼”——什么是BUG?

 

      现在,我们来一起把BUG分为以下几个种类,你在Coding的时候要随时随地的想到这些:

 

  • 最最普通的BUG。 我实在缺乏用语言来给这类BUG下定义的能力,因此你现在能够识别,这就是BUG的东西,应该可以归属于这一类。
  • 编译不通过。 你可以认为这是最简单的BUG,根本不需要特别考虑,如果编译不过,Eclipse会在设计时给你个红XX 来提示的。但是,在下面的情况中,你可能看不到红XX,但BUG依然存在。
  1. spring的xml。缺省的eclipse可不会在design time时给任何检查。你写错一个字母,都会让你无法运行。跟业务逻辑相关的依赖关系,更别指望eclipse替你找出来。
  2. jsp中引用的java代码。不用我解释了吧,大家可能都有体验。至少我目前还没找到完全可靠的jsp plugin 可以帮助 eclipse来随时随地找出jsp中的代码错误。(除非你把上千个jsp文件都关闭并重新打开一遍)。
  • 业务逻辑实现错误。 这就不需要过多赘述了。地球人都知道。
  • 缺乏必要的事务。 在99.9%的“开发时”,事务不是必须的。在仅挨着的两条insert语句执行的瞬间,出现系统失效的可能性微乎其微。然而,一旦进入了生产环境,用“事务”来保持你要进行的这个action的完整性就显得非常重要了。当然,并不是所有的业务逻辑步骤都需要用事务来保护,况且让容器帮你你管理事务也是一种懒惰但有效的做法,但与此同时自己去考虑一下“这里如果没有事务,我是否安全?“的问题,对你的进步更有好处。
  • 团队使用的基本库出错。 不要认为团队自己开发的基本类库是100%正确的,轻信不完善的API的思想是大量顽固BUG的藏身之处。团队自己生产的代码还在不断的完善和发展,毕竟咱们积累的这些”精华“与外面OpenSource的东西(而他们同样有BUG)相比,还差懂得远呢。我丝毫不怀疑里面存在超过100个算法缺陷和200个不安全的使用方式。因此,不要”拿起来就用“,而要”三思而后行“。
  • 性能陷阱。 为了尽快实现业务逻辑。我们在第一次编码的时候往往不先考虑性能问题。这个想法不算太错误,但这个想法不能太过分。特别是涉及到一些”性能敏感”的代码段,比如我们产品中多处涉及到的Tcp Server的内核。这些部件的代码1天可能遭受几百万次的访问,瞬时绝对并发100是最正常的情况。因此0.1秒的性能损失,也会带来100x0.1=10秒的性能损耗。10秒,足以使一个TCP Server达到实际“不可用”的严重程度!10行马虎的代码,可能毁掉客户对我们团队辛苦生产的100万代码的信任。切记!切记!
  • 安全隐患。 某些安全隐患在我们刚开始写实验性的代码时往往可以忽略,但绝不能忘记。你必须在这个产品进入到下一阶段的时候加上必要的安全检查代码和与安全相关的逻辑验证代码。回忆一下,你是否忽略了下面的工作:
  1. http session检查。 尽管我们可以用框架来保证这一点。但你还是要检视一下,是否在某些功能的实现上,你确实忘记它了。
  2. 参数类型校验。 当你把一个'a'传递到servlet用Internet.parse()来处理的时候,你是否考虑了可能出现的异常情况。等等此类。
  3. NullException。 特别注意,千万不要让NullException出现在jsp中,否则你很难在系统部署后排查错误。在你第一次编写jsp代码时,你就必须考虑你所使用的对象或者属性是否可能为Null。
  4. Anti-flood。 最容易被初级程序员忽略的要点之一。因为这个bug永远不会出现在你的eclipse开发运行环境里。也往往被功能测试组的人忽略。但一旦存在这个隐患,一个最菜的Hacker用最普通的teardrop也会让你tear drop。
  • 线程安全。 永远不要忘记,你的代码需要在一个多线程的环境中运行,随时随地都有可能出现并发的情况。你的产生的临时文件名是否用uuid来避免重名了?你的静态(或单态)变量是否线程安全。你是否忘记将spring里定义的bean设置为scope=prototype?
  • 忘记删除临时文件。 在上传文件、生成验证图片、生成缩略图的时候,你都可能用到临时文件。你是否在使用完毕后及时的删除了它?你是否考虑过在发生异常后,仍然安全的删除了这个文件?特别需要指出的是,我们在编码阶段的测试时,很难发现遗漏临时文件清理的工作。单在系统上线运行后,大量滞留在目录下的过期临时文件将用光客户的服务器磁盘空间,降低系统IO的性能。
  • 极不友好的UI操作。 极不友好的UI操作同样是严重的BUG。比如:
  1. 当用户提交表单的时候可能填写了错误格式的信息,而你的程序再提示错误,重新显示表单的时候清除了用户已经填写的数据。这对你的软件的使用者来说是极其恼火的体验,对于创造这个代码的您来说则是一种耻辱。
  2. 另一种“极不友好的UI操作“可能发生在这种情况——你必须跟测试人员解释——他体验到这次系统出错的原因是他(测试人员)操作的步骤或顺序不正确。天那,这是噩梦,不仅是用户的噩梦,也是你的噩梦。如果你坚持你的做法没错,我将决定在系统上线后,把你的手机和家里的电话号码做为HELP放在你创造的界面的显著位置呈现给使用它的80万用户。

 

......

 

儿子刚刚给我倒了杯咖啡端倒了书房里,从味道上判断,他在厨房里误把味精当白糖给我放了很多。但无论如何他是在讨好我去陪他玩了。那么,这次就写到这里吧。

 

分享到:
评论
46 楼 yimlin 2009-06-01  
靠计划,检查列表来贯彻是不靠谱的:
1.执行成本太高,也面临着计划时间的上风险;
2.最重要的是无法验收,你无法知道项目组成员是否贯彻了所有的检查,现有代码是否消除检查列表中的问题。

于是你只能执行警察权,偶尔抽查下,一旦发现则严惩不殆;但是bug已经产生了,修改bug本身带了相应的成本,甚至影响了计划。更进一步,你无法确认系统是否还有其它应检查而未发现的bug。

可能的有效方案:
1.框架完成必要的检查、以及修复(回收资源)工作;
2.通过checkstyle等工具检查提交的代码;
3.持续集成尽早的发现问题,争取时间;

45 楼 ylz4647 2009-05-21  
<p>感触良多,做一个IT人员真不容易</p>
44 楼 jhlcss 2008-12-05  
<div class='quote_title'>ftw118 写道</div>
<div class='quote_div'>
<div class='quote_title'>neora 写道</div>
<div class='quote_div'><br/>个人认为计划不是关键问题,<strong>关键是你的计划中是否包含了计划了变化。</strong></div>
<p> </p>
<p>    严重同意。</p>
</div>
<p><br/>在这里我觉得计划定了,也定了可能的计划变更,也要考虑风险,制定风险规避措施。</p>
<p>更重要的是计划执行和跟踪。</p>
43 楼 andy54321 2008-11-25  
还是要测试;
自己的代码看百遍还是没错。
42 楼 yinxiangjake 2008-11-17  
继续关注中
41 楼 oyl822 2008-10-22  
楼主是个很幽默的人哦。
40 楼 35687638 2008-10-22  
关注,关注。。。
39 楼 lovinchan 2008-10-15  
    我觉得这个方面有个意识的问题,当时没找出bug是很正常的,不过在工作的过程中,难免会有运行不顺畅的时候,这时候有意识的人应该就会想这个是什么原因了。这个我觉得也可以说是一种经过锻炼后的一种能力吧。
38 楼 laodizhuq 2008-10-15  
画蛇添足的异常捕捉。
有些同事会在他的方法中捕捉异常,然后又不打印异常日志(而是直接System.out.println(e)),也不重新抛出。
结果导致产品上线后,发生莫名其妙的错误,而找不到原因。
37 楼 zcjava 2008-10-14  
哈哈 同意   计划永远没有变化快啊。  要实时的调整
36 楼 fantasy 2008-10-08  
你这说的不应该是BUG,应该是代码质量。
35 楼 healthlin 2008-10-08  
bug很多的时候,对于scm的管理要求就非常高,还有回归测试,出现的bug不能再次出现,也尽量避免1个bug导致了另外的bug产生。

在设计代码前,对业务逻辑和产品需求,需要调研的非常透彻,程序自己产生的bug是可以解决的,一旦需求或者和用户沟通不够,产生的”bug“,那是无穷尽的
34 楼 ironurbane 2008-10-06  
那些中间件的BUG算么
我曾经遇到一个问题,是WEBLOGIC 服务器,同样一个请求路径aa.do?在XP下通过,可以获得自己想要的结果,而在2000下没有反映,或者是没有得到自己想要的结果。这个问题曾经让我头疼两个晚上,幸好最后搞定了,
象这样的BUG真的很难去定位》
33 楼 zds625 2008-09-28  
恩,受教了,发觉在开发过程中也经常会有这些问题~!
32 楼 pekkle 2008-09-24  
什么文档啊,规划啊,都是假的。
关键是一个执行力度,计划赶不上变化
31 楼 alfred.w 2008-09-24  
楼主混淆了一些问题,我想,

引用

    * 编译不通过。 你可以认为这是最简单的BUG,根本不需要特别考虑,如果编译不过,Eclipse会在设计时给你个红XX 来提示的。但是,在下面的情况中,你可能看不到红XX,但BUG依然存在。

       1. spring的xml。缺省的eclipse可不会在design time时给任何检查。你写错一个字母,都会让你无法运行。跟业务逻辑相关的依赖关系,更别指望eclipse替你找出来。
       2. jsp中引用的java代码。不用我解释了吧,大家可能都有体验。至少我目前还没找到完全可靠的jsp plugin 可以帮助 eclipse来随时随地找出jsp中的代码错误。(除非你把上千个jsp文件都关闭并重新打开一遍)。


编译不通过是否是bug,我持保留意见。关于jsp中引用的java代码,如果是n年前的遗留项目就算了,不太老的项目我觉得是不是考虑换freemarker或者其他的,而且有不少插件可以做语法判断。表现层只应该做表现层的事情。


引用
性能陷阱。
请参看一下《重构》一书,请问系统上线以前是不是需要压力,性能测试呢?非要等着客户去发现?

引用
极不友好的UI操作。
请问UI设计是谁来做的呢,设计完不需要审核么?
30 楼 cuiyi.crazy 2008-09-20  
pipilu 写道
我很想知道怎么避免写程序中bug太多。
我感觉我写的程序bug还是多了些,而且我写的时候其实很注意,经常重构代码,避免重复的逻辑在多处实现,避免拷贝粘贴。
你们有过类似的困扰么?是怎么减少bug数的。


如果你真的是这么想的,如下的路你可以尝试:
不要一直做新东西;
到这样的软件公司去尝试一年左右:
1) 规模不是很大,可以让你维护改进系统的大部分
2) 是一个遗留项目

我想一年下来后,你就会对如何减少bug,如何减少无视性能,如何发现你意识不到的地方,有很大的帮助的;

而这,又很需要你静下心来做。
29 楼 wjs0702cn 2008-09-19  
我想拜你为师
28 楼 pipilu 2008-09-19  
我很想知道怎么避免写程序中bug太多。
我感觉我写的程序bug还是多了些,而且我写的时候其实很注意,经常重构代码,避免重复的逻辑在多处实现,避免拷贝粘贴。
你们有过类似的困扰么?是怎么减少bug数的。
27 楼 miaomiao0307 2008-09-19  
从bug中吸取经验,减少bug

相关推荐

    vs2008视频教程13:团队协作开发利器——如何提高团队开发效率

    团队成员可以利用TFS进行代码签入/签出,确保只有一个开发人员在任何时候修改同一段代码,从而避免了冲突的可能性。 其次,TFS还提供了工作项跟踪功能。开发团队可以通过创建、分配和跟踪工作项(如任务、缺陷和...

    bugfree管理工具

    4. **责任分配**:可以指派bug给特定的团队成员处理,明确责任归属,提高协作效率。 5. **报告和统计**:BugFree提供各种报表和统计功能,帮助管理层了解项目的健康状况,以及团队的工作绩效。 从压缩包中的文件名...

    中文版bug系统下载 bug反馈系统

    4. **状态跟踪**:系统会记录每个Bug的状态变化,如新建、待处理、已分配、正在处理、已修复和已关闭等,让团队成员随时了解Bug的进展。 5. **优先级和严重性设置**:根据问题的紧急程度和影响范围,可以设定不同的...

    Computer Bug计算机Bug的由来

    团队成员小心翼翼地取出了这只飞蛾,并将其贴在了当天的工作日志上,旁边写着:“First actual case of bug being found”(第一次真实发生的bug案例)。 这个事件不仅解决了当时的技术问题,更重要的是它创造了一...

    bugfree用户手册

    本用户手册将详细解释如何有效地使用BugFree,包括后台管理、用户管理、以及核心功能——bug管理。 **1. 后台管理** 后台管理是BugFree的核心组成部分,它允许管理员进行项目的配置和团队成员的管理。 **1.1 项目...

    如何减少程序中的bug.pdf

    定期组织技术分享会或研讨会,鼓励团队成员分享他们在解决问题时所学到的经验教训。这种方式不仅能够促进团队成长,还可以避免未来再次出现同样的问题。 #### 六、案例研究 文章的部分内容提到了几种常见的参数...

    bugfree中的bug导出、导入功能

    Bugfree是一款优秀的开源缺陷跟踪系统,它提供了便捷的Bug管理功能,包括Bug的创建、分配、跟踪以及本次我们重点关注的——Bug的导出与导入功能。在Bugfree 2.x版本中,这两个功能得到了进一步的优化,以满足团队...

    bugfree使用指南

    4. **提高效率**:通过规范化的流程,BugFree有助于团队成员协同工作,提高问题解决的效率。 5. **数据统计与分析**:系统支持查询和报表功能,帮助管理者了解项目的健康状况,做出决策。 ### Bugfree的登陆 1. **...

    项目管理BUG管理

    培养团队成员的责任感和主动性是BUG管理成功的关键之一。每个人都应该对自己的工作负责,并积极参与到问题的解决过程中。团队领导可以通过定期的培训和个人激励措施来增强成员的责任意识。 #### 五、案例分析——...

    dreamxmgl_a5Dream项目管理系统(又称:梦想项目管理系统)是一款基于PHP+Mysql开发的一款Bug管理系统

    DreamXMGL提供直观的用户界面,方便团队成员提交、查看和更新Bug。同时,系统具备权限管理机制,确保敏感信息的安全,防止未经授权的访问和修改。 五、集成与扩展性 作为一款灵活的管理系统,DreamXMGL可与其他工具...

    代码写的垃圾被嫌弃?这 3 个插件你值得拥有!(csdn)————程序.pdf

    这对于项目管理和持续集成非常有用,因为团队成员可以直观地看到代码质量的变化趋势。 3. **阿里巴巴代码规约插件**: 阿里巴巴代码规约插件遵循阿里巴巴内部的编码规范,为开发者提供了一套标准的代码检查规则。...

    bugfree改造文档

    "Bugfree"是一款开源的缺陷管理系统,主要用于软件开发过程中跟踪和管理bug。"bugfree改造"通常是指...在实际改造过程中,这类工具或许可以用来创建关于Bugfree改造过程的记录或教程,帮助团队成员理解和应用改造成果。

    第一周周报(子非鱼——智能模块化养鱼设备)1

    - 9月26日,团队成员fyl、zjh、lhs和tyh花了2小时组装树莓派,这是设备核心部分,用于运行系统和控制硬件。 - 9月28日,团队在尝试启动树莓派时遇到问题,未能成功,随后耗时1小时安装了git工具。 3. **软件开发*...

    禅道基本使用——适用于测试人员、项目经理

    * 每日例会:每天 Scrum Master 召集站立会议,团队成员回答昨天做了什么今天计划做什么,有什么问题。 * 演示会议:迭代结束之后,召开演示会议,相关人员都受邀参加,团队负责向大家展示本次迭代取得的成果。 * ...

    初体验——FishEye

    这种实时的更新通知使得团队成员能够及时了解项目的进展,特别是对于测试人员来说,可以迅速跟进代码变动,提高工作效率。 在测试阶段, FishEye 的价值尤为显著。当开发人员提交代码后,测试人员可以立即追踪代码...

    BugAdvocacy

    为了解决这一问题,Cem Kaner 博士在其研究中提出了一种新的理念——**BugAdvocacy**,旨在通过改进Bug报告的质量来提高软件开发团队对Bug处理的重视程度。 #### BugAdvocacy核心概念 1. **测试的核心目的**:寻找...

    轻量、简单、易容、免费的bug管理工具-delbug管理

    从新建、已解决、未解决、延期到关闭,每个阶段的状态变化都一目了然,便于团队成员随时了解项目的进展。 ##### 4. **Bug表单自定义** 除了标准的信息字段外,Delbug还允许用户根据实际需求自定义表单内容。例如,...

    开发进度月报 符合国标GB8567——88.zip

    【开发进度月报符合国标GB8567——88】是软件开发过程中一个重要的文档,它严格按照国家制定的标准GB8567——88进行编写,旨在提供项目开发的详细进度信息,帮助管理者、团队成员以及相关利益者了解项目的实时状态、...

Global site tag (gtag.js) - Google Analytics