﻿<?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/yifeng/category/34021.html</link><description>光是知道是不够的，必须要加以应用；光是希望是不够的，非去做不可。</description><language>zh-cn</language><lastBuildDate>Thu, 20 Nov 2008 19:10:07 GMT</lastBuildDate><pubDate>Thu, 20 Nov 2008 19:10:07 GMT</pubDate><ttl>60</ttl><item><title>优秀系统分析师必读——需求分析20条原则</title><link>http://www.blogjava.net/yifeng/archive/2008/11/21/241776.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Thu, 20 Nov 2008 16:37:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/11/21/241776.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/241776.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/11/21/241776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/241776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/241776.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="760" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div class="title" align="center">优秀系统分析师必读——需求分析20条原则</div>
            </td>
        </tr>
        <tr>
            <td height="18">&nbsp;</td>
        </tr>
        <tr>
            <td>
            <div class="formtitle" align="center">2008-10-24 来源：IT经理世界</div>
            </td>
        </tr>
        <tr>
            <td height="16">&nbsp;</td>
        </tr>
        <tr>
            <td valign="top">
            <table cellspacing="0" cellpadding="0" width="90%" align="center" border="0">
                <tbody>
                    <tr>
                        <td class="content" valign="top">
                        <p>对商业用户来说，他们后面是成百上千个供应商，前面是成千上万个消费顾客。怎样利用软件管理错综复杂的供应商和消费顾客，如何做好精细到一个小小调料包的进、销、调、存的商品流通工作，这些都是商业企业需要信息管理系统的理由。软件开发的意义也就在于此。而弄清商业用户如此复杂需求的真面目，正是软件开发成功的关键所在。 </p>
                        <p>经理：&#8220;我们要建立一套完整的商业管理软件系统，包括商品的进、销、调、存管理，是总部-门店的连锁经营模式。通过通信手段门店自动订货，供应商自动结算，卖场通过扫条码实现销售，管理人员能够随时查询门店商品销售和库存情况。另外，我们也得为政府部门提供关于商品营运的报告。&#8221; </p>
                        <p>分析员：&#8220;我已经明白这个项目的大体结构框架，这非常重要，但在制定计划之前，我们必须收集一些需求。&#8221; </p>
                        <p>经理觉得奇怪：&#8220;我不是刚告诉你我的需求了吗？&#8221; </p>
                        <p>分析员：&#8220;实际上，您只说明了整个项目的概念和目标。这些高层次的业务需求不足以提供开发的内容和时间。我需要与实际将要使用系统的业务人员进行讨论，然后才能真正明白达到业务目标所需功能和用户要求，了解清楚后，才可以发现哪些是现有组件即可实现的，哪些是需要开发的，这样可节省很多时间。&#8221; </p>
                        <p>经理：&#8220;业务人员都在招商。他们非常忙，没有时间与你们详细讨论各种细节。你能不能说明一下你们现有的系统？&#8221; </p>
                        <p>分析员尽量解释从用户处收集需求的合理性：&#8220;如果我们只是凭空猜想用户的要求，结果不会令人满意。我们只是软件开发人员，而不是采购专家、营运专家或是财务专家，我们并不真正明白您这个企业内部运营需要做些什么。我曾经尝试过，未真正明白这些问题就开始编码，结果没有人对产品满意。&#8221; </p>
                        <p>经理坚持道：&#8220;行了，行了，我们没有那么多的时间。让我来告诉您我们的需求。实际上我也很忙。请马上开始开发，并随时将你们的进展情况告诉我。&#8221; </p>
                        <p><strong>风险躲在需求的迷雾之后 </strong></p>
                        <p>以上我们看到的是某客户项目经理与系统开发小组的分析人员讨论业务需求。在项目开发中，所有的项目风险承担者都对需求分析阶段备感兴趣。这里所指的风险承担者包括客户方面的项目负责人和用户，开发方面的需求分析人员和项目管理者。这部分工作做得到位，能开发出很优秀的软件产品，同时也会令客户满意。若处理不好，则会导致误解、挫折、障碍以及潜在的质量和业务价值上的威胁。因此可见——需求分析奠定了软件工程和项目管理的基础。 </p>
                        <p><strong>拨开需求分析的迷雾 </strong></p>
                        <p>像这样的对话经常出现在软件开发的过程中。客户项目经理的需求对分析人员来讲，像&#8220;雾里看花&#8221;般模糊并令开发者感到困惑。那么，我们就拨开雾影，分析一下需求的具体内容： </p>
                        <p>&#183;业务需求——反映了组织机构或客户对系统、产品高层次的目标要求，通常在项目定义与范围文档中予以说明。 </p>
                        <p>&#183;用户需求——描述了用户使用产品必须要完成的任务，这在使用实例或方案脚本中予以说明。 </p>
                        <p>&#183;功能需求——定义了开发人员必须实现的软件功能，使用户利用系统能够完成他们的任务，从而满足了业务需求。 </p>
                        <p>&#183;非功能性的需求——描述了系统展现给用户的行为和执行的操作等，它包括产品必须遵从的标准、规范和约束，操作界面的具体细节和构造上的限制。 </p>
                        <p>&#183;需求分析报告——报告所说明的功能需求充分描述了软件系统所应具有的外部行为。&#8220;需求分析报告&#8221;在开发、测试、质量保证、项目管理以及相关项目功能中起着重要作用。 </p>
                        <p>前面提到的客户项目经理通常阐明产品的高层次概念和主要业务内容，为后继工作建立了一个指导性的框架。其他任何说明都应遵循&#8220;业务需求&#8221;的规定，然而&#8220;业务需求&#8221;并不能为开发人员提供开发所需的许多细节说明。 </p>
                        <p>下一层次需求——用户需求，必须从使用产品的用户处收集。因此，这些用户构成了另一种软件客户，他们清楚要使用该产品完成什么任务和一些非功能性的特性需求。例如：程序的易用性、健壮性和可靠性，而这些特性将会使用户很好地接受具有该特点的软件产品。 </p>
                        <p>经理层有时试图代替实际用户说话，但通常他们无法准确说明&#8220;用户需求&#8221;。用户需求来自产品的真正使用者，必须让实际用户参与到收集需求的过程中。如果不这样做，产品很可能会因缺乏足够的信息而遗留不少隐患。 </p>
                        <p>在实际需求分析过程中，以上两种客户可能都觉得没有时间与需求分析人员讨论，有时客户还希望分析人员无须讨论和编写需求说明就能说出用户的需求。除非遇到的需求极为简单；否则不能这样做。如果您的组织希望软件成功，那么必须要花上数天时间来消除需求中模糊不清的地方和一些使开发者感到困惑的方面。 </p>
                        <p>优秀的软件产品建立在优秀的需求基础之上，而优秀的需求源于客户与开发人员之间有效的交流和合作。只有双方参与者都明白自己需要什么、成功的合作需要什么时，才能建立起一种良好的合作关系。 </p>
                        <p>由于项目的压力与日俱增，所有项目风险承担者有着一个共同目标，那就是大家都想开发出一个既能实现商业价值又能满足用户要求，还能使开发者感到满足的优秀软件产品。 </p>
                        <p><strong>客户的需求观 </strong></p>
                        <p>客户与开发人员交流需要好的方法。下面建议20条法则，客户和开发人员可以通过评审以下内容并达成共识。如果遇到分歧，将通过协商达成对各自义务的相互理解，以便减少以后的磨擦（如一方要求而另一方不愿意或不能够满足要求）。 </p>
                        <p>1、 分析人员要使用符合客户语言习惯的表达 </p>
                        <p>需求讨论集中于业务需求和任务，因此要使用术语。客户应将有关术语（例如：采价、印花商品等采购术语）教给分析人员，而客户不一定要懂得计算机行业的术语。 </p>
                        <p>2、分析人员要了解客户的业务及目标 </p>
                        <p>只有分析人员更好地了解客户的业务，才能使产品更好地满足需要。这将有助于开发人员设计出真正满足客户需要并达到期望的优秀软件。为帮助开发和分析人员，客户可以考虑邀请他们观察自己的工作流程。如果是切换新系统，那么开发和分析人员应使用一下目前的旧系统，有利于他们明白目前系统是怎样工作的，其流程情况以及可供改进之处。s </p>
                        <p>3、 分析人员必须编写软件需求报告 </p>
                        <p>分析人员应将从客户那里获得的所有信息进行整理，以区分业务需求及规范、功能需求、质量目标、解决方法和其他信息。通过这些分析，客户就能得到一份&#8220;需求分析报告&#8221;，此份报告使开发人员和客户之间针对要开发的产品内容达成协议。报告应以一种客户认为易于翻阅和理解的方式组织编写。客户要评审此报告，以确保报告内容准确完整地表达其需求。一份高质量的&#8220;需求分析报告&#8221;有助于开发人员开发出真正需要的产品。 </p>
                        <p>4、 要求得到需求工作结果的解释说明 </p>
                        <p>分析人员可能采用了多种图表作为文字性&#8220;需求分析报告&#8221;的补充说明，因为工作图表能很清晰地描述出系统行为的某些方面，所以报告中各种图表有着极高的价值；虽然它们不太难于理解，但是客户可能对此并不熟悉，因此客户可以要求分析人员解释说明每个图表的作用、符号的意义和需求开发工作的结果，以及怎样检查图表有无错误及不一致等。 </p>
                        <p>5、 开发人员要尊重客户的意见 </p>
                        <p>如果用户与开发人员之间不能相互理解，那关于需求的讨论将会有障碍。共同合作能使大家&#8220;兼听则明&#8221;。参与需求开发过程的客户有权要求开发人员尊重他们并珍惜他们为项目成功所付出的时间，同样，客户也应对开发人员为项目成功这一共同目标所做出的努力表示尊重。 </p>
                        <p>6、 开发人员要对需求及产品实施提出建议和解决方案 </p>
                        <p>通常客户所说的&#8220;需求&#8221;已经是一种实际可行的实施方案，分析人员应尽力从这些解决方法中了解真正的业务需求，同时还应找出已有系统与当前业务不符之处，以确保产品不会无效或低效；在彻底弄清业务领域内的事情后，分析人员就能提出相当好的改进方法，有经验且有创造力的分析人员还能提出增加一些用户没有发现的很有价值的系统特性。 </p>
                        <p>7、 描述产品使用特性 </p>
                        <p>客户可以要求分析人员在实现功能需求的同时还注意软件的易用性，因为这些易用特性或质量属性能使客户更准确、高效地完成任务。例如：客户有时要求产品要&#8220;界面友好&#8221;或&#8220;健壮&#8221;或&#8220;高效率&#8221;，但对于开发人员来讲，太主观了并无实用价值。正确的做法是，分析人员通过询问和调查了解客户所要的&#8220;友好、健壮、高效所包含的具体特性，具体分析哪些特性对哪些特性有负面影响，在性能代价和所提出解决方案的预期利益之间做出权衡，以确保做出合理的取舍。 </p>
                        <p>8、 允许重用已有的软件组件 </p>
                        <p>需求通常有一定灵活性，分析人员可能发现已有的某个软件组件与客户描述的需求很相符，在这种情况下，分析人员应提供一些修改需求的选择以便开发人员能够降低新系统的开发成本和节省时间，而不必严格按原有的需求说明开发。所以说，如果想在产品中使用一些已有的商业常用组件，而它们并不完全适合您所需的特性，这时一定程度上的需求灵活性就显得极为重要了。 </p>
                        <p>9、 要求对变更的代价提供真实可靠的评估 </p>
                        <p>有时，人们面临更好、也更昂贵的方案时，会做出不同的选择。而这时，对需求变更的影响进行评估从而对业务决策提供帮助，是十分必要的。所以，客户有权利要求开发人员通过分析给出一个真实可信的评估，包括影响、成本和得失等。开发人员不能由于不想实施变更而随意夸大评估成本。 </p>
                        <p>10、 获得满足客户功能和质量要求的系统 </p>
                        <p>每个人都希望项目成功，但这不仅要求客户要清晰地告知开发人员关于系统&#8220;做什么&#8221;所需的所有信息，而且还要求开发人员能通过交流了解清楚取舍与限制，一定要明确说明您的假设和潜在的期望，否则，开发人员开发出的产品很可能无法让您满意。 </p>
                        <p>11、 给分析人员讲解您的业务 </p>
                        <p>分析人员要依靠客户讲解业务概念及术语，但客户不能指望分析人员会成为该领域的专家，而只能让他们明白您的问题和目标；不要期望分析人员能把握客户业务的细微潜在之处，他们可能不知道那些对于客户来说理所当然的&#8220;常识&#8221;。 </p>
                        <p>12、 抽出时间清楚地说明并完善需求 </p>
                        <p>客户很忙，但无论如何客户有必要抽出时间参与&#8220;头脑高峰会议&#8221;的讨论，接受采访或其他获取需求的活动。有些分析人员可能先明白了您的观点，而过后发现还需要您的讲解，这时请耐心对待一些需求和需求的精化工作过程中的反复，因为它是人们交流中很自然的现象，何况这对软件产品的成功极为重要。 </p>
                        <p>13、 准确而详细地说明需求 </p>
                        <p>编写一份清晰、准确的需求文档是很困难的。由于处理细节问题不但烦人而且耗时，因此很容易留下模糊不清的需求。但是在开发过程中，必须解决这种模糊性和不准确性，而客户恰恰是为解决这些问题作出决定的最佳人选，否则，就只好靠开发人员去正确猜测了。 </p>
                        <p>在需求分析中暂时加上&#8220;待定&#8221;标志是个方法。用该标志可指明哪些是需要进一步讨论、分析或增加信息的地方，有时也可能因为某个特殊需求难以解决或没有人愿意处理它而标注上&#8220;待定&#8221;。客户要尽量将每项需求的内容都阐述清楚，以便分析人员能准确地将它们写进&#8220;软件需求报告&#8221;中去。如果客户一时不能准确表达，通常就要求用原型技术，通过原型开发，客户可以同开发人员一起反复修改，不断完善需求定义。 </p>
                        <p>14、 及时作出决定 </p>
                        <p>分析人员会要求客户作出一些选择和决定，这些决定包括来自多个用户提出的处理方法或在质量特性冲突和信息准确度中选择折衷方案等。有权作出决定的客户必须积极地对待这一切，尽快做处理，做决定，因为开发人员通常只有等客户做出决定才能行动，而这种等待会延误项目的进展。 </p>
                        <p>15、 尊重开发人员的需求可行性及成本评估 </p>
                        <p>所有的软件功能都有其成本。客户所希望的某些产品特性可能在技术上行不通，或者实现它要付出极高的代价，而某些需求试图达到在操作环境中不可能达到的性能，或试图得到一些根本得不到的数据。开发人员会对此作出负面的评价，客户应该尊重他们的意见。 </p>
                        <p>16、 划分需求的优先级 </p>
                        <p>绝大多数项目没有足够的时间或资源实现功能性的每个细节。决定哪些特性是必要的，哪些是重要的，是需求开发的主要部分，这只能由客户负责设定需求优先级，因为开发者不可能按照客户的观点决定需求优先级；开发人员将为您确定优先级提供有关每个需求的花费和风险的信息。 </p>
                        <p>在时间和资源限制下，关于所需特性能否完成或完成多少应尊重开发人员的意见。尽管没有人愿意看到自己所希望的需求在项目中未被实现，但毕竟是要面对现实，业务决策有时不得不依据优先级来缩小项目范围或延长工期，或增加资源，或在质量上寻找折衷。 </p>
                        <p>17、 评审需求文档和原型 </p>
                        <p>客户评审需求文档，是给分析人员带来反馈信息的一个机会。如果客户认为编写的&#8220;需求分析报告&#8221;不够准确，就有必要尽早告知分析人员并为改进提供建议。 </p>
                        <p>更好的办法是先为产品开发一个原型。这样客户就能提供更有价值的反馈信息给开发人员，使他们更好地理解您的需求；原型并非是一个实际应用产品，但开发人员能将其转化、扩充成功能齐全的系统。 </p>
                        <p>18、 需求变更要立即联系 </p>
                        <p>不断的需求变更，会给在预定计划内完成的质量产品带来严重的不利影响。变更是不可避免的，但在开发周期中，变更越在晚期出现，其影响越大；变更不仅会导致代价极高的返工，而且工期将被延误，特别是在大体结构已完成后又需要增加新特性时。所以，一旦客户发现需要变更需求时，请立即通知分析人员。 </p>
                        <p>19、 遵照开发小组处理需求变更的过程 </p>
                        <p>为将变更带来的负面影响减少到最低限度，所有参与者必须遵照项目变更控制过程。这要求不放弃所有提出的变更，对每项要求的变更进行分析、综合考虑，最后做出合适的决策，以确定应将哪些变更引入项目中。 </p>
                        <p>20、 尊重开发人员采用的需求分析过程 </p>
                        <p>软件开发中最具挑战性的莫过于收集需求并确定其正确性，分析人员采用的方法有其合理性。也许客户认为收集需求的过程不太划算，但请相信花在需求开发上的时间是非常有价值的；如果您理解并支持分析人员为收集、编写需求文档和确保其质量所采用的技术，那么整个过程将会更为顺利。 </p>
                        <p><strong>&#8220;需求确认&#8221;意味着什么 </strong></p>
                        <p>在&#8220;需求分析报告&#8221;上签字确认，通常被认为是客户同意需求分析的标志行为，然而实际操作中，客户往往把&#8220;签字&#8221;看作是毫无意义的事情。&#8220;他们要我在需求文档的最后一行下面签名，于是我就签了，否则这些开发人员不开始编码。&#8221; </p>
                        <p>这种态度将带来麻烦，譬如客户想更改需求或对产品不满时就会说：&#8220;不错，我是在需求分析报告上签了字，但我并没有时间去读完所有的内容，我是相信你们的，是你们非让我签字的。&#8221; </p>
                        <p>同样问题也会发生在仅把&#8220;签字确认&#8221;看作是完成任务的分析人员身上，一旦有需求变更出现，他便指着&#8220;需求分析报告&#8221;说：&#8220;您已经在需求上签字了，所以这些就是我们所开发的，如果您想要别的什么，您应早些告诉我们。&#8221; </p>
                        <p>这两种态度都是不对的。因为不可能在项目的早期就了解所有的需求，而且毫无疑问地需求将会出现变更，在&#8220;需求分析报告&#8221;上签字确认是终止需求分析过程的正确方法，所以我们必须明白签字意味着什么。 </p>
                        <p>对&#8220;需求分析报告&#8221;的签名是建立在一个需求协议的基线上，因此我们对签名应该这样理解：&#8220;我同意这份需求文档表述了我们对项目软件需求的了解，进一步的变更可在此基线上通过项目定义的变更过程来进行。我知道变更可能会使我们重新协商成本、资源和项目阶段任务等事宜。&#8221;对需求分析达成一定的共识会使双方易于忍受将来的摩擦，这些摩擦来源于项目的改进和需求的误差或市场和业务的新要求等。 </p>
                        <p>需求确认将迷雾拨散，显现需求的真面目，给初步的需求开发工作画上了双方都明确的句号，并有助于形成一个持续良好的客户与开发人员的关系，为项目的成功奠定了坚实的基础。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/yifeng/aggbug/241776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-11-21 00:37 <a href="http://www.blogjava.net/yifeng/archive/2008/11/21/241776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何提高一个IT团队的执行力</title><link>http://www.blogjava.net/yifeng/archive/2008/11/20/241522.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Wed, 19 Nov 2008 16:46:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/11/20/241522.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/241522.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/11/20/241522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/241522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/241522.html</trackback:ping><description><![CDATA[<p>一提到执行，就感到笔端很沉重，不知道从何说起。执行它本身不仅是一门丰富的学问，而且还是一整套非常具体的行为和艺术，于个人、于集体、于企业、于国家，都概莫能外，无论你有多么伟大的理想，也无论你有多么先进的管理理念，如果不去奋斗，不去执行，最终都只能是贴在墙上，自我陶醉而已。作为IT团队，它的执行力也同等重要，如果没有超强的执行力，项目不能按时完成，产品不能按时上市，即使勉强发布，也是bug横飞，投诉不断，SP1、SP2&#8230;&#8230;SPn，顺着杆不停地往上爬。 <br />
如何提高一个IT团队的执行力呢？可能每个人都有不同的办法，有不同的实践经验，我在此仅扔出一块砖头，希望能与大家讨论。</p>
<p><strong>第一、是了解和熟悉。</strong></p>
<p>熟悉团队的每一个人，每一件事。每一个人都有他自已的长处和短处，每一个人都有他对当前工作的看法和理解，每个人也都有他不同的办事风格，每一个人也都有他对团队的期望，一个团队负责人如果对这些都不了解、不熟悉，我们就不可能人尽其才，才尽其用。而团队成员的期望值，可能是一个很敏感的东西，很多成员不愿意表白，很多领导也不愿意去面对，或者是不愿主动去与员工进行深层次的交流，认为一提到职员的期望值，可能就会是升职加薪的要求，这让他难于面对。其实，员工的期望值也不并不是那么单一，有的人希望能学到更多的东西，能得到更大的提高；有的人希望有一个和谐的团队氛围，每天能快乐的工作；有的人希望自已的意见能得到重视，自已的工作成果能得到领导的肯定；有的人希望升职加薪等等。如果你不去面对，不去了解，也并不等于员工就不想，员工他毕竟是你的下级，当然不好意思直接地与你提出来，但是到某一天，突然收到他的辞职信，几年辛勤培养，换来的是谢谢你某某领导，谢谢你几年对我的培养，心中是不是会感到一丝遗憾？如果我们经常与员工进行交流与沟通，在他们心理状态发生波动时，及时疏通，及时引导，可能就能解决很大的问题，不至于因为闹情绪而影响工作的执行，影响项目的进度。</p>
<p>了解了人还不够，了解团队的每一件事，也同样重要。只有充分了解整个事件，你才知道事情的难易程度，也才能安排合适的人选，制定合适的计划，员工也才能感觉到你对他们做的事情的重视。他苦了、累了，你都很清楚，而不是高高在上，不分清红皂白，脑袋一拍：&#8220;这件事你明天必须出来&#8221;，&#8220;天啦，这可是一个大需求啊，加班到天亮，也完不成啊&#8221;，这样几次下来，我想他离开这个团队也就不远了。</p>
<p>了解了人，也了解事，项目的重点在哪，难点在哪，哪些功能应该集中优势兵力重点攻克，我们都做到心中有数了，整个项目的进度也就得到了充分的保证，这正如著名的&#8220;木桶理论&#8221;，一个桶能装多少水，不是看哪块板最长，而是看哪块木板最短，我们只有把最短的木板加长，才能装水更多。</p>
<p><strong>第二、团队文化。</strong></p>
<p>企业有企业的文化，团队也有团队的文化，团队文化的培养、形成，也是团队执行力提高的重要因素。作为IT团队的执行文化，我想应该从以下几个方面来谈：</p>
<p>1、严格的、可执行性很强的规范规章。从需求调研、需求分析、系统架构、详细设计、程序开发、系统测试到最后的实施，都应该有明确的规范，不能因个人的习惯，个人的爱好而任意改变或者删减，只有有了明确的规范，大家才有执行的标准，检查的标准，也才有最终考核的标准，也只有这样，整个项目才可能是一个整体，整个系统也才能是一个风格。可是在实际操作中，情况却并不理想，很多程序员或许都这样抱怨过：&#8220;修改别人的程序，真是一种痛苦&#8221;。为什么痛苦呢？不用说大家也知道：注释不明确，结构不清楚，编码不规范。更有甚者，软件做出来了，一眼就可以看出来，这一块功能是一个人做的，那一块功能是另一个人做的，完全不同的几种风格拼接在一起。规范不仅要有，可执行性也非常重要。每个团队可能都知道规范很重要，也都有自已的规范，但是它的可操作性不强，职员执行起来很痛苦，一天到晚修改规范，其实这也就是没有规范了。</p>
<p>2、明确的奖惩措施。一个项目结束，都应该有一个详细的、全面的、全员参与的项目总结，把项目进展过程中表现出来的先进技术、先进事迹、先进人物，重点提出来，加以表扬与奖励；对表现出来的问题，也要一针见血地提出来，找出问题的根源，总结经验教训，对于事故责任人，要严厉批评，并给予惩罚。这一点，在IT团队中执行起来可能有些困难，前面看到过一篇文章＜＜尴尬的项目经理＞＞，意思是说，现在很多公司都实行矩阵式管理，项目经理，部门经理双重领导，项目经理负责计划的安排、项目实施，而部门经理负责职业规划、绩效考核，这可就是一对矛盾了，项目经理只有安排任务，检查任务的权力，没有考核、奖惩的权力，所以问题就出来了：事情做得好不如关系混得好，事情做得好与不好，部门经理都不清楚，对他的考核不会有太大的影响，而且部门经理还会经常运用他的权力，在各个项目间搞平衡。日子久了，大家的工作积极性自然而然就下去了。所以要想提高团队的执行力，解决这种尴尬的处境也刻不容缓啊。</p>
<p>3、和谐的团队氛围。工作并快乐着，这是每一个人的向往。一个团队如果上下左右的关系都很融洽、和睦，就象一个大家庭一样，一起工作，一起休息、一起生活，这个团队一定是一个和谐的团队，一定是一个凝聚力，战斗力很强的团队。这一点，领导的影响非常重要，你的言行，你的态度就是一个团队的催化剂，催化好了，团队就更有激情、更有活力，亲活力也更强，如果催化得不好，也可就能被闷死在里面。有时多一点笑容，多一点鼓励、多一点与员工相处交流的时间，团队的氛围就自然会发生很多的变化。</p>
<p>4、要建立一个学习型团队。联想总裁柳传志先生说，要提高一个团队执行力，首先要让战士爱打仗，要用各种方法调动员工的积极性。其次，要让战士会打仗，要通过持续的练兵提高员工的综合素质和专业素质。最后是决策者训练队伍的作战有序性。由此可见，团队的学习是多么重要，尤其是IT人。如今IT技术日新月异，如果一个团队不提供学习的机会，团队成员没有学习的习惯，这个团队也可能就是傍晚的太阳，即使还有一丝美丽，也将缓缓坠落。</p>
<p><strong>第三、就是要有良好的组织协调能力。</strong></p>
<p>现在的社会是一个英雄倍出的时代，我们颂扬英雄、赞美英雄，但是绝不提倡个人英雄主义。一个团队是一项集体运动，就象是一场足球比赛似的，球星，他可以做为一个精神领袖，领导大家有组织、有秩序地进行比赛，以争取最后的胜利，但是仅靠他一个人，哪怕他有天大的本事，也是不能完成比赛的。国际上不是经常组织一些明星赛吗，抽集世界上最好的球星组成一队，去与一些国家队或者俱乐部队进行比赛，结果呢，往往是后者获胜，为什么？明星队，他们是临队搭建起来的一个团队，彼此不熟悉、不了解，也就谈不上默契，配合起来很生疏，尽管技术很优秀，却难于取得最后的胜利。我们的团队也是如此，希望大家都成英雄，希望大家都成明星，但更希望有一个好的教练，让这些明星各司其职，各负其责，我们就是一个执行力超强的团队了，你看看微软、google，他们不就是如此吗？</p>
<p>团队执行力的影响因素，其实还有很多很多，我也就不再罗嗦了，当我们的项目不能如期完成，产品不能如期面市的时候，不要太埋怨需求变化太快，也不要太埋怨周期太短，变是正常的，有变才有进步，我们要多想想我们团队的战斗力，执行力如何，要怎样才能提高一个团队的执行力。 </p>
<!--content End-->
<img src ="http://www.blogjava.net/yifeng/aggbug/241522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-11-20 00:46 <a href="http://www.blogjava.net/yifeng/archive/2008/11/20/241522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做人、做事，做架构师——架构师能力模型解析</title><link>http://www.blogjava.net/yifeng/archive/2008/10/18/235123.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Fri, 17 Oct 2008 19:23:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/10/18/235123.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/235123.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/10/18/235123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/235123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/235123.html</trackback:ping><description><![CDATA[<p><strong>引子</strong></p>
<p>究竟是什么让你在同一个位置上——例如程序员或技术负责人——工作了三年、五年或者更久，而仍然得不到任何的发展空间？你觉得自己已成为技术圈中的大牛，并信心满满地去拿明天就要颁发的某某大奖，然而却仍然停留在同样的技术职位上，去年到今年涨的薪水甚至填不平物价升幅？于是，你开始对老板不满，对员工不满，对昨天升职的那个同事不满&#8230;&#8230;你开始计划明天就要跑单，或者准备考虑提出加薪却又心怀忐忑。</p>
<p>如果技术人员有发展的轨迹，那么他要么&#8220;看透工具的本质，把关注点转移到&#8216;团队&#8217;的圈子里去&#8221;，要么&#8220;顺着代码铺就的道路，亦步亦趋地成为良匠大师&#8221;。仅以技术方向而言，你大概可以做到架构师、总架构师甚至首席架构师；但问题是：你现在还只是一个程序员。那要如何才能踏上通往架构师之路呢？本文为你解析一个架构师的能力模型。</p>
<p><strong>你能不能做一个好的架构师？</strong></p>
<p>架构师不是界定一个技术高下的职位名称，而是一个职务。所谓职务，包括职——职位，务——工作。前者决定了你具备哪些资源，可以影响到怎样的范围，以及面向的机构，后者则简单地是你需要完成的工作列表。</p>
<p>所以我说&#8220;架构师&#8221;不是指&#8220;一个能做架构的人&#8221;。前者是把架构师当职能，后者是当工人。能做一份工作列表中的事，并不等于就成为相应职位上的人。在管理体系里面，你的个人特性决定了你在哪个位置，而技术技能只是做事实施的必需。架构师这个职务，同时要求较高的个人素质和技术能力，因此它的进取之路总结起来就是：做人、做事，做架构师。</p>
<p>因此&#8220;模型&#8221;由&#8220;个人特性&#8221;和&#8220;技术技能&#8221;两个方面构成，在第一张图中，我特别说明&#8220;个人特性&#8221;既包括人际关系的能力，也包括（具体）业务能力；&#8220;技术技能&#8221;也是如此。所以个人特性主要与&#8220;做人&#8221;有关，部分地也包含&#8220;做事&#8221;的要素。</p>
<p><img height="375" src="http://www.uml.org.cn/zjjs/images/9294383.jpg" width="500"  alt="" /></p>
<p>图1 架构师能力模型</p>
<p>&#8220;有效沟通&#8221;以及&#8220;学会谈判&#8221;与做具体的事无关，是个人能力特性的公共方面。前者是过程，后者是知道如何定目标与求结果。而&#8220;风险与防备&#8221;是做事过程控制的关键，与前面两项正好构成了一个做事基本能力的完整体系。基本上，这三项个人特性都是一个&#8220;普通程序员&#8221;所不具备的，甚至在大多数情况下，普通程序员并不愿意去具备这样的个人特性，因为在许多陷于技术泥淖的开发人员看来：沟通总是会使事情变得更加麻烦，谈判则徒耗时间而无济于事。然而事实上，在整个的架构决策过程中，架构师需要不停地沟通与谈判。将&#8220;架构&#8221;变成&#8220;决策&#8221;的过程，其实就是对各个技术角色（及其思想）兼容并包的过程，你需要不断地协调需求、实现之间的各种问题，也需要面对各种投资者（时间、资金、人才等方面的决策者）进行谈判，以确定项目的规模——没有规模也就没有范围，没有范围如何展开设计呢？</p>
<p>一部分开发人员会认为上述过程是&#8220;项目经理&#8221;的事情，但真的如此吗？当你作为一个更高级别的架构师，以至于要影响到多个项目的决策时，你就全然不会有这种感受了。因为这种情况下，你的决策将先于项目的启动，或者说你已经不单单是一个技术角色了。</p>
<p>设计是架构能力的一部分，但架构师不是设计师——看清楚二者之间的不同，你才真正迈出了架构师职业生涯的第一步。</p>
<p><strong>抽象是思维能力、模型化是表达能力</strong></p>
<p>个人特性中另一个非常重要的方面是&#8220;抽象思维&#8221;，而这是与架构师角色直接相关的一种能力。这种能力既有职业技能特征，又是普遍性的能力。</p>
<p>所谓普遍性的能力，是指&#8220;抽象&#8221;在我们——作为人这种个体的——生活中无处不在。例如我们说花、草，说桌、椅&#8230;&#8230;我们用语言去指称任何一个既已存在的（可以脱离我们的语言而自然存在的）事物时，就用到了抽象。说&#8220;桌子&#8221;的时候，既没有描述桌子的具体形式，也没有说明它的规格，但我们用这个名词时，所有人都知道&#8220;桌子是什么&#8221;。所以，名词概念是整个抽象逻辑系统中的主体。如果失去了这些名词定义，我们基本上不能说话，也不能描述任何东西——那便到了&#8220;只可意会不可言传&#8221;的境地。</p>
<p>用现有的成熟语汇去描述你的系统时，大多数人会理解你所表达的含义，例如我们说&#8220;这个系统设计为一个三层结构&#8221;。然而架构师面临的系统在许多细节上并不见得能够用成熟的语汇去描述，因此必须自已构建一个抽象系统，这就需要概念抽象能力、概念表达能力和基于概念的逻辑表达能力。</p>
<p>概念抽象能力是一种思维能力。简单地说，就是&#8220;把目标分解或概括清楚&#8221;：你要么概而言之&#8220;它是什么&#8221;，要么详细地说明&#8220;它包括什么&#8221;。必须使用大量的语汇来陈述这个&#8220;什么&#8221;，这不单单是表达为文字，也表达为你在思想过程中的一个完整系统。通常用的方法是&#8220;映射系统&#8221;。例如你可以用数学中的&#8220;数轴&#8221;来映射&#8220;实数域&#8221;。将目标系统形式化为一个概念化的、可讨论的结构系统后，你的抽象过程就基本结束了。</p>
<p><img height="527" src="http://www.uml.org.cn/zjjs/images/9294483.jpg" width="500"  alt="" /></p>
<p>图2 能力模型中的个人特性</p>
<p>然而这个&#8220;抽象系统&#8221;可能只构建在你的思维意识里，还必须把它描绘出来。因为不能只是你自己思考清楚，系统就能设计完成。这个&#8220;描绘&#8221;就依赖于后面两种表达能力，一种是描绘概念实体，一种是描绘实体上的逻辑——有趣的是，这似乎又回到了&#8220;程序＝结构＋算法&#8221;。</p>
<p>现在大家回过头来看看UML，或者更多种类的ML（建模语言），他们就用于表达这两个方面的东西：要么是概念实体（例如用一个框表明系统边界），要么是实体上的逻辑（例如用箭头表明逻辑时序）。</p>
<p>所以大家应该清楚，我们再如何称赞UML，它也只是一种对模型化系统的&#8220;表达能力&#8221;，你只能把它当一种辅助表达的工具去使用，它本身既不能帮助思考，也不见得能作为抽象过程中的或抽象思维环境中的参考。</p>
<p>任何一个优秀的架构师都有自己独特的思考方式，这决定了他如何抽象系统，以及如何&#8220;创造性地&#8221;设计与构画这个系统。这种&#8220;独特的思考方式&#8221;贯彻他从孩童开始的整个成长过程，直至他形成独立的社会观、人生观与世界观。他认识世界的方式和接受世界的能力决定于他如何思考，也反映了他这种思考方式的&#8220;独特性&#8221;。但这并不表明他有特立独行的行为特性（我们这里只说他的思考方式），我们不应介意他是否用某种语言（例如UML或者形式化编程语言）来表达他的思考结果。</p>
<p><strong>推动：设计做大，实施做小</strong></p>
<p>架构师首先是把问题的真正目标确定下来，然后变成系统设计、平台设计或架构设计。而在此之后设计输出将会有两个方向的发展，一是被忠实地贯彻下来，二是被变形地发展下去。两个方向都存在致命的危险：架构最终能否被完整实现。对前者来说，可能是架构设计过度，或设计本身出现了错误；后者则是对架构直接的伤害。</p>
<p>所以架构师必须参与实施的全程——尤其是在架构被映射为目标系统的前期。在这个阶段中，架构师的任务就是推动架构实施，以保证在项目全程的设计／架构／体系的一致性。除了直接跟设计师或设计团队沟通，以保证他们的设计在你可以控制的范围之内以外，架构师还必须有阶段化设计的能力。这种能力用于将一个原本规模宏大的架构设计，变成较小的、易于实施的、对开发团队来说可控的关键点。例如在体系层次的规划上，设计可能是独立、异质的、可迁移的存储框架来实现数据层，但在（前期的）实施上，这里可能被表达为本地数据库，并要求前端开发人员必须通过一个清晰的数据交互层来访问——例如一组数据存取接口，或一个独立数据服务组件。开发人员可能在这里遇到障碍：因为要通过这些中间层来访问本地数据库，纯粹是多余的。然而，正是这&#8220;多余的工作&#8221;提供了系统弹性，为并行团队开发公共存储服务争取了周期，也为将来的灵活部署与数据迁移提供了可能。</p>
<p>这里的关键就在于，无论原始系统设定有多大，实施时总是在&#8220;做小&#8221;。每一个局部的实施块都是可控的，并为它在整个体系空间中留下了位置和接口，这样才可能由&#8220;小的部分&#8221;做大。一个大系统的架构师可能同时在考虑许多个项目中的、不同位置的架构，并且清楚这些项目最终的总体规模。而这，就是平台架构师和体系架构师所涉的领域。</p>
<p><img src="http://www.uml.org.cn/zjjs/images/9294485.jpg"  alt="" /></p>
<p>图3 架构师模型图中的&#8220;实现能力&#8221;</p>
<p>架构真的是&#8220;好不好&#8221;的问题吗？如同我对工程的理解一样，架构问题的根本，也并不在于它是否完美或漂亮，而是在于是否合用。因此架构师必须对实施架构的团队以及实施过程有充分了解，知道他们的能力缺陷，知道实现过程要消耗的资源，清楚每个环节可能的故障以及先兆。只有这样，架构师才能设计一个让这个团队能实现，而且在实现过程中能受控的架构。</p>
<p>要知道，你作为架构师被请来，不是画几张图纸交给项目经理，说：你们去做吧，做不出来是你们不会做。即使你可以身体力行，在这个团队中教大家、培养大家，那么公司的开销呢？风险呢？这些东西难道就不考虑了？项目的周期因为实现的复杂程度而无法控制时，项目就死掉了。那么，追根究底来说，是不是架构师的问题？是啊，你为什么会做了一份&#8220;不合用&#8221;的架构呢？——你都不知道项目如何开发、由谁实施、如何管理等等，又如何能面对这些实际环境去设计架构呢？</p>
<p>所以这一部分能力，是要在你的开发经验、团队经验以及用人识人的经验中去找的。参考模型图的&#8220;实现能力&#8221;下的&#8220;设计能力&#8594;了解你的主要沟通对象&#8221;和&#8220;架构推行&#8221;等分支，对你或有一些可用的提示。</p>
<p><strong>局部与全局</strong></p>
<p>架构是一个从全局到局部的过程，而实施正好反过来，是从局部到全局。这也正是&#8220;设计做大，实施做小&#8221;的另一个层面的含义。设计大才可以见到全局，才知道此全局对彼全局的影响；实施小才可能关注细节，才谈得上品质与控制。</p>
<p>事实上，大多数情况下架构是在为&#8220;当前项目之外&#8221;去考虑，这可以看成全局关注的一个组成部分。因此我们需要界定所谓&#8220;全局&#8221;的范围：超出公司或整个产品系列、产品线或规划的范围才是多余的。</p>
<p>所以当架构决策谈及&#8220;全局&#8221;时，其目标并不见得是&#8220;保障当前项目&#8221;，而又必须由当前项目去完成。</p>
<p>一个经常被用到的例子是：如果仅为当前项目考虑，那么只需要做成DLL模块；如果为产品线考虑，可能会是&#8220;管道＋插件&#8221;的结构形式。而&#8220;管道＋插件&#8221;的形式显然比做成DLL模块更费时，这个时间成本（以及其它成本）就变成了当前项目的无谓开销。</p>
<p>这种全局策略对局部计划的影响是大多数公司不能忍受的，也被很多团队所垢病。然而这却是架构师角色对体系的&#8220;近乎必然&#8221;的影响——如果你试图在体系中引用架构师这个角色的话。一些情况下，体系能够容纳这种影响，例如&#8220;技术架构师&#8221;试图推动某种插件框架，而正好开发人员对这项技术感兴趣，那就顺其自然地花点工夫去实现了。但如果不是这样，实施者或实施团队看不到&#8220;多余的部分&#8221;对他们的价值时，来自局部的抵触就产生了。</p>
<p>这种情况下，平衡这些抵触就成了架构推行的实务之一。在我看来，&#8220;平衡&#8221;是全局的艺术和局部的技术。也就是说，一方面架构师要学会游说，另一方面也要寻求更为简洁的、成本更小的实现技术。只有当整个体系都意识到（你所推行的）架构的重要性，而且实施成本在他们可以接受的范围之内时，他们才会积极行动起来。</p>
<p>所以所谓平衡，其实也是折衷的过程。构架师只有眼中见大，才知道哪些折衷可以做，而哪些不能。所谓设计评估（模型图中的实现能力-&gt;设计能力-&gt;设计评估分支）并不是去分析一个设计结果好或不好，而是从中看到原始的需求，看到体系全局的意图，然后知道在将设计变得更为&#8220;适当&#8221;时可以做哪些折衷。同样的原因，架构师也必须知道自己的决策会产生的影响，才能控制它们，以防它们变成团队的灾难。有些时候，架构师甚至需要抛弃一些特性，以使得项目能够持续下去。因为产品的阶段性产出只是整个战略中的一个环节，而不是全部。</p>
<p><strong>其它</strong></p>
<p>&#8220;怎么做一个架构师&#8221;这个问题得分成两个部分来看，一个是&#8220;做到&#8221;，一个是&#8220;做好&#8221;。由于架构师本身不过是一个技术职位，所以时机成熟了自然会做得到。但问题是，真有一天你被放在这个位置上了，你能做得好吗？</p>
<p>我浏览过几套所谓培训机构的有关架构师的教程，也翻阅过一些讲架构的书。我发现他们普遍地是将架构作为一种&#8220;职业技术&#8221;来讲，就像培养程序员或者缝纫工一样来教育。但就我的经验来说，架构并不是一件纯粹表现技术能力的工作，所以并不是翻几本书学几种方法就可以投入&#8220;实战&#8221;的。更深层的问题是，架构师其实不是&#8220;战&#8221;出来的。昨天跟同事讨论这个话题，他把我们这几年来的一些思考用了三句话来概括，非常精彩：从无到有的，是架构；从表到里的，是抽象；从粗到细的，是设计。</p>
<p>那么到底什么是架构呢？从上面的概括中你是看不到答案的。到底如何做架构呢？从本文中你也是看不到答案的。然而我说，&#8220;你看不到答案&#8221;的根源其实是在于你的眼光与心性——后面这个词换成现代白话，就是&#8220;思想&#8221;。真正阻碍了你成为优秀架构师的，也许正是你既有的知识与思想方法，扔掉它们，接受一些全然有别的信息，也许正是良好的开端。</p>
<p>或许你现在正愤愤然：这篇文章怎么空洞无物？——我甚至能想象到一些读者的表情。然而请在问题面前停下来，不要急于给出答案。正如你将&#8220;?&#8221;稍微变下形，它就成为了&#8220;!&#8221;一样，问题的本身，就是答案。</p>
<img src ="http://www.blogjava.net/yifeng/aggbug/235123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-10-18 03:23 <a href="http://www.blogjava.net/yifeng/archive/2008/10/18/235123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是需求分析</title><link>http://www.blogjava.net/yifeng/archive/2008/10/07/232794.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Mon, 06 Oct 2008 17:25:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/10/07/232794.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/232794.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/10/07/232794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/232794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/232794.html</trackback:ping><description><![CDATA[<p>需求分析是指理解用户需求，就软件功能与客户达成一致，估计软件风险和评估项目代价，最终形成开发计划的一个复杂过程。（这个和我在微软体验到的又不太一样，微软的需求分析大多是市场人员和用户协助小组的人去评估用户的接受程度，这一点也可以理解，因为公司的性质有根本差别）在这个过程中，用户的确是处在主导地位，需求分析工程师和项目经理要负责整理用户需求，为之后的软件设计打下基础。需求分析阶段结束后，要求得到：1.SRS文档(System Requirement Specification); 2.DRM 文档；3.Acceptance Plan.</p>
<p>从广义上理解：需求分析包括需求的获取、分析、规格说明、变更、验证、管理的一系列需求工程。</p>
<p><img height="202" src="http://www.uml.org.cn/RequirementProject/images/200861385147797.jpg" width="574"  alt="" /></p>
<p>狭义上理解：需求分析指需求的分析、定义过程。</p>
<p><strong>一、为什么要需求分析</strong></p>
<p>需求分析就是分析软件用户的需求是什么.如果投入大量的人力，物力,财力,时间,开发出的软件却没人要,那所有的投入都是徒劳.如果费了很大的精力,开发一个软件,最后却不满足用户的要求,从而要重新开发过,这种返工是让人痛心疾首的.(相信大家都有体会)比如,用户需要一个for linux的软件,而你在软件开发前期忽略了软件的运行环境,忘了向用户询问这个问题,而想当然的认为是开发for windows的软件,当你千辛万苦地开发完成向用户提交时才发现出了问题,那时候你是欲哭无泪了,痕不得找块豆腐一头撞死.</p>
<p>需求分析之所以重要,就因为他具有决策性,方向性,策略性的作用,他在软件开发的过程中具有举足轻重的地位.大家一定要对需求分析具有足够的重视.在一个大型软件系统的开发中,他的作用要远远大于程序设计.</p>
<p><strong>二、需求分析的任务</strong></p>
<p>简言之,需求分析的任务就是解决"做什么"的问题,就是要全面地理解用户的各项要求,并准确地表达所接受的用户需求.</p>
<p><strong>三、需求分析的过程</strong></p>
<p>需求分析阶段的工作,可以分为四个方面:问题识别,分析与综合,制订规格说明,评审.</p>
<p>问题识别</p>
<p>就是从系统角度来理解软件,确定对所开发系统的综合要求,并提出这些需求的实现条件,以及需求应该达到的标准.这些需求包括：功能需求(做什么),性能需求(要达到什么指标),环境需求(如机型,操作系统等),可靠性需求(不发生故障的概率）,安全保密需求,用户界面需求,资源使用需求(软件运行是所需的内存,CPU等),软件成本消耗与开发进度需求,预先估计以后系统可能达到的目标.</p>
<p>分析与综合</p>
<p>逐步细化所有的软件功能,找出系统各元素间的联系,接口特性和设计上的限制,分析他们是否满足需求,剔除不合理部分,增加需要部分.最后,综合成系统的解决方案,给出要开发的系统的详细逻辑模型(做什么的模型).</p>
<p>制订规格说明书</p>
<p>即编制文档,描述需求的文档称为软件需求规格说明书.请注意,需求分析阶段的成果是需求规格说明书(好象软考曾经考过这个问题),向下一阶段提交.</p>
<p>评审</p>
<p>对功能的正确性,完整性和清晰性,以及其它需求给予评价.评审通过才可进行下一阶段的工作,否则重新进行需求分析。</p>
<p><strong>四、需求分析的方法</strong></p>
<p>需求分析的方法有很多.这里只强调原型化方法,其它的方法如:结构化方法,动态分析法等(个人认为,对初学者不必深究这些方法,实际上我也从来没用过这些方法)在此不讨论.</p>
<p>原型化方法是十分重要的(是软考等常考的知识点).原型就是软件的一个早期可运行的版本,它实现了目标系统的某些或全部功能.</p>
<p>原型化方法就是尽可能快地建造一个粗糙的系统,这系统实现了目标系统的某些或全部功能,但是这个系统可能在可靠性,界面的友好性或其他方面上存在缺陷.建造这样一个系统的目的是为了考察某一方面的可行性,如算法的可行性,技术的可行性,或考察是否满足用户的需求等.如,为了考察是否满足用户的要求,可以用某些软件工具快速的建造一个原型系统,这个系统只是一个界面,然后听取用户的意见,改进这个原型.以后的目标系统就在原型系统的基础上开发.</p>
<p>原型主要有三种类型(软考考过):探索型,实验型,进化型.探索型:目的是要弄清楚对目标系统的要求,确定所希望的特性,并探讨多种方案的可行性.实验型:用于大规模开发和实现前,考核方案是否合适,规格说明是否可靠.进化型:目的不在于改进规格说明,而是将系统建造得易于变化,在改进原型的过程中,逐步将原型进化成最终系统。</p>
<p>在使用原型化方法是有两种不同的策略:废弃策略,追加策略.废弃策略:先建造一个功能简单而且质量要求不高的模型系统，针对这个系统反复进行修改,形成比较好的思想,据此设计出较完整,准确,一致,可靠的最终系统.系统构造完成后,原来的模型系统就被废弃不用.探索型和实验型属于这种策略。</p>
<p>追加策略:先构造一个功能简单而且质量要求不高的模型系统，作为最终系统的核心,然后通过不断地扩充修改,逐步追加新要求，发展成为最终系统。进化型属于这种策略.</p>
<p><strong>五、需求分析的20条法则</strong></p>
<p>客户与开发人员交流需要好的方法。下面建议20条法则，客户和开发人员可以通过评审以下内容并达成共识。如果遇到分歧，将通过协商达成对各自义务的相互理解，以便减少以后的磨擦（如一方要求而另一方不愿意或不能够满足要求）。 </p>
<p>1、 分析人员要使用符合客户语言习惯的表达 　　</p>
<p>需求讨论集中于业务需求和任务，因此要使用术语。客户应将有关术语（例如：采价、印花商品等采购术语）教给分析人员，而客户不一定要懂得计算机行业的术语。 </p>
<p>2、分析人员要了解客户的业务及目标 　　</p>
<p>只有分析人员更好地了解客户的业务，才能使产品更好地满足需要。这将有助于开发人员设计出真正满足客户需要并达到期望的优秀软件。为帮助开发和分析人员，客户可以考虑邀请他们观察自己的工作流程。如果是切换新系统，那么开发和分析人员应使用一下目前的旧系统，有利于他们明白目前系统是怎样工作的，其流程情况以及可供改进之处。</p>
<p>3、 分析人员必须编写软件需求报告 　　</p>
<p>分析人员应将从客户那里获得的所有信息进行整理，以区分业务需求及规范、功能需求、质量目标、解决方法和其他信息。通过这些分析，客户就能得到一份&#8220;需求分析报告&#8221;，此份报告使开发人员和客户之间针对要开发的产品内容达成协议。报告应以一种客户认为易于翻阅和理解的方式组织编写。客户要评审此报告，以确保报告内容准确完整地表达其需求。一份高质量的&#8220;需求分析报告&#8221;有助于开发人员开发出真正需要的产品。 </p>
<p>4、 要求得到需求工作结果的解释说明 　　</p>
<p>分析人员可能采用了多种图表作为文字性&#8220;需求分析报告&#8221;的补充说明，因为工作图表能很清晰地描述出系统行为的某些方面，所以报告中各种图表有着极高的价值；虽然它们不太难于理解，但是客户可能对此并不熟悉，因此客户可以要求分析人员解释说明每个图表的作用、符号的意义和需求开发工作的结果，以及怎样检查图表有无错误及不一致等。 </p>
<p>5、 开发人员要尊重客户的意见 　</p>
<p>如果用户与开发人员之间不能相互理解，那关于需求的讨论将会有障碍。共同合作能使大家&#8220;兼听则明&#8221;。参与需求开发过程的客户有权要求开发人员尊重他们并珍惜他们为项目成功所付出的时间，同样，客户也应对开发人员为项目成功这一共同目标所做出的努力表示尊重。 </p>
<p>6、 开发人员要对需求及产品实施提出建议和解决方案 　</p>
<p>通常客户所说的&#8220;需求&#8221;已经是一种实际可行的实施方案，分析人员应尽力从这些解决方法中了解真正的业务需求，同时还应找出已有系统与当前业务不符之处，以确保产品不会无效或低效；在彻底弄清业务领域内的事情后，分析人员就能提出相当好的改进方法，有经验且有创造力的分析人员还能提出增加一些用户没有发现的很有价值的系统特性。 </p>
<p>7、 描述产品使用特性 　　</p>
<p>客户可以要求分析人员在实现功能需求的同时还注意软件的易用性，因为这些易用特性或质量属性能使客户更准确、高效地完成任务。例如：客户有时要求产品要&#8220;界面友好&#8221;或&#8220;健壮&#8221;或&#8220;高效率&#8221;，但对于开发人员来讲，太主观了并无实用价值。正确的做法是，分析人员通过询问和调查了解客户所要的&#8220;友好、健壮、高效所包含的具体特性，具体分析哪些特性对哪些特性有负面影响，在性能代价和所提出解决方案的预期利益之间做出权衡，以确保做出合理的取舍。 </p>
<p>8、 允许重用已有的软件组件 　</p>
<p>需求通常有一定灵活性，分析人员可能发现已有的某个软件组件与客户描述的需求很相符，在这种情况下，分析人员应提供一些修改需求的选择以便开发人员能够降低新系统的开发成本和节省时间，而不必严格按原有的需求说明开发。所以说，如果想在产品中使用一些已有的商业常用组件，而它们并不完全适合您所需的特性，这时一定程度上的需求灵活性就显得极为重要了。 </p>
<p>9、 要求对变更的代价提供真实可靠的评估</p>
<p>有时，人们面临更好、也更昂贵的方案时，会做出不同的选择。而这时，对需求变更的影响进行评估从而对业务决策提供帮助，是十分必要的。所以，客户有权利要求开发人员通过分析给出一个真实可信的评估，包括影响、成本和得失等。开发人员不能由于不想实施变更而随意夸大评估成本。 </p>
<p>10、 获得满足客户功能和质量要求的系统 　</p>
<p>每个人都希望项目成功，但这不仅要求客户要清晰地告知开发人员关于系统&#8220;做什么&#8221;所需的所有信息，而且还要求开发人员能通过交流了解清楚取舍与限制，一定要明确说明您的假设和潜在的期望，否则，开发人员开发出的产品很可能无法让您满意。 </p>
<p>11、 给分析人员讲解您的业务 　　</p>
<p>分析人员要依靠客户讲解业务概念及术语，但客户不能指望分析人员会成为该领域的专家，而只能让他们明白您的问题和目标；不要期望分析人员能把握客户业务的细微潜在之处，他们可能不知道那些对于客户来说理所当然的&#8220;常识&#8221;。 </p>
<p>12、 抽出时间清楚地说明并完善需求 </p>
<p>客户很忙，但无论如何客户有必要抽出时间参与&#8220;头脑高峰会议&#8221;的讨论，接受采访或其他获取需求的活动。有些分析人员可能先明白了您的观点，而过后发现还需要您的讲解，这时请耐心对待一些需求和需求的精化工作过程中的反复，因为它是人们交流中很自然的现象，何况这对软件产品的成功极为重要。 </p>
<p>13、 准确而详细地说明需求 　</p>
<p>编写一份清晰、准确的需求文档是很困难的。由于处理细节问题不但烦人而且耗时，因此很容易留下模糊不清的需求。但是在开发过程中，必须解决这种模糊性和不准确性，而客户恰恰是为解决这些问题作出决定的最佳人选，否则，就只好靠开发人员去正确猜测了。 </p>
<p>在需求分析中暂时加上&#8220;待定&#8221;标志是个方法。用该标志可指明哪些是需要进一步讨论、分析或增加信息的地方，有时也可能因为某个特殊需求难以解决或没有人愿意处理它而标注上&#8220;待定&#8221;。客户要尽量将每项需求的内容都阐述清楚，以便分析人员能准确地将它们写进&#8220;软件需求报告&#8221;中去。如果客户一时不能准确表达，通常就要求用原型技术，通过原型开发，客户可以同开发人员一起反复修改，不断完善需求定义。 </p>
<p>14、 及时作出决定 　　</p>
<p>分析人员会要求客户作出一些选择和决定，这些决定包括来自多个用户提出的处理方法或在质量特性冲突和信息准确度中选择折衷方案等。有权作出决定的客户必须积极地对待这一切，尽快做处理，做决定，因为开发人员通常只有等客户做出决定才能行动，而这种等待会延误项目的进展。 </p>
<p>15、 尊重开发人员的需求可行性及成本评估 　</p>
<p>所有的软件功能都有其成本。客户所希望的某些产品特性可能在技术上行不通，或者实现它要付出极高的代价，而某些需求试图达到在操作环境中不可能达到的性能，或试图得到一些根本得不到的数据。开发人员会对此作出负面的评价，客户应该尊重他们的意见。 </p>
<p>16、 划分需求的优先级 　　</p>
<p>绝大多数项目没有足够的时间或资源实现功能性的每个细节。决定哪些特性是必要的，哪些是重要的，是需求开发的主要部分，这只能由客户负责设定需求优先级，因为开发者不可能按照客户的观点决定需求优先级；开发人员将为您确定优先级提供有关每个需求的花费和风险的信息。 　　</p>
<p>在时间和资源限制下，关于所需特性能否完成或完成多少应尊重开发人员的意见。尽管没有人愿意看到自己所希望的需求在项目中未被实现，但毕竟是要面对现实，业务决策有时不得不依据优先级来缩小项目范围或延长工期，或增加资源，或在质量上寻找折衷。 </p>
<p>17、 评审需求文档和原型 </p>
<p>客户评审需求文档，是给分析人员带来反馈信息的一个机会。如果客户认为编写的&#8220;需求分析报告&#8221;不够准确，就有必要尽早告知分析人员并为改进提供建议。更好的办法是先为产品开发一个原型。这样客户就能提供更有价值的反馈信息给开发人员，使他们更好地理解您的需求；原型并非是一个实际应用产品，但开发人员能将其转化、扩充成功能齐全的系统。 </p>
<p>18、 需求变更要立即联系 　　</p>
<p>不断的需求变更，会给在预定计划内完成的质量产品带来严重的不利影响。变更是不可避免的，但在开发周期中，变更越在晚期出现，其影响越大；变更不仅会导致代价极高的返工，而且工期将被延误，特别是在大体结构已完成后又需要增加新特性时。所以，一旦客户发现需要变更需求时，请立即通知分析人员。 </p>
<p>19、 遵照开发小组处理需求变更的过程 　</p>
<p>为将变更带来的负面影响减少到最低限度，所有参与者必须遵照项目变更控制过程。这要求不放弃所有提出的变更，对每项要求的变更进行分析、综合考虑，最后做出合适的决策，以确定应将哪些变更引入项目中。</p>
<p>20、 尊重开发人员采用的需求分析过程 　</p>
<p>软件开发中最具挑战性的莫过于收集需求并确定其正确性，分析人员采用的方法有其合理性。也许客户认为收集需求的过程不太划算，但请相信花在需求开发上的时间是非常有价值的；如果您理解并支持分析人员为收集、编写需求文档和确保其质量所采用的技术，那么整个过程将会更为顺利。 </p>
<p>&#8220;需求确认&#8221;意味着什么 　　</p>
<p>在&#8220;需求分析报告&#8221;上签字确认，通常被认为是客户同意需求分析的标志行为，然而实际操作中，客户往往把&#8220;签字&#8221;看作是毫无意义的事情。&#8220;他们要我在需求文档的最后一行下面签名，于是我就签了，否则这些开发人员不开始编码。&#8221; 　　</p>
<p>这种态度将带来麻烦，譬如客户想更改需求或对产品不满时就会说：&#8220;不错，我是在需求分析报告上签了字，但我并没有时间去读完所有的内容，我是相信你们的，是你们非让我签字的。&#8221; 　　</p>
<p>同样问题也会发生在仅把&#8220;签字确认&#8221;看作是完成任务的分析人员身上，一旦有需求变更出现，他便指着&#8220;需求分析报告&#8221;说：&#8220;您已经在需求上签字了，所以这些就是我们所开发的，如果您想要别的什么，您应早些告诉我们。&#8221; 　　</p>
<p>这两种态度都是不对的。因为不可能在项目的早期就了解所有的需求，而且毫无疑问地需求将会出现变更，在&#8220;需求分析报告&#8221;上签字确认是终止需求分析过程的正确方法，所以我们必须明白签字意味着什么。 </p>
<p>对&#8220;需求分析报告&#8221;的签名是建立在一个需求协议的基线上，因此我们对签名应该这样理解：&#8220;我同意这份需求文档表述了我们对项目软件需求的了解，进一步的变更可在此基线上通过项目定义的变更过程来进行。我知道变更可能会使我们重新协商成本、资源和项目阶段任务等事宜。&#8221;对需求分析达成一定的共识会使双方易于忍受将来的摩擦，这些摩擦来源于项目的改进和需求的误差或市场和业务的新要求等。 　　需求确认将迷雾拨散，显现需求的真面目，给初步的需求开发工作画上了双方都明确的句号，并有助于形成一个持续良好的客户与开发人员的关系，为项目的成功奠定了坚实的基础。 </p>
<p><strong>六、点评需求分析误区</strong></p>
<p>要想说什么是好的需求分析，不如说什么是不好的需求分析，知道什么是不好的，自然也就知道了什么是好的。以下就是一些不好的情况：</p>
<p>（1）创意和求实</p>
<p>毋庸质疑的，每个人都会为自己的一个新的IDEａ而激动万分，特别是当这个Ｉｄｅａ受到一些根本不知道你原本要干嘛的人的惊赞时。但是请注意，当你激动得意的时候，你可能已经忘了你原本是在描述一个需求，而不是在策划一个创意、创造一个概念。很多刚开始做需求分析的人员都或多或少的会犯这样的错误，陶醉在自己的新想法和新思路中，却违背了需求的原始客观性和真实性原则。</p>
<p>永远别忘了：需求不是空中楼阁，是实实在在的一砖一瓦。</p>
<p>（2）解剖的快感</p>
<p>几乎所有搞软件的人，做需求分析的时候，一上来就会把用户告诉你的要求，完完整整的作个解剖，切开分成几个块，再细分成几个子块，然后再条分缕析。可是当用户迷惑的看着你辛辛苦苦做出来的分析结果问你：我想作一个数据备份的任务，怎么做？这时，你会发现，需要先后打开三个窗口才能完成这个任务。</p>
<p>永远别忘了：分解是必需的，但最终的目的是为了更好的组合，而不是为了分解。</p>
<p>（3）角度和思维</p>
<p>经常听到这样的抱怨：&#8220;用户怎么可以提出这样苛刻的要求呢？&#8221;。细细一了解，你会发现，用户只不过是要求把一个需要两次点击的功能，改成只有一次点击。这样会导致需要改变需求、改变编码、甚至重新测试，增加工作量。可是，如果换个角度来想想，这个功能，开发的时候只用了几次、几十次，可是用户每天都要用几百次甚 至几千次几万次，改动一下就减少了一半的工作量，对他来说，这样的需求难道会苛刻吗？</p>
<p>永远别忘了：没有任何需求是不对的，不对的只是你的需求分析。试着站在用户的思维角度想想，你的需求分析就会更加的贴近用户，更加的合理。软件应该是以人为本的。</p>
<p>（4）程序员逻辑</p>
<p>从程序员成长为系统分析员是一个普遍的轨迹，但并不是一个好的程序员就必然能成为一个好的系统分析员。一些程序员的固化逻辑，使得他们在做需求分析的时候往往钻进了一些牛角里面。比如说１／０逻辑（或者是说黑白逻辑），认为不是这样就是那样，没有第三种情况。可实际情况往往是，在一定的时候是这样，其它时候是那样。又比如穷举逻辑，喜欢上来就把所有一二三可能的情况列举出来，然后一个一个分别处理，每个占用三分之一的时间；可是实际的情况往往是，三分之一的情况占了99%的比例，其它两种情况一年都不会遇到一次。实际中还有很多这样的例子，不一一列举了。</p>
<p>永远别忘了：需求分析和程序设计不尽相同，合理、可行是才是重要的。跳出程序设计的圈子，站在系统的角度上来看问题，你的结论会截然不同</p>
<img src ="http://www.blogjava.net/yifeng/aggbug/232794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-10-07 01:25 <a href="http://www.blogjava.net/yifeng/archive/2008/10/07/232794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>统一建模语言UML轻松入门之基本概念</title><link>http://www.blogjava.net/yifeng/archive/2008/09/06/227452.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Sat, 06 Sep 2008 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/09/06/227452.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/227452.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/09/06/227452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/227452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/227452.html</trackback:ping><description><![CDATA[<div id="contitle">
<h1 id="artibodyTitle">统一建模语言UML轻松入门之基本概念</h1>
</div>
<div id="conauthor"><span>2006-06-10 07:00 </span><span>作者： 宋宝华 </span><span>出处： 天极软件 </span><span>责任编辑：&gt;方舟</span></div>
20 世纪80 年代，随着面向对象技术成为研究的热点，先后出现了几十种面向对象的软件开发方法。其中，Booch、OMT 和OOSE等方法得到了广泛的认可。然而，采用不同方法进行建模不利于开发者之间的交流。而UML则统一了Booch、OMT 和OOSE 的表示方法，而且对其作了进一步的发展。1997 年，UML 被国际对象组织OMG采纳为面向对象的建模语言的国际标准，它溶入了软件工程领域的新思想、新方法和新技术。UML不限于支持面向对象的分析与设计，还支持从需求分析开始的软件开发的全过程。数年来，UML凭借其简洁明晰的表达方式、超凡脱俗的表达能力，一路杀将出来，为业界所广泛认同！目前，在多数大型企业的正规化开发流程中，开发人员普遍使用UML进行模型的建立。作为一名软件开发人员，我们必须学会UML。因为UML就是那个统一的"文字"，统一的"度"、"量"、"衡"，不理解UML，作为软件设计统一王国的国民，将是艰难而痛苦的。<br />
<br />
　　作曲家会将其脑袋中的旋律谱成乐曲，建筑师会将其设计的建筑物画成蓝图，这些乐曲、蓝图就是模型(Model)，而建构这些模型的过程就称为建模(Modeling)。软件开发如同音乐谱曲及建筑设计，其过程中也必须将需求、分析、设计、实现、布署等各项工作流程的构想与结果予以呈现，这就是软件系统的建模。 <br />
<br />
　　那么为什么要建模呢？经典答案是：建立大厦和建立狗窝的区别是建设狗窝不需要设计，要生产合格的软件就要有一套关于体系结构、过程和工具的规范。<br />
<br />
　　OMG官方发布的UML的当前最高版本为2.0，可以从http://www.uml.org/上下载。<br />
<br />
　　UML由图和元模型组成，图是语法，元模型是语义。UML主要包括三个基本构造块：事物（Things）、关系（Relationships）和图（Diagrams）。本次连载我们将对UML的这些基本组成部分及UML工具和应用进行介绍，使读者对UML形成初步的整体印象。在其后的几次连载里，再以数个实例对这些内容逐步展开。<br />
<br />
　　<font color="#dd6d22"><strong>1.1 UML的基本构造块</strong><br />
</font><br />
　　<strong>1.1.1事物</strong><br />
<br />
　　事物是是实体抽象化的最终结果，是模型中的基本成员，UML中包含结构事物、行为事物、分组事物和注释事物。<br />
<br />
　　（1）结构事物（Structural things）<br />
<br />
　　结构事物是模型中的静态部分，用以呈现概念或实体的表现元素，是软件建模中最常见的元素，共有以下七种：<br />
<br />
　　类（Class）：类是指具有相同属性、方法、关系和语义的对象的集合；<br />
<br />
　　接口（Interface）：接口是指类或组件所提供的服务（操作），描述了类或组件对外可见的动作；<br />
<br />
　　协作（Collaboration）：协作描述合作完成某个特定任务的一组类及其关联的集合，用于对使用情形的实现建模；<br />
<br />
　　用例（Use Case）：用例定义了执行者（在系统外部和系统交互的人）和被考虑的系统之间的交互来实现的一个业务目标；<br />
<br />
　　活动类（Active Class）：活动类的对象有一个或多个进程或线程。活动类和类很相象，只是它的对象代表的元素的行为和其他的元素是同时存在的；<br />
<br />
　　组件（Component）：组件是物理的、可替换的部分，包含接口的集合，例如COM+ 、JAVA BEANS等；<br />
<br />
　　结点（Node）：结点是系统在运行时存在的物理元素，代表一个可计算的资源，通常占用一些内存和具有处理能力。<br />
<br />
　　（2）行为事物（Behavioral things）<br />
<br />
　　行为事物指的是UML模型中的动态部分，代表语句里的"动词"，表示模型里随着时空不断变化的部分，包含两类：<br />
<br />
　　交互（ineraction）：交互是由一组对象之间在特定上下文中，为达到特定的目的而进行的一系列消息交换而组成的动作；<br />
<br />
　　状态机（state machine）：状态机由一系列对象的状态组成。<br />
<br />
　　（3）分组事物（Grouping things）<br />
<br />
　　可以把分组事物看成是一个"盒子"，模型可以在其中被分解。目前只有一种分组事物，即包（package）。结构事物、动作事物甚至分组事物都有可能放在一个包中。包纯粹是概念上的，只存在于开发阶段，而组件在运行时存在。<br />
<br />
　　（4）注释事物（Annotational things）<br />
<br />
　　注释事物是UML模型的解释部分。<br />
<br />
　　<strong>1.1.2关系<br />
</strong><br />
　　关系是将事物联系在一起的方式，UML中定义了四种关系：<br />
<br />
　　（1）依赖（Dependencies）：两个事物之间的语义关系，其中一个事物发生变化会影响另一个事物的语义；<br />
<br />
　　（2）关联（Association）：一种描述一组对象之间连接的结构关系，如聚合关系（描述了整体和部分间的结构关系）；<br />
<br />
　　（3）泛化（Generalization）：一种一般化-特殊化的关系；<br />
<br />
　　（4）实现(Realization) ：类之间的语义关系，其中的一个类指定了由另一个类保证执行的契约。<br />
<br />
　　<strong>1.1.3图</strong><br />
<br />
　　图是事物集合的分类，UML中包含多种图：<br />
<br />
　　（1）类图(Class Diagram)：类图描述系统所包含的类、类的内部结构及类之间的关系；<br />
<br />
　　（2）对象图(Object Diagram)：对象图是类图的一个具体实例；<br />
<br />
　　（3）包图（Package Diagram）：包图表明包及其之间的依赖类图；<br />
<br />
　　（4）组件图(Compoment Diagram，也称构件图)：组件图描述代码部件的物理结构以及各部件之间的依赖关系；<br />
<br />
　　（5）部署图(Deployment Diagram)：部署图定义系统中软硬件的物理体系结构；<br />
<br />
　　（6）用例图(Usecase Diagram)：用例图从用户的角度出发描述系统的功能、需求，展示系统外部的各类角色与系统内部的各种用例之间的关系；<br />
<br />
　　（7）顺序图(Sequence Diagram)：顺序图表示对象之间动态合作的关系； <br />
<br />
　　（8）协作图(Collaboration Diagram)：合作图描述对象之间的协作关系；<br />
<br />
　　（9）状态图(Statechart Diagram)：状态图描述一类对象的所有可能的状态以及事件发生时状态的转移条件；<br />
<br />
　　（10）活动图(Activity Diagram)：活动图描述系统中各种活动的执行顺序。<br />
<br />
　　上述十种图可归纳为五类，如表1.1。<br />
<br />
　　表1.1 UML图分类<br />
<br />
<table cellspacing="0" cellpadding="0" width="90%" align="center" border="1">
    <tbody>
        <tr>
            <td>类型</td>
            <td>包含</td>
        </tr>
        <tr>
            <td>静态图</td>
            <td>类图、对象图、包图</td>
        </tr>
        <tr>
            <td>行为图</td>
            <td>状态图、活动图</td>
        </tr>
        <tr>
            <td>用例图</td>
            <td>用例图</td>
        </tr>
        <tr>
            <td>交互图</td>
            <td>顺序图、协作图</td>
        </tr>
        <tr>
            <td>实现图</td>
            <td>组件图、部署图</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<font color="#dd6d22"><strong>1.2 UML工具与应用</strong><br />
</font><br />
　　"工欲善其事，必先利于器"，为了有效的利用UML，我们需要首先获得一个UML工具软件。<br />
<br />
　　当前，业界使用最广泛的UML建模工具为Rational Rose。Rational Rose中可实现正向（为模型产生相应的代码）、逆向（从用户原来的软件系统导出该系统的模型）和双向工程（实现模型和代码之间的循环工程），从而保证模型与代码的高度一致。Rational Rose支持C++、Visual C++、Java、Smalltalk、Ada、Visual Basic、PowerBuilder等语言和开发工具，并能为CORBA 应用生成接口定义语言（IDL），为数据库应用生成数据库描述语言（DDL）等。另外，Rational Rose为团队开发和规范的开发过程管理提供了良好的支持。<br />
对于小规模应用，我们可以使用微软公司Office套件中的Visio，其中提供了对UML各种图的绘制支持。<br />
<br />
　　从应用的角度上来讲，面向对象的系统设计一般需要完成如下工作：<br />
<br />
　　（1）描述需求；<br />
<br />
　　（2）根据需求建立系统的静态模型；<br />
<br />
　　（3）描述系统的行为。<br />
<br />
　　（1）和（2）中所建立的模型是静态的（采用用例图、类图、对象图、组件图和部署图等），是标准建模语言UML中的静态建模机制；而（3）中所建立的模型则表示执行时的序列、状态或交互关系（以状态图、活动图、顺序图和协作图描述），是标准建模语言UML中的动态建模机制。<br />
<br />
　　由此可以看出，标准建模语言UML的主要内容也可以归纳为静态建模机制和动态建模机制两大类。 <br />
<br />
　　此外，需要说明的是，UML只是一种建模语言，它独立于具体的建模过程。因此，利于它建模时，可遵循任何类型的建模过程。尽管如此，UML的作者们为我们推荐了RUP（Rational Unified Process）。RUP由Rational软件公司首创，其最重要的特点有三：<br />
<br />
　　（1）软件开发是由用例驱动的；<br />
<br />
　　（2）软件开发是以体系结构设计（Architectural Design）为中心；<br />
<br />
　　（3）软件开发是个迭代过程。<br />
<br />
　　RUP包括四个阶段，每个阶段又分为若干次迭代，每次迭代都有一个核心工作流，如图1.1所示。<br />
<br />
<table width="90%" align="center">
    <tbody>
        <tr>
            <td>
            <div align="center"><img style="border-left-color: #000000; border-bottom-color: #000000; border-top-color: #000000; border-right-color: #000000" src="http://dev.yesky.com/imagelist/06/23/3kp669ko2325.jpg" border="1"  alt="" /><br />
            图1.1 RUP的流程</div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/yifeng/aggbug/227452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-09-06 23:16 <a href="http://www.blogjava.net/yifeng/archive/2008/09/06/227452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件工程－软件目的需求开发与管理</title><link>http://www.blogjava.net/yifeng/archive/2008/08/24/223945.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Sat, 23 Aug 2008 23:46:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/08/24/223945.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/223945.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/08/24/223945.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/223945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/223945.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="760" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div class="title" align="center">软件工程－软件目的需求开发与管理 </div>
            </td>
        </tr>
        <tr>
            <td height="20">&nbsp;</td>
        </tr>
        <tr>
            <td>
            <div class="formtitle" align="center">作者：云中客的专栏 出处：CSDN<br />
            </div>
            </td>
        </tr>
        <tr>
            <td height="30">&nbsp;</td>
        </tr>
        <tr>
            <td valign="top">
            <table cellspacing="0" cellpadding="0" width="86%" align="center" border="0">
                <tbody>
                    <tr>
                        <td class="content" valign="top">
                        <p>需求开发与管理是软件项目中一项十分重要的工作，据调查显示在众多失败的软件项目中，由于需求原因导致的约占到45%，因此，需求工作将对软件项目能否最终实现产生至关重要的影响。虽然如此，在项目开发工作中，很多人对需求的认识还远远不够，从本人参与或接触到的一些项目来看，小到几十万元，大到上亿元的软件项目的需求都或多多少的存在问题，有的是开发者本身不重视原因、有的是技术原因、有的是人员组织原因、有的是沟通原因、有的是机制原因，以上种种原因都表明做好软件需求开发是一项系统工作，而不是简单的技术工作，只有系统的了解和掌握需求的基本概念、方法、手段、评估标准、风险等相关知识，并在实践中加以应用，才能真正做好需求的开发和管理工作。 </p>
                        <p>本文将通过介绍关于软件需求的基本知识和个人在实际工作中总结的一些经验，帮助读者了解软件需求，学习需求开发的一些基本方法，避免因需求原因而导致的项目失败。 </p>
                        <p>1 什么是软件需求和需求工程 </p>
                        <p>1.1 软件需求的定义 </p>
                        <p>在IEEE软件工程标准词汇表(1997年)中定义软件需求为： </p>
                        <p>（1）用户解决问题或达到目标所需的条件或能力。 </p>
                        <p>（2）系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或能力。 </p>
                        <p>（3）一种反映上面(1)或(2)所描述的条件或权能的文档说明。 实通俗的讲，&#8220;需求&#8221;就是用户的需要，它包括用户要解决的问题、达到的目标、以及实现这些目标所需要的条件，它是一个程序或系统开发工作的说明，表现形式一般为文档形式。 </p>
                        <p>1.2 需求工程的定义 </p>
                        <p>需求分析的过程，也叫做需求工程和需求阶段，它包括了需求开发和需求管理两个部分。需求开发是指从情况收集、分析和评价到编写文档、评审等一系列产生需求的活动，分为四个阶段：情况获取、分析、制订规格说明和评审。这四个阶段不一定是遵循线性顺序的，他们的活动是相互独立和反复的。需求管理是软件项目开发过程中控制和维持需求约定的活动，它包括：变更控制、版本控制、需求跟踪、需求状态跟踪等工作。 </p>
                        <p>2 需求分析的风险 </p>
                        <p>由于需求分析的参与人员、业务模式、投资、时间等客观因素的影响和需求本身具有主观性和可描述性差的特点，因此，需求分析工作往往面临着一些潜在的风险。这些风险主要表现在： </p>
                        <p>（1）用户不能正确表达自身的需求。在实际开发过程中，常常碰到用户对自己真正的需求并不是十分明确的情况，他们认为计算机是万能的，只要简单的说说自己想干什么就是把需求说明白了，而对业务的规则、工作流程却不愿多谈，也讲不清楚。这种情况往往会增加需求分析工作难度，分析人员需要花费更多的时间和精力与用户交流，帮助他们梳理思路，搞清用户的真实需求。 </p>
                        <p>（2）业务人员配合力度不够。有的用户日常工作繁忙，他们不愿意付出更多的时间和精力向分析人员讲解业务，这样会加大分析人员的工作难度和工作量，也可能导致因业务需求不足而使系统无法使用。 </p>
                        <p>（3）用户需求的不断变更。由于需求识别不全、业务发生变化、需求本身错误、需求不清楚等原因，需求在项目的整个生命周期都可能发生变化，因此，我们要认识到，软件开发的过程实际上是同变化做斗争的过程，需求变化是每个开发人员、项目管理人员都会遇到的问题，也是最头痛的问题，一旦发生了需求变化，就不得不修改设计、重写代码、修改测试用例、调整项目计划等等，需求的变化就像是万恶之源，为项目的正常的进展带来不尽的麻烦。 </p>
                        <p>（4）需求的完整程度。需求如何做到没有遗漏？这是一个大问题，大的系统要想穷举需求几乎是不可能的，即使小的系统，新的需求也总会不时地冒出来。一个系统很难确定明确的范围并把所有需求一次性提出来，这会导致开发人员在项目进展中去不断完善需求，先建立系统结构再完成需求说明，造成返工的可能性很大，会给开发人员带来挫折感，降低他们完成项目的信心。 </p>
                        <p>（5）需求的细化程度。需求到底描述到多细，才算可以结束了？虽然国家标准有需求说明的编写规范，但具体到某一个需求上，很难给出一个具体的指标，可谓仁者见仁，智者见智，并没有定论。需求越细，周期越长，可能的变化越多，对设计的限制越严格，对需求的共性提取要求也越高，相反，需求越粗，开发人员在技术设计时不清楚的地方就越多，影响技术设计。 </p>
                        <p>（6）需求描述的多义性。需求描述的多义性一方面是指不同读者对需求说明产生了不同的理解；另一方面是指同一读者能用不同的方式来解释某个需求说明。多义性会使用户和开发人员等项目参与者产生不同的期望，也会使开发、测试人员为不同的理解而浪费时间，带来不可避免的后果便是返工重做。 </p>
                        <p>（7）忽略了用户的特点分析。分析人员往往容易忽略了系统用户的特点，系统是由不同的人使用其不同的特性，使用频繁程度有所差异，使用者受教育程度和经验水平不尽相同。如果忽略这些的话，将会导致有的用户对产品感到失望。 </p>
                        <p>（8）需求开发的时间保障。为了确保需求的正确性和完整性，项目负责人往往坚持要在需求阶段花费较多的时间，但用户和开发部门的领导却会因为项目迟迟看不到实际成果而焦虑，他们往往会强迫项目尽快往前推进，需求开发人员也会被需求的复杂和善变折腾的筋疲力尽，他们也希望尽快结束需求阶段。 </p>
                        <p>3 如何做好需求工作 </p>
                        <p>需求分析是软件项目开发中最困难的一项工作，它不仅要求分析人员具有丰富的需求分析经验和良好的专业素质，还要求分析人员具有良好的学习能力、公关能力、语言能力和组织能力。在实际工作中分析人员要面对不同的单位、不同的部门、不同的人员、不同的文化、不同的关系、不同的管理水平等等不同的情况，面对如此纷繁复杂的环境，如何做好需求分析工作？首先需要建立一个有效的工作机制，只有建立了工作机制，才能保证需求工作按照既定方案执行，需求开发和管理的参与者才会在一种有序的状态下工作。其次才是充分运用工作机制和个人能力去获取问题、分析问题、编写需求文档和进行需求管理。 </p>
                        <p>3.1 建立需求分析工作机制需考虑的几个因素 </p>
                        <p>（1）抓住决策者最迫切和最关心的问题，引起重视。用户方决策者对项目的关心重视程度是项目能否顺利开展的关键，决策者的真实意图也是用户方的最终需求，因此，在开发过程中要利用一切机会了解决策者关心的问题，同时也要让他们了解项目的情况。在诸如谈判、专题汇报、协调会议、领导视察、阶段性成果演示等过程中用简短明确的语言或文字抓住领导最关心的问题，引导他们了解和重视项目的开发，当决策者认识到项目的重要性时，需求分析工作在人力、物力、时间上就有了保障。 </p>
                        <p>（2）建立组织保障，明确的责任分工。项目开发一般都会成立相应的项目组或工程组，目前，常见的组织形式是：产品管理组、质量与测试组、程序开发组、用户代表组和后勤保障组，各组的主要分工是：产品管理组负责确定和设置项目目标，根据需求的优先级确定功能规范，向相关人员通报项目进展。程序管理组负责系统分析，根据软件开发标准协调日常开发工作确保及时交付开发任务，控制项目进度。程序开发组负责按照功能规范要求交付软件系统。质量与测试组负责保证系统符合功能规范的要求，测试工作与开发工作是独立并行的。用户代表组负责代表用户方提出需求，负责软件的用户方测试。后勤保障组负责确保项目顺利进行的后勤保障工作。 </p>
                        <p>（3）建立良好的沟通环境和氛围。分析人员与用户沟通的程度关系到需求分析的质量，因此建立一个良好的沟通氛围、处理好分析人员与用户之间的关系显得尤其重要，一般情况，用户作为投资方会有一些心理优势，希望他们的意见得到足够的重视，分析人员应该充分的认识到这一点，做好心理准备，尽量避免与他们发生争执，因为我们的目的是帮助用户说出他们的最终需要。在沟通时分析人员应注意以下几个方面：1）态度上要尊重对方，但不谦恭。谦恭可能会让用户一时感到满意，但对长期合作并没有好处，尤其是在发生冲突的时候，用户会习惯性地感到自己的优势，而忽略分析人员地意见。2）分析人员要努力适应不同用户的语言表达方式。每个人都有自己的表达方式，所以优秀的分析人员应该是一个优秀的&#8220;倾听者&#8221;，他们能很快的适应用户的语言风格，理解他们的意思。3）善于表达自己，善于提问。分析人员在开口前应该先让对方充分表达他的意思，在领会了后，自己再说，尽量不要抢话。4）工作外的交流有助于增进理解，加强沟通。 </p>
                        <p>（4）需求质量控制要制度化需求的变化是软件项目不可避免的事实，因此需求质量控制是一项艰苦的工作，要保证该项工作的顺利实施，就必须有制度保证，这个制度可以在项目质量控制方案中制定，该方案主要是具体化、定量化的描述用户要求，形成全面、一致、规范的软件需求分析规格说明书，明确需求分析规格说明书的工作程序和要素，规范开发活动，为后续软件设计、实现、测试、评审及验收提供依据。在方案中要明确项目组各部门关于需求质量控制的职责，制定需求分析的工作程序，包括编制需求分析工作计划、编制《需求分析说明书》、《需求分析规格说明书》的评审和确认、《需求分析规格说明书》修改控制、确定需求质量控制的质量记录文档规范等内容。 </p>
                        <p>3.2 需求开发与管理的一些方法 </p>
                        <p>需求开发是一项复杂的工作，使用的方法也很多，不同的开发方式有不同的方法，这里简单介绍一些相关的方法： </p>
                        <p>（1）绘制关联图：绘制系统关联图是用于定义系统与系统外部实体间的界限和接口的简单模型。 </p>
                        <p>（2）可行性分析：在允许的成本、性能要求下，分析每项需求实施的可行性，提出需求实现相关风险，包括与其它需求的冲突，对外界因素的依赖和技术障碍。 </p>
                        <p>（3）需求优先级：确定使用实例、产品特性或单项需求实现的优先级别。以优先级为基础确定产品版本将包括哪些特性或哪类需求。 </p>
                        <p>（4）系统原型：当用户自身对有的需求不十分清楚时，我们可以建立一个系统原型，用户通过评价原型更好地理解所要解决的问题。。 </p>
                        <p>（5）图形分析模型：绘制图形分析模型是编制软件需求规格说明重要手段。它们能帮助分析人员理清数据、业务模式、工作流程以及他们之间的关系，找出遗漏、冗余和不一致的需求。这样的模型包括数据流图、实体关系图、状态变换图、对话框图、对象类及交互作用图。 </p>
                        <p>（6）数据字典：数据字典是对系统用到的所有数据项和结构的定义，以确保开发人员使用统一的数据定义。在需求阶段，数据字典至少应定义客户数据项，确保客户与开发小组是使用一致的定义和术语。 </p>
                        <p>（7）质量功能调配：质量功能调配是一种高级系统技术，它将产品特性、属性与对客户的重要性联系起来。该技术提供了一种分析方法以明确哪些是客户最为关注的特性。它将需求分为三类：期望需求、普通需求、兴奋需求。 </p>
                        <p>需求管理的目的就是要控制和维持需求事先约定，保证项目开发过程的一致性，使用户得到他们最终想要得产品。需求管理的方法主要包括以下一些方面： </p>
                        <p>1）确定需求变更控制过程。制定一个选择、分析和决策需求变更的过程，所有的需求变更都需遵循此过程。 </p>
                        <p>2）进行需求变更影响分析。评估每项需求变更，以确定它对项目计划安排和其它需求的影响，明确与变更相关的任务并评估完成这些任务需要的工作量。通过这些分析将有助于需求变更控制部门做出更好的决策。 </p>
                        <p>3）建立需求基准版本和需求控制版本文档。确定需求基准，这是项目各方对需求达成一致认识时刻的一个快照，之后的需求变更遵循变更控制过程即可。每个版本的需求规格说明都必须是独立说明，以避免将底稿和基准或新旧版本相混淆。 </p>
                        <p>4）维护需求变更的历史记录。将需求变更情况写成文档，记录变更日期、原因、负责人、版本号等内容，及时通知到项目开发所涉及的人员。为了尽量减少困惑、冲突、误传，应指定专人来负责更新需求。 </p>
                        <p>5）跟踪每项需求的状态。可以把每一项需求的状态属性（如已推荐的，已通过的，已实施的，或已验证的）保存在数据库中，这样可以在任何时候得到每个状态类的需求数量。 </p>
                        <p>6）衡量需求稳定性。可以定期把需求数量和需求变更（添加、修改、删除）数量进行比较。过多的需求变更"是一个报警信号"，意味着问题并未真正弄清楚。 </p>
                        <p>4 需求分析评价标准 </p>
                        <p>如何判断需求规格说明的好坏，不同的软件工程规范都有自己的一套标准，这里向大家介绍一个比较常见的NASA SEL推荐方法，它是由美国国家航空和航天局软件工程实验室开发的五大常用国际软件工程规范之一，它对软件需求过程的评价标准是：清晰、完整、一致、可测试。 </p>
                        <p>（1）清晰：目前大多数的需求分析采用的仍然是自然语言，自然语言对需求分析最大的弊病就是它的二义性，所以开发人员需要对需求分析中采用的语言做某些限制。例如尽量采用主语＋动作的简单表达方式。需求分析中的描述一定要简单，千万不要采用疑问句、修饰这些复杂的表达方式。 除了语言的二义性之外，注意不要使用行话，就是计算机术语。需求分析最重要的是和用户沟通，可是用户多半不是计算机的专业人士，如果在需求分析中使用了行话，就会造成用户理解上的困难。 </p>
                        <p>（2）完整：需求的完整性是非常重要的，如果有遗漏需求，则不得不返工，在软件开发过程中，最糟糕的事情莫过于在软件开发接近完成时发现遗漏了一项需求。但实际情况是，需求的遗漏是常发生的事情，这不仅仅是开发人员的问题，更多发生在用户那里。要做到需求的完整性是很艰难的一件事情，它涉及到需求分析过程的各个方面，贯穿整个过程，从最初的需求计划制定到最后的需求评审。 </p>
                        <p>（3）一致：一致性是指用户需求必须和业务需求一致，功能需求必须和用户需求一致。在需求过程中，开发人员需要把一致性关系进行细化，比如用户需求不能超出预前指定的范围。严格的遵守不同层次间的一致性关系，就可以保证最后开发出来的软件系统不会偏离最初的实现目标。 </p>
                        <p>（4）可测试：一个项目的测试从什么时候开始呢？有人说是从编码完成后开始，有人说是编码的时候同时进行单元测试，编码完成后进行系统测试，这些结论都不完全正确。实际上，测试是从需求分析过程就开始了，因为需求是测试计划的输入和参照。这就要求需求分析是可测试的，只有系统的所有需求都是可以被测试的，才能够保证软件始终围绕着用户的需要，保证软件系统是成功的。<br />
                        </p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/yifeng/aggbug/223945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-08-24 07:46 <a href="http://www.blogjava.net/yifeng/archive/2008/08/24/223945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>