2003年6月荣获美国《软件开发》第13届震憾(Jolt)大奖!
 好消息:本站将从参加本书预订的会员中抽取5-10名幸运会员,各免费赠送一本此书!
敏捷软件开发(中文版)

作者:Robert C.Martin 翻译:邓辉 审校:孟岩 定价:¥59元 出版日期:2003年9月

书评:《鲍勃大叔和他的拼图板》  《软件之美》(Martin为中文版作序)
______________________________________________________________________________________________________
样章试读:第1章 第2章 第3章
 作者简介 名家大师评语 译者评语 审校评语  我要购买 参加讨论
原书名:Agile Software Development: Principles, Patterns, and Practices
  在本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。
特色内容:●讲述在预算和时间要求下,软件开发人员和项目经理如何使用敏捷开发完成项目。●使用真实案例讲解如何用极限编程来设计、测试、量构和结对编程●包含了极具价值的可多次使用的C++和JAVA源代码。●重点讲述了如何使用UML和设计模式解决面向客户系统
作者Robert C. Martin简介
  Robert c. Martin 是Object Mentor公司的总载。 Mentor和他的软件咨询队伍使用面向对象设计、模式、UML、敏捷方法学和极限编程,在世界各地都有他们的客户。他还是好几本畅销书的作者,包括《Designing Object-Orient C++ Applications Using the Booch Method》(Prentice Hall,1995). Mentor博士还是《Pattern Languages of Program Design 3》(Addison-Wesley,1997)一书的主编、《More C++ Gems》(Cambrdge,1995)一书的编辑,以及《XP in Practice》(Addison-Wesley,2001)的合作作者。他还是1996-1999年《C++ Report》杂志的总编,并多次在国际会议和展览中发表富有特色的讲话。
名家大师的推荐语
Kent Beck:“前几天,我找到了一份记录了我对Uncle Bob第一印象的备忘录。上面写着,‘优秀的对象思想’。你手中持有的是能让你受益终生的'优秀的对象思想'。”

Martin Fowler:“我期待这本书已经很久了,关于如何去掌握我们的行业技能,Bob有非常丰富的实际经验可以传授。”

Craig Larman:“在本书中,Bob Martin向我们展示了他作为开发大师以及教育家的天赋。书中都是些重要的经验并且阅读起来就是一种享受。他以其务实的判断力和令人愉悦的风格给我们以启迪。”

Erich Gamma:“这本书中充满了对于软件开发的实用建议。不管你是想成为一个Agile开发人员,还是想提高已有的技能,本书都是同样有用的。我一直在期盼着这本书,它没有令我失望。”

John Vlissides:“这也许是第一本把Agile方法、模式和最新的软件开发基本原则完美地编织在一起的书籍。当Bob Martin发言时,我们最好洗耳恭听。”

Amazon对ASD PPP的评价片断:“没有其他的书籍同时具有这些主题:设计模式、测试驱动的开发方法以及面向对象设计的原则,并且还具有如此详尽的实例。”、“如果我只买两本面向对象设计的书籍,这会是其中之一。”、“我雇佣的所有人都必须要阅读此书。”、“这是是最好的面向对象设计的书籍。”、“如果你今年只买一本技术书籍的话,请买这一本。”

Review of Agile Software Development: Principles, Patterns, and Practices
本书译者:邓辉

  我看过很多有关软件开发方面的书籍,包括过程控制方面的、设计方面的以及最佳实践方面。确实也从其中学到了不少东西。但是,在具体的软件开发实践中,却没有取得期望的效果。经过一段时间的反思,我隐约觉得,应该还有某个存在于过程方法、设计原则以及最佳实践之外的东西来有机地把这三者结合起来,才能发挥这三者的最大效用。这种东西不是可以形式化的条条框框,而是活跃于人的大脑中的某种思维方法。看完了Robert Martin的Agile Software Development之后,我有一种豁然开朗的感觉。本书把这种思维方法阐述的再清晰不过。 本书具有两大特色。第一,很多讲述软件开发的书籍,要么是仅仅涉及过程方法方面的内容,要么是仅仅涉及设计原则方面的内容。这些做法相对于整个软件开发活动来说都是片面的。其实,过程方法、设计原则以及最佳实践是一个不可分割的整体。孤立地去使用任何一部分都无法获得最佳的效果。最有效的方法应该是根据自己开发团队的实际情况,找出一种能够有效地把这三者结合起来并使它们相互支持的方法。比如,大家都知道每周(日)构建是一种得到广泛认可的最佳实践方法,但并不是只要你每周(日)都去构建了,就能得到好的效果,有时,结果可能会更糟。要想使这种方法有效,还需要其他方面的支援。每周(日)构建的前提是软件必须是易于每周(日)构建的。也就是说,你需要对软件中的依赖关系进行管理,使之具有每周(日)构建的基础。而这种依赖关系的管理是需要设计原则来指导和度量的。这只是其中一个例子,本书中到处都体现着作者的这种主导思想和实践。如果读者能够在这个方面好好体会的话,肯定会对软件开发有一个更为全面、深入的理解,从而可以更加有效的去使用这些过程方法、设计原则以及最佳实践。
  第二,本书的核心是软件设计,但是它对软件设计的理解以及讲解方式非常的特别。许多有关软件设计的书籍中,要么先讲述一些设计原则、模式,然后再给出几个简单的在理想情况下的应用;要么是拿一个最终的设计结果来剖析,然后告诉你它们是多么的优美。当时,你可能真会那么认为,但是当你试图在自己的实际开发中应用时,总会发现情况是完全不一样的。此时,你要么束手无策,要么会误用设计原则、模式。究其原因,主要是因为,在此类书中所讲述的不是真正的设计,只是设计的部分内容,而忽略了设计中最为重要的方面。设计是人的思维的一种动态活动,是设计者针对自己的问题的思索、权衡、折中、选择的过程。其中会出现很多在理想情况下不会出现的问题,对这些问题的处理水平才是真正的设计水平。同样,本书中到处都是这样的思考过程。针对每个案例,作者都会和你一起思索、一起探讨、一起权衡、一起验证。本书中所展示的是一个个完整的设计活动过程。通过这些案例的学习,相信读者肯定会对设计有一个更深刻的理解。此外,本书中也讲述了很多的设计模式,但是和很多其他讲述模式的书不同的是,它更多的是在告诉你什么时候不要去使用模式,去抵制模式的诱惑,以免带来不必要的复杂性。在对模式狂热吹捧的今天,本书无疑是一剂纠偏良药,可以让你更加合理、有效地使用模式。 其实,这些内容正是软件开发活动中最本质,同时也是最难以琢磨的内容。要把这些内容通过文字表达出来更是非常困难的,这也是这方面的书籍凤毛麟角的原因。然而在本书中,Rober Martin先生能把这些内容编写得如此清晰、如此易于理解,充分展示了作者深厚的技术功底和卓越的表达能力。因此,本书能从众多优秀书籍中脱颖而出获得第13届Jolt大奖,就没有什么出乎意料了。
  本书主要包含4部分内容,这些内容对于今天的软件工程师都非常的重要,它们是:
  ●Agile方法:主要讲述了如何去使用Agile方法,其中有很大一部分内容是告诉你为什么要这样做。
  ●面向对象设计原则:本书包含了11个面向对象设计原则,涵盖了包的设计和类的设计。这是我所见过的对这方面内容讲解的最清晰、最彻底、最深刻的唯一的一本书。
  ●设计模式:本书中讲述了23个设计模式,并都有具体的实例。讲解的重点在如何在实际的应用中去使用模式,如何根据当前问题的上下文以及约束力去选择最适合的模式,以及何时避免使用模式。
  ●UML:本书不是关于UML的,但是为了让读者更好的理解书中的内容,作者使用了一些UML图来展示设计思路。同时,本书中也对如何有效的使用UML做了深入的阐述。本书中有两个附录专门对UML进行了简介。
  总之,本书是写给那些一线的软件工程师的。如果你想学习UML,如果你想学习如何去设计软件,如果你想学习设计模式,如果你想学习最好的软件开发实践,那么请阅读本书。
  感谢Robert Martin先生为我们写了一本如此优秀的著作,我从本书中学到了很多。我相信本书也不会令您失望。
七年等待换来的经典
本书审校:孟岩

  Robert C. Martin的经典著作Agile Software Development中文版面世,这是计算机技术出版领域的一件大喜事。即使在今天技术图书市场非常繁荣的局面下,这本书的问世也仍然是值得广大开发者格外留意和关注的事件。这不仅是因为它刚刚荣获2002年度Jolt震撼大奖,更因为这本书本身的价值和独特魅力。
  Robert Cecil Martin是软件开发领域里响当当的名字。1970年代,他还是个年轻小伙子的时候就是一位有名的UNIX黑客。经过长期的开发实践后,他成了软件开发领域中的知名专家。1990年代初,Rational软件公司首席科学家Grady Booch邀请他加盟,目的是要借助他丰富的实践经验,结合Booch自己的软件设计理念,开发一套创新性的软件产品。这是个什么软件呢?说起来大名鼎鼎,就是Rational ROSE的早期版本!在Rational公司期间,Martin丰富的实践经验与Booch深厚的理论功底形成了完美的组合,把面向对象设计的理论与实践推向了高峰。1994年,Grady Booch的经典著作《》问世,与此几乎同时,Martin的第一本著作Designing Object-Oriented C++ Application Using the Booch Method也由Prentice Hall出品。这两本书彼此相互辉映,当时引起了很大的反响。Martin的这本书结合了当时最流行的面向对象语言C++和最出色的面向对象设计建模方法Booch Method,以大量实例讲解技术概念和应用方法,分析透彻,讲解务实,技术精妙,在读者中声誉极佳。这本书不单为Martin确立了软件设计领域顶尖专家的地位,而且奠定了他独一无二的写作风格。Martin本人对这本书非常有感情,多年后,我给他写信谈到这本书,他还很得意地宣称,这本书是他的代表作,而且其中的大部分内容即使在今天也没有过时。没有十年磨一剑的功力,又怎能创造出长盛十年而不衰的经典?
  大约2001年10月,我的一位北大的朋友给我复印了Martin那本1995年的著作,我阅读之后,大为震撼,不惜重金从国外购买原版,同时尽力向其它朋友推荐。不少朋友阅读之后兴奋不可言状,甚至曾有人说:"读此书方知什么是面向对象设计",可见评价之高。唯一可惜的是,该书年代久远,不少东西显得陈旧。很自然的,我和我的朋友们对于该书的第二版都是翘首以待。大约在2002年4月,我从Amazon上看到了该书第二版的预订。当时的名字叫做Designing Object-Oriented C++ Application Using UML。我到全球新闻组上去调查了一番之后发现,不仅是我们,整个面向对象设计开发社群都在高度关注这本书的进展。已经被冠以"鲍勃大叔"昵称的R. C. Martin曾经承诺在1998年推出此书,结果一拖再拖,抻得整个开发社群群情激愤。本书前言开头有一幅漫画插图,一位叫做Claudia Frers的女士在1999年的UML World大会上愤怒地声讨鲍勃大叔:"可是你说过去年就可以完成这本书啊!"。面对读者爱极而怒的反应,我想鲍勃大叔虽然表面上不免尴尬,内心却一定是暗自欣喜的。而包括他在内的所有人,当时可能都想不到,这本书居然还要拖上三年,才会最终以全新的面貌出现在读者面前。
  我看到该书预订页面后,立刻请求一位师长帮我从Amazon上预订。之后,我就开始了漫长的等待。这是多么奇异的一段等待啊!我先是发现这本书的名字变了,变成了Designing Object-Oriented C++,没有"UML"了。书名变短了,不过看来内容是扩充了,因为预告篇幅增大到了700多页,这倒也不错。可是到了大约8月份,我突然发现,这本书不见了!在原来的网页上出现了一本名叫"Agile Software Development"的书,虽然作者也是Robert C. Martin,但只有500多页了。书名变短了,内容也缩水了!我立刻激愤,想不到Amazon也会来偷梁换柱这一招!忍耐了一段时间之后,我跑到comp.object上,见人就问:"您知道Bob大叔的那本C++书第二版哪去了?那本Agile Software Development是怎么回事?我的money还要得回来吗?…"其实我很清楚,Bob大叔本人就经常在这一片活动,我这招叫做"敲山震虎",这么一搅和,迟早Bob大叔本人会出来解释的。果不其然,两天之后,我收到署名"Uncle Bob"的一封来信,信中客气地说,这本Agile Software Development就是原来那本书的第二版。不过内容、风格已经完全变化了,应该算是一本全新的书。虽然书中大多数代码是用Java写的,但是Bob大叔向我保证,这本书的内容绝对对得起我付出的每分真金白银。
  OK,我还有什么可说的呢?Bob大树亲自出来解释,我当然满意了。在这个圈子里,如果连他都信不过,那还能相信谁?
  2002年10月底,一个大大的包裹放到了我的桌子上--ASD到了。从1995年第一版面世算起,整个面向对象设计社群经过了七年的漫长等待,终于等到了这本书。在这七年中,斗转星移,物是人非,多少英雄起来又落下,多少神话创生又破灭,当这本硬壳封面的精美图书沉甸甸地放在手上,怎能不让人感慨!
  其时不单国内很少有人拿到这本书,就是在美国,该书签名首发的活动也还在筹备中。因此,我可以有把握的说,我是全国最早阅读此书的五人之一。
  阅读这本书的过程,是一个充满了发现、领悟和兴奋的过程。我只读了其中几个章节,就已经知道这本书大大超过了事前的预期,是当代软件开发领域最杰出的著作之一。这个时候,Software Development Magazine每年一度的Jolt评奖工作正式开始,我冲到投票网站,毫不犹豫地给这本ASD投了一票。事后我愉快地得知,此书果然如我所愿地夺得了去年技术图书类最高奖项--Jolt震撼大奖。在阅读全书大约三分之一之后,我对于该书的主要特点和内容架构已经有了把握,于是跑到Amazon网站上,给该书写下了一篇评论,题目是:本年度的最佳设计类图书,在书评中我简单介绍了书的特点,并且做出结论:这本书不但肯定是2002年度最好的设计类技术图书,而且在今后的几年中,很难出现比它更好的作品。那篇短评是Amazon网站上对该书的第四篇评论,现在给这本书的评论大概已经几十篇了。回过头来看,能够为这本书的宣传做一点点事情,我感到非常高兴。
  当然,这并不是说我"慧眼独具",业内经验丰富、感官敏锐的高手大有人在。我听说在台湾,三位资深工程师联名上书某出版公司要求引进此书,并且自告奋勇去翻译。这些资深工程师收入丰厚,根本不是为了那点微薄的翻译酬劳而折腰,完全是希望能够把这本极有价值的好书介绍给更多的业内人士,造福大众。一本书能够引起这么大的热诚,可见它本身的魅力了。
  那么究竟这本书好在哪里呢?真正关心这个问题的读者,应该去阅读原著。任何第三方的评价,对于这本书来说,都只能是一种实质上的贬抑。Bob大叔是个实践大师,读者必须通过阅读实践,才能够真正体会到这本书的精妙之处。我只能谈谈这本书给我印象最深的三个特点,难免挂一漏万。
  首先,该书延续了Bob大叔著作的一贯特色,以实例为本,不尚空谈,因此格外真实,摄人心魄。Martin从多年的写作中提炼出一种独特的风格,就是"引领式传授"。与别的作者不同,面对问题,Martin不是把最后那个完美的答案一下子放在你面前,让你拜倒在他脚下,被他的睿智折服。他很清楚,当读者在大师面前拜倒时,内心充满了挫折感,同时会丧失自信。而自信是一个设计者由成功走向成功的最关键因素。因此,Martin还原了一个真实的设计过程--带领着读者一起设计。读者在书中能够看到,他也会犯错误,也要面临痛苦的选择,也会做一些愚蠢的决定,也会被一些"激动人心"的想法诱惑,但是,最后他能够跨越重重荆棘,看透重重迷雾,得到优秀的设计。他跟我们一样,是一个有血有肉的设计者,而不是什么天赋异禀的天才。正因为如此,他能达到的,我们也能达到。这样的风格,使我们从阅读中能够逐渐体会到软件设计最精髓的东西:张力与平衡。如何选择,如何思考,如何面对困境,这些才是最宝贵的财富。这些财富,就在我们自己的大脑里,而Martin的书,就是打开这个财富宝库的钥匙。此外,读者在阅读这本书的时候会发现,Martin在教授具体技术的时候,始终以实例教学为主。比如附录中教授UML,就是通过两个实例来教授UML基础知识。诸位不妨从这两个附录开始阅读此书,体会一下作者的风格,看一看在UML学习方面,究竟是传统的罗列式教材给你的印象更深,还是以实例为依托的Martin式风格更有效率。
  其次,详略得当。Martin很清楚哪些东西应该讲的细致一些,哪那些东西可以讲的抽象一些。这一点也是大师风范。软件设计这个领域,有很多东西是应该讲清楚,却很少有人能讲清楚的,比如设计中的权衡,实例的综合运用。还有很多东西,是没有必要长篇大论的,却被很多人拿来喋喋不休,比如说一些基本的设计原则或模式,一些开发过程思想,一些技术理念等等。这些东西讲得简明扼要能够给人以智慧的启迪,讲得冗长拖沓,定下几十上百条规则方法,则必然脱离实际,堵塞和束缚读者的思想。可惜很多作者不明白这个道理,或者是虽然明白但是假装不明白,把很多简明睿智的概念变成了又臭又长的裹脚布。Martin的书则决无此弊。这也应当归功与他多年的实践经验。从这本书中我们可以看到,他对于思想和原则一般是言简意赅,意到为止。而对于有助于提高读者实际设计能力的实例,则不惜笔墨,详加阐述,可谓煞费苦心。
  最后一点,也是相当重要的一点,是本书选材匠心读到,精彩绝伦,特别是还有大量独创性和创新性的技术,来自Martin多年来的研发实践,十分珍贵。这比之当下流行的抄袭之风,已经不可同日而语。比如本书的Acyclic Visitor,Extension Object,Monostate,Taskmaster等模式,并不属于经典的23模式,很多都是来自Martin自己的创造,配合实例解析,有助于大幅度提高读者的设计实践能力。
  总之,这本书是近年来难得的佳作,希望大家都来好好阅读和体会这本书,它将为你的设计能力带来一个质的提升,同时,也有助我们对"怎样算是一本好的技术图书"有更进一步的认识。
《软件之美》(Robert C. Martin为清华版《敏捷软件开发:原则、模式与实践》中文版序)
   除了我的家庭,软件是我的挚爱。通过它,我可以创造出美的东西。软件之美在于它的功能,在于它的内部结构,还在于团队创建它的过程。对用户来说,通过直观、简单的界面呈现出恰当特性的程序就是美的。对软件设计者来说,被简单、直观地分割,并具有最小内部耦合的内部结构就是美的。对开发人员和管理者来说,每周都会取得重大进展,并且生产出无缺陷代码的具有活力的团队就是美的。美存在于所有这些层次之中,它们都是本书内容的一部分。
   软件开发人员如何学到创造美的知识呢?在本书中,我讲授了一些原则、模式以及实践,它们可以帮助软件开发人员在追求美的程序、设计以及团队的道路上迈出第一步。其中,我们探索了基本的设计原则,软件设计结构的通用模式以及有助于团队融为一个有机整体的一系列实践。由于本书是关于软件开发的,所以包含了许多代码。仔细研究这些代码是学习本书所教授的原则、模式以及实践的最有效方法。
   人们需要软件--需要许多的软件。50年前,软件还只是运行在少量大型、昂贵的机器之上。30年前,软件可以运行在大多数公司和工业环境之中。现在,移动电话、手表、电器、汽车、玩具以及工具中都运行有软件,并且对更新、更好软件的需求永远不会停止。随着人类文明的发展和壮大,随着发展中国家不断构建它们的基础设施,随着发达国家努力追求更高的效率,就需要越来越多的软件。如果在所有这些软件之中,都没有美存在,这将会是一个很大的遗憾。
   我们知道软件可能会是丑陋的。我们知道软件可能会难以使用、不可靠并且是粗制滥造的;我们知道有一些软件系统,其混乱、粗糙的内部结构使得对它们的更改既昂贵又困难;我们还见过那些通过笨拙、难以使用的界面展现其特性的软件系统;我们同样也见过那些易崩溃且行为不当的软件系统。这些都是丑陋的系统。糟糕的是,作为一种职业,软件开发人员所创建出来的美的东西却往往少于丑的东西。如果你正在阅读这本书,那么你也许就是那个想去创造美而不是丑的人。
   最好的软件开发人员都知道一个秘密:美的东西比丑的东西创建起来更廉价,也更快捷。构建、维护一个美的软件系统所花费的时间、金钱都要少于丑的系统。软件开发新手往往不理解这一点。他们认为做每件事情都必须要快,他们认为美是不实用的。错!由于事情做得过快,他们造成的混乱致使软件僵化,难以理解。美的系统是灵活、易于理解的,构建、维护它们就是一种快乐。丑陋的系统才是不实用的。丑陋会降低你的开发速度,使你的软件昂贵而又脆弱。构建、维护美的系统所花费的代价最少,交付起来也最快。
   我希望你能喜爱这本书。我希望你能像我一样学着以创建美的软件而骄傲,并享受其中的快乐。如果你从本书中略微看到了这种快乐,如果本书使你开始感受到了这种骄傲,如果本书点燃了你内心欣赏这种美的火花,那么就远超过我的目标了。
(邓辉译)

The Beauty of Software
(Robert C. Martin's foreword for Agile Software Development Chinese Version)
   Next to my family, software is my passion. It is a medium in which I try to create beauty. The beauty of software is in it's function, in it's internal structure, and in the way in which it is created by a team. To a user, a program with just the right features presented through an intuitive and simple interface, is beautiful. To a software designer, an internal structure that is partitioned in a simple and intuitive manner, and that minimizes internal coupling, is beautiful. To developers and managers, a motivated team of developers making significant progress every week, and producing defect-free code, is beautiful. There is beauty on all these levels, and they are all part of the topic of this book.
   How do software developers learn how to create this beauty? In this book I teach the principles, patterns, and practices that can help software developers take the first steps towards beautiful programs, designs, and teams. In these pages we explore basic design principle, common patterns in the structure of a software design, and a set of practices that can help a team knit itself into a functioning whole. Since this book is about software development, it contains a lot of code. The principles, patterns, and practices that this book teaches are learned most effectively by carefully studying that code.
   Our world needs software -- lots of software. Fifty years ago software was something that ran in a few big and expensive machines. Thirty years ago it was something that ran in most companies and industrial settings. Now there is software running in our cell phones, watches, appliances, automobiles,toys, and tools. And need for new and better software never stops. As our civilization grows and expands, as developing nations build their infrastructures, as developed nations strive to achieve ever greater efficiencies, the need for more and more software continues to increase. It would be a great shame if, in all that software, there was no beauty.
   We know that software can be ugly. We know that it can be hard to use,unreliable, and carelessly structured. We know that there are software systems whose tangled and careless internal structures make them expensive and difficult to change. We know that there are software systems that present their features through an awkward and cumbersome interface. We know that there are software systems that crash and misbehave. These are ugly systems. Unfortunately, as a profession, software developers tend to create more ugly systems than beautiful ones. If you are reading this book, then you are someone who wants to create beauty and not ugliness.
  There is a secret that the best software developers know. Beauty is cheaper than ugliness. Beauty is faster than ugliness. A beautiful software system can be built and maintained in less time, and for less money, than an ugly one. Novice software developers don't understand this. They think that they have to do everything fast and quick. They think that beauty is impractical. No! By doing things fast and quick, they make messes that make the software stiff, and hard to understand. Beautiful systems are flexible and easy to understand. Building them and maintaining them is a joy. It is ugliness that is impractical. Ugliness will slow you down and make your software expensive and brittle. Beautiful systems cost the least to build and maintain, and are delivered soonest.
   I hope you enjoy this book. I hope you learn to take as much pride and joy in the creation of beautiful software that I do. If this book can show you just an inkling of that joy, motivate you to feel just the beginnings of that pride, and provide just a spark of appreciation for that beauty, then it has more than accomplished my goal for it.