首页>参考读物>计算机科学与技术>综合

零缺陷程序设计
作者 : (美)Allan M.Stavely
译者 : 夏昕 王尧
丛书名 : 计算机科学丛书
出版日期 : 2003-11-01
ISBN : 7-111-12941-5
定价 : 25.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 203
开本 : 16开
原书名 : Toward Zero-Defect Programming
原出版社: Addison-Wesley
属性分类: 店面
包含CD :
绝版 : 已绝版
图书简介

本书描述了编写无(或几乎无)bug代码的最新方法。这些方法同时还提高了生产力,缩短了开发时间。
  本书主要在三个领域内加以描述,分别是:规定、验证和测试。作者的写作目的是使开发人员更易理解规定和验证,写出结构完好的程序。 本书适于高等院校学生和软件开发人员阅读。

  本书描述了编写无错代码的最新方法、这些方法来源于IBM等机构净室软件工程方面的实际经验、在过去的十五年间, 这些方法在商业开发项目上应用得非常成功。出错概率要比行业平均水平低一个数量级。要特别指出的是,错误率的降低并非缘于成本的增长,相反。与它相伴而生的是生产力的提高和开发时间的全面缩减。
Stavely在本书中简明扼要地说明了上述方法如何在软件开发的三个关键领域得以应用。这三个领域是:
  1.规定 2.验证 3,测试 软件工程师必须将程序编制得更加简单明了,才能达到形式化规定的要求.才能通过数学方式证明代码与规定相匹配.才能消除逻辑上的bug:组内验证可以发现新的缺陷,可以激励小组成员对程序进行更加细致的检查:
而测试则是为了巩固以前的工作。 (基本上)查出所有剩余的错误。
  本书主要特色有: 阐述了如何使用净室方法开发高质量的软件 鼓励以小组为单位进行程序验证 阐释了增量开发的重要性
  本书并未囊括IBM净室方法的所有内容。作者的目的是使读者容易理解规定和验证,写出结构完好的程序来;在阐述不同的观点时.本书的例子中用到了好几种语言,用的最多的是C,所以预先掌握C是必要的。

图书特色

Allan M.Stavely二十几年来,一直任教于新墨西哥科技大学计算机科学系。他曾作为访问学者访问过IBM加州圣何塞研究中心、惠普英国布里斯托尔研究所,以及IBM英国温彻斯特研究中心、他的教学与研究领域主要包括软件工程、形式化方法和对编程的总体改进方法。

图书前言

本书适用于那些在程序设计过程中力求零bug编码,或者说在目前的技术以及人力所允许范围内尽可能做到错误最少化的程序员。
程序员可以通过使用一些特定的规定及其验证手段来达到错误最少化的目的,这也就是我在本书中所将要描述的。这里所谓的验证手段的意思是校对复核,简单地来讲,就是一段程序必须符合其规定。
不用惊慌,你将会看到这并不需要大量精确复杂的理论,它只涉及到少量特定技术的相关知识以及做事的方法(当然,还有必不可少的实践)。本书并没有那些严格精确的形式,事实上,这些规定以及验证手段通常是半形式,有的时候甚至是完全非形式化的。
为什么要验证程序呢?因为这是一个用以检测可能存在的错误的非常有效的方法。我们经常发现当尝试去验证一段程序时,因为程序的错误而导致我们的努力以失败而告终。我们发现了错误的时候理所当然要努力去修正。
以下是我们的基础假设:
验证的目的是为了排除错误。
这是一个非常实际的观点。其他人可能会站在“全对或者全不对”的立场上认为验证是一个精确的过程并将得到一个绝对精确的结果,如果不是这样也就没有什么价值,但在这里我们并不认同。你不会在本书内找到类似“通过验证的程序就是绝对没有错误、无需检测,并可以无条件信任的程序”这样的论点。相反,我们并不总能通过验证发现所有的错误:我们是人,我们也会犯错误。因而,通过验证的程序仍然需要细致的测试,我也将就这些方法给予相关描述。
本书中所描述的这些方法基于IBM 公司于20世纪70年代末到80年代初所提出的一系列称之为“净室软件工程”的技术。自那时起,IBM在许多实际的研发项目中对其进行了实地应用并取得了令人瞩目的成就,从20世纪80年代后期开始,这些技术的应用逐渐扩展到其他公司和机构。
这些方法取得了实际的成效。净室方法在某种程度上可以减少软件中的错误。花在软件验证上的额外时间足以通过节省下的调试以及返工时间得到弥补,因此使用这些方法并不会给开发团队带来额外的工作和时间开销。并且,这些方法的优势随系统的规模成比例增加。我所说的这一观点实际上已经在公开的文献中发表。在本书第1章,你可以看到我们从文献中引用的一些实际数据。并且我本人以及我的同仁和学生也都持有相似的结论。
这里并没有什么神奇的魔法。我们的方法要求程序员的工作更加细致和系统化,他们必须认真检查自己的工作,最重要的是深入而透彻地理解程序。这些事情是无论如何都应该完成的,虽然他们中的许多人并没有这样去做。从理解上来讲,你可以认为这些方法仅仅是帮助程序员去做这些事情的一种工具。
本书描述的是我个人对净室方法的理解,因此不应该被当作是净室软件工程的官方陈述。在这里我也并不是代表净室方法研讨组织发言(目前这个组织已经不仅仅局限于IBM的原创小组,而已经扩展到了许多其他的机构)。在我的描述中,强调了净室软件工程中我认为最有价值的部分(其他业者可能并不认同),同时淡化或者忽略了其他一些部分,并且我介绍了一些个人的新观点。
本书撰写的目的是用做我自1993年来开始教授的一门课程的课堂讲义。除去对净室风格的软件规定、程序设计、程序验证以及程序测试方法基础内容的描述,本书增加了额外的讲解、提示以及针对处理过程中某些部分的范例来解释学生最初可能会遇到的难点。我所教授的是面向计算机科学专业本科生的一学期制课程,但是这类课程理论上应该在研究生阶段开设。本书同样适合那些短期的工业强化培训或者再教育课程。
程序设计专家会发现本书同样适合自学。但是你将在第6章看到,推荐的程序验证实施方案是在阶段回顾小组会议中进行,而不是仅仅依靠个人的努力。因此如果您想自学这本书,拥有至少两个共同学习或者已经掌握了此方法的合作伙伴将获得最好的学习效果。
作为最低的起点,读者必须掌握算法以及数据结构的基础理论,这些往往是本学科最先教授的课程,以及离散数学的基础知识(集合、关联、函数等等)。同时读者理应具有足够的程序编写及调试的经验和体会,因而能够欣喜地感觉到如果我们能贯彻实施这些方法,“零缺陷”程序设计将具有多大的价值!
我同时假设读者至少在通常条件下能够阅读并理解由计算机算法语言(包括Pascal、C、Modula、Icon,等等)程序所描述的结构。在9.4节中,我也使用了函数型程序设计语言Scheme和ML,不过如果读者对函数型语言并没有什么了解,可以忽略这一段内容。同样,在8.4节的示例中我使用了C++和Python语言的面向对象的特性,如果读者对于面向对象的程序设计和面向对象的程序设计语言缺乏了解,也可以跳过这些内容。
本书中所描述的方法广泛适用于多种程序设计语言。为了验证这一点,扩充的示例、部分的程序以及程序的开发过程将用以下多种语言来描述:C、C++、Icon、ML、Pascal、Python以及Scheme。其语言特性将会在使用的时候具体描述,所以读者并不需要掌握这些语言的细节。不过其中大多数示例将以C语言描述,掌握C语言将会有助于理解本书内容。
在文中多处罗列程序代码片断来举例说明我们所要描述的观点。这些代码片断大多数是用普通的过程化程序设计语言编写:除去那些琐碎的细节,如分号的位置;各个片断所用的语言可能是Pascal,或Modula,或Turning或Icon,或Ada,抑或其他类型。语法可能不同,但是含义都是相近的。如果一个示例是面向一个特定的程序设计语言,我会特殊说明。
引用文献以及注释在每个章节之后的备注中。
我最重要的资料来源并不是这些文献。1992年夏天在纽约Rochester技术学院一个为期一星期的研讨会上我接受了第一次关于净室方法的强化培训。研讨会由美国国家科学基金会赞助,这是一个IBM内部培训教程的精简版本,由来自IBM净室软件技术中心的Philip Hausler、Mark Pleszkoch以及Steve Rosen主讲。我非常感谢他们以及IBM公司和美国国家科学基金会(NSF)使这次研讨会得以成功举办。虽然我并没有在特定章节的备注部分引证,但是这次研讨会却是我所使用的众多资料的主要来源,特别是对于第2至第6章,以及第10和第11章。
我也非常感谢朋友和同事,他们通过提供咨询、建议和帮助勘误对本书做出了极具价值的贡献:Michael Deck,John Duncan,Doug Dunston,Suzanne Flandreau,Alex Kent,Ray Piworunas,Steve Powell,John Shipman(提供了不计其数的帮助),以及Laurie Williams;同样感谢Addison Wesley Longman出版社的Peter Gordon的建议和大力支持。同时感谢过去五年所有我教授过的学生,正是他们帮助我完善了这些资料的整理和表述,非常感谢你们所有的人。
净室方法是我所发现的最好的用以生产高质量软件的系统理论,经验显示,它能带领我们达到零缺陷程序设计的目标。我相信净室方法本身也将精益求精,可以相信将有不同甚至更好的方法最终将被开发出来。而在此其间,净室方法已经证明它们的价值并已经为即刻投入使用做好了准备,希望在本书中关于我的净室理论版本的陈述能够促进它们的使用和推广。
无论如何,我们都可以从改变我们对待错误的态度开始:它们并不是不可避免的,同时他们是不可接受的。零缺陷是我们努力奋斗的目标。我们并不是总能成功,但是我们应该努力去尝试。


A.M.S.
Socorro,New Mexico

作者简介

(美)Allan M.Stavely:暂无简介

译者简介

夏昕 王尧:暂无简介

译者序

谈到“零缺陷程序设计(Zero Defect Programming)”,国内的技术人员可能会比较陌生,很多人大概会将其与近来新兴的“极限编程(Extreme Programming)”等新概念新思想相等同。“零缺陷”思想并不是一个新生事物,也绝非概念炒作下的一个噱头。如果出于直观性,需要找出一个“零缺陷”的“成功案例”的话,那么请把手指放在世界地图上,由上海开始沿经线方向向东滑过东海、日本、太平洋、美国……Congratulations!您现在已经亲手触摸到了两个有“零缺陷”成功案例的地方。没错!除去东海和太平洋,正是我们东部邻邦日本和太平洋彼岸的美国。
自从1961年9月美国管理学家PhilipB.Crosby提出“零缺陷”思想以来,“零缺陷”作为一种有效切实的管理思想在西方各国广为流行。而东方的日本作为亚洲最早引入“零缺陷”管理思想的国家,借助其对“零缺陷”管理思想的广泛推广和严格的贯彻,成就了其制造业亚洲第一、世界前列的地位。经过近半个世纪的发展,“零缺陷”已经成为一个完整高效的管理思想体系。但也许正是其“悠久”的历史会带来一些疑惑,在当今发展变化如此迅即的时代中,这样的思路是否已经过时?然而技术革新总是在进行,思想却一直在延续。相信没有人认为生产流水线技术已经成为过去,从1913年诞生的生产流水线技术在今天依然是各制造行业中无可取代的选择。九十年代伴随着国内制造业的迅猛发展,中国企业界逐渐意识到了“零缺陷”的价值并逐渐尝试在生产管理中引入这种行之有效的管理思想。
“零缺陷”管理思想固然有效,不过,为“零缺陷”加上“编程”的后缀又意味着什么呢?将一种管理思想贯穿在程序设计里会是怎样的效果?又是以怎样的方式来将这样的管理思想贯穿在编程这样的技术实现过程之中?如果您产生了这样的疑问,本书正是您所需要的答案。
《零缺陷程序设计》通过对IBM在70年代末80年代初所提出的“净室软件工程(CleanRoom Software Engineering)”的介绍,从软件工程的方面对“零缺陷”思想在软件开发中的应用进行了阐述。“净室(Cleanroom)”一词源于精密半导体器件的无尘生产车间,它强调在生产过程中就消除问题,而不是在产品生产出来之后,才依靠检测来甄选出有问题的部分而进行修正,而这也正是“零缺陷”思想的精髓。IBM首先在许多实际的研发项目中实地应用了“净室软件工程”并取得了令人瞩目的成就。从20世纪80年代后期开始,这些技术的应用逐渐扩展到其他公司和机构。在众多应用和实践中,这些方法取得了可观的成效,本书第1章中也列举了许多实际的成功案例加以佐证。净室方法的理论基础是通过加大软件验证的力度从而大幅度减少软件中的错误。虽然软件验证阶段的人力时间投入增加,但由于这方面所增加的投入足以在节省下的调试以及返工时间中得到弥补,所以整体上来看这些方法并不会给开发团队带来额外的工作和时间开销。而另一方面,这些方法的优势会根据系统的规模成比例增加,因此对于大规模项目,其带来的价值和意义更是非常显著。这种技术如此强大,看上去似乎其原理和实施过程也会相当复杂,值得庆幸的是,本书并非一本讲述复杂深奥的方法论的书籍,其中涉及的技术也不需要大量复杂的理论基础,作者Stavely在书中通过多个完整的实例向读者展示了零缺陷编程的实施技术和实施过程。尽管这些例子可能看上去古老了一些(大多数都是基于面向过程语言的范例,不过思想并不局限于实现,将其稍做变通运用在面向对象程序设计领域也并不困难)。
限于水平,译文中难免有不足之处,欢迎读者批评指正。

译  者
2003年9月

图书目录

出版者的话
专家指导委员会
译者序
前言
第1章  概述 1
1.1  问题:bug 1
1.2  净室方法 3
1.3  关于本书 5
备注 7
第2章  运算函数 9
2.1  运算:状态与函数 9
2.2  函数表示法:并行处理 10
2.3  条件并行处理 12
2.4  局部变量 13
2.5  基于预期函数的规定 14
2.6  其他标记法简介 16
2.7  预期函数的编写 19
练习 23
备注 24
第3章  验证 27
3.1  结构化控制语句 27
3.2  预期函数的定位 28
3.3  替换原则 31
3.4  代码序列 33
3.5  跟踪表 35
3.6  if语句 36
3.7  条件分支跟踪表 40
练习 43
备注 44
第4章  迭代的验证 45
4.1  while语句 45
4.2  循环中止的验证 47
4.3  已初始化循环 48
4.4  为独立的循环编写预期函数 50
4.5  其他形式的不定迭代 53
练习 55
备注 57
第5章  基于预期函数的程序设计 59
5.1  Pascal程序:最长一行的长度 59
5.2  C程序:统计字符及数字的出现次数 65
5.3  Icon程序:字符串解压缩 71
5.4  抽象化的探讨:登记注册系统 76
5.5  让事情简单 81
练习 85
备注 86
第6章  验证过程的回顾 89
6.1  为什么验证必须回顾 89
6.2  净室过程中的验证回顾 90
6.3  验证回顾是如何完成的 91
6.4  示例:注册登记系统的另一个例程 93
6.5  示例:测试数据生成器例程 95
6.6  示例讨论 100
练习 102
备注 102
第7章  定迭代 105
7.1  序列上的定迭代 105
7.2  序列变量 107
7.3  其他序列表达式 110
7.4  整型值的范围 113
7.5  其他数据结构 115
7.6  迭代机制 118
7.7  程序设计中的集合与序列 123
练习 126
备注 127
第8章  数据抽象与面向对象编程 129
8.1  数据抽象与封装 129
8.2  抽象函数 132
8.3  数据不变性 134
8.4  面向对象编程 139
练习 144
备注 144
第9章  递归与函数化语言 145
9.1  递归例程 145
9.2  终止 149
9.3  相互递归 150
9.4  函数化语言 152
练习 158
备注 158
第10章  测试 159
10.1  测试的角色 159
10.2  基于使用的测试 161
10.3  测试数据生成器 162
10.4  测试的其他方式 167
练习 168
备注 168
第11章  增量开发 171
11.1  用增量的方式开发程序 171
11.2  计划与实现的过程 173
11.3  示例:排演计划 174
练习 178
备注 178
第12章  我们将走向何方 181
12.1  净室过程的其他部分 181
12.2  其他的形式方法 183
12.3  我们学会了什么 187
12.4  展望未来 190
备注 192
部分习题的提示 195
参考文献 197

教学资源推荐
作者: (美)Paul Ammann     乔治&
作者: 尤克 常敏慧
作者: (美)塞巴斯蒂安·拉施卡(Sebastian Raschka),瓦希德·米尔贾利利(Vahid Mirjalili)著
参考读物推荐
作者: 段群杰 霍艳忠 杜旭 等编著
作者: 李少白 何星 著