别让我打开话匣子

绝不要出现

David Platt

David Platt
上个月的专栏中,我曾打趣说,软件和生活一样,有时要有所为,有时要有所不为。这个月我想讨论一下这种理念的对立面,也就是任何时候都绝对不可以做的事情。

我常常将我们的软件行业与医疗行业相比。医生无法完全控制病人的病情。医疗情况千变万化,风险时刻存在,事故频发。但是某些伤害病人的事情永远不应发生。我们知道导致这些事情的原因,知道如何避免这些事情;因此,发生这些事情就意味着失职。这里的“绝不该发生的事情”列表 (bit.ly/h9RMl8) 会使您不忍目睹:做手术时弄错病人或弄错病人的手术部位;将手术器械遗留在病人体内,等等。我最喜欢的好消息/坏消息笑话是:“坏消息是我们截肢时弄错了腿。好消息是你另一条腿终于有所好转”。这个笑话残酷地说明了这样的事情多么让人无法接受。(我知道您会说:“Plattski,你真有点变态!”这个以前有人说过。)

对于我们的软件,我们需要秉持同样的理念:有些事情绝对、永远不可接受。我们需要指出这些事情,公布这些事情,并让开发人员知道这些事情及其规避方法。并且,我们需要向用户解释,他们绝对不应容忍自己的软件出现这样的情况,也不应当有人要求他们容忍这样的情况。

下面是我所认为的对于软件来说最不应该发生的事情。我们希望我们的程序不会崩溃,就像医生希望自己的病人不会死亡一样(因此他们一定会妒忌我们有重启按钮),但这两类事情都不可避免。因为我们知道我们的程序偶尔会崩溃,所以我要说在崩溃事故中丢失用户的数据是绝对不该发生的事情。您是否记得有过这样的经历:您使用 Word 或 Excel 已经两个小时,突然跳出一个令人绝望的 Unrecoverable Application Error(无法恢复的应用程序错误)提示,然后所有数据全都没有了。绝对不可接受。任何时候都不可接受。无论如何都不可接受。

我听到了懒鬼的反对声音。“那不是我的问题,这是一个教育问题。用户只要每 10 秒钟保存一次自己的数据,就永远不会丢失数据了。”这简直是胡说八道!那不是用户的工作,就像病人没有义务要告诉外科医生:“不对,你个笨蛋,是我另一支胳膊。你确信你记得要抓住手术刀的哪头吗?”保证手术顺利实施是医生的工作,同理,保证软件没有问题是我们的职责。

因为这样的事情绝对不该发生,所以一旦发生就是一则重大新闻。著名的外科医生 David Ring 曾在 Massachusetts General Hospital 为一名病人实施手部手术时搞错了手(并且手术流程也出现错误)。他没有掩盖事实,也不是仅仅在不公开的发病率和死亡率会议上进行讨论,而是在著名的 New England Journal of Medicine(新英格兰医学杂志)上公布了这起事故 (bit.ly/gzWN9q)。外科小组进行了全面的事故分析以寻找根本原因。(其复杂程度远远超出您的想像,请看看这篇文章。)他们重新审视了各项规范,并修改了某些规范:例如,手术流程中的酒精擦拭环节被废止,因为这会清洗掉原本以为擦除不了的手术部位标记。正是因为这样不容忍不能让人接受的事情,并开明地处理终究还是发生的事情,我们的世界才变得更加美好。

我们的行业同样需要这样。为什么会丢失数据?这样的事情不该发生。是因为磁盘装满了?这是容量问题 — 我们知道如何解决。是因为有个傻瓜拔掉了墙上的插头?这是一个耐用度的问题 — 我们知道如何在不同价位水平采用不同方式加以解决。是因为我们忘了检查 null 指针?这个很好解决。其他在此就不一一列举了。

如果我们的行业想名正言顺地成为社会支柱,我们就需要秉持另一支柱的这一理念。

您认为在软件中哪些事情绝对不该发生,我们应当如何避免它们发生?请通过本人简介末尾的链接告诉我。一如既往,对于读者,我们只会利用名字加以区分,除非他们另有要求。

David S. Platt在哈佛大学拓展学院以及世界各地的公司讲授 .NET 编程。他著有 11 本编程书籍,包括“Why Software Sucks”(Addison-Wesley Professional,2006)和“Introducing Microsoft .NET”(Microsoft Press,2002)。Microsoft 在 2002 年授予他“软件传奇人物”称号。他想知道是不是应该绑住女儿的两根手指,以便她学习八进制算法。您可以通过 rollthunder.com 与他联系。