﻿<?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/jiangmin/category/15075.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 25 Nov 2007 00:40:12 GMT</lastBuildDate><pubDate>Sun, 25 Nov 2007 00:40:12 GMT</pubDate><ttl>60</ttl><item><title>javascript操作Select标记中options集合</title><link>http://www.blogjava.net/jiangmin/articles/162912.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Sat, 24 Nov 2007 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/162912.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/162912.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/162912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/162912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/162912.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 先来看看options集合的这几个方法：options.add(option)方法向集合里添加一项option对象；options.remove(index)方法移除options集合中的指定项；options(index)或options.item(index)可以通过索引获取options集合的指定项；javascript代码如下：var&nbsp;selectTag&...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiangmin/articles/162912.html'>阅读全文</a><img src ="http://www.blogjava.net/jiangmin/aggbug/162912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-11-25 00:22 <a href="http://www.blogjava.net/jiangmin/articles/162912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML实用 父窗口和子窗口的交互</title><link>http://www.blogjava.net/jiangmin/articles/159079.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Thu, 08 Nov 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/159079.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/159079.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/159079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/159079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/159079.html</trackback:ping><description><![CDATA[<p><font size="2">opener即谁打开我的，比如A页面利用window.open弹出了B页面窗口，那么A页面所在窗口就是B页面的<br />
<br />
opener，在B页面通过opener对象可以访问A页面。<br />
<br />
parent表示父窗口，比如一个A页面利用iframe或frame调用B页面，那么A页面所在窗口就是B页面的<br />
<br />
parent。<br />
<br />
<br />
<br />
在JS中，window.opener只是对弹出窗口的母窗口的一个引用。比如：<br />
a.html中，通过点击按钮等方式window.open出一个新的窗口b.html。那么在b.html中，就可以通过<br />
<br />
window.opener（省略写为opener）来引用a.html，包括a.html的document等对象，操作a.html的内容。<br />
假如这个引用失败，那么将返回null。所以在调用opener的对象前，要先判断对象是否为null，否则会<br />
<br />
出现&#8220;对象为空或者不存在&#8221;的JS错误。<br />
<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form. name=form1&gt;<br />
&lt;input type=text name=inpu &gt;<br />
&lt;input type=button&nbsp;&nbsp; &gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
<br />
--------------------------------<br />
back2opener.html<br />
--------------------------------<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form. name=form1&gt;<br />
&lt;input type=text name=inpu &gt;<br />
<br />
&nbsp;&nbsp; &lt;a class=under href=# &gt;添加&lt;/a&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
<br />
<br />
window.opener 返回的是创建当前窗口的那个窗口的引用，比如点击了a.htm上的一个链接而打开了<br />
<br />
b.htm，然后我们打算在b.htm上输入一个值然后赋予a.htm上的一个id为&#8220;name&#8221;的textbox中，就可以<br />
<br />
写为：<br />
<br />
window.opener.document.getElementById("name").value = "输入的数据"; </font></p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/159079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-11-08 13:28 <a href="http://www.blogjava.net/jiangmin/articles/159079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遇上用例驱动的团队 </title><link>http://www.blogjava.net/jiangmin/articles/110565.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Fri, 13 Apr 2007 17:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/110565.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/110565.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/110565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/110565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/110565.html</trackback:ping><description><![CDATA[&nbsp;<br><br>就像小说里那些早慧的少年，很早就尝试过用例驱动的需求文案，结果与客户，一个愁默默，一个恨绵绵。&nbsp;
<p>&nbsp;&nbsp;&nbsp; 最狂热的用例编写者也承认，用例对客户与需求人员都是一种heavy的相互折磨。<br>&nbsp;&nbsp;&nbsp; 客户看用例时总要收摄心神来阅读整个交互的流程，还有那些该死的扩展流异常流，没经过程序员专业抽象训练的客户，对着这些伪代码一般的情景脚本，刚开始的一两个还好，看多了，就是白天也能睡去。客户只是看都如此了，负责写的人当然也不会好过。</p>
<p>&nbsp;&nbsp;&nbsp; 但heavy的工作总有heavy的好处，否则早被唾弃于舞台的背面。<br>&nbsp;&nbsp;&nbsp; 在用户的角度，用例比模棱两可的功能点描述要清晰，也更直白于系统的价值。<br>&nbsp;&nbsp;&nbsp; 在开发团队角度，RUP的核心方法论之一---用例驱动的口号，明白人自然明白他的妙用。<br>&nbsp;&nbsp;&nbsp; 设计人员有了新的设计手段：&#8220;用时序图分析用例的实现，在描述过程中确定构件或类，分配它们的职责和方法&#8221;，通过对用例覆盖率的追踪，将需求与设计之间的信息损耗这个famous problem大大降低。<br>&nbsp;&nbsp;&nbsp; 测试人员和文档人员，更可以直接把系统用例笑纳为《测试用例》和《用户手册》。</p>
<p>&nbsp;&nbsp;&nbsp; 来到亿迅后，被这里的用例文明给震住了，每个项目的软件规格说明都是屯门清一色的几百页的前景，用例规约，业务规则，词汇表，补充规约组成.......难得有情郎啊。<br>&nbsp;&nbsp;&nbsp; 昨天又看到了一批新的用例诞生，但实在有好些明显的不足啊，忍不住旧事重提的记下一批经典的错误。不过.....只要能和客户达成需求共识，就是一份好的用例了，也不用花太多时间在学术性的讨论上。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 1.客户没有能力阅读用例</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果客户实在没办法撑住困意看完用例的细节，即使草草签了名，得不到用户真正确认的用例，依然无法用来驱动设计和测试。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法：放弃编写用例，改回用户容易看的传统方式。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 2.团队没有能力实现用例驱动</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果开发团队在设计与测试时，根本不依照用例细节驱动，那用例对开发团队就只是个摆设，花瓶。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法：对设计、测试人员进行用例驱动的培训，如果事不可为就干脆放弃，怎么省事怎么做。<strong>&nbsp;</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp; 3.在用例中描述系统内部工作<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经典错误，开发人员把用例当作设计文档来写，如&#8220;系统将销售信息写入数据库&#8221;，实际上应该写的是&#8220;系统记录销售&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法：站在客户的角度，把系统视为黑盒，删除所有内部设计描述。</p>
<p><strong>&nbsp;&nbsp; 4.在用例中描述界面</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另一个经典错误，不说了，如果在意用户信息包括了姓名和密码，可以在词汇表里记录，而用例写成--显示&lt;用户信息&gt;。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 5.在用例中越出系统边界描述整个业务流程</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要建立的系统只是整个业务流程里的一部，善良的需求人员为了大家清楚来龙去脉，将系统外的处理步骤也写进了用例的情景。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.用户去营业厅开户<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.用户拨号接入<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实际上去营业厅开户不属于宽带接入认证系统的职责。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法：开户的描述应该放到用例的前置条件中。前置与后置条件是说明系统边界外的业务流程的好地方。&nbsp; </p>
<p><strong>&nbsp; 6.过多的用例，让人晕菜<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国外的惯例，一个用例一般有半个以上人月的开发量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.开户，销户这样的CRUD型用例可以合并成一个管理用例，以四个主场景分别表达。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2."老板问：你每天做什么阿?"，"我每天登陆系统"。这就是用例没有提供足够价值的明显标志。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.用例中的每一个步骤，其实都可以写成一个独立的用例，分 or&nbsp; 不分？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.用例的打包组织是一门艺术，功能包、顶级目标用例，Actor，开发团队与版本号等。</p>
<p><br>&nbsp;&nbsp;&nbsp; <strong>7.过多的扩展事件和异常事件流，让人晕菜</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即使是受过训练的程序员，2a, 3b1看多了也要晕掉，记住阅读者是人而不是机器。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.如果逻辑不多，可以一句话讲完，不影响主场景的，不建议新起一个事件流。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.可以使用活动图来辅助说明。在RSM7.0的模版里，每个用例都会带上一个活动图。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>8.过多的关系，继续让人晕菜<br></strong>&nbsp;&nbsp;&nbsp;&nbsp; &#8220;不要花一个月的时间去讨论应该include还是extend&#8221;。大家对include, extend and generalize都不熟悉，那就干脆都不要用了。&nbsp;&nbsp;&nbsp;</p>
<p><strong>参考材料：</strong><br>&nbsp;&nbsp;&nbsp; <strong>《编写有效用例--Wriging Effective Use Case》</strong>Corkburn 2001，大家现在使用的用例模版都是他创下来的，此书无可替代。<br>&nbsp;&nbsp;&nbsp; <strong>《用例模式与蓝图--Use Cases Patterns and Blueprints》</strong>我觉得比另一本名字相近的《Patterns for Effective Use Cases》要实用一些</p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/110565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-04-14 01:10 <a href="http://www.blogjava.net/jiangmin/articles/110565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用eclipse生成文档（javadoc）</title><link>http://www.blogjava.net/jiangmin/articles/110562.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Fri, 13 Apr 2007 17:05:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/110562.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/110562.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/110562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/110562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/110562.html</trackback:ping><description><![CDATA[<div class=postbody>使用eclipse生成文档（javadoc）主要有三种方法：<br>1，在项目列表中按右键，选择Export（导出），然后在Export(导出)对话框中选择java下的javadoc，提交到下一步。<br>在Javadoc Generation对话框中有两个地方要注意的：<br>javadoc command:应该选择jdk的bin/javadoc.exe<br>destination:为生成文档的保存路径，可自由选择。<br>按finish(完成)提交即可开始生成文档。<br>2，用菜单选择：File-&gt;Export(文件－&gt;导出)，<br>剩下的步骤和第一种方法是一样的。<br>3，选中要生成文档的项目，然后用菜单选择，<br>Project-&gt;Generate Javadoc直接进入Javadoc Generation对话框，剩余的步骤就和第一种方法在Javadoc Generation对话框开始是一样的。&nbsp;<br></div>
<img src ="http://www.blogjava.net/jiangmin/aggbug/110562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-04-14 01:05 <a href="http://www.blogjava.net/jiangmin/articles/110562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件开发:需求分析的20条法则（收藏） </title><link>http://www.blogjava.net/jiangmin/articles/110559.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Fri, 13 Apr 2007 16:57:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/110559.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/110559.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/110559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/110559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/110559.html</trackback:ping><description><![CDATA[邢学慧/(IT经理世界) <br><br>　　　对商业用户来说，他们后面是成百上千个供应商，前面是成千上万个消费顾客。怎样利用软件管理错综复杂的供应商和消费顾客，如何做好精细到一个小小调料包的进、销、调、存的商品流通工作，这些都是商业企业需要信息管理系统的理由。软件开发的意义也就在于此。而弄清商业用户如此复杂需求的真面目，正是软件开发成功的关键所在。 <br>---　　经理：&#8220;我们要建立一套完整的商业管理软件系统，包括商品的进、销、调、存管理，是总部-门店的连锁经营模式。通过通信手段门店自动订货，供应商自动结算，卖场通过扫条码实现销售，管理人员能够随时查询门店商品销售和库存情况。另外，我们也得为政府部门提供关于商品营运的报告。&#8221; <br><br>--　　-分析员：&#8220;我已经明白这个项目的大体结构框架，这非常重要，但在制定计划之前，我们必须收集一些需求。&#8221; <br><br>--　　-经理觉得奇怪：&#8220;我不是刚告诉你我的需求了吗？&#8221; <br><br>--　　-分析员：&#8220;实际上，您只说明了整个项目的概念和目标。这些高层次的业务需求不足以提供开发的内容和时间。我需要与实际将要使用系统的业务人员进行讨论，然后才能真正明白达到业务目标所需功能和用户要求，了解清楚后，才可以发现哪些是现有组件即可实现的，哪些是需要开发的，这样可节省很多时间。&#8221; <br><br>--　　-经理：&#8220;业务人员都在招商。他们非常忙，没有时间与你们详细讨论各种细节。你能不能说明一下你们现有的系统？&#8221; <br><br>---　　分析员尽量解释从用户处收集需求的合理性：&#8220;如果我们只是凭空猜想用户的要求，结果不会令人满意。我们只是软件开发人员，而不是采购专家、营运专家或是财务专家，我们并不真正明白您这个企业内部运营需要做些什么。我曾经尝试过，未真正明白这些问题就开始编码，结果没有人对产品满意。&#8221; <br><br>---　　经理坚持道：&#8220;行了，行了，我们没有那么多的时间。让我来告诉您我们的需求。实际上我也很忙。请马上开始开发，并随时将你们的进展情况告诉我。&#8221; <br><br>---　　风险躲在需求的迷雾之后 <br><br>-　　--以上我们看到的是某客户项目经理与系统开发小组的分析人员讨论业务需求。在项目开发中，所有的项目风险承担者都对需求分析阶段备感兴趣。这里所指的风险承担者包括客户方面的项目负责人和用户，开发方面的需求分析人员和项目管理者。这部分工作做得到位，能开发出很优秀的软件产品，同时也会令客户满意。若处理不好，则会导致误解、挫折、障碍以及潜在的质量和业务价值上的威胁。因此可见——需求分析奠定了软件工程和项目管理的基础。 <br><br>--　　-拨开需求分析的迷雾 <br><br>---　　像这样的对话经常出现在软件开发的过程中。客户项目经理的需求对分析人员来讲，像&#8220;雾里看花&#8221;般模糊并令开发者感到困惑。那么，我们就拨开雾影，分析一下需求的具体内容： <br><br>--　-&#183;业务需求——反映了组织机构或客户对系统、产品高层次的目标要求，通常在项目定义与范围文档中予以说明。 <br><br>---　&#183;用户需求——描述了用户使用产品必须要完成的任务，这在使用实例或方案脚本中予以说明。 <br><br>---　&#183;功能需求——定义了开发人员必须实现的软件功能，使用户利用系统能够完成他们的任务，从而满足了业务需求。 <br><br>--　-&#183;非功能性的需求——描述了系统展现给用户的行为和执行的操作等，它包括产品必须遵从的标准、规范和约束，操作界面的具体细节和构造上的限制。 <br><br>---　&#183;需求分析报告——报告所说明的功能需求充分描述了软件系统所应具有的外部行为。&#8220;需求分析报告&#8221;在开发、测试、质量保证、项目管理以及相关项目功能中起着重要作用。 <br><br>---　前面提到的客户项目经理通常阐明产品的高层次概念和主要业务内容，为后继工作建立了一个指导性的框架。其他任何说明都应遵循&#8220;业务需求&#8221;的规定，然而&#8220;业务需求&#8221;并不能为开发人员提供开发所需的许多细节说明。 <br><br>---　下一层次需求——用户需求，必须从使用产品的用户处收集。因此，这些用户构成了另一种软件客户，他们清楚要使用该产品完成什么任务和一些非功能性的特性需求。例如：程序的易用性、健壮性和可靠性，而这些特性将会使用户很好地接受具有该特点的软件产品。 <br><br>---　经理层有时试图代替实际用户说话，但通常他们无法准确说明&#8220;用户需求&#8221;。用户需求来自产品的真正使用者，必须让实际用户参与到收集需求的过程中。如果不这样做，产品很可能会因缺乏足够的信息而遗留不少隐患。 <br><br>---　在实际需求分析过程中，以上两种客户可能都觉得没有时间与需求分析人员讨论，有时客户还希望分析人员无须讨论和编写需求说明就能说出用户的需求。除非遇到的需求极为简单；否则不能这样做。如果您的组织希望软件成功，那么必须要花上数天时间来消除需求中模糊不清的地方和一些使开发者感到困惑的方面。 <br><br>---　优秀的软件产品建立在优秀的需求基础之上，而优秀的需求源于客户与开发人员之间有效的交流和合作。只有双方参与者都明白自己需要什么、成功的合作需要什么时，才能建立起一种良好的合作关系。 <br><br>---　由于项目的压力与日俱增，所有项目风险承担者有着一个共同目标，那就是大家都想开发出一个既能实现商业价值又能满足用户要求，还能使开发者感到满足的优秀软件产品。 <br><br>--　-客户的需求观 <br><br>--　-客户与开发人员交流需要好的方法。下面建议20条法则，客户和开发人员可以通过评审以下内容并达成共识。如果遇到分歧，将通过协商达成对各自义务的相互理解，以便减少以后的磨擦（如一方要求而另一方不愿意或不能够满足要求）。 <br><br>---　1、 分析人员要使用符合客户语言习惯的表达 <br><br>---　需求讨论集中于业务需求和任务，因此要使用术语。客户应将有关术语（例如：采价、印花商品等采购术语）教给分析人员，而客户不一定要懂得计算机行业的术语。 <br><br>---　2、分析人员要了解客户的业务及目标 <br><br>---　只有分析人员更好地了解客户的业务，才能使产品更好地满足需要。这将有助于开发人员设计出真正满足客户需要并达到期望的优秀软件。为帮助开发和分析人员，客户可以考虑邀请他们观察自己的工作流程。如果是切换新系统，那么开发和分析人员应使用一下目前的旧系统，有利于他们明白目前系统是怎样工作的，其流程情况以及可供改进之处。s <br><br>---　3、 分析人员必须编写软件需求报告 <br><br>---　分析人员应将从客户那里获得的所有信息进行整理，以区分业务需求及规范、功能需求、质量目标、解决方法和其他信息。通过这些分析，客户就能得到一份&#8220;需求分析报告&#8221;，此份报告使开发人员和客户之间针对要开发的产品内容达成协议。报告应以一种客户认为易于翻阅和理解的方式组织编写。客户要评审此报告，以确保报告内容准确完整地表达其需求。一份高质量的&#8220;需求分析报告&#8221;有助于开发人员开发出真正需要的产品。 <br><br>---　4、 要求得到需求工作结果的解释说明 <br><br>---　分析人员可能采用了多种图表作为文字性&#8220;需求分析报告&#8221;的补充说明，因为工作图表能很清晰地描述出系统行为的某些方面，所以报告中各种图表有着极高的价值；虽然它们不太难于理解，但是客户可能对此并不熟悉，因此客户可以要求分析人员解释说明每个图表的作用、符号的意义和需求开发工作的结果，以及怎样检查图表有无错误及不一致等。 <br><br>---　5、 开发人员要尊重客户的意见 <br><br>---　如果用户与开发人员之间不能相互理解，那关于需求的讨论将会有障碍。共同合作能使大家&#8220;兼听则明&#8221;。参与需求开发过程的客户有权要求开发人员尊重他们并珍惜他们为项目成功所付出的时间，同样，客户也应对开发人员为项目成功这一共同目标所做出的努力表示尊重。 <br><br>---　6、 开发人员要对需求及产品实施提出建议和解决方案 <br><br>---　通常客户所说的&#8220;需求&#8221;已经是一种实际可行的实施方案，分析人员应尽力从这些解决方法中了解真正的业务需求，同时还应找出已有系统与当前业务不符之处，以确保产品不会无效或低效；在彻底弄清业务领域内的事情后，分析人员就能提出相当好的改进方法，有经验且有创造力的分析人员还能提出增加一些用户没有发现的很有价值的系统特性。 <br><br>---　7、 描述产品使用特性 <br><br>---　客户可以要求分析人员在实现功能需求的同时还注意软件的易用性，因为这些易用特性或质量属性能使客户更准确、高效地完成任务。例如：客户有时要求产品要&#8220;界面友好&#8221;或&#8220;健壮&#8221;或&#8220;高效率&#8221;，但对于开发人员来讲，太主观了并无实用价值。正确的做法是，分析人员通过询问和调查了解客户所要的&#8220;友好、健壮、高效所包含的具体特性，具体分析哪些特性对哪些特性有负面影响，在性能代价和所提出解决方案的预期利益之间做出权衡，以确保做出合理的取舍。 <br><br>---　8、 允许重用已有的软件组件 <br><br>---　需求通常有一定灵活性，分析人员可能发现已有的某个软件组件与客户描述的需求很相符，在这种情况下，分析人员应提供一些修改需求的选择以便开发人员能够降低新系统的开发成本和节省时间，而不必严格按原有的需求说明开发。所以说，如果想在产品中使用一些已有的商业常用组件，而它们并不完全适合您所需的特性，这时一定程度上的需求灵活性就显得极为重要了。 <br><br>---　9、 要求对变更的代价提供真实可靠的评估 <br><br>---　有时，人们面临更好、也更昂贵的方案时，会做出不同的选择。而这时，对需求变更的影响进行评估从而对业务决策提供帮助，是十分必要的。所以，客户有权利要求开发人员通过分析给出一个真实可信的评估，包括影响、成本和得失等。开发人员不能由于不想实施变更而随意夸大评估成本。 <br><br>---　10、 获得满足客户功能和质量要求的系统 <br><br>---　每个人都希望项目成功，但这不仅要求客户要清晰地告知开发人员关于系统&#8220;做什么&#8221;所需的所有信息，而且还要求开发人员能通过交流了解清楚取舍与限制，一定要明确说明您的假设和潜在的期望，否则，开发人员开发出的产品很可能无法让您满意。 <br><br>---　11、 给分析人员讲解您的业务 <br><br>---　分析人员要依靠客户讲解业务概念及术语，但客户不能指望分析人员会成为该领域的专家，而只能让他们明白您的问题和目标；不要期望分析人员能把握客户业务的细微潜在之处，他们可能不知道那些对于客户来说理所当然的&#8220;常识&#8221;。 <br><br>---　12、 抽出时间清楚地说明并完善需求 <br><br>---　客户很忙，但无论如何客户有必要抽出时间参与&#8220;头脑高峰会议&#8221;的讨论，接受采访或其他获取需求的活动。有些分析人员可能先明白了您的观点，而过后发现还需要您的讲解，这时请耐心对待一些需求和需求的精化工作过程中的反复，因为它是人们交流中很自然的现象，何况这对软件产品的成功极为重要。 <br><br>---　13、 准确而详细地说明需求 <br><br>---　编写一份清晰、准确的需求文档是很困难的。由于处理细节问题不但烦人而且耗时，因此很容易留下模糊不清的需求。但是在开发过程中，必须解决这种模糊性和不准确性，而客户恰恰是为解决这些问题作出决定的最佳人选，否则，就只好靠开发人员去正确猜测了。 <br><br>---　在需求分析中暂时加上&#8220;待定&#8221;标志是个方法。用该标志可指明哪些是需要进一步讨论、分析或增加信息的地方，有时也可能因为某个特殊需求难以解决或没有人愿意处理它而标注上&#8220;待定&#8221;。客户要尽量将每项需求的内容都阐述清楚，以便分析人员能准确地将它们写进&#8220;软件需求报告&#8221;中去。如果客户一时不能准确表达，通常就要求用原型技术，通过原型开发，客户可以同开发人员一起反复修改，不断完善需求定义。 <br><br>---　14、 及时作出决定 <br><br>---　分析人员会要求客户作出一些选择和决定，这些决定包括来自多个用户提出的处理方法或在质量特性冲突和信息准确度中选择折衷方案等。有权作出决定的客户必须积极地对待这一切，尽快做处理，做决定，因为开发人员通常只有等客户做出决定才能行动，而这种等待会延误项目的进展。 <br><br>---　15、 尊重开发人员的需求可行性及成本评估 <br><br>---　所有的软件功能都有其成本。客户所希望的某些产品特性可能在技术上行不通，或者实现它要付出极高的代价，而某些需求试图达到在操作环境中不可能达到的性能，或试图得到一些根本得不到的数据。开发人员会对此作出负面的评价，客户应该尊重他们的意见。 <br><br>---　16、 划分需求的优先级 <br><br>---　绝大多数项目没有足够的时间或资源实现功能性的每个细节。决定哪些特性是必要的，哪些是重要的，是需求开发的主要部分，这只能由客户负责设定需求优先级，因为开发者不可能按照客户的观点决定需求优先级；开发人员将为您确定优先级提供有关每个需求的花费和风险的信息。 <br><br>---　在时间和资源限制下，关于所需特性能否完成或完成多少应尊重开发人员的意见。尽管没有人愿意看到自己所希望的需求在项目中未被实现，但毕竟是要面对现实，业务决策有时不得不依据优先级来缩小项目范围或延长工期，或增加资源，或在质量上寻找折衷。 <br><br>---　17、 评审需求文档和原型 <br><br>---　客户评审需求文档，是给分析人员带来反馈信息的一个机会。如果客户认为编写的&#8220;需求分析报告&#8221;不够准确，就有必要尽早告知分析人员并为改进提供建议。 <br><br>---　更好的办法是先为产品开发一个原型。这样客户就能提供更有价值的反馈信息给开发人员，使他们更好地理解您的需求；原型并非是一个实际应用产品，但开发人员能将其转化、扩充成功能齐全的系统。 <br><br>---　18、 需求变更要立即联系 <br><br>---　不断的需求变更，会给在预定计划内完成的质量产品带来严重的不利影响。变更是不可避免的，但在开发周期中，变更越在晚期出现，其影响越大；变更不仅会导致代价极高的返工，而且工期将被延误，特别是在大体结构已完成后又需要增加新特性时。所以，一旦客户发现需要变更需求时，请立即通知分析人员。 <br><br>---　19、 遵照开发小组处理需求变更的过程 <br><br>---　为将变更带来的负面影响减少到最低限度，所有参与者必须遵照项目变更控制过程。这要求不放弃所有提出的变更，对每项要求的变更进行分析、综合考虑，最后做出合适的决策，以确定应将哪些变更引入项目中。 <br><br>---　20、 尊重开发人员采用的需求分析过程 <br><br>---　软件开发中最具挑战性的莫过于收集需求并确定其正确性，分析人员采用的方法有其合理性。也许客户认为收集需求的过程不太划算，但请相信花在需求开发上的时间是非常有价值的；如果您理解并支持分析人员为收集、编写需求文档和确保其质量所采用的技术，那么整个过程将会更为顺利。 <br><br>---　&#8220;需求确认&#8221;意味着什么 <br><br>---　在&#8220;需求分析报告&#8221;上签字确认，通常被认为是客户同意需求分析的标志行为，然而实际操作中，客户往往把&#8220;签字&#8221;看作是毫无意义的事情。&#8220;他们要我在需求文档的最后一行下面签名，于是我就签了，否则这些开发人员不开始编码。&#8221; <br><br>---　这种态度将带来麻烦，譬如客户想更改需求或对产品不满时就会说：&#8220;不错，我是在需求分析报告上签了字，但我并没有时间去读完所有的内容，我是相信你们的，是你们非让我签字的。&#8221; <br><br>---　同样问题也会发生在仅把&#8220;签字确认&#8221;看作是完成任务的分析人员身上，一旦有需求变更出现，他便指着&#8220;需求分析报告&#8221;说：&#8220;您已经在需求上签字了，所以这些就是我们所开发的，如果您想要别的什么，您应早些告诉我们。&#8221; <br><br>---　这两种态度都是不对的。因为不可能在项目的早期就了解所有的需求，而且毫无疑问地需求将会出现变更，在&#8220;需求分析报告&#8221;上签字确认是终止需求分析过程的正确方法，所以我们必须明白签字意味着什么。 <br><br>---　对&#8220;需求分析报告&#8221;的签名是建立在一个需求协议的基线上，因此我们对签名应该这样理解：&#8220;我同意这份需求文档表述了我们对项目软件需求的了解，进一步的变更可在此基线上通过项目定义的变更过程来进行。我知道变更可能会使我们重新协商成本、资源和项目阶段任务等事宜。&#8221;对需求分析达成一定的共识会使双方易于忍受将来的摩擦，这些摩擦来源于项目的改进和需求的误差或市场和业务的新要求等。 <br><br>---　需求确认将迷雾拨散，显现需求的真面目，给初步的需求开发工作画上了双方都明确的句号，并有助于形成一个持续良好的客户与开发人员的关系，为项目的成功奠定了坚实的基础<br>
<img src ="http://www.blogjava.net/jiangmin/aggbug/110559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-04-14 00:57 <a href="http://www.blogjava.net/jiangmin/articles/110559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成功的项目团队Winning Project Teams (转)</title><link>http://www.blogjava.net/jiangmin/articles/110558.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Fri, 13 Apr 2007 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/110558.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/110558.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/110558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/110558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/110558.html</trackback:ping><description><![CDATA[What makes a winning techical project team? A quick look at <br>some of the factors which seem to be consistently present on <br>winning project teams is appropriate. The degree of <br>attention paid to each can have a distinct impact on the <br>success of the project as well as elevating the confidence <br>of the business client.
<p>是什么造就了一个成功的专业项目团队？浏览一下成功的项目团队所固有的特点是<br>很好的。对每个因素的重视程度对于项目的成功和评价业务客户的信任度将有很大的<br>影响。<br>&nbsp;<br>System Building Competence<br>&nbsp;&nbsp; 系统建造能力<br>&nbsp;<br>This is absolutely critical. The ability to succeed is <br>established within the minds of the clients as well as the <br>project team members in the early stages of the effort. An <br>essential component of this perception is both the <br>management ability, the technical skills, and the sense of <br>direction possessed by the project leadership. Both the <br>business clients and the team can detect fairly quickly if <br>the project leaders have "what it takes" to take them to a <br>final product. Without question this feeling has a <br>tremendous impact on morale. </p>
<p>&nbsp;&nbsp; 这是绝对关键的。成功的能力是在努力的早期阶段在客户的思想和项目团队成员中<br>建立起来的。这个观点的本质在于管理能力和专业技术和由项目主管拥有的方向感<br>上。业务客户和团队能够快速清楚的察觉项目主管是否有带领他们向最终目标前进的<br>思想。毫无疑问这个感觉对士气是至关重要的。<br>&nbsp;<br>Humphrey Watts in his book Managing the Software Process, <br>describes a model for measuring the maturity of a software <br>development organization. These ideas were further refined <br>by the Software Engineering Institute (SEI) at Carnegie <br>Mellon University. A brief summary of the maturity levels of <br>the model (in terminology which will relate to some of the <br>central themes of this white paper) are presented below: </p>
<p>&nbsp;&nbsp; Humphrey Watts在他的书《管理软件过程》中描述了一个衡量软件开发组织成熟<br>度的模型。这些观点由Carnegie Mellon大学的软件工程组织作了进一步精炼。有关<br>模型（有些术语与本文的一些要点有关）成熟层的简短概括如下：<br>&nbsp;<br>Initial Level<br>&nbsp;&nbsp; 初始层<br>&nbsp;<br>A team or organization at this level tends to take a <br>chaotic, ad-hoc, "invent as we go" approach toward every new <br>systems building effort. <br>&nbsp;&nbsp; 处于这层的团队和组织试图以一种混乱的，特别的，"如我们所想的"方法对待每一<br>个新的系统建造工程。<br>&nbsp;<br>Repeatable Level<br>&nbsp;&nbsp; 可重复层<br>&nbsp;<br>A team or organization at this level uses planning <br>techniques, gathers requirements in a systematic fashion, <br>utilizes software quality assurance techniques, and follows <br>a patterned approach on each subsequent effort. <br>&nbsp;&nbsp; 处于这层的团队和组织通常使用编制计划技术，收集体系模式的需求，使用软件质<br>量保证技术，并在后来的开发中使用模式化的方法。<br>&nbsp;<br>Defined Level<br>&nbsp;&nbsp; 被定义层<br>&nbsp;<br>A team or organization at this level follows defined <br>methodological steps, uses process improvement techniques to <br>enhance the methodological approach, conducts regular <br>training programs, views the entire systems development <br>process from an integration perspective, and utilizes more <br>disciplined information engineering and structured <br>development techniques. <br>&nbsp;&nbsp; 处于这层的团队和组织使用定义好的方法步骤，使用改进过程的技术来提高方法，<br>管理有序的练习程序，从综合的观点看待整个系统开发过程，使用更加严格的信息工<br>程和结构化开发技术。<br>&nbsp;<br>Managed Level<br>&nbsp;&nbsp; 被管理层<br>&nbsp;<br>A team or organization at this level actually captures and <br>utilizes software development metrics for future estimation <br>and process analysis purposes. In addition, some of concepts <br>of Total Quality Management (TQM) are employed to reinforce <br>the effectiveness of the entire development process. <br>&nbsp;&nbsp; 处于这层的团队和组织通常为将来的评估和过程分析捕获并使用软件开发度量。另<br>外，整体质量管理的一些概念也被使用来增加整个开发过程的效力。<br>&nbsp;<br>Optimized Level<br>&nbsp;&nbsp; 优化层<br>&nbsp;<br>A team or organization at this level utilizes continuous <br>organizational change management techniques to optimize its <br>own operations (as well as the company's), emphasizes defect <br>prevention rather than defect detection, and constantly <br>seeks technological innovation opportunities. <br>&nbsp;&nbsp; 处于这层的团队和组织使用持续的有组织的变化管理技术来优化他们的操作，强调<br>避免错误而不是发现错误，并经常寻求技术革新的机会。<br>&nbsp;<br>Project Team Experience<br>&nbsp;&nbsp; 项目团队的经验<br>&nbsp;<br>Even within organizations with high success rates, one <br>factor which never changes on each new effort is the amount <br>of experience possessed by the chosen project team members. <br>Will the project team include a business expert? If not, <br>will the assigned members be able to effectively comprehend <br>and discuss the business requirements and issues in the <br>client terminology? Having someone on the team (even if only <br>in the initial phases) who understands the business is a <br>great confidence builder! It allows the analysts and <br>designers to ask the dumb or simplistic questions to someone <br>other than the client. This actually makes more effective <br>use of everyone's time and it adds an subsequent level of <br>security. In addition, it puts someone in the position of <br>making sure that "creative thinking" stays within reasonable <br>boundaries. </p>
<p>&nbsp;&nbsp; 即使是拥有高成功率的组织中，每个新努力中从不改变的因素是被选择的团队成员<br>拥有的经历的程度。项目团队应该包括一个业务专家？如果不是，指定的成员能够有<br>效的理解和讨论业务需求和客户术语中的组织？在团队里有没有理解这项业务的人士<br>个很自信的开发者？允许分析员和设计员向任何人询问简单的问题，而不是向客户。<br>这能充分利用每个人的时间，并增加后期工作的安全性。另外，它是每个人在合理的<br>范围里进行创造性的思想。<br>&nbsp;<br>What about technical expertise? Is the project entering <br>uncharted waters without a guide? Having someone on the team <br>who is familiar with the specialized knowledge surrounding a <br>selected technological environment provides the same <br>confidence creating benefits as those listed above. A <br>technical expert can assist others, make suggestions, <br>develop standards, and prevent time consuming mistakes. In <br>addition, he or she can provide leadership by example. By <br>spearheading the work and creating examples for others, a <br>technical expert can transfer knowledge and experience in a <br>timely and effective manner. The prevents the "invent as we <br>go" situation teams often find themselves in when embarking <br>on a new technology. <br>&nbsp;<br>&nbsp;&nbsp; 专门的技术怎样？是不是项目进入了没有向导的水域？有没有团队中的成员熟悉指<br>定技术领域的特定知识提供上面提到的同样的信心？一个技术专家能够帮助别人，做<br>出建议，开发标准，阻止耗时的错误。另外，她或他能通过例子提供领导能力。通过<br>传播工作并为他人创造例子，一个技术专家能够以及时有效的方式传播知识和经验。<br>这能阻止当一个团队在着手于一项新技术时通常发现他们处于按自己所想进行的处<br>境。</p>
<p>Project Control and Coordination<br>&nbsp;&nbsp; 项目的控制和合作<br>&nbsp;<br>Large, complex undertakings which require the participation <br>of many people throughout the development process, demand <br>both high-level and detailed guidelines to assist in the <br>channeling of the individual results into an integrated <br>final product. As each person focuses on his or her's part <br>of the system, a clearly defined set of standards and <br>specifications must exist insure that the final result will <br>"mesh" with the results being produced by others. In many <br>ways, a systems building project can be thought of a series <br>of specifications, each level spiraling from broad <br>requirements into highly detailed procedural instructions. <br>The collection of these efforts into a unified whole <br>presents the ultimate challenge for the group. What are some <br>of the ways to successfully make this happen? </p>
<p>&nbsp;&nbsp; 大型的复杂的事业需要在开发过程中很多人的参与，需要高水平详细的设计细节来<br>辅助独立的成果融入最后完整的产品中。当每个人专心与它所负责的系统的一部分<br>时，一个清楚的已经定义标准和规范的集合必须存在以保证最后的结果能够和其他人<br>的结果相吻合。在很多方式下，系统的建造项目可以看成是一系列规范，每层从广泛<br>的需求螺旋发展成为高度详细的过程指令。这些努力的集合就构成了一个整体，给整<br>个团体展现最后的挑战。那些方法能使这件事情成功的发生？<br>&nbsp;<br>Ultimately, three major factors contribute to the level of <br>success that systems building team will enjoy at each of the <br>required integration points. One of these factors is the <br>creation of "consistency" standards. During each phase, <br>guidelines should be developed for both the content as well <br>as the format of the final work products. A second important <br>factor is cross-team communication. Common requirements, <br>similar issues, shared data, and reusable functionality all <br>should be openly discussed and coordinated. Sub-teams should <br>participate in the development of overall high level shared <br>goals and objectives which encourage cross-team interaction <br>and decision making. A third factor is the insistence on the <br>part of the top team leadership that individual and sub-team <br>successes be innertwined. Consistent deliverable, quality <br>assurance, methodological, and review standards must apply <br>to all team members equally. </p>
<p>&nbsp;&nbsp; 最后，三个关键的因素将对系统建造团队将会享受每个需求的综合点成功级别起作<br>用。这些因素之一是一致性标准的建立。在每个阶段，详细的细节必须为内容和最后<br>的运行产品的形式所制定。第二个重要的因素是跨团队的交流。通常的需求，相似的<br>组织，共享的数据和可复用的功能都应该被公开的讨论和协作。子团队应该参加整个<br>高层的开发，共享鼓舞跨团队交互作用和决策制定的目标。第三个是代表高层领导的<br>坚持性，个人和子团队的成功相交互。交付的一致性，质量的保证，方法和复审标准<br>必须对团队的所有成员一视同仁。<br>&nbsp;<br>Team Goals and Individual Objectives<br>&nbsp;&nbsp; 团队目标和个人目标<br>&nbsp;<br>A project team seems to develop a unique "personality" over <br>time. It becomes a reflection of everyone involved, <br>radiating confidence and certainty if spirits are high, <br>seething with doubts and confusion when direction is <br>lacking. How can project dynamics be so different from one <br>team to the next? Leadership certainly plays a vital role, <br>but individual team member attitudes make the difference. </p>
<p>&nbsp;&nbsp; 一个项目团队看起来时在开发一个独一无二的个性软件。成为每个参与者的反映，<br>如果士气高的话则充满自信和确定性，当缺乏方向时则由于疑虑和混乱而沸腾。怎样<br>才能使项目因团队的不同而不同？领导能力当然起了一个很关键的作用，但团队成员<br>的态度也会造成不同影响。<br>&nbsp;<br>Two fundamental questions illuminate the spirit of the group <br>effort. First, is everyone on the team driving toward a well <br>defined and articulative objective? Second, whose objective <br>is it? An amazing thing can happen on development projects; <br>everyone is busily working away on whatever it is that they <br>individually perceive as his or her's most important tasks. <br>Hopefully, each person's work will mesh with the rest of the <br>group's results. This will probably happen if everyone <br>clearly and precisely understands the ultimate phase <br>objectives. But what if they don't? </p>
<p>&nbsp;&nbsp; 两个基本的问题说明了组织努力的精神。首先，是不是团队的每个人都朝着已经制<br>定的清楚的目标前进？第二，这是谁的目标？在开发项目中可能发生这样令人惊讶的<br>事情，每个人都忙于她或他认为最重要的任务。希望是每个人的工作都能与其他人的<br>工作相吻合。如果每个人都很清楚并精确的指导最终的目标则可能，但如果不是呢？<br>&nbsp;<br>This is where human nature begins to step in and things can <br>begin to get interesting. If the attitudes of the team <br>members tend to be goal driven (which is good) but the team <br>leadership is fuzzy about what the objectives really are <br>(which is bad), individual and sometimes scattered goals <br>begin to pop up. Unique and potentially conflicting agendas <br>take shape. Before you know it everyone is busily working <br>away and the atmosphere appears to be productive. But an <br>time of reconciliation lies ahead. At some point the <br>individual results must be combined, and depending on the <br>fit, the attitude of the team will ultimately be affected. <br>The group's mission or purpose at this point becomes very <br>real, because it is at this moment that the team realizes <br>that there may not have really been a common direction in <br>the first place, and that fact is painfully obvious. </p>
<p>&nbsp;&nbsp; 当人类开始涉足的地方并且能过的兴趣。如果团队成员是目标驱动，而领导者对最<br>终的目标而疑惑，独立的或分散的目标突然出现。独自的潜在的议程出现。在你知道<br>之前每个人都忙于工作，而且是生产性的气氛。但要调和的时间摆在前面。在某个点<br>上独立的结果必须合并，以来与合适性，团队的态度最终会被影响。这时组织的任务<br>或目的变得很真实，因为这时团队才意识到在开始时就没有统一的方向，事实显然是<br>很痛苦的。<br>&nbsp;<br>Why even take this risk? Insuring that goals and objectives <br>are clearly spelled out, and the activities and tasks which <br>will be followed to ultimately reach them are uniformly <br>understood, will only give the team a shared sense of <br>purpose. Everyone needs to have a stake in, and a share of, <br>the responsibility for the outcome of each phase. Doing this <br>can have an incredible impact on people's attitudes. Clearly <br>comprehending the relevance of the work and how it will <br>contribute to the final product, is a powerful motivator for <br>creating an air of cooperation and open channels of <br>communication between team members. Individual goals can be <br>visualized as a part of the larger team objectives. The goal <br>driven attitude of the team will truly be reflected in the <br>quality of the results. </p>
<p>&nbsp;&nbsp; 为什么冒这个险？确保目标很清楚的确定，他们所从事的任务和活动被一律的理<br>解，将会给整个团队一种目的共享的感觉。每个人都需要由对每个阶段成果的责任<br>感，共享感。这样做肯定会影响每个人的态度。清楚的理解工作的关键和怎样影响最<br>终产品，是产生合作环境及创造成员界交流通道的强有力的因素。独立的目标可以被<br>想象成为大型团队目标的一部分。团队的目标去动态都会在产品的质量中有所反映。<br>&nbsp;<br>Systems Building Vision<br>&nbsp;&nbsp; 系统建造的蓝图<br>&nbsp;<br>A "vision" doesn't do anyone any good if it is only in one <br>person's head. Only when it has been absorbed and adopted by <br>the team does its usefulness begin to emerge. A business or <br>system "visionary" plays an important yet sometimes <br>unenviable role in making this happen. His or her <br>willingness to share insight and understanding of a <br>situation, and the necessary steps he or she envisions to <br>arrive at a desired outcome, tend to be dependant on two <br>factors: the level of confidence he or she has in the ideas, <br>and his or her tolerance for scrutiny and criticism. <br>Regardless of these personal risks, a professional system <br>builder must strive to be a system "visionary". With each <br>passing phase of the project, he or she must constantly <br>develop and communicate his or her vision of both the system <br>functionality and the project approach. </p>
<p>&nbsp;&nbsp; 如果蓝图只存在于一个人的脑中则不会给任何人带来好处。只有被团队吸取和采纳<br>才能使它的作用发挥出来。一个业务或系统的&#8220;蓝图&#8221;作用重要但有时仍不能实现。<br>她或他的希望是共享对情况的理解和见识，并采取了步骤以达到理想的结果，依赖于<br>两个因素：她或他的自信程度，忍耐审查和批评的能力。不管这些个人的冒险，一个<br>专业的系统建造者必须为成为一个系统设计者而奋斗。随着每个阶段的完成，她或他<br>必须持续开发和交流她或他对系统功能和项目方法的构想。<br>&nbsp;<br>Putting forward this vision assists in accomplishing two <br>important results. First, it creates a baseline foundation <br>for continuing discussion. In many cases, the original <br>system/approach vision may not survive for long as better <br>ideas are presented and improvement discussions occur. <br>Second, the vision promotes constructive, critical thinking. <br>&nbsp;<br>&nbsp;&nbsp; 提出构想能有处于实现两个重要的结果。首先，它创造了继续讨论的基础。在很多<br>情况下，最初的系统/方法构想不能比好的思想提出和改进的讨论维持的时间长。第<br>二，构想提供建设性的严格的思考。</p>
<p>People tend to provide more input in a "review and improve" <br>mode rather than a "create from scratch" mode. The <br>presentation of a baseline vision stimulates this process. <br>In addition, if the "visionary" can relinquish ownership of <br>the original idea, and subsequently encourage it to become <br>the property of the group, the effectiveness of the process <br>can be even more enhanced. The system builder serves to <br>plant the "starting point" ideas, and the team members and <br>business clients assist with, and take responsibility for, <br>the ultimate direction and composition of the shared vision. <br>&nbsp;<br>&nbsp;&nbsp; 人们更倾向于提供更多的输入给&#8220;复审和提高&#8221;而不是&#8220;从零开始&#8221;的模式。最初<br>的构想的提出促进这个过程。另外，如果&#8220;构想&#8221;能够放弃最初的思想的所有权，而<br>成为组织的财产，这个过程的效果将会更加提高。系统建造者负责产生开始点的思<br>想，团队成员和业务客户辅助并负责共享的构想的方向和合成。</p>
<p>Project Team Confidence<br>&nbsp;&nbsp; 项目团队信心<br>&nbsp;<br>Another important team attitude is confidence. The <br>development of a complex system presents tremendous <br>challenges to a project team. Sometimes it can even feel <br>like an act of faith. An enormous amount of detail is <br>collected, analyzed, organized, and assimilated into a <br>functional "whole". On very large efforts, only a few key <br>individuals may possess the total "big picture", and this <br>may be at varying levels of completeness. This ambiguity can <br>from time to time test the confidence of the project team <br>members. Given these uncertainties, how does a team feel <br>assured and confident of success throughout the process, and <br>have this reflected in the individual team member attitudes? <br>&nbsp;<br>&nbsp;&nbsp; 另一个重要的团队是信心。开发复杂的系统将会给团队带来很多挑战。有时感觉是<br>一种信仰的活动。大量的细节被收集、分析、组织并吸取为整体的功能。在非常大的<br>付出中，仅有一些关键个人支配整个&#8220;图纸&#8221;，并随完成的不同层次不同。这种不确<br>定性时不时的检验团队成员的信心。给出这些不确定的事情，一个团队怎样才能在通<br>向成功的过程中感到有保证和信心，并反映到团队个人的态度呢？</p>
<p>Clearly, the realization on the part of the team, that a <br>system design is formed as a gradually evolving solution, <br>from a process which tends to be iterative in nature, helps <br>everyone to be patient with the slowly disappearing level of <br>ambiguity. The more team members who participate on the <br>project who have been through the complete system building <br>life cycle, the more likely the overall team awareness will <br>be that everything will come together at each major <br>milestone. This is an important confidence builder for the <br>less experienced members of the team. The higher the level <br>of confidence possessed by the team, the more secure the <br>business clients feel, and the more likely the team will <br>actually "see" themselves succeeding, even in the face of <br>the unknown. </p>
<p>&nbsp;&nbsp; 很明显，在团队方面的实现，系统的设计在逐渐演化的过程中形成，从本质上交互<br>的过程，帮助每个人在不确定性逐渐消除的过程中保持忍耐。参加项目并经历整个系<br>统建造生命周期的成员越多，整个团队意识在每个主要里程碑所有事都具备的可能性<br>就越大。这对于一个缺乏经验的团队成员是一个重要的信心缔造者。团队拥有的信心<br>水平越高，，业务客户的安全感越大，团队就更加可能看到他们的胜利，即使是面对<br>未知的事情。</p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/110558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-04-14 00:56 <a href="http://www.blogjava.net/jiangmin/articles/110558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Java Service Wrapper 把Java程序作为Windows系统服务 </title><link>http://www.blogjava.net/jiangmin/articles/109254.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Sun, 08 Apr 2007 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/109254.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/109254.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/109254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/109254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/109254.html</trackback:ping><description><![CDATA[<span class=javascript id=text95116>Java程序很多情况下是作为服务程序运行的，在Un*x平台下可以利用在命令后加&#8220;&amp;&#8221;把程序作为后台服务运行，但在Windows下看作那个Console窗口在桌面上，你是否一直担心别的同时把你的Console窗口关闭？是否怀念用VC写的Win32服务程序？<br>翻开JBOSS、Tomcat的发布包，发现他们都使用了一个Open source——Java Service Wrapper。用Java Service Wrapper可以轻松解决我们的需求，让我们的服务程序成为 Win32系统服务。<br>当然，在Un*x下也可以使用Java Service Wrapper，可以避免加&#8220;&amp;&#8221;的粗暴方式，导致每天收到一堆mail，通过Java Service Wrapper提供的日志方式查看运行信息。<br>Java Service Wrapper功能很强大，同时支持Windows及Un*x平台，提供三种方式把你的Java程序包装成系统服务，这里只介绍最简单的一种方式，因这种方式无需对已有的服务程序作任何改变，仅仅增加几个script、配置文件就可以把你的Java服务程序改造成系统服务程序了。<br>当然在使用之前需要到http://sourceforge.net/project/showfiles.php?group_id=39428下载Java Service Wrapper的发布包。<br><br>下面简单介绍一下具体的使用步骤：<br>1.&nbsp;&nbsp;将下载的Java Service Wrapper包解压到本地，目录为{WRAPPER_HOME}；<br>2.&nbsp;&nbsp;服务应用程序名为MyServApp，在目录d:\MyServApp下建立bin、conf、logs、lib目录；并把你的已有应用程序如NioBlockingServer.class拷贝到该目录下；<br>3.&nbsp;&nbsp;将{WRAPPER_HOME}\src\bin\下的遗以下文件拷贝到MyServApp目录下，并重命名。<br>{WRAPPER_HOME}\bin\Wrapper.exe  C:\ MyServApp \bin\Wrapper.exe<br>{WRAPPER_HOME}\src\bin\App.bat.in  C:\ MyServApp\bin\MyApp.bat<br>{WRAPPER_HOME}\src\bin\InstallApp-NT.bat.in  C:\ MyServApp\bin\InstallMyApp-NT.bat<br>{WRAPPER_HOME}\src\bin\UninstallApp-NT.bat.in  C:\ MyServApp\bin\UninstallMyApp-NT.bat<br>4.&nbsp;&nbsp;将{WRAPPER_HOME}\lib下的以下文件拷贝到C:\ MyServApp \lib目录下<br>{WRAPPER_HOME}\lib\Wrapper.DLL<br>{WRAPPER_HOME}\lib\wrapper.jar<br>5.&nbsp;&nbsp;将{WRAPPER_HOME}\src\conf\wrapper.conf.in拷贝到C:\ MyServApp \conf目录下并命名为wrapper.conf；并修改wrapper.conf文件，在其中配置您的应用服务。<br>主要修改以下几项即可：<br>#你的JVM位置：<br>wrapper.java.command=D:\Sun\j2sdk1.4.0_03\bin\java <br>#运行参数：如：<br>wrapper.java.additional.1=-Dprogram.name=run.bat<br>#classpath：<br>wrapper.java.classpath.1=../lib/wrapper.jar<br>wrapper.java.classpath.2=../bin/.<br># Java Library Path (location of Wrapper.DLL or libwrapper.so)<br>wrapper.java.library.path.1=../lib<br>#MAIN CLASS 此处决定了使用Java Service Wrapper的方式<br>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp<br>#你的Java应用类<br>wrapper.app.parameter.1= NonBlockingServer<br># 服务名<br>wrapper.ntservice.name=NB<br><br># Display name of the service<br>wrapper.ntservice.displayname=Nio Nonblocking Server<br># 服务描述<br>wrapper.ntservice.description=Nio Nonblocking Server<br>其他的配置根据你的需要改变即可<br>6.&nbsp;&nbsp;对以上配置的MyApp.bat进行测试，运行MyApp.bat，就像在Console窗口下运行Tomcat一样；<br>7.&nbsp;&nbsp;对以上配置的服务进行测试，运行C:\ MyServApp\bin\InstallMyApp-NT.bat将把你的应用（此处为NioBlockingServer）安装到Win32系统服务中了。<br>8.&nbsp;&nbsp;打开控制面板－管理程序－服务，看到Nio Nonblocking Server已经在系统服务中了，其他用法就与我们熟悉的Windows服务一样了。<br><br>Tomcat使用的是Java Service Wrapper模式二，这种方式需要对已有的程序进行小的改动，但可以通过Socket端口的方式控制服务程序核心的启动，更加灵活。Java Service Wrapper提供的模式三比较复杂，需要作出更多的编码，我没有研究。<br>采用模式一，即可简单有效的把我们的服务程序包装成为系统服务程序，并增强了日志功能，我们可以把MyServApp的几个文件做成模板，每次修改文件名，配置文件就可以了，有精力的朋友更可以做成Eclipse的plugin，鼠标点点就把应用配成服务了。<br></span>
<img src ="http://www.blogjava.net/jiangmin/aggbug/109254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2007-04-08 18:44 <a href="http://www.blogjava.net/jiangmin/articles/109254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详尽解析window.event对象</title><link>http://www.blogjava.net/jiangmin/articles/83899.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 27 Nov 2006 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/83899.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/83899.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/83899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/83899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/83899.html</trackback:ping><description><![CDATA[
		<p>描述<br /><br />event代表事件的状态，例如触发event对象的元素、鼠标的位置及状态、按下的键等等。<br /><br />event对象只在事件发生的过程中才有效。<br /><br />event的某些属性只对特定的事件有意义。比如，fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义。<br /><br />例子<br /><br />下面的例子检查鼠标是否在链接上单击，并且，如果shift键被按下，就取消链接的跳转。<br /><br />&lt;HTML&gt;<br />&lt;HEAD&gt;&lt;TITLE&gt;Cancels Links&lt;/TITLE&gt;<br />&lt;SCRIPT LANGUAGE="JScript"&gt;<br />function cancelLink() {<br />if (window.event.srcElement.tagName == "A" &amp;&amp; window.event.shiftKey) <br />window.event.returnValue = false;<br />}<br />&lt;/SCRIPT&gt;<br />&lt;BODY onclick="cancelLink()"&gt;<br /><br />下面的例子在状态栏上显示鼠标的当前位置。<br /><br />&lt;BODY onmousemove="window.status = 'X=' + window.event.x + ' Y=' + window.event.y"&gt;<br /><br />属性：<br /><br />altKey, button, cancelBubble, clientX, clientY, ctrlKey, fromElement, keyCode, offsetX, offsetY, propertyName, returnValue, screenX, screenY, shiftKey, srcElement, srcFilter, toElement, type, x, y <br /><br />--------------------------------------------------------------------------------<br /><br />1.altKey<br />描述：<br />检查alt键的状态。<br /><br />语法：<br />event.altKey<br /><br />可能的值：<br />当alt键按下时，值为 TRUE ，否则为 FALSE 。只读。<br /><br />2.button <br />描述：<br />检查按下的鼠标键。<br /><br />语法：<br />event.button<br /><br />可能的值： <br />0 没按键 <br />1 按左键 <br />2 按右键 <br />3 按左右键 <br />4 按中间键 <br />5 按左键和中间键 <br />6 按右键和中间键 <br />7 按所有的键 <br /><br />这个属性仅用于onmousedown, onmouseup, 和 onmousemove 事件。对其他事件，不管鼠标状态如何，都返回 0（比如onclick）。<br /><br />3.cancelBubble<br />描述：<br />检测是否接受上层元素的事件的控制。<br /><br />语法：<br />event.cancelBubble[ = cancelBubble]<br /><br />可能的值：<br />这是一个可读写的布尔值: <br /><br />TRUE 不被上层原素的事件控制。 <br />FALSE 允许被上层元素的事件控制。这是默认值。<br /><br />例子：<br />下面的代码片断演示了当在图片上点击（onclick）时，如果同时shift键也被按下，就取消上层元素（body）上的事件onclick所引发的showSrc()函数。<br /><br />&lt;SCRIPT LANGUAGE="JScript"&gt;<br />function checkCancel() {<br />if (window.event.shiftKey)<br />window.event.cancelBubble = true;<br />}<br />function showSrc() {<br />if (window.event.srcElement.tagName == "IMG")<br />alert(window.event.srcElement.src);<br />}<br />&lt;/SCRIPT&gt;<br />&lt;BODY onclick="showSrc()"&gt;<br />&lt;IMG onclick="checkCancel()" src="/sample.gif"&gt;<br /><br />4.clientX<br />描述：<br />返回鼠标在窗口客户区域中的X坐标。 <br /><br />语法：<br />event.clientX<br /><br />注释：<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。<br /><br />5.clientY<br />描述：<br />返回鼠标在窗口客户区域中的Y坐标。 <br /><br />语法：<br />event.clientY<br /><br />注释：<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。<br /><br />6.ctrlKey<br />描述：<br />检查ctrl键的状态。<br /><br />语法：<br />event.ctrlKey<br /><br />可能的值：<br />当ctrl键按下时，值为 TRUE ，否则为 FALSE 。只读。<br /><br />7.fromElement<br />描述：<br />检测 onmouseover 和 onmouseout 事件发生时，鼠标所离开的元素。 参考：18.toElement<br /><br />语法：<br />event.fromElement<br /><br />注释：<br />这是个只读属性。<br /><br />8.keyCode<br />描述：<br />检测键盘事件相对应的内码。<br />这个属性用于 onkeydown, onkeyup, 和 onkeypress 事件。<br /><br />语法：<br />event.keyCode[ = keyCode]<br /><br />可能的值：<br />这是个可读写的值，可以是任何一个Unicode键盘内码。如果没有引发键盘事件，则该值为 0 。<br /><br />9.offsetX <br />描述：<br />检查相对于触发事件的对象，鼠标位置的水平坐标 <br /><br />语法：<br />event.offsetX<br /><br />10.offsetY <br />描述：<br />检查相对于触发事件的对象，鼠标位置的垂直坐标 <br /><br />语法：<br />event.offsetY<br /><br />11.propertyName<br />描述：<br />设置或返回元素的变化了的属性的名称。<br /><br />语法：<br />event.propertyName [ = sProperty ]<br /><br />可能的值：<br />sProperty 是一个字符串，指定或返回触发事件的元素在事件中变化了的属性的名称。 <br />这个属性是可读写的。无默认值。<br /><br />注释：<br />你可以通过使用 onpropertychange 事件，得到 propertyName 的值。<br /><br />例子：<br />下面的例子通过使用 onpropertychange 事件，弹出一个对话框，显示 propertyName 的值。<br /><br />&lt;HEAD&gt;<br />&lt;SCRIPT&gt;<br />function changeProp()<br />{<br />btnProp.value = "This is the new VALUE";<br />}<br /><br />function changeCSSProp()<br />{<br />btnStyleProp.style.backgroundColor = "aqua";<br />}<br />&lt;/SCRIPT&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;P&gt;The event object property propertyName is <br />used here to return which property has been <br />altered.&lt;/P&gt;<br /><br />&lt;INPUT TYPE=button ID=btnProp onclick="changeProp()"<br />VALUE="Click to change the VALUE property of this button"<br />onpropertychange='alert(event.propertyName+" property has changed value")'&gt;<br />&lt;INPUT TYPE=button ID=btnStyleProp<br />onclick="changeCSSProp()"<br />VALUE="Click to change the CSS backgroundColor property of this button"<br />onpropertychange='alert(event.propertyName+" property has changed value")'&gt;<br />&lt;/BODY&gt;<br /><br />12.returnValue<br />描述：<br />设置或检查从事件中返回的值 <br /><br />语法：<br />event.returnValue[ = Boolean]<br /><br />可能的值： <br />true 事件中的值被返回 <br />false 源对象上事件的默认操作被取消 <br /><br />例子见本文的开头。<br /><br />13.screenX <br />描述：<br />检测鼠标相对于用户屏幕的水平位置 <br /><br />语法：<br />event.screenX<br /><br />注释：<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。<br /><br />14.screenY <br />描述：<br />检测鼠标相对于用户屏幕的垂直位置 <br /><br />语法：<br />event.screenY<br /><br />注释：<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。<br /><br />15.shiftKey<br />描述：<br />检查shift键的状态。<br /><br />语法：<br />event.shiftKey<br /><br />可能的值：<br />当shift键按下时，值为 TRUE ，否则为 FALSE 。只读。<br /><br />16.srcElement<br />描述：<br />返回触发事件的元素。只读。例子见本文开头。<br /><br />语法：<br />event.srcElement<br /><br />17.srcFilter <br />描述：<br />返回触发 onfilterchange 事件的滤镜。只读。<br /><br />语法：<br />event.srcFilter<br /><br />18.toElement<br />描述：<br />检测 onmouseover 和 onmouseout 事件发生时，鼠标所进入的元素。 参考：7.fromElement<br /><br />语法：<br />event.toElement<br /><br />注释：<br />这是个只读属性。<br /><br />例子：下面的代码演示了当鼠标移到按钮上时，弹出一个对话框，显示“mouse arrived”<br /><br />&lt;SCRIPT&gt;<br />function testMouse(oObject) {<br />if(oObject.contains(event.toElement)) {<br />alert("mouse arrived");<br />}<br />}<br />&lt;/SCRIPT&gt;<br />:<br />&lt;BUTTON ID=oButton onmouseover="testMouse(this)"&gt;Mouse Over This.&lt;/BUTTON&gt;<br /><br />19.type<br />描述：<br />返回事件名。<br /><br />语法：<br />event.type<br /><br />注释：<br />返回没有“on”作为前缀的事件名，比如，onclick事件返回的type是click<br />只读。<br /><br />20. x<br />描述：<br />返回鼠标相对于css属性中有position属性的上级元素的x轴坐标。如果没有css属性中有position属性的上级元素，默认以BODY元素作为参考对象。<br /><br />语法：<br />event.x<br /><br />注释：<br />如果事件触发后，鼠标移出窗口外，则返回的值为 -1<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。<br /><br />21. y<br />描述：<br />返回鼠标相对于css属性中有position属性的上级元素的y轴坐标。如果没有css属性中有position属性的上级元素，默认以BODY元素作为参考对象。<br /><br />语法：<br />event.y<br /><br />注释：<br />如果事件触发后，鼠标移出窗口外，则返回的值为 -1<br />这是个只读属性。这意味着，你只能通过它来得到鼠标的当前位置，却不能用它来更改鼠标的位置。</p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/83899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-11-27 22:22 <a href="http://www.blogjava.net/jiangmin/articles/83899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漫谈团队管理</title><link>http://www.blogjava.net/jiangmin/articles/68967.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68967.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68967.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68967.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #ffffff">项目经过了迭代一阶段，总体来说我对team还是比较满意的，尽管也出现了不少的问题，但在这些问题暴露出来后领导们就认为我这样管理team是不正确的，我对team的过于信任导致了这次迭代一出现了目标偏差的现象，但我个人不这么认为，在团队管理上我一直坚信应该建立在对team的信任以及建立team的一致作战能力、一致荣誉感上，而不是步步对team进行制度性的防范和监控，这个我是不太认同的，尽管这样的做法通常来说确实能得到一个比较好的结果，但是我认为在那样的team中工作是不快乐的，会容易造成team的疲惫感，工作除了付出自己的辛苦得到物质收获外，我觉得最重要的还是让team得到精神上的快乐，我倡导快乐工作。<br />不过当然，既然暴露出问题，自然值得总结，在总结后发现现在的team确实是有些松散，还不够紧密的团结，重要的是没形成统一的荣誉感，在这样的情况下我仍然认为并不是通过制度、监控等方法去控制team，而是仍然给team一定的空间，简单的说说这次出现的问题和自己的解决思路：<br />1、迭代版本产生了偏离需求和UI的现象<br />      出现这个现象我觉得最主要的原因是在提炼用户故事时做的不够好，同时在用户故事的录入上的控制<br />      也不够好，针对这次出现的现象，我觉得在用户故事上必须表达出一个成功的业务场景的详细描述(通<br />      过附带UI来说明)、业务规则的说明以及用户故事验证的说明。<br />      判断一个用户故事是否完成的标准就是成功的业务场景的执行、业务规则的满足以及是否能够通过用<br />      户故事验证。<br />      验证工作由on-site customer做，多数情况下on-site customer就是项目经理、BA或需求分析人员。<br />      通过频繁发布的持续集成版本将自己实现的用户故事与用户故事验证人员进行频繁的沟通和交流。<br />      开发人员往往对细节不够重视也是造成此现象的原因，开发人员往往只注重主体功能的完成，但把细<br />      节却给忽略了，这个在以后的迭代中需要进行纠正，培养开发人员对于用户故事完成的概念的认识。<br />2、开发人员在实现任务时出现了不知如何下手的现象<br />      造成这种现象的发生我觉得最主要的仍然是CRC设计以及任务分解上出现了问题，按照CRC设计的要<br />      求以及任务分解的要求这种现象出现的情况应该是不会发生的，尽管这次team的能力是有些欠缺，但<br />      CRC设计加上任务分解其实会形成非常明确的详细设计以及如何实现详细设计的任务，在这点上解<br />      决方案就是在下一次迭代会议上加强CRC设计以及任务分解这两块，CRC设计一定要能通过情景测<br />      试，任务分解一定要分解的足够清晰，让开发人员都能明白是怎么做的，至于碰到难点的地方自然是<br />      先安排为Spike任务。<br />3、开发人员在进行任务跟踪时出现偏离的现象<br />      开发人员仍然没能形成很好的任务跟踪的习惯，这点只能不断的纠正，培养开发人员形成这样的习<br />      惯。<br />4、接口依赖造成的瓶颈现象<br />      这是此次迭代出现的一个较大的问题，未形成一个迭代中的接口依赖的全貌图，导致了在任务分配后<br />      接口依赖常常集中在一个人的身上，出现了瓶颈现象，这点在第二个迭代中需要改进，增加整个迭代<br />      的接口依赖图，这个可根据CRC设计提取形成。<br />5、任务自行挑选造成的任务完成有难度的现象<br />      此次迭代中出现了这个现象，部分人员挑选了超过其能力很多的任务，最后导致了任务完成的过程中<br />      出现了很多的问题，这个我仍然觉得一方面是CRC设计的问题，另一方面是缺少PP的原因。<br />6、持续集成失败次数过多的现象<br />      此次迭代中造成持续集成失败的原因竟然多是测试代码编写的不正确以及测试代码对于运行数据的依<br />      赖，这个我在项目总结会议上进行了讲解，由于这个项目压力太大，而且team能力确实有些不足，所<br />      以我未强制执行TDD，不过仍然极度鼓励；第二个原因则是在造成了持续集成失败后未列为最高优先<br />      级的事去做。<br />这次出现这些问题虽然有些是和团队个人相关，但我更多的认为这就是整个团队的责任，而不是某个人的，因此在第二个迭代中我仍然是以培养整个团队的一致荣誉感为首，并且仍然给予团队足够的空间以及充分的信任；而且在第一次迭代中出现这些问题也是好事，毕竟这是一支全新的团队，在团队能力欠缺的情况下我对于团队的表现是比较满意的，在后续我仍然的更多是依靠交流、反馈以及共同作战来弥补上面的问题，而不是依靠制度和强制性的监督。<br />比较可喜的是Team开始接受整个软件过程，TDD也开始得到接受，而且team成员的能力提升也是比较的明显，这其实对我而言就已经达到目标了，相信这样的一支团队是不会让我失望的。</font>
		</p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/68967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 15:17 <a href="http://www.blogjava.net/jiangmin/articles/68967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理基础</title><link>http://www.blogjava.net/jiangmin/articles/68956.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68956.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68956.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68956.html</trackback:ping><description><![CDATA[echo、@、call、pause、rem　是批处理文件最常用的几个命令，我们就从他们开始学起。 <br /><br />echo　　　表示显示此命令后的字符<br />echo off　表示在此语句后所有运行的命令都不显示命令行本身<br />@ 与echo off相象，但它是加在其它命令行的最前面，表示运行时不显示命令行本身。<br />call　　　调用另一条批处理文件（如果直接调用别的批处理文件 ，执行完那条文件后将无法执行当前文件后续命令）<br />pause　　　运行此句会暂停，显示Press any key to continue... 等待用户按任意键后继续 <br />rem　　　表示此命令后的字符为解释行，不执行，只是给自己今后查找用的<br /><br />　　例：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br />　　批处理文件的内容为: 　　　　　　　　文件表示： <br />　　　　echo off　　　　　　　　　　　　不显示命令行 <br />　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br />　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br />　　　　echo 你好 　　　　　　　　　　　显示"你好" <br />　　　　pause 　　　　　　　　　　　　　暂停,等待按键继续 <br />　　　　rem 使用wps 　　　　　　　　　　注释将使用wps <br />　　　　cd ucdos　　　　　　　　　　　　进入ucdos目录 <br />　　　　wps 　　　　　　　　　　　　　　使用wps　　 <br />　　批处理文件中还可以像C语言一样使用参数，这只需用到一个参数表示符%。 <br />　　 %表示参数，参数是指在运行批处理文件时在文件名后加的字符串。变量可以从 %0到%9，%0表示文件名本身，字符串用%1到%9顺序表示。 <br />　　例如，C：根目录下一批处理文件名为f.bat，内容为 format %1 <br />　　则如果执行C:\&gt;f a: 　　　则实际执行的是format a: <br />　　又如C：根目录下一批处理文件的名为t.bat，内容为 type %1 type %2 <br />　　那么运行C:\&gt;t a.txt b.txt 将顺序地显示a.txt和b.txt文件的内容.<img src ="http://www.blogjava.net/jiangmin/aggbug/68956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 14:47 <a href="http://www.blogjava.net/jiangmin/articles/68956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>