发布新日志

  • 敏捷开发(Agile development)

    2010-06-01 14:45:00

    敏捷开发概述

      敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

    敏捷开发的路线[1]

      Image:敏捷开发的路线图.jpg

      图:敏捷开发的路线图

      Test-Driven Development,测试驱动开发。

      它是敏捷开发的最重要的部分。在ThoughtWorks,我们实现任何一个功能都是从测试开 始,首先对业务需求进行分析,分解为一个一个的Story,记录在Story Card上。然后两个人同时坐在电脑前面,一个人依照Story,从业务需求的角度来编写测试代码,另一个人看着他并且进行思考,如果有不同的意见就会提 出来进行讨论,直到达成共识,这样写出来的测试代码就真实反映了业务功能需求。接着由另一个人控制键盘,编写该测试代码的实现。如果没有测试代码,就不能 编写功能的实现代码。先写测试代码,能够让开发人员明确目标,就是让测试通过。

      Continuous Integration,持续集成。

      在以往的软件开发过程中,集成是一件很痛苦的事情,通常很长时间才会做一次集成,这样的话,会引发很多问题,比如 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位当时称之为“轻量级方法学家”所编写签署的,他们的价值观是:个人与交互重于开发过程与工具;可用的软件重于复杂的文档;寻求客户的合作重于对合同谈判;对变化的响应重于始终遵循固定的计划。

      个人与交互重于开发过程与工具的原因:一个由优秀的人员组成但使用普通的工具,要比使用优秀的工具但由普通人组成、紊乱的小组做得更 好。多年来人们花了很多时间试图建立一种过程,以便把人当作机器上的一个可以替代的齿轮,但结果却并不成功。敏捷过程是承认每个人都有特定的能力(以及缺 点)对之加以利用,而不是把所有的人当成一样来看待。更重要的是,在这样的理念下,几个项目做下来,每个人的能力都从中得以提高。这种人的能力的提高,对公司是无价之宝。而不至于把人当成齿轮,随着时间的推移,人的能力慢慢被消耗掉,最后变成留之无用、弃之可惜的尴尬人物。

      可用的软件重于复杂的文档的原因:可用的软件可以帮助开发人员在每次迭代结束的时候,获得一个稳定的、逐渐增强的版本。从而允许项目尽早开始,并且更为频繁的收集对产品和开发过程的反馈。随着每次迭代完成软件的增长,以保证开发小组始终是处理最有价值的功能,而且这些功能可以满足用户的期待。

      寻求客户的合作重于对合同的谈判的原因:敏捷开发小组希望与项目有关的所有团体都在朝共同方向努力,合同谈判有 时会在一开始就使小组和客户出于争执中。敏捷开发追求的是要么大家一起赢,要么大家一起输。换句话说,就是希望开发小组和客户在面对项目的时候,以一种合 作的态度共同向目标前进。当然,合同是必需的,但是如何起草条款,往往影响到不同的团体是进行合作式的还是对抗式的努力。

      对变化的响应重于始终遵循固定的计划的原因:敏捷开发认为对变化进行响应的价值重于始终遵循固定的计划。他们最终的焦点是向用户交付 尽可能多的价值。除了最简单的项目以外,用户不可能知道他们所需要的所有功能的每个细节。不可避免地在过程中会产生新的想法,也许今天看起来是必需的功 能,明天就会觉得不那么重要了。随着小组获得更多的知识和经验,他们的进展速度会比开始的时候期望值慢或者快。对敏捷开发来说,一个计划是从某个角度对未来的看法,而具有多个不同的角度看问题是有可能的。

    项目的敏捷开发方法

      敏捷方法很多,包括 Scrum、极限编程、功能驱动开发以及统一过程(RUP)等多种法,这些方法本质实际上是一样的,敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作; 按短迭代周期工作; 每次迭代交付一些成果; 关注业务优先级; 检查与调整。下图是典型的敏捷过程总图,下面介绍其有关的特点。

      Image:敏捷过程总图.gif

      1、敏捷小组作为一个整体工作

      项目取得成功的关键在于,所有项目参与者都把自己看成朝向一个共同目标前进的团队的一员。“扔过去不管”的心理不是属于敏捷开发。设计 师和架构师不会把程序设计“扔”给编码人员;编码人员也不会把只经过部分测试的代码“扔”给测试人员,一个成功的敏捷开发小组应该具有“我们一起参与其中 的思想”, “帮助他人完成目标”这个理念是敏捷开发的根本管理文化。当然,尽管强调一个整体,小组中应该有一定的角色分配,各种敏捷开发方法角色的起名方案可能不 同,但愿则基本上是一样的。第一个角色是产品所有者,他的主要职责包括:确认小组成员都在追求一个共同的目标前景;确定功能的优先等级,以便总是处理最有 价值的功能;作出可以使项目的投入产生良好回报的决定。产品所有者通常是公司的市场部门或者产品管理部门的人员,在开发内部使用的软件的时候,产品所有者可能是用户、用户的上级、分析师,也可能是为项目提供资金的人。

      2、敏捷小组按短迭代周期工作

    在敏捷项目中,总体上 并没有什么上游阶段、下游阶段,你可以根据需要定义开发过程在初始阶段可以有一个简短的分析、建模、设计,但只要项目真正开始,每次迭代都会做同样的工作 (分析、设计、编码、测试。等等)。迭代是受时间框限制的,也就是说即使放弃一些功能,也必须结束迭代。时间框一般很短,大部分是 2~4周,在 Scrum中采用的是 30个日历天,也就是 4 周。迭代的时间长度一般是固定的,但也有报告说,有的小组在迭代开始的时候选择合适的时间长度。

      3、敏捷小组每次迭代交付一些成果

      比选择特定迭代长度更重要的,是开发小组在一次迭代中要把一个以上的不太精确的需求声明,经过分析、设计、编码、测试,变成可交付的软 件(称之为功能增量)。当然并不需要把每次迭代的结果交付给用户,但目标是可以交付,这就意味着每次迭代都会增加一些小功能,但增加的每个功能都要达到发 布质量。每次迭代结束的时候让产品达到可交付状态十分重要,但这并不意味着要完成发布的全部工作,因为迭代的结果并不是真正发布产品。假定一个小组需要在发布产品之前对软硬件进行为期两个月的“平均无故障时间”(MTBF)测试,他们不可能缩短这两个月的时间,但这个小组仍然是按照 4 周迭代,除了MTBF测试,其它都达到了发布状态。

      4、敏捷小组关注业务优先级

      敏捷开发小组从两个方面显示出他们对业务优先级的关注。首先,他们按照产品所有者制定的顺序交付功能,而产品所有者一般会按照组织在项目上的投资回报最 大化的方式来确定优先级,并且把它组织到产品发布中去。要达到这个目的,需要综合考虑开发小组的能力,以及所需功能的优先级来建立发布计划。在编写功能的 时候,需要使工能的依赖性最小化。如果开发一个功能必须依赖其它 3 个功能,那产品所有者这就很难确定功能优先级。功能完全没有依赖是不太可能的,但把功能依赖性控制在最低程度还是相当可行的。

      5、敏捷小组检查与调整

      任何项目开始的时候所建立的计划,仅仅是一个当前的猜测。有很多事情可以让这样的计划失效:项目成员的增减,某种技术比预期的更好或更差,用户改变了想法,竞争者迫 使我们做出不同的反应,等等。对此,敏捷小组不是害怕这种变化,而是把这种变化看成使最终软件更好地反映实际需要的一个机会。每次新迭代开始,敏捷小组都 会结合上一次迭代中获得新知识做出相应调整。如果认为一些因素可能会影响计划的准确性,也可能更改计划。比如发现某项工作比预计的更耗费时间,可能就会调 整进展速度。也许,用户看到交付的产品后改变了想法,这就产生反馈,比如他发现他更希望有另一项功能,或者某个功能并不像先前看得那么重。通过先期发布增 加更多的用户希望的功能,或者减少某些低价值功能,就可以增加产品的价值。迭代开发是在变与不变中寻求平衡,在迭代开始的时候寻求变,而在迭代开发期间不 能改变,以期集中精力完成已经确定的工作。由于一次迭代的时间并不长,所以就使稳定性和易变性得到很好的平衡。在两次迭代期间改变优先级甚至功能本身,对 于项目投资最 大化是有益处的。从这个观点来看,迭代周期的长度选择就比较重要了,因为两次迭代之间是提供变更的机会,周期太长,变更机会就可能失去;周期太短,会发生 频繁变更,而且分析、设计、编码、测试这些工作都不容易做到位。综合考虑,对于一个复杂项目,迭代周期选择4周还是有道理的。

      MIT Sloan Management Review(麻省理工学院项目管理评论)所刊载的一篇为时两年对成功软件项目的研究报告,报告指出了软件项目获得成功的共同因素,排在首位的是迭代开发,而不是瀑布过程。其它的因素是:

      1、至少每天把新代码合并到整个系统,并且通过测试,对设计变更做出快速反应

      2、开发团队具备运作多个产品的工作经验。

      3、很早就致力于构建和提供内聚的架构。

      从这个报告中所透露出的信息告诉我们,认真研究敏捷过程对软件项目的成功是非常有意义的,它的意义在于:

      1)给开发小组的自组织提供了机会

      经典项目管理就好比一个具备中央调度服务的航空管理系统,这个系统是自治的,而且是封闭的,但现实中更庞大的系统,似乎并不属于中央调 度控制系统,但也同样也是有效的。假如我们开车到某个地方,我们可以任意选择所需要的路线,我们甚至不需要准确计算停车,只要我们遵守交通法规,驾驶员可 以临时根据路况改变某个转弯点,在驾驶游戏规则的框架内,依照自身最大利益做出决策。成千上万的驾驶者,并不需要中央控制和调度服务,人们仅仅在简单的交 通法规的框架内,就可以完成综合起来看是更庞大的目标,很多事情从管理的角度只要抓住关键点,并不需要多么复杂的规则,往往会更有效。随着系统复杂度的提 高,中央控制和调度系统面临崩溃。仔细研究交通系统的特点,我们会发现这样的系统中独立的个体在一组适当的规则下运行,并不需要设计每个个体临时变更的方 案,而每个个体只需要知道目标和大致的状况,他们完全可以利用自己的聪明才智来决定自己的行为。

      2)缩短了反馈通道

      敏捷过程有效运作的另一个原因是,它极大的缩短了用户与开发者、预测目标与实施状况、投资与回报之间的反馈回路。在面对不断变化的市场、业务过程以及不断发展的技术状态的时候,便需要有一种方法在比较短的时间内发展完善。事实上,所有的过程改进都不同程度的使用着戴明循环,以研究问题、测试解决方案、评估结果,进而根据已知的事实来进行改进,这就称之为基于事实的决策模式,我们都知道,这比前端预测的决策方式更加有效。

      3)易于集思广益

      敏捷过程能有效应用的另一个原因在于,它可以就一个问题集思广益。我们的经验告诉我们当一个问题发生的时候,总有某些人员知道问题所 在,但他的观点却遭到忽视。例如航天飞机在起飞阶段发生爆炸,事后分析出了各种原因,但这种调查也提供给我们一个惊人的事实,就是部分工程师早就意识到这 些潜在问题,却无法说服他人重视这个担忧。对这些事实的深入思考,促使我们研究我们应该采取何种管理系统,使前线工作人员的经验、观点及担忧得到充分的重 视呢?

    对敏捷开发的误解

      误解一:敏捷对人的要求很高

      很多人在尝试实施敏捷时说:敏捷对人的要求太高了,我们没有这样的条件,我们没有这样的人,因此我们没法敏捷。可是,敏捷对人的要求真的那么高么? 软件归根到底还是一种创造性活动,开发人员的技术水平和个人能力对软件的质量还是起着决定性的作用,各种过程与方法只是帮助开发人员、测试人员等角色能够更好的合作,从而产生更高的生产力。不管用什么方法,开发人员的水平永远都是一个主要的因素。

      从另一个角度来看:过程和方法究竟能帮开发人员多大忙?对于技术水平较低的开发人员,敏捷方法和传统方法对他的帮助是差不多的,因此看不到显着的效果,甚至有些时候还有反效果;而随着开发人员技术水平的提高,敏捷方法能够解开对人的束缚,鼓励创新,效果也会越来越显着。

      敏捷对人的要求并不高,而且会帮助你培养各种所需的能力,当然前提是你处在真正敏捷的环境中。

      误解二:敏捷没有文档,也不做设计

      这个误解从XP开始就没有停止过,XP鼓励“在非到必要且意义重大时不写文档”。这里面提到的“必要且意义重大”是一个判断标准,并不 是所有的文档都不写。例如,用户手册是不是“必要且意义重大”?这取决于客户的要求,如果客户不需要,那就不用写,如果客户需要,就一定要写;再如,架构 设计文档要不要写?复杂要写,不复杂不用写。通常架构设计只需要比较简单的文档,对于有些项目,一幅简单的UML图就够了。因此,写不写,怎么写,都要根据这个文档到底有多大意义,产出和投入的比例,以及项目的具体情况决定。实际操作时可以让项目组所有人员表决决定,尽量避免由某一个人(比如lead)来决定。

      至于设计,XP奉行的是持续设计,并不是不设计。这实际上是将设计工作分摊到了每天的日常工作中,不断的设计、改善(重构),使得设计 一直保持灵活可靠。至于编码前的预先设计,Kent Beck等人确实实行着不做任何预先设计的开发方式,但是对于我们这些“非大师”级开发人员,必要的预先设计还是需要的,只是不要太多,不要太细,要有将 来会彻底颠覆的准备。

      误解三:敏捷好,其他方法不好

      有些人一提到敏捷就大呼好,只要是敏捷的实践就什么都好,而提到CMMI等方法就大呼不好,不管是什么只要沾上边就哪里都不好,似乎敏捷和其他方法是完全对立的。牛顿说过,我是站在了巨人的肩膀上。敏捷同样也吸取了其他方法论的优点,也是站在了巨人的肩膀上,敏捷依然保持了很多历史悠久的实践和原则,只是表现方式不同罢了。

      从另一个方面来看,方法本没有好环,好与坏取决于是否适合解决你的问题。每一种方法都有他最善于解决的问题和最佳的发挥环境,在需求稳定、软件复杂度相对不高的时代,瀑布模型也可以工作的很好,而敏捷恰好适用于变化快风险高的项目 - 这恰恰是现在很多项目的共性。

      因此选择一个方法或过程,并不是根据它是否敏捷,而应根据它是否适合。而要了解一个东西是否适合,还是要尝试之后才知道,任何没有经过实践检验的东西都不可信。

      误解四:敏捷就是XP(极限编程),就是Scrum

      XP 和Scrum只是众多敏捷方法中的两种,还有很多其他的敏捷方法。龙生九子各个不同,敏捷的这些方法看起来差别也是很大的,可是他们之所以被称为敏捷方 法,就是因为他们背后的理念和原则都是相同的,这个原则就是《敏捷宣言》。学习敏捷不仅仅要学习实践,还要理解实践后的原则,不仅要理解怎么做,还要理解 为什么这么做,以及什么时候不要这么做。

      即使将XP或Scrum完全的应用的你的项目中,也未见得就能成功,适合别人的东西未必就适合你。敏捷的这些实践和方法给了我们一个起点,但绝对不是终点,最适合你的方式还要由你自己在实际工作中探索和寻找。

      误解五:敏捷很好,因此我要制定标准,所有项目都要遵循着个标准

      没有哪两个项目是一样的,客户是不一样的,人员是不一样的,需求是不一样的,甚至没有什么可能是一样的。不一样的环境和问题,用同样的 方法解决,是不可能解决的好的。方法是为人服务的,应该为项目团队找到最适合他们的方法,而不是先确定方法,再让团队适应这个方法。因此也不存在适合所有 项目的统一的方法。任何企图统一所有项目过程的方法都是不正确的。

      同时,对于同一个团队,随着项目的进行,对需求理解的深入,对技术理解的深入,一开始适合项目的过程和方法也会渐渐的不适合。这时候 也需要团队对过程进行及时的调整,保证项目的质量和效率。敏捷是动态的,而非静止不变的,因为这个世界本身就是变化的,在变化的世界使用不变的方法,是不 现实的。银弹从来就没有过,在有限的将来也不会存在。

  • Extreme Programming(极限编程,简称XP)

    2010-06-01 14:33:46

    来源:chinaxp  http://www.xpchina.org     waltson
         Extreme Programming(极限编程,简称XP)是由Kent Beck在1996年提出的。Kent Beck在九十年代初 期与Ward Cunningham共事时,就一直共同探索着新的软件开发方法,希望能使软件开发更加简单而有
    效。Kent仔细地观察和分析了各种简化软件开发的前提条件、可能行以及面临的困难。1996年三月,
    Kent终于在为DaimlerChrysler所做的一个项目中引入了新的软件开发观念——XP。

    XP是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观
    是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简
    单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个
    相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚
    开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。

    什么是软件开发

    软件开发的内容是:需求、设计、编程和测试!
    需求:不仅仅是用户需求,应该是开发中遇到的所有的需求。比如,你首先要知道做这个项目是为了解
    决什么问题;测试案例中应该输入什么数据……为了清楚地知道这些需求,你经常要和客户、项目经理
    等交流。
    设计:编码前,肯定有个计划告诉你要做什么,结构是怎样等等。你一定要按照这个来做,否则可能会
    一团糟。
    编程:如果在项目截止日,你的程序不能跑起来或达不到客户的要求,你就拿不到钱。
    测试:目的是让你知道,什么时候算是完成了。如果你聪明,你就应该先写测试,这样可以及时知道你
    是否真地完成了。否则,你经常会不知道,到底有哪些功能是真正完成了,离预期目标还差多远。

    软件开发中,客户和开发人员都有自己的基本权利和义务。
    客户:
     • 定义每个用户需求的商业优先级;
     • 制订总体计划,包括用多少投资、经过多长时间、达到什么目的;
     • 在项目开发过程中的每个工作周,都能让投资获得最大的收益;
     • 通过重复运行你所指定的功能测试,准确地掌握项目进展情况;
     • 能随时改变需求、功能或优先级,同时避免昂贵的再投资;能够根据各种变化及时调整项目计划;
     • 能够随时取消项目;项目取消时,以前的开发工作不是一堆垃圾,已开发完的功能是合乎要求的,
    正在进行或未完成的的工作则应该是不难接手的。
    开发人员:
     • 知道要做什么,以及要优先做什么;
     • 工作有效率;
     • 有问题或困难时,能得到客户、同事、上级的回答或帮助;
     • 对工作做评估,并根据周围情况的变化及时重新评估;
     • 积极承担工作,而不是消极接受分配;
     • 一周40小时工作制,不加班。

    这就是软件开发,除此之外再还有其它要关心的问题!

    灵巧的轻量级软件开发方法

    一套软件开发方法是由一系列与开发相关的规则、规范和惯例。重量级的开发方法严格定义了许多的规
    则、流程和相关的文档工作。灵巧的轻量级开发方法,其规则和文档相对较少,流程更加灵活,实施起
    来相对较容易。

    在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很
    繁琐,程序员之间也很难读懂对方写的代码。1968年,Edsger Dijkstra给CACM写了一封题为GOTO 
    Statement Considered Harmful 的信,软件工程的概念由此诞生。程序员们开始摒弃以前的做法,转
    而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定
    了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,
    规则和流程也越来越精细和复杂。

    到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的
    制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大
    的辅助开发工具(Case Tools),但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。
    为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。

    失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行
    删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规
    则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流
    水生产线,而是更加灵活。

    Extreme Programming(XP)就是这样一种灵巧的轻量级软件开发方法。

    为什么称为“Extreme”(极限) 

    “Extreme”(极限) 是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、
    做到最好;其它XP所不提倡的,则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其
    开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。 



    XP的软件开发是什么样

    1 极限的工作环境

    为了在软件开发过程中最大程度地实现和满足客户和开发人员的基本权利和义务,XP要求把工作环境也
    做得最好。每个参加项目开发的人都将担任一个角色(项目经理、项目监督人等等)并履行相应的权利
    和义务。所有的人都在同一个开放的开发环境中工作,最好是所有人在同一个大房子中工作,还有茶点
    供应;每周40小时,不提倡加班;每天早晨,所有人一起站着开个短会;墙上有一些大白板,所有的
    Story卡、CRC卡等都贴在上面,讨论问题的时候可以在上面写写画画;下班后大家可以一起玩电脑游
    戏……。

    2 极限的需求

    客户应该是项目开发队伍中的一员,而不是和开发人员分开的;因为从项目的计划到最后验收,客户一
    直起着很重要的作用。开发人员和客户一起,把各种需求变成一个个小的需求模块(User Story),例
    如“计算年级的总人数,就是把该年级所有班的人数累加。”;这些模块又会根据实际情况被组合在一
    起或者被分解成更小的模块;它们都被记录在一些小卡片(Story Card)上,之后分别被程序员们在各
    个小的周期开发中(Iteration,通常不超过3个星期)实现;客户根据每个模块的商业价值来指定它们
    的优先级;开发人员要做的是确定每个需求模块的开发风险,风险高的(通常是因为缺乏类似的经验)
    需求模块将被优先研究、探索和开发;经过开发人员和客户分别从不同的角度评估每个模块后,它们被
    安排在不同的开发周期里,客户将得到一个尽可能准确的开发计划;客户为每个需求模块指定验收测试
    (功能测试)。

    每发布一次开发的软件(经过一个开发周期),用户都能得到一个可以开始使用的系统,这个系统全面
    实现了相应的计划中的所有需求。而在一些传统的开发模式中,无论什么功能,用户都要等到所有开发
    完成后才能开始使用。 

    3 极限的设计 

    从具体开发的角度来看,XP内层的过程是一个个基于测试驱动的开发(Test Driven Development)周
    期,诸如计划和设计等外层的过程都是围绕这些展开的。每个开发周期都有很多相应的单元测试
    (Unit Test)。刚开始,因为什么都没有实现,所以所有的单元测试都是失败的;随着一个个小的需
    求模块的完成,通过的单元测试也越来越多。通过这种方式,客户和开发人员都很容易检验,是否履行
    了对客户的承诺。XP提倡对于简单的设计(Simple Design),就是用最简单的方式,使得为每个简单
    的需求写出来的程序可以通过所有相关的单元测试。XP强调抛弃那种一揽子详细设计方式(Big 
    Design Up Front),因为这种设计中有很多内容是你现在或最近都根本不需要的。XP还大力提倡设计
    复核(Review)、代码复核以及重整和优化(Refectory),所有的这些过程其实也是优化设计的过
    程;在这些过程中不断运行单元测试和功能测试,可以保证经过重整和优化后的系统仍然符合所有需
    求。 

    4 极限的编程 

    既然编程很重要,XP就提倡两个人一起写同一段程序(Pair Programming),而且代码所有权是归于整
    个开发队伍(Collective Code Ownership)。程序员在写程序和重整优化程序的时候,都要严格遵守
    编程规范。任何人都可以修改其他人写的程序,修改后要确定新程序能通过单元测试。 

    5 极限的测试 

    既然测试很重要,XP就提倡在开始写程序之前先写单元测试。开发人员应该经常把开发好的模块整合到
    一起(Continuous Integration),每次整合后都要运行单元测试;做任何的代码复核和修改,都要运
    行单元测试;发现了BUG,就要增加相应的测试(因此XP方法不需要BUG数据库)。除了单元测试之外,
    还有整合测试,功能测试、负荷测试和系统测试等。所有这些测试,是XP开发过程中最重要的文档之
    一,也是最终交付给用户的内容之一。
    ============================================================
    XP中的重要惯例和规则

    1 项目开发小组(Team)

    在XP中,每个对项目做贡献的人都应该是项目开发小组中的一员。而且,这个小组中必须至少有一个人
    对用户需求非常清晰,能够提出需求、决定各个需求的商业价值(优先级)、根据需求等的变化调整项
    目计划等。这个人扮演的是“客户”这个角色,当然最好就是实际的最终用户,因为整个项目就是围绕
    最终用户的需求而展开的。程序员是项目开发小组中必不可少的成员。小组中可以有测试员,他们帮助
    客户制订验收测试;有分析员,帮助客户确定需求;通常还有个Coach(教练),负责跟踪开发进度、
    解决开发中遇到的一些问题、推动项目进行;还可以又一个项目经理,负责调配资源、协助项目内外的
    交流沟通等等。项目小组中有这么多角色,但并不是说,每个人做的工作是别人不能插手或干预的,XP
    鼓励每个人尽可能地为项目多做贡献。平等相处,取长补短;这就是最好的XP开发小组。

    2 计划项目(Planning Game)、验收测试、小规模发布(Small Releases)

    XP开发小组使用简单的方式进行项目计划和开发跟踪,并以次预测项目进展情况和决定未来的步骤。根
    据需求的商业价值,开发小组针对一组组的需求进行一系列的开发和整合,每次开发都会产生一个通过
    测试的、可以使用的系统。

    •  计划项目

    XP的计划过程主要针对软件开发中的两个问题:预测在交付日期前可以完成多少工作;现在和下一步该
    做些什么。不断的回答这两个问题,就是直接服务于如何实施及调整开发过程;与此相比,希望一开始
    就精确定义整个开发过程要做什么事情以及每件事情要花多少时间,则事倍功半。针对这两个问题,XP
    中又两个主要的相应过程:

    软件发布计划(Release Planning)。客户阐述需求,开发人员估算开发成本和风险。客户根据开发成
    本、风险和每个需求的重要性,制订一个大致的项目计划。最初的项目计划没有必要(也没有可能)非
    常准确,因为每个需求的开发成本、风险及其重要性都不是一成不变的。而且,这个计划会在实施过程
    中被不断地调整以趋精确。

    周期开发计划(Iteration Planning)。开发过程中,应该有很多阶段计划(比如每三个星期一个计
    划)。开发人员可能在某个周期对系统进行内部的重整和优化(代码和设计),而在某个周期增加了新
    功能,或者会在一个周期内同时做两方面的工作。但是,经过每个开发周期,用户都应该能得到一个已
    经实现了一些功能的系统。而且,每经过一个周期,客户就会再提出确定下一个周期要完成的需求。在
    每个开发周期中,开发人员会把需求分解成一个个很小的任务,然后估计每个任务的开发成本和风险。
    这些估算是基于实际开发经验的,项目做得多了,估算自然更加准确和精确;在同一个项目中,每经过
    一个开发周期,下一次的估算都会有更过的经验、参照和依据,从而更加准确。
    这些简单的步骤对客户提供了丰富的、足够的信息,使之能灵活有效地调控开发进程。每过两三个星
    期,客户总能够实实在在地看到开发人员已经完成的需求。在XP里,没有什么“快要完成了”、“完成
    了90%”的模糊说法,要不是完成了,要不就是没完成。这种做法看起来好象有利有弊:好处是客户可以
    马上知道完成了哪些、做出来的东西是否合用、下面还要做些什么或改进什么等等;坏处是客户看到做
    出来的东西,可能会很不满意甚至中止合同。实际上,XP的这种做法是为了及早发现问题、解决问题,
    而不是等到过了几个月,用户终于看到开发完的系统了,然后才告诉你这个不行、那个变了、还要增加
    哪个内容等等。

    •  验收测试

    客户对每个需求都定义了一些验收测试。通过运行验收测试,开发人员和客户可以知道开发出来的软件
    是否符合要求。XP开发人员把这些验收测试看得和单元测试一样重要。为了不浪费宝贵的时间,最好能
    将这些测试过程自动化。

    •  频繁地小规模发布软件(Small Releases)

    每个周期(Iteration)开发的需求都是用户最需要的东西。在XP中,对于每个周期完成时发布的系
    统,用户都应该可以很容易地进行评估,或者已经能够投入实际使用。这样,软件开发对于客户来说,
    不再是看不见摸不着的东西,而是实实在在的。XP要求频繁地发布软件,如果有可能,应该每天都发布
    一个新版本;而且在完成任何一个改动、整合或者新需求后,就应该立即发布一个新版本。这些版本的
    一致性和可靠性,是靠验收测试和测试驱动的开发来保证的。

    3 简单设计,Pair Programming,测试驱动开发,重整和优化

    XP程序员不但做为一个开发小组共同工作,还以两个人为一个小开发单元编写同一个程序。开发人员们
    进行简单的设计,编写单元测试后再编写符合测试要求的代码,并在满足需求的前提下不断地优化设
    计。

    •  简单设计

    XP中让初学者感到最困惑的就是这点。XP要求用最简单的办法实现每个小需求,前提是按照这些简单设
    计开发出来的软件必须通过测试。这些设计只要能满足系统和客户在当下的需求就可以了,不需要任何
    画蛇添足的设计,而且所有这些设计都将在后续的开发过程中就被不断地重整和优化。

    在XP中,没有那种传统开发模式中一次性的、针对所有需求的总体设计。在XP中,设计过程几乎一直贯
    穿着整个项目开发:从制订项目的计划,到制订每个开发周期(Iteration)的计划,到针对每个需求
    模块的简捷设计,到设计的复核,以及一直不间断的设计重整和优化。整个设计过程是个螺旋式的、不
    断前进和发展的过程。从这个角度看,XP是把设计做到了极致。

    •  Pair Programming

    XP中,所有的代码都是由两个程序员在同一台机器上一起写的——这是XP中让人争议最多、也是最难实
    施的一点。这保证了所有的代码、设计和单元测试至少被另一个人复核过,代码、设计和测试的质量因
    此得到提高。看起来这样象是在浪费人力资源,但是各种研究表明事实恰恰相反。—— 这种工作方式
    极大地提高了工作强度和工作效率。

    很多程序员一开始是被迫尝试这点的(XP也需要行政命令的支持)。开始时总是不习惯的,而且两个人
    的效率不会比一个人的效率高。这种做法的效果往往要坚持几个星期或一两个月后才能很显著。据统
    计,在所有刚开始Pair Programming的程序员中,90%的人在两个月以后都很认为这种工作方式更加高
    效。

    项目开发中,每个人会不断地更换合作编程的伙伴。因此,Pair Programming不但提高了软件质量,还
    增强了相互之间的知识交流和更新,增强了相互之间的沟通和理解。这不但有利于个人,也有利于整个
    项目、开发队伍和公司。从这点看,Pair Programming不仅仅适用于XP,也适用于所有其它的软件开发
    方法。

    •  测试驱动开发

    反馈是XP的四个基本的价值观之一——在软件开发中,只有通过充分的测试才能获得充分的反馈。XP中
    提出的测试,在其它软件开发方法中都可以见到,比如功能测试、单元测试、系统测试和负荷测试等;
    与众不同的是,XP将测试结合到它独特的螺旋式增量型开发过程中,测试随着项目的进展而不断积累。
    另外,由于强调整个开发小组拥有代码,测试也是由大家共同维护的。即,任何人在往代码库中放程序
    (Check In)前,都应该运行一遍所有的测试;任何人如果发现了一个BUG,都应该立即为这个BUG增加
    一个测试,而不是等待写那个程序的人来完成;任何人接手其他人的任务,或者修改其他人的代码和设
    计,改动完以后如果能通过所有测试,就证明他的工作没有破坏愿系统。这样,测试才能真正起到帮助
    获得反馈的作用;而且,通过不断地优先编写和累积,测试应该可以基本覆盖全部的客户和开发需求,
    因此开发人员和客户可以得到尽可能充足的反馈。

    •  重整和优化 (Refactoring)

    XP强调简单的设计,但简单的设计并不是没有设计的流水帐式的程序,也不是没有结构、缺乏重用性的
    程序设计。开发人员虽然对每个USER STORY都进行简单设计,但同时也在不断地对设计进行改进,这个
    过程叫设计的重整和优化(Refactoring)。这个名字最早出现在Martin Fowler写的《Refactoring: 
    Improving the Design of Existing Code》这本书中。

    Refactoring主要是努力减少程序和设计中重复出现的部分,增强程序和设计的可重用性。Refactoring
    的概念并不是XP首创的,它已经被提出了近30年了,而且一直被认为是高质量的代码的特点之一。但XP
    强调,把Refactoring做到极致,应该随时随地、尽可能地进行Refactoring,只要有可能,程序员都不
    应该心疼以前写的程序,而要毫不留情地改进程序。当然,每次改动后,程序员都应该运行测试程序,
    保证新系统仍然符合预定的要求。

    4 频繁地整合,集体拥有代码(Collective Code Ownership),编程规范

    XP开发小组经常整合不同的模块。为了提高软件质量,除了测试驱动开发和Pair Programming以外,XP
    要求每个人的代码都要遵守编程规范,任何人都可以修改其他人写的代码,而且所有人都应该主动检查
    其他人写的代码。

    •  频繁地整合 (Integration )

    在很多项目中,开发人员往往很迟才把各个模块整合在一起。在这些项目中,开发人员经常在整合过程
    中发现很多问题,但不能肯定到底是谁的程序出了问题;而且,只有整合完成后,开发人员才开始稍稍
    使用整个系统,然后就马上交付给客户验收。对于客户来说,即使这些系统能够通过终验收测试,因为
    使用时间短,客户门心里并没有多少把握。

    为了解决这些问题,XP提出,整个项目过程中,应该频繁地,尽可能地整合已经开发完的USER STORY
    (每次整合一个新的USER STORY)。每次整合,都要运行相应的单元测试和验收测试,保证符合客户和
    开发的要求。整合后,就发布一个新的应用系统。这样,整个项目开发过程中,几乎每隔一两天,都会
    发布一个新系统,有时甚至会一天发布好几个版本。通过这个过程,客户能非常清楚地掌握已经完成的
    功能和开发进度,并基于这些情况和开发人员进行有效地、及时地交流,以确保项目顺利完成。

    •  集体拥有代码(Collective Code Ownership)

    在很多项目开发过程中,开发人员只维护自己的代码,而且很多人不喜欢其他人随意修改自己的代码。
    因此,即使可能有相应的比较详细的开发文档,但一个程序员却很少、也不太愿意去读其他程序员的代
    码;而且,因为不清楚其他人的程序到底实现了什么功能,一个程序员一般也不敢随便改动其他人的代
    码。同时,因为是自己维护自己的代码,可能因为时间紧张或技术水平的局限性,某些问题一直不能被
    发现或得到比较好的解决。针对这点,XP提倡大家共同拥有代码,每个人都有权利和义务阅读其他代
    码,发现和纠正错误,重整和优化代码。这样,这些代码就不仅仅是一两个人写的,而是由整个项目开
    发队伍共同完成的,错误会减少很多,重用性会尽可能地得到提高,代码质量是非常好。

    为了防止修改其他人的代码而引起系统崩溃,每个人在修改后都应该运行测试程序。(从这点,我们可
    以再次看到,XP的各个惯例和规则是怎样有机地结合在一起的。)

    •  编程规范

    XP开发小组中的所有人都遵循一个统一的编程标准,因此,所有的代码看起来好像是一个人写的。因为
    有了统一的编程规范,每个程序员更加容易读懂其他人写的代码,这是是实现Collective Code 
    Ownership的重要前提之一。

    5 Metaphor(系统比喻),不加班

    XP过程通过使用一些形象的比喻让所有人对系统有个共同的、简洁的认识。XP认为加班是不正常的,因
    为这说明关于项目进度的估计和安排有问题。 

    •  Metaphor(系统比喻)

    为了帮助每个人一致清楚地理解要完成的客户需求、要开发的系统功能,XP开发小组用很多形象的比喻
    来描述系统或功能模块是怎样工作的。比如,对于一个搜索引擎,它的Metaphor可能就是“一大群蜘
    蛛,在网上四处寻找要捕捉的东西,然后把东西带回巢穴。”

    •  不加班

    大量的加班意味着原来的计划是不准确的,或者是程序远不清楚自己到底什么时候能完成什么工作。而
    且,开发管理人员和客户也因此无法准确掌握开发速度;开发人员也因此非常疲劳。XP认为,如果出现
    大量的加班现象,开发管理人员(比如Coach)应该和客户一起确定加班的原因,并及时调整项目计
    划、进度和资源。
    ============================================================
    XP中一些基本概念的简介

    User Story:开发人员要求客户把所有的需求写成一个个独立的小故事,每个只需要几天时间就可以完
    成。开发过程中,客户可以随时提出新的User Story,或者更改以前的User Story。

    Story Estimates和开发速度:开发小组对每个User Story进行估算,并根据每个开发周期
    (Iteration)中的实际情况反复计算开发速度。这样,开发人员和客户能知道每个星期到底能开发多
    少User Story。

    Release Plan和Release Scope:整个开发过程中,开发人员将不断地发布新版本。开发人员和客户一
    起确定每个发布所包含的User Story。

    Iteration(开发周期)和Iteration Plan:在一个Release过程中,开发人员要求客户选择最有价值的
    User Story作为未来一两个星期的开发内容。

    The Seed:第一个开发周期(Iteration)完成后,提交给客户的系统。虽然这不是最终的产品,但它
    已经实现了几个客户认为是最重要的Story,开发人员将逐步在其基础上增加新的模块。

    Continuous Integration(整合):把开发完的User Story的模块一个个拼装起来,一步步接近乃至最
    终完成最终产品。

    验收测试(功能测试):对于每个User Story,客户将定义一些测试案例,开发人员将使运行这些测试
    案例的过程自动化。

    Unit Test(单元测试):在开始写程序前,程序员针对大部分类的方法,先写出相应的测试程序。

    Refactoring (重整和优化) :去掉代码中的冗余部分,增加代码的可重用性和伸缩性。 



    小结

    XP的一个成功因素是重视客户的反馈——开发的目的就是为了满足客户的需要。XP方法使开发人员始终
    都能自信地面对客户需求的变化。XP强调团队合作,经理、客户和开发人员都是开发团队中的一员。团
    队通过相互之间的充分交流和合作,使用XP这种简单但有效的方式,努力开发出高质量的软件。XP的设
    计简单而高效;程序员们通过测试获得客户反馈,并根据变化修改代码和设计,他们总是争取尽可能早
    地将软件交付给客户。XP程序员能够勇于面对需求和技术上的变化。

    XP很象一个由很多小块拼起来的智力拼图,单独看每一小块都没有什么意义,但拼装好后,一幅美丽的
    图画就会呈现在你面前。
  • 软件开发方法论:RUP(Rational Unified Process)

    2010-06-01 14:30:53

       随着现代信息产业的蓬勃发展,软件开发已经成为一项浩大繁复的工程。就象是建造一座宏伟的宫殿,从计划、设计到施工,每一个环节都必须严格把关,稍有不 慎,整个工程就会失败。据统计,仅在美国,每年就有180,000个信息技术项目,耗资大约$2500亿美元,其中25-30%的项目会流产。由此可见, 由于管理不善和设计上的失误所造成的损失是巨大的。现代软件开发的管理和方法论显得比以往任何时候都更为重要。 

      软件开发的过程由方法论和工具构成(process = methodology + tools)。正如装配电子设备一样,仅有工具就可以胜任装配 任务。但为了减少失误和提高效率,人们往往采用流水线作业,流水线作业便是一种应用于电子设备装配中的方法论。目前,信息技术市场流行的方法论有RUP (Rational Unified Process), The Zachman Framework, XP (Extreme Programming)等。在这些方法论中,最流行的要数RUP。RUP是由Rational Software公司首创的。因它与 当前流行的JAVA, J2EE技术和面向对象的设计思想(OOAD)紧密的结合在一起,所以在大型的信息技术项目中得到了广泛的应用。在这篇文章中,我 们试图对RUP的特点作一个初步的探讨,并且讨论它是如何贯穿在整个软件开发的生命周期之中的。 

      RUP最重要的它有三大特点:1)软件开发是一个叠代过程,2)软件开发是由Use Case驱动的,3)软件开发是以构架设计(Architectural Design)为中心的。 

      按照传统的瀑布(Waterfall)开发模式,软件开发大致经历如下几个步骤:商务需求分析 (Business Requirement Analysis),系统分析(System Analysis),系统设计 (System Design),开发实现(Implementation),测试(Test),发布(Deployment),系统支持 (Supporting)和系统变更管理(Change Management)。 

      传统的瀑布开发模式假定在进行新的开发过程时,上一个过程已经完成,而且不会回到上一个过程。初看起来,这似乎是一个非常合理,高效率的解决方案,但 20多年的实践证明,这个开发模式存在着很大的弊病,原因是软件开发是一个非常复杂的工程,有诸多的因素影响工程的效率和成败。软件开发需要许多不同背景 的个人和团队参与。由于这些复杂性,在软件开发的整个生命周期中每一个阶段都有可能留下隐患和错误。如果等到系统已经开发实现完毕,在测试阶段发现了重大 问题,这时的返工将会造成人力、物力、财力及时间上的巨大浪费。鉴于以上的考虑,RUP强调软件开发是一个叠代模型(Iterative Model), RUP定义了四个阶段(Phase):开端(Inception),阐述(Elaboration),建造(Construction),过渡 (Transition)。其中每个阶段都有可能经历以上所提到的从商务需求分析开始的各个步骤,只是每个步骤的高峰期会发生在相应的阶段。例如开发实现 的高峰期是发生在建造阶段。实际上这样的一个开发方法论是一个二维模型。这种叠代模型的实现在很大程度上提供了及早发现隐患和错误的机会,因此被现代大型 信息技术项目所采用。 

      RUP 的另一大特征是Use Case 驱动。Use Case是RUP方法论中一个非常重要的概念。简单地说,一个Use Case就是系统的一 个功能。例如在一个基于电子商务的医疗系统中,病人可以坐在家里通过网上浏览器与医生约定看病的时间(Makeappointment),这样, “Makeappointment”就是系统的一个Use Case。在系统分析和系统设计中,Use Case被用来将一个复杂的庞大系统分割、定义成 一个个小的单元,这个小的单元就是Use Case,然后以每个小的单元为对象进行开发。按照RUP, Use Case贯穿整个软件开发的生命周期。在 商务需求分析中,客户或用户对Use Case进行描述,在系统分布和系统设计过程中,设计师对Use Case进行分析,在开发实现过程中,开发编程人 员对Use Case进行实现,在测试过程中,测试人员对Use Case进行检验。 

      RUP的第三大特征是它强调软件开发是以构架为中心的。构架设计(Architectural Design)是系统设计的一个重要组成部分。在构架 设计过程中,设计师(Architect)必须完成对技术和运行平台的选取,整个项目的基础框架(Framework)的设计,完成对公共组件的设计,如 审计(Auditing)系统,日志(Log)系统,错误处理(Exception Handling)系统,安全(Security)系统等。设计师必 须对系统的可扩展性(Extensibility),安全性(Security),可维护性(Maintainability),可延拓性 (Scalability),可重用性(Reusability)和运行速度(Performance)提出可行的解决方案。 

      在RUP方法论中,不同的角色可以从不同的侧面来认识同一个项目。RUP定义了“4+1”个场景(View):Use Case场景(Use Case View),逻辑场景(Logic View),进程场景(process View),实现场景(Implementation View)和发布场景(Deployment View)。 在Use Case场景中,客户和商务分析员对Use Case进行描述,在逻辑场景中,设计师对系统进行分析和设计,在进程场景中,设计师对系统可能出 现的并发性,运行速度和分布特性进行描述。实现场景则反映了程序开发员开发实现的过程。发布场景是描述系统管理员和组装人员实施系统发布和管理的过程。值 得强调的是,系统构架的设计是在逻辑场景中描述的。 

      RUP还定义了4个模型,即Use Case模型(Use Case Model),分析模型(Analysis Model),设计模型(Design Model)和实现模型(Implementation Model)。Use Case 模型包含Use Case Diagram和Use Case文档。Use Case模型是其他三个模型的基础,分析模型即是概念模型 (Conceptual Model),是系统分析所得到的结果,分析模型包含了类图(Class Diagram),次序图 (Sequence Diagram)以及活动图(Activity Diagram)。设计模型则是构架设计和系统设计的结果。当设计模型完成后,开发 编程人员便可以进行编程了。设计模型主要包含了类图,次序图和状态图(State Chart Diagrams)。分析模型和设计模型看起来有许多相似 之处,但两者的含义有本质的区别。分析模型强调的是问题的范围,但并不给出解决问题的方案,分析模型并不涉及具体的技术和平台。例如它并不关心是否应用 EJB或一般的JAVA BEANS,系统是安装在WebSphere或是在WebLogic。但是与之相反,设计模型要考虑这些细节,而且要提供解决这 些问题的全部方案。当然设计模型是建立在分析模型之上的,分析模型中的一个类可直接映射成为设计模型中的类,但这种映射关系一般并不是一一对应的,最后一 个模型是实现模型。实现模型包含构件图(Component Diagram),从这个模型出发,开发编程人员可以产生骨架源程序 (Skeleton Source Code),也可以从源程序出发更新设计模型。 

      目前应用于系统分析和设计的工具主要有Rational Rose和Together Software Center(TogetherJ)。 JAVA和J2EE的开发工具有IBM Websphere Application Developer(WSAD),  Borland Jbuilde和WebGain VisualCafe. WSAD和WebSphere Application Server应用 在一起,使得服务器端的排错和系统的发布变得非常的容易。Jbuilder和VisualCafe一般与WebLogic erver紧密结合在一起。目 前WebSphereServer和WebLogic Server占据了Application Server市场的66%,其中 WebSphere Server占据了37%,成为同类产品的No.1。在单位测试和集成测试中,广泛应用的工具和框架有Junit,  JunitPerf和Cactus.。 

      综上所述,软件开发的方法论已经成为现代软件工程过程中不可缺少的一个重要部分。是目前在Java/J2EE和面向对象的大型项目中广泛被采用的一种 方法论。他对整个软件开发的生命周期提供了基础框架和指导。RUP, UML/Rational Rose, Java/J2EE, WSAD,  Websphere Application Server和Oracle这样的技术、工具和平台的组合是目前许多公司、政府信息技术项目中采用的方 案。因此,RUP的知识和经验也是现在求知是场所需求的热门技能。 转自: http://www.killuakun.com/article.asp?id=419
Open Toolbar