在咱们码农生涯,错误可谓:“我不来他不走,我来他也不一定走”。bug不离不弃的伴随这我们。怎么样找到错误,定位错误是关键,很多情况下我们往往解决错误就那么一秒钟的事情,而定位错误这需要漫长的折磨。以下记录 RIFT 即: “再现(Reproduce)、隔离(Isolate)、改正(Fix)、测试(Test)”
在RIFT之前应该还有一定前提
1、保证程序是最新稳定版本(有时候我们因为一个文件没有更新到某台服务器而引起了一顿错误的折腾,最后发下原来某个文件不是最新的。避免这个问题必须要有一套管理更新版本的相关机制)
2、在定位修改前必须得做备份
3、一定要做好变更归档记录(很多情况下,我们修复了一个bug没有记录,下次遇到类似问题单凭记忆去针对变更,这往往会引起错误的判断)
有了以上的准备工作我们可以开始 RIFT了
在进行修改之前,务必要再现系统产生的问题。如果没有亲眼看到问题的表现 很可能无法正在的定位到问题。当我们没有这个意识的时候,收到一个bug报告之后,知道系统出bug了,但是没有通过问题的再现就尝试进行某些修改,然后让用户测试下。这种做法偶尔会凑效,很多情况下会出问题,那么用户会以为公司的技术把他当成了小白鼠在做实验,这对公司的业务影响是可想而知的。
事实上成功的再现问题已经是完成了一半的修改任务,最难解决的问题莫过于那些很少发生或者我们预期无法测试到的问题,这类问题情况下,我们正需要收集我们任何可以收集到的信息反馈。并且利用任何可以使用的工具和环境,直到成功的建立了一个测试方案。利用问题再现 和配合问题反映的测试环境。在我们的测试程序上对bug进行接下来的工作
成功的再现问题之后,我们可以开始着手找出问题内在的原因。有时候再现问题不能为我们提供任何线索。在分离阶段,我们需要深入的研究问题的本身,找到确切的内在原因。分离阶段目标就是确定引发问题的正真原因,在某些情况下,问题根源是由于一些组合因素所导致的,这也使得情况更我复杂,但是我们查找原因是相同的。隔离又有以下写隔离技巧(这里主要讲web项目的隔离办法)
1、失效隔离(比如服务器突然带宽很大,访问很卡,我们可以在不影响这个程度运营的情况下一个一个的站点暂停的方式,来观察到底是哪个站点问题)
2、Only 1 (然出现问题的站点以最简单的问题工作,比如我们单独写个页面甚至可以是纯html页面,看能不能正常运行)
3、折半法 (这个其实就是算法中的 二分法查找,定位问题)
5、All but 1 (当我们定位到了问题时候,我们利用问题的各个因素在把相应问题代码执行一遍,确保问题没有错误的定位)
一旦找到了问题的错误原因,RIFT过程的一步工作就是更正错误,这是一项我们可以控制的任务,或者说是一项可以让相应技术员去做的事情。因为当我们找到了问题,基本上就有了问题的解决思路,这个时候相应交给任何一个程序员都能给做好。
测试步骤一般包括三个:
1、测试再现 (echosong在遇到的技术人员中包括我自己有些时候,修复了问题以后就万事大吉,不去进行修改测试,就把问题丢给了售后,或者反馈个项目管理人员。这样倒是客户或者测试部再测反馈问题没有解决,而程序员和项目管理人说 “呀,这个问题不是早解决了么。怎么还有问题呀”,这种情况太不应该发生,所以修改错误以后,务必要进行自我的测试步骤)
2、修改完毕后,务必清理系统运行环境。 (在测试工作解决后,需要执行清理工作,包括一处所谓临时用户,临时问题解决,注释代码,断点打印。svn的正确提交。echosong也遇到过 在svn提交环境以后竟然有 比如 “php: exit("这里是调试")”这种代码存在。这是非常离谱的)
3、整理归档。 在修改后某些教训值得我们一文档的形式 或者svn提交时候说明(最好是单独文档记录) 进行记录下来,共享给开发团队,这样不管是以后自己在处理问题,还是团队其他人都会受益匪浅。
一个优秀的程序员并在不于精通多少种语言,也并在于能设计多么高深的牛逼的系统架构,而在于解决 问题和 处理的方法上。良好的错误定位技术远远超越于一些代码牛人。因为这更考验一个人的做事条理和基本素质。程序生涯的您是否同意这种说法。如果同意请赞一个O(∩_∩)O~