﻿<?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/alex/category/11189.html</link><description>不求多得,只求一得
about java,hibernate,spring,design,database,Ror,ruby,快速开发&lt;br/&gt;
最近关心的内容:Jboss Seam框架，JSF,EJB3 &lt;br/&gt;
本站的官方站点是:&lt;a href="www.foxlog.org"&gt;www.foxlog.org&lt;/a&gt;
</description><language>zh-cn</language><lastBuildDate>Sun, 19 Aug 2007 12:43:53 GMT</lastBuildDate><pubDate>Sun, 19 Aug 2007 12:43:53 GMT</pubDate><ttl>60</ttl><item><title>关于吃饭这个项目</title><link>http://www.blogjava.net/alex/archive/2007/08/19/137930.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sun, 19 Aug 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/08/19/137930.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/137930.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/08/19/137930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/137930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/137930.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目，是一个范围很广的概念，三峡大坝是一个项目，IT企业的一次开发任务也是一个项目，个人某个时间段的活动安排仍然可以看作是一个项目.<br><br>&nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/08/19/137930.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/137930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-08-19 13:15 <a href="http://www.blogjava.net/alex/archive/2007/08/19/137930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遇到棘手的问题怎么办?</title><link>http://www.blogjava.net/alex/archive/2007/08/18/137789.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 18 Aug 2007 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/08/18/137789.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/137789.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/08/18/137789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/137789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/137789.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  一般来说，我们碰到问题都是无非google,看相关文档，请教专家,问圈子里的朋友，等等。我这里说的主要是个人自己的解决思路。<br><br>&nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/08/18/137789.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/137789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-08-18 12:17 <a href="http://www.blogjava.net/alex/archive/2007/08/18/137789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB开发流程(步骤)</title><link>http://www.blogjava.net/alex/archive/2007/06/13/123899.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 13 Jun 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/06/13/123899.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/123899.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/06/13/123899.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/123899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/123899.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/06/13/123899.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/123899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-06-13 16:43 <a href="http://www.blogjava.net/alex/archive/2007/06/13/123899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]如何做需求分析</title><link>http://www.blogjava.net/alex/archive/2007/06/12/123676.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 12 Jun 2007 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/06/12/123676.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/123676.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/06/12/123676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/123676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/123676.html</trackback:ping><description><![CDATA[<br>come from <a href="http://blog.sina.com.cn/u/4a698c270100067q" target=_blank>here</a><br><br><font size=2>如果将需求分析阶段的工作归结为编写需求规格说明书，这种简化的做法往往是导致项目后期层出不穷问题的罪魁祸首。建议采用以下步骤形成软件需求：获取用户需求&#8594;分析用户需求&#8594;编写需求文档&#8594;评审需求文档&#8594;管理需求。下面我们先来讨论前两个步骤（获取用户需求、分析用户需求）的做法。</font>
<p><strong><font size=2>获取用户需求</font></strong></p>
<p><font size=2>　　这是该阶段的一个最重要的任务。以下为获取用户需求需要执行的活动（如图1所示）。</font></p>
<p><font size=2>　　● 了解客户方的所有用户类型以及潜在的类型。然后，根据他们的要求来确定系统的整体目标和系统的工作范围。</font></p>
<p><font size=2>　　● 对用户进行访谈和调研。交流的方式可以是会议、电话、电子邮件、小组讨论、模拟演示等不同形式。需要注意的是，每一次交流一定要有记录，对于交流的结果还可以进行分类，便于后续的分析活动。例如，可以将需求细分为功能需求、非功能需求（如响应时间、平均无故障工作时间、自动恢复时间等）、环境限制、设计约束等类型。</font></p>
<p><font size=2>　　● 需求分析人员对收集到的用户需求做进一步的分析和整理。下面是几条常见的准则：</font></p>
<p><font size=2>　　⑴对于用户提出的每个需求都要知道&#8220;为什么&#8221;，并判断用户提出的需求是否有充足的理由；</font></p>
<p><font size=2><img height=249 alt="" src="http://www.sawin.cn/doc/SA/REQ/howtoreq2-1.jpg" width=150>　　</font></p>
<p><font size=2>　　图1 获取用户需求的活动</font></p>
<p><font size=2>　　⑵将那种以&#8220;如何实现&#8221;的表述方式转换为&#8220;实现什么&#8221;的方式，因为需求分析阶段关注的目标是&#8220;做什么&#8221;，而不是&#8220;怎么做&#8221;；</font></p>
<p><font size=2>　　⑶分析由用户需求衍生出的隐含需求，并识别用户没有明确提出来的隐含需求（有可能是实现用户需求的前提条件），这一点往往容易忽略掉，经常因为对隐含需求考虑得不够充分而引起需求变更。</font></p>
<p><font size=2>　　● 需求分析人员将调研的用户需求以适当的方式呈交给用户方和开发方的相关人员。大家共同确认需求分析人员所提交的结果是否真实地反映了用户的意图。需求分析人员在这个任务中需要执行下述活动：</font></p>
<p><font size=2>　　⑴明确标识出那些未确定的需求项（在需求分析初期往往有很多这样的待定项）；</font></p>
<p><font size=2>　　⑵使需求符合系统的整体目标；</font></p>
<p><font size=2>　　⑶保证需求项之间的一致性，解决需求项之间可能存在的冲突。</font></p>
<p><font size=2><strong>分析用户需求</strong></font></p>
<p><font size=2>　　在很多情形下，分析用户需求是与获取用户需求并行的，主要通过建立模型的方式来描述用户的需求，为客户、用户、开发方等不同参与方提供一个交流的渠道。这些模型是对需求的抽象，以可视化的方式提供一个易于沟通的桥梁。用户需求的分析与获取用户需求有着相似的步骤，区别在于分析用户需求时使用模型来描述，以获取用户更明确的需求。分析用户需求需要执行下列活动：</font></p>
<p><font size=2>　　● 以图形表示的方式描述系统的整体结构，包括系统的边界与接口；</font></p>
<p><font size=2>　　● 通过原型、页面流或其它方式向用户提供可视化的界面，用户可以对需求做出自己的评价；</font></p>
<p><font size=2>　　● 系统可行性分析，需求实现的技术可行性、环境分析、费用分析、时间分析等；</font></p>
<p><font size=2>　　● 以模型描述系统的功能项、数据实体、外部实体、实体之间的关系、实体之间的状态转换等方面的内容。</font></p>
<p><font size=2><img height=252 alt="" src="http://www.sawin.cn/doc/SA/REQ/howtoreq2-2.jpg" width=351>　　</font></p>
<p><font size=2>　　图2 DFD示意图</font></p>
<p><font size=2>　　用于需求建模的方法有很多种，最常用的包括数据流图（DFD）、实体关系图（ERD）和用例图（Use Case）三种方式。DFD作为结构化系统分析与设计的主要方法，已经得到了广泛的应用，DFD尤其适用于MIS系统的表述。DFD使用四种基本元素来描述系统的行为，过程、实体、数据流和数据存储。DFD方法直观易懂，使用者可以方便地得到系统的逻辑模型和物理模型，但是从DFD图中无法判断活动的时序关系。图2描述的是某个项目的DFD示意图。</font></p>
<p><font size=2>　　ERD方法用于描述系统实体间的对应关系，需求分析阶段使用ERD描述系统中实体的逻辑关系，在设计阶段则使用ERD描述物理表之间的关系。需求分析阶段使用ERD来描述现实世界中的对象。ERD只关注系统中数据间的关系，而缺乏对系统功能的描述。如果将ERD与DFD两种方法相结合，则可以更准确地描述系统的需求。</font></p>
<p><font size=2>　　在面向对象分析的方法中通常使用Use Case来获取软件的需求。Use Case通过描述&#8220;系统&#8221;和&#8220;活动者&#8221;之间的交互来描述系统的行为。通过分解系统目标，Use Case描述活动者为了实现这些目标而执行的所有步骤。Use Case方法最主要的优点，在于它是用户导向的，用户可以根据自己所对应的Use Case来不断细化自己的需求。此外，使用Use Case还可以方便地得到系统功能的测试用例。</font></p>
<p><font size=2><strong>编写需求文档</strong></font></p>
<p><font size=2>　　需求文档可以使用自然语言或形式化语言来描述，还可以添加图形的表述方式和模型表征的方式。需求文档应该包括用户的所有需求（功能性需求和非功能性需求）。</font></p>
<p><font size=2><strong>评审需求文档</strong></font></p>
<p><font size=2>　　需求文档完成后，需要经过正式评审，以便作为下一阶段工作的基础。一般的评审分为用户评审和同行评审两类。用户和开发方对于软件项目内容的描述，是以需求规格说明书作为基础的；用户验收的标准则是依据需求规格说明书中的内容来制订，所以评审需求文档时用户的意见是第一位的。而同行评审的目的，是在软件项目初期发现那些潜在的缺陷或错误，避免这些错误和缺陷遗漏到项目的后续阶段。</font></p>
<p><font size=2><strong>管理需求</strong></font></p>
<p><font size=2><img height=403 alt="" src="http://www.sawin.cn/doc/SA/REQ/howtoreq2-3.jpg" width=294>　　</font></p>
<p><font size=2>　　图1 需求变更流程</font></p>
<p><font size=2>　　需求的变更是不可避免的，如何以可控的方式管理软件的需求，对于项目的顺利进行有着重要的意义。如果匆匆忙忙地完成用户调研与分析，则往往意味着不稳定的需求。所以需求管理要保证需求分析各个活动都得到了充分的执行。对于需求变更的管理，则主要使用需求变更流程和需求跟踪矩阵的管理方式。需求变更流程和需求跟踪矩阵分别如图1和图2所示。</font></p>
<p><font size=2><img height=152 alt="" src="http://www.sawin.cn/doc/SA/REQ/howtoreq2-4.jpg" width=374>　　</font></p>
<p><font size=2>　　图2 需求跟踪矩阵</font></p>
<p><font size=2>　　常见问题及建议</font></p>
<p><font size=2>　　Q、客户与最终用户的区别是什么？</font></p>
<p><font size=2>　　A、可以借助图3来说明它们之间的区别。</font></p>
<p><font size=2><img height=195 alt="" src="http://www.sawin.cn/doc/SA/REQ/howtoreq2-5.jpg" width=300>　　</font></p>
<p><font size=2>　　图3 需求获取渠道示意图</font></p>
<p><font size=2>　　软件需求来自系统工程与客户两个方面，其中客户是主要的需求提供者（系统工程需求也来自于客户）。客户需要搜集其最终用户的需求并考虑自身的需求，然后再提供给开发方。假如客户并未去认真搜集最终用户的需求，开发方便需要做到这一点，因为系统最终要满足最终用户的需求。</font></p>
<p><font size=2>　　Q、如何进行用户访谈？</font></p>
<p><font size=2>　　A、首先，一定要事先确定访谈的目的和提纲。其次，因为用户往往并不知道应该提供哪些方面的需求，所以需要开发人员引导。</font></p>
<p><font size=2>　　Q、用户访谈内容是什么？</font></p>
<p><font size=2>　　A、首先，请用户描述他们如何完成自己当前的工作，并与用户一起抽象出一个工作流程或工作模型。然后，在得到用户的认可后，向用户解释自己是怎样来实现这些功能的，并说明哪些环节可以用自动化方式实现等。</font></p>
<p><font size=2>　　Q、采用哪一种方式做需求分析最好？</font></p>
<p><font size=2>　　A、不同的需求分析有不同的特点。还没有哪一种方法可以完全替代别的方法，否则，现在就不会存在不同的需求建模方式了。一般来说，可以使用DFD＋ERD来描述那些功能层次比较清晰的需求；而USE CASE则适于描述功能结构复杂的需求。做需求分析的目的是为了建立需求的模型，不同的子系统有可能使用不同的建模方法。</font></p>
<p><font size=2>　　Q、怎样做原型，原型的目的是什么？</font></p>
<p><font size=2>　　A、通常使用原型分析方法来帮助开发方进一步获取用户需求或让用户确认需求。开发方往往先向用户提供一个可视界面作为原型，并在界面上布置必要的元素以演示用户所需要的功能。可以使用第四代语言（例如Visual Basic、Delphi等）来快速生成用户界面，也可以使用FrontPage等网页制作工具来生成用户可视的页面流。</font></p>
<p><font size=2>　　原型的目的往往是获取需求。但有时也使用原型的方式来验证关键技术或技术难点。对于技术原型，界面则往往被忽略掉。</font></p>
<img src ="http://www.blogjava.net/alex/aggbug/123676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-06-12 17:47 <a href="http://www.blogjava.net/alex/archive/2007/06/12/123676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]成为软件架构师</title><link>http://www.blogjava.net/alex/archive/2006/09/22/71296.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Fri, 22 Sep 2006 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/09/22/71296.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/71296.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/09/22/71296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/71296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/71296.html</trackback:ping><description><![CDATA[key words:软件架构师<br />转自<a href="/chengang/archive/2006/09/16/70067.html">here</a><br /><br />现在软件架构师满天飞，是个写代码的都称自己为软件架构师，就象开个公司管上四五号人就给自己按个CEO头衔一样，着实让人好笑。于是到网上GOOGLE了一下看看软件构架师具体是个啥东东，有想做货真价实的构架师，就朝着那方向努力吧。网摘如下：<br /><br /><span style="color: rgb(0, 0, 0);">软件架构师的职责：将客户的需求转换为规范的开发计划及文本，并制定这个项目的总体架构，指导整个开发团队完成这个计划。<br /><br /><strong>软件架构师的具体工作：<br /></strong>    (</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)在需求阶段，软件架构师主要负责理解和管理非功能性系统需求，比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等，此外，架构师还要经常审查和客户及市场人员所提出的需求，确认开发团队所提出的设计；<br />    (</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)在需求越来越明确后，架构师的关注点开始转移到组织开发团队成员和开发过程定义上；<br />    (</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)在软件设计阶段，架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计；<br />    (</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">)在编码阶段，架构师则成为详细设计者和代码编写者的顾问，并且经常性地要举行一些技术研讨会、技术培训班等；<br />    (</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">)随着软件开始测试、集成和交付，集成和测试支持将成为软件架构师的工作重点；<br />    (</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">)在软件维护开始时，软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。<br /> <br /><strong>软件架构师的要求</strong><br />      (</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)必须对开发技术非常了解，具有丰富的软件设计与开发经验，关键时候能对技术的选择作出及时、有效的决定。<br />      (</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)有良好的组织管理能力：沟通、领导、团队协作<br />      (</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)构件通信机制方面的知识:远程调用、JAVARMI、CORBA、COM</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">DCOM、各种标准的通信协议、网络服务、面对对象数据库、关系数据库等等<br /><br /><strong>成长为软件架构师的几个阶段：<br /></strong>     <font color="#ff0000"> </font><font color="#0000ff">(</font></span><font color="#0000ff"><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)构架师胚胎（程序员）：语言基础、设计基础、通信基础等，内容包括java、c、c</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">、uml、RUP、XML、socket通信（通信协议）<br />      (</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)构架师萌芽（高级程序员）：分布式系统组建等内容，包括分布式系统原理、ejb、corba、com</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">com</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">、webservice、网络计算机、高性能并发处理等<br />      (</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)构架师幼苗（设计师）：透彻掌握设计模式，包括设计模式（c</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">版本、java版本）、ejb设计模式、J2EE构架、UDDI、软件设计模式等。此期间，最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理</span></font><img src ="http://www.blogjava.net/alex/aggbug/71296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-09-22 13:14 <a href="http://www.blogjava.net/alex/archive/2006/09/22/71296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]开发人员间的效率差在哪里？</title><link>http://www.blogjava.net/alex/archive/2006/07/31/60975.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 31 Jul 2006 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/31/60975.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60975.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/31/60975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60975.html</trackback:ping><description><![CDATA[
		<div>熟练人员经过多年的积累加上自己的CodeSnip的总结，基本不用额外再查找资料。而一般的开发人员在开发过程中会花掉10-20%时间去查找资料。</div>
		<div>
				<br />
		</div>
		<div>熟练人员注意代码复用，并且时刻注意<b>重构和抽取公用代码</b>。一般开发人员是代码拷来拷去完成功能。</div>
		<div>
				<br />
		</div>
		<div>熟练人员非常注意查找，定位，标签等各种快捷键的使用，定位查找方便快捷，<b>IDE环境也根据习惯定义</b>到最方便状态。</div>
		<div>
				<br />
		</div>
		<div>熟练人员编码前先思<b>考清楚整个流程</b>，在头脑或纸张上规划好整个实现方式和方法函数的划分。一般人员想到哪里写到哪里。</div>
		<div>
				<br />
		</div>
		<div>熟练人员写了50行以上或更多代码才Debug一两次，一般人员写了几行代码就要Debug多次，完全通过Debug来验证代码正确性。</div>
		<div>
				<br />
		</div>
		<div>熟练人员注重代码的质量，<b>单元测试和可维护性</b>，注重各种业务逻辑的验证和边界条件的校验。一般人员只注重简单功能的简单完成。</div>
		<div>
				<br />
		</div>
		<div>熟练人员提交测试的代码BUG很少，返工工作量很小。一般开发人员由于自测不完善BUG较多，造成大量的返工工作量。</div>
		<div>
				<br />
		</div>
		<div>熟练人员合理分配自己的时间，<b>规划好每天工作任务</b>，开发过程各位专注。一般开发人员一心多用，边开发边聊Q。</div>
		<div>
				<br />
		</div>
		<div>熟练人员善于知识的总结和积累，<b>形成自我的知识库和经验库</b>。</div>
		<div>
				<br />
		</div>
		<div>熟练人员善于发现问题，分析不足而自我<b>持续改进</b>。一般人员在外力干预侠被动改进。</div>
		<div>
				<br />
		</div>
		<div>熟练开发人员开发重点已经专业到<b>对业务的深刻理解</b>，一般开发人员考虑的是开发上编程的语言和工具。</div>
		<div>
				<br />
		</div>
		<div>熟练人员善于从各种影响自己开发效率的因素中挤时间，<b>善于使用各种<font color="#ff9900">辅助</font>开发工具</b>。而一般人员则不善于这种总结。</div>
<img src ="http://www.blogjava.net/alex/aggbug/60975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-31 11:21 <a href="http://www.blogjava.net/alex/archive/2006/07/31/60975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]怎样成为优秀的软件模型设计者？</title><link>http://www.blogjava.net/alex/archive/2006/06/20/53981.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 20 Jun 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/06/20/53981.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/53981.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/06/20/53981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/53981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/53981.html</trackback:ping><description><![CDATA[原文地址 :<a href="http://blog.csdn.net/cyz1980/archive/2006/06/19/812297.aspx">这里</a><br /><br /> <strong><font size="4">怎样成为优秀的软件模型设计者？</font></strong><p><font size="4"><strong>                    </strong>来自：blog　  雪茶技术</font></p><p>我们期待自己成为一个优秀的软件模型设计者，但是，要怎样做，又从哪里开始呢？ </p><p>将下列原则应用到你的软件工程中，你会获得立杆见影的成果。 </p><p>1. 人远比技术重要 </p><p>你开发软件是为了供别人使用，没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平，因为他们
那时侯将主要精力都集中在技术上。显然，构件（components），EJB（Enterprise Java
Beans）和代理（agent）是很有趣的东西。但是对于用户来说，如果你设计的软件很难使用或者不能满足他们的需求，后台用再好的技术也于事无补。多
花点时间到软件需求和设计一个使用户能很容易理解的界面上。 </p><p>2. 理解你要实现的东西 </p><p><u>好的软件设计人员把大多数时间花费在建立系统模型上</u>，偶尔写一些源代码，但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。 </p><p>3. 谦虚是必须的品格 </p><p>你不可能知道一切，你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作，因为软件开发所用到的工具和技术是在不断更新的。而且，
一个人也不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说，每天可以学习很多新东西（如果
愿意的话）。 </p><p>4. 需求就是需求 </p><p>如果你没有任何需求，你就不要动手开发任何软件。<u>成功的软件取决于时间（在用户要求的时间内完成）、预算和是否满足用户的需求</u>。如果你不能确切知道用户需要的是什么，或者软件的需求定义，那么你的工程注定会失败。 </p><p>5. 需求其实很少改变，改变的是你对需求的理解 </p><p>Object ToolSmiths公司（<a href="http://www.objecttoolsmiths.com/">www.objecttoolsmiths.com</a>）
的Doug
Smith常喜欢说：“分析是一门科学，设计是一门艺术”。他的意思是说在众多的“正确”分析模型中只存在一个最“正确”分析模型可以完全满足解决某个具
体问题的需要（我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注）。 </p><p><u>如果需求经常改动，很可能是你没有作好需求分析，并不是需求真的改变了。</u></p><p><u>你可以抱怨用户不能告诉你他们想得到什么，但是不要忘记，收集需求信息是你工作。</u></p><p>你可以说是新来的开发人员把事情搞得一团糟，但是，你应该确定在工程的第一天就告诉他们应该做什么和怎样去做。 </p><p>如果你觉得公司不让你与用户充分接触，那只能说明公司的管理层并不是真正支持你的项目。 </p><p>你可以抱怨公司有关软件工程的管理制度不合理，但你必须了解大多同行公司是怎么做的。 </p><p>你可以借口说你们的竞争对手的成功是因为他们有了一个新的理念，但是为什么你没先想到呢？ </p><p>需求真正改变的情况很少，但是没有做好需求分析工作的理由却很多。 </p><p>6. 经常阅读 </p><p>在这个每日都在发生变化的产业中，你不可能在已取得的成就上陶醉太久。 </p><p><u>每个月至少读2、3本专业杂志或者1本专业书籍</u>。保持不落伍需要付出很多的时间和金钱，但会使你成为一个很有实力的竞争者。 </p><p>7. 降低软件模块间的耦合度 </p><p>高耦合度的系统是很难维护的。一处的修改引起另一处甚至更多处的变动。 </p><p><u>你可以通过以下方法降低程序的耦合度：隐藏实现细节，强制构件接口定义，不使用公用数据结构，不让应用程序直接操作数据库（我的经验法则是：当应用程序员在写SQL代码的时候，你的程序的耦合度就已经很高了）。</u></p><p>耦合度低的软件可以很容易被重用、维护和扩充。 </p><p>8. 提高软件的内聚性 </p><p>如果一个软件的模块只实现一个功能，那么该模块具有高内聚性。高内聚性的软件更容易维护和改进。 </p><p>判断一个模块是否有高的内聚性，<u>看一看你是否能够用一个简单的句子描述它的功能就行了。如果你用了一段话或者你需要使用类似“和”、“或”等连词，则说明你需要将该模块细化。<i>[注：only one]</i></u></p><p>只有高内聚性的模块才可能被重用。 </p><p>9. 考虑软件的移植性 </p><p>移植是软件开发中一项具体而又实际的工作，不要相信某些软件工具的广告宣传（比如java 的宣传口号write once run many ? 译者注）。 </p><p>即使仅仅对软件进行常规升级，也要把这看得和向另一个操作系统或数据库移植一样重要。 </p><p>记得从16位Windows移植到32位windows的“乐趣”吗 ？当你使用了某个操作系统的特性，如它的进程间通信(IPC)策略，或用某数据库专有语言写了存储过程。你的软件和那个特定的产品结合度就已经很高了。 </p><p>好的软件设计者把那些特有的实现细节打包隐藏起来，所以，当那些特性该变的时候，你的仅仅需要更新那个包就可以了。 </p><p>10. 接受变化 </p><p>这是一句老话了：唯一不变的只有变化。 </p><p>你应该将所有系统将可能发生的变化以及潜在需求记录下来,以便将来能够实现（参见“Architecting for Change”，Thinking Objectively, May 1999） </p><p>通过在建模期间考虑这些假设的情况，你就有可能开发出足够强壮且容易维护的软件。设计强壮的软件是你最基本的目标。 </p><p>11. 不要低估对软件规模的需求 </p><p>Internet 带给我们的最大的教训是你必须在软件开发的最初阶段就考虑软件规模的可扩充性。 </p><p>今天只有100人的部门使用的应用程序，明天可能会被有好几万人的组织使用，下月，通过因特网可能会有几百万人使用它。 </p><p>在软件设计的初期，根据在用例模型中定义的必须支持的基本事务处理，确定软件的基本功能。然后，在建造系统的时候再逐步加入比较常用的功能。 </p><p>在设计的开始考虑软件的规模需求，避免在用户群突然增大的情况下，重写软件。 </p><p>12. 性能仅仅是很多设计因素之一 </p><p>关注软件设计中的一个重要因素--性能，这好象也是用户最关心的事情。一个性能不佳的软件将不可避免被重写。 </p><p>但是你的设计还必须具有可靠性，可用性，便携性和可扩展性。你应该在工程开始就应该定义并区分好这些因素，以便在工作中恰当使用。性能可以是，也可以不是优先级最高的因素，我的观点是，给每个设计因素应有的考虑。 </p><p>13. 管理接口 </p><p>“UML User Guide”（Grady Booch，Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999）中指出，你应该在开发阶段的早期就定义软件模块之间的接口。 </p><p>这有助于你的开发人员全面理解软件的设计结构并取得一致意见，让各模块开发小组相对独立的工作。一旦模块的接口确定之后，模块怎样实现就不是很重要了。 </p><p>从根本上说，如果你不能够定义你的模块“从外部看上去会是什么样子”，你肯定也不清楚模块内要实现什么。 </p><p>14. 走近路需要更长的时间 </p><p>在软件开发中没有捷径可以走。 </p><p>缩短你的在需求分析上花的时间，结果只能是开发出来的软件不能满足用户的需求，必须被重写。 </p><p>在软件建模上每节省一周，在将来的编码阶段可能会多花几周时间，因为你在全面思考之前就动手写程序。 </p><p>你为了节省一天的测试时间而漏掉了一个bug，在将来的维护阶段，可能需要花几周甚至几个月的时间去修复。与其如此，还不如重新安排一下项目计划。 </p><p>避免走捷径，只做一次但要做对（do it once by doing it right）。 </p><p>15. 别信赖任何人 </p><p>产品和服务销售公司不是你的朋友，你的大部分员工和高层管理人员也不是。 </p><p>大部分产品供应商希望把你牢牢绑在他们的产品上，可能是操作系统，数据库或者某个开发工具。 </p><p>大部分的顾问和承包商只关心你的钱并不是你的工程（停止向他们付款，看一看他们会在周围呆多长时间）。 </p><p><u>大部分程序员认为他们自己比其他人更优秀，他们可能抛弃你设计的模型而用自己认为更好的</u>。 </p><p><b>只有良好的沟通才能解决这些问题</b>。 </p><p>要明确的是，不要只依靠一家产品或服务提供商，即使你的公司（或组织）已经在建模、文档和过程等方面向那个公司投入了很多钱。 </p><p>16. 证明你的设计在实践中可行 </p><p><b>在设计的时候应当先建立一个技术原型</b>， 或者称为“端到端”原型。以证明你的设计是能够工作的。 </p><p>你应该在开发工作的早期做这些事情，因为，如果软件的设计方案是不可行的，在编码实现阶段无论采取什么措施都于事无补。技术原型将证明你的设计的可行性，从而，你的设计将更容易获得支持。 </p><p>17. 应用已知的模式 </p><p>目前，我们有大量现成的分析和设计模式以及问题的解决方案可以使用。 </p><p>一般来说，好的模型设计和开发人员，都会避免重新设计已经成熟的并被广泛应用的东西。 <br /><a href="http://www.ambysoft.com/processPatternsPage.html">http://www.ambysoft.com/processPatternsPage.html</a> 收藏了许多开发模式的信息。 </p><p>18. 研究每个模型的长处和弱点 </p><p>目前有很多种类的模型可以使用,如下图所示。用例捕获的是系统行为需求，数据模型则描述支持一个系统运行所需要的数据构成。你可能会试图在用例中加
入实际数据描述，但是，这对开发者不是非常有用。同样，数据模型对描述软件需求来说是无用的。每个模型在你建模过程中有其相应的位置，但是，你需要明白在
什么地方，什么时候使用它们。 </p><p>19. 在现有任务中应用多个模型 </p><p><b><u>当你收集需求的时候，考虑使用用例模型，用户界面模型和领域级的类模型。 </u></b></p><p><b><u>当你设计软件的时候，应该考虑制作类模型，顺序图、状态图、协作图和最终的软件实际物理模型。</u></b></p><p>程序设计人员应该慢慢意识到，仅仅使用一个模型而实现的软件要么不能够很好地满足用户的需求，要么很难扩展。 </p><p>20. 教育你的听众 </p><p>你花了很大力气建立一个很成熟的系统模型，而你的听众却不能理解它们，甚至更糟－连为什么要先建立模型都不知道。那么你的工作是毫无意义的。 </p><p><u>教给你开发人员基本的建模知识；否则，他们会只看看你画的漂亮图表，然后继续编写不规范的程序。</u></p><p>另外， 你还需要告诉你的用户一些需求建模的基础知识。给他们解释你的用例(uses case)和用户界面模型，以使他们能够明白你要表达地东西。当每个人都能使用一个通用的设计语言的时候（比如UML-译者注），你的团队才能实现真正的合作。 </p><p>21. 带工具的傻瓜还是傻瓜 </p><p>你给我CAD/CAM工具，请我设计一座桥。但是，如果那座桥建成的话，我肯定不想当第一个从桥上过的人，因为我对建筑一窍不通。 </p><p>使用一个很优秀的CASE工具并不能使你成为一个建模专家，只能使你成为一个优秀CASE工具的使用者。成为一个优秀的建模专家需要多年的积累，不
会是一周针对某个价值几千美元工具的培训。一个优秀的CASE工具是很重要，但你必须学习使用它，并能够使用它设计它支持的模型。 </p><p>22. 理解完整的过程 </p><p>好的设计人员应该理解整个软件过程，尽管他们可能不是精通全部实现细节。 </p><p>软件开发是一个很复杂的过程，还记得《object-oriented software process》第36页的内容吗？除了编程、建模、测试等你擅长工作外，还有很多工作要做。 </p><p>好的设计者需要考虑全局。必须从长远考虑如何使软件满足用户需要，<i>如何提供维护和技术支持</i>等。 </p><p>23. 常做测试，早做测试 </p><p>如果测试对你的软件来说是无所谓的，那么你的软件多半也没什么必要被开发出来。 </p><p>建立一个技术原型供技术评审使用，以检验你的软件模型。 </p><p>在软件生命周期中，越晚发现的错误越难修改，修改成本越昂贵。尽可能早的做测试是很值得的。 </p><p>24. 把你的工作归档 </p><p>不值得归档的工作往往也不值得做。归档你的设想，以及根据设想做出的决定；归档软件模型中很重要但不很明显的部分。 <u>给每个模型一些概要描述以使别人很快明白模型所表达的内容</u>。 </p><p>25. <font color="#ff0000"><b>技术会变，基本原理不会</b></font></p><p>如果有人说“使用某种开发语言、某个工具或某某技术，我们就不需要再做需求分析，建模，编码或测试”。不要相信，这只说明他还缺乏经验。抛开技术和
人的因素，实际上软件开发的基本原理自20世纪70年代以来就没有改变过。你必须还定义需求，建模，编码，测试，配置，面对风险，发布产品，管理工作人员
等等。 </p><p>软件建模技术是需要多年的实际工作才能完全掌握的。好在你可以从我的建议开始，完善你们自己的软件开发经验。 </p><p>以鸡汤开始，加入自己的蔬菜。然后，开始享受你自己的丰盛晚餐吧。</p><img src ="http://www.blogjava.net/alex/aggbug/53981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-06-20 14:28 <a href="http://www.blogjava.net/alex/archive/2006/06/20/53981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>