﻿<?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>IT博客-醉意的未来-文章分类-项目开发技术</title><link>http://www.cnitblog.com/kenlen/category/1246.html</link><description>路漫漫其修远兮，吾将上下而求索！&lt;br&gt;
&lt;b&gt;For things to change, first I must change!&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 28 Sep 2011 07:08:19 GMT</lastBuildDate><pubDate>Wed, 28 Sep 2011 07:08:19 GMT</pubDate><ttl>60</ttl><item><title>[转]需求分析的20条法则 </title><link>http://www.cnitblog.com/kenlen/articles/4692.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Sat, 19 Nov 2005 07:54:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/4692.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/4692.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/4692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/4692.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/4692.html</trackback:ping><description><![CDATA[<P>尤其关于最后一部分－－＂需求确认＂的解说，　虽然简短，却一语道破</P>
<P>作为一个入门者，受益非浅</P>
<P></P>
<HR>

<P></P>
<P>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<DIV class=subhead><B>需求分析的20条法则</B></DIV></TD></TR>
<TR>
<TD vAlign=top>
<DIV class=content>对商业用户来说，他们后面是成百上千个供应商，前面是成千上万个消费顾客。怎样利用软件管理错综复杂的供应商和消费顾客，如何做好精细到一个小小调料包的进、销、调、存的商品流通工作，这些都是商业企业需要信息管理系统的理由。软件开发的意义也就在于此。而弄清商业用户如此复杂需求的真面目，正是软件开发成功的关键所在。 <BR>　　经理：“我们要建立一套完整的商业管理软件系统，包括商品的进、销、调、存管理，是总部-门店的连锁经营模式。通过通信手段门店自动订货，供应商自动结算，卖场通过扫条码实现销售，管理人员能够随时查询门店商品销售和库存情况。另外，我们也得为政府部门提供关于商品营运的报告。”<BR>　　分析员：“我已经明白这个项目的大体结构框架，这非常重要，但在制定计划之前，我们必须收集一些需求。” <BR>　　经理觉得奇怪：“我不是刚告诉你我的需求了吗？” <BR>　　分析员：“实际上，您只说明了整个项目的概念和目标。这些高层次的业务需求不足以提供开发的内容和时间。我需要与实际将要使用系统的业务人员进行讨论，然后才能真正明白达到业务目标所需功能和用户要求，了解清楚后，才可以发现哪些是现有组件即可实现的，哪些是需要开发的，这样可节省很多时间。” <BR>　　经理：“业务人员都在招商。他们非常忙，没有时间与你们详细讨论各种细节。你能不能说明一下你们现有的系统？” <BR>　　分析员尽量解释从用户处收集需求的合理性：“如果我们只是凭空猜想用户的要求，结果不会令人满意。我们只是软件开发人员，而不是采购专家、营运专家或是财务专家，我们并不真正明白您这个企业内部运营需要做些什么。我曾经尝试过，未真正明白这些问题就开始编码，结果没有人对产品满意。” <BR>　　经理坚持道：“行了，行了，我们没有那么多的时间。让我来告诉您我们的需求。实际上我也很忙。请马上开始开发，并随时将你们的进展情况告诉我。” <BR><FONT color=#ff0000>风险躲在需求的迷雾之后 </FONT><BR>　　以上我们看到的是某客户项目经理与系统开发小组的分析人员讨论业务需求。在项目开发中，所有的项目风险承担者都对需求分析阶段备感兴趣。这里所指的风险承担者包括客户方面的项目负责人和用户，开发方面的需求分析人员和项目管理者。这部分工作做得到位，能开发出很优秀的软件产品，同时也会令客户满意。若处理不好，则会导致误解、挫折、障碍以及潜在的质量和业务价值上的威胁。因此可见——需求分析奠定了软件工程和项目管理的基础。 <BR><FONT color=#ff0000>拨开需求分析的迷雾 </FONT><BR>　　像这样的对话经常出现在软件开发的过程中。客户项目经理的需求对分析人员来讲，像“雾里看花”般模糊并令开发者感到困惑。那么，我们就拨开雾影，分析一下需求的具体内容：<BR>　　·业务需求——反映了组织机构或客户对系统、产品高层次的目标要求，通常在项目定义与范围文档中予以说明。 <BR>　　·用户需求——描述了用户使用产品必须要完成的任务，这在使用实例或方案脚本中予以说明。 <BR>　　·功能需求——定义了开发人员必须实现的软件功能，使用户利用系统能够完成他们的任务，从而满足了业务需求。 <BR>　　·非功能性的需求——描述了系统展现给用户的行为和执行的操作等，它包括产品必须遵从的标准、规范和约束，操作界面的具体细节和构造上的限制。 <BR>　　·需求分析报告——报告所说明的功能需求充分描述了软件系统所应具有的外部行为。“需求分析报告”在开发、测试、质量保证、项目管理以及相关项目功能中起着重要作用。 <BR>　　前面提到的客户项目经理通常阐明产品的高层次概念和主要业务内容，为后继工作建立了一个指导性的框架。其他任何说明都应遵循“业务需求”的规定，然而“业务需求”并不能为开发人员提供开发所需的许多细节说明。 <BR>　　下一层次需求——用户需求，必须从使用产品的用户处收集。因此，这些用户构成了另一种软件客户，他们清楚要使用该产品完成什么任务和一些非功能性的特性需求。例如：程序的易用性、健壮性和可靠性，而这些特性将会使用户很好地接受具有该特点的软件产品。 <BR>　　经理层有时试图代替实际用户说话，但通常他们无法准确说明“用户需求”。用户需求来自产品的真正使用者，必须让实际用户参与到收集需求的过程中。如果不这样做，产品很可能会因缺乏足够的信息而遗留不少隐患。 <BR>　　在实际需求分析过程中，以上两种客户可能都觉得没有时间与需求分析人员讨论，有时客户还希望分析人员无须讨论和编写需求说明就能说出用户的需求。除非遇到的需求极为简单；否则不能这样做。如果您的组织希望软件成功，那么必须要花上数天时间来消除需求中模糊不清的地方和一些使开发者感到困惑的方面。 <BR>　　优秀的软件产品建立在优秀的需求基础之上，而优秀的需求源于客户与开发人员之间有效的交流和合作。只有双方参与者都明白自己需要什么、成功的合作需要什么时，才能建立起一种良好的合作关系。 <BR>　　由于项目的压力与日俱增，所有项目风险承担者有着一个共同目标，那就是大家都想开发出一个既能实现商业价值又能满足用户要求，还能使开发者感到满足的优秀软件产品。 <BR><FONT color=#ff0000>客户的需求观 </FONT><BR>　　客户与开发人员交流需要好的方法。下面建议20条法则，客户和开发人员可以通过评审以下内容并达成共识。如果遇到分歧，将通过协商达成对各自义务的相互理解，以便减少以后的磨擦（如一方要求而另一方不愿意或不能够满足要求）。 <BR><FONT color=#0000ff>1、 分析人员要使用符合客户语言习惯的表达 </FONT><BR>　　需求讨论集中于业务需求和任务，因此要使用术语。客户应将有关术语（例如：采价、印花商品等采购术语）教给分析人员，而客户不一定要懂得计算机行业的术语。 <BR><FONT color=#0000ff>2、分析人员要了解客户的业务及目标 </FONT><BR>　　只有分析人员更好地了解客户的业务，才能使产品更好地满足需要。这将有助于开发人员设计出真正满足客户需要并达到期望的优秀软件。为帮助开发和分析人员，客户可以考虑邀请他们观察自己的工作流程。如果是切换新系统，那么开发和分析人员应使用一下目前的旧系统，有利于他们明白目前系统是怎样工作的，其流程情况以及可供改进之处。s <FONT color=#0000ff>3、 分析人员必须编写软件需求报告 </FONT><BR>　　分析人员应将从客户那里获得的所有信息进行整理，以区分业务需求及规范、功能需求、质量目标、解决方法和其他信息。通过这些分析，客户就能得到一份“需求分析报告”，此份报告使开发人员和客户之间针对要开发的产品内容达成协议。报告应以一种客户认为易于翻阅和理解的方式组织编写。客户要评审此报告，以确保报告内容准确完整地表达其需求。一份高质量的“需求分析报告”有助于开发人员开发出真正需要的产品。 <BR><FONT color=#0000ff>4、 要求得到需求工作结果的解释说明 </FONT><BR>　　分析人员可能采用了多种图表作为文字性“需求分析报告”的补充说明，因为工作图表能很清晰地描述出系统行为的某些方面，所以报告中各种图表有着极高的价值；虽然它们不太难于理解，但是客户可能对此并不熟悉，因此客户可以要求分析人员解释说明每个图表的作用、符号的意义和需求开发工作的结果，以及怎样检查图表有无错误及不一致等。 <BR><FONT color=#0000ff>5、 开发人员要尊重客户的意见 </FONT><BR>　　如果用户与开发人员之间不能相互理解，那关于需求的讨论将会有障碍。共同合作能使大家“兼听则明”。参与需求开发过程的客户有权要求开发人员尊重他们并珍惜他们为项目成功所付出的时间，同样，客户也应对开发人员为项目成功这一共同目标所做出的努力表示尊重。 <BR><FONT color=#0000ff>6、 开发人员要对需求及产品实施提出建议和解决方案 </FONT><BR>　　通常客户所说的“需求”已经是一种实际可行的实施方案，分析人员应尽力从这些解决方法中了解真正的业务需求，同时还应找出已有系统与当前业务不符之处，以确保产品不会无效或低效；在彻底弄清业务领域内的事情后，分析人员就能提出相当好的改进方法，有经验且有创造力的分析人员还能提出增加一些用户没有发现的很有价值的系统特性。 <BR><FONT color=#0000ff>7、 描述产品使用特性 </FONT><BR>　　客户可以要求分析人员在实现功能需求的同时还注意软件的易用性，因为这些易用特性或质量属性能使客户更准确、高效地完成任务。例如：客户有时要求产品要“界面友好”或“健壮”或“高效率”，但对于开发人员来讲，太主观了并无实用价值。正确的做法是，分析人员通过询问和调查了解客户所要的“友好、健壮、高效所包含的具体特性，具体分析哪些特性对哪些特性有负面影响，在性能代价和所提出解决方案的预期利益之间做出权衡，以确保做出合理的取舍。 <BR><FONT color=#0000ff>8、 允许重用已有的软件组件 </FONT><BR>　　需求通常有一定灵活性，分析人员可能发现已有的某个软件组件与客户描述的需求很相符，在这种情况下，分析人员应提供一些修改需求的选择以便开发人员能够降低新系统的开发成本和节省时间，而不必严格按原有的需求说明开发。所以说，如果想在产品中使用一些已有的商业常用组件，而它们并不完全适合您所需的特性，这时一定程度上的需求灵活性就显得极为重要了。 <BR><FONT color=#0000ff>9、 要求对变更的代价提供真实可靠的评估 </FONT><BR>　　有时，人们面临更好、也更昂贵的方案时，会做出不同的选择。而这时，对需求变更的影响进行评估从而对业务决策提供帮助，是十分必要的。所以，客户有权利要求开发人员通过分析给出一个真实可信的评估，包括影响、成本和得失等。开发人员不能由于不想实施变更而随意夸大评估成本。 <BR><FONT color=#0000ff>10、 获得满足客户功能和质量要求的系统 </FONT><BR>　　每个人都希望项目成功，但这不仅要求客户要清晰地告知开发人员关于系统“做什么”所需的所有信息，而且还要求开发人员能通过交流了解清楚取舍与限制，一定要明确说明您的假设和潜在的期望，否则，开发人员开发出的产品很可能无法让您满意。 <BR><FONT color=#0000ff>11、 给分析人员讲解您的业务 </FONT><BR>　　分析人员要依靠客户讲解业务概念及术语，但客户不能指望分析人员会成为该领域的专家，而只能让他们明白您的问题和目标；不要期望分析人员能把握客户业务的细微潜在之处，他们可能不知道那些对于客户来说理所当然的“常识”。 <BR><FONT color=#0000ff>12、 抽出时间清楚地说明并完善需求 </FONT><BR>　　客户很忙，但无论如何客户有必要抽出时间参与“头脑高峰会议”的讨论，接受采访或其他获取需求的活动。有些分析人员可能先明白了您的观点，而过后发现还需要您的讲解，这时请耐心对待一些需求和需求的精化工作过程中的反复，因为它是人们交流中很自然的现象，何况这对软件产品的成功极为重要。 <BR><FONT color=#0000ff>13、 准确而详细地说明需求 </FONT><BR>　　编写一份清晰、准确的需求文档是很困难的。由于处理细节问题不但烦人而且耗时，因此很容易留下模糊不清的需求。但是在开发过程中，必须解决这种模糊性和不准确性，而客户恰恰是为解决这些问题作出决定的最佳人选，否则，就只好靠开发人员去正确猜测了。 <BR>　　在需求分析中暂时加上“待定”标志是个方法。用该标志可指明哪些是需要进一步讨论、分析或增加信息的地方，有时也可能因为某个特殊需求难以解决或没有人愿意处理它而标注上“待定”。客户要尽量将每项需求的内容都阐述清楚，以便分析人员能准确地将它们写进“软件需求报告”中去。如果客户一时不能准确表达，通常就要求用原型技术，通过原型开发，客户可以同开发人员一起反复修改，不断完善需求定义。 <BR><FONT color=#0000ff>14、 及时作出决定 </FONT><BR>　　分析人员会要求客户作出一些选择和决定，这些决定包括来自多个用户提出的处理方法或在质量特性冲突和信息准确度中选择折衷方案等。有权作出决定的客户必须积极地对待这一切，尽快做处理，做决定，因为开发人员通常只有等客户做出决定才能行动，而这种等待会延误项目的进展。 <BR><FONT color=#0000ff>15、 尊重开发人员的需求可行性及成本评估 </FONT><BR>　　所有的软件功能都有其成本。客户所希望的某些产品特性可能在技术上行不通，或者实现它要付出极高的代价，而某些需求试图达到在操作环境中不可能达到的性能，或试图得到一些根本得不到的数据。开发人员会对此作出负面的评价，客户应该尊重他们的意见。 <BR><FONT color=#0000ff>16、 划分需求的优先级 </FONT><BR>　　绝大多数项目没有足够的时间或资源实现功能性的每个细节。决定哪些特性是必要的，哪些是重要的，是需求开发的主要部分，这只能由客户负责设定需求优先级，因为开发者不可能按照客户的观点决定需求优先级；开发人员将为您确定优先级提供有关每个需求的花费和风险的信息。 <BR>　　在时间和资源限制下，关于所需特性能否完成或完成多少应尊重开发人员的意见。尽管没有人愿意看到自己所希望的需求在项目中未被实现，但毕竟是要面对现实，业务决策有时不得不依据优先级来缩小项目范围或延长工期，或增加资源，或在质量上寻找折衷。 <BR><FONT color=#0000ff>17、 评审需求文档和原型 </FONT><BR>　　客户评审需求文档，是给分析人员带来反馈信息的一个机会。如果客户认为编写的“需求分析报告”不够准确，就有必要尽早告知分析人员并为改进提供建议。 <BR>　　更好的办法是先为产品开发一个原型。这样客户就能提供更有价值的反馈信息给开发人员，使他们更好地理解您的需求；原型并非是一个实际应用产品，但开发人员能将其转化、扩充成功能齐全的系统。 <BR><FONT color=#0000ff>18、 需求变更要立即联系 </FONT><BR>　　不断的需求变更，会给在预定计划内完成的质量产品带来严重的不利影响。变更是不可避免的，但在开发周期中，变更越在晚期出现，其影响越大；变更不仅会导致代价极高的返工，而且工期将被延误，特别是在大体结构已完成后又需要增加新特性时。所以，一旦客户发现需要变更需求时，请立即通知分析人员。 <BR><FONT color=#0000ff>19、 遵照开发小组处理需求变更的过程 </FONT><BR>　　为将变更带来的负面影响减少到最低限度，所有参与者必须遵照项目变更控制过程。这要求不放弃所有提出的变更，对每项要求的变更进行分析、综合考虑，最后做出合适的决策，以确定应将哪些变更引入项目中。 <BR><FONT color=#0000ff>20、 尊重开发人员采用的需求分析过程 </FONT><BR>　　软件开发中最具挑战性的莫过于收集需求并确定其正确性，分析人员采用的方法有其合理性。也许客户认为收集需求的过程不太划算，但请相信花在需求开发上的时间是非常有价值的；如果您理解并支持分析人员为收集、编写需求文档和确保其质量所采用的技术，那么整个过程将会更为顺利。 <BR><FONT color=#ff0000>“需求确认”意味着什么 </FONT><BR>　　在“需求分析报告”上签字确认，通常被认为是客户同意需求分析的标志行为，然而实际操作中，客户往往把“签字”看作是毫无意义的事情。“他们要我在需求文档的最后一行下面签名，于是我就签了，否则这些开发人员不开始编码。” <BR>　　这种态度将带来麻烦，譬如客户想更改需求或对产品不满时就会说：“不错，我是在需求分析报告上签了字，但我并没有时间去读完所有的内容，我是相信你们的，是你们非让我签字的。” <BR>　　同样问题也会发生在仅把“签字确认”看作是完成任务的分析人员身上，一旦有需求变更出现，他便指着“需求分析报告”说：“您已经在需求上签字了，所以这些就是我们所开发的，如果您想要别的什么，您应早些告诉我们。” <BR>　　这两种态度都是不对的。因为不可能在项目的早期就了解所有的需求，而且毫无疑问地需求将会出现变更，在“需求分析报告”上签字确认是终止需求分析过程的正确方法，所以我们必须明白签字意味着什么。 <BR>　　对“需求分析报告”的签名是建立在一个需求协议的基线上，因此我们对签名应该这样理解：“我同意这份需求文档表述了我们对项目软件需求的了解，进一步的变更可在此基线上通过项目定义的变更过程来进行。我知道变更可能会使我们重新协商成本、资源和项目阶段任务等事宜。”对需求分析达成一定的共识会使双方易于忍受将来的摩擦，这些摩擦来源于项目的改进和需求的误差或市场和业务的新要求等。 <BR>　　需求确认将迷雾拨散，显现需求的真面目，给初步的需求开发工作画上了双方都明确的句号，并有助于形成一个持续良好的客户与开发人员的关系，为项目的成功奠定了坚实的基础。</DIV></TD></TR></TBODY></TABLE></P><img src ="http://www.cnitblog.com/kenlen/aggbug/4692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-19 15:54 <a href="http://www.cnitblog.com/kenlen/articles/4692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个项目经理的一些个人体会</title><link>http://www.cnitblog.com/kenlen/articles/4404.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Sat, 12 Nov 2005 13:58:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/4404.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/4404.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/4404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/4404.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/4404.html</trackback:ping><description><![CDATA[<P dir=ltr style="MARGIN-RIGHT: 0px" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本人做项目经理工作多年，感到做这个工作最要紧的就是要明白什么是因地制宜、因势利导，只有最合适的，没有什么叫对的，什么叫错的，项目经理最忌讳的就是完美主义倾向，尤其是做技术人员出身的，喜欢寻找标准答案，耽误了工作进度，也迷茫了自己。以下是本人一些做项目的个人体会，写出来供大家指点，在讨论过程中共同提高水平。<BR>　 项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候，首先要尽可能地多从各个方面了解项目的情况，如：<BR>　　<BR>　　 1.这个项目是什么项目，具体大概做什么事情，是谁提出来的，目的是解决什么问题。在国内很多客户都很不成熟的情况下，千万不要根据项目的名称望文生义地去想象项目的目标。一个名为“办公自动化”的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算机生产管理辅助信息系统系统。前期了解情况的工作越详细，后面的惊讶就越少，项目的风险就越小。<BR>　　<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.这个项目里牵涉哪些方面的人，如投资方、具体业务干系方、项目建成后的运营方、技术监督方等等，很多项目里除了业主单位的结构很复杂以外，还有一些其他单位也会牵涉进来，如项目监理公司、业主的行业主管机构等。项目经理需要了解每个方面的人对这个项目的看法和期望是什么。事先了解各个方面的看法和期望，可以让你在做项目碰到问题的时候，就每件事情分析哪些人会在什么方面支持你，哪些人会出于什么目的反对你，从而提前准备联合朋友去对抗敌人，让事情向你所希望的方向发展。没有永远的朋友，也没有永远的敌人，只有一致的利益，这句话作为项目经理是一定要记住的；<BR>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.基本了解了客户的情况后，下面的事情就是了解自己公司各方面对这个项目的看法。首先是高层领导是否重视，这个决定了你在需要资源的时候，公司是否会根据你的要求提供最有力的支持。领导口头肯定是说支持的，你需要做的是了解公司对这个项目的实际期望，是想把项目越做越大还是想赚钱？是想做样板工程还是干脆想敷衍了事，公司领导对项目的态度决定了你做这个项目的战略，而这个战略方针将对你做项目计划产生直接的影响；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.在做整体项目计划前，还要大致计算一下你手上的资源。首先是时间，现在市场竞争激烈，往往很多项目要求在几乎不可能的时间范围里完成。对于这一点，你在做项目的风险控制计划的时候要充分考虑。其次是人员，根据项目预算和已往经验，大致计算一下未来的项目小组有多少种角色，每个角色目前公司是否有人，是否能完全归这个项目使用，是否需要另外招聘一些人员，招聘的准备工作要尽早启动。最后就是一些设备的准备，项目所需大件关键设备要尽早预定，以后不管发生设备等人还是人等设备的情况，浪费的都是你的时间；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.现在是做项目说明书的时候了。一份好的项目说明书不仅将要做的事情描述得很清楚（主要是讲做什么，而不是说怎么做），而且把如何检查也说明得很透彻。也就是说它不仅说明白了要做哪些事情，也让客户的业务人员（一般不懂技术）知道项目做成什么样就算完成了。简单地说，项目说明书描述项目做哪些事情和每件事情做到什么程度以及如何检查每一个结果。<BR>　　6. 是到做总体计划的时间了吗？不，你现在已经知道了客户的目标和你手上的资源，那么做计划以前，你还需要和你的经理和客户充分沟通资源的问题。因为很多资源是还不明确的，你需要写一份报告，详细分析这个项目的风险以及对资源的需求情况。如果一些问题不能得到解决的话，将发生什么样的后果。如果资源不够，就要高层改变策略，增加对这个项目的投入。甚至在条件许可的情况下，有些公司会放弃这个项目。总之，没有人能完成一个不可能完成的任务，如果项目经理不能尽早发现风险，那么就只能去当烈士了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.明白了要做哪些事情和你手上的筹码以及你做这个项目的总体策略，现在是成立项目小组的时候了。很多项目经理都没有自己选择组员的权利，那么，就尽量发挥你的影响力去寻找那些你想要的人吧。成员的组成根据项目不同，相差较大，很难有什么具体要求，但是，一定要有精通客户业务的人，很多小项目里，这个人就是项目经理本人，大项目里会配备行业专家（Industry expert），这样和客户沟通起来才不会鸡同鸭讲，双方才可以相互理解。我经常看到的情况是我们的技术人员和客户交谈时满口的专业术语，结果搞得客户一头雾水，反过来，他还指责客户不懂技术。其实，明白自己想做什么的客户已经是很好的客户了，不知道自己要做什么，更不懂怎么做还要指手画脚的客户到处存在，但是要明白，是客户选择了你，而不是你选择了客户，有了客户你才有工资拿，心平气和一点吧；<BR>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.好了，做了很多前期工作，定义了一些游戏规则，现在是坐下来做计划的时候了。这一节，任意找一本项目管理的书都会说得比我好，所以我就少写一点，说一些自己的体会就是了。首先是找几个关键组员，比如客户业务专家、系统分析员等等，做一下项目模块划分工作。项目分成几块去做，每一块完成什么，模块之间的信息如何交换等等。需求定义的是做什么的问题，而这里说的是怎么做的问题。这里要强调一点：完成一个目标有很多种方式，你要选一种你最熟悉的，而不是看上去最完美的，这个思路会让你的项目减少很多风险。有时候客户会被某种新技术打动，坚持要你采用那种新技术，你就应该告诉他：你选我做这个项目，就应该容许我采用自己最喜欢的方式做事情，新技术之所以有诱惑力，就是因为吃亏的人还不多，我不希望你成为第一批受害者。采用一个计划会让你的工作更加明确，比如用微软的Project软件，你填写完表格以后，就可以知道这个项目有多少件事情要做，每件事情需要什么资源，他们之间的前后关系如何，消耗的时间有多长，完成后有什么标志等。所有的结果最后用一个叫做干特图的形式表现出来。你做完这个表以后会惊奇地发现，干特图上项目的结束时间会远远落后于你的计划结束时间（签合同的人永远不会先征求你的意见的）。当然，学过项目管理的人会大谈什么WBS、优化路径之类的东西，但是我的经验是你再优化也不可能把这些东西安排到计划的时间结束。如果你没碰到这个问题，在我恭喜你挑了一个轻松活之前，请你再去确认你是否罗列了所有要做的事情和正确评估了他们所需要的时间。这时候，你就要考虑牺牲一些任务的时间（也意味着质量）了。按照什么标准牺牲？这个项目的战略！我们在第三节提到过的战略。我的经验是如果你什么都赶进度，其结果可能就是十件事情你一件也没做好，想想多么失败啊。所以，把资源投到你熟悉和有把握的事情上，最后的结果是十件事情，你有三件做成了精品，三件完成，还有四件因为某些原因延误，成绩单是否靓丽了很多呢？战略决定优先级，而正确排列事情的优先级是一个项目经理能力的主要体现。<BR></P><img src ="http://www.cnitblog.com/kenlen/aggbug/4404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-12 21:58 <a href="http://www.cnitblog.com/kenlen/articles/4404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员应具备的素质 </title><link>http://www.cnitblog.com/kenlen/articles/4328.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Fri, 11 Nov 2005 05:22:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/4328.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/4328.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/4328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/4328.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/4328.html</trackback:ping><description><![CDATA[<DT>程序员应具备的素质 
<DD class=ArticleInfo>2005.06.27&nbsp;&nbsp;来自：csdn blog&nbsp;&nbsp;阿庙的专栏 
<DD class=ArticleContent>
<TABLE style="FLOAT: left; MARGIN: 0px 10px 10px" cellSpacing=0 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD>
<SCRIPT type=text/javascript>
						<!--
						csdn_AD_Position_GroupID = "{e025b96b-2fda-4e82-84ef-3e0772838ed3}";
						csdn_AD_Page_Url = document.location;
						csdn_AD_CurrPage_CharSet = "gb2312";
						//-->
						</SCRIPT>

<SCRIPT src="http://ggmm.csdn.net/AD/Show_JavaScript_AD.js" type=text/javascript></SCRIPT>

<SCRIPT src="http://news.csdn.net/ad/news_textlink.js" type=text/javascript></SCRIPT>
</TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P>中国有很多精于编码的人，但是中国软件行业，尤其是网络应用开发方面误区很大，很难形成有规模的软件开发力量和产品能力，不但比美国差距甚远，和印度相比也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况，也不是在于国家和民间对开发的投入程度，而是很大程度上，有一些对技术，对程序开发，对项目设计方面的思想误区，这些误区，导致了软件行业的产品化能力不足，缺乏规模化和大型复用系统研发能力，可以说，改变认识误区，是解决软件行业小作坊模式和个体英雄模式所带来的局限性的重要工作。 </P>
<P><BR>程序员是一种技术工作，在IT的发展中有相当重要的地位，从底层硬件通讯协议的建立，到数据传输层的处理，到操作系统的建设，到数据库平台的建设，一直到应用层上各种数据营销平台的搭建，程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大的贡献。 </P>
<P>中国有很多小朋友，他们18,9岁或21,2岁，通过自学也写了不少代码，他们有的代码写的很漂亮，一些技术细节相当出众，也很有钻研精神，但是他们被一些错误的认识和观点左右，缺乏对系统，对程序的整体理解能力，这些人，一个网上的朋友说得很好，他们实际上只是一些Codingfans，压根没有资格称为程序员，但是据我所知，不少小网络公司的CTO就是这样的codingfans,拿着吓人的工资，做着吓人的项目，项目的结局通常也很吓人。 <BR>程序员基本素质： </P>
<P>作一个真正合格的程序员，或者说就是可以真正合格完成一些代码工作的程序员，应该具有的素质。 </P>
<P>1：团队精神和协作能力 <BR>把它作为基本素质，并不是不重要，恰恰相反，这是程序员应该具备的最基本的，也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语，任何个人的力量都是有限的，即便如linus这样的天才，也需要通过组成强大的团队来创造奇迹，那些遍布全球的为linux写核心的高手们，没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财，但是一旦进入一些大系统的研发团队，进入商业化和产品化的开发任务，缺乏这种素质的人就完全不合格了。 </P>
<P>2：文档习惯 <BR>说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子，良好的文档是正规研发流程中非常重要的环节，作为代码程序员，30％的工作时间写技术文档是很正常的，而作为高级程序员和系统分析员，这个比例还要高很多。缺乏文档，一个软件系统就缺乏生命力，在未来的查错，升级以及模块的复用时就都会遇到极大的麻烦。 </P>
<P>3：规范化，标准化的代码编写习惯 <BR>作为一些外国知名软件公司的规矩，代码的变量命名，代码内注释格式，甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定，良好的编写习惯，不但有助于代码的移植和纠错，也有助于不同技术人员之间的协作。 <BR>有些codingfans叫嚣高水平程序员写的代码旁人从来看不懂，这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性，是程序员基本的素质需求。 <BR>再看看整个linux的搭建，没有规范化和标准化的代码习惯，全球的研发协作是绝对不可想象的。 <BR>4：需求理解能力 <BR>程序员需要理解一个模块的需求，很多小朋友写程序往往只关注一个功能需求，他们把性能指标全部归结到硬件，操作系统和开发环境上，而忽视了本身代码的性能考虑，有人曾经放言说写一个广告交换程序很简单，这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的，对于这样的程序员，你给他深蓝那套系统，他也做不出太极链的并访能力。性能需求指标中，稳定性，并访支撑能力以及安全性都很重要，作为程序员需要评估该模块在系统运营中所处的环境，将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点，一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。 </P>
<P>5：复用性，模块化思维能力 <BR>经常可以听到一些程序员有这样的抱怨，写了几年程序，变成了熟练工，每天都是重复写一些没有任何新意的代码，这其实是中国软件人才最大浪费的地方，一些重复性工作变成了熟练程序员的主要工作，而这些，其实是完全可以避免的。 <BR>复用性设计，模块化思维就是要程序员在完成任何一个功能模块或函数的时候，要多想一些，不要局限在完成当前任务的简单思路上，想想看该模块是否可以脱离这个系统存在，是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用，这样就能极大避免重复性的开发工作，如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题，那么程序员就不会在重复性的工作中耽误太多时间，就会有更多时间和精力投入到创新的代码工作中去。 <BR>一些好的程序模块代码，即便是70年代写成的，拿到现在放到一些系统里面作为功能模块都能适合的很好，而现在我看到的是，很多小公司软件一升级或改进就动辄全部代码重写，大部分重复性工作无谓的浪费了时间和精力。 </P>
<P>6：测试习惯 <BR>作为一些商业化正规化的开发而言，专职的测试工程师是不可少的，但是并不是说有了专职的测试工程师程序员就可以不进行自测；软件研发作为一项工程而言，一个很重要的特点就是问题发现的越早，解决的代价就越低，程序员在每段代码，每个子模块完成后进行认真的测试，就可以尽量将一些潜在的问题最早的发现和解决，这样对整体系统建设的效率和可靠性就有了最大的保证。 <BR>测试工作实际上需要考虑两方面，一方面是正常调用的测试，也就是看程序是否能在正常调用下完成基本功能，这是最基本的测试职责，可惜在很多公司这成了唯一的测试任务，实际上还差的远那；第二方面就是异常调用的测试，比如高压力负荷下的稳定性测试，用户潜在的异常输入情况下的测试，整体系统局部故障情况下该模块受影响状况的测试，频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试，但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求，有针对性的进行相关测试，并尽早发现和解决问题，当然这需要上面提到的需求理解能力。 </P>
<P>7：学习和总结的能力 <BR>程序员是人才很容易被淘汰，很容易落伍的职业，因为一种技术可能仅仅在三两年内具有领先性，程序员如果想安身立命，就必须不断跟进新的技术，学习新的技能。 <BR>善于学习，对于任何职业而言，都是前进所必需的动力，对于程序员，这种要求就更加高了。但是学习也要找对目标，一些小codingfans们，他们也津津乐道于他们的学习能力，一会学会了asp，一会儿学会了php，一会儿学会了jsp，他们把这个作为炫耀的资本，盲目的追逐一些肤浅的，表面的东西和名词，做网络程序不懂通讯传输协议，做应用程序不懂中断向量处理，这样的技术人员，不管掌握了多少所谓的新语言，永远不会有质的提高。 <BR>善于总结，也是学习能力的一种体现，每次完成一个研发任务，完成一段代码，都应当有目的的跟踪该程序的应用状况和用户反馈，随时总结，找到自己的不足，这样逐步提高，一个程序员才可能成长起来。 <BR>一个不具备成长性的程序员，即便眼前看是个高手，建议也不要选用，因为他落伍的时候马上就到了。 <BR>具备以上全部素质的人，应当说是够格的程序员了，请注意以上的各种素质都不是由IQ决定的，也不是大学某些课本里可以学习到的，需要的仅仅是程序员对自己工作的认识，是一种意识上的问题。</P></DD><img src ="http://www.cnitblog.com/kenlen/aggbug/4328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-11 13:22 <a href="http://www.cnitblog.com/kenlen/articles/4328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSS新手入门</title><link>http://www.cnitblog.com/kenlen/articles/4031.html</link><dc:creator>Kenlen</dc:creator><author>Kenlen</author><pubDate>Sun, 06 Nov 2005 08:33:00 GMT</pubDate><guid>http://www.cnitblog.com/kenlen/articles/4031.html</guid><wfw:comment>http://www.cnitblog.com/kenlen/comments/4031.html</wfw:comment><comments>http://www.cnitblog.com/kenlen/articles/4031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/kenlen/comments/commentRss/4031.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/kenlen/services/trackbacks/4031.html</trackback:ping><description><![CDATA[<TABLE height="100%" cellSpacing=10 cellPadding=0 width="100%" align=center bgColor=#ffffff border=0>
<TBODY>
<TR vAlign=center bgColor=#00ccff>
<TD colSpan=2 height=20>在以前，我们通常采用2种方法使用样式表</TD></TR>
<TR vAlign=center>
<TD width="25%" height=20>
<DIV align=left><STRONG>1.1 页面内嵌法</STRONG></DIV></TD>
<TD width="25%" height=20><STRONG>1.2 外部调用法</STRONG></TD></TR>
<TR vAlign=top align=left>
<TD>就是将样式表直接写在页面代码的head区。类似这样：<BR>&lt;style type="text/css"&gt; &lt;!-- body { background : white ; color : black ; } --&gt; &lt;/style&gt; </TD>
<TD>将样式表写在一个独立的.css文件中，然后在页面head区用类似以下代码调用。<BR>&lt;link rel="stylesheet" rev="stylesheet" href="css/style.css" type="text/css" media="all" /&gt; <BR>在符合web标准的设计中，我们使用外部调用法，好处不言而喻，您可以不修改页面只修改.css文件而改变页面的样式。如果所有页面都调用同一个样式表文件，那么改一个样式表文件，可以改变所有文件的样式。</TD></TR>
<TR vAlign=center align=left>
<TD bgColor=#ffff99 colSpan=2 height=20><STRONG>CSS入门</STRONG></TD></TR>
<TR vAlign=center align=left bgColor=#ffffca>
<TD colSpan=2 height=40>
<DIV align=left>首先我们先介绍一些CSS的入门知识。如果您已经很熟悉了，可以跳过这一节，直接进入下一节。<BR>CSS是Cascading Style Sheets(层叠样式表)的缩写。是一种对web文档添加样式的简单机制，属于表现层的布局语言。</DIV></TD></TR>
<TR vAlign=top align=left bgColor=#fefde9>
<TD colSpan=2><STRONG><BR>1.1基本语法规范<BR><BR></STRONG>分析一个典型CSS的语句：<BR>p {COLOR:#FF0000;BACKGROUND:#FFFFFF} <BR>其中"p"我们称为"选择器"(selectors)，指明我们要给"p"定义样式； <BR>样式声明写在一对大括号"{}"中； <BR>COLOR和BACKGROUND称为"属性"(property)，不同属性之间用分号";"分隔； <BR>"#FF0000"和"#FFFFFF"是属性的值(value)。 
<P><STRONG>1.2颜色值</STRONG><BR><BR>颜色值可以用RGB值写，例如：color : rgb(255,0,0)，也可以用十六进制写，就象上面例子color:#FF0000。如果十六进制值是成对重复的可以简写，效果一样。例如:#FF0000可以写成#F00。但如果不重复就不可以简写，例如#FC1A1B必须写满六位。</P>
<P><STRONG>1.3定义字体</STRONG><BR><BR>web标准推荐如下字体定义方法：<BR>body { font-family : "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif; } <BR>字体按照所列出的顺序选用。如果用户的计算机含有Lucida Grande字体，文档将被指定为Lucida Grande。没有的话，就被指定为Verdana字体，如果也没有Verdana，就指定为Lucida字体，依此类推，； <BR>Lucida Grande字体适合Mac OS X； <BR>Verdana字体适合所有的Windows系统； <BR>Lucida适合UNIX用户 <BR>"宋体"适合中文简体用户; <BR>如果所列出的字体都不能用，则默认的sans-serif字体能保证调用;</P>
<P><STRONG>1.4群选择器<BR><BR></STRONG>当几个元素样式属性一样时，可以共同调用一个声明，元素之间用逗号分隔，： p, td, li { font-size : 12px ; } </P>
<P><STRONG>1.5派生选择器</STRONG><BR><BR>可以使用派生选择器给一个元素里的子元素定义样式，例如这样：<BR>li strong { font-style : italic; font-weight : normal；} <BR>就是给li下面的子元素strong定义一个斜体不加粗的样式。</P>
<P><STRONG>1.6id选择器</STRONG><BR><BR>用CSS布局主要用层"div"来实现，而div的样式通过"id选择器"来定义。例如我们首先定义一个层<BR>&lt;div id="menubar"&gt;&lt;/div&gt; <BR>然后在样式表里这样定义：<BR>#menubar {MARGIN: 0px;BACKGROUND: #FEFEFE;COLOR: #666;} <BR>其中"menubar"是您自己定义的id名称。注意在前面加"#"号。</P>
<P><STRONG>id选择器也同样支持派生，例如</STRONG>：<BR><BR>#menubar p { text-align : right; margin-top : 10px; } <BR>这个方法主要用来定义层和那些比较复杂，有多个派生的元素。</P>
<P><STRONG>1.7类别选择器</STRONG><BR><BR>在CSS里用一个点开头表示类别选择器定义，例如：<BR>.14px {color : #f60 ;font-size:14px ;} <BR>在页面中，用class="类别名"的方法调用：<BR>&lt;span class="14px"&gt;14px大小的字体&lt;/span&gt; <BR>这个方法比较简单灵活，可以随时根据页面需要新建和删除。</P>
<P><STRONG>1.8定义链接的样式</STRONG><BR><BR>CSS中用四个伪类来定义链接的样式，分别是：a:link、a:visited、a:hover和a : active，例如：<BR>a:link{font-weight : bold ;text-decoration : none ;color : #c00 ;}<BR>a:visited {font-weight : bold ;text-decoration : none ;color : #c30 ;}<BR>a:hover {font-weight : bold ;text-decoration : underline ;color : #f60 ;}<BR>a:active {font-weight : bold ;text-decoration : none ;color : #90 ;} 以上语句分别定义了"链接、已访问过的链接、鼠标停在上方时、点下鼠标时"的样式。注意，必须按以上顺序写，否则显示可能和您预想的不一样。记住它们的顺序是“LVHA”。<BR><BR></P></TD></TR>
<TR vAlign=center align=left>
<TD bgColor=#ffccff colSpan=2 height=90>
<DIV align=left>用web标准设计网站，过渡的方法主要是采用XHTML+CSS，css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS，如果您以前不常用，那么现在就开始学习吧。要制作符合web标准的网站，不懂CSS是设计不出漂亮的页面的。<BR><BR>事实上，所有表现的地方都需要用CSS来实现。我们以前都习惯用table来定位和布局，现在要改用DIV来定位和布局。这是思维方式的变化，一开始有些不习惯。呵呵，任何变革都会有阻力的，为了享受标准带来的"益处"，放弃一些老的传统做法是值得的。</DIV></TD></TR></TBODY></TABLE><img src ="http://www.cnitblog.com/kenlen/aggbug/4031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/kenlen/" target="_blank">Kenlen</a> 2005-11-06 16:33 <a href="http://www.cnitblog.com/kenlen/articles/4031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>