﻿<?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/</link><description>敏感、勤学、多思</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 09:18:34 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 09:18:34 GMT</pubDate><ttl>60</ttl><item><title>软件质量属性设计</title><link>http://www.blogjava.net/landy/archive/2012/07/21/383641.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Sat, 21 Jul 2012 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/07/21/383641.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/383641.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/07/21/383641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/383641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/383641.html</trackback:ping><description><![CDATA[<p>本人曾经阅读过《软件架构设计》一书的第一版，读了之后对架构设计的方法、流程有了更深刻的认识，也对我后续的工作起了非常大的指导作用。最近从ITEye上了解到温昱先生出了《软件架构设计》一书的第二版，赶紧下了样章读了一下，感觉第二版相比第一版，在概念、方法、流程、实践几个方面的指导性更强了，实在是程序员升级架构师必备良书！</p> <p>下面基于我实际经历的一个项目，结合对《软件架构设计》一书的理解，谈一下质量属性的设计。</p> <p>首先介绍一下项目背景，某大型电信解决方案提供商向全球电信运营商提供某软件系统，因不同的运营商需求有差别，需要投入大量的人力物力对某个特定的运营商进行客户化定制，成本较高，为了降低定制成本，该提供商将交付组织切分为负责通用版本的组织A和负责针对特定局点定制的交付组织B，且成立了一个项目专门提升该软件系统的可定制性，以实现这种分级交付，降低定制成本。</p> <p>项目启动后，负责该项目的架构师凭借丰富的经验马上启动了架构设计，他从业界同类产品了解到，业界为了提升定制能力采用了元数据驱动的架构风格，于是马上开始了元数据驱动框架的设计，设计好之后召集开发人员和管理人员开了个沟通会，会中，该架构师被两个问题难住了：</p> <p>1）有个定制开发人员问，如果基线版本升级了，能否保证定制版本做的修改能够被直接继承？在这个问题上，大家发生了激烈的争论，架构设计团队认为有些场景可以，有些场景不可以，而定制开发人员的理解跟架构设计团队的理解不一样，最终该问题被搁置下来，后续再论。</p> <p>2）管理人员问，对定制能力目标，我们怎么测试和验证目标是否达成。这个问题比较毒，一下子把架构设计团队问傻了，没人答得上来，于是被骂了一顿。</p> <p>问题在哪里？？看了《软件架构设计》的第9章&#8220;概念性架构设计&#8221;就能找到答案。我认为的问题有：</p> <p>1）没有从系统各Actor的角度，分析定制用例，导致重要定制场景遗漏，被问起的时候自然就捉襟见肘；</p> <p>2）没有将定制能力目标分解到定制场景，导致对设计缺乏度量，不知道设计到底能不能满足定制能力目标要求，自然也回答不了&#8220;通用版本与定制版本的边界&#8221;这类的问题。</p> <p>要怎么做呢？？看了《软件架构设计》的第9章&#8220;概念性架构设计&#8221;就能找到答案。我认为，应该遵从下面的步骤，才能确保定制目标的达成：</p> <p>1）分析定制的Actor，比如定制开发人员，定制运维人员等；</p> <p>2）针对各Actor，分析其定制用例，如开发人员增加一个业务、修改一个业务流程、增加一个业务实体字段等等；</p> <p>3）针对每个用例，结合定制能力目标，分析该Actor的工作流程，通过这一步的分析，通用版本的边界（系统用例）能够大致识别出来。</p> <p>4）再针对关键系统用例，进一步使用分析对象进行鲁棒分析；通过这一步，对元数据驱动框架的能力要求能明确下来；</p> <p>5）然后在进一步对元数据驱动框架进行细化设计；</p> <p>通过这样一个系统的方法和流程，我们才能保证做出符合业务目标的可定制性设计。其它类型的质量属性的设计方法和流程也是类似的。</p> <p>其实那个负责可定制性设计的架构设计团队不管是业务经验还是技术能力，都是比较扎实的，关键是没有掌握一个比较科学的设计方法和流程。因此，广大程序员兄弟们在实践的同时，一定不能忘了提升理论素养，这样才有利于更早的打破天花板，获得更大的成功。</p><img src ="http://www.blogjava.net/landy/aggbug/383641.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-21 12:30 <a href="http://www.blogjava.net/landy/archive/2012/07/21/383641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>软件架构设计（二）&amp;mdash;&amp;mdash;软件架构设计过程</title><link>http://www.blogjava.net/landy/archive/2012/07/04/382231.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Wed, 04 Jul 2012 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/07/04/382231.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/382231.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/07/04/382231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/382231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/382231.html</trackback:ping><description><![CDATA[<p><strong>三、架构设计的过程</strong></p> <p>本人经历过不少项目，一些项目的架构设计负责人能力很强，接到活之后，马上一头扎进设计，抽象出一堆玄玄乎乎的概念，讲得人晕头转向的，让人觉得高深莫测，但是，在会议上却被涉众提的一些简单的问题问得很仓促，究其根本，还是漏考虑了涉众的需求，被人提问而又缺乏准备，是不是很多人有类似的经验？：）</p> <p>我们还经常遇到的场景是设计人员通常为一些模型、概念争论不休，公说公的英俊，婆说婆的漂亮，其实模型概念这东西就像人的人生观和世界观，是人对世界和人生的主观认识，可能随着年龄阶段的变化而变化，而且有时候没有绝对的对与错，就像有些人喜欢金戈铁马，有些人喜欢与世无争，我们很难说谁一定是对的一定是错的！遇到这种清醒时，我建议停下争论，争论方各自拿出实际的业务场景来检验模型，哪个模型对场景的满足度更好，实现成本更低则更好，如果两个都挑不出刺儿，随便选一个即可。</p> <p>还有一些架构设计人员喜欢创造一些与众不同的概念，让人看上去显得高深莫测。我觉得如果一个架构师能够用最少的语言、文字把问题和方案讲清楚，那才是真正的有水平！你让人晕头转向的时间既是项目的成本，因此，我们创造概念词汇的时候，需要从涉众的角度出发，我这里的意思不是盲从涉众语言词汇，而是说出发点从涉众角度出发，如果涉众原本使用的语言不够准确，我们可以跟他们一起探讨，定义更合适的概念词汇。</p> <p>还有一个就是对软件竞争力的认识。有人通过包装一堆玄玄乎乎的概念来显得很高深莫测，试图通过这种方式让人觉得有竞争力，我认为，竞争力首先是要跟对手比，其次一定是涉众能感知的，能够涉众带来正向价值的，比如省多少成本，端到端业务流程节约多少时间。</p> <p>我认为遵循一个科学的架构设计过程跟上篇提到的软件架构4+1视图法是架构设计的两个法宝，一个指导思维、定义输出，另一个指导如何来做，相辅相成，确保架构设计人员全面而正确的理解需求，做好需求平衡、设计平衡，设计出实用的、能落地的架构。</p> <p>下面我会按顺序讲解架构设计的过程，以及每个步骤具体要做的事情。</p> <p><strong>3.1 确定涉众</strong></p> <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>一般来讲，涉众包括客户（资方）、承接方（劳方）、用户。我们通常找到代表某一类型的涉众群体的代表人：客户代表、劳方代表、用户代表等。访谈的时候直接找代表进行。</p> <p><strong>3.2 确定系统边界</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于要明确实现某种标准的软件系统，通常确定边界非常容易，直接按标准圈定的scope分析即可，比如像SIPServlet容器，是要求遵从JSR168规范的，那么软件系统的Scope就是JSR168规定的Scope，但是也有例外，比如客户或者劳方明确指定要复用一个现有的实现了部分功能的系统或组件，那么Scope就不同了。对于没有标准的软件系统，就需要分别访谈客户代表、承接方代表确定系统边界。为什么要访谈承接方代表呢？因为承接方代表往往是劳方领导，领导肩负企业战略达成的使命，很有可能对系统提出比客户更多的要求。举个例子，某客户需要一个SIP通信协议栈，以实现三方通话的业务，但是劳方领导认为，后续ICT融合是趋势，我们构建的系统要支持ICT融合应用部署和运行，支持业务标准JSR168规范。</p> <p><strong>3.3 软件需求收集</strong></p> <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>软件需求可分为二类：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能需求（即业务用例）：描述Actor（用户或系统）可基于软件系统做什么事，要符合什么业务规则；</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非功能性需求又可分为两类：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 质量属性：质量属性指软件系统的品质，可分为运行期质量属性与开发期质量属性。</p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行期质量属性包括</p></blockquote> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）性能：性能是指软件系统及时提供相应服务的能力。具体而言，性能包括速度、吞吐量和持续高速性这三方面的要求。<br>　　（2）安全性：指软件系统同时兼顾向合法用户提供服务，又阻止非授权使用功能的能力。<br>　　（3）易用性：指软件系统易于使用的程度。<br>　　（4）可用性：可用性与易用性不相同。可用性指系统长时间无故障运行的能力。<br>　　（5）可伸缩性：指当用户增加时，软件系统维持高服务质量的能力。<br>　　（6）互操作性：指本软件系统与其他系统交换数据和相互调用服务的难易程度。<br>　　（7）可靠性：软件系统在一定时间内无故障运行的能力。<br>　　（8）健壮性：也称容错性。是指软件系统在异常情况仍能够正常运行的能力。</p></blockquote> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发期质量属性包括：</p></blockquote> <blockquote> <p>&nbsp;&nbsp; （1）易理解性：是指系统设计能被开发人员理解的难易程度。<br>　　（2）可扩展性：为适应新需求或者需求变化，为软件增加功能的能力。有些时候，称之为灵活性。<br>　　（3）可重用性：重用软件系统或其中一部分的能力的难易程度。<br>　　（4）可测试性：对软件测试以证明其满足需求规约的难易程度。在实际的项目中，主要指进行单元测试等难易程度。<br>　　（5）可维护性：修改Bug，增加功能，提高质量属性。<br>　　（6）可移植性：将软件系统从一个运行环境转移到另一个不同的运行环境的难易程度。</p></blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 约束：规定开发软件系统时必须遵循的限制条件，如要基于什么操作系统，要基于什么开发语言等等。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于功能需求，可找系统的直接使用用户代表，对其进行访谈，收集其要基于系统做的事情，可按照标准的用例模板，在访谈的过程中引导用户代表。之后，绘制业务用例视图，并针对每个业务用例，使用标准的用例模板将功能需求编档，通常叫用例规约。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于非功能性需求，可找软件系统的涉众，依据下面的模板，引导涉众，收集其对相应质量属性的要求：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_thumb.png" width="299" height="406"></a> <a href="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_thumb_1.png" width="304" height="411"></a> <a href="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/152c53fb67fc_1336A/image_thumb_2.png" width="293" height="415"></a> </p> <blockquote> <p><strong>总结：本阶段需要输出业务用例视图，业务用例规约，非功能性需求。</strong></p> <p><strong>待续。。。</strong></p></blockquote><img src ="http://www.blogjava.net/landy/aggbug/382231.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-04 22:28 <a href="http://www.blogjava.net/landy/archive/2012/07/04/382231.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/06/28/381743.html</link><dc:creator>迷途书童</dc:creator><author>迷途书童</author><pubDate>Thu, 28 Jun 2012 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/landy/archive/2012/06/28/381743.html</guid><wfw:comment>http://www.blogjava.net/landy/comments/381743.html</wfw:comment><comments>http://www.blogjava.net/landy/archive/2012/06/28/381743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landy/comments/commentRss/381743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landy/services/trackbacks/381743.html</trackback:ping><description><![CDATA[<p>做了好几年架构设计的事了，一直没有好好的总结。实在不好，花点时间总结一下，写出来，有兴趣的朋友可以一起探讨。</p> <p>软件架构设计的主题狠深狠难，本文打算从架构的概念，架构的表述方法，架构设计的过程三个方面来讲一下我的理解。</p> <p><strong>一、什么是软件架构？</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 温昱在《软件架构设计》一书中，给了下面的定义：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组合派：软件系统的架构将系统描述为计算组件及组件之间的交互。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 决策派：架构是一系列重要决策的集合，这些决策与以下内容有关：软件的组织，构成系统的结构元素及其接口的选择，这些元素在相互协作中明确表现出的行为，这些结构元素和行为元素进一步组合所构成的更大规模的子系统，以及指导这一组织--包括这些元素及其接口、它们的协作和它们的组合--架构风格。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在我看来，决策派的定义更为具体和准确，注意决策派用了元素这一词而没有用组件，组件是有具体含义的，指一个可独立替换的物理单元，而架构需要能够指导涉众，如开发人员、用户、部署人员等等，对开发人员来讲，开发过程中如何分包、如何将包打包为组件，架构师需不需要提供指导呢，答案是肯定的。因此，如果将架构限定在组件和组件的交互上，是不完整的。</p> <p><strong>二、架构的表述方法</strong>  <p>&nbsp;&nbsp;&nbsp;&nbsp; 这个现在都有共识，就是4+1视图表述法：逻辑视图，实现视图，进程视图，部署视图，用例视图。 参见下图RUP 4+1视图：  <blockquote> <p align="center"><a href="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/0cbe16ab03f5_13A0F/82250175980_2.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="82250175980" border="0" alt="82250175980" src="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/0cbe16ab03f5_13A0F/82250175980_thumb.gif" width="386" height="219"></a>&nbsp;</p></blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>用例视图</strong>关注系统的人、事、物、规则，人是指系统的Actor，包括业务主角和业务工人，事是指系统用例，物是指业务实体，规则指做事情的前置条件、后置条件，做事情过程中的规则。下面这个图很精辟：  <p align="center">&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/0cbe16ab03f5_13A0F/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/landy/WindowsLiveWriter/0cbe16ab03f5_13A0F/image_thumb.png" width="462" height="176"></a> </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用例视图是4+1视图中的+1，它定义需求标准，跟其它视图描述系统某一方面的结构有很大的不同。  <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑视图</strong>关注系统的逻辑功能模块和领域模型，不仅包括用户可见的功能模块，还包括实现用户功能而必须提供的“辅助功能模块”；它们可能是逻辑层、功能模块、类等。  <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现视图</strong>关注程序包，不仅包括要编写的源程序，还包括可以直接使用的第三方SDK和现成框架、类库，以及开发的系统将运行于其上的系统软件或中间件。开发架构和逻辑架构之间可能存在一定的映射关系：比如逻辑架构中的逻辑层一般会映射到实现架构中的多个程序包；再比如实现架构中的源码文件可以包含逻辑架构中的一到多个类（在C++里一个源码文件可以包含多个类，即使在Java里一个源码文件也可以同时包含一个类和几个内部类）。  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>进程视图</strong>关注进程、线程、对象等运行时概念，以及相关的并发、同步、通信等问题。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进程视图和实现视图的关系：实现视图一般偏重程序包在编译时期的静态依赖关系，而这些程序运行起来之后会表现为对象、线程、进程，进程视图比较关注的是这些运行时单元的交互问题。  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>物理视图</strong>关注“目标程序及其依赖的运行库和系统软件”最终如何安装或部署到物理机器，以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。物理架构和运行架构的关系：运行架构特别关注目标程序的动态执行情况，而物理架构重视目标程序的静态位置问题；物理架构还要考虑软件系统和包括硬件在内的整个IT系统之间是如何相互影响的。  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面几个视图是最典型的视图，不管你是通信中间件，还是依赖于数据库的企业应用都需要的。对于依赖数据库的企业应用，通常还需要<strong>数据视图，数据视图</strong>关注对象如何存储，如数据库表等<strong>。</strong> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4+1视图不仅仅是软件架构的表述方法，它们各自从不同的视角去展现架构，因此，还是一种比较好的思维方式，引导我们从不同的视角去思考，从而做出比较系统的架构设计。</p><img src ="http://www.blogjava.net/landy/aggbug/381743.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-28 23:29 <a href="http://www.blogjava.net/landy/archive/2012/06/28/381743.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>