﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-迷途书童-随笔分类-业务建模</title><link>http://www.blogjava.net/landy/category/51223.html</link><description>敏感、勤学、多思</description><language>zh-cn</language><lastBuildDate>Wed, 18 Jul 2012 14:52:55 GMT</lastBuildDate><pubDate>Wed, 18 Jul 2012 14:52:55 GMT</pubDate><ttl>60</ttl><item><title>构建SOA风格的应用</title><link>http://www.blogjava.net/landy/archive/2012/07/18/383436.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Wed, 18 Jul 2012 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/07/18/383436.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/383436.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/07/18/383436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/383436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/383436.html</trackback:ping><description><![CDATA[<p>当下，SOA这个词已经深入人心，几乎没有人不说自己设计的应用是遵从SOA的。</p> <p>很多人对SOA的理解就是分层、模块化、面向对象。。。这种理解对不对后面再说。先看一些问题：</p> <p>我今天看了一个开发团队的开发工程包结构，部分类的命名及组织产生了如下印象：</p> <ul> <li>每个usecase是一根根烟囱</li> <li>烟囱与烟囱之间连模型都没有共享。其实业务模型是有设计的，主要是实现模型没有保持业务模型的结构特征，全部成了&#8220;值对象&#8221;，开发人员天天把这些值对象叫做领域对象。</li> <li>有三层，是Struts帮忙定义的，三层分别根据usecase分包</li></ul> <p>这也是我们宣称的SOA系统！！！！连最基本的模型设计、模块设计、分层设计都没做好，难怪年年重构、年年完成不可能完成的任务！！！我确信这种重构、这种不可能完成的任务还会年年持续下去！！！</p> <p>究竟什么是符合SOA风格的系统？先看看SOA宗师IBM的一篇文章：</p> <p><a href="http://www.ibm.com/developerworks/cn/architecture/ar-soastyle/">http://www.ibm.com/developerworks/cn/architecture/ar-soastyle/</a></p> <p>我来总结一下。</p> <p>SOA能达到什么目的：</p> <p>1.实现业务与IT的一致性；</p> <p>2. 创建更灵活的反应更敏捷的IT基础设施；</p> <p>3. 简化集成实现；</p> <p>SOA要怎么做？</p> <ol> <li>从应用程序到流程和服务。消除应用程序，将软件系统创建为一组由业务流程进行协调的交互服务。每个服务实现企业上下文中定义的特定业务目标或功能，业务流程表示必须实现的业务解决方案。这个讲的比较抽象，我的解读就是服务表示一个最细粒度的业务目标或功能，由业务流程来编排这些服务，实现更大粒度的业务目标或功能，业务流程也是服务。注意，这里隐式的定义了服务的概念，服务是自治的，可替换的，可被多个流程编排的，不耦合流程上下文的，是直接面向业务目标或功能的，不是一个公共函数库，服务不是封装了数据和方法的类。</li> <li>SOA的服务基于业务资源（对象）定义，不支持操作者的执行上下文，而是支持业务资源（对象）。这里的业务资源是指业务实体。业务实体也是来自业务的。所以，SOA能保证IT与业务的一致性。</li></ol> <p>&nbsp;</p> <p>别再说你的应用程序或烟囱遵循SOA的架构风格！</p><img src ="http://www.blogjava.net/landy/aggbug/383436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-07-18 21:19 <a href="http://www.blogjava.net/landy/archive/2012/07/18/383436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件架构设计（四）&amp;mdash;&amp;mdash;软件架构设计过程</title><link>http://www.blogjava.net/landy/archive/2012/07/08/382543.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Sun, 08 Jul 2012 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/07/08/382543.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/382543.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/07/08/382543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/382543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/382543.html</trackback:ping><description><![CDATA[<p><strong>3.10 确定系统需求</strong></p> <p>确定系统需求即确定系统用例。方法以根据业务用例实现场景分析为输入，分析每个系统Actor的系统用例。每个系统用例一定是一个完整的事件流，注意业务用例和系统用例的区别，业务用例是一个完整的业务目标，而系统用例是一个完整的事件流，是业务目标中的一个环节，如客户代表申请开户是一个完整的系统用例，但不是一个完整的业务目标，其包括多个页面操作。</p> <p><strong></strong>&nbsp;</p> <p><strong>3.11 用例实现分析</strong></p> <p>对每个系统用例，识别其可能的实现路径，每个实现路径就是一个用例实现，然后针对每个用例实现，分析人机交互，使用活动图绘制用例实现场景。</p> <p><strong></strong>&nbsp;</p> <p><strong>3.12 分析模型</strong></p> <p>使用分析对象，实现所有的用例实现场景，识别出三种分析对象。在这个过程中，也可以建立界面原型，和客户进一步达成需求的一致理解。分析模型是需求到设计的桥梁，分析类的层次高于设计实现，需求通过分析类转成计算机语言。后续做系统设计的时候，可直接将分析模型转换成设计模型。</p> <p>在考虑分析模型的过程中，有可能识别出一些公共模块，比如开户、销户过程中都会有一些业务规则校验，需要引入规则引擎的支持，那么类似规则引擎这样的公共模块需要添加到逻辑架构中去。</p> <p><strong></strong>&nbsp;</p> <p><strong>3.13 非功能性需求设计</strong></p> <p>以性能为例讲一下对非功能性需求设计的过程。</p> <p>1、确定性能目标：要支持多少用户、多少在线用户、多少并发操作、操作响应时间要求等；</p> <p>2、以一个简单的三层架构为起点，根据性能目标，识别瓶颈。比如，如果数据库撑不住，那么需要考虑最佳的分库设计，如果是逻辑层撑不住，则要考虑负荷分担，状态同步的逻辑层方案设计，如果操作响应时间要求很高，则可根据不同场景，分析其操作的数据的读写特点，采用合适的缓存方案。如要支撑高并发低时延的大数据量查询，Twitter就采用了垂直缓存，raw缓存的设计方案。</p> <p>3、验证性能设计。抽取典型场景，实现一个prototype来验证性能设计是否满足性能目标。</p> <p>在质量属性设计中，如果需要新增模块，则需要修改逻辑架构。</p> <p>有一些约束类需求也是非常重要的，不能遗漏分析。</p> <p>经过这一个阶段，我们能够得到一个比较完整的逻辑架构，运行架构、开发架构、物理架构、数据架构的输入了。剩下的工作就是编档的工作了。</p> <p>&nbsp;</p> <p><strong>3.14 架构编档</strong></p> <p>有了上面的工作作为铺垫，编档就非常容易了，这个就不细讲了。</p><img src ="http://www.blogjava.net/landy/aggbug/382543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-07-08 16:46 <a href="http://www.blogjava.net/landy/archive/2012/07/08/382543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件架构设计（三）&amp;mdash;&amp;mdash;软件架构设计过程</title><link>http://www.blogjava.net/landy/archive/2012/07/08/382527.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Sun, 08 Jul 2012 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/07/08/382527.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/382527.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/07/08/382527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/382527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/382527.html</trackback:ping><description><![CDATA[<p><strong>3.4 分析业务用例场景</strong></p> <p>分别针对上节中业务用例视图中的每一个用例，分析该业务用例在实际工作中是如何做的，一般使用业务活动图来表述业务场景。在这个阶段，有几点需要特别注意的地方：</p> <p>1、关注参与业务用例的各个参与者是如何协同的，如一个简化的用户开户的流程就是填写营业员提交开户订单-》主管审批订单-》施工人员履行订单；</p> <p>2、对一个业务用例，如果有不同的实现路径，需要做不同的场景分析。例如，用户订购产品，分网上订购和营业厅订购这两种场景，两个场景大不相同；</p> <p>3、场景的步骤粒度：用户的一个完整操作目的，如用户开户，则用户填写订单是一个步骤，而不用细化到用户取单、拿笔填单等；</p> <p>&nbsp;</p> <p><strong>3.5 产生业务对象模型</strong></p> <p>针对每个业务用例，根据业务用例场景，分析该用例中涉及的业务实体，并绘制业务对象模型图。</p> <p>&nbsp;</p> <p><strong>3.6 产生业务用例实现视图</strong></p> <p>业务用例实现指业务用例的一种实现路径，一个业务用例实现对应着一个业务用例场景。业务用例实现视图是表述业务用例实现的视图。</p> <p><strong></strong>&nbsp;</p> <p><strong>3.7 分析业务用例实现场景</strong></p> <p>业务用例实现场景着重描述如何通过人机交互来完成业务，是业务用例场景的具体化。一般用活动图来表述人机交互流程。这里每个步骤的粒度是人与系统或系统与人的一次交互。</p> <p><strong>3.8 领域建模</strong></p> <p>领域模型是描述特定问题域的对象及其相互关系。领域模型对业务对象做了进一步的精化。领域建模的步骤如下：</p> <p>1、确定问题域：如CRM中的客户模型比较关键，我们决定对其进行领域建模，则需要将设计客户业务实体的用例全部识别出来；</p> <p>2、领域建模：逐一分析涉及到操作客户模型的业务用例场景，识别领域对象以及对象之间的关系；</p> <p>3、验证领域模型：使用序列图作为工具，基于领域模型来编排实现各业务场景，如果能实现，证明领域模型ok。</p> <p>领域对象跟业务对象有区别，我认为，业务对象不是领域对象。业务对象来自于业务用例，是业务中客观存在的，而领域对象是对业务对象做进一步抽象、精化后的结果，是人对业务的主观认识，这就是为什么不同厂商的产品模型会不一样的原因，而且并不是所有的领域对象都是根据业务对象分析而来的。比如，某CRM产品面向全球市场，可定制能力是关键，为提升可定制性，需要构建一个快速开发框架，这个快速开发框架也是软件系统的一部分，也是有领域模型的，但是它的领域模型跟业务对象没半点关系。</p> <p>&nbsp;</p> <p><strong>3.9 产生逻辑架构草稿</strong></p> <p>通过上述步骤，我们已经有了部分领域模型，针对每一个可直接映射到业务对象一级的领域对象，可规划相应的业务模块，如有开户订单，那么可以有订单管理，有客户管理等。业务模块的划分粒度可依据大概的工作量而定，保证最低级别的业务模块的工作量是大致均匀的。这仅仅是一个建议，可以根据项目的实际情况决定。</p> <p>基于上述的成果，我们还只能产出一个逻辑架构的草稿，因为我们还没有分析质量属性，后续对质量属性做设计的时候，还有可能会引入新的模块。比如要让业务流程可快速编排、定制，我们希望引入工作流，那么逻辑架构中也要引入一个工作流模块。</p> <p>&nbsp;</p> <p>待续。。。</p><img src ="http://www.blogjava.net/landy/aggbug/382527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-07-08 15:17 <a href="http://www.blogjava.net/landy/archive/2012/07/08/382527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>参与需求调研后的思考</title><link>http://www.blogjava.net/landy/archive/2012/06/26/381548.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Tue, 26 Jun 2012 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/06/26/381548.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/381548.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/06/26/381548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/381548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/381548.html</trackback:ping><description><![CDATA[<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">刚在某客户做了3个月的需求调研，亲自体验了需求调研的过程，有一些感想，总结下来。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">客户方配备了BA和SA，BA是业务专家，SA是技术专家，负责输出一个描述业务需求文档XXXS，将流程和需求都记述在该文档中，和大多数客户一样，客户的优势在于对他们的业务比较了解，但是对于如何去抽象业务，比较系统的把他们的业务需求归纳并描述下来，并不擅长，至少很多人不擅长，这就导致客户方的XXXS文档中通常是一些需求片段和样例。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">我方对一个topic，分配了SA和BA，其中SA负责技术方案，而BA负责理解业务并澄清业务，topic的输出件有XXD和XXS，XXD主要记述业务流程和topic级的solution，XXS主要记述系统的功能。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">XXD中的业务流程，准确的来讲，应该改名叫系统流程，是讲述业务功能操作是如果由解决方案各个内部子系统及外部系统协同完成的。这其中的actor是系统，因此，是从系统的角度来描述的。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">XXXS中，模板像系统用例文档，但是里面的一个个单元是叫功能，功能与用例的差别就是，一个是从系统的角度出发，一个是从Actor（即用户）的角度出发，对每个功能，有功能描述，功能的前置条件、后置条件、功能的用户角色、业务规则，输入规格，输出规格，如果涉及到界面，就有界面原型。具体的内容，通常pre-condition是千篇一律的，如用户必须已登录什么的，后置条件通常是结果，而角色通常是一个很泛的一个总称（比如在厨房干活的分切菜的，炒菜的，统称厨子）。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">对于客户方描述的不清楚或者只描述了几个片段或例子的需求，我们采用prototype的方式，先按照自己的理解做prototype，然后给客户去演示，由客户来决定是否符合他们要求。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">是不是看上去很完美？</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">再看看几个问题：</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题一：对客户方的某个需求，我方一直不理解客户方为什么会提这么怪异的需求，觉得不可思议，而客户方一直坚持要这个功能！</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题二：客户方并不具备多么深厚的业务抽象功力，我们自己通过蒙着眼睛摸象的方式作出原型给客户方评审，客户方say  ok就ok，不ok就不ok，客户方不会犯错误吗？客户方会照顾你其它客户的需求吗？我们拒绝客户方的理由通常是实现不了，或者工作量太大。我们绝大多数人没法使用客户的业务语言告诉客户，你的目的是什么，你要求怎么来做，这样做有什么样的坏处，我建议这么做，这么做能获得什么样的好处。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题三：我们把一些业务角色使用的功能和运维人员使用的功能放置于一个界面中，从功能上来讲，我们可以自豪的告诉客户，我们实现了你要的功能。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">。。。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">我相信我了解到的问题绝不是全部，还有很多我不知道的问题。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">对这种状况，我逐一分析了一下原因：</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题一：因为我们理解的业务概念跟客户理解的客户概念不一样，虽然我们叫的是同一个名词，但实际上并不是同一个东西，从而导致我们觉得客户提的要求匪夷所思；</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题二：我可以说，其实我们的做法是去摸清楚客户要什么，但没有去理解他为什么要；</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">问题三：很明显，我们实现了功能，但忽略了功能的使用者是谁；</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">这一切的根源是什么？我认为，这根源是我们一直从系统的角度去思考问题，思考我们的系统功能，思考我们的系统流程，对一个经验丰富的专家来讲，也许会考虑的比较全面，但绝大多数人往往是重视了功能的描述，而且描述是基于我方的语言，忽略了功能的用户，而我们没有一个万能的客户和万能的专家帮我们指出交付件的所有的问题。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">即便是我们成功交付了一个系统，我们还是没有消化客户为什么要这么做的原因，对业务系统来讲，这是最核心的价值之一。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">我们要怎么改？我的建议是：</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">1、<strong>加入</strong>对&#8220;用户需求背景&#8221;的调研，即真正的&#8220;业务调研&#8221;，在这个阶段的主角是BA，BA是业务专家，对IT技术不熟，这是他的优势，这个阶段的输出件要包括客户的业务架构，包括组织结构，人员角色，业务流程（是各业务人员如何协同来完成工作，跟系统流程有本质区别），业务模型（用户做的事情中涉及到的一些概念，这里指纯业务概念，客户能感知的，非系统概念）。经过这个阶段，我们应该能明白客户为什么会提这个那个需求，能够有效避免因为客户的片面和狭隘导致我们跟着片面和狭隘，并且我们知道了客户说的概念A是指什么，概念B是指什么，跟我们平常所说的有什么不同。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">2、<strong>扭转</strong>&#8220;功能分析&#8221;的角度，由从系统的角度分析转变成由用户的角度分析。把功能变成用户基于系统所做的操作分析（系统用例），首先搞清楚是谁，然后是要基于系统做什么事情，有什么业务规则，前置条件和后置条件是什么，再次是系统通过什么样的界面或接口来支持。输出的内容看似都差不多，但因为是从用户的角度出发分析的，提供的功能自然会更贴用户的心。</div> <div style="padding-bottom: 5px; text-indent: 15px; margin-top: 14pt; margin-right: 0px; margin-bottom: 14pt; margin-left: 0px; ">3、我们要明白一个基本原则，业务架构是不依赖于IT系统存在的，IT系统是规范业务运作和提升业务效率的工具，IT系统中的软件概念是业务概念在软件系统中的投影，千万不能从技术的角度出发，视图去重定义业务概念。</div></div><img src ="http://www.blogjava.net/landy/aggbug/381548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-06-26 21:52 <a href="http://www.blogjava.net/landy/archive/2012/06/26/381548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个&amp;ldquo;订单&amp;rdquo;引发的思考</title><link>http://www.blogjava.net/landy/archive/2012/06/24/381377.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Sun, 24 Jun 2012 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/06/24/381377.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/381377.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/06/24/381377.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/381377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/381377.html</trackback:ping><description><![CDATA[<p>某司CRM产品，认为走业务流程的业务才是订单。按照这种理解，退货，换货是订单，而充值不是订单。</p> <p>究竟什么是订单?</p> <p>订单作为一个业务Actor皆可感知的重要业务实体，其是脱离IT系统而存在的，IT系统所做的仅是将其在软件系统中以对象的形式表现出来，不能依据系统实现，改变订单的定义。要正确的给订单下定义，须忘掉IT系统，从业务的角度给出定义。</p> <p>企业一般会有售前，售后，销售，服务等部门，而订单是产生在销售活动中的，表示客户对企业产品或服务的一次订购。依此理解，退换货是服务，不是订单，而充值是订单。走不走流程，仅仅是订单实施的方式。</p> <p>这个案例告诉我们，系统的业务模型，要从业务的视角来建，IT系统是将业务模型用软件概念来表述，不能改变业务概念。</p><img src ="http://www.blogjava.net/landy/aggbug/381377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-06-24 16:29 <a href="http://www.blogjava.net/landy/archive/2012/06/24/381377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何确定用例和场景的优先级</title><link>http://www.blogjava.net/landy/archive/2012/05/11/377858.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Thu, 10 May 2012 20:56:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/05/11/377858.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/377858.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/05/11/377858.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/377858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/377858.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />在做需求分析时，特别是在设计分析用例模型时，很多人可能碰到过这样的问题，如何准确划分优先级，根据我的经验，一般需求分析人员对用例的优先级划分上没有具体的原则和标准，往往跟着感觉走，要么是客户认为重要的，急着要实现的功能，优先级就高，当然也很重要。对于什么关键用例，什么重要用例，什么是辅助用例或一般用例，都没有具体分得很清楚，因为他们觉得优先的都重要，反正都是要开发的，客户说什么功能最急需要，那么就完成它，其余所有用例都为一般用例。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">其实我也很赞成这部分人的观点，主要是结合实际项目，这种情况太普遍了，所以往往只区分重要和非重要来得更方便。不过既然RUP以及软件工程的需求分析阶段都有这么个概念，而且对用例（场景，类）都分为三个等级：关键（首要），重要（其次），辅助（不错）。那么为了准确理解，并在项目中应用，我个人认为理解清晰它，也还是有必要的。而最重要的是掌握其划分原则。最近参加了些需求分析方面的培训，也了解了一些不同人的观点，结合RUP给出的解释，我做了些总结。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">下边说说我的理解。因为用例，场景，类都有这三个等级划分，所以为了解释方便，下边直接通过用例说明问题。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><strong style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">第一 关键（或首要）用例</strong><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">RUP中解释是这样的：该等级的用例于系统的首要任务，基本功能以及待开发的功能有关。如果这些关键用例缺失，系统将无法完成首要任务。他们还促进架构设计，而且往往是最频繁使用的用例。其实这个理解很好懂，我也比较赞成，一句话就是系统必不可少的功能，如果把系统无限缩小，到不能再缩小了（再缩小系统都无法使用了），这时剩下的用例就是关键用例。而关键需求决定架构，所以这些关键用例往往对架构设计的影响是很大的。所以分析用例模型时要特别重视关键用例的识别。有时候不能直接听客户所谓的优先级高的用例。因为客户不懂系统实现，他们只关注功能，不关注你如何设计，如何分析。当然他们提的优先功能固然不可不重视，但是我们不能局限于这些，我们需要认真分析，把那些客人认为非优先，但是通过分析，我们认为确实是关键需求的用例找出来，否则以后等用户去发现这些&#8220;关键用例&#8221;，然后再提需求变更就麻烦了，因为原来的关键需求识别上没有做好，现在要变更需求，可能影响到架构，搞不好系统整个都要整改，那就麻烦了。我的识别方法时：客户眼中的&#8220;优先&#8221;功能 + 系统最小实现的功能。把握了这个原则，识别关键用例还是不难的。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><strong style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">第二 重要（或其次）用例<br /></strong><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">RUP中的解释是这样的：</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">该等级的用例于系统功能的支持有关，比如统计数据编译，报告生成，监督和功能测试等。如果他们缺失，系统仍然可以再一定时间内完成基本任务，但服务质量所有下降。这类功能其实相比之下不太好识别，因为特征不够明显，不过识别原则还是很清晰，就是与系统功能的支持有关。比如常见的系统的用户管理模块，管理模块，系统分类模块等，都是为了支持整个系统其他关键用例服务的。没有他们系统还是可以用，但是相对质量不高。这类重要性用例的识别，我的方法时抓住一个&#8220;支持&#8221;2字的理解就比较好识别了，分析多了，就自然有了感觉，而且，结合关键用例和辅助性的用例的分析，用排除法也可以使分析得更加准确。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><strong style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">第三 辅助性（一般）用例</strong><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">RUP中的解释是这样的：</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">这些用例和类着重舒适性的功能 ，与系统的主要任务无关，但有助于系统的使用和市场定位。我的理解，一句话，就是系统扩展的功能，生动一点说，就是锦上添花的功能。根据这个特征，这列用例还是比较好识别的。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">总结：一般来说，不同等级的用例对架构的影响程度跟他们的关键程度是成正比的。但是也应该明确，有些关键用例没有或基本没有影响力，反过来也是一样，某些辅助性的用例可能对系统架构产生比较大的影响。所以，方法论的东西没有绝对的正确，只是利用这些理论分析相对有效。呵呵，在现实中经常发现，爱因斯坦真了不起，相对论用途那么广泛，有时不自觉感受到其存在了，而在学生时代远远理解不到这个层次.</span>&nbsp;<br />转载自：<a href="http://blog.csdn.net/chuan122345/article/details/5167035">http://blog.csdn.net/chuan122345/article/details/5167035</a><img src ="http://www.blogjava.net/landy/aggbug/377858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-05-11 04:56 <a href="http://www.blogjava.net/landy/archive/2012/05/11/377858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>业务建模一般步骤和方法</title><link>http://www.blogjava.net/landy/archive/2012/03/24/372626.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Sat, 24 Mar 2012 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/03/24/372626.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/372626.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/03/24/372626.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/372626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/372626.html</trackback:ping><description><![CDATA[转载自：<a href="http://hi.baidu.com/parryblog/blog/item/2d1ae59a72b043bcc9eaf4a0.html">http://hi.baidu.com/parryblog/blog/item/2d1ae59a72b043bcc9eaf4a0.html</a>&nbsp;<br />本篇开始之前先扯点闲话，商业应用系统开发经历了三个阶段：<br />　　第一个阶段以计算为中心，分析设计围绕程序的运行效率，算法优劣，存贮优化来进行。90年代的大学课程讲的都是这些。<br /><br />　　第二阶段以数据为中心，分析设计围绕数据流进行，以数据流程来模拟业务流程。这也就是所谓的面向过程的分析模式。<br /><br />　　第三阶段以人为中心，分析设计围绕人的业务需求，使用要求，感受要求进行。这也就是现在的面象对象分析模式。<br /><br />　　使用OO方法建立商业模型必须先定义涉众。商业系统无论多复杂，无论什么行业，其本质无非是人，事，物，规则。人是一切的中心，人做事，做事产生物，规则限制人事物。人驱动系统，事体现过程，物记录结果，规则则是控制。无论OO也好，UML也好，复杂的表面下其实只是一个简单的规则，系统分析员弄明白有什么人，什么人做什么事，什么事产生什么物，中间有什么规则，再把人，事，物之间的关系定义出来，商业建模也就基本完成了。这时候可以说，系统分析员已经完全了解了用户需求，可以进入系统建模阶段了。<br /><br />　　书归正传，上篇笔者归纳了一些典型的涉众类型及他们的普遍期望。接下来，就是要将他们这些期望定义出来。这个过程，就是业务用例获取的过程。笔者可以跟大家分享的经验是通过以下步骤进行，这些步骤并非唯一正确，对于经验不多的系统分析员来说，这些步骤很有指导意义。<br /><br />　　笔者做了一个建模实例，有需要有读者请到笔者的BLOG资源中心下载，实例以上一篇所述网上图书馆需求为蓝本建立了业务用例模型，之后的概念模型、系统模型则抽取了其中的借阅过程作为例子。不记得了可以后头找找。<br /><br />　　建模第一步，从涉众中找出用户。并定义这些用户之间的关系。在ROSE中，应该使用business actor 类型。参考上一篇的需求描述，下载实例<br /><br />第二步，找出每个用户要做的事，即业务用例，在ROSE中应使用Business use case类型。请参考《用例的类型与粒度》一文以帮助确定用例的粒度。笔者强烈建议为每一个business actor绘制一个业务用例图，这能很好的体现以人为中心的分析模式，并且不容易漏掉business actor需要做的事。至于以参与者为中心的视图容易漏掉某个业务用例的参与者的担心，可以在第四步中得到消除。下载实例<br /><br />　　第三步，利用业务场景图帮助分析业务流程，在ROSE中，这个阶段最好使用活动图Activity diagram。在这个阶段，业务场景图非常重要，在绘制过程中，系统分析员必须采用第一步中定义的用户名字作为泳道名，使用第二步中定义的业务用例名作为活动名来绘制。必须这么做的原因是，如果你无法把利用已经定义出来的 business actor 和 business use case完备的描绘业务流程，那么一定是前面的定义出问题了，你需要回头审视是否 business actor 和 business use case定义不完善或错误。如果不是所有的business actor 和 business use case 都被用到，要么应该检查业务流程调研时漏了什么，要么应该检查是否定义了一些无用的business actor 和 business use case 。同时，绘制业务场景图也非常有助于选择合适的用例粒度并保持所有的用例都是同一粒度。下载实例<br /><br />　　第四步，绘制用例场景图。与业务场景图不同的是，用例场景图只针对一个用例绘制该用例的执行过程。笔者仍然强烈推荐使用activity diagram。在用例场景图的绘制中，必须使用第一步中定义的业务用户作为泳道。必须这么做的原因是，它能帮助你发现在定义业务用例图时的错误，比如是否漏掉了某个业务用例的潜在使用者。不是每个业务用例都需要绘制场景图，只有两三个步骤的业务用例是不必一定绘制业务用例图的，但仍然需要在业务用例规约文档中写明。下载实例<br /><br />第五步，从第三步或第四步中绘制的活动图中找到每一步活动将使用到的或产生的结果。这是找到物的过程。找到后，应当建立这些物之间的关系。在ROSE中，这称为业务实体模型。应该使用business entity 类型。下载实例<br /><br />　　第六步，在上述过程中，随时补充词汇表Glossary。将此过程中的所有业务词汇，专业词汇等一切在建模过程中使用到的需要解释的名词。这份文档将成为模型建立人与读者就模型达成一致理解的重要保证。<br /><br />　　第七步，根据上一篇中提到的业主，老板等涉众的期望审视建立好的模型，确定业务范围，决定哪些业务用例在系统建设范围内。那些不打算纳入建设范围内的业务用例有两种情况，一种是该业务用例是被调用一方，那么应该把它改为 boundary 类型，意味着将来它是一个外部接口。另一种是该业务用例主动调用系统内业务用例，那么应该将它改为business actor类型。与普通business actor不同的是，由业务用例转换而成的business actor不是人，而通常是一个外部系统进程，因此应该在被调用的系统内业务用例与它之间增加一个boundary元素，意味着我们的系统将为这样一个外部进程提供一个接口。严格来说，那些需要纳入建设范围的business use case 应当对应的生成一个 business use case realization， 以后的设计工作将归纳到这些实现用例中。但笔者觉得这一步并非很关键的，实际中本人也经常省略这一步，而将协作图，象活动图，类交互图等直接在business usecase下说明。不过本实例中笔者还是按照正规方法来建模的。下载实例<br /><br />　　需要说明的是，上述的步骤并非一次性完成的，在每一个步骤中都可能导致对以前步骤的调整。即使建模已经完成，当遇到变化或发现新问题时，上述步骤应当从头到尾再执行一次。这也是RUP倡导的迭代开发模式。<br /><br />经过以上的步骤，我们已经建立了一个完整的业务模型。但这决不是建模工作的全部，以上过程只说明了建立一个完整业务模型的过程，不能说这样就建立了一个很好的业务模型。因为上述的过程中并没有提及业务分析过程。分析过程全凭系统分析员的经验，对OO的理解和对行业业务的把握能力，对原始业务模型进行归纳，整理，抽象，重构，以建立一个更高效，合理，扩展性更强的模型。这个过程无法以步骤说明。或许以后笔者会专门针对模型分析写点东西。另外除了模型，还至少需要写业务架构文档、用例规约和补充用例规约三种文档。因为模型虽然可以较好的体现业务架构，但很不好表达业务规则和非业务需求，这些需要在文档中说明。例如用例的前置条件和后置条件就是一种业务规则。读者可以在RUP文档中找到这些文档的模板。<img src ="http://www.blogjava.net/landy/aggbug/372626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landy/" target="_blank">迷途书童</a> 2012-03-24 21:46 <a href="http://www.blogjava.net/landy/archive/2012/03/24/372626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>