新書推薦:
《
妈妈的情绪,决定孩子的未来
》
售價:HK$
42.6
《
推拿纲目
》
售價:HK$
403.2
《
精致考古--山东大学实验室考古项目论文集(一)
》
售價:HK$
244.2
《
从天下到世界——国际法与晚清中国的主权意识
》
售價:HK$
76.2
《
血色帝国:近代英国社会与美洲移民
》
售價:HK$
58.2
《
海外中国研究·王羲之:六朝贵族的世界(艺术系列)
》
售價:HK$
178.1
《
唐宋绘画史 全彩插图版
》
售價:HK$
98.6
《
海洋、岛屿和革命:当南方遭遇帝国(文明的另一种声音)
》
售價:HK$
106.4
|
編輯推薦: |
●全面阐述敏捷原则、实践与设计精髓的圣经
●《敏捷宣言》联名签署人六年沉淀而成的经典
●荣获第13届《软件开发》杂志JOLT卓越大奖
●计算机软件工程五十年发展史上的里程碑式著作
●正本《敏捷软件开发》=原则 模式 应用 敏捷非敏捷故事
《敏捷软件开发珍藏版》高屋建瓴,针对软件开发流程中存在的顽疾,深入阐述敏捷开发、敏捷设计和极限编程,同时借助于有针对性的三大案例,从原则、模式到实践,全路径打通了敏捷的落地路径,真正有效地帮助软件从业人员看清软件开发中的实质性问题并真正夯实代码基础,帮助2640万名软件工程师从源头上提升解决软件开发问题的能力。
|
內容簡介: |
《敏捷软件开发珍藏版》作为敏捷软件开发的里程碑之作,重点介绍了敏捷软件开发的原则、模式和实践。全书共6部分30章4个附录,以场景化方式阐述了什么敏捷软件开发的核心,强调了工程实践是敏捷软件开发的重要基石。本书的写作风格诙谐幽默,巧妙地通过通俗易懂和画面感十足的的表述漫画来帮助读者理解可能枯燥晦涩的专业技术要点。 《敏捷软件开发珍藏版》适合真正想要通过敏捷方式来提升软件开发技能以及及时交付软件价值的所有读者阅读和参考。
|
關於作者: |
作者简介
罗伯特C.马丁(Robert C. Martin)
业内人士尊称的 鲍勃大叔(Uncle Bob),是国际知名的软件工程师和导师,一位有五十多年健康编码经验的程序员。cleancoders.com联合创始人和Uncle Bob咨询公司创始人,主要提供软件咨询、技能培训和视频教学服务。他在专业技术领域具有较深的造诣。除了担任C Report杂志的总编辑,他还发表了大量有影响力的文章,受邀在许多国际性软件大会上发表演讲。他是SOLID五大原则的奠基人,是《敏捷宣言》联合签署人并担任过敏捷联盟第一届主席。他擅长的主题有软件匠艺、敏捷软件开发和测试驱动开发等。马丁是个终生学习者,52年出生的他,还在学习飞行驾驶员。
译者简介
鄢倩
ThoughtWorks中国区区块链事业部的技术负责人,《架构整洁之道》技术审校者。作为活跃在技术一线的技术顾问,他一直在为多家通信和金融企业提供基于敏捷精益原则的转型服务,在云服务系统中指导和实施DDD、持续集成和持续交付等技术实践。在公司内部,还以技术负责人的身份带领团队交付软件、攻关技术难点以及培养团队工程师文化。鄢倩致力于帮助企业接入区块链生态和引领商业变革,他的主要兴趣领域是区块链、领域驱动设计和微服务架构等方向。
徐进
ThoughtWorks软件开发工程师。在汽车和电商领域有丰富的软件开发经验。对敏捷开发流程和相关敏捷实践有深入的理解,对面向对象编程范式和软件设计模式有深入的研究与实践。徐进的主要兴趣点在于基础设施即代码、微服务与云原生技术领域的演进和发展。
|
目錄:
|
第I 部分 敏捷开发
第1 章 敏捷实践 003
第2 章 极限编程实践 011
第3 章 计划 023
第4 章 测试 029
第5 章 重构 039
第6 章 一次编程活动 055
第II 部分 敏捷设计
第7 章 什么是敏捷设计 109
第8 章 单一职责原则(SRP) 121
第9 章 开放- 关闭原则(OCP) 127
第10 章 里氏替换原则(LSP) 141
第11 章 依赖倒置原则(DIP) 161
第12 章 接口隔离原则(ISP) 171
第III 部分 薪水支付系统
第13 章 命令模式和主动对象模式 191
第14 章 模板方法模式和策略模式:继承和委托 203
第15 章 外观模式和中介者模式 219
第16 章 单例模式和单状态模式 225
第17 章 空对象模式 239
第18 章 案例学习:薪水支付系统(一) 243
第19 章 案例学习:薪水支付系统(二) 257
第Ⅳ部分 打包薪水支付系统
第20 章 包的设计原则 317
第21 章 工厂模式 339
第22 章 薪水支付系统(三) 347
第Ⅴ部分 气象站案例
第23 章 组合模式 369
第24 章 观察者模式:回归为模式 373
第25 章 抽象服务器,适配器和桥接模式 397
第26 章 代理模式和 STAIRWAY TO HEAVEN 模式:管理第三方API 409
第27 章 案例学习:气象站 443
第Ⅵ部分 ETS 案例
第28 章 访问者模式 483
第29 章 状态模式 525
第30 章 ETS 框架 554
附录
附录A UML 表示法(一):CGI 示例 584
附录B UML 表示法(二):统计多路复用器 611
附录C 两家公司的讽刺故事 633
附录D 源码即设计 649
第I 部分 敏捷开发
第1 章 敏捷实践 003
敏捷联盟 004
敏捷宣言 004
敏捷软件开发宣言 004
个体交互优先于过程和工具 005
可以工作的软件优先于面面俱到的文档 005
客户合作优先于合同谈判 006
响应变化优先于遵循计划 007
原则 007
小结 010
参考文献 010
第2 章 极限编程实践 011
极限编程实践 011
客户团队成员 012
用户故事 012
短交付周期 013
验收测试 014
结对编程 014
测试驱动开发 015
集体所有权 015
持续集成 015
可持续的开发速度 016
开放的工作空间 016
规划游戏 017
简单设计 017
重构 018
隐喻 019
小结 020
参考文献 020
详细目录
目 录XXIII
第3 章 计划 023
初探 024
探究、分解和速度 024
发布计划 025
迭代计划 025
任务计划 026
迭代中点 027
迭代 027
小结 027
参考文献 028
第4 章 测试 029
测试驱动开发(TDD) 029
测试先行设计的示例 030
测试隔离 032
意外获得的解耦 034
验收测试 034
验收测试的示例 035
意外获得的架构 037
小结 037
参考文献 038
第5 章 重构 039
素数生成器:一个简单的重构示例 040
最后再读一遍 049
小结 053
参考文献 054
第6 章 一次编程活动 055
保龄球比赛 056
小结 104
第II 部分 敏捷设计
第7 章 什么是敏捷设计 109
软件出了什么错 110
设计的臭味腐坏软件的气味 110
是什么诱发了软件的腐坏 113
敏捷团队不允许软件腐坏 113
Copy 程序 114
敏捷开发人员如何知道要做什么 119
保持尽可能好的设计 119
小结 120
参考文献 120
第8 章 单一职责原则(SRP) 121
单一职责原则(SRP) 122
什么是职责 123
分离耦合的职责 124
持久化 125
小结 125
参考文献 126
第9 章 开放- 关闭原则(OCP) 127
开放- 关闭原则(OCP) 128
描述 128
关键是抽象 128
Shape 程序 130
违背OCP 130
设计糟糕 133
遵循 OCP 133
是的,前面是在逗你玩儿呢 134
预测变化和自然的结构 135
放置钩子 135
吃一堑,长一智 136
刺激变化 136
使用抽象获得显式封闭性 136
使用数据驱动的方法获取封闭性 138
小结 140
参考文献 140
第10 章 里氏替换原则(LSP) 141
里氏替换原则(LSP) 141
一个违背 LSP 的简单例子 142
正方形和矩形,一个更不容易察觉的违背OCP 的例子 143
真正的问题 147
有效性并非本质属性 148
IS-A 是关于行为的 148
基于契约的设计 149
在单元测试中制定契约 150
一个实际的例子 150
动机 150
问题 152
不符合 LSP 的解决方案 153
符合 LSP 的解决方案 154
用提取公共部分的重构手法代替继承 155
启发式规则和习惯用法 158
派生类中的退化方法 158
从派生类中抛出异常 159
小结 159
参考文献 159
第11 章 依赖倒置原则(DIP) 161
依赖倒置原则(DIP) 161
层次化 162
倒置的接口所有权 163
依赖于抽象 164
一个简单的例子 165
找出潜在的抽象 166
暖炉示例 167
动态多态性和静态多态性 169
小结 170
参考文献 170
第12 章 接口隔离原则(ISP) 171
接口污染 171
分离客户端就是分离接口 173
客户端接口施加的反作用力 173
ISP:接口隔离原则 174
类接口和对象接口 174
通过委托来隔离 175
使用多重继承隔离接口 176
示例:ATM 的用户界面的例子 177
多参数形式(Polyad)和单参数形式(Monad) 183
对客户端进行分组 183
改变接口 184
小结 184
参考文献 184
第III 部分 薪水支付系统
第13 章 命令模式和主动对象模式 191
第14 章 模板方法模式和策略模式:继承和委托 203
第15 章 外观模式和中介者模式 219
第16 章 单例模式和单状态模式 225
第17 章 空对象模式 239
第18 章 案例学习:薪水支付系统(一) 243
第19 章 案例学习:薪水支付系统(二) 257
第Ⅳ部分 打包薪水支付系统
第20 章 包的设计原则 317
第21 章 工厂模式 339
第22 章 薪水支付系统(三) 347
第Ⅴ部分 气象站案例
第23 章 组合模式 369
第24 章 观察者模式:回归为模式 373
第25 章 抽象服务器,适配器和桥接模式 397
第26 章 代理模式和 STAIRWAY TO HEAVEN 模式:管理第三方API 409
第27 章 案例学习:气象站 443
第Ⅵ部分 ETS 案例
第28 章 访问者模式 483
第29 章 状态模式 525
第30 章 ETS 框架 554
附录
附录A UML 表示法(一):CGI 示例 584
附录B UML 表示法(二):统计多路复用器 611
附录C 两家公司的讽刺故事 633
附录D 源码即设计 649
|
內容試閱:
|
1999 年, UML World 的克劳迪亚(Claudia Frers)调侃说:老兄,你说过去年写完这本书的。
敏捷开发是一种面对迅速变化的需求,快速开发软件的能力。为了获得这种敏捷性,我们需要使用一些可以提供必要纪律和反馈的实践。我们需要使用一些可以保持我们的软件灵活且可维护的设计原则,并且我们需要知道一些已经被证明针对特定的问题可以平衡这些原则的设计模式。本书试图把所有这三个概念编织在一起,使其成为一个有机的整体。
本书首先描述了这些原则、模式以及实践,然后通过学习一些案例来演示它们的具体应用。更重要的是,案例介绍的并不是最终完成的结果,而是我们的设计过程。你会看到设计者犯的错误;你会看到他们如何识别并最终改正错误;你会看到他们如何对难题进行苦思冥想以及如何进行权衡,如何苦恼于含糊不清的问题;你会看到设计的艺术。
细节之美
本书包含许多的Java 和C 代码。我希望你仔细学习这些代码,因为在很大程度上,代码才是本书的要旨。代码是本书主题的具体实现。
本书采用一种重复的讲解方式。它由一系列不同规模的案例组成。有一些非常小,有一些却需要用好几章的篇幅来描述。每个案例之前都有一些有针对性的预备内容。例如,在薪水支付案例之前,就有一些章节在描述该案例中用到的面向对象设计原则和模式。
本书首先对开发实践和过程进行讨论,穿插了许多小的案例研究以及示例。然后话锋一转,谈论敏捷设计和设计原则,接着介绍一些设计模式、更多包管理的设计原则以及模式。所有这些主题都附有案例。
因此,请准备好阅读一些代码并钻研一些 UML 图。这本书技术性很强,要讲的知识点都隐藏在细节中,细节是魔鬼。
本书前传
大约在 6 年前,我写过一本书,书名为《C 面向对象程序设计:Booch 方法》。这是我的一部重要作品,影响力和销量都让我感到非常满意。
本书原本是它的第2 版。但事与愿违,能够保留下来的内容非常少。
本书只保留了其中三章内容,而且还有大幅度的修改。但两本书的意图、精神主旨和许多知识是相通的。但在《C 面向对象程序设计》出版后的6 年,我在软件设计方面又学到了非常多的知识,这些都体现在这本书中。
再说,《C 面向对象程序设计》出版于互联网爆炸式流行的前夕。此后,软件行业的新名词在数量上已经翻了一倍,设计模式、Java、EJB、RMI、J2EE、XML、XSLT、HTML、ASP、JSP、Servlets、Application Servers、ZOPE、SOAP、C# 和.NET 等,多得让人眼花缭乱。把这些最近进展更新到那本书里是很困难的。
与Booch 合作
在接下来的两年,我们俩写了好几章的内容。当然,这些成果意味着我不可能在把自己的精力全部放在这本书上,但我觉得他的书值得我这样做。另外,当时我的计划也是写自己那本《C 面向对象程序设计》的第2 版,所以也不怎么上心。如果我要阐明一些东西的话,当然是想说一些新颖的。
1997 年,Booch 找到我,他写过一本非常成功的书,书名为《面向对象程序分析与设计》,邀请我和他一起写第3 版。我之前和他有过一些合作,也是他很多作品( 包括 UML) 的热心读者和参与者。于是,我愉快地答应了。我还邀请我的好友Jim Newkirk 一起参与完成这项工作。
糟糕的是,Booch 的第3 版并没有写成。正常时间本来就很难抽出时间来写书。更何况在浮躁的互联网泡沫时代。Booch 自己也忙于Rational 和Capapulse 等新的风投事务。就这样,写书的事情就停下来了。最后,我问Booch 和出版社是否可以把我们写好的几章加入自己的书中。他们很有风度地同意了。我们这本书里面的一些案例和UML 的章节就是这样来的。
极限编程的影响
1998 年末,XP 崭露头角并向我们所珍爱的对软件开发的信仰发起挑战。应该在写代码前创建大量UML 图,还是应该避开任何种类的UML 图直接写大量的代码?应该写大量的叙述性文档去描述设计,还是应该努力让代码本身就有解释能力和表现力,不需要借助于文档?
该不该结对编程?要不要在写产品代码前写测试?我们应该怎么做?
说实话,我是凑巧接触到这次革命的。20 世纪90 年代中后期,Object Mentor 公司帮助许多公司解决了面向对象(OO)设计和项目管理问题。我们帮助他们完成了很多项目。在合作过程中,我们慢慢向团队灌输我们自己的一些看法和实践。糟糕的是,这些看法和实践没有被记录下来,只是从我们这一侧口头传给另一侧的客户。
到了1998 年,我意识到我们需要把我们的过程和实践写下来,以便更好地传达给客户。于是,我在 C Report1 写了许多关于过程的文章。这些文章信息丰富,并且在某些情况下也很引人入胜,这些内容并不是对项目实际应用和看法的整理,而是在不经意间偏离了影响过我几十年的价值观。这是旁观者Kent Beck 看出来的。
与Kent 合作
1998 年末,当时我正为整理Object-Mentor 的过程而烦恼时,偶然接触到Kent 在极限编程(eXtreme Programming,XP)方面的一些著述。这些内容散布在维基①并与其他一些人的文字混在一起。尽管如此,通过一些努力,我还是抓住了他想要表达的重点。这激起了我相当大的兴趣,但仍然有一些困惑。XP 中的某些东西和我的开发过程观念完全吻合,但其他一些东西,比如缺乏明确的设计阶段,让我感到困惑不解。
我和Kent 来自完全不同的软件环境。他是公认的 Smalltalk 顾问,我却是大家公认的 C 顾问。这两个领域很难交流,貌似存在着库恩②思维范式的隔阂。
① http:c2.comcgiwiki,该网站中包含数量众多且涉及各种主题的论文。作者人数破千。据说,只有 沃德坎宁安(Ward Cunningham)才能使用几行 Perl代码发起一场社会变革。坎宁安是计算机程序员,也是维基之父,设计模式和敏捷软件方法的先驱之一。 他从普度大学获得交叉学科工学学士学位以及计算机科学的硕士学位。1995 年,他在波特兰模式知识库创建了第一个维基站点,致力于人、项目和模式。
② 写于 1995 至 2001 年之间的任何可信的学术作品中肯定使用过术语Kuhnian。它指的是《科学革命的结构》一书,作者是托马斯库恩,芝加哥大学出版社1962 年出版。
在其他情况下,我绝对不会邀请他为C Report 写文章。但我们对过程的共识填补了编程语言上的隔阂。1999 年 2 月,我在慕尼黑的 OOP 会议上遇到他。他演讲的主题是XP,我的演讲主题是面向对象设计原则,我们俩的会场正好面对面。由于没法听他的演讲,所
以我就在午餐时找到他。我们谈了XP,然后我邀请他为C Report写篇文章。他写的这篇文章很棒,描述了他和一位同事如何在1 小时左右的时间里对一个真实的系统进行彻底的设计改变。
在接下来的几个月,我按顺序整理并按顺序整理了一下我对XP的顾虑。我最大的顾虑是XP 软件过程中没有显式的预先设计阶段。
对此,我有些犹豫。难道我没有义务让我的客户乃至整个行业明白设计是值得花时间的吗?
最后,我认识到我自己其实也没有设计这个阶段。甚至在我写的所有关于设计、Booch 图和UML 图的文章和书籍中,也总是把代码作为验证这些图是否有意义的一种方式。在我所有的咨询项目中,我会先花一两个小时帮他们绘一些图,然后用代码来指导他们查验这些图。我开始明白了,虽然XP 对设计的措辞有些陌生(在库恩式的意义上③),但具体实践却是我很熟悉的。
③ 如果你在一篇文章中提到过两次库恩,就会有更高的可信度。
我对XP 的另一个担心倒非常容易消除。实际上,我本人一直是结对编程的拥趸和实践者。XP 使我可以光明正大地和同伴一起沉浸于编程的乐趣中。重构、持续集成以及在客户现场工作,都让我非常容易入戏,它们都非常接近于我先前建议客户采用的工作方式。
有一个XP 实践对我来说是个新发现。当你第一次听到测试优先的软件设计时,会觉得它似乎很平常。它指出,在写任何产品代码之前,要先写测试用例。写的所有产品代码都是为了让失败的测试用例能够得以通过。我最开始并没有预料到这种编码方式所带来的深远意义。测试先行,这个实践完全改变了我写软件的方式,让我变得更好。在本书中,你可以看出这个变化。书中有些代码写于1999 年以前。这些代码都是没有测试用例的。但是,所有写于1999 年之后的代码都带有测试用例,并且测试用例一般都是先出现的。我相信你会注意到这些不同。
就这样,到1999 年秋天,我确信Object Mentor 应该选用XP,并且,我要放弃自己写软件过程的想法。在表述XP 实践和过程方面,Kent 已经做了相当出色卓越的工作,相比之下,我自己原来那些不充分的尝试显得有些苍白无力。
本书的组织结构
第Ⅰ部分敏捷开发描述敏捷开发的概念。介绍敏捷宣言之后后,对极限编程进行概述,接着讨论很多关于个体极限编程实践的小案例特别是那些影响我们设计和编码方式的实践。
第Ⅱ部分敏捷设计谈论面向对象软件设计。首先提出问题,阐述了什么是设计。接下来讨论管理复杂性的问题和技术。最后,阐述面向对象类设计的一些原则。
第Ⅲ部分薪水支付系统是本书最大并且也最完整的案例。它描述一个简单的批处理薪水支付系统的面向对象设计和C 的实现。前几章描述该案例使用的一些设计模式。最后两章包含完整的案例学习。
第Ⅳ部分打包薪水支付系统首先描述面向对象包设计的一些原则,接着把前面一部分中提到的类进行打包,借此来阐明这些原则。
第Ⅴ部分气象站案例包含一个原本打算放入Booch 那本书第3 版的案例。气象站案例描述的是一个公司做出了一项重要的业务决策,阐明Java 开发团队对此所做出的反应。还描述了要用到的一些设计模式以及设计和实现。
第VI部分ETS案例描述作者亲自参与的一个真实项目。该项目在1999 年就已经产品化,是一个自动考试系统,美国注册建筑师委员会的注册考试的答题和评分系统。
附录 前两个附录包含用来描述 UML 表示法的几个案例。另外还有几个附录。
如何使用本书
如果你是一名开发人员??请从头到尾完整地阅读。本书主要是写给开发人员看的,它包含敏捷软件开发软件所需要的知识。可以首先学习实践,接着是原则,然后是模式,最后学习把它们全部联系起来的案例。整合所有这些知识可以帮助你完成项目。
如果你是一名管理人员或者业务分析师??请阅读第Ⅰ部分。这部分对敏捷原则和实践进行深入的讨论。内容涉及需求、计划、测试、重构以及编程。它会指导你构建团队和管理项目,指导最后完成项目。
如果你想学习UML??请首先阅读附录A,接着阅读附录 B,然后阅读第Ⅲ部分。这种阅读方式可以帮助你掌握UML 语法和用法。还可以帮助你自如地在UML 和Java 或C 等编程语言之间进行转换。
如果你想学习设计模式??要想找到一个特定的模式,可以使用设计模式列表找到自己感兴趣的模式。
要想在总体上学习模式,请阅读第Ⅱ部分,学习设计原则,然后阅读第Ⅲ部分、第Ⅳ部分、第Ⅴ部分以及第VI 部分。这些部分定义了所有模式及其典型的应用场景。
如果你想学习面向对象设计原则??请阅读第Ⅱ部分、第Ⅲ部分和及第Ⅳ部分。这几个部分描述了面向对象设计的原则及其用法。
如果你想学习敏捷开发方法??请阅读第Ⅰ部分。这部分描述的是敏捷开发,内容涉及需求、计划、测试、重构和编程。
如果你只是想笑一笑,看个热闹先??请阅读附录C,了解形成鲜明对比的两家公司。
资源
本书中的所有源代码可以从https:github.comunclebobPPP 下载。
|
|