编辑推荐
《敏捷软件开发:原则模式与实践》是综合性、实用性的敏捷开发和极限编程方面的指南,讲述了在预算和时间要求下软件开发人员和项目经理如何使用敏捷开发完成项目:使用真实案例讲解如何用极限编程来设计、测试、重构和结对编程;包含了极具价值的可重用的C++和Java源代码;还重点讲述了如何使用UML和设计模式解决面向客户系统的问题。《敏捷软件开发:原则模式与实践》于2003年荣获第13届软件开发图书震撼大奖,适于用作高校计算机专业本科生、研究生和软件学院的软件工程和软件开发相关课程的教材或参考书,也适于软件开发和管理人员提高自身水平学习之用。
内容简介
《敏捷软件开发:原则模式与实践》由享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的zui棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。1.讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目;2.使用真实案例讲解如何用极限编程来设计、测试、重构和结对编程;3.包含了极具价值的可多次使用的C++和JAVA源代码;4.重点讲述了如何使用UML和设计模式解决面向客户系统的问题。
作者简介
Robert C.Martin是Object Mentor公司的总裁。Martin和他的软件咨询队伍使用面向对象设计、模式、UML、敏捷方法学和极限编程,在世界各地都有他们的客户。他还是好几本畅销书的作者。他还是1996-1999年《C++ Report》杂志的总编,并多次在国际会议和展览中发表富有特色的演讲。
精彩书评
第13届软件开发震撼大奖获奖作品;国际软件工程和开发大师力作;众多名家一致推荐的敏捷开发指南;软件工程发展史上的里程碑性巨著。希望你能喜爱这本书。希望你能像我一样学着以创建美的软件而骄傲,并享受其中的快乐。如果你从本书中略微看到了这种快乐,如果本书使你感受到了这种骄傲,如果本书点燃了你内心欣赏这种美的火花,那么就远超过我的目标了。
目录
第Ⅰ部分 敏捷开发
第一章 敏捷实践
1.1 敏捷联盟
1.2 原则
1.3 结论
参考文献
第二章 极限编程概述
2.1 极限编程实践
2.2 结论
参考文献
第三章 计划
3.1 初始探索
3.2 发布计划
3.3 迭代计划
3.4 任务计划
3.5 迭代
3.6 结论
参考文献
第四章 测试
4.1 测试驱动的开发方法
4.2 验收测试
4.3 结论
参考文献
第五章 重构
5.1 素数产生程序一个简单的重构示例
5.2 结论
参考文献
第六章 一次编程实践
6.1 保龄球比赛
6.2 结论
第Ⅱ部分 敏捷设计
第七章 什么是敏捷设计
7.1 软件出了什么错
7.2 设计的臭味——腐化软件的气味
7.3 “Copy”程序
7.4 保持尽可能好的设计
7.5 结论
参考文献
第八章 单一责任原则(SRP)
8.1 单一职责原则(SRP)
8.2 结论
参考文献
第九章 开放—封闭原则(OCP)
9.1 开放—封闭原则(OCP)
9.2 描述
9.3 关键是抽象
9.4 结论
参考文献
第十章 Liskov替换原则(LSP)
10.1 Liskov替换原则(LSP)
10.2 一个违反LSP的简单例子
10.3 正方形和矩形,更微妙的违规
10.4 一个实际的例子
10.5 用提取公共部分的方法代替继承
10.6 启发式规则和习惯用法
10.7 结论
参考文献
第十一章 依赖倒置原则(DIP)
11.1 依赖倒置原则(DIP)
11.2 层次化
11.3 一个简单的例子
11.4 熔炉示例
11.5 结论
参考文献
第十二章 接口隔离原则(ISP)
12.1 接口污染
12.2 分离客户就是分离接口
12.3 接口隔离原则(ISP)
12.4 类接口与对象接口
12.5 ATM用户界面的例子
12.6 结论
参考文献
第Ⅲ部分 薪水支付案例研究
第十三章 COMMAND模式和ACTIVE OBJECT模式
第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托
第十五章 FACADE模式和MEDIATOR模式
第十六章 SINGLETON模式和MONOSTATE模式
第十七章 NULL OBJECT模式
第十八章 薪水支付案例研究:第一次迭代开始
第十九章 薪水支付案例研究:实现
第Ⅳ部分 打包薪水支付系统
第二十章 包的设计原则
第二十一章 FACTORY模式
第二十二章 薪水支付案例研究(第2部分)
第Ⅴ部分 气象站案例研究
第二十三章 COMPOSITE模式
第二十四章 OBSERVER模式——回归为模式
第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式
第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API
第二十七章 案例研究:气象站
第Ⅵ部分 ETS案例研究
第二十八章 VISITOR模式
第二十九章 STATE模式
第三十章 ETS框架
附录
附录A UML表示法Ⅰ:CGI示例
附录B UML表示法Ⅱ:统计多路复用器
附录C 两个公司的讽刺小品
附录D 源代码就是设计
索引
精彩书摘
7.2 设计的臭味——腐化软件的气味
当软件出现下面任何一种气味时,就表明软件正在腐化。
僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。
脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。
牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。
粘滞性(Viscosity):做正确的事情比做错误的事情要困难。
不必要的复杂性(Needless Complexity):设计中包含有不具任何直接好处的基础结构。
不必要的重复(Needless Repetition):设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一
。晦涩性(Opacity):很难阅读、理解。没有很好地表现出意图。
1.僵化性
僵化性是指难以对软件进行改动,即使是简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。
大部分的开发人员都以这样或者那样的方式遇到过这种情况。他们会被要求进行一个看起来简单的改动。他们看了看这个改动并对所需的工作做出了一个合理的估算。但是过了一会儿,当他们实际进行改动时,会发现有许多改动带来的影响自己并没有预测到。他们发现自己要在庞大的代码中搜寻这个变动,并且要更改的模块数目也远远超出最初估算。最后,改动所花费的时间要远比初始估算长。当问他们为何估算得如此不准确时,他们会重复软件开发人员惯用的悲叹,“它比我想像的要复杂得多!”
2.脆弱性
脆弱性是指,在进行一个改动时,程序的许多地方就可能出现问题。常常是,出现新问题的地方与改动的地方并没有概念上的关联。要修正这些问题就又会引出更多的问题,从而使开发团队就像一只不停追逐自己尾巴的狗一样(忙得团团转)。
随着模块脆弱性的增加,改动会引出意想不到的问题的可能性就越来越大。这看起来很荒谬,但是这样的模块是非常常见的。这些模块需要不断地修补——它们从来不会被从错误列表中去掉,开发人员知道需要对它们进行重新设计(但是谁都不愿意去面对重新设计中的难以琢磨性),你越是修正它们,它们就变得越糟。
3.牢固性
牢固性是指,设计中包含了对其他系统有用的部分,但是要把这些部分从系统中分离出来所需要的努力和风险是巨大的。这是一件令人遗憾的事,但却是非常常见的事情。
4.粘滞性
粘滞性有两种表现形式:软件的粘滞性和环境的粘滞性。
当面临一个改动时,开发人员常常发现会有多种改动的方法。其中,一些方法会保持设计;而另外一些会破坏设计(也就是生硬的手法)。当那些可以保持系统设计的方法比那些生硬手法更难应用时,就表明设计具有高的粘滞性。做错误的事情是容易的,但是做正确的事情却很难。我们希望在软件设计中,可以容易地进行那些保持设计的变动。
……
前言/序言
《代码魔法:重塑软件开发的艺术与科学》 引言 在瞬息万变的数字浪潮中,软件开发已不再是单纯的编码堆砌,而是一门融合了艺术、科学与哲学的生活方式。从最初简单的指令集,到如今支撑起全球经济运行、连接亿万人群的庞大系统,软件的力量渗透到我们生活的方方面面。然而,伴随着其复杂度的指数级增长,软件开发的挑战也日益严峻。如何才能在快速变化的需求、不断涌现的技术以及对质量的极致追求之间找到平衡?如何才能构建出既能适应未来,又能为用户带来卓越体验的优秀软件?《代码魔法:重塑软件开发的艺术与科学》正是一部致力于探索这些核心问题的著作,它将带领读者踏上一段关于软件开发本质的深度旅程。 本书并非一篇冰冷的教程,更像是一次与经验丰富的开发者、思想深邃的架构师的深度对话。我们不拘泥于单一的技术栈或特定的开发流程,而是着眼于那些能够跨越语言、跨越框架、跨越时代、赋予软件生命力的普适性原则和深层实践。从“什么”到“为什么”,从“如何做”到“为何如此”,我们将层层剥开软件开发的奥秘,揭示那些隐藏在优秀代码背后的智慧。 第一篇:软件的灵魂——思想的基石 在一切技艺的背后,都存在着支撑其长盛不衰的思想根基。软件开发亦不例外。本篇将深入探讨软件开发的底层哲学,挖掘那些决定项目成败、团队效率乃至产品生命周期的核心理念。 需求的本质与演进: 我们将首先剖析“需求”这一软件开发的源头活水。需求不仅仅是用户的一句口头表达,它是用户痛点的映射,是商业目标的载体,更是软件存在的价值所在。本书将深入探讨如何理解需求的深层含义,如何捕捉那些隐晦未言的期望,以及如何在不断变化的环境中,建立起一套灵活而有效的需求管理机制。我们将审视“瀑布式”需求的僵化与“敏捷式”需求的灵活,探讨不同需求模式下的挑战与机遇,以及如何通过迭代和反馈,让需求与产品一同成长。 设计的思维: 设计是软件的骨骼与血肉。一个优秀的设计,能够让代码清晰、易于维护、易于扩展,并且能够抵御时间的侵蚀。本篇将从多个维度审视“设计”的艺术。我们将探讨“简单性”原则在设计中的重要性,如何避免不必要的复杂性,让软件如同自然界一样,在简洁中蕴藏着强大的生命力。同时,我们将深入分析“模块化”、“解耦”等核心设计思想,阐述它们如何帮助我们构建出更具弹性的系统。书中还会涉及“抽象”、“封装”等概念,解析它们如何帮助我们管理复杂的软件世界,让开发者能够专注于更高层次的逻辑。 质量的定义与追求: 质量,是软件的生命线。它关乎用户体验、商业信誉,甚至系统的稳定性与安全性。本书将重新定义“质量”,将其从简单的“没有Bug”拓展到“易于理解”、“易于修改”、“高效运行”、“安全可靠”等多个维度。我们将探讨如何在开发的全过程中,将质量内化为一种文化,而不是事后补救。从代码审查到自动化测试,从持续集成到度量分析,我们将展示一系列行之有效的实践,帮助开发者在代码的每一个角落都播下质量的种子。 协作的艺术: 现代软件开发已不再是孤军奋战,而是团队协作的结晶。有效的沟通、清晰的职责、互信互助的氛围,是团队能够高效运转的关键。本篇将深入探讨“协作”的内在规律。我们将分析不同团队结构下的优劣,探讨如何建立起开放、透明的沟通渠道,以及如何通过共享知识、互相学习来提升整个团队的能力。书中将涉及“反馈回路”的重要性,以及如何利用它来驱动团队的持续改进。 第二篇:代码的语言——实践的精髓 思想的孕育离不开实践的滋养。本篇将把抽象的原则转化为具体的行动指南,为开发者提供一套切实可行的技艺,帮助他们在日常开发中将设计思想落地,将质量理念贯穿始终。 整洁代码的修炼: “整洁代码”是衡量一名开发者专业水准的重要标准。它不仅仅是写出能运行的代码,更是写出易于他人理解、易于自己修改的代码。本书将系统性地阐述构建整洁代码的方法论。我们将从命名规范、函数设计、类结构、注释艺术等多个层面,提供具体的可行建议。书中还将涉及“代码味道”的识别与消除,帮助读者掌握“重构”这一强大的工具,让代码在迭代中不断焕发新生。 测试驱动的开发: 测试不仅仅是验证代码正确性的最后一道防线,更是指导设计的强大力量。本篇将深入探讨“测试驱动开发”(TDD)的理念与实践。我们将解析TDD如何帮助我们写出更具可测试性、更少Bug的代码,如何驱动出更优良的设计。本书将涵盖单元测试、集成测试、端到系统测试等不同层级的测试策略,并探讨如何构建一个坚实的自动化测试体系,为软件的持续演进保驾护航。 持续集成的力量: 软件开发的效率很大程度上取决于集成过程的顺畅度。本篇将揭示“持续集成”(CI)的强大魔力。我们将解析CI如何通过频繁的代码合并、自动化构建与测试,来加速反馈循环,尽早发现并解决集成问题。书中将介绍CI的最佳实践,以及如何将其与版本控制系统、自动化测试紧密结合,构建起一套高效的持续交付流水线。 领域驱动设计的智慧: 对于复杂业务场景的软件开发,如何有效地捕捉和映射业务领域的需求,是设计的关键。本篇将深入探讨“领域驱动设计”(DDD)的核心思想。我们将解析“领域”、“模型”、“限界上下文”、“聚合”等概念,并阐述如何通过DDD来构建出与业务紧密贴合、易于理解和演进的软件系统。本书将提供丰富的案例分析,展示DDD在实际项目中的应用。 架构的演进与适应: 软件架构是系统的骨架,它决定了系统的可扩展性、可维护性和健壮性。本篇将审视不同架构风格的特点与适用场景,从单体到微服务,从面向服务到事件驱动。我们将探讨架构的演进过程,以及如何在不断变化的需求和技术环境中,做出明智的架构决策。书中将强调“适应性”与“演进性”,帮助读者构建能够随时间而灵活调整的软件体系。 第三篇:演进的艺术——持续的精进 软件开发并非一蹴而就的工程,而是一个持续演进、不断优化的过程。本篇将带领读者关注软件的生命周期,以及如何在漫长的演进过程中,保持软件的活力与竞争力。 度量与反馈: 了解软件的真实状况,是持续改进的前提。本篇将深入探讨“度量”的重要性,以及如何通过有效的度量来发现潜在的问题和改进空间。我们将审视代码复杂度、Bug密度、性能指标、用户反馈等关键度量项,并探讨如何建立起一套行之有效的反馈回路,将度量结果转化为具体的行动。 技术的选择与迭代: 技术日新月异,如何在快速变化的技术浪潮中保持清醒,做出明智的技术选择,并进行有效的技术迭代,是开发者面临的重要课题。本书将提供一套评估技术可行性、风险和收益的框架,并探讨如何在保持稳定性的前提下,拥抱新技术,驱动软件的持续进步。 重构的策略与实践: 代码会随着时间的推移而“腐化”,重构是让代码重获生命力的关键手段。本篇将系统性地讲解重构的原则、模式和技巧。从“提炼函数”、“合并方法”到“抽取类”、“替换继承关系”,我们将提供一系列实用的重构手段,帮助开发者在不改变软件外在行为的前提下,优化代码结构,提升代码质量。 团队的成长与文化的建设: 优秀的软件离不开优秀的团队。本篇将关注团队的成长与文化的建设。我们将探讨如何建立起一个学习型组织,如何通过知识分享、代码评审、导师制等方式,不断提升团队的整体能力。同时,本书将强调“信任”、“责任”、“透明”等价值观在团队文化中的重要性,以及它们如何驱动团队的持续进步。 结语 《代码魔法:重塑软件开发的艺术与科学》旨在成为您软件开发旅程中的一位良师益友。它不提供包治百病的万能钥匙,而是提供一套观察世界、思考问题、解决问题的通用方法论。无论您是初出茅庐的开发者,还是经验丰富的架构师,本书都将以其深刻的洞察力、严谨的逻辑和丰富的实践案例,为您带来启迪与收获。 我们相信,通过对软件开发本质的深入理解,对核心原则的坚守,以及对精湛技艺的不断追求,每一位开发者都能成为代码的魔法师,创造出真正有价值、有生命力的软件产品,为数字世界增添更多的美好与可能。愿这本书能点燃您心中的火种,带领您在软件开发的道路上,不断探索,不断超越。