什么是敏捷软件开发方法

出自 MBA智库百科()
敏捷开发(Agile development)
  敏捷开发是一种以人为核心、迭代、的开发方法。在敏捷开发中,软件的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小,并分别完成,在此过程中软件一直处于可使用状态。
  图:敏捷开发的路线图
  Test-Driven Development,。
  它是敏捷开发的最重要的部分。在ThoughtWorks,我们实现任何一个功能都是从开始,首先对业务需求进行分析,分解为一个一个的Story,记录在Story Card上。然后两个人同时坐在电脑前面,一个人依照Story,从业务需求的角度来编写测试代码,另一个人看着他并且进行思考,如果有不同的意见就会提出来进行讨论,直到达成共识,这样写出来的测试代码就真实反映了业务功能需求。接着由另一个人控制键盘,编写该测试代码的实现。如果没有测试代码,就不能编写功能的实现代码。先写测试代码,能够让开发人员明确目标,就是让测试通过。
  ,持续集成。
  在以往的软件开发过程中,集成是一件很痛苦的事情,通常很长时间才会做一次集成,这样的话,会引发很多问题,比如 build未通过或者单元测试失败。敏捷开发中提倡持续集成,一天之内集成十几次甚至几十次,如此频繁的集成能尽量减少冲突,由于集成很频繁,每一次集成的改变也很少,即使集成失败也容易定位错误。一次集成要做哪些事情呢?它至少包括:获得所有、编译源代码、运行所有测试,包括、功能测试等;确认编译和测试是否通过,最后发送报告。当然也会做一些其它的任务,比如说代码分析、测试覆盖率分析等等。在我们公司里,开发人员的桌上有一个火山灯用来标志集成的状态,如果是黄灯,表示正在集成;如果是绿灯,表示上一次集成通过,开发人员在这时候获得的代码是可用而可靠的;如果显示为红灯,就要小心了,上一次集成未通过,需要尽快定位失败原因从而让灯变绿。在上,我们公司使用的是自己开发的产品CruiseControl。
  Refactoring,重构。
  相信大家对它都很熟悉了,有很多很多的书用来介绍重构,最著名的是Martin的《重构》,Joshua的《从重构到模式》等。重构是在不改变系统外部行为下,对内部结构进行整理优化,使得代码尽量简单、优美、可扩展。在以往开发中,通常是在有需求过来,现在的系统架构不容易实现,从而对原有系统进行重构;或者在开发过程中有剩余时间了,对现在代码进行重构整理。但是在敏捷开发中,重构贯穿于整个开发流程,每一次开发者check in代码之前,都要对所写代码进行重构,让代码达到clean code that works。值得注意的是,在重构时,每一次改变要尽可能小,用单元测试来保证重构是否引起冲突,并且不只是对实现代码进行重构,如果测试代码中有重复,也要对它进行重构。
  Pair-Programming,结对编程。
  在敏捷开发中,做任何事情都是Pair的,包括分析、写测试、写实现代码或者重构。Pair做事有很多好处,两个人在一起探讨很容易产生思想的火花,也不容易走上偏路。在我们公司,还有很多事都是Pair来做,比如Pair学习,Pair翻译,Pair做PPT,关于这个话题,钱钱同学有一篇很有名的文章对它进行介绍,名为Pair Programming (结对编程)。
  Stand up,站立会议。
  每天早上,项目组的所有成员都会站立进行一次会议,由于是站立的,所以时间不会很长,一般来说是15-20分钟。会议的内容并不是需求分析、任务分配等,而是每个人都回答三个问题:1. 你昨天做了什么?2. 你今天要做什么? 3. 你遇到了哪些困难?站立会议让团队进行交流,彼此相互熟悉工作内容,如果有人曾经遇到过和你类似的问题,那么在站立会议后,他就会和你进行讨论。
  Frequent Releases,小版本发布。
  在敏捷开发中,不会出现这种情况,拿到需求以后就闭门造车,直到最后才将产品交付给客户,而是尽量多的产品发布,一般以周、月为单位。这样,客户每隔一段时间就会拿到发布的产品进行试用,而我们可以从客户那得到更多的反馈来改进产品。正因为发布频繁,每一个版本新增的功能简单,不需要复杂的设计,这样文档和设计就在很大程度上简化了。又因为简单设计,没有复杂的架构,所以客户有新的需求或者需求进行变动,也能很快的适应。
  Minimal Documentation,较少的文档。
  其实敏捷开发中并不是没有文档,而是有大量的文档,即测试。这些测试代码真实的反应了客户的需求以及系统API 的用法,如果有新人加入团队,最快的熟悉项目的方法就是给他看测试代码,而比一边看着文档一边进行debug要高效。如果用书面文档或者注释,某天代码变化了,需要对这些文档进行更新。一旦忘记更新文档,就会出现代码和文档不匹配的情况,这更加会让人迷惑。而在敏捷中并不会出现,因为只有测试变化了,代码才会变化,测试是真实反应代码的。这时有人会问:代码不写注释行吗?一般来说好的代码不是需要大量的注释吗?其实简单可读的代码才是好的代码,既然简单可读了,别人一看就能够看懂,这时候根本不需要对代码进行任何注释。若你觉得这段代码不加注释的话别人可能看不懂,就表示设计还不够简单,需要对它进行重构。
  Collaborative Focus,以合作为中心,表现为代码共享。
  在敏捷开发中,代码是归团队所有而不是哪些模块的代码属于哪些人,每个人都有权利获得系统任何一部分的代码然后修改它,如果有人看到某些代码不爽的话,那他能够对这部分代码重构而不需要征求代码作者的同意,很可能也不知道是谁写的这部分代码。这样每个人都能熟悉系统的代码,即使团队的人员变动,也没有风险。
  Customer Engagement ,现场客户。
  敏捷开发中,客户是与开发团队一起工作的,团队到客户现场进行开发或者邀请客户到团队公司里来开发。如果开发过程中有什么问题或者产品经过一个迭代后,能够以最快速度得到客户的反馈。
  Automated Testing ,自动化测试。
  为了减小人力或者重复劳动,所有的测试包括、功能测试或等都是自动化的,这对QA人员提出了更高的要求。他们要熟悉开发语言、自动化测试工具,能够编写自动化测试脚本或者用工具录制。我们公司在自动化测试上做了大量的工作,包括Selenium开源项目。
  Adaptive Planning,可调整计划。
  敏捷开发中计划是可调整的,并不是像以往的开发过程中,需求分析->概要设计->详细设计->开发 ->测试->交付,每一个阶段都是有计划的进行,一个阶段结束便开始下一个阶段。而敏捷开发中只有一次一次的迭代,小版本的发布,根据客户反馈随时作出相应的调整和变化。
  敏捷开发过程与传统的开发过程有很大不同,在这过程中,团队是有激情有活力的,能够适应更大的变化,做出更高质量的软件。
  敏捷方法主要有两个特点,这也是其区别于其他方法,尤其是重型方法的最主要特征:
  (1)敏捷开发方法是“适应性”(Adaptive)而非“预设性” (Predictive)。
  这里说的预设性,可以通过一般性的做法理解,比如,在这类工程实践中,有比较稳定的,同时建设项目的要求也相对固定,所以此类项目通常非常强调施工前的设计规划。只要图纸设计得合理并考虑充分,施工队伍可以完全遵照图纸顺利建造,并且可以很方便地把图纸划分为许多更小的部分交给不同的施工人员分别完成。
  然而,在软件开发的项目中,这些稳定的因素却很难寻求。软件的设计难处在于软件需求的不稳定,从而导致的不可。但是传统的项目模式都是试图对一个软件开发项目在很长的时间跨度内做出详细的,然后依计划进行开发。所以,这类方法在不可预测的环境下,很难适应变化,甚至是拒绝变化。
  与之相反的敏捷方法则是欢迎变化,目的就是成为适应变化的过程,甚至能允许改变自身来适应变化。所以称之为适应性方法。
  (2)敏捷开发方法是“面向人” (people oriented)而非“面向过程”(process oriented)。
  Matin Flower认为:“在敏捷开发过程中,人是第一位的,过程是第二位的。所以就个人来说,应该可以从各种不同的过程中找到真正适合自己的过程。”这与理论提倡的先过程后人正好相反。 (续致信网上一页内容)
  在传统的软件开发工作中,分配工作的重点是明确角色的定义,以个人的能力去适应角色,而角色的定义就是为了保证过程的实施,即个人以的方式被分配给角色,同时,资源是可以替代的,而角色不可以替代。
  然而,传统软件开发的这些方法在敏捷开发方式中被完全颠覆。敏捷开发试图使软件开发工作能够利用人的特点,充分发挥人的创造能力。
  敏捷开发的目的是建立起一个项目团队全员参与到软件开发中,包括设定软件开发流程的人员,只有这样软件开发流程才有可接受性。同时敏捷开发要求研发人员独立自主在技术上进行,因为他们是最了解什么技术是和不需要的。再者,敏捷开发特别重视项目团队中的交流,有调查显示:“项目失败的原因最终都可追溯到信息没有及时准确地传递到应该接受它的人。”
  实际上敏捷开发运动在数年前就开始了,但它正式开始的标志是2001年2月的“”(Agile Manifesto),这项宣言是由17位当时称之为“轻量级方法学家”所编写签署的,他们的是:个人与交互重于开发过程与工具;可用的软件重于复杂的文档;寻求客户的合作重于对的;对变化的响应重于始终遵循固定的计划。
  个人与交互重于开发过程与工具的原因:一个由优秀的人员组成但使用普通的工具,要比使用优秀的工具但由普通人组成、紊乱的小组做得更好。多年来人们花了很多时间试图建立一种过程,以便把人当作机器上的一个可以替代的齿轮,但结果却并不成功。敏捷过程是承认每个人都有特定的能力(以及缺点)对之加以利用,而不是把所有的人当成一样来看待。更重要的是,在这样的理念下,几个项目做下来,每个人的能力都从中得以提高。这种人的能力的提高,对是无价之宝。而不至于把人当成齿轮,随着时间的推移,人的能力慢慢被消耗掉,最后变成留之无用、弃之可惜的尴尬人物。
  可用的软件重于复杂的文档的原因:可用的软件可以帮助开发人员在每次迭代结束的时候,获得一个稳定的、逐渐增强的版本。从而允许项目尽早开始,并且更为频繁的收集对和开发过程的反馈。随着每次迭代完成软件的增长,以保证开发小组始终是处理最有价值的功能,而且这些功能可以满足用户的期待。
  寻求客户的合作重于对合同的谈判的原因:敏捷开发小组希望与项目有关的所有团体都在朝共同方向努力,有时会在一开始就使小组和客户出于争执中。敏捷开发追求的是要么大家一起赢,要么大家一起输。换句话说,就是希望开发小组和客户在面对项目的时候,以一种合作的态度共同向目标前进。当然,合同是必需的,但是如何起草条款,往往影响到不同的团体是进行合作式的还是对抗式的努力。
  对变化的响应重于始终遵循固定的计划的原因:敏捷开发认为对变化进行响应的价值重于始终遵循固定的计划。他们最终的焦点是向用户交付尽可能多的价值。除了最简单的项目以外,用户不可能知道他们所需要的所有功能的每个细节。不可避免地在过程中会产生新的想法,也许今天看起来是必需的功能,明天就会觉得不那么重要了。随着小组获得更多的知识和经验,他们的进展速度会比开始的时候慢或者快。对敏捷开发来说,一个计划是从某个角度对未来的看法,而具有多个不同的角度看问题是有可能的。
  敏捷方法很多,包括 、、功能驱动开发以及统一过程()等多种法,这些方法本质实际上是一样的,敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作; 按短迭代周期工作; 每次迭代交付一些成果; 关注业务优先级; 检查与调整。下图是典型的敏捷过程总图,下面介绍其有关的特点。
  1、敏捷小组作为一个整体工作
  项目取得成功的关键在于,所有项目参与者都把自己看成朝向一个共同目标前进的团队的一员。“扔过去不管”的心理不是属于敏捷开发。设计师和架构师不会把程序设计“扔”给编码人员;编码人员也不会把只经过部分测试的代码“扔”给测试人员,一个成功的敏捷开发小组应该具有“我们一起参与其中的思想”, “帮助他人完成目标”这个理念是敏捷开发的根本管理文化。当然,尽管强调一个整体,小组中应该有一定的角色分配,各种敏捷开发方法角色的起名方案可能不同,但愿则基本上是一样的。第一个角色是产品所有者,他的主要职责包括:确认小组成员都在追求一个共同的目标前景;确定功能的优先等级,以便总是处理最有价值的功能;作出可以使项目的投入产生良好回报的决定。产品所有者通常是公司的市场部门或者部门的人员,在开发内部使用的软件的时候,产品所有者可能是用户、用户的上级、分析师,也可能是为项目提供的人。
  2、敏捷小组按短迭代周期工作
在敏捷项目中,上并没有什么上游阶段、下游阶段,你可以根据需要定义开发过程在初始阶段可以有一个简短的分析、建模、设计,但只要项目真正开始,每次迭代都会做同样的工作(分析、设计、编码、测试。等等)。迭代是受时间框限制的,也就是说即使放弃一些功能,也必须结束迭代。时间框一般很短,大部分是 2~4周,在 Scrum中采用的是 30个日历天,也就是 4 周。迭代的时间长度一般是固定的,但也有报告说,有的小组在迭代开始的时候选择合适的时间长度。
  3、敏捷小组每次迭代交付一些成果
  比选择特定迭代长度更重要的,是开发小组在一次迭代中要把一个以上的不太精确的需求声明,经过分析、设计、编码、测试,变成可交付的软件(称之为功能增量)。当然并不需要把每次迭代的结果交付给用户,但目标是可以交付,这就意味着每次迭代都会增加一些小功能,但增加的每个功能都要达到发布。每次迭代结束的时候让产品达到可交付状态十分重要,但这并不意味着要完成发布的全部工作,因为迭代的结果并不是真正发布产品。假定一个小组需要在发布产品之前对软硬件进行为期两个月的“”()测试,他们不可能缩短这两个月的时间,但这个小组仍然是按照 4 周迭代,除了MTBF测试,其它都达到了发布状态。
  4、敏捷小组关注业务优先级
  敏捷开发小组从两个方面显示出他们对业务优先级的关注。首先,他们按照产品所有者制定的顺序交付功能,而产品所有者一般会按照在项目上的最大化的方式来确定优先级,并且把它组织到产品发布中去。要达到这个目的,需要综合考虑开发小组的能力,以及所需功能的优先级来建立发布计划。在编写功能的时候,需要使工能的依赖性最小化。如果开发一个功能必须依赖其它 3 个功能,那产品所有者这就很难确定功能优先级。功能完全没有依赖是不太可能的,但把功能依赖性控制在最低程度还是相当可行的。
  5、敏捷小组检查与调整
  任何项目开始的时候所建立的计划,仅仅是一个当前的猜测。有很多事情可以让这样的计划失效:项目成员的增减,某种技术比预期的更好或更差,用户改变了想法,迫使我们做出不同的反应,等等。对此,敏捷小组不是害怕这种变化,而是把这种变化看成使最终软件更好地反映实际需要的一个机会。每次新迭代开始,敏捷小组都会结合上一次迭代中获得新知识做出相应调整。如果认为一些因素可能会影响计划的准确性,也可能更改计划。比如发现某项工作比预计的更耗费时间,可能就会调整进展速度。也许,用户看到交付的产品后改变了想法,这就产生反馈,比如他发现他更希望有另一项功能,或者某个功能并不像先前看得那么重。通过先期发布增加更多的用户希望的功能,或者减少某些低价值功能,就可以增加产品的价值。迭代开发是在变与不变中寻求平衡,在迭代开始的时候寻求变,而在迭代开发期间不能改变,以期集中精力完成已经确定的工作。由于一次迭代的时间并不长,所以就使稳定性和易变性得到很好的平衡。在两次迭代期间改变优先级甚至功能本身,对于最大化是有益处的。从这个观点来看,迭代周期的长度选择就比较重要了,因为两次迭代之间是提供变更的机会,周期太长,变更机会就可能失去;周期太短,会发生频繁变更,而且分析、设计、编码、测试这些工作都不容易做到位。综合考虑,对于一个复杂项目,迭代周期选择4周还是有道理的。
  MIT Sloan Management Review(麻省理工学院项目管理评论)所刊载的一篇为时两年对成功软件项目的研究报告,报告指出了软件项目获得成功的共同因素,排在首位的是迭代开发,而不是瀑布过程。其它的因素是:
  1、至少每天把新代码合并到整个,并且通过测试,对做出。
  2、开发团队具备运作多个产品的工作经验。
  3、很早就致力于构建和提供内聚的架构。
  从这个报告中所透露出的信息告诉我们,认真研究敏捷过程对软件项目的成功是非常有意义的,它的意义在于:
  1)给开发小组的自组织提供了机会
  经典项目管理就好比一个具备中央调度服务的航空管理系统,这个系统是自治的,而且是封闭的,但现实中更庞大的系统,似乎并不属于中央调度控制系统,但也同样也是有效的。假如我们开车到某个地方,我们可以任意选择所需要的路线,我们甚至不需要准确计算停车,只要我们遵守交通法规,驾驶员可以临时根据路况改变某个转弯点,在驾驶游戏规则的框架内,依照自身最大利益做出决策。成千上万的驾驶者,并不需要中央控制和调度服务,人们仅仅在简单的交通法规的框架内,就可以完成综合起来看是更庞大的目标,很多事情从管理的角度只要抓住关键点,并不需要多么复杂的规则,往往会更有效。随着系统复杂度的提高,中央控制和调度系统面临崩溃。仔细研究交通系统的特点,我们会发现这样的系统中独立的个体在一组适当的规则下运行,并不需要设计每个个体临时变更的方案,而每个个体只需要知道目标和大致的状况,他们完全可以利用自己的聪明才智来决定自己的行为。
  2)缩短了反馈通道
  敏捷过程有效运作的另一个原因是,它极大的缩短了用户与开发者、预测目标与实施状况、与回报之间的反馈回路。在面对不断变化的、业务过程以及不断发展的技术状态的时候,便需要有一种方法在比较短的时间内发展完善。事实上,所有的过程改进都不同程度的使用着,以研究问题、测试解决方案、评估结果,进而根据已知的事实来进行改进,这就称之为基于事实的,我们都知道,这比前端预测的更加有效。
  3)易于集思广益
  敏捷过程能有效应用的另一个原因在于,它可以就一个问题集思广益。我们的经验告诉我们当一个问题发生的时候,总有某些人员知道问题所在,但他的观点却遭到忽视。例如航天飞机在起飞阶段发生爆炸,事后分析出了各种原因,但这种调查也提供给我们一个惊人的事实,就是部分工程师早就意识到这些潜在问题,却无法说服他人重视这个担忧。对这些事实的深入思考,促使我们研究我们应该采取何种管理系统,使前线工作人员的经验、观点及担忧得到充分的重视呢?
  误解一:敏捷对人的要求很高
  很多人在尝试实施敏捷时说:敏捷对人的要求太高了,我们没有这样的条件,我们没有这样的人,因此我们没法敏捷。可是,敏捷对人的要求真的那么高么?
软件归根到底还是一种创造性活动,开发人员的技术水平和个人能力对软件的质量还是起着决定性的作用,各种过程与方法只是帮助开发人员、测试人员等角色能够更好的合作,从而产生更高的生产力。不管用什么方法,开发人员的水平永远都是一个主要的因素。
  从另一个角度来看:过程和方法究竟能帮开发人员多大忙?对于技术水平较低的开发人员,敏捷方法和传统方法对他的帮助是差不多的,因此看不到显着的效果,甚至有些时候还有反效果;而随着开发人员技术水平的提高,敏捷方法能够解开对人的束缚,鼓励,效果也会越来越显着。
  敏捷对人的要求并不高,而且会帮助你培养各种所需的能力,当然前提是你处在真正敏捷的环境中。
  误解二:敏捷没有文档,也不做设计
  这个误解从XP开始就没有停止过,XP鼓励“在非到必要且意义重大时不写文档”。这里面提到的“必要且意义重大”是一个判断标准,并不是所有的文档都不写。例如,是不是“必要且意义重大”?这取决于客户的要求,如果客户不需要,那就不用写,如果客户需要,就一定要写;再如,架构设计文档要不要写?复杂要写,不复杂不用写。通常架构设计只需要比较简单的文档,对于有些项目,一幅简单的图就够了。因此,写不写,怎么写,都要根据这个文档到底有多大意义,产出和投入的比例,以及项目的具体情况决定。实际操作时可以让项目组所有人员表决决定,尽量避免由某一个人(比如)来决定。
  至于设计,XP奉行的是持续设计,并不是不设计。这实际上是将设计工作分摊到了每天的日常工作中,不断的设计、改善(重构),使得设计一直保持灵活可靠。至于编码前的预先设计,Kent Beck等人确实实行着不做任何预先设计的开发方式,但是对于我们这些“非大师”级开发人员,必要的预先设计还是需要的,只是不要太多,不要太细,要有将来会彻底颠覆的准备。
  误解三:敏捷好,其他方法不好
  有些人一提到敏捷就大呼好,只要是敏捷的实践就什么都好,而提到等方法就大呼不好,不管是什么只要沾上边就哪里都不好,似乎敏捷和其他方法是完全对立的。牛顿说过,我是站在了巨人的肩膀上。敏捷同样也吸取了其他方法论的优点,也是站在了巨人的肩膀上,敏捷依然保持了很多历史悠久的实践和原则,只是表现方式不同罢了。
  从另一个方面来看,方法本没有好环,好与坏取决于是否适合解决你的问题。每一种方法都有他最善于解决的问题和最佳的发挥环境,在需求稳定、软件复杂度相对不高的时代,也可以工作的很好,而敏捷恰好适用于变化快风险高的项目 - 这恰恰是现在很多项目的共性。
  因此选择一个方法或过程,并不是根据它是否敏捷,而应根据它是否适合。而要了解一个东西是否适合,还是要尝试之后才知道,任何没有经过实践检验的东西都不可信。
  误解四:敏捷就是XP(),就是
  XP 和Scrum只是众多敏捷方法中的两种,还有很多其他的敏捷方法。龙生九子各个不同,敏捷的这些方法看起来差别也是很大的,可是他们之所以被称为敏捷方法,就是因为他们背后的理念和原则都是相同的,这个原则就是《敏捷宣言》。学习敏捷不仅仅要学习实践,还要理解实践后的原则,不仅要理解怎么做,还要理解为什么这么做,以及什么时候不要这么做。
  即使将XP或Scrum完全的应用的你的项目中,也未见得就能成功,适合别人的东西未必就适合你。敏捷的这些实践和方法给了我们一个起点,但绝对不是终点,最适合你的方式还要由你自己在实际工作中探索和寻找。
  误解五:敏捷很好,因此我要制定标准,所有项目都要遵循着个标准
  没有哪两个项目是一样的,客户是不一样的,人员是不一样的,需求是不一样的,甚至没有什么可能是一样的。不一样的环境和问题,用同样的方法解决,是不可能解决的好的。方法是为人服务的,应该为项目团队找到最适合他们的方法,而不是先确定方法,再让团队适应这个方法。因此也不存在适合所有项目的统一的方法。任何企图统一所有项目过程的方法都是不正确的。
  同时,对于同一个团队,随着项目的进行,对需求理解的深入,对技术理解的深入,一开始适合项目的过程和方法也会渐渐的不适合。这时候也需要团队对过程进行及时的调整,保证项目的质量和效率。敏捷是动态的,而非静止不变的,因为这个世界本身就是变化的,在变化的世界使用不变的方法,是不现实的。银弹从来就没有过,在有限的将来也不会存在。
本条目对我有帮助95
&&如果您认为本条目还有待完善,需要补充新内容或修改错误内容,请。
本条目相关文档
& 22页& 13页& 2页& 406页& 3页& 5页& 35页& 66页& 66页& 54页
本条目由以下用户参与贡献
,,,,,,,,,,.
(window.slotbydup=window.slotbydup || []).push({
id: '224685',
container: s,
size: '728,90',
display: 'inlay-fix'
评论(共1条)提示:评论内容为网友针对条目"敏捷开发"展开的讨论,与本站观点立场无关。
发表评论请文明上网,理性发言并遵守有关规定。中文名:&敏捷软件开发:原则、模式与实践(C#版)作者:&译者:&图书分类:&软件资源格式:&PDF版本:&扫描版出版社:&人民邮电出版社书号:&6发行时间:&日地区:&语言:&简介:&
内容简介: 本书中,享誉全球的软件开发专家和软件工程大师Robert C. Martin深入而生动地使用真实案例讲解了面向对象基本原则、重要的设计模式、UML和敏捷实践等程序员必备的知识。  本书于2003年荣获第13届Jolt大奖,是C++和Java程序员提高自身水平的绝佳教材,也适于用作高校计算机、软件工程专业相关课程的教材或参考书。-可在(网盘分流地址):本页“用户评论”处-找-。
第一部分 敏捷开发第1章 敏捷实践1.1 敏捷联盟1.1.1 人和交互重于过程和工具1.1.2 可以工作的软件重于面面俱到的文档1.1.3 客户合作重于合同谈判1.1.4 随时应对变化重于遵循计划1.2 原则1.3 结论1.4 参考文献第2章 极限编程概述2.1 极限编程实践2.1.1 完整团队2.1.2 用户故事2.1.3 短交付周期2.1.4 验收测试2.1.5 结对编程2.1.6 测试驱动开发2.1.7 集体所有权2.1.8 持续集成2.1.9 可持续的开发速度2.1.10 开放的工作空间2.1.11 计划游戏2.1.12 简单设计2.1.13 重构2.1.14 隐喻2.2 结论2.3 参考文献第3章 计划3.1 初始探索3.2 发布计划3.3 迭代计划3.4 定义“完成”3.5 任务计划3.6 迭代3.7 跟踪3.8 结论3.9 参考文献第4章 测试4.1 测试驱动开发4.1.1 测试优先设计的例子4.1.2 测试促使模块之间隔离4.1.3 意外获得的解耦合4.2 验收测试4.3 意外获得的构架4.4 结论4.5 参考文献第5章 重构5.1 素数产生程序:一个简单的重构示例5.1.1 单元测试5.1.2 重构5.1.3 最后审视5.2 结论5.3 参考文献第6章 一次编程实践6.1 保龄球比赛6.2 结论第二部分 敏捷设计第7章 什么是敏捷设计7.1 设计臭味7.1.1 设计臭味——腐化软件的气味7.1.2 僵化性7.1.3 脆弱性7.1.4 顽固性7.1.5 粘滞性7.1.6 不必要的复杂性7.1.7 不必要的重复7.1.8 晦涩性7.2 软件为何会腐化7.3 Copy程序7.3.1 熟悉的场景7.3.2 Copy程序的敏捷设计7.4 结论7.5 参考文献第8章 SRP:单一职责原则8.1 定义职责8.2 分离耦合的职责8.3 持久化8.4 结论8.5 参考文献第9章 OCP:开放-封闭原则9.1 OCP概述9.2 Shape应用程序9.2.1 违反OCP9.2.2 遵循OCP9.2.3 预测变化和“贴切的”结构9.2.4 放置吊钩9.2.5 使用抽象获得显式封闭9.2.6 使用“数据驱动”的方法获取封闭性9.3 结论9.4 参考文献第10章 LSP:Liskov替换原则10.1 违反LSP的情形10.1.1 简单例子10.1.2 更微妙的违反情形10.1.3 实际的例子10.2 用提取公共部分的方法代替继承10.3 启发式规则和习惯用法10.4 结论10.5 参考文献第11章 DIP:依赖倒置原则11.1 层次化11.1.1 倒置的接口所有权11.1.2 依赖于抽象11.2 简单的DIP示例11.3 熔炉示例11.4 结论11.5 参考文献第12章 ISP:接口隔离原则12.1 接口污染12.2 分离客户就是分离接口12.3 类接口与对象接口12.3.1 使用委托分离接口12.3.2 使用多重继承分离接口12.4 ATM用户界面的例子12.5 结论12.6 参考文献第13章 C#程序员UML概观13.1 类图13.2 对象图13.3 顺序图13.4 协作图13.5 状态图13.6 结论13.7 参考文献第14章 使用UML14.1 为什么建模14.1.1 为什么构建软件模型14.1.2 编码前应该构建面面俱到的设计吗14.2 有效使用UML14.2.1 与他人交流14.2.2 脉络图14.2.3 项目结束文档14.2.4 要保留的和要丢弃的14.3 迭代式改进14.3.1 行为优先14.3.2 检查结构14.3.3 想象代码14.3.4 图的演化14.4 何时以及如何绘制图示14.4.1 何时要画图,何时不要画图14.4.2 CASE 工具14.4.3 那么,文档呢14.5 结论第15章 状态图15.1 基础知识15.1.1 特定事件15.1.2 超状态15.1.3 初始伪状态和结束伪状态15.2 使用FSM图示15.3 结论第16章 对象图16.1 即时快照16.2 主动对象16.3 结论第17章 用例17.1 编写用例17.1.1 备选流程17.1.2 其他东西呢17.2 用例图17.3 结论17.4 参考文献第18章 顺序图18.1 基础知识18.1.1 对象、生命线、消息及其他18.1.2 创建和析构18.1.3 简单循环18.1.4 时机和场合18.2 高级概念18.2.1 循环和条件18.2.2 耗费时间的消息18.2.3 异步消息18.2.4 多线程18.2.5 主动对象18.2.6 向接口发送消息18.3 结论第19章 类图19.1 基础知识19.1.1 类19.1.2 关联19.1.3 继承19.2 类图示例19.3 细节19.3.1 类衍型19.3.2 抽象类19.3.3 属性19.3.4 聚集19.3.5 组合19.3.6 多重性19.3.7 关联衍型19.3.8 内嵌类19.3.9 关联类19.3.10 关联修饰符19.4 结论19.5 参考文献第20章 咖啡的启示20.1 Mark IV型专用咖啡机20.1.1 规格说明书20.1.2 常见的丑陋方案20.1.3 虚构的抽象20.1.4 改进方案20.1.5 实现抽象模型20.1.6 这个设计的好处20.2 面向对象过度设计20.3 参考文献第三部分 薪水支付案例研究第21章 COMMAND模式和ACTIVE OBJECT模式:多功能与多任务21.1 简单的Command21.2 事务21.2.1 实体上解耦和时间上解耦21.2.2 时间上解耦21.3 Undo()方法21.4 ACTIVE OBJECT模式21.5 结论21.6 参考文献第22章 TEMPLATE METHOD模式和STRATEGY模式:继承和委托22.1 TEMPLATE METHOD模式22.1.1 滥用模式22.1.2 冒泡排序22.2 STRATEGY模式22.3 结论22.4 参考文献第23章 FACADE模式和MEDIATOR模式23.1 FACADE模式23.2 MEDIATOR模式23.3 结论23.4 参考文献第24章 SINGLETON模式和MONOSTATE模式24.1 SINGLETON模式24.1.1 SINGLETON模式的好处24.1.2 SINGLETON模式的代价24.1.3 运用SINGLETON模式24.2 MONOSTATE模式24.2.1 MONOSTATE模式的好处24.2.2 MONOSTATE模式的代价24.2.3 运用MONOSTATE模式24.3 结论24.4 参考文献第25章 NULL OBJECT模式25.1 描述25.2 结论25.3 参考文献第26章 薪水支付案例研究:第一次迭代开始26.1 初步的规格说明26.2 基于用例分析26.2.1 增加新雇员26.2.2 删除雇员26.2.3 登记考勤卡26.2.4 登记销售凭条26.2.5 登记工会服务费26.2.6 更改雇员明细26.2.7 发薪日26.3 反思:找出底层的抽象26.3.1 雇员支付类别抽象26.3.2 支付时间表抽象26.3.3 支付方式26.3.4 从属关系26.4 结论26.5 参考文献第27章 薪水支付案例研究:实现27.1 事务27.1.1 增加雇员27.1.2 删除雇员27.1.3 考勤卡、销售凭条以及服务费用27.1.4 更改雇员属性27.1.5 犯了什么晕27.1.6 支付雇员薪水27.1.7 支付领月薪的雇员薪水27.1.8 支付钟点工薪水27.2 主程序27.3 数据库27.4 结论27.5 关于本章27.6 参考文献第四部分 打包薪水支付系统第28章 包和组件的设计原则28.1 包和组件28.2 组件的内聚性原则:粒度28.2.1 重用—发布等价原则28.2.2 共同重用原则28.2.3 共同封闭原则28.2.4 组件内聚性总结28.3 组件的耦合性原则:稳定性28.3.1 无环依赖原则28.3.2 稳定依赖原则28.3.3 稳定抽象原则28.4 结论第29章 FACTORY模式29.1 依赖问题29.2 静态类型与动态类型29.3 可替换的工厂29.4 对测试支架使用对象工厂29.5 工厂的重要性29.6 结论29.7 参考文献第30章 薪水支付案例研究:包分析30.1 组件结构和符号30.2 应用CCP30.3 应用REP30.4 耦合和封装30.5 度量30.6 度量薪水支付应用程序30.6.1 对象工厂30.6.2 重新思考内聚的边界30.7 最终的包结构30.8 结论30.9 参考文献第31章 COMPOSITE模式31.1 组合命令31.2 多重性还是非多重性31.3 结论第32章 OBSERVER——演化至模式32.1 数字时钟32.2 OBSERVER模式32.2.1 模型32.2.2 面向对象设计原则的运用32.3 结论32.4 参考文献第33章 ABSTRACT SERVER模式、 ADAPTER模式和BRIDGE模式33.1 ABSTRACT SERVER模式33.2 ADAPTER模式33.2.1 类形式的ADAPTER模式33.2.2 调制解调器问题、适配器以及LSP33.3 BRIDGE模式33.4 结论33.5 参考文献第34章 PROXY模式和GATEWAY模式:管理第三方API34.1 PROXY模式34.1.1 实现PROXY模式34.1.2 小结34.2 数据库、中间件以及其他第三方接口34.3 TABLE DATA GATEWAY34.3.1 测试和内存TDG34.3.2 测试DbGateWay34.4 可以用于数据库的其他模式34.5 结论34.6 参考文献第35章 VISITOR模式35.1 VISITOR模式35.2 ACYCLIC VISITOR模式35.3 DECORATOR模式35.4 EXTENSION OBJECT模式35.5 结论35.6 参考文献第36章 STATE模式36.1 嵌套switch/case语句36.1.1 内部作用域的状态变量36.1.2 测试动作36.1.3 代价和收益36.2 迁移表36.2.1 使用表解释36.2.2 代价和收益36.3 STATE模式36.3.1 STATE模式和 STRATEGY模式36.3.2 代价和收益36.4 状态机编译器36.4.1 SMC生成的Turnstile.cs以及其他支持文件36.4.2 代价和收益36.5 状态机应用的场合36.5.1 作为GUI中的高层应用策略36.5.2 GUI交互控制器36.5.3 分布式处理36.6 结论36.7 参考文献第37章 薪水支付案例研究:数据库37.1 构建数据库37.2 一个代码设计缺陷37.3 增加雇员37.4 事务37.5 加载Employee对象37.6 还有什么工作第38章 薪水支付系统用户界面:Model-View-Presenter38.1 界面38.2 实现38.3 构建窗口38.4 Payroll窗口38.5 真面目38.6 结论38.7 参考文献附录A 双公司记Rufus公司:“日落”项目Rupert工业公司:“朝晖”项目附录B 什么是软件索引
在百度里搜索""更多相关内容
在谷歌里搜索""更多相关内容
* 本站资源大多为PDF格式的书籍,请使用专业免费PDF阅览器阅读。
* 为了达到最快的下载速度,推荐使用网际快车或迅雷下载本站书籍。
* 请一定升级到最新版WinRAR3.80才能正常解压本站提供的书籍!
* 如果您发现下载链接错误,请点击谢谢!
* 站内提供的所有书籍均是由网上搜集,若侵犯了你的版权利益,通知我们!}

我要回帖

更多关于 敏捷软件开发方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信