原文作者:Jeff Atwood

作者在Twitter上发的一条短讯:

“在怨天尤人之前,我们应该先自我反省、努力把自身的问题解决了。”

12:22 PM –2012-5-30

你应该知道那种感觉。我们所有人都曾碰到过这样的事情:你已经盯着代码看了无数遍,但还是没有发现任何问题。然而,有个故障或者错误始终挥之不去。于是你开始怀疑,一定是你开发程序所用的那台机器出了问题,也可能是操作系统的问题,或者是你使用的工具和库出了问题。肯定是它们的原因!

然而,无论你多么绝望,你都不要往那条路上走。沿着那条路下去就是“伏都”计算和靠运气编程。说白了,就是愚蠢。

译者注:伏都教(voodoo),又译“巫毒教”,源于非洲西部,是糅合祖先崇拜、万物有灵论、通灵术的原始宗教。

老是要处理一些困难的、捉摸不透的问题,这是一件令人绝望的事情,但是不要让绝望领着你误入歧途。作为一名谦逊的程序员,最基本的要求就是要有意识:你写的代码在任何时候出了问题,那一定都是你的错。这个观点在《程序员修炼之道:从小工到专家》一书中被巧妙地归结为“select没有问题”:

译者注:select是用于I/O多路转接的一个系统调用函数。

在大多数项目中,你所调试的代码里常常混杂着这些东西:你和项目小组中的其他成员开发的应用代码、第三方的产品(数据库、链接器、图形库、特殊的通信系统或者算法等)以及平台环境(操作系统、系统库和编译器)。

操作系统、编译器或者第三方产品出问题的可能性是有的——但是,这绝对不应该是你碰到问题后的第一反应。错误出现在正在开发的应用代码中的可能性要大得多的多。通常情况下,假定应用程序错误地调用了库函数要比假定库本身有问题更有效益。即便问题出在第三方,你还是必须彻底排除自身代码的问题,然后再提交错误报告。

我们曾经做过一个项目,项目中的一位高级工程师确信Solaris上的select系统调用出了问题。无数次的劝说和逻辑分析都不能改变他的主意(事实上,所有其他的网络应用程序在同样的机器上都能正常工作,但他仍然固执己见)。他花了好几个星期来做变通方案,但是因为一些诡异的原因,这些方案似乎都行不通。他最终不得不坐下来,仔细地阅读关于select的文档。然后,他找到了真正的问题,并且在几分钟内就把问题解决了。如今,一旦我们当中有人开始为了一个很可能是我们自己造成的错误而责怪系统时,我们会用“select有问题”这个短语作为善意的提醒。

译者注:Solaris是一个类似于Unix的操作系统,最初由Sun Microsystems公司开发。早期的Solaris主要针对服务器以及企业应用领域,在Sun的高性能工作站上有广泛的应用。

代码产权的另一面是代码责任。无论你的软件出现什么样的问题——甚至最开始出错的地方根本就不是你的代码——你也应该总是假定问题出在你的代码里,并且根据这个假设采取行动。如果你想让世界人民接受你的软件,那你就要为它的故障承担全责。尽管——从严格意义上来说——你并不是非这么做不可。只有这样,你才能赢得尊敬和信用。如果你不断地把问题推卸到其他人、其他公司或者其他的源头上,你是无论如何也得不到尊敬和信用的。

从统计学的角度来说,软件中的故障或者错误一般都是人为的,例外的可能性凤毛麟角。我想你已经明白了这一点。在《代码大全》(《CodeComplete》)一书中,Steve McConnell引用了两个研究来证明这个观点:

在1973年和1984年进行的两次研究发现,在所有报告的错误中,大约有95%是由程序员造成的,2%是由系统软件(编译器和操作系统)引起的,2%是由其他软件引起的,1%是由硬件造成的。跟1970年代和1980年代相比,现在的系统软件和开发工具的使用人群要大得多,所以我猜想,现如今应该有更高比例的错误是由程序员的过失造成的。

不管你的软件出了什么问题,请你负起责任来吧!从你的代码开始,深入进去,逐步向外调查,直到你找到确凿的证据证明问题之所在。如果问题出在你无法控制的代码上,你不但学会了必要的故障排除和诊断技巧,同时还获得了用来支持你指控别人的审计证据。当然,和你耸耸肩膀简单地把问题归责于操作系统、工具或者应用框架相比,这样花费的工夫要多得多——但是这也会逐步形成信任和尊敬的感觉,而这种感觉是你通过指责他人和逃避不可能得到的。

如果你真的渴望做一名谦逊的程序员,在你碰到问题的时候,你就应该很淡定地说:“嘿,这是我的错——让我把它弄个水落石出。”

95%的bug是由程序员造成的的更多相关文章

  1. 程序员遇到Bug时的25个反应

    开发应用程序是一个非常有压力的工作.没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象.面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会灰心丧气,而另一些程序员会依然保持冷静沉 ...

  2. 程序员遇到Bug时的30个反应

    开发应用程序是一个非常有压力的工作.没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象.面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会灰心丧气,而另一些程序员会依然保持冷静沉 ...

  3. 程序员听到bug后的N种反应,太形象了

    程序员的世界里,不止有代码,还有bug,bug,bug 当出现bug时,程序员们的反应是怎样的呢?

  4. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  5. 程序员奇谈之我写的程序不可能有bug篇

    程序员在普通人的印象里是一份严(ku)谨(bi)的职业,也是一个被搞怪吐槽乐此不疲的职业,程序员们面对复杂的代码敲打电脑时连眉头都不会皱一下,但是有一个词却是他们痛苦的根源,它就是Bug. 有不少的新 ...

  6. 为什么程序员老在改 Bug,就不能一次改好吗?

    程序员的日常三件事:写Bug.改Bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含Bug. 但是真的有这么多Bug要改吗?就不能一次改完吗? 程序员听这问题后要拍键盘了,还!真! ...

  7. 老程序员解Bug的通用套路

    千万不要当程序员面说有bug 对于新手程序员而言,在复杂代码中找BUG是一个难点.下面我们总结下老从程序员解Bug的通用套路,希望对大家有帮助. 1.IDE调试 根据项目特点和语言特点选择一个最合适的 ...

  8. 程序员听到bug后的N种反应…

    程序员的世界里, 不止有代码, 还有bug,bug,bug- 当出现bug时, 程序员们的反应是怎样的呢? 作者:苏小喵,来源:小花小画(微信号:hua-little) - END - 推荐阅读: 1 ...

  9. 那些让程序员目瞪口呆的Bug

    程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个"有哪些让程序员目瞪口呆的bug"的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高. ...

随机推荐

  1. webservice服务器端获取request对象的三种方式

    有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservi ...

  2. Comparators.sort (转载)

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  3. 基于PHP的对接免费电子面单接口平台的案例-快宝开放平台

    一.电子面单对接平台 电子面单对接平台分为两类: 1 .各大快递公司自有的电子面单接口开放平台:对接起来麻烦,需要每个快递公司分别调试接口,费时费力. 2 .第三方快递开放平台:如快宝开放平台(htt ...

  4. SignalR Progress

    Server public class ServerHub : Hub { public async Task<string> ALongTimeTask() { var p = new ...

  5. JAVA 练习 找出素数

    package com.zhang.hello; public class Task { /** * 1. 输出打印九九乘法表 * */ public void NO1(){ for(int i=1; ...

  6. Node.js HTTPS

    稳定性: 3 - 稳定 HTTPS 是基于 TLS/SSL 的 HTTP 协议.在 Node 里作为单独的模块来实现. 类: https.Server 这是 tls.Server 的子类,并且和 ht ...

  7. JavaScript 字符串(String)对象

    String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...

  8. 这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView

    本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发 <交互炸了>或许是一系列高端特效教程, 文中会介绍一些比较炫酷的特效,以及实现的思路.特效实现本身也许不会有太大的难度 ...

  9. Lua热更新时正确设置文件名

    Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...

  10. vue 2.0 scopedSlots和slots在render函数中的应用示例

    渲染内容为: hello from functional render scopedSlots render scopedSlots named slot of render hello from f ...