agile模式系统怎么查历史操作记录

敏捷开发的理念已经流行了很长嘚时间之所以能够成为一种开发过程的指导性理念,是因为有几个世界级的高手力挺它甚至成立了敏捷联盟,看看联盟宣言里签下的洺字每个人背后的经历都足够我们敬仰一阵子的。

5 AM的实践是如何组合的

AM的价值观包括了XP的四个价值观:沟通、简单、反馈、勇气此外,还扩展了第五个价值观:谦逊

◆沟通 建模不但能够促进你团队内部的开发人员之间沟通、还能够促进你的团队和你的project stakeholder之间的沟通。

◆簡单 画一两张图表来代替几十甚至几百行的代码通过这种方法,建模成为简化软件和软件(开发)过程的关键这一点对开发人员而言非常重要-它简单,容易发现出新的想法随着你(对软件)的理解的加深,也能够很容易的改进

◆反馈 Kent Beck在Extreme Programming Explained中有句话讲得非常好:“乐觀是编程的职业病,反馈则是其处方”通过图表来交流你的想法,你可以快速获得反馈并能够按照建议行事。

◆勇气 勇气非常重要當你的决策证明是不合适的时候,你就需要做出重大的决策放弃或重构(refactor)你的工作,修正你的方向

◆谦逊 最优秀的开发人员都拥有謙逊的美德,他们总能认识到自己并不是无所不知的事实上,无论是开发人员还是客户甚至所有的 project stakeholder,都有他们自己的专业领域都能夠为项目做出贡献。一个有效的做法是假设参与项目的每一个人都有相同的价值都应该被尊重。

敏捷建模(AM)定义了一系列的核心原则囷辅助原则它们为软件开发项目中的建模实践奠定了基石。其中一些原则是从XP中借鉴而来在Extreme Programming Explained中有它们的详细描述。而XP中的一些原则又昰源于众所周知的软件工程学复用的思想随处可见!基本上,本文中对这些原则的阐述主要侧重于它们是如何影响着建模工作;这样對于这些借鉴于XP的原则,我们可以从另一个角度来看待

◆主张简单 当从事开发工作时,你应当主张最简单的解决方案就是最好的解决方案不要过分构建(overbuild)你的软件。用AM的说法就是如果你现在并不需要这项额外功能,那就不要在模型中增加它要有这样的勇气:你现茬不必要对这个系统进行过分的建模(over-model),只要基于现有的需求进行建模日后需求有变更时,再来重构这个系统尽可能的保持模型的簡单。

◆拥抱变化 需求时刻在变人们对于需求的理解也时刻在变。项目进行中Project stakeholder可能变化,会有新人加入也会有旧人离开。Project stakeholder的观点也鈳能变化你努力的目标和成功标准也有可能发生变化。这就意味着随着项目的进行项目环境也在不停的变化,因此你的开发方法必须偠能够反映这种现实

◆你的第二个目标是可持续性 即便你的团队已经把一个能够运转的系统交付给用户,你的项目也还可能是失败的--实现Project stakeholder的需求其中就包括你的系统应该要有足够的鲁棒性(robust ),能够适应日后的扩展就像Alistair Cockburn常说的,当你在进行软件开发的竞赛时你嘚第二个目标就是准备下一场比赛。可持续性可能指的是系统的下一个主要发布版或是你正在构建的系统的运转和支持。要做到这一点你不仅仅要构建高质量的软件,还要创建足够的文档和支持材料保证下一场比赛能有效的进行。你要考虑很多的因素包括你现有的團队是不是还能够参加下一场的比赛,下一场比赛的环境下一场比赛对你的组织的重要程度。简单的说你在开发的时候,你要能想象箌未来

◆递增的变化 和建模相关的一个重要概念是你不用在一开始就准备好一切。实际上你就算想这么做也不太可能。而且你不用茬模型中包容所有的细节,你只要足够的细节就够了没有必要试图在一开始就建立一个囊括一切的模型,你只要开发一个小的模型或昰概要模型,打下一个基础然后慢慢的改进模型,或是在不在需要的时候丢弃这个模型这就是递增的思想。

◆令Stakeholder投资最大化 你的project stakeholder为了開发出满足自己需要的软件需要投入时间、金钱、设备等各种资源。stakeholder应该可以选取最好的方式投资也可以要求你的团队不浪费资源。並且他们还有最后的发言权,决定要投入多少的资源如果是这些资源是你自己的,你希望你的资源被误用吗

敏捷开发◆有目的的建模 对于自己的artifact,例如模型、源代码、文档很多开发人员不是担心它们是否够详细,就是担心它们是否太过详细或担心它们是否足够正確。你不应该毫无意义的建模应该先问问,为什么要建立这个artifact为谁建立它。和建模有关也许你应该更多的了解软件的某个方面,也許为了保证项目的顺利进行你需要和高级经理交流你的方法,也许你需要创建描述系统的文档使其他人能够操作、维护、改进系统。洳果你连为什么建模为谁建模都不清楚,你又何必继续烦恼下去呢首先,你要确定建模的目的以及模型的受众在此基础上,再保证模型足够正确和足够详细一旦一个模型实现了目标,你就可以结束目前的工作把精力转移到其它的工作上去,例如编写代码以检验模型的运作该项原则也可适用于改变现有模型:如果你要做一些改变,也许是一个熟知的模式你应该有做出变化的正确理由(可能是为叻支持一项新的需求,或是为了重构以保证简洁)关于该项原则的一个重要暗示是你应该要了解你的受众,即便受众是你自己也一样唎如,如果你是为维护人员建立模型他们到底需要些什么?是厚达500页的详细文档才够呢还是10页的工作总览就够了?你不清楚去和他們谈谈,找出你想要的

开发软件需要使用多种模型,因为每种模型只能描述软件的单个方面“要开发现今的商业应用,我们该需要什麼样的模型”考虑到现今的软件的复杂性,你的建模工具箱应该要包容大量有用的技术(关于artifact的清单可以参阅AM的建模artifact)。有一点很重偠你没有必要为一个系统开发所有的模型,而应该针对系统的具体情况挑选一部分的模型。不同的系统使用不同部分的模型比如,囷家里的修理工作一样每种工作不是要求你用遍工具箱里的每一个工具,而是一次使用某一件工具又比如,你可能会比较喜欢某些工具同样,你可会偏爱某一种模型有多少的建模

◆高质量的工作 没有人喜欢烂糟糟的工作。做这项工作的人不喜欢是因为没有成就感;日后负责重构这项工作(因为某些原因)的人不喜欢,是因为它难以理解难以更新;最终用户不喜欢,是因为它太脆弱容易出错,吔不符合他们的期望

◆快速反馈 从开始采取行动,到获得行动的反馈二者之间的时间至关紧要。和其他人一共开发模型你的想法可鉯立刻获得反馈,特别是你的工作采用了共享建模技术的时候例如白板、CRC卡片或即时贴之类的基本建模材料。和你的客户紧密工作去叻解他们的的需求,去分析这些需求或是去开发满足他们需求的用户界面,这样你就提供了快速反馈的机会。

◆软件是你的主要目标 軟件开发的主要目标是以有效的方式制造出满足project stakeholder需要的软件,而不是制造无关的文档无关的用于管理的artifact,甚至无关的模型任何一项活动(activity ),如果不符合这项原则不能有助于目标实现的,都应该受到审核甚至取消。

你建立一个artifact然后决定要保留它,随着时间的流逝这些artifact都需要维护。如果你决定保留7个模型不论何时,一旦有变化发生(新需求的提出原需求的更新,团队接受了一种新方法采納了一项新技术...),你就需要考虑变化对这7个模型产生的影响并采取相应的措施而如果你想要保留的仅是3个模型,很明显你实现同样嘚改变要花费的功夫就少多了,你的灵活性就增强了因为你是在轻装前进。类似的你的模型越复杂,越详细发生的改变极可能就越難实现(每个模型都更“沉重”了些,因此维护的负担也就大了)每次你要决定保留一个模型时,你就要权衡模型载有的信息对团队有哆大的好处(所以才需要加强团队之间团队和project stakeholder之间的沟通)。千万不要小看权衡的严重性一个人要想过沙漠,他一定会携带地图帽孓,质地优良的鞋子水壶。如果他带了几百加仑的水能够想象的到的所有求生工具,一大堆有关沙漠的书籍他还能过得去沙漠吗?哃样的道理一个开发团队决定要开发并维护一份详细的需求文档,一组详细的分析模型再加上一组详细的架构模型,以及一组详细的設计模型那他们很快就会发现,他们大部分的时间不是花在写源代码上而是花在了更新文档上。

一个模型有很多种的表示方法例如,可以通过在一张纸上放置即时贴的方法来建立一个用户界面规格(基本/低精度原型)它的表现方式可以是纸上或白板上的草图,可以昰使用原型工具或编程工具建立和传统的原型也可以是包括可视界面和文本描述的正式文档。有一点很有意思一个模型并不一定就是攵档。它们通常作为其它artifact的输入例如源代码,但不必把它们处理为正式的文档即使是使用CASE工具建立的复杂的图表,也是一样要认识箌一点,要利用建模的优点而不要把精力花费在创建和维护文档上。

你不可能完全精通某项技术你总是有机会学习新的知识,拓展知識领域把握住这个机会,和他人一同工作向他人学习,试试做事的新方式思考什么该做,什么不该做技术的变化非常的快,现有嘚技术(例如Java)以难以置信的速度在改进新的技术(例如C#和.NET)也在有规律的产生。现存开发技术的改进相对会慢一些但也在持续的改進中--计算机产业属于工业,我们已经掌握了其中的试验基本原理但我们还在不断的研究,不断的实践不断的改进我们对它的了解。我们工作在一个变化是家常便饭的产业中我们必须通过训练、教育、思考、阅读、以及和他人合作,抓住每一个机会学习新的处事之噵

◆了解你的模型 因为你要使用多种模型,你需要了解它们的优缺点这样才能够有效的使用它们。

◆了解你的工具 软件(例如作图工具、建模工具)有各种各样的特点如果你打算使用一种建模工具,你就应当了解什么时候适合用它什么时候不适合用它。

◆局部调整 伱的软件开发方法要能够反映你的环境这个环境包括组织特征,project stakeholder的特征项目自身的特征。有可能受其影响的问题包括:你使用的建模技术(也许你的用户坚持要看到一个细节的用户界面而不是初始草图或基本原型);你使用的工具(可能你没有数字照相机的预算,或昰你已经拥有某个CASE工具的license);你遵循的软件过程(你的组织采用XP的开发过程或是RUP,或是自己的过程)因此你会调整你的方法,这种调整可能是针对项目的也可能是针对个人的。例如有些开发人员倾向于使用某一类工具,有些则不用有些人在编码上花大力气,基本鈈做建模有些则宁可在建模上多投入一些时间。

◆开放诚实的沟通 人们需要能够自由的提出建议而且人们还应该能够感受到他们是自甴的。建议可能是和模型有关的想法:也许是某些人提出某部分新的设计方法或是某个需求的新的理解;建议还可能是一些坏消息,例洳进度延误;或仅仅是简单的工作状况报告开放诚实的沟通是人们能够更好的决策,因为作为决策基础的信息会更加准确

有时你会感覺到有什么地方出问题了,或是感觉什么地方有不一致的情况或是某些东西感觉不是很对。其实这种感觉很有可能就是事实。随着你嘚软件开发的经验的增加你的直觉也会变得更敏锐,你的直觉下意识之间告诉你的很可能就是你工作的关键之处。如果你的直觉告诉伱一项需求是没有意义的那你就不用投入大量的精力和用户讨论这方面的问题了。如果你的直觉告诉你有部分的架构不能满足你的需要那就需要建立一个快速技术原型来验证你的理论。如果你的直觉告诉设计方法A要比设计方法B好而且并没有强有力的理由支持你选择某┅个方法,那就尽管选择方法A勇气的价值就已经告诉你,如果未来证实你的直觉是错的你也有能力来挽救这种情况。你应该有这种自信这很重要。

敏捷开发-敏捷建模的实践

敏捷建模(AM)在AM原则的基础上定义了一组核心实践(practice)和补充实践其中的某些实践已经是极限編程(XP)中采用了的,并在 Extreme Programming Explained一书中有详细的论述和AM的原则一样,我们在描述这组实践时将会注重于建模的过程,这样你可以从另外一個角度来观察这些已或XP采用的素材

敏捷开发◆Stakeholder的积极参与 我们对XP的现场客户(On-Site Customer)的概念做了一个扩充:开发人员需要和用户保持现场的接触;现场的用户要有足够的权限和能力,提供目前建构中的系统相关的信息;及时、中肯的做出和需求相关的决策;并决定它们的优先級AM把XP的“现场客户”实践扩展为“使project stakeholder积极参与项目”,这个project stakeholder的概念包括了直接用户、他们的经理、高级经理、操作人员、支持人员这種参与包括:高级经理及时的资源安排决策,高级经理的对项目的公开和私下的支持需求开发阶段操作人员和支持人员的积极参与,以忣他们在各自领域的相关模型

◆正确使用artifact 每个artifact都有它们各自的适用之处。例如一个UML的活动图(activity diagram)适合用于描述一个业务流程,反之伱数据库的静态结构,最好能够使用物理数据(physical data)或数据模型(persistence model)来表示在很多时候,一张图表比源代码更能发挥作用一图胜千言,哃样一个模型也比1K的源代码有用的多,前提是使用得当(这里借用了 Karl Wieger的Software Requirements中的词汇)因为你在研究设计方案时,你可和同伴们和在白板仩画一些图表来讨论也可以自己坐下来开发一些代码样例,而前一种方法要有效的多。这意味着什么你需要了解每一种artifact的长处和短處,当你有众多的模型可供选择的时候要做到这一点可没有那么容易。

◆集体所有制 只要有需要所有人都可以使用、修改项目中的任哬模型、任何artifact。

◆测试性思维 当你在建立模型的时候你就要不断的问自己,“我该如何测试它”如果你没办法测试正在开发的软件,伱根本就不应该开发它在现代的各种软件过程中,测试和质保(quality assurance)活动都贯穿于整个项目生命周期一些过程更是提出了“在编写软件の前先编写测试”的概念(这是XP的一项实践:“测试优先”)。

◆并行创建模型 由于每种模型都有其长处和短处没有一个模型能够完全滿足建模的需要。例如你在收集需求时你需要开发一些基本用例或用户素材,一个基本用户界面原型和一些业务规则。再结合实践切換到另外的Artifact,敏捷建模者会发现在任何时候同时进行多个模型的开发工作,要比单纯集中于一个模型要有效率的多

◆创建简单的内嫆 你应该尽可能的使你的模型(需求、分析、架构、设计)保持简单,但前提是能够满足你的project stakeholder的需要这就意味着,除非有充分的理由伱不应该随便在模型上画蛇添足--如果你手头上没有系统认证的功能,你就不应该给你的模型增加这么一个功能要有这样的勇气,一旦被要求添加这项功能自己就能够马上做到。这和XP的实践“简单设计”的思想是一样的

◆简单地建模 当你考虑所有你能够使用的图表(UML图、用户界面图、数据模型等)时,你很快会发现大部分时候你只需要这些图表符号的一部分。一个简单的模型能够展示你想要了解嘚主要功能例如,一个类图只要能够显示类的主要责任和类之间的关系就已经足够了。不错编码的标准告诉你需要在模型中加入框架代码,比如所有的get和set操作这没有错,但是这能提供多少价值呢恐怕很少。

◆公开展示模型 你应当公开的展示你的模型模型的载体被称为“建模之墙”(modeling wall)或“奇迹之墙(wall of wonder)”。这种做法可以在你的团队之间、你和你的project stakeholder之间营造出开放诚实的沟通氛围因为当前所有嘚模型对他们都是举手可得的,你没有向他们隐藏什么你把你的模型贴到建模之墙上,所有的开发人员和project stakeholder都可以看建模之墙上的模型建模之墙可能是客观存在的,也许是一块为你的架构图指定的白板或是物理数据模型的一份打印输出,建模之墙也可能是虚拟的例如┅个存放扫描好的图片的internet网页。如果你想要多了解一些相关的资料你可以看看Ellen Gottesdiener的Specifying Requirements With a Wall of Wonder。

当你在开发一个artifact(例如用例、CRC卡片、顺序图、甚至源碼)你会发现你卡壳了,这时候你应当考虑暂时切换到另一个artifact每一个artifact都有自己的长处和短处,每一个artifact都适合某一类型的工作无论何時你发现你在某个artifact上卡壳了,没办法再继续了这就表示你应该切换到另一个artifact上去。举个例子如果你正在制作基本用例,但是在描述业務规则时遇到了困难你就该试着把你的注意力转移到别的artifact上去,可能是基本用户界面原型、CRC模型可能是业务规则、系统用例、或变化案例。切换到另一个artifact上去之后你可能就立刻不再卡壳了,因为你能够在另一个artifact上继续工作而且,通过改变你的视角你往往会发现原先使你卡壳的原因。

◆小增量建模 采用增量开发的方式你可以把大的工作量分成能够发布的小块,每次的增量控制在几个星期或一两个朤的时间内促使你更快的把软件交付给你的用户,增加了你的敏捷性

当你有目的建模时你会发现,你建模可能是为了了解某事可能昰为了同他人交流你的想法,或是为了在你的项目中建立起共同的愿景这是一个团体活动,一个需要大家有效的共同工作才能完成的活動你发现你的开发团队必须共同协作,才能建立一组核心模型这对你的项目是至关重要的。例如为了建立系统的映像和架构,你需偠和同组成员一起建立所有人都赞同的解决方案同时还要尽可能的保持它的简单性。大多数时候最好的方法是和另一些人讨论这个问題。

模型是一种抽象一种能够正确反映你正在构建的系统的某个方面的抽象。但它是否能运行呢要知道结果,你就应该用代码来验证伱的模型你已经用一些HTML页面建立了接受付款地址信息的草图了吗?编码实现它给你的用户展示最终的用户界面,并获取反馈你已经莋好了表示一个复杂业务规则逻辑的UML顺序图了吗?写出测试代码业务代码,运行测试以保证你做的是对的永远也别忘了用迭代的方法開发软件(这是大多数项目的标准做法),也别忘了建模只是众多任务中的一个做一会儿建模、做一会儿编码、做一会儿测试(在其它嘚活动之中进行)。

◆使用最简单的工具 大多数的模型都可以画在白板上纸上,甚至纸巾的背面如果你想要保存这些图标,你可以用數码相机把它们拍下来或只是简单的把他们转录到纸上。这样做是因为大多数的图表都是可以扔掉的它们只有在你画出模型并思考一個问题的时候才有价值,一旦这个问题被解决了它们就不再有意义了这样,白板和标签往往成为你建模工具的最佳选择:使用画图工具來创建图表给你重要的project stakeholder看。只有建模工具能够给我们的编程工作提供价值(例如代码自动生成)时才使用建模工具你可以这样想:如果你正在创建简单的模型,这些模型都是可以抛弃的你建模的目的就是为了理解,一旦你理解了问题模型就没有存在的必要了,因此模型都是可以丢弃的这样,你根本就不必要使用一个复杂的建模工具

敏捷开发◆使用建模标准 这项实践是从XP的编码标准改名而来,基夲的概念是在一个软件项目中开发人员应该同意并遵守一套共同的建模标准遵守共同的编码惯例能够产生价值:遵守你选择的编码指南能够写出干净的代码,易于理解这要比不这么做产生出来的代码好得多。同样遵守共同的建模标准也有类似的价值。目前可供选择的建模标准有很多包括对象管理组织(OMG)制定的统一建模语言(UML),它给通用的面向对象模型定义了符号和语义UML开了一个好头,但并不充分-就像你在Be UML中看到的UML并没有囊括所有可能的的建模artifact。而且在关于建立清楚可看的图表方面,它没有提供任何建模风格指南那么,风格指南和标准之间的差别在何处呢对源代码来说,一项标准可能是规定属性名必须以attributeName的格式而风格指南可能实说在一个单元中的一段控制结构(一个if语句,一段循环)的代码缩进对模型来说,一项标准可能是使用一个长方形对类建模一项风格指南可能是图中子类需偠放在父类的下方。

◆逐渐应用模式 高效的建模者会学习通用的架构模式、设计模式和分析模式并适当的把它们应用在模型之中。然而就像Martin Fowler在Is Design Dead中指出的那样,开发人员应当轻松的使用模式逐渐的应用模式。这反映了简单的价值观换言之,如果你猜测一个模式可能适鼡你应当以这样的方式建模:先实现目前你需要的最小的范围,但你要为日后的重构留下伏笔这样,你就以一种可能的最简单的方式實现了一个羽翼丰满的模式了就是说,不要超出你的模型举一个例子,在你的设计中你发现有个地方适合使用GoF的Strategy模式,但这时候你呮有两个算法要实现最简单的方法莫过于把算法封装为单独的类,并建立操作能够选择相应的算法,以及为算法传递相关的输入这昰Strategy模式的部分实现,但你埋下了伏笔日后如有更多的算法要实现,你就可以重构你的设计并没有必要因为Strategy模式需要,就建立所有的框架这种方法使你能够轻松的使用模式。

◆丢弃临时模型 你创建的大部分的模型都是临时使用的模型--设计草图低精度原型,索引卡爿可能架构/设计方案等等--在它们完成了它们的目的之后就再不能提供更多的价值了。模型很快就变得无法和代码同步这是正常的。你需要做出决定:如果“同步更新模型”的做法能够给你的项目增添价值的话那就同步更新模型;或者,如果更新它们的投入将抵消咜们能够提供的所有价值(即负收益)那就丢弃它们。

◆合同模型要正式 在你的系统需要的信息资源为外部组织所控制的时候例如数據库,旧有系统和信息服务你就需要合同模型。一个合同模型需要双方都能同意根据时间,根据需要相互改变合同模型的例子有API的細节文档,存储形式描述XML DTD或是描述共享数据库的物理数据模型。作为法律合同合同模型通常都需要你投入重要资源来开发和维护,以確保它的正确、详细你的目标是尽量使你系统的合同模型最少,这和XP的原则traveling light是一致的注意你几乎总是需要电子工具来建立合同模型,洇为这个模型是随时需要维护的

◆为交流建模 建模的次要原因是为了和团队之外的人交流或建立合同模型。因为有些模型是给团队之外嘚客户的你需要投入时间,使用诸如文字处理器画图工具包,甚至是那些“被广告吹得天花乱坠”的CASE工具来美化模型

◆为理解建模 建模的最重要的应用就是探索问题空间,以识别和分析系统的需求或是比较和对照可能的设计选择方法,以识别可能满足需求的、最简單的解决方案根据这项实践,你通产需要针对软件的某个方面建立小的、简单的图表例如类的生命周期图,或屏幕顺序这些图表通瑺在你完成目的(理解)之后就被丢弃。

◆重用现有的资源 这是敏捷建模者能够利用的信息财富例如,也许一些分析和设计模式适合应鼡到系统上去也许你能够从现有的模型中获利,例如企业需求模型业务过程模型,物理数据模型甚至是描述你用户团体中的系统如哬部署的模型。但是尽管你常常搜索一些比较正确的模型,可事实是在大多数组织中,这些模型要么就不存在要么就已经过期了。

伱应当在你确实需要时才更新模型就是说,当不更新模型造成的代价超出了更新模型所付出的代价的时候使用这种方法,你会发现你哽新模型的数量比以前少多了因为事实就是,并不是那么完美的模型才能提供价值的我家乡的街道图已经使用了5年了,5年来我自己街噵并没有改变位置因此这张地图对我来说还是有用的。不错我可以买一张新地图,地图是每年出一次的但为什么要这么麻烦呢?缺尐一些街道并没有让我痛苦到不得不投资买一份新地图简单的说,当地图还管用的时候每年花钱买新地图是没有任何意义的。为了保歭模型、文档和源代码之间的同步已经浪费了太多太多的时间和金钱了,而同步是不太可能做到的时间和金钱投资到新的软件上不是哽好吗?

以下的实践虽然没有包括在AM中但是可以做为AM的一份补充:

◆重构 这是一项编码实践。重构就是通过小的变化,使你的代码支歭新的功能或使你的设计尽可能的简单。从AM的观点来看这项实践可以保证你在编码时,你的设计干净、清楚重构是XP的一个重要部分。

◆测试优先设计 这是一项开发实践在你开始编写你的业务代码之前,你要先考虑、编写你的测试案例从AM的观点来看,这项实践强制偠求你在写代码之前先通盘考虑你的设计所以你不再需要细节设计建模了。测试优先设计是XP的一个重要部分

敏捷开发-是(不是)什么?

AM是一种态度而不是一个说明性的过程。AM是敏捷建模者们坚持的价值观、敏捷建模者们相信的原则、敏捷建模者们应用的实践组成的集匼 AM描述了一种建模的风格。当它应用于敏捷的环境中时能够提高开发的质量和速度,同时能够避免过度简化和不切实际的期望 AM可不昰开发的“食谱”,如果你寻觅的是一些细节的指导如建立UML顺序图或是画出用户界面流图,你可以看看在建模Artifacts中列出的许多建模书籍峩特别推荐我的书The Object Primer 2/e(尽管这有失公允)。

AM是对已有方法的补充而不是一个完整的方法论。 AM的主要焦点是在建模上其次是文档。也就是说AM技术在你的团队采用敏捷方法(例如eXtreme Programming,Dynamic Systems Development Method (DSDM)Crystal Clear)的基础上能够提高建模的效果。AM同样也可以用于那些传统过程(例如Unified Process)尽管这种过程较低的敏捷性会使得AM不会那么成功。

AM是一种有效的共同工作的方法能够满足Project Stakeholder的需要。敏捷开发者们和Project Stakeholder进行团队协作他们轮流在系统开发Φ扮演着直接、主动的角色。在“敏捷”的字典中没有“我”这个单词

AM是有效的,而且也已开始有效当你学习到更多的AM知识时,有件倳对你来说可能不好接受AM近乎无情的注重有效性。AM告诉你:要使你的 Project Stakeholder的投资最大化;当有清晰的目的以及需要解了受众的需要时要建立模型或文档;运用合适的工件来记录手头的情形;不论何时都尽可能创建简单的模型

AM不是灵丹妙药。敏捷建模是改进众多专家软件开发荿果的有效技术充其量也就是这样了。它并不是什么了不得的灵丹妙药能够解决你开发中的所有问题。如果你努力的工作;如果你专紸其上;如果打心眼儿里接受它的价值观、它的原则、它的实践;你就可以改进你做为一个开发人员的效果

AM是面向一般的开发人员的,泹并不是要排斥有能力的人AM的价值观、原则和实践都简单易懂,其中的很多内容可能你都已经采用或期待多年了。应用AM技术并不是要伱去练水上飘但你需要有一些基本的软件开发技能。AM最难的就是它逼着你去学习更广泛的建模技术这是个长期的、持续性的活动。学習建模在一开始可能很难但你可以试着一次学习一样技术来完成你的学习。

AM并不是要反对文档文档的创建和维护都会增大项目涉众的投资。敏捷文档尽可能的简单尽可能的小,目的只集中在和目前开发的系统有直接关系的事情上充分了解受众的需要。

AM也不是要反对CASE笁具敏捷建模者使用那些能够帮助开发人员提高效果,提升价值的工具而且,他们还尽力使用那些能够胜任工作的最简单的工具

要想了解AM,你需要了解模型和敏捷模型之间的区别模型是一个抽象的概念,它描述了一个的问题的一个或多个方面或是处理这个问题可能的解决方案。传统意义上模型被认为是图表加上相应的文档。然而那不够直观的artifact也可以被视为模型,例如CRC卡片集单条或多条业务規则的文字描述,或是业务流程的一段结构化英文描述一个敏捷模型就是一个刚刚足够好的模型。但是你怎么知道什么时候模型才是刚剛足够好呢当敏捷模型显现出如下的特性时,它就是刚刚足够好的:

敏捷模型实现了它们的目的有时你为沟通而建模,或许你需要把伱工作的范围告诉高级经理;有时你为理解而建模或许你需要确定一个设计策略,实现一组Java类一个敏捷模型是否足够好,要看它是不昰满足了创建它时的初衷

敏捷模型是可理解的。敏捷模型要能为其预期听众所理解使用用户能够理解的业务语言来描述需求模型,反の技术架构模型则需要使用开发人员熟悉的技术术语。你所使用的建模符号会影响易懂性--如果你的用户不了解UML用例图中的符号的含義那用例图对用户就没有任何价值。这样的话要么使用另一种方法,要么教授用户学习建模技术风格问题同样也会影响易懂性,例洳避免交叉线杂乱的图表比清晰的图表难懂。模型的细节程度(见下文)也会影响易懂性,因为相较一个不那么详细的模型来说一個过于详细的模型要难于理解。简单(见下文)同样是影响易懂性的一个因素

敏捷开发敏捷模型是足够正确的。模型通常都不需要100%正确只要足够正确就行了。举个例子如果一张街道地图漏画了一条街道,或是它标示某条街道是通行的但你发现它已经关闭维修了,那伱会不会扔掉你的地图开始在城里飙车犯罪呢不太可能。你会考虑更新你的地图你可能会拿出笔来自己做修改或是去当地的商店买一張最新版的地图(你原来的那张过期了)。也许你还是会接受那张虽不完美仍可使用的地图因为它对你来说已经足够好了。你还是可以鼡这张地图四处转转因为它还是个正确的模型,标记出了大部分街道的位置你在发现这张地图不正确的时候,你没有立刻扔掉它原洇是你根本不在乎它是否完美。类似的当你在需求模型、数据模型中发现错误的时候,你也会选择更新或是接受--虽不完美但已经足夠好了有些项目成员能够容忍这种不正确而有些则不能:这取决于项目的特性,每个团队成员的特性组织的特性。充分正确性既和模型的听众有关也和你要处理的问题有关。

敏捷模型是足够一致的一个敏捷模型并不需要和自己(或其它有用的artifact)保持完全的一致。如果一个用例在它的一个步骤中显式的调用了另一个用例那么相应的用例图需要用UML的 <> 版型来标记这两个用例之间的关系。然而你看了看圖表,发现它们并没有这样做天哪!用例和图之间不一致!危险!太危险了!红色警报!快逃命呀!等一下,你的用例模型是有不一致嘚地方但也没到世界末日啊。是的理想情况下,你的所有artifact最好是能够完全一致但这通常是不可能的。当我开发一个简单的商用系统時我通常都可以容忍部分的不一致。但有时我是不能容忍这种不一致的最有力的佐证就是1999年 NASA发射火星太空探测器时采用了精密的测量系统。要树立一个观点敏捷模型只要足够一致就行了,你通常不需要使用那么完美的模型

关于正确性和一致性,很明显要考虑权衡问題如果你要维护一个artifact(我们称之为“保管”),随着时间的流逝你需要投入资源来更新它。否则它很会就会过期对你就没用了。例洳我可以容忍一张地图标错了一两条街道,但是我绝对无法容忍一张地图中四分之三的街道都标错了这就需要权衡了,进行足够的努仂保证artifact足够正确。过多不必要的努力反而会减缓项目的进度而投入不足就没有办法保证artifact的有效性。

敏捷模型有足够的细节一张路线圖并不需要标记出每条街道上的每栋房子。那会有太多的细节使得地图难以使用。然而在修路的时候,我想施工人员一定会有这条街噵的详细地图包括每幢建筑、下水道、电线盒等足够的细节,这样的地图才是有用的但是这张地图并不用标记出每个院子和通向它们嘚路线。因为这样又太繁琐了足够的细节和听众有关,也和他们使用模型的目的有关--司机需要的是显示道路的地图施工人员需要嘚是显示土木工程细节的地图。

考虑一个架构模型可能一组画在白板上的图表就足够了--项目的进行中再对它们更新,也许你需要用CASE 笁具来生成一些图表也许这些图表还需要有详细的文档,这依赖于环境不同的项目有不同的需要。在每一个例子中实际上你都是在開发、维护一个有足够的细节的架构模型,只是这个“足够的细节”的概念和环境有关

敏捷模型能提供正面价值。对项目中的任一artifact一個基本的要求是它们能够提供正面价值。一个架构模型给你的项目带来的价值是不是能够超过开发它、维护它(可选)的总成本一个架構模型能够坚定你们团队为之努力的愿景,所以它当然是有价值的但是,如果它的成本超过了这个价值那就是说,它无法提供正面价徝投入100,000美元去开发一个详细的、重量级的文档化架构模型,而它的效用只需一些画在白板上的图表就能够达到,这些图只需要花你 5,000美え看看,这是多么轻率的做法

敏捷模型要尽可能的简单。只要能够达到目的你应当努力让你的模型尽可能保持简单。模型的详细程喥会影响简单性而所使用的符号范围也会影响简单性。例如UML的类图就包括了无数的符号,包括对象约束语言 (Object Constraint Language OCL) 但大多数的图使用符号嘚一部分就能够完成。所以你常常不需要使用所有的符号你可以限制自己使用符号的一个子集,当然这个子集是足够让你完成工作的。

因此呢一个敏捷模型的定义就是一个实现它的目的,没有画蛇添足的模型;为你的预期听众所理解的模型;简单的模型;足够正确、足够一致、足够详细的模型;创建和维护它的投资能够给项目提供正面价值的模型

一个普遍的哲学问题是源代码是不是一个模型,更重偠的它是不是一个敏捷模型。如果你是在我们这篇文章之外问我这个问题我会回答说,是源代码是一个模型,虽然是一个高度细节囮的模型因为它是软件的一个抽象。同时我还认为优秀的代码是一个敏捷模型。但在这里我还需要把两者区分开来,源代码和敏捷模型还是有区别的——敏捷模型帮助你得到源代码

敏捷开发-AM的实践是如何组合的

AM的实践之间是相互促进的,因为他们彼此支持彼此激發。为了使AM更有效率的工作你需要了解它的实践是如何组合的。图1显示了AM的实践之间的关系它们被分为七类。AM的核心实践集中在头四種类别中-验证迭代和递增,团队协作和简单,你需要完全接受它们才能真正理解敏捷建模然后,才轮到属于辅助实践的文档动機,生产率这三个类别我们先针对核心实践的四个类别,讨论各类中的实践之间的关系然后我们再针对辅助实践的三个类别,研究各類中实践之间的关系最后我们来讨论类别之间的关系。

在团队协作类别中有四项实践--stakeholder的积极参与和他人一起建模,公开展示模型和集体所有制。stakeholder的积极参与对你的成功至关重要因为你正是为了这些project stakeholder开发系统,正是为了了解和实现他们的需求换言之,你需要和伱的甲方们密切合作这就自然的想到了和他人一起建模--这个“他人” 也包括你的stakeholder。当你的建模工作有多人参加时(至少一个project stakeholder和一个除你之外的开发人员)你就需要和众人共同协作,相互促进取长补短。一个擅长于业务过程建模和业务规则定义的敏捷建模者看不到嘚方面一个精通结构化建模技术(例如UML类图或数据模型)的人极有可能看得到。一样的道理系统的直接用户给你的团队提供的信息极鈳能是高级经理提供不了的。所以要有这样的观点:你要在项目甲方和开发团队中营造一种积极参与的氛围,只有这样才能够收集各種不同的观点和经验。集体所有制能够提升协作性因为一个人单独的进行建模的工作,他很快就会遇到瓶颈而如果每个人都能够为建模工作献计献策,那么你们就能够成为一个团队轻易的解决问题。公开展示模型能够使得人们对模型“瞻前顾后”变得容易了能够立刻考虑模型传达的信息,从而提高团队的协作性当然,我们是假设模型都在众人的视线之内或者这些模型都是大家目前正在开发或相關的。这方面的主题我在Organizing

迭代和递增类别中包括了使用合适的artifact并行创建模型,切换到另外的artifact小增量建模这几项实践。不论哪一个 artifact都囿它的长处和短处,任何一个单独的模型都不足以充分的描述你的项目的各个主要方面(如需求、架构)例如你会发现你为了识别系统嘚需求,常常需要组合使用用例、业务规则定义、和技术需求定义单单靠用例就能令project stakeholder立马告诉你他们所有的使用需求吗?这恐怕不太可能你可以试试换用诸如业务规则之类的artifact来捕获他们的所有业务政策,再换用诸如技术需求的artifact来捕获他们的非功能需求否则,他们会想起点什么就告诉你什么还会返回去讨论先前提过的细节,甚至是改变他们的原来的主意你的需求识别工作通常是一个动态的过程,分析、架构、设计工作也是一样我相信物力论中指出了人们以此种方式思考的原因,我们思考的方式明显是杂乱的敏捷建模者要认识到囚们是以一种动态的方式在思考,特别是人们处于群体行为时这样才能制定对策。敏捷建模者并行创建模型从而能够最广泛的收集信息。这项实践又是由实践切换到另外的artifact和小增量建模来支持的--你可能正在使用用例来捕获使用需求的相关信息而当stakeholder开始讨论他们对編辑屏幕的要求时,你最好是使用基本用户界面原型或是传统用户界面原型来记录这些需求你需要在不同的artifact之间来来回回,每一个artifact最好嘟需要编码来验证这种方式可以由小增量建模的实践来实现--最典型的方式就是在这个artifact上做一会儿工作,再换一个artifact依此类推。

简单這个类别包括了创建简单的内容简单地建模,使用最简单的工具这几项核心实践创建简单的内容和简单地建模这两个实践集中于模型嘚简单性,在建模过程中这两项实践通产是密不可分的把精力集中在如何简单描述,建模者常常会发现一些使得你手头的模型简单化的方法举个例子,我曾经参加了一项存储层软件的开发工作软件的概念类似于EJB的persistence container,封装了领域对象的一些存储操作结果我们架构和设計非常的复杂,我们试着找到一种办法:建立一张简单的图表帮助开发人员理解如何使用存储层来工作。其间我们还发现重构能够使我們的设计易于理解实践使用最简单的工具能够使得过程变得简单。工具越简单就越容易使用这就降低了他人在你的模型上工作的门槛,也就增加了实际中别人去这么做的机会这也包括了你的project stakeholder。通过使用最简单的工具简单描述模型也变得更自然了。此外当你使用一些简单/低精度的工具,例如索引卡片即时贴,白板的时候你就能亲身体验这些简单工具的效力,你在不知不觉中已经强化了一些概念:最简单的解决方法实际上也能非常有效对你正在开发的系统采用简单的设计。

验证类别包含了两个核心实践:测试性思维和用代码验證有一条哲学,我常从中受益:“如果你无法测试它你就不应该建立它,而你建立的一切都应该加以测试”这使得我在系统建模时僦考虑测试,也使得我积极的去获取我的模型的反馈--实际上我把该条哲学归纳为“考虑你创建的所有artifact的可测试性,以及验证所有种類的artifact”但这并不仅仅局限于AM的范围之内。通过这种可测试性的考虑在我建模时,我能够建立起可测试的模型而且积极的通过编码来驗证模型,这样我就能够尽快的证实我的模型是真正可以测试的。

文档类别包括了三项辅助实践:丢弃临时模型合同模型要正式,非箌万不得已不更新在项目的进行中,需求、对需求的理解、以及对可能的解决方案的理解都在不断变化(回忆一下原则拥抱变化)。為了反映这种变化你需要同步改进你大部分的项目artifact,包括模型和文档就像在敏捷文档讨论的那样,比较好的方法是不到万不得已不偠更新你的模型和文档,这种做法才算是敏捷方法遵循这项实践,如果你发现一个模型如果不再需要更新那就是说这个模型对你的团隊已经没什么价值了,一个没有价值的模型就可以视为临时模型可以丢弃。不过要注意合同模型。它定义了你的系统和其他系统之间嘚接口不太可能经常改变,因为它们的重要性是勿庸置疑的一言以蔽之,如果你有个非合同模型不再更新那就意味着它已经没有用叻。

为沟通建模和为理解建模这两项实践属于动机类别实际上,这两项实践并没有太多的联系有时候你创建模型的目的是为了研究和悝解问题,有时候你的目的是为了和其他人交流你的想法有时候你的目的包括了上述两者。就像你在图1中看到的这两项实践常常会一起引出另两类的实践,这是下文要讨论的主题

最后,生产率类别中包括使用建模标准逐渐应用模式,以及重用现有的资源这几项实践重用现有资源这个实践要求你尽量利用他人的工作成果并从中受益,这有很多种思考方向:一种是应用模式根据经验,我认为它是所囿重用方法中最有效率的一种因为你重用的都是其它开发人员久经验证的解决方案 (Ambler, 1999);另一种是遵循建模标准和指南,实际上不论是标准还是指南,都能够提高你工作的一致性是的,你可以自己写指南有时你必须要这么做,因为你的实际环境中会有一些特别的情况泹是你只需要在Internet上稍做搜索就可以找到很多的开发指南。例如你可 javaCodingStandards找到Java的开发指南。

让我们考虑团队协作类别简单类别中的实践增强叻实践stakeholder的积极参与的效果,因为简单性消除了参与的代沟迭代和递增类别中的实践也使得参与成为可能,尤其是并行创建模型因为它增大了stakeholder们参加的机会。动机类别中的实践可以提高集体所有制和和他人一起建模的效果对问题的理解和沟通通常可以激发人们的协作精鉮,简单类别的实践也也坑达到激发协作效果因为它降低了参与的门槛。公开展示模型的效果可以通过生产力类别中的实践得到提高遵循标准,应用模式的做法可以增加一致性和可读性而重用现有的资源(例如通用架构),则给别人开了一个好头使别人能够在你模型的基础上继续。迭代和递增类的实践可以支持集体所有制的实行特别是并行创建模型和切换到另外的artifact,它们使得人们在适当的模型上囲同开发

简单类别的实践由另外几类的实践来辅助。使用建模标准和逐渐应用模式这两项实践支持同一种建模语言(使用标准和容易理解的模式)从而支持了实践简单地建模。文档类别的实践也可以支持简单类别的实践--只有到万不得已才更新模型这样,你才不会給模型增加不必要的信息才有可能创建简单的内容以及简单地建模。

现在再来看迭代和递增类别很明显,团队协作类别的实践支持该類的实践由于团队的参与,针对目前的情况选用正确artifact的机会就增大了你就可以根据需要来切换使用不同的artifact。验证类实践能够赋予你使鼡递增方法的勇气特别是在你用代码验证的时候。保证你想法的易测性你就更有把握同时操作多个artifact,并在它们之间切换因为测试问題要求你从多个方面来看待它。文档类实践同样可以促进递增方法特别是非到万不得已不更新。但是合同模型要正式这个实践抑止了递增方法的应用因为你总是希望能够尽早的建立和其他系统间的接口标准。切换到另外的artifact和丢弃临时模型之间也能产生正面的效果因为┅个模型完成目的之后就把工作切换到另一个模型上去。简单类实践对这个类别也很重要通过使用最简单的工具,你在不同的 artifact间来回切換就变得更容易了你节省了熟悉工具的时间,只把精力集中在简单的内容和描述上你也可以较容易记住模型要传达的信息。最后动機类实践可以令你同时进行多个建模工作,因为对于复杂的系统你需要从多个方面去沟通,去理解因此你需要在适当的artifact间来回切换,這样才能有效的做到这一点

验证类实践可由简单类实践来支持--创建简单的内容和简单地建模能使你更容易进行测试性思维。迭代和漸增类实践也能提高验证类实践例如,在你切换到另外的Artifact时就可能切换到源代码,这样你就可以看到模型确实可以运行

简单类实践鈳以推进生产力类实践。当你使用简单模型工作时逐渐应用模式就更容易一些;当你简单地建模时,使用建模标准也会容易一些而模型的简单、易懂,也会使你比较容易的重用现有的资源例如企业需求模型或通用的架构模型。

简单类实践以及迭代和渐增类实践可以支歭文档类实践的进行文档越简单就越容易使用--如果你的文档容易理解,这样你就有把握万不得已才更新你的文档因为你知道做到這一点很简单;文档如果很复杂,你的项目风险就很大因为没有把握什么时候文档需要更新。很明显非到万不得已不更新和丢弃临时模型的运作环境可以其它的实践来改善,例如切换到另外的artifact、小增量建模

敏捷开发-合格的敏捷建模者

Alistair Cockburn指出:很多的方法学都定义了软件開发项目中开发人员所担任的角色,同时还定义个各个角色执行的任务尽管入席,这些方法并没有定义这些角色最适合的人选一个人偠想成功的担任某个角色,他应当很好的适应它--虽然这并不需要人们掌握所有的技能但人们必须要慢慢的熟悉这些技术。我的经验告诉我要成为一个成功的敏捷建模者,下面的列出的个性是必要的:

◆团队竞赛 第一点也是最重要的一点,敏捷建模者总是积极的寻求协作因为他们意识到他们不是万事通,他们需要不同的观点这样才能做到最好。软件开发可不是游泳单干是非常危险的。在敏捷嘚字典中没有“我”这个词

◆畅所欲言 敏捷建模者都有良好的沟通技巧--他们能够表达出他们想法,能够倾听能够主动获取反馈,並且能够把需要的写出来

◆脚踏实地敏捷建模者应当脚踏实地 他们的精力都集中在满足用户的需求上,他们不会在模型上画蛇添足即便那双足是多么的好看。他们满足于提供可能的方案中最简单的一种当然,前提是要能够完成工作

◆好奇 敏捷建模者乐衷于研究问题,解决问题

◆凡是都问个为什么 敏捷建模者看问题从不会至于表面,而是会打破沙锅问到底他们从不会就想当然的认为一个产品或一項技术和它们的广告上说的那样,他们会自己试一试

◆实事求是 敏捷建模者都非常的谦逊,他们从不认为自己是个万事通所以他们会茬建立好模型之后,用代码来小心的证明模型的正确

◆勇气 敏捷建模者应当愿意去计划一个想法,然后做出模型再想办法用代码来验證。如果结果不理想他们就会返工,检查他们的方法或是放弃原先的想法。把你的想法告诉你的同伴再来验证它的正确,这是需要佷大的勇气的

◆根据实验 敏捷建模者应当愿意尝试新的方法,例如一项新的(或是已有的)建模技术一般而言,他们也会接受敏捷建模开发技术必要时,为了验证想法他们愿意同传统的思想做斗争,例如在一个项目中减少文档数量

◆有纪律 要坚持不懈的遵循敏捷建模的实践。对你来说你可能会在不经意间说,“加上这个功能吧!无伤大雅”或是,“我比project stakeholder更了解”在AM的道路上要想不偏离方向,是需要一定的纪律性的


很多的组织对此的第一反应就是建立一个专才的团队。专才的最基本的含义是指那些特别精通某一项任务的人因此他们的效率也特别的高。这样一支团队要想高效率的运作,你需要组合这些专才让每人负责一块任务,解决之后就把手头的工莋传给另一个人这个概念就类似于“流水线”的想法,如果你是在大量的生产汽车这种方式会非常的有效,但是以我的经验在手工嘚软件中采用这种方式并不是太合适。而且这种方式需要一个大团队的支持--如果软件开发中有N中不同的任务,你至少就需要N位专才財能满足这种方法的要求但N是多大?2050?100这取决于你对专业定义的细节程度,是吧如果你倾向于每位开发人员只处理一种artifact,那单单處理建模工作就需要20多位的专才,在modeling essay列出了各种的artifact如果你倾向于每位开发人员只负责一种角色,那再一个EUP的项目中也需要11中角色才能唍成所有的工作流程专才通常都很难同人合作,他们缺少谦逊的品质意识不到其它人的专项技能能够为他的工作增添价值,他们也意識不到他们的所作所为可能为给后续的工作造成麻烦也许他们需要返工,也许他们现在的努力会白费关于专才的另一个问题是,即使昰在他们擅长的领域他们的技能也可能根本就没有那么精熟。IT产业的技术高变动率导致了开发人员使用了几个月的新技术,开始熟悉咜就声称自己已经是这方面的专家了,因为和他具有同样层次经验的人毕竟不多要建立一个专才组成的团队,这也是一个很明显的问題

那么,建立一支仅有通才的团队会怎样呢每个人都对软件开发有不错的了解,但是都缺乏足够详细的必需知识完成不了工作。项目需要那些对现阶段使用的技术和技巧都非常熟悉的人如果你是在使用Enterprise JavaBeans (EJB),那你既需要对Java编程精通的人也需要对EJB开发精通的人。一个使鼡Oracle的团队幕后肯定有一位Oracle数据库管理专家。一个开发经纪人业务软件的团队就需要一位能够了解股票和债券之间的细微差别的人。

我嘚经验是两种极端的方式都不可取,你应该取它们的中间点一种方法是团队中一部分人是通才,一部分人是专才通才能够起到团队嘚连接剂的作用,通才注重远景专才注重项目的具体的难点。这样做的好处是通才的长处能够弥补专才的短处反之也是一样,由于这種平衡性通才和专才组对能够发挥出极大的优势。一个更好的方法是团队中主要是通才仅有一两个专才。例如我认为我应该算是一個通才,我擅长于处理项目中各项技能之间的配合而且还精通业务应用软件建模,以及对象存储和Java编程我的另一位同事也是位通才,特别擅长建模EJB开发,以及测试还有一位堪称通才的同事则精于网络通信和Java编程。这样一支由通才组成但又有一项或多项特技的团队,优势是很明显的他们能够迅速的找到共同点,因为他们毕竟都是通才而且他们之间有能够做到优势互补。它的劣势在于这种人才一般都比较稀缺动辄都需花费10年甚至20年的时间才能够培养出这种通才,因此是很难得到的如果你的团队中有一些这种人,那你的运气真昰太好了要认识到新手通常一开始都是专才,这很重要软件开发的新手面对着需要消化的大量知识,往往不知所措这很正常。大多數人一开始一开始会把精力集中在开发的一两个方面也许是Java编程,也许是获取用户需求然后以这方面的经验为基础,再逐渐的拓展知識的覆盖面随着时间的增长,经验在不断的累积他们会慢慢的完善自己的技能树,他们会软件开发中各个技能如何配合会更加了解哃时,他们还擅长于一两门特技

还有一点也很重要,要明白很多的开发人员的专精反而害了这些人由于软件开发的与身俱来的复杂性,开发人员经常会落入一个名为单一artifact开发者的陷阱中去他们把自己定位为仅仅从事一种artifact的开发工作,例如代码用例模型,或数据模型;开发人员还可能遇到的一个陷阱名为单一角色开发者他们的定位是专门从事一种工作的人,例如建模测试,或编码换言之,这些囚专精于某一个角色这种倾向在一些的采用传统过程的大型组织中特别显著,问题就出现了这些陷阱的落入者的视野往往过于狭窄,難以在一个采用敏捷方法的软件开发项目中作到高生产率当然,如果他们原意扩展自己的视野这个问题就容易得到解决。

走出一般性嘚设计误区迈向成功之途 无论你遵从的是重量级的方法,比如Enterprise Unified Process(EUP)还是轻量级的开发过程,如Extreme Programming(XP)建模在软件开发中都是不可或缺的。但不圉的是其中充斥着各种谬误与迷思这来自于各个方面,有从理论家错误的研究、数十年来信息技术领域内的文化沉积、软件工具开发商忝花乱坠半的市场宣传以及象Object Management Group (OMG)和IEEE这类组织的标准这个月,我要揭示建模中的误区指出其相应的事实真相。

误区一:建模就等于是写文檔

这很可能是其中最具破坏力的一条因为开发人员可以此为借口而完全放弃建模。许多优秀的软件开发人员会说他们不想把时间浪费在這些“无用的“文档上他们沉溺于编码之中,制造着一些脆弱而劣质的系统另外,甚至于许多尽责的开发人员现在也认为建模是一件討厌的事而不愿去学习相应的建模技术。

事实分析:“模型”与“文档”这二者在概念上是风马牛不相及的—你可以拥有一个不是文档嘚模型和不是模型的文档一幅设计图就是一个模型,而不论是被画在餐巾纸的背面或写在一块白板上,或在Class Responsibility Collaboration(CRC)卡片中还是根据记录在報纸和便签纸上的流程图而生成的一个粗略的用户界面原型。虽然这些都不能说是文档但他们却都是有价值的模型。

建模很象是作计划:作计划的价值在于计划编制的过程中而非计划本身;价值体现在建模的活动中,而非模型本身实际上,模型不是你系统中的一部分囸式的文档而且在完成它们的使命后可以被丢掉。你会发现值得保留的只有很少的模型而且它一定是非常完美。

误区二:从开始阶段伱可以考虑到所有的一切

这种说法流行于二十世纪七十年代到八十年代早期现今的许多经理都是在那个时候学习的软件开发。对这一点嘚迷信会导致在前期投入可观的时间去对所有的一切建模以期把所有一切都弄正确试图在编码开始前就“冻结”所有的需求(见误区四),以致于患上“分析期麻痹症” – 要等到模型非常完美之后才敢向

我要回帖

更多关于 agile模式 的文章

 

随机推荐