前 言 矛盾并不存在。在遇到矛盾的时候,请检查您的前提。您会发现前提中的某一部分必然发生了错误。 —— Ayn Rand, Atlas Shrugged 近来,无论是在业界还是在学术界,安全和健壮的软件系统设计已经成为时尚。确保一个健壮的、安全的设计需要采取很多预防性措施—— 简单的设计方案、单元测试等。但是,就算是最有效的预防措施也不能避免bug(故障)。 假如那样的话,快速而有效地诊断故障对软件的总成本有非常大的影响。本书介绍了一些有效诊断bug的措施,并引入了一系列的bug模式—— 程序中已报告的bug和潜在bug之间重复出现的相互关系。通过研究这些模式,我们对bug的发生可以做出快速反应。同样,我们还可以设计一些办法来防止bug的发生。 本书并没有把调试操作当作一个独立的行为,由一个没有参与初期开发工作的专门小组来执行。在现实世界中,大多数软件都是由编写它们的开发人员调试的。有关调试的有效方法只能在特定开发方式的上下文中讨论。读者将看到所使用的开发方法会对有效地调试软件造成很大的影响。 读者对象 本书是为任何熟悉Java编程技术,并希望更有效地预防、解释、交流或者修正bug的人员而编写的,包括业界、政府或者学术界的开发人员,以及研读计算机科学的学生。每类开发人员都具有各式各样丰富的调试技术。 对于研读计算机科学的学生来说,在调试中使用到的技术和课程本身紧密相连。一些课程注重大规模的软件开发,这些课上的学生在早期会获得很多调试经验。另一些课程则注重计算机科学的理论知识,这些课上的学生会学到很多高级的理论知识,但是他们一旦真正投入到软件项目中,就会学到很多调试技术。 在业界,很多公司试图通过雇用没有在软件开发方面受过正规教育的人,来缓解高级程序员的短缺问题,特别是那些在其他领域具有高级技术能力的程序员,这使得他们可以很快适应编程过程。但是,软件开发在许多方面和其他工程形式完全不同,一些编程技术在很长一段时间内都仍然晦涩难懂。其中一种就是如何有效地进行测试和调试。 由于程序员的背景知识有很大差别,因此本书并不局限于具有任何特殊经验的程序员。本书只是假设读者拥有使用Java语言的工作经验。拥有面向对象设计模式的知识对书中一些示例的理解很有帮助(当然不是必需的)。同样,具有软件开发极限编程方法的经验也有助于加深理解,但是文中也对涉及到调试的部分极限编程方法做了简单解释。总的来说,本书可适用于具有不同知识背景的程序员。 结构 第1~5章将讨论有效的调试技术和有效的软件开发之间的关系,并介绍一种严格调试软件的方法。尤其是,我们将强调有效的调试技术对于大量单元测试的依赖性。 第6~11章侧重于Java编程语言中的特定bug模式,这些模式适用于很多上下文。不过,本书不会列出一个非常详尽的列表,只是希望开发者可以在了解这些bug模式的基础上建立和识别发生在更多特定上下文中的其他模式。 第22章将讨论应如何更好地利用传统设计模式,使软件调试工作变得更加简单。讨论将根据书中已介绍的bug模式展开。 尽管本书中讨论的所有bug模式是应用于Java语言的,但是其中的很多模式都可以应用于其他语言,尤其是面向对象的语言。当然,bug模式是代码级的模式,所以在某些方面,它们必须与特定语言相关。但是,有一些模式的某些内容对于所有语言来说都是共同的,笔者鼓励程序员用其他语言对这些模式进行改写。 网络资源 本书首先介绍“Java诊断”—— IBM developerWorks Java Zone为笔者开设的专栏—— 中讨论的bug模式概念。该专栏中的文章和其他一些有用资源可以在Java Zone Web站点上在线得到:本书中的大部分示例引自DrJava并已经由DrJava授权,DrJava是一个开放源代码的Java开发环境,由GNU 通用公共许可证授权。在Rice大学,DrJava是一个由笔者的博士生导师Robert Cartwright指导的极限编程技术项目。读者可以访问他的个人主页SourceForge,了解关于DrJava的更多信息: 书中的所有代码示例可以在作者的网站上获得: 其他网络资源请参阅第23章:参考资料。