﻿<?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-kapok-随笔分类-软件工程和项目管理</title><link>http://www.blogjava.net/kapok/category/652.html</link><description>垃圾桶,嘿嘿，我藏的这么深你们还能找到啊，真牛！</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:47:35 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:47:35 GMT</pubDate><ttl>60</ttl><item><title>encarta</title><link>http://www.blogjava.net/kapok/archive/2005/08/04/9345.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Thu, 04 Aug 2005 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/08/04/9345.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/9345.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/08/04/9345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/9345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/9345.html</trackback:ping><description><![CDATA[<A href="http://www.microsoft.com/products/encarta/docs/index.html">http://www.microsoft.com/products/encarta/docs/index.html</A><img src ="http://www.blogjava.net/kapok/aggbug/9345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-08-04 22:54 <a href="http://www.blogjava.net/kapok/archive/2005/08/04/9345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>student</title><link>http://www.blogjava.net/kapok/archive/2005/08/04/9344.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Thu, 04 Aug 2005 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/08/04/9344.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/9344.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/08/04/9344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/9344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/9344.html</trackback:ping><description><![CDATA[<A href="http://www.microsoft.com/student/docs/index.html">http://www.microsoft.com/student/docs/index.html</A><img src ="http://www.blogjava.net/kapok/aggbug/9344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-08-04 22:53 <a href="http://www.blogjava.net/kapok/archive/2005/08/04/9344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EA</title><link>http://www.blogjava.net/kapok/archive/2005/08/03/9153.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 03 Aug 2005 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/08/03/9153.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/9153.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/08/03/9153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/9153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/9153.html</trackback:ping><description><![CDATA[<A href="http://www.ttdown.com/SoftView/SoftView_25145.html">http://www.ttdown.com/SoftView/SoftView_25145.html</A><BR><BR><A href="http://www.sparxsystems.com.au/">http://www.sparxsystems.com.au/</A><img src ="http://www.blogjava.net/kapok/aggbug/9153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-08-03 21:41 <a href="http://www.blogjava.net/kapok/archive/2005/08/03/9153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM 2005开发者大会</title><link>http://www.blogjava.net/kapok/archive/2005/07/31/8812.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Sat, 30 Jul 2005 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/31/8812.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/8812.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/31/8812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/8812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/8812.html</trackback:ping><description><![CDATA[<A href="http://www.dwlive.com.cn/agenda.htm">IBM 2005开发者大会课程调查结果公布，课程数量为历次大会之冠！</A><A href="http://www.dwlive.com.cn/agenda.htm"><BR>http://www.dwlive.com.cn/agenda.htm</A><img src ="http://www.blogjava.net/kapok/aggbug/8812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-31 00:33 <a href="http://www.blogjava.net/kapok/archive/2005/07/31/8812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>资源下载，不知道有效性会有几天</title><link>http://www.blogjava.net/kapok/archive/2005/07/26/8458.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 26 Jul 2005 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/26/8458.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/8458.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/26/8458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/8458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/8458.html</trackback:ping><description><![CDATA[<A href="http://www.jecio.com/jysr-down/jysr-down-ITCON01.htm">http://www.jecio.com/jysr-down/jysr-down-ITCON01.htm</A><img src ="http://www.blogjava.net/kapok/aggbug/8458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-26 10:12 <a href="http://www.blogjava.net/kapok/archive/2005/07/26/8458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Network</title><link>http://www.blogjava.net/kapok/archive/2005/07/25/8438.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 25 Jul 2005 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/25/8438.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/8438.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/25/8438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/8438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/8438.html</trackback:ping><description><![CDATA[<A href="http://www.netadmin.com.cn/">http://www.netadmin.com.cn/</A><BR><BR><A href="http://www.netadmin.com.cn/">http://www.netadmin.com.cn/</A><img src ="http://www.blogjava.net/kapok/aggbug/8438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-25 21:31 <a href="http://www.blogjava.net/kapok/archive/2005/07/25/8438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>男人必看得5个故事 </title><link>http://www.blogjava.net/kapok/archive/2005/07/24/8352.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Sun, 24 Jul 2005 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/24/8352.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/8352.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/24/8352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/8352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/8352.html</trackback:ping><description><![CDATA[<STRONG><FONT size=4><A href="http://blog.csdn.net/eaglecoody/archive/2005/07/13/423594.aspx">http://blog.csdn.net/eaglecoody/archive/2005/07/13/423594.aspx</A><BR>1、 情况不同 <BR></FONT></STRONG>一只小猪、一只绵羊和一头乳牛，被关在同一个畜栏里。有一次，牧人捉住小猪，牠大声号叫，猛烈地抗拒。绵羊和乳牛讨厌牠的号叫，便说：「他常常捉我们，我们并不大呼小叫。小猪听了回答道：「捉你们和捉我完全是两回事，他捉你们，只是要你们的毛和乳汁，但是捉住我，却是要我的命呢!<BR><STRONG><FONT color=#92dd22>立场不同、所处环境不同的人，很难了解对方的感受；因此对别人的失意、挫折、伤痛，不宜幸灾乐祸，而应要有关怀、了解的心情。要有宽容的心！</FONT></STRONG> 
<P><FONT size=4><STRONG>2、 靠自己 </STRONG></FONT></P>
<P>小蜗牛问妈妈：为什么我们从生下来，就要背负这个又硬又重的壳呢？ <BR>妈妈：因为我们的身体没有骨骼的支撑，只能爬，又爬不快。所以要这个壳的保护！ <BR>小蜗牛：毛虫姊姊没有骨头，也爬不快，为什么她却不用背这个又硬又重的壳呢？ <BR>妈妈：因为毛虫姊姊能变成蝴蝶，天空会保护她啊。 <BR>小蜗牛：可是蚯蚓弟弟也没骨头爬不快，也不会变成蝴蝶他什么不背这个又硬又重的壳呢？ <BR>妈妈：因为蚯蚓弟弟会钻土, 大地会保护他啊。 <BR>小蜗牛哭了起来：我们好可怜，天空不保护，大地也不保护。 <BR>蜗牛妈妈安慰他：「所以我们有壳啊！」<FONT color=#ee3d11><STRONG>我们不靠天，也不靠地，我们靠自己。</STRONG></FONT></P>
<P><BR><FONT size=4><STRONG>3、 鲨鱼与鱼 </STRONG></FONT></P>
<P>曾有人做过实验，将一只最凶猛的鲨鱼和一群热带鱼放在同一个池子，然后用强化玻璃隔开，最初，鲨鱼每天不断冲撞那块看不到的玻璃，耐何这只是徒劳，它始终不能过到对面去，而实验人员每天都有放一些鲫鱼在池子里，所以鲨鱼也没缺少猎物，只是它仍想到对面去，想尝试那美丽的滋味，每天仍是不断的冲撞那块玻璃，它试了每个角落，每次都是用尽全力，但每次也总是弄的伤痕累累，有好几次都浑身破裂出血，持续了好一些日子，每当玻璃一出现裂痕，实验人员马上加上一块更厚的玻璃。后来，鲨鱼不再冲撞那块玻璃了，对那些斑斓的热带鱼也不再在意，好像他们只是墙上会动的壁画，它开始等着每天固定会出现的鲫鱼，然后用他敏捷的本能进行狩猎，好像回到海中不可一世的凶狠霸气，但这一切只不过是假像罢了，实验到了最后的阶段，实验人员将玻璃取走，但鲨鱼却没有反应，每天仍是在固定的区域游着它不但对那些热带鱼视若无睹，甚至于当那些鲫鱼逃到那边去，他就立刻放弃追逐，说什么也不愿再过去，实验结束了，实 验人员讥笑它是海里最懦弱的鱼。 </P>
<P><FONT color=#0938f7><STRONG>可是失恋过的人都知道为什么，它怕痛。</STRONG></FONT></P>
<P><FONT size=4><STRONG>4、 神迹 </STRONG></FONT></P>
<P>法国一个偏僻的小镇，据传有一个特别灵验的水泉，常会出现神迹，可以医治各种疾病。有一天，一个拄着拐杖，少了一条腿的退伍军人，一跛一跛的走过镇上的马路，旁边的镇民带着同情的回吻说：「可怜的家伙，难道他要向上帝祈求再有一条腿吗??」这一句话被退伍的军人听到了，他转过身对他们说：「我不是要向上帝祈求有一条新的腿，而是要祈求祂帮助我，叫我没有一条腿后，也知道如何过日子。」 <BR>试想：<STRONG><FONT color=#a3bb44>学习为所失去的感恩，也接纳失去的事实，不管人生的得与失，总是要让自已的生命充满了亮丽与光彩，不再为过去掉泪，努力的活出自己的生命。</FONT></STRONG></P>
<P><BR><FONT size=4><STRONG>5、 钓竿 </STRONG></FONT></P>
<P>有个老人在河边钓鱼，一个小孩走过去看他钓鱼，老人技巧纯熟，所以没多久就钓上了满篓的鱼，老人见小孩很可爱，要把整篓的鱼送给他，小孩摇摇头，老人惊异的问道：「你为何不要？」小孩回答：「我想要你手中的钓竿。」老人问：「你要钓竿做什么？」小孩说：「这篓鱼没多久就吃完了，要是我有钓竿，我就可以自己钓，一辈子也吃不完。」我想你一定会说：好聪明的小孩。错了，他如果只要钓竿，那他一条鱼也吃不到。因为，他不懂钓鱼的技巧，光有鱼竿是没用的，因为钓鱼重要的不在＜钓竿＞，而在＜钓技＞有太多人认为自己拥有了人生道上的钓竿，再也无惧于路上的风雨，如此，难免会跌倒于泥泞地上。<STRONG><FONT color=#667199>就如小孩看老人，以为只要有钓竿就有吃不完的鱼，像职员看老板，以为只要坐在办公室，就有滚进的财源。<BR><BR><BR><BR><A href="http://community.csdn.net/Expert/topic/4144/4144028.xml?temp=.3016779">http://community.csdn.net/Expert/topic/4144/4144028.xml?temp=.3016779</A><BR><BR>一些小朋友连婚都没有结，学什么项目管理！ </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>世界上哪里见过全是Girl的软件公司？将来生了Baby，也要和儿子沟通嘛，所以每个Team里面必须要有1名Girl！（林老师规定的组建Team的要求之一） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>××著名软件工程大师居然也去鼓吹XP，我们认为他应该呆在意大利唱Opear的，他却唱起了Rack&amp;Roll！ </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>有了Contract，就有了benefit和responsibility，啊，这个benefit和responsibility是相互的，比如说，我给我老婆爱，这是我的responsibility，我老婆就会给我烧菜吃，这就是我的benefit。（林老师解释Contract时作的比喻） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>等上到CMM5，简直就是一位武林高手已经到了自废武功、无招胜有形的地步……（林老师对CMM5的无限敬仰） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>这个weekly report就是你对你老板做的忏悔。 </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>UP是正楷，XP是草书。先学好了UP，才能学好XP；先学XP再学UP就会乱套。 </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>Martin Fowler原来约好在交大讲座，却突然生病给送进了中山医院。听说Martin Fowler前一天在西安，据我推测，他是在西安吃拉面吃坏了肚子……（梁阿磊老师评语：这是软件工程在中国水土不服的具体表现） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>中国人上到黄山顶上想到的可能是李白的诗，德国人上到黄山顶上想到的可能是贝多芬的交响乐，一条狗爬到黄山顶上能想到什么！——它大概在找大便在哪里。（林老师在解释View概念时） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>我想可能是中国人吃猪肉的原因，所以大家上课都在打瞌睡，而美国人吃的是牛肉，就从来没有见过美国人上课打瞌睡。——啊，等到考试那天，同学们都最好到学校外××牛肉面馆，饱饱的吃上一顿，这个精神就会很好！ </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>软件工程好比是一个包子，技术是里面的馅，管理是外头的皮。小朋友们光爱吃馅不爱吃皮，我们大人就不同了，啊，我们要把馅和皮一起吃下去。 </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>IT业界犹如一个台风，风暴眼中心站着的是Bill的MS，围绕着他激烈旋转的是IBM、SUN和Larry的Oracle(Alliance but ms)，其中IBM那~是黑帮老大，一个手势就能Kill掉SUN的技术成果，但是IBM也在搞婚外恋，和MS一起在推WebServices，另外王嘉廉的CA是MS的走狗。（林老师的青梅煮酒论英雄） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>Jini技术是distributed object computing技术进化树上的猿猴，已经偏离了向人类进化的正确方向。 </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>老爸拥有女儿，女儿叻就要向老爸提供：1.Cute函数(返回：30分钟的enjoyment)，2.每月交钱函数(返回：500块)，3.买酒给老爸喝函数(返回：1980酿上等女儿红)，4.女婿拍马屁函数(返回：void)。（林老师解释OO概念的核心比喻，随切入的话题有不同变化） </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>软件工作就像裁缝做西装，从设计、裁剪到缝制加工，细部要求非常精巧，体现着一种quality。 </FONT></STRONG></P>
<P><STRONG><FONT color=#667199>在我的感觉里，Larman是个打工仔，Pressman是个书呆子。 <BR></FONT></STRONG></P><img src ="http://www.blogjava.net/kapok/aggbug/8352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-24 21:37 <a href="http://www.blogjava.net/kapok/archive/2005/07/24/8352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UMLTools</title><link>http://www.blogjava.net/kapok/archive/2005/07/20/8029.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 20 Jul 2005 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/20/8029.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/8029.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/20/8029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/8029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/8029.html</trackback:ping><description><![CDATA[<A href="http://www.uml.org.cn/UMLTools/umlTools.asp">http://www.uml.org.cn/UMLTools/umlTools.asp</A><BR><BR><A href="http://www.uml.org.cn/UMLTools/200507193.htm">http://www.uml.org.cn/UMLTools/200507193.htm</A><BR><BR><A href="http://www.uml.org.cn/j2ee/200507154.htm">http://www.uml.org.cn/j2ee/200507154.htm</A><img src ="http://www.blogjava.net/kapok/aggbug/8029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-20 10:18 <a href="http://www.blogjava.net/kapok/archive/2005/07/20/8029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Document能力以及UML</title><link>http://www.blogjava.net/kapok/archive/2005/07/18/7930.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 18 Jul 2005 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/18/7930.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/7930.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/18/7930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/7930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/7930.html</trackback:ping><description><![CDATA[<A href="http://www.wendang.com/sort/30_1.htm">http://www.wendang.com/sort/30_1.htm</A><BR><BR><A href="http://www.umlchina.com/Article/BestIndex1.htm">http://www.umlchina.com/Article/BestIndex1.htm</A><BR><BR><A href="http://www.wendang.com/">http://www.wendang.com/</A><img src ="http://www.blogjava.net/kapok/aggbug/7930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-18 18:42 <a href="http://www.blogjava.net/kapok/archive/2005/07/18/7930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CWW</title><link>http://www.blogjava.net/kapok/archive/2005/07/02/7042.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Sat, 02 Jul 2005 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/07/02/7042.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/7042.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/07/02/7042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/7042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/7042.html</trackback:ping><description><![CDATA[<A href="http://www.cww.net.cn/zhuanti/EAI/Article.asp?id=20427">http://www.cww.net.cn/zhuanti/EAI/Article.asp?id=20427</A><img src ="http://www.blogjava.net/kapok/aggbug/7042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-07-02 20:02 <a href="http://www.blogjava.net/kapok/archive/2005/07/02/7042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2005年06月20日-2005年06月26日 AMT CLUB资料下载全列表 </title><link>http://www.blogjava.net/kapok/archive/2005/06/29/6857.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 29 Jun 2005 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/06/29/6857.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/6857.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/06/29/6857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/6857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/6857.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2005年06月20日-2005年06月26日 AMT CLUB资料下载全列表资料中心学习小组：关于思维导图的学习小黑屋作品：每周周一更新在AMT CLUB 资料中心,点击进入　共享信息，共享知识，共享心情资料名文件大小资料说明“南药决胜、创新、核心商业模式”81个PP.PPT562K“...&nbsp;&nbsp;<a href='http://www.blogjava.net/kapok/archive/2005/06/29/6857.html'>阅读全文</a><img src ="http://www.blogjava.net/kapok/aggbug/6857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-06-29 09:26 <a href="http://www.blogjava.net/kapok/archive/2005/06/29/6857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>印度软件尴尬中国启示录 </title><link>http://www.blogjava.net/kapok/archive/2005/06/27/6796.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 27 Jun 2005 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/06/27/6796.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/6796.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/06/27/6796.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/6796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/6796.html</trackback:ping><description><![CDATA[<P><A href="http://www.amteam.org/static/58512.html">http://www.amteam.org/static/58512.html</A><BR>在“软件大国”、“外包奇迹”等光环的映射下，人们往往只看到印度软件企业的风光无限，却很少有人注意到他们在中国软件市场上的尴尬和无奈。</P>
<P>“印软经验”确实曾经给中国软件企业以很大的帮助和借鉴，但时至今日，面对已经变化良多的市场环境和竞争对手，中印软件企业之间更多的已经不是“学习与被学习”的简单关系，而是“羚羊与狮子竞跑”的残酷现实。</P>
<P>“我们没有达到原来的期望”。谈到MphasiS公司在中国IT服务市场的经营状况，其首席执行官杰瑞·拉奥(JerryRao)认真地说。MphasiS是第一波投资中国的印度信息技术(IT)服务公司之一，总部位于印度孟买。由于看好中国的软谐∏熬埃?002年10月，MphasiS从美国信用卡发行商CapitalOne手中买下了现在的上海运营中心。</P>
<P>事实上，MphasiS只是印度一家中等规模的高科技公司，如果说仅仅因为规模的原因导致其在华业务的增长比预期要慢的话，那么很难解释像印度的IT四巨头，即塔塔咨询服务(TataConsultancy)、InfoSys、Wipro以及Satyam在中国软件市场上的日子也不如意的事实。</P>
<P>不可否认，“印软经验”确实曾经给过中国软件企业以很大的帮助和借鉴，但在这块至今仍让印度软件企业“垂涎三尺”的市场上，中国本土软件企业已经具备足够的竞争力和杀伤力。对印度软件企业而言，学会中国软件市场的游戏规则也许是突破其市场瓶颈的第一关。</P>
<P>“借中国床，孵印度蛋”</P>
<P>近年来，“进军中国”对致力于国际化的印度软件企业来说似乎已经成为一种时尚，尤其是2002年，登陆上海浦东软件园的印度企业几乎可以用“蜂拥而至”来形容。</P>
<P>对于以软件外包闻名全球的印度软件企业来说，进入中国似乎并没有什么特殊意义，因为相对于欧美和日本，中国的软件外包市场并不大—2004年其规模也只有6.33亿美元，仅占全球外包市场的1.9%，显然这对于“印度象”的巨大胃口不会有太多的吸引力。</P>
<P>根据一般的看法，印度软件巨头们进入中国的原因与十多年前一些全球大的咨询公司和会计师事务所来华的情况有类似之处，那就是全球500强企业中有一大批都在华建立了分支机构，而这些企业多数是印度软件企业的客户或者合作伙伴。</P>
<P>除此之外，另外一种比较流行的解释是：印度软件企业期望通过中国作为跳板进入并拓展日韩市场。对于这样的说法，曾在印度做过数年软件外包培训，目前供职于安氏中国的宋雷对记者谈了一些不同看法。他认为，进入日韩市场并非印度软件企业进军中国的主因，这一点从印度软件企业在华分支机构的招聘启事就能看出来—几乎没有一家在招聘精通日语或者韩语的员工，倒是英语出色的程序员很受欢迎。在他看来，印度软件纷纷在华登陆，目的绝不仅仅是在日本或者韩国多占点外包份额那么简单，而是有着更长远的规划。</P>
<P>“成也外包，败也外包，外包在成就印度软件业的同时，也恰恰是它最大的软肋”，宋雷解释说：“外包的实质是劳务输出，这和国内民工进城打工从本质上来说是一样的，印度缺少自己的软件品牌和知识产权，对欧美的软件外包虽然给他们带来了利润，但IBM、微软、Oracle、SAP等全球巨头的强势也注定了那样的外包合作模式不可能扭转印度‘软件蓝领’的地位—尽管做了多年外包，但印度公司依然很少有机会做架构或者进入总包商行列。在树立自有的知识产权和品牌方面，印度并不比中国同行做得好多少”。</P>
<P>在他看来，印度软件企业目前最大的目标，恰恰是摆脱“外包专业户”的形象，在软件产业链上游有所作为，登陆中国，则是实现这一目标的重要环节。对于内需极度匮乏，几乎完全靠欧美外包支撑的印度软件业来说，中国市场拥有诸多优良条件：内需巨大，企业信息化和电子商务发展势头迅猛，质优价廉的人力资源，最重要的是，中国软件企业相对弱小。这些无疑都是期待“二次腾飞”的印度软件企业们最看重的。</P>
<P>“这好比一只狼，跟狮子合作只能吃到残羹剩饭，但跟没有反抗能力的肥羊打交道就不同了。凭借自身的相对优势，印度企业完全有机会在中国树立其强势地位，并且能从容地发展出自有品牌和知识产权—“借中国的温床，孵印度的蛋”。当然这仅仅是印度软件企业一方的如意算盘，实际发展有没有这么顺利就不一定了”。</P>
<P>陷入尴尬境地</P>
<P>现实似乎总是与理想有一定的差距。进军中国几年后，“印度象”们普遍遭遇到了市场发展瓶颈。</P>
<P>与IBM、SAP在中国大兴土木、建全球研发中心的意气风发相比，印度软件企业在华投资显得相当谨慎，基本上可以用“试水”来形容。根据统计数据，2004年前三个季度，有21家印度公司在中国直接投资，但投资总额仅为1700万美元，在同期外国IT企业在华直接投资中所占的比例小得可怜。考虑到从2002年起，印度前四名的软件企业塔塔、InfoSys、Wipro以及Satyam就已陆续在上海登陆，这一谨慎投资行为看起来只能理解为：“印度象”在华的旅途并不愉快！</P>
<P>实际情况也从不同角度佐证了这一点。除了2002年左右，媒体曾经大批量报道过关于印度软件企业争食中国市场之外，就很少见到其他新闻见诸报端，业内也基本上见不到塔塔、InfoSys们的大手笔。期间甚至出现曾经号称印度第二大软件公司的Zensar与亚洲物流科技有限公司合资的汉道科技咨询公司成为笑谈的事情：成立伊始，Zensar公司首席执行官曾放言“一年内员工总数超过2000，成为中国首屈一指的管理咨询与软件顾问公司”，而一年后的2003年，这一言论已被证明只是“放卫星”，甚至直到现在，也远没有达到当年预期的经营目标。</P>
<P>同样的事情也发生在MphasiS身上，拉奥认为在中国拥有一席之地非常重要，但眼下低迷的经营状况，也不得不让他考虑解决这一问题的途径。下一波正在拟订中国战略的印度中型IT服务企业中，有几家也持有MphasiS这样的谨慎态度。</P>
<P>事实上，包括塔塔、InfoSys在内的印度在华软件巨头都遭遇到了现实与理想的巨大落差。成立之初，这些印度软件企业基本上都将在华的分公司定位为软件或者IT咨询公司，目的就是想摆脱“外包”的固有印象，在大幅度扩张的基础上树立软件或者咨询品牌。然而从实际运营情况来看，这些独/合资公司最终都在规模扩张方面裹足不前，主要业务也仍然局限于外包领域。</P>
<P>难以突破的瓶颈？</P>
<P>那么究竟是什么原因导致了“印度象”们在中国软件市场上的集体失声？</P>
<P>专门从事软件外包的用友软件工程公司的某项目负责人一语道破天机：“印度软件企业的困境主要来自于内外两方面，内在的是印度公司固有的习惯和思维模式，外在则是中国软件市场的规则和激烈竞争。很多印度公司的想法过于理想化，也过于自信，以为软件工程做得好就可以在其他领域同样复制，这一点从很多印度软件公司在华机构都是独资就能看出来”。</P>
<P>在该项目负责人看来，创建一个软件品牌是一项繁复浩大的工作，并非“开发流程＋英文优势”的印度软件发展模式就能简单塑造的。“印度在外包领域还属于应用层面，介于以色列、爱尔兰等基础件外包商和中国这样的低端应用外包商之间，在往两端走的时候必然会遭遇两方面的竞争。比如他们要在国内做ERP或者MIS等管理软件品牌，就会遭遇到很多问题，SAP、Oracle、IBM等欧美企业在高端树立的壁垒已经很难逾越，而用友、金蝶在中低端特别是财务领域也已经比较稳固。此外，本土化的各个方面都需要外来者好好研究，中国独特的监管环境、渠道体系和中国企业狠劲十足的打单方式都容易让习惯了国际惯例的印度软件企业吃不消。”</P>
<P>另一方面，中国软件行业独特的潜规则和激烈的市场竞争显然也是印度软件企业的发展障碍。中国软件企业希望从印度企业身上学到国际外包方面的经验，但同时会牢牢掌控已经苦心经营多年的国内软件市场。品尝了十多年“技术换市场”酿成的苦果，中国企业目前在技术引进的心态上已经趋于成熟。而印度软件企业此时进入必然会遭遇前所未有的阻碍，通过常用的本土化手段渗透和打入中国的主流软件市场虽然机会天天有，但其操作难度已经不可同日而语。</P>
<P>对于上述的瓶颈，印度软件企业并非没有意识到，其中“先知先觉”者已经开始通过并购、合作等方式企图“突围”，但更多的印度软件企业选择了“静坐”的方式，在他们看来，在中国扩张的主要障碍在于中国缺乏大量国际外包经验丰富且使用双语的项目经理，而这方面的问题在中国加入WTO后将会逐步得到解决，显然仍旧对中国软件市场的游戏规则存在模糊认识。</P>
<P>但无论如何，当初放言“中国软件企业还没有能力帮助我们”的印软老总们开始意识到与国内软件企业合作的重要性，这毕竟就是一种进步。碰完钉子的人通常都会学聪明一点，曾经“牛气冲天”的塔塔、InfoSys们这两年明显感受到了力不从心—“本土化”这一门槛即使是IBM、Oracle等软件巨头也没法绕过，“印度象”们如果想和IBM一样的跳“中国舞”，低下骄傲的头颅看来是不可避免了。</P>
<P>中国软企：外包不是“万能药”</P>
<P>英语口语还不太熟练的“软件外包国家队员”们的远征计划也许是又一次“十字军东征”</P>
<P>钱钟书先生笔下的“围城”故事似乎一直在现实生活的不同场合被演绎出不同的版本。这一次，中国和印度的软件企业分别站在了围城的内外—就在印度公司极力想摆脱包工头形象转而塑造软件品牌的时候，不少走了十多年品牌路线的国内企业却把赌注押到了外包上……</P>
<P>当外包成为一种信仰</P>
<P>和“中小企业信息化”一样，“软件外包”同样是时下IT业界最热门的关键词之一，与前者浓重的本土特色不同，这一业务模式更像是舶来品。不过外包这一模式也的确让不少国内软件企业尝到了甜头。</P>
<P>以对日软件外包出身、号称国内最大软件企业的东软为例，其目前的三大业务营业额占整体的比率分别为：国内软件与服务占70%、数字医疗占20%、国际业务占10%。根据东软内部资料，2002年占公司收入比重超过70%的国内业务，净利润仅占到了7971万元净利润的5%左右，2003年则发生首次亏损。但公司软件外包业务利润率却一直保持在30%以上，高的项目甚至可达40%—软件外包几乎成为整个公司的救命稻草。</P>
<P>东软也许只是一个缩影，现实情况是，像东软这样靠外包过活的国内企业并不在少数，反而像中科红旗、永中这样走品牌路线的软件企业则举步维艰。具有自主品牌和知识产权的国内业务还不如为别人代工的业务赚钱，这已经成为中国软件产业的“特色”，或者说是“怪现象”。</P>
<P>对于这样的“中国特色”，东软一位做系统集成的员工这样解释：“做解决方案对国内企业来说盈利很难，一方面其中很大部分比重是利润非常薄的硬件销售，另一方面，在与国外竞争对手竞标的时候，我们常常需要用低很多的价码去冲才能拿下，但解决方案需要铺开，会消耗大量的人力财力。相比较而言，软件外包就没有这么麻烦，基本上是命题作文，回款也相对容易一点”。</P>
<P>在这种情况下，众多做项目起家的软件企业都趋之若骛，将箭头瞄准了软件外包业务。2004年“组建软件外包国家队”等一系列事件更是将这股“外包风”推向了高潮。</P>
<P>零食还是正餐？</P>
<P>对于炙手可热的软件外包和众多软件企业的蠢蠢欲动，中科院院士倪光南泼出了“学习印度，但不可照搬”的冷水。他认为，中国和印度国情的最大不同在于，印度没有很大的内需市场，而中国有很大的内需市场，这是中国软件企业的大本营，如果仅仅因为片面追求外包而将国内市场丢掉，无疑将会本末倒置。所以在相当长的时间内，外包应该作为中国软件业的“零食”而不是“正餐”。</P>
<P>“印度软件业目前仅仅是在外包领域称雄，还算不上是真正的软件强国，去年其在全球软件产业总额中只占1.6%，与第一位美国的42%相差极大，也远不及欧盟和日本。其次印度的外包模式存在明显缺陷：知识产权和品牌存在严重软肋，也不利于建立自主完整的软件体系。实际上印度软件企业几年前就已经意识到这一点，目前也在努力改变这种情况。而目前国内软件企业对于‘印软经验’的学习比较盲目，譬如过分追求和强调CMM认证，其实CMM认证有其局限性，并不能满足所有软件企业的需求，像微软、Oracle、Sun等软件巨头都没有做CMM认证，也能说明这一点”。</P>
<P>对上述看法，宋雷也表示了赞同，“印度的外包神话其实有点歪打正着的味道，因为当初印度国内没有内需，所以只能给语言体制相近的欧美做外包。但美国、欧洲和日本的软件发展都没有经过这样的阶段，因此中国软件企业完全没有必要效仿，也效仿不了。而且印度目前在全球外包领域也处于不上不下的尴尬境地，只有欧美应用外包这一根救命稻草”。</P>
<P>“打个不恰当的比喻，杨过断了一只手练成了绝世武功，但你不能因为这个也砍断自己的手才练功，更何况你就是砍断了也练不成。印度在软件外包方面的诸多优势和做法，我们大部分都能学，但语言优势是我们永远也没法模仿的，而这一点在极需要沟通的外包业务中是举足轻重的。此外，体制和文化上的差异短时间内也无法消除。反过来其实一样，印度一直无法进入日韩市场主要也是这方面的原因，所以我觉得，中国软件企图通过外包途径打入欧美主流市场只可能是‘邯郸学步’”。</P>
<P>最佳途径：“防守反击”</P>
<P>对于中国软件行业的发展方向，有业内人士认为，最佳途径应该是“防守反击”——即在创建自有软件品牌，巩固国内市场的前提下适当发展外包，在国际市场上有所作为。</P>
<P>尽管从全球角度而言，国内并没有一个知名的软件品牌，但十多年来的发展，国内多数软件企业走的还是品牌路线，考虑到中国巨大的内需市场，这不能不说是一个好习惯。</P>
<P>“在品牌创建和基础软件发展上，中国软件企业做的要比印度好”，对于中国软件业自身的优势，倪光南院士认为：“这些年国内软件企业还是出了不少品牌，比如金山、永中、红旗，尽管早期主要集中在应用领域，但近年在基础软件领域也有了一些突破。目前，中国已经有自己的Linux操作系统，其他数据库、中间件也都有一定的发展，而这些都是印度软件行业所欠缺的。今后占据软件产业链主导地位的，必然是以知识产权为核心，以品牌、产品和解决方案带动的企业，而目前一些国内的软件企业显然正在朝这个方向发展”。</P>
<P>有业内人士认为对于类似东软这样的国内软件企业，如果要在全球站稳脚根，归根结底还是要能在欧美市场上争雄，但在目前的竞争形式下，显然需要相当过硬的品牌来支持，毕竟从“虎口里拔牙”需要相当得力的“钳子”。</P>
<P>来源：互联网周刊</P><img src ="http://www.blogjava.net/kapok/aggbug/6796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-06-27 23:39 <a href="http://www.blogjava.net/kapok/archive/2005/06/27/6796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AMT</title><link>http://www.blogjava.net/kapok/archive/2005/06/27/6795.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 27 Jun 2005 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/06/27/6795.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/6795.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/06/27/6795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/6795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/6795.html</trackback:ping><description><![CDATA[<A href="http://www.amteam.org/docs/bdfpview1.asp?layout=2004-EIP">http://www.amteam.org/docs/bdfpview1.asp?layout=2004-EIP</A><img src ="http://www.blogjava.net/kapok/aggbug/6795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-06-27 23:34 <a href="http://www.blogjava.net/kapok/archive/2005/06/27/6795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>功能驱动开发模式FDD</title><link>http://www.blogjava.net/kapok/archive/2005/06/10/5890.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Fri, 10 Jun 2005 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/06/10/5890.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/5890.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/06/10/5890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/5890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/5890.html</trackback:ping><description><![CDATA[<DIV style="LAYOUT-GRID:  15.6pt none">
<P style="TEXT-ALIGN: center" align=center><B><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 黑体; LETTER-SPACING: 2pt"><A href="http://www.huihoo.com/development/fdd.html">http://www.huihoo.com/development/fdd.html</A><BR><BR>功能驱动开发模式<SPAN lang=EN-US>FDD</SPAN></SPAN></B></P>
<P><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>Feature-Driven Development</SPAN><SPAN style="FONT-FAMILY: 宋体">）是由</SPAN><SPAN lang=EN-US>Peter Coad</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>Jeff de Luca </SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>Eric Lefebvre</SPAN><SPAN style="FONT-FAMILY: 宋体">共同开发的一套针对中小型软件开发项目的开发模式。</SPAN></P>
<P><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">是一个模型驱动的快速迭代开发过程，它强调的是简化、实用、</SPAN> <SPAN style="FONT-FAMILY: 宋体">易于被开发团队接受，适用于需求经常变动的项目。简单地说，</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">“是一个以</SPAN><SPAN lang=EN-US>Architecture</SPAN><SPAN style="FONT-FAMILY: 宋体">为中心的，采用短迭代期，目期驱动的开发过程。它首先对整个项目建立起一个整体的模型，然后通过两周一次‘设计功能</SPAN><SPAN lang=EN-US>-</SPAN><SPAN style="FONT-FAMILY: 宋体">实现功能’的迭代完成项目开发”。此处的“功能”是指“用户眼中最小的有用的功能”，它是可理解的、可度量的，并且可以在有限的时间内（两周）实现。在开发过程中，开发计划的制定、报告的生成、开发进度的跟踪均是以上述“功能”为单位进行的。在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中，它认为：<B>只有良好定义的并且简单的过程才能被很好地执行</B>。另外，由于在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中采用了短周期的迭代，最小化的功能划分法，所以可以对项目的开发进程进行精确及时地监控。</SPAN></P>
<P><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">的使用需要有相应工具的支持，</SPAN><SPAN lang=EN-US>Peter Coad</SPAN><SPAN style="FONT-FAMILY: 宋体">等人开发出了一套扩展的</SPAN><SPAN lang=EN-US>UML</SPAN><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>FDD UML Extensions</SPAN><SPAN style="FONT-FAMILY: 宋体">），并在</SPAN><SPAN lang=EN-US>Together</SPAN><SPAN style="FONT-FAMILY: 宋体">中实现有关的功能，详细内容可参见后文。</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中，存在“主要功能集”、“功能集”、“功能”等概念，它们之间的关系及示例如下所示：</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">主要功能集</SPAN><SPAN lang=EN-US> = </SPAN><SPAN style="FONT-FAMILY: 宋体">功能集</SPAN><SPAN lang=EN-US>1 + </SPAN><SPAN style="FONT-FAMILY: 宋体">功能集</SPAN><SPAN lang=EN-US>2 + …</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">功能集</SPAN><SPAN lang=EN-US> = </SPAN><SPAN style="FONT-FAMILY: 宋体">功能</SPAN><SPAN lang=EN-US>1 + </SPAN><SPAN style="FONT-FAMILY: 宋体">功能</SPAN><SPAN lang=EN-US>2 + …</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">其中，主要功能集是在初始阶段根据用户的需求所制定出来的比较粗的，有待于细化的对开发项目所需要功能的描述；功能是在开发过程细化的结果，在每个迭代期中需要实现若一干个功能，这些功能的集合被称之为功能集。</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中，它将开发过程划分为如下五个阶段：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">制定整体的模型</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">根据优先级列出功能的详细列表</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">依据功能制定计划</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">依据功能进行设计</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">实现功能</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">每个阶段的定义又是通过被称之为：</SPAN><SPAN lang=EN-US>ETVX</SPAN><SPAN style="FONT-FAMILY: 宋体">的方法从下面四个方面加以描述的：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Entry</SPAN><SPAN style="FONT-FAMILY: 宋体">：</SPAN><SPAN lang=EN-US>Specify clear and well defined entry criteria for the process</SPAN><SPAN style="FONT-FAMILY: 宋体">；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Task</SPAN><SPAN style="FONT-FAMILY: 宋体">：列出所有要实现的任务列表，名称，是否需要实现，任务描述；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Verification</SPAN><SPAN style="FONT-FAMILY: 宋体">：；制定对过程结果的评批标准；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>eXit</SPAN><SPAN style="FONT-FAMILY: 宋体">：过程结束时所需的结果；</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=137 src="http://www.huihoo.com/development/i/i08.jpg" width=487 v:shapes="_x0000_i1025"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">过程示意图</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中主要存在三类人员：主要开发人员、类的所有者、功能团队，它们各自的含义如下：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">主要开发人员：用于领导其它开发人员进行</SPAN><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">的开发，对开发工作进行监督（例如对设计及代码进行审查）。主要开发人员的数量由项目整体的大小所决定，如果需要加快开发进度则可以再培养新的主要开发人员。与其它开发人员相比，主要开发人员具有更高的开发效率。</SPAN><SPAN lang=EN-US>Fred Brooks</SPAN><SPAN style="FONT-FAMILY: 宋体">在几十年前就提出了：增加开发人员数量只会降低开发效率。但对于小型的，以用户功能驱动的轻量及的开发过程此原则并不适用。在此过程中采用增加人员的方法可以提高开发的并行效率。</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">类的所有者：一个类有且只有一个所有者，即一个类只能由一名开发人员进行设计及编码。采用这种方式是十分有效的，因为开发人员会感觉他拥有了部分属于自已的代码，他会以此为荣；此外，它还可以保证相关代码的一致性。如果此类中包含有复杂的算法，那么可以再增加一名专门负责算法的开发人员。虽然</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">是面向用户功能的，而不是面向类的，但用户最终关心的是那些他们需的功能，而并不关心在开发时采用何种框架模式，所以在此以类为单位进行人员分配与开发的宗旨并不矛盾。</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">功能团队：开发时功能会被分配给主要开发人员，再由主要开发人员根据实现此功能所需类的所有关系找到有关的开发人员从而构成一个临时的（最多两周）的团队。一名开发人员可以同时负责多个类的开发工作，即他可以在同一时刻处于多个功能团队中。因此在每个</SPAN><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">中功能团队的人员均可能发生变化。在此团队中主要开发人员处于核心地位，团队内部的交流也是经及为中心的。采用这种方法可以加速开发进度，并且主要开发人员还可以对过程进行必要的监控，保证设计与实现的一致性。从更高的角度来看，主要的系统设计师又负责监控各功能团队中的主要开发人员。</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">采用</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">方式进行开发时，各阶段时间的分配关系大致如下所示：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Develop an overall model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10% initial, 4% on-going</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Build a features list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4% initial, 1% on-going</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Plan by feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2% initial, 2% on-going</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Design by feature, build by feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 77%<SPAN style="FONT-FAMILY: 宋体">（两周一个迭代期）</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=216 src="http://www.huihoo.com/development/i/i10.jpg" width=615 v:shapes="_x0000_i1026"> </SPAN></P>
<P><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">中各阶段时间分配关系：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>DBF</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Walk through the domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1%</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Design&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40%</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Inspect the design&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3%</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>BBF</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Code/test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45%</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Inspect the code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10%</P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">²<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN>Promote to build&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1%</P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=150 src="http://www.huihoo.com/development/i/i12.jpg" width=595 v:shapes="_x0000_i1027"> </SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">需要注意的是：上述</SPAN><SPAN lang=EN-US>Coding</SPAN><SPAN style="FONT-FAMILY: 宋体">的过程中还包含有单元测试的内容。此外单从</SPAN><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">的过程来看，设计所有的时间要比编码的时间长（</SPAN><SPAN lang=EN-US>40% : 45%</SPAN><SPAN style="FONT-FAMILY: 宋体">），但考虑到</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">的整个实施过程（包括前期的建模过程），设计的时间还是比编码的时间要长的（</SPAN><SPAN lang=EN-US>45% : 35%</SPAN><SPAN style="FONT-FAMILY: 宋体">）。</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">在</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中另一个重要的，并且也是十分有特色的部分就是它的报告功能。每周</SPAN><SPAN lang=EN-US>Release</SPAN><SPAN style="FONT-FAMILY: 宋体">经理要召开一次会议，会议一般限定于</SPAN><SPAN lang=EN-US>30</SPAN><SPAN style="FONT-FAMILY: 宋体">分钟以内，在会上每个主要的开发人员全面地介绍其所做的工作，并标识出相应的项目状态图。通过这种口头上的交流，可以确保各主要开发人员能对项目的其它部分有一个充分的了解。会后，</SPAN><SPAN lang=EN-US>Release</SPAN><SPAN style="FONT-FAMILY: 宋体">经理还要根据有关内容更新数据库中的信息并生成相应的报告，这个报告将发送给项目团队、用户以及主要的管理人员。</SPAN></P>
<P><SPAN lang=EN-US><IMG height=148 src="http://www.huihoo.com/development/i/i14.jpg" width=680 v:shapes="_x0000_i1028"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=237 src="http://www.huihoo.com/development/i/i15.gif" width=449 v:shapes="_x0000_i1029"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=333 src="http://www.huihoo.com/development/i/i16.gif" width=593 v:shapes="_x0000_i1030"> </SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">为跟踪项目开发状态需要使用数据库对有关内容加以保存，在数据库中应保存如下信息：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">类型（问题域、人的交互活动、系统交互活动）</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">标识（功能集前缀</SPAN><SPAN lang=EN-US>+</SPAN><SPAN style="FONT-FAMILY: 宋体">序列号）</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">状态（正在处理、不再需要、正常）</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">主要功能集</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">功能集</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">文档引用信息</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">活动事件</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">主要开发人员</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">问题域分析时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">设计时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">设计复查时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">编码时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">编码复查时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">提交构造时的计划日期，实际日期</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">备注</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=329 src="http://www.huihoo.com/development/i/i17.gif" width=595 v:shapes="_x0000_i1031"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体">项目计划表</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=243 src="http://www.huihoo.com/development/i/i18.gif" width=495 v:shapes="_x0000_i1032"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体">功能详细列表</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">另外，有关类及类的所有者的信息保存在其它的表中。根据数据库可自动生成有关报告。</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=205 src="http://www.huihoo.com/development/i/i19.jpg" width=372 v:shapes="_x0000_i1033"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体">项目已完成功能统计表</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG height=193 src="http://www.huihoo.com/development/i/i20.gif" width=327 v:shapes="_x0000_i1034"> </SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">中扩展的</SPAN><SPAN lang=EN-US>UML<BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN></P>
<H1><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 黑体">FDD 过程 #1: 开发总体模型</SPAN></H1>
<P><B><SPAN lang=EN-US style="COLOR: blue">Entry Criteria:</SPAN></B></P>
<P class=MsoBodyTextIndent><SPAN style="FONT-FAMILY: 楷体_GB2312">客户已准备好建立一个系统。他已经有采用某种形式保存的需求列表。此时用户可能还不能完全分清楚什么是他“必面要的”，什么是他“想要的，最好有的”，但这没有关系。</SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Tasks:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">组建建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">项目管理</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">建模团队是由来自于领域以及开发方面的永久性人员组成。在建模的过程中也可以从其它项目中人员以便有更多的人可以参与并对模型进行评估。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">领域分析</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">领域专家对问题域进行介绍，此过程可能是</SPAN><SPAN lang=EN-US>20</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">分钟也可能是几个小时，需根据具体的问题域情况决定。在介绍时所涉及的内容应比问题域稍大一些。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">学习资料</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">可选</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">学习各种资料，包括：组件模型、传统的或者是采用</SPAN><SPAN lang=EN-US>use-case</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">方式描述的功能需求书、数据模型以及用记手册。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">生成非正式的功能列表</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">系统设计师</SPAN> <SPAN style="FONT-FAMILY: 黑体">主要程序员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">建模团队生成非正式的功能列表，至于具体的细化和完善留到下一阶段进行。如果需要的话，应将有关的参考资料一并注明。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">开发子模型</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">划分为小组形式的建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">系统设计师提出最初的组件或者是入手点。根据对问题域的理解，小组使用原型及组件创建出类图。创建过程如下：首要关心的是类以及它们之间的关系，然后是类所包含的函数，最后才是类所具有的属性。在寻找类的函数的过程中可以参考对问题域的理解，最初的功能列表，以及原型中所建议的函数等方法。同时还需要生成一个或多个非正式的序列图。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">开发模型</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">系统设计师</SPAN> <SPAN style="FONT-FAMILY: 黑体">建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>&nbsp; </TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">记录候选模型</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">系统设计师</SPAN> <SPAN style="FONT-FAMILY: 黑体">主要程序员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">记录员（可以由团队人员分别担任）记录下来工作中所评估过的比较重要的但未被采用的模型，以便于将来在项目中参考。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Verification:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">内部及外部的评审</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">建模团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">参与此项目的领域专家进行内部自评，外部评审是必须的，以便判断对问题域的理解是否正确，功能是否是必须的，范围是否合理。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Exit:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">结束过程时，团队必须提交如下内容，并且这些内容已经过开发经理以及系统设计师的审阅及批准：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">类图，包括：类、类间关系、类的函数以及属性。类及类间关系建立起了模型的大致轮廓。根据最初的功能有列表以及非正式的序列图而来的函数展现出系统的功能，并且是后续开发过程中建立详细功能列表的前提。此外还应有非正式的序列图。</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">非正式的功能列表。</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">其它可供选择的模型信息。</SPAN><SPAN lang=EN-US></SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN></B>
<H1><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 黑体">FDD 过程 #2: 创建功能列表</SPAN></H1>
<P><SPAN style="FONT-FAMILY: 宋体">在此阶段，团队标识出所有的功能，对其加以分组，为其设定优先级，并设置相应的权重。</SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体">在下面的活动中，小组工作的重点在于功能，因此领域专家可以不再需要。</SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Entry Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 宋体">建模团队已成功地完成了</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">第一阶段的工作，开发出了系统的整体模型。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 楷体_GB2312"></SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Tasks:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">组建功能列表团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">项目经理</SPAN> <SPAN style="FONT-FAMILY: 黑体">开发经理</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">功能列表团队是由来自于领域专家以及开发方面的固定人员构成的。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">标识功能</SPAN> <SPAN style="FONT-FAMILY: 黑体">创建功能集</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能列表团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">团队首先从上一阶段得到的非正式的功能列表入手，接着：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">将模型中的函数转换为功能</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">将模型中的</SPAN><SPAN lang=EN-US>moment-intervals</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">转换为功能集（并将功能集再组织成主功能集），头脑风暴，选择，添加功能以便实现用户所要的以及所想的。</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">在此采用下述格式进行描述：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">针对功能：</SPAN><SPAN lang=EN-US> &lt;action&gt;the&lt;result&gt;&lt;by | for | of | to&gt;a(n)&lt;object&gt;</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">针对功能集：</SPAN><SPAN lang=EN-US>&lt;action&gt;&lt;-ing&gt;a(n)&lt;object&gt;</SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">针对主功能集：</SPAN><SPAN lang=EN-US>&lt;object&gt;management</SPAN></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">此处的</SPAN><SPAN lang=EN-US>object</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">可以指一个人、一个地点或者一件事（包括：角色、某一时刻、某一时间段或者是描述）</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">为功能集以及功能设置优先级</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能列表团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">通过“</SPAN><SPAN lang=EN-US>Feature Board</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">”为功能集以及功能设置优先级。优先级的划分：</SPAN><SPAN lang=EN-US>A</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">（必须实现），</SPAN><SPAN lang=EN-US>B</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">（最好能实现），</SPAN><SPAN lang=EN-US>C</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">（如果可能则实现），</SPAN><SPAN lang=EN-US>D</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">（以后再实现）。设置时是依据用户的满意程序所定的。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">分解复杂功能</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能列表团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">在系统设计师的带领下开发人员对功能进行查开，以便找到那些无法在两周之内完成的功能，对此类功能应将其细分为更小的功能或步骤。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Verification:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">内部及外部的评审</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能列表团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">参与此项目的领域专家进行内部自评，外部评审是必须的，以便判断对问题域的理解是否正确，功能是否是必须的，范围是否合理。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Exit Criteria:</SPAN></B></P>
<P><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">本阶段结束时，详细的功能列表必需已经产生了，并且将功能进行分组形成主功能集以及功能集，此外这些内容已经过开发经理以及系统设计师的审阅及批准。</SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN></B>
<H1><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 黑体">FDD 过程 #3: 根据功能制定计划</SPAN></H1>
<P><SPAN style="FONT-FAMILY: 宋体">根据已制定的层次化的、具有优先级以及权重的功能列表，项目经理、开发经理以及主要开发人员一起制定出</SPAN><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">阶段的里程碑。</SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Entry Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 宋体">功能列表团队已成功地完成了</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">第二阶段的工作，并已形成详细的功能列表。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 楷体_GB2312"></SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Tasks:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">计划制定团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">项目经理</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">计划制定团队由项目经理、开发经理以及主要开发人员给成。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">制定功能以及功能集的开发顺序</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">计划制定团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">计划制定团队设置开发的先后顺序，并制定出最初的针对功能集或者主要功能集的完成日期。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">为类指定实现人</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">计划制定团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">根据开发顺序以及功能的重要性为每个类指定特定的实现人。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">为主要功能集以及功能集指定相应负责的主要设计人员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">计划制定团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">根据开发顺序以及功能的重要性为每个主要功能集或者是功能集指定相应负责的主要开发人员。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Verification:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">内部及外部的评审</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">计划制定团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">参与此项目的计划制定人员进行内部自评，外部评审是必须的，并且是由更高一级的管理人员进行。采用“由顶向下”的方式让所有的开发人员均对此计划进行评估。通常一些开发人员由于过分保守会希望延长开发时间。但另一方面，项目经理或者是开发组长又会觉得“每个人都具有与我相同的能力”从而认为可以提前完成开发。在此应进行相应的平衡。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Exit Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">本阶段结束时，开发计划已经产生了，并且这些内容已经过开发经理以及主要设计师的审阅及批准。计划中应包括以下内容：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">一个整体的开发日期</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">针对每个主要功能集、功能集、功能指定有关负责人（</SPAN><SPAN lang=EN-US>CP</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">）以及完成时间</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">针对每个类，指定负责其完成的开发人</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN style="FONT-FAMILY: 黑体">注意：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">为便于为功能设置优先级，可以创建一个称之为</SPAN><SPAN lang=EN-US>FFB</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">（待实现功能板）。</SPAN><SPAN lang=EN-US></SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN></B>
<H1><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 黑体">FDD 过程 #4: 根据功能进行设计（DBF）</SPAN></H1>
<P><SPAN style="FONT-FAMILY: 宋体">根据已制定的层次化的、具有优先级以及权重的功能列表，项目经理、开发经理以及主要开发人员一起制定出</SPAN><SPAN lang=EN-US>DBF/BBF</SPAN><SPAN style="FONT-FAMILY: 宋体">阶段的里程碑。</SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Entry Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 宋体">计划制定团队已成功地完成了</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">第三阶段的工作。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 楷体_GB2312"></SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Tasks:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">组建</SPAN><SPAN lang=EN-US>DBF</SPAN><SPAN style="FONT-FAMILY: 黑体">团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">主要程序员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">主要开发人员从已有的类中找与可能与特点功能有关的类，然后找到负责实现这些类的开发人员并将他们组建成功能实现团队。开始进行功能的设计，如果需要的话，还可以请领域专家加入。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">问题域学习</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN> <SPAN style="FONT-FAMILY: 黑体">领域专家</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">可选</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">（本步骤是可选的，主要依赖于功能的复杂性而定）领域专家将对问题域进行一个一般性的介绍，他只介绍与功能有关的内容，但这并不是为理解与功能有关的上下文所必须的工作。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">学习有关参考资料</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">可选</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">（本步骤是可选的，主要依赖于功能的复杂性而定）根据功能列表中所列的参考书目以及其它的可拿到的资料，功能实现团队的成员进行学习，以便获得与功能相关的详细的信息。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">创建序列图</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">根据对功能的理解以及原有的非正式的序列图和组件，功能实现团队创建一正式的，详细的序列图。同时应记录下可选择的其它方案、决定以及注释。主要的开发人员将序列图添加至项目模型中（同时也要更新相应的类图）。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">实现类及其方法的原型</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">每位类的实现人员根据序列图更新有关类及类中的方法，这包括：方法的参数、返回值、错误处理以及消息的发送。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">设计复查</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">功能实现团队完成对设计的复查。如果主要开发人员认为有关功能的设计比较复杂并对其有所担心的话，他可以从别的地方请若干人员一起进行复查。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">记录设计复查活动</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">文档人员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">团队中的文档人员针对类的实现人按顺序将有关设计复查的活动记录下来。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Verification:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">设计复查</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">功能设计团队通过对序列图的“走查“实现内部的复查。外部评审是必须的，以确保存有关功能均以实现。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Exit Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">本阶段结束时，应已完成如下工作，并且这些工作已经过主要设计师的审阅及批准。计划中应包括以下内容：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">功能及其相关参考资料（如果有的话）</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">详细的序列图</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">更新后的类图</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">更新后的类及其方法原型</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">开发团队认为有价值的其它实现方案</SPAN><SPAN lang=EN-US></SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN></B>
<H1><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 黑体">FDD 过程 #5: 根据功能进行设计（BBF）</SPAN></H1>
<P><SPAN style="FONT-FAMILY: 宋体">在</SPAN><SPAN lang=EN-US>DBF</SPAN><SPAN style="FONT-FAMILY: 宋体">工作的基础上，每个类的实现者完成类的各个方法。此外他还需完善基于类的测试方案并实现类一级的单元测试。根据主要开发人员的意见，功能实现团队可能还需在进行单元测试之前先进行源代码检查。当代码编写并检查后开发人员就将其放入配置管理系统中。在所有的类均已完成并</SPAN><SPAN lang=EN-US>Check-In</SPAN><SPAN style="FONT-FAMILY: 宋体">之后，主要开发人员将代码提升以便进行构造。</SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Entry Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 宋体">功能实现团队已成功地完成了</SPAN><SPAN lang=EN-US>FDD</SPAN><SPAN style="FONT-FAMILY: 宋体">第四阶段的工作。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 楷体_GB2312"></SPAN></P>
<P><B><SPAN lang=EN-US style="COLOR: blue">Tasks:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">实现类及其方法</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">根据</SPAN><SPAN lang=EN-US>DBF</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">中的详细的序列图类的实现人员完成类的方法的实现。此外他也要为测试实现有关的测试方法。主要开发人员则需添加针对功能的测试方法。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">代码检查</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">主要开发人员负责安排一次针对</SPAN><SPAN lang=EN-US>BBF</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">的代码检查，检查可以在单元测试之前也可以在其后。一般检查是由功能实现团队成员加以完成的，如果主要开发人员认为需要的话，也可以请团队以外的人进行检查。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">代码检查记录</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">文档人员</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">团队中的文档人员针对每个类的实现人将有关的代码检查活动记录下来。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">单元测试</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">每个类的实现人员均需测试相应的类的代码以及此类所支持的功能。作为所有功能的集成者，主要开发人员对整个功能进行测试。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN lang=EN-US>Check-In</SPAN><SPAN style="FONT-FAMILY: 黑体">代码并对其进行构造</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">代码一旦编写完成并经过检查和测试，类的实现人就可以将其放入配置管理系统中。当所有的类均已完成</SPAN><SPAN lang=EN-US>Check-In</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">并且可以正常工作时，主要开发人员将提升代码以便进行构造，同时更新在功能列表中的有关功能的状态信息。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Verification:</SPAN></B></P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">代码检查及单元测试</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">功能实现团队</SPAN><SPAN lang=EN-US></SPAN></P></TD>
<TD class=Normal vAlign=top width=212 bgColor=#d9d9d9>
<P><SPAN style="FONT-FAMILY: 黑体">必须</SPAN></P></TD></TR>
<TR>
<TD class=Normal vAlign=top width=637 colSpan=3>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">功能实现团队必须进行代码检查。文档人员应记录有关活动。</SPAN><SPAN lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE>
<P><B><SPAN lang=EN-US style="COLOR: blue">Exit Criteria:</SPAN></B></P>
<P><SPAN style="FONT-FAMILY: 楷体_GB2312">本阶段结束时，应已完成如下工作，并且这些工作已经过主要设计师的审阅及批准。计划中应包括以下内容：</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">实现了类的方法并对代码进行了检查和单元测试</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">按顺序针对每个类的方法的单元测试记录</SPAN><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US style="FONT-FAMILY: Symbol">-<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">类已被开发人员</SPAN><SPAN lang=EN-US>Check-In</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">，主要开发人员已提升代码进行构造并同步更新功能状态。</SPAN><SPAN lang=EN-US></SPAN></P></DIV><img src ="http://www.blogjava.net/kapok/aggbug/5890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-06-10 18:07 <a href="http://www.blogjava.net/kapok/archive/2005/06/10/5890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>potian的留言！太好了，不得不转载一下</title><link>http://www.blogjava.net/kapok/archive/2005/05/23/5083.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 23 May 2005 15:32:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/05/23/5083.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/5083.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/05/23/5083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/5083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/5083.html</trackback:ping><description><![CDATA[<P><A href="http://firebody.blogbus.com/logs/2004/08/338549.html">http://firebody.blogbus.com/logs/2004/08/338549.html</A><BR><BR>转自：javaeye论坛&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：potian</P>
<P>说明：这些帖子都是在讨论工厂模式，容器配置，构造函数产生对象的方式各自优缺时的回帖。很不错！感谢potian！！！</P>
<P>除了静态方法对具体子类的直接依赖问题之外，对象的产生封装在对象内部也是一个很奇怪的想法，如果在不同情况下，例如需要同步或者需要lazy等等的话，你必须针对修改你的代码，实际上我们最关心的是能够在不同场合使用同一个对象的业务逻辑，而你这样做的话会紧紧因为我们需要不同的对象创建方法而修改对象的代码，这是非常不智的，这也是singleton被视作evil的重要原因之一。（例如singleton，有时候我们希望使用超类的实例，有时候希望使用子类的实例，有的时候我们希望产生单个，有的时候需要产生多个[取singleton单控制点的含义]，有的时候需要同步，有的时候不需要同步，在集群的情况我们甚至可能需要数据库来实现唯一化控制，有时候希望缓存，有的时候不需要缓存，有的时候希望增强，有的时候希望采用动态代理产生。所以一般来说，我们希望在一个系统内部最多只有一个入口的singleton，而我们也往往也不打算在其它不同的场合重用这个singleton）。 <BR><BR>代码的重用是对他业务逻辑的重用，这正是对象的核心价值。所以如同charon所说的，相对而言，我们往往不在乎组装代码的重用性，而是追求业务代码本身可以被按照不同的组装方式使用，例如既可以在EJB下，也可以在普通的Java应用程序中，既可以作为远程传输的对象，因此，我们往往不会去强制对象构造和产生的方式（例如由EJB容器产生，由IOC容器产生、有抽象工厂产生，或者直接由new产生），相反，是把对象的产生交给外部负责，这样才能达到在不同场合下对象最大的可重用性。说个简单的，如果对象的构造方法是私有的，那么现在的很多框架（例如hibernate，JavaBean,EJB等等你就根本不能使用了).这也是现在认为POJO比有特殊要求的对象更好的原因，因为任何一种框架和技术都可以自由选择自己的方式来创建对象。 <BR><BR>所有创建型设计模式和IoC容器的使用正是基于这样的假设的，只有对象把构造的责任交给外部来实现，那么我们才能有效地隐藏对象创建的时机、方式、方法，给不修改对象本身的代码而能够使用不同的对象创建方式（包括使用子类，替代类）提供了前提，从而提高对象实现业务逻辑的在不同场合的可重用性。所以不是说一定要用IOC容器或者用抽象工厂，而是可以用这些方法，也可以不用这种方法。而就抽象工厂和IoC容器本身而言，通过它们各自的封装，可以进一步实现对不同具体实现子类的解绑，就更加好了。如果有一天你不想用Pico或者不想用抽象工厂，你可以选择其他更加合适的方法来实现解绑。而这个责任不应该交给对象自己来实现，因为我们根本无法预料这个对象将会以什么样的方式被构造出来，在什么时候构造出来，需要依赖什么其它外部机制构造出来（例如可能依赖数据库，或者依赖串行化），这最好是有外部使用这个对象的环境来决定 <BR><BR>最终，我们希望能够让对象的创建、对象的销毁完全脱离对象的使用，垃圾收集器已经为我们提供VM级别的支持，而抽象工厂和工厂方法以及其它构造型设计模式，IoC从模式和框架的角度给我们另一半。 <BR><BR>你这个已经是每次返回一个新的对象了，我要每次得到同一对象，我该怎么办，你是不是叫我重新再在上面包一个类，把第一次取到的对象缓存起来，以后每次去取那个对象？这个时候你每次new一个还有什么意义，你说可以把它改成单个，那我原先在用的代码怎么办？ <BR><BR>再复杂一点，如果是需要在集群的服务器之间保持singleton，有的时候我需要用数据库来持久对象状态，通过数据库来保持唯一性，那你这份代码需要依赖于JDBC，这个时候如果一个普通的应用程序是不是也要依赖于JDBC？ <BR><BR>区别在于你的代码是放在本类里面的，你这个类构造会直接依赖于你的环境和当前的假设，别人根本没办法重用你的类 <BR><BR>构造函数为什么没有这些缺陷，因为我们可以通过另外一个类来实现和不同环境的结合，而我们正在谈论的这个类本身可以在任何地方使用而不需要修改任何代码.这是非常重要的，这是重用的基础，从我们谈的范围内来说，如果对照OCP，那么它是C，一旦关闭，永不修改。构造函数为什么没有这个问题，因为他自己不对任何构造自己的方法作出额外的假设(构造函数是最最近基本的假设了），而把构造的方法、意图和时机完全交给了外部，如果对照OCP，那么它是O。除非你的静态方法永远等同于new，不然的话，你任何一种实现方式都是对可能的构造方式进行无意义的假设，会限制其他场合对你这份代码重用的可能性，而如果永远等于new，那你这个静态方法还有什么用。 <BR><BR>举例来说，假设有3个应用，对一个对象需要三种不同的构造方法，一个需要proxy以实现拦截，一个需要普通的java类做测试，另一个需要从数据库里面读取以保持集群之间的唯一性，我只需要对不同的环境写不同的工厂，而不需要去改你那个嵌在业务代码中的静态方法，即使改了也不能同时重用于三个场合，你这个时候告诉我这是外部设计的决策. 和你的实现细节无关，我可以在外面去包一个类，那我要你那个静态方法干什么，这个静态方法里面到底是返回proxy还是普通java对象还是从数据库里面读取，任何一个都没有意义 <BR><BR>总而言之，任何在本类内部假设自己将被如何、何时、以何种方式进行构造的代码是极其不利于重用的（例如singleton就是一种限制重用的方法,只不过它由他自己适合的环境，因为任何系统里面肯定有一些类是可以重用，而有一些是特定于某个应用的）。因为你适合了一种环境的构造，必然会产生对另一种状况的不适合，所以最好的方式是什么也不假设，把如何构造的责任传递给另外一个类或者框架，那个类可以结合具体的重用场合实现构造，缓存，单件化，动态代理等等它希望做的任何动作。 <BR><BR>面向对象的中心点是职责分离和变化频率的分离，对一个希望被重用的对象来说，它的业务代码是它变化频率较低的部分（这是重用的基本假设），而由于目前各种不用容器、测试、分布式计算、事务处理等等场合的需要，它如何被构造的可能性则是一个比它本身业务逻辑变化率高得多的东西，这两种职责必须被分离。 <BR><BR><BR>至于你这种设计方法完全依赖于子类和继承上的困难就更不用谈了。你说你的大多数类不让继承，OO最重要的概念就是差异编程和增量编程，这是提高内外部质量、提高生产率的核心思想，如果没有记错的话，《面向对象软件构造》第一章里面就明确地提出了几个重要的内外部指标，也是整个OO思想的软件工程基础。 <BR></P><BR><img src ="http://www.blogjava.net/kapok/aggbug/5083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-05-23 23:32 <a href="http://www.blogjava.net/kapok/archive/2005/05/23/5083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把用例应用到实时系统中的实践 </title><link>http://www.blogjava.net/kapok/archive/2005/04/27/3857.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 27 Apr 2005 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/27/3857.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3857.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/27/3857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3857.html</trackback:ping><description><![CDATA[<BLOCKQUOTE><A href="http://www.uml.org.cn/appCase/20004120701.htm">http://www.uml.org.cn/appCase/20004120701.htm</A><BR><BR>本文介绍了一个真实的范例，然后讨论了在把用例用来定义实时系统的规格时遇到的问题，以及相关的经验学习。</BLOCKQUOTE>
<P class=content><A name=IDAXBE2>概述</A><BR>本文基于我去年为客户开发一个实时控制系统的工作。</P>
<P class=content>本文的目标是：第一，重点描述实时系统规格的确定和用例之间的关系；第二，描述我们如何开发用例模型以及应用用例给我们带来了哪些益处。</P>
<P class=content>要说明的第一件事情是为什么我们需要类似这样的一篇文章，然后我们再说明用用例来描述实时系统有哪些特殊之处。 </P>
<P class=content>在叙述为什么需要本文之后，我将描述一个具体项目和它的用例模型。我将重点描述用例模型的一些有趣的和有意义的特性，然后看看它们是如何有益于项目的。最后，我将讨论一些经验学习，并给出一些建议。</P>
<P class=content><A name=IDACCE2>为什么我们需要这篇文章？</A><BR>有一种看法认为用例只对你描述高度交互的系统有用，这些系统以IT系统为代表，如银行系统。例如，在银行中你可能需要处理一个抵押应用，它会有大量的用户交互。对于实时系统来说，并不存在那么多的用户交互。但是，如果实时系统具有有意义的外部可视的行为，用用例描述仍然对定义它们的规格是有用的，即使在一些用例中用户只是选择一些设置以及告诉系统完成一些功能。</P>
<P class=content>在为客户工作了这么多年来，我发现用例被广泛地误解。尽管有很多与之相关的书籍、文章和培训课程。可能这些书籍、文章和培训课程都只关注于问题，因此它们提供大量的不同的方法。在这些著作中经常提到的一个例子是自动柜员机(ATM)。类似这样的例子对于说明一些问题是有用的，但在处理很大而且很复杂的实际系统时却通常没有明显的帮助。在实时系统中你将怎样处理出现的问题？有一些实际的例子可以对你有所帮助，本文恰恰可以给你提供这样一个实际的例子。</P>
<P class=content><A name=IDALCE2>什么是实时系统的特点？</A><BR>实时系统就是时间是最关键因素的系统。如果一个系统不理会它的时间需求，将可能导致生命危险，例如造成飞机失事。简单来说，对于这样的系统，对于时间需求处理的失败将可能导致产品的损害和上百万美元的损失。</P>
<P class=content>实时系统也有最小限度的用户交互，对于这类系统怎么样定义它的用例是一件值得考虑的事情。实时系统通常都是高度算法化的，用例可能并不是最好的描述算法的文档方法。典型地，一个用例将引用在其它地方描述的算法。</P>
<P class=content>如果你的系统具有有效的外部可视行为，那么用例能够极大地帮助你文档化你的系统需求。下面我描述的系统就有大量外部可视行为。在IT系统中应用用例的规则在这里仍然适用。</P>
<P class=content><A name=IDAVCE2>产品传送系统(PT)项目</A><BR>用户是一个全球最大的铁矿生产商，它在澳大利亚西北的Headland港拥有一套铁矿传送工厂。铁矿从传送带网络传送到火车车厢，然后分类，称重，保存在仓库。最后铁矿从仓库中运出，再通过传送带运送到船上。</P>
<P class=content>这个系统中每个东西都很大。有的传送带有7公里长，需要15分钟才能启动。运行传送带网络需要一个复杂的控制系统。对控制系统的一个需求是减少运行系统需要的人数。另一个需求是降低对运行系统的人的培训需求。图1是工厂的航拍图。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig1.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图1：</B> Hedland港工厂的航拍图 
<P class=content>在左上角有一个船泊位。你可以看到有铁路线从右边连过去。卸货场在接近于中间的垂直线附近。在这个线的顶端是粉碎机。你可以在北面和南面的院子里看到仓库。传送带运行在卸货场和粉碎机，以及粉碎机和仓库之间。 你可以看到运输机从仓库装上铁矿，把它运到船上。运输机的容量非常大。在这个系统中，传送带可以在一小时内传送10000吨的铁矿！</P>
<P class=content>有一些能够增加系统复杂度的需求非常值得关注。控制系统在避免溢出的情况下要达到最大的生产能力。出口容量在2004年从每年67M（百万）吨增加到81M吨，到2011年将扩大到90M吨。</P>
<P class=content><A name=IDAGDE2>基本概念：作业(route)</A><BR>一个作业(route)由一系列传送带、定位和反馈设备组成，这些设备被选择和调配以便把铁矿从源位置运送到目标位置。作业可以是单独的，也可以共享设备以便允许把铁矿分开运输，从一个源位置运送到多个目标位置，或者组合运输，从多个源位置运送到一个目标位置。这些作业由操作员创建、维护和删除。一旦操作员启动作业，系统就开始工作，按照正确的顺序启动每个工作，以及处理一些异常状态例如有不合适的产品已经在传送带上。</P>
<P class=content>为了达到生产力的需求，控制系统采用激进的启动和错误处理策略。尽管已经存在的系统在一个时间点一个作业只能启动一条传送带，当它达到最大速度后，再启动下一条，依此类推。 新的控制系统在一个作业中将同时启动所有的传送带－－注意我们的传送带的长度不同，启动时间和容量也不同。在出现问题时，新的系统试图尽可能关闭最少数量的设备以避免溢出，因为启动一个长的传送带需要15分钟。无论什么可能情况，设备都将保持运行，直到铁矿有可能溢出为止。系统需要同时运行作业，以便矿石能够传送到多个目标位置或者把矿石从多个源位置组合到一个位置。</P>
<P class=content>设备失败的处理是全自动的。当一个传送带一小时可以传送超过10000吨矿石时，你可以想象出现问题时不能很快停下传送带的后果。这个结果并不是你可以用独轮车能够清理干净的！你将不得不使用一些重型设备来清理那些溢出的矿石，而且需要花费很长的时间。甚至有更坏的结果，比如一个错误导致矿石已经倒进了船的甲板上。</P>
<P class=content><A name=IDAQDE2>PT系统的用例模型</A><BR>本文的工作基于IBM(r) Rational Unified Process(r) (RUP(r))和一本名为“用例建模”的书，这本书由Kurt Bittner和Ian Spence合著。用例是一个可供选择的写需求的方法。在过去，我们基于一个词"shall"来书写这些声明。在几年前我曾经在一个国防项目工作，它包括22卷需求文档，没有人能够真正全部理解它们。确认所有的需求描述是正确的和一致的是一件非常困难的事情。用例可以帮助我们处理这类问题。用例把需求放在系统提供给用户和有关人员的上下文中。 按照顺序描述每个用例以消除上下文的冗余，这些冗余在用传统的基于"shall"的需求描述方法中是必然包括的。</P>
<P class=content>这里仅仅描述用例模型的一些特点，因为全部模型太大，也太复杂。用例的规范非常长，也非常细致。</P>
<P class=content><A name=IDAZDE2>识别角色(actor)</A><BR>在整个操作开始前主要工作集中在识别角色是非常重要的，因为它可以确定系统的边界，清楚地指示哪些是在系统范围内，哪些在系统范围外。我们不想开发那些我们没有必要付钱的东西。在PT系统中，运输机是一个我们需要交互的系统。这里我们只需要知道运输机干什么工作，并不需要控制它如何工作，我们也不需要修改它。既然我们不控制运输机，它就在我们的系统范围之外，作为一个角色模型存在。我们有Ship-Hatch Loaders, Stackers, Sampling Stations 和Dust Control Systems - 所有这些外部系统都作为角色模型。图2显示部分这个系统的角色。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig2.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 2:</B> PT系统角色 
<P class=content>在图2中，角色使用UML 包分组。在左边是角色包。最重要的一个在左上角。CRO 就是Control Room Operator，中央控制室操作员。其它重要的还有在左下角的RSMT(Root System Maintenance Technician，根系统维护技术员)。 </P>
<P class=content>其它的包包括所有不同的设备角色。一些用例提到我们管理的通用设备，另一些将提到特定的不同类型的设备。 </P>
<P class=content>在图的下方有一些与我们交互的外部设备。左边的一个是PMAC，一个已经存在的系统用来处理我们的用户界面。如果它仅仅是与我们的系统相关的用户界面，那么我们不需要把它看作角色，因为实际上角色是CRO。但是它实际上是我们相关的角色，因为我们给它传递信息，并且从它那里收集信息。</P>
<P class=content>电力负荷管理系统Power Load Management System (PLMS)是值得关注的。在Headland港，港口工厂有自己的电站。当你启动7KM长的传送带，并在上面运行数千吨的矿石是，它需要大量的电力供应。因此，传送带的启动实际上是错开的，以便降低电站的负荷。只要你想启动传送带，PT系统都将询问电站并得到电站的许可。</P>
<P class=content><A name=IDALEE2>确定用例</A><BR>用例是一种简单的可选择的定义需求的方法。首先，让我们再次回顾一下用例的定义：</P>
<P class=content>用例定义一个由系统完成的操作序列，它给操作者和相关人员提供<B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">可观察到的有价值的结果</B>。</P>
<P class=content>在识别IT系统的用例时，牢记“可观察到的有价值的结果”是非常重要的，这一点在这里仍然适用。我们将看到系统提供给操作者和相关人员的值。在我们的例子中，中央控制室操作员是一个角色，但是整个公司实际上都可以看到系统把矿石从一个地方移动到另外的地方。“由系统完成的操作序列”声明了在用例中系统怎么做的描述。这些每个都是我们系统的需求。最后，用例是一个完整的有意义的事件流。把“完整的有意义的事件流”和“可观察到的有价值的结果”这两个概念组合起来可以帮助避免识别出不完整的功能片断并把它称为用例。</P>
<P class=content>用例和角色在用例图中以图形化的方式描述。图3显示了 PT系统的顶层用例图。你很快就能看到 PT系统的用例分为4组：Operation, Administration, Configuration 和System Startup。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig3.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 3:</B> 顶层用例图 
<P class=content>PT系统中用例相关的操作在图4中显示: </P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig4.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 4:</B> PT系统的用例 
<P class=content>PT的主要用例是“传送产品”。正如这个用例的名字那样，你可以看到在这里系统提供给用户和有关人员的价值是把产品从一个地方运送到另一个地方的能力。这个软件也能够用来运送其它物品，不仅仅是铁矿。例如它能够用来在制药厂传送药片。传送产品是一个很大的用例，但它抓住了最根本的因素，即我们的系统存在的原因，即给我们的操作者和相关人员提供的价值。</P>
<P class=content>在图4中我们看到与电源管理系统(PLMS)的交互，请求启动设备，我们也看到了用例与我们控制的设备的交互。我们可以显示每个设备角色，但那样的话，图就显得太混乱了。</P>
<P class=content>在图4中，从CRO到传送产品的箭头，表示这个操作员发起或者启动这个用例。用例到设备和PLMS操作者的箭头表示这个用例或者系统与设备和PLMS交谈。从船舱装载系统(SHLS)的箭头表示SHLS发起与系统的交互－－特别地，SHLS可以请求铁矿流暂时中断以便装载机移动到另一个舱室。</P>
<P class=content>有关管理、配置和系统启动的用例在图5中描述。</P><IMG alt="" src="http://www-900.ibm.com/developerWorks/cn/rational/r-uc-rt/3095_fig5.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 5:</B> 有关管理、配置和启动的用例 
<P class=content>在这里我们可以做的一件事情是在对系统的操作影响最小的情况下更新系统软件。因此我们有"Perform Software Upgrade" 用例。我们也有"Start System" 用例 -这个用例经常被忘掉。系统有人身安全优先的规则，Start System 用例包括在系统启动时进行的所有安全检查的规格说明。你一定不想在服务人员在传送带上工作时偶然地启动它！</P>
<P class=content>Route System Maintenance Technologist (RSMT)是一个负责创建作业或者预定义作业的人，预定义的作业稍后由CRO使用。我们可以在系统中添加新的设备，定义新设备的种类以及定义系统传送产品的特点。港口工厂处理来自不同矿山的不同类型的铁矿，它们有不同的颗粒大小、不同的矿石成分等级。我们要非常小心的一件事情是避免把错误的矿石装到船上去。</P>
<P class=content>关于用例图这里要警告一下：用例图只是冰山的一角。直到你开始写用例规格之前不要去重新分解、重组和调整用例模型。用例的规格大约95％来自用例模型。用例图仅仅给你一个模型的总体、全面的概要描述。</P>
<P class=content>正如我前面提到的，用例描述“事件流”。图6显示不同种类的事件流和它们是如何在用例规格中描述的。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig6.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 6:</B>主事件流和分支流 
<P class=content>从顶部到底端底蓝色粗线条表示主事件流(Basic Flow)。它表示每件事情都按照正确的方式发生。有很多种分支流(Alternate Flow)。描述处理设备故障的分支是一个很好的分支流的例子。另一个例子是描述操作员取消了前面请求的动作。</P>
<P class=content>这里一个非常重要的结构是子事件流(Subflow)。子事件流就象子程序调用。我们试图保持主事件流简单易读，没有子事件流是很难做到这一点的。例如，我们使用子事件流来描述我们启动或者安放设备位置时发生的细节。这些过程每个都相当复杂，如果我们都在主事件流上描述，那么它将变得很长并且很难理解。</P>
<P class=content>图7显示一个主事件流的片断：</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig7.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 7:</B> 描述启动一个作业的主事件流示例 
<P class=content>在第二步，系统检查作业是否有效。如果系统确认作业无效时会发生什么？这在分支流中描述。在用例规格中我们使用脚注来指示分支流，脚注文本包括指向相关文档章节的交叉引用。这将减少描述事件流的混乱，使得它更容易读。在这里我使用 "§" 符号指示存在一个分支流。我也用高亮的红色表示这是项目术语表－－一份很重要的文档－－中的定义。</P>
<P class=content>在第3步，系统检查选择的作业的启动策略。"Starting/Positioning Stragegy 2.1"表示交错启动，它需要在启动作业前所有的设备都到位。这个启动策略在分支流中描述。最后系统向PLMS询问是否允许启动作业。如果不允许时发生的事情也在分支流中描述。</P>
<P class=content>在图8中，我们将看到分支流和子事件流的例子。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig8.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 8:</B> 分支流和子事件流示例 
<P class=content>分支流定义当基于某种原因设备不到位，因而这个作业不能启动时应该发生什么。系统给操作者发一个消息，建议在我们实际启动作业前把设备移动到相应的位置。在这个点上，用例就结束了。</P>
<P class=content>子事件流的例子提供我们实际上如何启动作业的更详细的信息。系统检查全部作业设备是否畅通（传送带上没有其它物品）。如果正常，系统同时移动所有需要定位的设备到相应的位置，包括作业自己需要的设备和要与其它作业共享的设备，然后我们交错启动所有的设备以避免电力过载。当全部设备都运行起来后，我们告诉操作员作业已经启动，然后用例结束。第16步的 "a", "b" 和 "c" 也涉及了子事件流。</P>
<P class=content><A name=IDAOGE2>特殊需求</A><BR>有很多需求，特别在实时系统中，不能归结到用例的事件流中。通常它们是非功能需求如性能、可用性等等。那些与给定用例相关的特殊需求可以归结到与用例规格定义相关联的"特殊需求"一节中。有时为了方便，甚至功能需求也可以放到这一节中。图9即为一个示例。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig9.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 9:</B> 特殊需求 
<P class=content>第一个例子可以作为一个分支流，但是为了使主事件流基于阅读，我们可以简单地说：“系统检查是否有特殊需求的xyz节中规定的不能启动的状况发生”。在这个特定用例中，如果我们在码头传送带上还有东西，而传送带由于完成了往甲板上卸矿石已经停止工作，那么我们将给操作员发出一个警告。</P>
<P class=content>第二个例子是一个算法的详细描述，这个算法用来调整传送带的传输量和传送速度。这里，主事件流可以简单地描述：“传输量和传送速度按照特殊需求中的uvw节进行调整。”</P>
<P class=content><A name=IDA4GE2>结构化用例</A><BR>用例的结构化是一个高级课题。你也可以不使用这项技术来完成一个系统的需求文档。用例的结构化可以让你避免冗余信息，保证用例文本只存在一个单独的可维护的位置。关于结构化的重要的一点是，你必须避免让用例模型和用例变得难以理解。</P>
<P class=content>结构化技术在图10中显示。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig10.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 10:</B> 结构化用例 
<P class=content>在图的左边，我们有一个用例，它有一个主事件流，一个分支流和一个子事件流。子事件流和分支流都可以作为单独的用例分出来。分支流变成一个新的用例，扩展了原始的用例。子事件流也变成一个新的用例，它包含在原始的用例中。一般来说，包含关系仅仅用于一个分支流共用于多个用例的情况。这就是我们如何确保仅仅写一个分支流，仅仅有一个维护地点的方法。通常，当需要在已经存在的用例上增加新功能而且你又不想修改原始用例时，可以创建一个扩展流</P>
<P class=content>把这些结构化技术用到我们的产品传送系统后，改变后的用例如图11所示：</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig11.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 11:</B> 用例模型的修改 
<P class=content>这些新的用例称为“抽象用例”，因为它们没有操作者，你不能直接调用它们。如果我把这些抽象用例隐藏起来，你仍然可以相当清楚地看到系统的主要功能。</P>
<P class=content>一系列的错误处理用例都以这样的声明开始：“当系统检测到设备故障”或者“当系统检测到超载”等。然后用例继续描述系统在这些情况的响应。</P>
<P class=content>在图11的顶部，我提炼出了两个抽象用例：一个是启动作业，另一个是停止作业。从技术角度来说，我在这里破坏了规则：包含用例应当被多于一个的用例共享。我之所以这么做是因为，如果我在“传送产品”用例中写出所有的内容，文档将超过300页。把它分开可以让很多人同时在系统的不同部分描述需求。</P>
<P class=content><A name=IDAYHE2>补充需求</A><BR>我们有很多补充的需求，它们不适合放在任何用例中。因为特定的需求与具体的用例相关，这些都是典型的非功能性需求。在你在用例中的需求和补充的需求之间存在一个平衡。当你进行实时系统工作时，你可能发现会比你进行IT系统开发时有更多的补充需求。这是由于在实时系统中有更多的有时间要求的需求，它们都在补充需求中描述。</P>
<P class=content>下面是放在补充需求中的非功能需求的例子：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LI class=content>The PT System shall, upon notification of fault requiring upstream interlocks to be set to "False", set Upstream interlocks to False within 0.60 second. 
<LI class=content>The PT System annual Availability (refer Glossary) shall exceed 99.954%. 
<LI class=content>The PT System Maintenance Procedures shall comply with the Client's maintenance strategy for real-time PLC control systems. 
<LI class=content>The PT System shall use the existing PMAC System for the CRO, PCO, and viewer interface. 
<LI class=content>The portion of the PT System controlling route interlocking and directly connected to route equipment and interconnected systems shall be PLC based and, in the event of failure of higher level control within the PT System, shall be capable of safely operating any route currently starting, running, or stopping. </LI></UL>
<P class=content>功能需求也可以包括在补充需求中。当有些功能用用例写还不如用补充需求描述时，可以把这些需求放在补充需求中，而不用写一个完整地用例规格定义。下面是一些这样的例子:</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LI class=content>The System shall advise the Operator if the sum of the source feed setpoints for a route is more than 10% less than the minimum capacity for the route. 
<LI>If a feed source has been enabled for a route with a cleanup destination, the System shall: 
<UL>
<LI class=content>Raise an alarm 
<LI class=content>Re-raise the alarm every 10 minutes while the condition persists </LI></UL>
<LI>If during a ship hatch change, burden is on the wharf conveyor at or within the gross stopping distance of the shiploader, the System shall: 
<UL>
<LI class=content>Raise an alarm 
<LI class=content>Issue a message to the operator 
<LI class=content>Stop the wharf conveyor 
<LI class=content>Issue a request to the SHLS to stop the shiploader boom conveyor </LI></UL></LI></UL>
<P class=content><A name=IDAXYV2>用例的益处</A><BR>用例有以下益处：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LI class=content>给出需求的上下文，清楚显示为什么需要系统。 
<LI class=content>把需求按照时间顺序排列，使需求比传统方式更加容易读，更容易理解。 
<LI class=content>更容易得到客户的认同，因为他们能更容易地阅读和理解。 
<LI class=content>可以用作项目计划、分析、设计、测试和文档的基础。 </LI></UL>
<P class=content>另一方面，关于用例有很多不正确的观点。第一个是，象当前多种书籍和文章中指出的，传统的书写需求的方法能够更严谨和精确。实际上并不是这样的，我们在这个项目中也能写出非常严谨而精确的用例。 </P>
<P class=content>另一个看法是任何没有经过专业培训的人都可以写用例。写传统需求文档的原则在这里仍然适用。你需要从外部视角来看系统做什么。你不需要写出系统是怎样做的。象传统的需求一样，你写的用例需求也应该是可测试的。新手经常继续使用老的诸如功能分解的习惯。有开发背景的人经常倾向于从系统内部而不是用外部视角描述。</P>
<P class=content><A name=IDAGZV2>用例贯穿整个项目</A><BR>我前面提到，用例在整个项目中都有用。</P>
<P class=content><A name=IDAOZV2>项目计划</A><BR>在这里我们没有足够的空间讨论分配用例迭代的准则。只能简单说，这些准则基于RUP的风险评估。下面是分配的迭代：</P>
<TABLE width="60%" border=1>
<TBODY>
<TR>
<TD><B class=content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">迭代1</B></TD>
<TD class=content>启动、停止和处理一个独立作业上的一个设备故障。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">维护设备和作业。</TD></TR>
<TR>
<TD><B class=content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">迭代2</B></TD>
<TD class=content>启动、停止和处理覆盖作业和作业组上的设备故障。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">维护计划和约束。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">维护产品。</TD></TR>
<TR>
<TD><B class=content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">迭代3</B></TD>
<TD class=content>创建产品产品差距。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">改变作业所有权。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">直接命令设备<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">删除作业。<BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">修改负载数据。</TD></TR></TBODY></TABLE>
<P class=content><A name=IDAW0V2>用例分析</A><BR>用例分析是一个用来识别对象、类、类属性和类方法的过程。 由于这个项目的实现方法是非面向对象的，我们使用一个映射把面向对象的分析模型转换到过程设计模型。图12显示对启动作业用例进行分析的部分结果：</P><IMG height=361 alt="" src="http://www.uml.org.cn/appCase/images/3095_fig12.jpg" width=489 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 12:</B> 从启动作业用例导出的序列图 
<P class=content><A name=IDAE1V2>测试计划</A><BR>我极力推荐下面的一篇文章：June 2001 Rational Edge，Jim Heumann，"Generating Test Cases from Use Cases"。在我们的PT系统中使用这种方法识别测试用例。图13显示启动作业用例的迭代2的测试用例。注意在测试用例和用例需求之间的连接。它可以帮助保证需求都被测试，以及测试用例随着需求变更而更新。</P><IMG alt="" src="http://www.uml.org.cn/appCase/images/3095_fig13.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 13:</B> 从启动作业用例导出的测试用例 
<P class=content><A name=IDAS1V2>经验学习</A><BR>1. 集中在外部可视的行为上。这一点怎么强调都不过分，这就是我为什么这里再次重复的原因。在这个项目中，我经常告诉那些需求分析人员，让他们想象它们是飞翔在港口工厂的用户，让他们问自己他们想要看见发生的事情。如果你写的描述一些事情的需求不可见，那么你将不能对它进行测试。</P>
<P class=content>2. 不要引入设计。这与经验1相关。下面是一个例子</P>
<P class=content>每个作业都拥有一个使能信号，这个信号来自于作业的运送源。使能信号在操作间内部驱动作业运送来源的物理信号。(用例在这里描述了系统内部信号。)</P>
<P class=content>有很多原因使你不应该这么做。首先，它使得测试很困难，因为描述的行为在外部不可见。第二，如果你把设计信息放到用例中，你就需要照着这些信息实现，因为那是需求，因此你不仅必须照着它来进行演示说明，而且它也限制你的设计人员的实现方式。</P>
<P class=content>3. 不要为内部监控过程写用例。在这个系统中，由于是实时系统，有很多在系统内部运行的过程用来检查、监控和轮询其它设备。你不应该在你的用例中描述这些，因为它是设计，它仅仅是一种可能的实现方式。</P>
<P class=content>除非过程与系统的目标相关，例如在建筑监控中的“监控建筑”用例中，你应该把它们写在补充需求规格中。例如</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LI class=content>系统应该每200毫秒或者更短的时间内检查所有设备的状态。 
<LI class=content>系统应该在设备失败的200毫秒内开始响应。 
<LI class=content>系统应该保证产品混合率在设定值的+/-5%范围内。 </LI></UL>
<P class=content>在用例的分支流或者扩展用例中，都可以描述如果系统检测到问题时发生什么事情。这些需求可以使你设计诸如轮询设备或者设备产生中断等的过程，然是它们属于设计应该考虑的事情，不属于需求的范围。</P>
<P class=content>4. 不要太早"冻结"用例。在项目中太早冻结用例将会导致很多问题，因为在你和你的客户更好地理解需求时，你可以找到机会重新组织用例，或者你将引出新的用例，或者你要修改现有的用例。需求变更会发生，但这需要在一个迭代过程的管理和限制下进行，以便进行适当的影响评估，以及合适的预算和计划日程的变更。如果你使用迭代过程，你至少有在后面的迭代中改正的机会。</P>
<P class=content>5. 不要过于追求完美的用例模型而超出项目计划日程。这是经验4的必然结论。你从来都不可能得到一个完美的用例模型。在某个点上，你将不得不停下修补完善用例模型的工作，开始实际的系统开发工作。即使用例模型并不完美，你也可能开发出符合用户需求的系统。最后，图14显示PT用例模型的实际样子。</P><IMG height=351 alt="" src="http://www.uml.org.cn/appCase/images/3095_fig14.jpg" width=528 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 14:</B> 不完善的用例模型 
<P class=content>你将看到选择作业、启动作业和停止作业是主要的用例。这里并没有围绕着传送产品用例把所有其它用例联系在一起，我们不得不在附加需求中描述其它的需求。来自操作员和相关者的选择、启动和停止作业的需求并没有进行评估。用例模型不完善的主要原因在于，需求必须在某个点冻结，以便开发者不会频繁地面对不确定的开发目标，系统应当被实际开发测试和部署。</P>
<P class=content>6. 不要害怕收集细节信息。用例假定容易被每个人阅读，但是这并不意味着你在大街上随便找一个人，给他一个描述复杂系统的用例，就能够期望他能够理解。</P>
<P class=content>需要问你自己的问题是：你的客户需要多大程度的细节？你想给你的开发者多大的范围？如果你在用例中没有给出很多细节，你就让你的开发者自行作出决定。你想这样做吗？你的开发者可能有丰富的经验而你也很高兴这么做。另一方面，如果你正在进行实际的开发，没有充分的细节不一定是可以接受的。你需要给开发者和测试者描述以足够的细节信息，说明什么对于客户是重要的。</P>
<P class=content>如果有大量的细节信息，可以考虑把它们放到特殊需求或者附加需求中，或者用活动框图(Activity Diagram)来补充用例。(参见经验9)</P>
<P class=content>7. 不要引入用例间的直接交互。用例不能相互交互。它们可以相互影响，但是只能通过操作系统状态来影响。</P>
<P class=content>8. 不要把有关解决资源争夺问题的架构决策放到用例中。这一点与第2课有关，例如，当操作员使能一个作业的来源时，同时第二个作业共享同一个来源因此得到一个来源不可用的错误时，会发生什么情况？</P>
<P class=content>这些状况应该在不同的用例中描述。在每个用例，你只需要简单描述在给定环境下你想要系统做什么。在这个例子中，系统内部如何工作，什么信号发到设备，这些都属于架构或者设计问题。系统架构需要解决这些问题，诸如保证信号在非常接近情况下接收、不同顺序接受或者高频率地接收。</P>
<P class=content>9. 使用活动框图以便使得复杂的用例能够易于理解。活动框图可以作为用例的规格创建。</P>
<P class=content><A name=IDAU2V2>总结</A><BR>在PT系统中使用用例给项目带来很大的价值。只要有外部可见的系统行为，就应该使用用例来定义需求规格。</P>
<P class=content>对任何系统来说，在确定用例时，要集中在系统的目标上以及系统给相关人员提供的价值。在写用例时要维护一个系统的外部视图。</P>
<P class=content>对于实时系统，附加需求在整个系统需求中占有更大的百分比。</P><img src ="http://www.blogjava.net/kapok/aggbug/3857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-27 16:37 <a href="http://www.blogjava.net/kapok/archive/2005/04/27/3857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Master Java's object-oriented power with the Unified Modeling Language </title><link>http://www.blogjava.net/kapok/archive/2005/04/27/3844.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 27 Apr 2005 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/27/3844.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3844.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/27/3844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3844.html</trackback:ping><description><![CDATA[<EM><FONT face=Arial size=4><A href="http://www.uml.org.cn/appCase/appCase1218002.htm">http://www.uml.org.cn/appCase/appCase1218002.htm</A><BR><BR>Master Java's object-oriented power with the Unified Modeling Language</FONT></EM> 
<P align=center><FONT face=Arial color=#000000><B>by Hans-Erik Erikkson and Magnus Penker</B></FONT></P>
<P><FONT face=Arial color=#660000 size=5><B>T</B></FONT><FONT face=Arial>he case study in this article provides a feel for how UML is used in the real world. The application, which handles the borrowing and reserving of books and magazines in a library, is large enough to put UML through some realistic paces.</FONT></P>
<P><FONT face=Arial>If it were any larger, we couldn't fit it in the magazine.</FONT></P>
<P><FONT face=Arial>We analyze and describe the app in an analysis model with use cases and a domain analysis. We expand it into a design model that describes representative slices of a technical solution. Finally, we code a piece of it in Java. (The </FONT><A href="http://www.devx.com/premier/mgznarch/javapro/code/1998/jp_0698/jp0698ws.zip"><FONT face=Arial>code</FONT></A><FONT face=Arial>, plus the complete analysis and design models are supplied online, in a format readable by the included evaluation copy of Rational Rose.)</FONT></P>
<P><FONT face=Arial>Remember that what's shown is only one possible solution. There are plenty of others, and there is no "right" solution for all circumstances. Of course, some solutions will prove better than others, but only experience and hard work will result in that knowledge.</FONT></P>
<P><FONT face=Arial><B>Requirements</B><BR>Typically, a representative of the end user of the system writes the text requirement specification. For the library application, it looks like this:</FONT></P>
<UL>
<LI><FONT face=Arial>It is a support system for a library.</FONT> 
<LI><FONT face=Arial>A library lends books and magazines to borrowers, who are registered in the system, as are the books and magazines.</FONT> 
<LI><FONT face=Arial>A library handles the purchase of new titles. Popular titles are bought in multiple copies. Old books and magazines are removed when they are out of date or in poor condition.</FONT> 
<LI><FONT face=Arial>The librarian is an employee of the library who interacts with the customers (borrowers) and whose work is supported by the system.</FONT> 
<LI><FONT face=Arial>A borrower can reserve a book or magazine that is not currently available in the library so that when it's returned or purchased by the library, that person is notified. The reservation is canceled when the borrower checks out the book or magazine or through an explicit canceling procedure.</FONT> 
<LI><FONT face=Arial>The library can easily create, update, and delete information about the titles, borrowers, loans, and reservations in the system.</FONT> 
<LI><FONT face=Arial>The system can run on all popular technical environments, including Unix, Windows, and OS/2, and has a modern graphical user interface (GUI).</FONT> 
<LI><FONT face=Arial>The system is easy to extend with new functionality.</FONT> </LI></UL>
<P><FONT face=Arial>The first version of the system doesn't have to handle the message that is sent to the borrower when a reserved title becomes available, nor does it have to check that a title has become overdue.</FONT></P>
<P><FONT face=Arial><B>Analysis</B><BR>The analysis is intended to capture and describe all the requirements of the system, and to make a model that defines the key domain classes in the system (<I>what is</I> handled in the system). The purpose is to provide an understanding and to enable a communication about the system between the developers and the people establishing the requirements. Therefore the analysis is typically conducted in cooperation with the user or customer.</FONT></P>
<P><FONT face=Arial>The developer shouldn't think in terms of code or programs during this phase; it is just the first step toward really understanding the requirements and the reality of the system under design.</FONT></P>
<P><FONT face=Arial><B>Requirements Analysis.</B> The first step in analysis is to figure out what the system will be used for and who will be using it. These are the use cases and actors, respectively. The use cases describe what the library system provides in terms of functionality: the functional requirements of the system. A use-case analysis involves reading and analyzing the specifications, as well as discussing the system with potential users (customers) of the system.</FONT></P>
<P><FONT face=Arial>The actors in the library are identified as the librarians and the borrowers. The librarians are the users of the system and the borrowers are the customers, the people who check out and reserve books and magazines, although occasionally a librarian or another library may be a borrower. The borrower is not intended to directly interact with the system; the borrower's functions are done on behalf of the borrower by the librarian.</FONT></P>
<P><FONT face=Arial>The use cases in the library system are:</FONT></P>
<UL>
<LI><FONT face=Arial>Lend Item</FONT> 
<LI><FONT face=Arial>Return Item</FONT> 
<LI><FONT face=Arial>Make Reservation</FONT> 
<LI><FONT face=Arial>Remove Reservation</FONT> 
<LI><FONT face=Arial>Add Title</FONT> 
<LI><FONT face=Arial>Update or Remove Title</FONT> 
<LI><FONT face=Arial>Add Item</FONT> 
<LI><FONT face=Arial>Remove Item</FONT> 
<LI><FONT face=Arial>Add Borrower</FONT> 
<LI><FONT face=Arial>Update or Remove Borrower</FONT> </LI></UL>
<P><FONT face=Arial>Because a library often has several copies of a popular title, the system must separate the concept of the title from the concept of the item.</FONT></P>
<P><FONT face=Arial>The library system analysis is documented in a UML use-case diagram as shown in Figure 1. Each of the use cases is documented with text, describing the use case and its interaction with the actor in more detail. The text is defined through discussions with the user/customer. The descriptions of all the use cases are included online; the use case Lending Item is described as follows:</FONT></P>
<P><FONT face=Arial><IMG height=344 src="http://www.uml.org.cn/appCase/images/ws0698f1.gif" width=532></FONT></P>
<OL>
<LI><FONT face=Arial>If the borrower has no reservation:</FONT> 
<UL>
<LI><FONT face=Arial>A title is identified.</FONT> 
<LI><FONT face=Arial>An available item of the title is identified.</FONT> 
<LI><FONT face=Arial>The borrower is identified.</FONT> 
<LI><FONT face=Arial>The library lends the item.</FONT> 
<LI><FONT face=Arial>A new loan is registered.</FONT> </LI></UL>
<LI><FONT face=Arial>If the borrower has a reservation:</FONT> 
<UL>
<LI><FONT face=Arial>The borrower is identified.</FONT> 
<LI><FONT face=Arial>The title is identified.</FONT> 
<LI><FONT face=Arial>An available item of the title is identified.</FONT> 
<LI><FONT face=Arial>The library lends the corresponding item.</FONT> 
<LI><FONT face=Arial>A new loan is registered.</FONT> 
<LI><FONT face=Arial>The reservation is removed.</FONT> </LI></UL></LI></OL>
<P><FONT face=Arial>Besides defining the functional requirements of the system, use cases are used in the analysis to check whether the appropriate domain classes have been defined, and they can be used during the design process to confirm that the technical solution is sufficient to handle the required functionality. The use cases can be visualized in sequence diagrams, which detail their realization.</FONT></P>
<P><FONT face=Arial><B>Domain Analysis.</B> An analysis also itemizes the domain (the key classes in the system). To conduct a domain analysis, read the specifications and the use cases and look at which "concepts" should be handled by the system. Or organize a brainstorming session with users and domain experts to try to identify all the key concepts that must be handled, along with their relationships to each other.</FONT></P>
<P><FONT face=Arial>The domain classes in the library system are as follows: </FONT><FONT face=Arial size=4><CODE>BorrowerInformation</CODE></FONT><FONT face=Arial> (so named to distinguish it from the actor Borrower in the use-case diagram), </FONT><FONT face=Arial size=4><CODE>Title, Book Title, Magazine Title, Item, Reservation</CODE></FONT><FONT face=Arial>, and </FONT><FONT face=Arial size=4><CODE>Loan</CODE></FONT><FONT face=Arial>. They are documented in a class diagram along with their relationships, as shown in Figure 2. The domain classes are defined with the stereotype «Business Object», which is a user-defined stereotype specifying that objects of the class are part of the key domain and should be stored persistently in the system.</FONT></P>
<P><FONT face=Arial><IMG height=650 src="http://www.uml.org.cn/appCase/images/ws0698f2.gif" width=555></FONT></P>
<P><FONT face=Arial><IMG height=473 src="http://www.uml.org.cn/appCase/images/ws0698f3.gif" width=562></FONT></P>
<P><FONT face=Arial>Some of the classes have UML state diagrams to show the different states that objects of those classes can have, along with the events that will make them change their state. The classes that have state diagrams available online are </FONT><FONT face=Arial size=4><CODE>Item</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>Title</CODE></FONT><FONT face=Arial>.</FONT></P>
<P><FONT face=Arial>A sequence diagram for the use case Lend Item (the borrower does not have a reservation) is shown in Figure 3. Sequence diagrams for all the use cases are online.</FONT></P>
<P><FONT face=Arial>When modeling the sequence diagrams, it becomes obvious that windows or dialogs are needed to provide an interface to the actors. In this analysis, it was sufficient to be aware that interface windows are needed for lending, reserving, and returning items. The detailed user interface is not specified at this point.</FONT></P>
<P><FONT face=Arial>To separate the window classes in the analysis from the domain classes, the window classes are grouped into a package named "GUI Package," and the domain classes are grouped into a package named "Business Package."</FONT></P>
<P><FONT face=Arial><B>Design</B><BR>The design phase expands and details the analysis model by taking into account all technical implications and restrictions. The purpose of the design is to specify a working solution that can be easily translated into programming code.</FONT></P>
<P><FONT face=Arial>The design can be divided into two segments:</FONT></P>
<P><FONT face=Arial><I>Architectural design.</I> This is the high-level design where the packages (subsystems) are defined, including the dependencies and primary communication mechanisms between the packages. Naturally, a clear and simple architecture is the goal, where the dependencies are few and bidirectional dependencies are avoided if at all possible. <I>Detailed design.</I> Here all classes are described in enough detail to give clear specs to the programmer who will code the class. Dynamic models from the UML are used to demonstrate how objects of the classes behave in specific situations.</FONT></P>
<P><FONT face=Arial><B>Architecture Design</B><BR>A well-designed architecture is the foundation for an extensible and changeable system. The packages can concern either handling of a specific functional area or a specific technical area. It is vital to separate the application logic (the domain classes) from the technical logic so that changes in either don't impact the other part. One goal is to identify and set up rules for dependencies between the packages (e.g., "subsystems") so that no bidirectional dependencies are created between packages (in order to avoid packages becoming too tightly integrated with each other). Another goal is to identify the need for standard libraries. Libraries available today address technical areas such as the user interface, the database, or communication, but more application-specific libraries are expected to emerge as well.</FONT></P>
<P><FONT face=Arial>The packages, or subsystems in the case study are as follows:</FONT></P>
<P><FONT face=Arial><B>User-Interface Package.</B> These classes are based on the Java AWT package, a standard library in Java for writing user-interface applications. This package cooperates with the Business-Objects package, which contains the classes where the data is actually stored. The UI package calls operations on the business objects to retrieve and insert data into them.</FONT></P>
<P><FONT face=Arial><B>Business-Objects Package.</B> This includes the domain classes from the analysis model such as </FONT><FONT face=Arial size=4><CODE>BorrowerInformation, Title, Item, Loan</CODE></FONT><FONT face=Arial>, and so on. The design completely defines their operations and adds support for persistence. The business-object package cooperates with the database package in that all business-object classes must inherit from the </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial> class in the Database package.</FONT></P>
<P><FONT face=Arial><B>Database Package.</B> The Database package supplies services to other classes in the Business-Object package so that they can be stored persistently. In the current version, the </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial> class will store objects of its subclasses to files in the file system.</FONT></P>
<P><FONT face=Arial><B><IMG height=435 src="http://www.uml.org.cn/appCase/images/ws0698f4.gif" width=304></B></FONT></P>
<P><FONT face=Arial><B>Utility Package.</B> The Utility package contains services that are used in other packages in the system. Currently the </FONT><FONT face=Arial size=4><CODE>ObjId</CODE></FONT><FONT face=Arial> class is the only one in the package. It is used to refer to persistent objects throughout the system including the User-Interface, Business-Object, and Database packages.</FONT></P>
<P><FONT face=Arial>The internal design of these packages is shown in Figure 4.</FONT></P>
<P><FONT face=Arial><B>Detailed Design</B><BR>The detailed design describes the new technical classes</FONT>—<FONT face=Arial>the classes in the User-Interface and Database packages</FONT>—<FONT face=Arial>and fleshes out the Business-Object classes sketched during the analysis. The class, state and dynamic diagrams used are the same diagrams used in the analysis, but they are defined on a more detailed and technical level. The use-case descriptions from the analysis are used to verify that the use cases are handled in the design; sequence diagrams are used to illustrate how each use case is technically realized in the system.</FONT></P>
<P><FONT face=Arial><B>Database Package.</B> The application must have objects stored persistently, therefore a database layer must be added to provide this service. For simplicity, we store the objects as files on the disk. Details about the storage are hidden from the application, which calls common operations such as </FONT><FONT face=Arial size=4><CODE>store(), update(), delete()</CODE></FONT><FONT face=Arial>, and </FONT><FONT face=Arial size=4><CODE>find()</CODE></FONT><FONT face=Arial>. These are part of a class called </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial>, which all classes that need persistent objects must inherit.</FONT></P>
<P><FONT face=Arial>An important factor in the persistence handling is the </FONT><FONT face=Arial size=4><CODE>ObjId</CODE></FONT><FONT face=Arial> class, whose objects are used to refer to any persistent object in the system (regardless of whether the object is on disk or has been read into the application). </FONT><FONT face=Arial size=4><CODE>ObjId</CODE></FONT><FONT face=Arial>, short for object identity, is a well-known technique for handling object references elegantly in an application. By using object identifiers, an object ID can be passed to the generic </FONT><FONT face=Arial size=4><CODE>Persistent.getObject()</CODE></FONT><FONT face=Arial> operation and the object will be retrieved from persistent storage and returned. Usually this is done through a </FONT><FONT face=Arial size=4><CODE>getObject</CODE></FONT><FONT face=Arial> operation in each persistent class, which also performs necessary type checks and conversions. An object identifier can also be passed easily as a parameter between operations (e.g., a search window that looks for a specific object can pass its result to another window through an object ID).</FONT></P>
<P><FONT face=Arial>The </FONT><FONT face=Arial size=4><CODE>ObjId</CODE></FONT><FONT face=Arial> is a general class used by all packages in the system (User Interface, Business Objects, and Database) so it has been placed in a Utility package in the design rather than in the Database package.</FONT></P>
<P><FONT face=Arial>The current implementation of the </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial> class could be improved. To that end, the interface to the </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial> class has been defined to make it easy to change the implementation of persistent storage. Some alternatives might be to store the objects in a relational database or in an object-oriented database, or to store them using persistent-object support in Java 1.1.</FONT></P>
<P><FONT face=Arial><B>Business-Objects Package.</B> The Business-Objects package in the design is based on the corresponding package in the analysis, the domain classes. The classes, their relationships, and behavior are preserved, but the classes are described in more detail, including how their relationships and behavior are implemented.</FONT></P>
<P><FONT face=Arial>Some of the operations have been translated into several operations in the design model and some have changed names. This is normal, since the analysis is a sketch of the capabilities of each class while the design is a detailed description of the system. Consequently all operations in the design model must have well-defined signatures and return values (they are not shown in Figure 5 due to space restrictions, but they are present in the model online). Note the following changes between the design and the analysis:</FONT></P>
<P><FONT face=Arial><IMG height=684 src="http://www.uml.org.cn/appCase/images/ws0698f5.gif" width=594></FONT></P>
<UL>
<LI><FONT face=Arial>The current version of the system does not have to check whether an item is returned in time, nor does the system have to handle the ordering of reservations. Therefore the date attribute in the </FONT><FONT face=Arial size=4><CODE>Loan</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>Reservation</CODE></FONT><FONT face=Arial> classes has not been implemented.</FONT> 
<LI><FONT face=Arial>The handling of magazine and book titles is identical, except for the maximum lending period, which doesn't have to be handled. The subclasses </FONT><FONT face=Arial size=4><CODE>Magazine</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>Book Title </CODE></FONT><FONT face=Arial>in the analysis have thus been deemed as unnecessary and only a type attribute in the </FONT><FONT face=Arial size=4><CODE>Title</CODE></FONT><FONT face=Arial> class specifies whether the title refers to a book or magazine. There's nothing in object-oriented design that says the design can't simplify the analysis!</FONT> </LI></UL>
<P><FONT face=Arial><IMG height=374 src="http://www.uml.org.cn/appCase/images/ws0698f6.gif" width=534></FONT></P>
<P><FONT face=Arial>Both of these simplifications could be removed easily if deemed necessary in future versions of the application.</FONT></P>
<P><FONT face=Arial>The state diagrams from the analysis are also detailed in the design, showing how the states are represented and handled in the working system. The design state diagram for the </FONT><FONT face=Arial size=4><CODE>Title</CODE></FONT><FONT face=Arial> class is shown in Figure 6. Other objects can change the state of the </FONT><FONT face=Arial size=4><CODE>Title</CODE></FONT><FONT face=Arial> object by calling the operations </FONT><FONT face=Arial size=4><CODE>addReservation()</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>removeReservation()</CODE></FONT><FONT face=Arial>, as shown in the diagram.</FONT></P>
<P><FONT face=Arial><B>User-Interface Package.</B> The User-Interface package is "on top" of the other packages. It presents the services and information in the system to a user. As noted, this package is based on the standard Java AWT (Abstract Window Toolkit) class.</FONT></P>
<P><FONT face=Arial>The dynamic models in the design model have been allocated to the GUI package, since all interactions with the user are initiated through the user interface. Again, sequence diagrams have been chosen to show the dynamic models. The design model's realizations of the use cases are shown in exact detail, including the actual operations on the classes.</FONT></P>
<P><FONT face=Arial>The sequence diagrams are actually created in a series of iterations. Discoveries made in the implementation (coding) phase result in further iterations. Figure 7 shows the resulting design sequence diagram for Add Title. The operations and signatures are exactly as they appear in the code online.</FONT></P>
<P><FONT face=Arial><IMG height=403 src="http://www.uml.org.cn/appCase/images/ws0698f7.gif" width=552></FONT></P>
<P><FONT face=Arial>Collaboration diagrams can be used as an alternative to sequence diagrams, as shown in Figure 8.</FONT></P>
<P><FONT face=Arial><IMG height=204 src="http://www.uml.org.cn/appCase/images/ws0698f8.gif" width=524></FONT></P>
<P><FONT face=Arial><B>User-lnterface Design</B><BR>A special activity carried out during the design phase is the creation of the user interface.</FONT></P>
<P><FONT face=Arial>The user interface in the library application is based on the use cases, and has been divided into the following sections, each of which has been given a separate menu bar in the main window menu:</FONT></P>
<DIR>
<LI><FONT face=Arial><I>Functions</I>. Windows for the primary functions in the system, that is, lending and returning items and making reservations of titles.</FONT> 
<LI><FONT face=Arial><I>Information</I>. Windows for viewing the information in the system, the collected information about titles and borrowers.</FONT> 
<LI><FONT face=Arial><I>Maintenance</I>. Windows for maintaining the system, that is, adding, updating, and removing titles, borrowers, and items.</FONT> 
<P><FONT face=Arial>Figure 9 shows an example of one of the class diagrams in the user-interface package. This contains typical AWT event handlers. The attributes for buttons, labels, edit fields are not shown.</FONT></P>
<P><FONT face=Arial><IMG height=477 src="http://www.uml.org.cn/appCase/images/ws0698f9.gif" width=710></FONT></P>
<P><FONT face=Arial>Each window typically presents a service of the system and is mapped to an initial use case (although not all user interfaces must map from a use case). Creating a successful user interface is beyond the scope of this article. The reader is invited to consider the UI code for this application, included online, which was developed using the Symantec Visual Café environment.</FONT></P>
<P><FONT face=Arial><B>Implementation</B><BR>Programming begins during the construction or implementation phase. The requirements for this application specify that the system be able to run on a number of different processors and operating systems, so Java was chosen to implement the system. Java makes mapping the logical classes to the code components easy, because there is a one-to-one mapping of a class to a Java code file.</FONT></P>
<P><FONT face=Arial><IMG height=209 src="http://www.uml.org.cn/appCase/images/ws0698f10.gif" width=522></FONT></P>
<P><FONT face=Arial>Figure 10 illustrates that the component diagrams in the design model contain (in this case) a simple mapping of the classes in the logical view to components in the component view. The packages in the logical view are also mapped to corresponding packages in the component view. Each component contains a link to the class description in the logical view making it easy to navigate between the different views (even if, as in this case, it is just as simple to use only the filename). The dependencies between the components are not shown in the component diagrams (except for the business objects package) because the dependencies can be derived from the class diagrams in the logical view.</FONT></P>
<P><FONT face=Arial>For coding, the specifications were fetched from the following diagrams in the design model:</FONT></P>
<LI><FONT face=Arial><I>Class specifications</I>: The specification of each class, showing in detail the necessary attributes and operations.</FONT> 
<LI><FONT face=Arial><I>Class diagrams</I>: The class diagrams in which the class is present, showing its static structure and relationship to other classes.</FONT> 
<LI><FONT face=Arial><I>State diagram</I>: A state diagram for the class, showing the possible states and the transitions that need to be handled (along with the operations that trigger the transitions).</FONT> 
<LI><FONT face=Arial><I>Dynamic diagrams (sequence, collaboration, and activity) in which objects of the class are involved</I>: Diagrams showing the implementation of a specific method in the class or how other objects are using objects of the class.</FONT> 
<LI><FONT face=Arial><I>Use-case diagrams and specifications</I>: Diagrams that show the result of the system are used when the developer needs more information regarding how the system will be used (when the developer feels he or she is getting lost in details</FONT>—<FONT face=Arial>losing sight of the overall context).</FONT> 
<UL></UL>
<P><FONT face=Arial>Naturally, deficiencies in the design will be uncovered during the coding phase. The need for new or modified operations may be identified, meaning that the developer will have to change the design model. This happens in all projects. What's important is to synchronize the design model and the code so that the model can be used as final documentation of the system.</FONT></P>
<P><FONT face=Arial>The Java code examples given here are for the Loan class and part of the TitleFrame class. The Java code for the entire application is available online. When studying the code, read it with the UML models in mind and try to see how the UML constructs have been transferred to code. Consider these points:</FONT></P>
<UL>
<LI><FONT face=Arial>The Java package specification is the code equivalent for specifying to which package in the component or logical view the class belongs.</FONT> 
<LI><FONT face=Arial>The private attributes correspond to the attributes specified in the model; and, naturally, the Java methods correspond to the operations in the model.</FONT> 
<LI><FONT face=Arial>The </FONT><FONT face=Arial size=4><CODE>ObjId</CODE></FONT><FONT face=Arial> class (object identifiers) is invoked to implement associations, meaning that associations normally are saved along with the class (since the </FONT><FONT face=Arial size=4><CODE>ObjId </CODE></FONT><FONT face=Arial>class is persistent).</FONT> </LI></UL>
<P><FONT face=Arial>The code example in </FONT><A href="http://www.umlchina.com/Indepth/Listing1.htm" target=_blank><FONT face=Arial>Listing 1</FONT></A><FONT face=Arial> is from the Loan class, which is a business-object class used for storing information about a loan. The implementation is straightforward and the code is simple since the class is mainly a storage place for information. Most of the functionality is inherited from the </FONT><FONT face=Arial size=4><CODE>Persistent</CODE></FONT><FONT face=Arial> class in the database package. The only attributes in the class are the object identifiers for the associations to the </FONT><FONT face=Arial size=4><CODE>Item</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>BorrowerInformation</CODE></FONT><FONT face=Arial> class, and these association attributes are also stored in the </FONT><FONT face=Arial size=4><CODE>write()</CODE></FONT><FONT face=Arial> and </FONT><FONT face=Arial size=4><CODE>read()</CODE></FONT><FONT face=Arial> operations.</FONT></P>
<P><FONT face=Arial>You can examine the </FONT><FONT face=Arial size=4><CODE>addButton_Clicked()</CODE></FONT><FONT face=Arial> operation shown in </FONT><A href="http://www.umlchina.com/Indepth/Listing12.htm" target=_blank><FONT face=Arial>Listing 2</FONT></A><FONT face=Arial> in the context of the Add Title sequence diagram (Figure 7). Read the code together with the sequence diagram to see that it is just another, more detailed description of the collaboration described by the diagram.</FONT></P>
<P><FONT face=Arial>The code for all the sequence diagrams in the design model is included in the </FONT><A href="http://www.uml-zone.com/code/1998/jp_0698/jp0698ws.zip"><FONT face=Arial>source code</FONT></A><FONT face=Arial> (the operation and class names are shown in the sequence diagrams).</FONT></P>
<P><FONT face=Arial><B>Test and Deployment</B><BR>The usefulness of UML doesn't stop when coding ends. Use cases can be tried in the finished application to determine whether they were well supported, for example. And for deployment of the system the models and text of this article make a handy piece of documentation.</FONT></P>
<P><FONT face=Arial><B>Summary</B><BR>The various parts of this case study were designed by a group of people who made every effort to work in the same manner they would have used on an actual project. And though the different phases and activities might seem separate and to have been conducted in a strict sequence, the work is more iterative in practice. The lessons and conclusions resulting from the design were fed back into the analysis model, and discoveries made in the implementation were updated and changed in the design model. This is the normal way to build object-oriented systems.</FONT></P>
<P><FONT face=Arial><BR></FONT><FONT face=Arial size=2><I>This article is excerpted from </I>UML Toolkit<I>, New York: Wiley &amp; Sons, 1998. Hans-Erik Erikkson is a well-known author of books on C++ and OO technology. Magnus Penker is vice president of training at Astrakan, a Swedish company specializing in OO modeling and design.</I></FONT></P></LI></DIR><img src ="http://www.blogjava.net/kapok/aggbug/3844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-27 12:43 <a href="http://www.blogjava.net/kapok/archive/2005/04/27/3844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Object Oriented Analysis and Design Using UML A Whitepaper by Mark Collins-Cope of Ratio Group. </title><link>http://www.blogjava.net/kapok/archive/2005/04/27/3834.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Wed, 27 Apr 2005 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/27/3834.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3834.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/27/3834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3834.html</trackback:ping><description><![CDATA[<P><FONT color=#006600><B><U><A href="http://www.uml.org.cn/UMLApplication/UMLApplication2.htm">http://www.uml.org.cn/UMLApplication/UMLApplication2.htm</A><BR><BR>Introduction</U></B></FONT> <BR>You're proficient in C++, Java or another OO language,&nbsp; you're designing class hierarchies, using inheritance, and manipulating complex pointer relationships to store the necessary links between your classes. You've probably drawn blobs (representing classes in some way) on whiteboards, with connecting lines to indicate the relationships between classes (inheritance or other). Perhaps you're feeling the need for a more formal notation to express your designs - using something that is language independent, and that enables you to consider the important aspects of design leaving the detail for later. </P>
<P align=left>Alternatively, perhaps you're a Project Manager, looking to formalise the OO design process a little to make sure you're getting the most from your move to C++/Java or a similar language. </P>
<P align=left>In this paper, I take a look at the UML (Unified Modelling Language) notation for Object Oriented Analysis and Design - the emerging standard designed by Booch, Rumbaugh and Jacobson, each of whom previously had their own notations published independently. </P>
<P>The starting point is Object Modelling, a technique that enables you to focus on class structure, inheritance, etc., whilst avoiding language specifics such as pointer dereferencing. </P>
<P><FONT color=#006600><B><U>Object Modelling In UML</U></B></FONT> </P>
<P><FONT color=#990000><B><U><IMG height=219 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf1.gif" width=500></U></B></FONT></P>
<P><FONT color=#990000><B><U>Figure 1 - Subset of UML Object Modelling Notation&nbsp; -&nbsp; A Summary</U></B></FONT></P>
<P align=left>Object Modelling is the central technique in UML. It is a language independent notation allowing the specification of classes, their data or attributes(private) and methods (public), inheritance, and other more general relationships between classes. The notation itself is fairly simple to grasp (see figure 1), however this hides the somewhat more subtle thought processes underlying a good model. </P>
<P align=left>The best way to understand the notation is to look at an example. The following Object Model shows a simple Banking System, containing classes for Head-Office, Branch, Accounts held at that Branch, and the Customers who the Accounts belong to: </P>
<P align=left><FONT color=#990000><B><U><IMG height=336 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf2.gif" width=600></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 2 - A Simple Banking System Object Model</U></B></FONT> </P>
<P>Examining this Object Model in more detail, we can see the following information about our class structure: </P>
<UL>
<LI>A Head-Office class (containing "bankName" and "address" fields, otherwise known as attributes)&nbsp; "administers" an (unspecified) number of Branch classes; whilst a Branch is "administered-by" exactly one Head-Office (the little black arrows indicates the direction in which the name given to a relationship should be read). On the diagram this relationship is represented by the line from the Head-Office class to the Brach class which is labelled "administers". The "1" at the Head-Office end of the line shows that exactly one Head-Office is associated with each Branch (as you would expect). The "*" at the Branch end of the line shows that a Head-Office "administers" many Branches - again as you would expect. </LI></UL>
<UL>
<LI>&nbsp;Similarly, a Branch class (which contains "manager" and "address" attributes) "holds" many Account classes; whilst each Account class "is-held-by" exactly one Branch.&nbsp; We can also see that we have determined that an Account class has a "CalcCharges" method (also known as operations or member functions) defined. This method, when invoked, will look at the detail stored within the Account object, and apply the appropriate (undoubtedly extortionate) charges to the Account. The second method -"PrintStatement" - will take the details of the Account and print them out. </LI></UL>
<UL>
<LI>The inheritance "triangle" (labelled "account-type") shows us that our system knows about three types of Account: the basic account (in this case a virtual class called Account), and two specialised accounts - the CurrentAccount and SavingsAccount - which are derived from Account. The fact that the "CalcCharges" is shown in both sub-classes indicates that its implementation is re-defined for these classes (in C++ terms it is a virtual function). This is indicative of the fact that charges on a "SavingsAccount" are calculated in a completely different manner to charges on a "CurrentAccount". </LI></UL>
<UL>
<LI>Implicit in the decision to use inheritance and redefine methods in sub-classes is the fact that the system, when implemented, will use the polymorphism features of the target language (C++, Java ...) to enable all Accounts to be treated in a single coherent fashion, regardless of the particular charges mechanism involved. This is of course one of the reasons we use an object-oriented development language in the first place. </LI></UL>
<UL>
<LI>Each Account "belongs-to" exactly one owner - the Customer class on the diagram. Customers, on the other hand, may have many Accounts. </LI></UL>
<P>It's worth noting here that because an Account may "belong-to" a Customer, both CurrentAccounts and SavingsAccounts may also belong to a Customer.&nbsp; In&nbsp;&nbsp; other words, the "belongs-to" relationship between Accounts and Customers is inherited by the CurrentAccount and SavingsAccount classes. This fact simplifies the diagram considerably, removing the need for these relationships to be noted explicitly. This simplification will also be apparent in our final implementation of the system. </P>
<UL>
<LI>Finally, you can see that there are <B>two </B>relationships shown between the Account and the Transaction classes. This is because, in our banking system, each individual transaction (credit, debit, etc.) must have two associated accounts - the Account the money is "debit(ed)-from", and the Account the money is "credit(ed)-to". This enables the bank to record exactly where each transaction has come from, and gone to, so to speak. </LI></UL>
<P>These last point brings out an interesting feature of what is being shown on an Object Model: clearly it wouldn't make sense for each Transaction to be "debit(ed)-from" and "credit(ed)-to" the same Account - no money would be transferred! Obviously, although the lines (relationships) are shown to the same Account class, they do not (necessarily) represent links to the same Account object at run-time. </P>
<P>A relationship shown on an Object Model indicates that some kind of run-time link will exist between two instances of the classes shown on the Object Model. Thus the Branch to Accounts relationship should be read as follows: </P>
<P><I>An instance of the class Branch will be linked to (zero to) many instances of the class Account, whilst an instance of the class Account will be linked to (one and only) one instance of the class Branch.</I> </P>
<P align=left>This can be shown more clearly by the following instance diagram (instance diagrams are used to assist in understanding and clarifying Object Models - they also give quite a hint as to how relationships can be implemented in C++!): </P>
<P align=left><FONT color=#990000><B><U><IMG height=470 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf3.gif" width=500></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 3 - Instance Diagram Showing Branch and Account objects</U></B></FONT> </P>
<P>By now, you may be beginning to see how Object Models can assist the analysis/design process. They assist in the clarification of the relationships that should be (somehow) represented in a software system. The important point to note hear is that we are first working out what relationships we need to represent in our system ("belongs-to", etc.), without worrying too much about exactly how they should be stored. Put another way, Object Modelling allows us to focus on exactly what problem we are trying to solve, before we look at the best way of implementing our model in a particular programming language. </P>
<P align=left><FONT color=#006600><B><U>Implementing Object Models</U></B></FONT> <BR>OK, that's fine, you may say, but how do Object Models relate to C++ or Java, exactly? Lets take a look at a sub-set of our previous example: &nbsp; </P>
<P align=left><FONT color=#990000><B><U><IMG height=411 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf4.gif" width=400></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 4 - Subset of Banking Model</U></B></FONT> </P>
<P>Our Object Model shows us that we need four classes: Transaction; Account; Current Account and Savings Account, and that our implementation must enable us to represent the fact that any particular Account has two sets of Transactions associated with it - which will be needed to implement the PrintStatement method. The Account, CurrentAccount and SavingsAccount classes are easily mapped to the C++ (or Java) inheritance mechanisms: </P>
<HR>

<P><TT>class Account {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ... data ... */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void CalcCharges();</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void PrintStatement();</TT> <BR><TT>};</TT> </P>
<P><TT>class SavingsAccount : public Account {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* any additional data */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void CalcCharges(); /* re-definition */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* use the base class PrintStatement method */</TT> <BR><TT>};</TT> </P>
<P><TT>class SavingsAccount : public Account {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* any additional data */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void CalcCharges(); /* another re-definition */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* use the base class PrintStatement method */</TT> <BR><TT>};</TT> <BR></P>
<HR>

<P align=left><FONT color=#006600><B><U>Figure 5 - Mapping Object Model Inheritance To C++ Inheritance</U></B></FONT> </P>
<P>The Transaction class may be implemented as follows: </P>
<P><TT>class Transaction {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long value;&nbsp;&nbsp; /* stored in pence */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_t date;&nbsp; /* date of transaction */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Access and Update functions */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date(date_t); /* set */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_t Date(); /* get*/</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value(long);&nbsp; /* set */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long Value(); /* get */</TT> <BR><TT>};</TT> <BR></P>
<HR>

<P align=left><FONT color=#006600><B><U>Figure 6 - Transaction Class In C++</U></B></FONT> </P>
<P>This leaves us with the "debit-from" and "credit-to" relationships to be implemented. Here we have a number of choices: linked-lists; collection-classes; (dynamically bounded) arrays of pointers; etc. could all be used to represent these relationships. </P>
<P align=left><TT>class TransactionList {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransactionList * next; /* ptr to next element */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction * data;&nbsp; /* store the transaction here */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Data (Transaction *);&nbsp;&nbsp; /* set */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction * Data();&nbsp;&nbsp;&nbsp; /* get */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void NextItem(TransactionList *); /* set next ptr */</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransactionList * NextItem();&nbsp; /* get next ptr */</TT> <BR><TT>};</TT> </P>
<HR>

<P align=left><FONT color=#006600><B><U>Figure 7 - Simple Transaction List Handler Class</U></B></FONT> </P>
<P align=left>For brevity, a linked-list class with a somewhat limited interface is used in this example - although this may not the best choice. <BR>Amending our Account class definition to use this class gives us the following new definition: </P>
<P align=left><TT>class Account {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransactionList * debitedFrom; /* debited from Tx list*/</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransactionList * creditedTo;&nbsp; /* credited to Tx list */</TT> <BR><TT>public:</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void CalcCharges();</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void PrintStatement();</TT> </P>
<P align=left><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* some new methods to manipulate the Transaction list */</TT> <BR><TT>&nbsp;DebitTx (Transaction *);&nbsp;&nbsp; /* Add a debit Tx */</TT> <BR><TT>&nbsp;CreditTx (Transaction *);&nbsp; /* Add a credit Tx */</TT> <BR><TT>&nbsp;Transaction* NextDebitTx();&nbsp;&nbsp;&nbsp;&nbsp; /* Iterator:get debit Tx */</TT> <BR><TT>&nbsp;Transaction* NextCreditTx(); /* Iterator:get cred Tx&nbsp; */</TT> <BR><TT>};</TT> </P>
<P align=left><TT>/* sample method implementation */</TT> <BR><TT>Account::DebitTx(Transaction * theTx) {</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* add a new list contained at the beginning of the list */</TT> <BR><TT>&nbsp;TransactionList * tmpTxLp = debitedFrom;</TT> <BR><TT>&nbsp;debitedFrom = new TransactionList;</TT> <BR><TT>&nbsp;debitedFrom-&gt;NextItem(tmpTxLp);</TT> </P>
<P align=left><TT>&nbsp;/* new put the transaction data into the list */</TT> <BR><TT>&nbsp;debitedFrom-&gt;Data(theTx);</TT> <BR><TT>};</TT> <BR></P>
<HR>

<P align=left><FONT color=#006600><B><U>Figure 8 - Account Class amended to use Transaction List</U></B></FONT> </P>
<P align=left>Although this is a somewhat simplistic implementation - it demonstrates the point that the model shown in figure 4 is easily translated into C++. Of course, better implementations of the "debit-from" relationship are possible, but the fact that the Account class interface completely hides the underlying implementation of this relationship means that we can improve on our first cut implementation at a later date with little impact on our overall system code. In other words, use of the Account class interface has limited the impact of the relationship implementation method: something we strive to achieve when writing OO based applications. </P>
<P align=left>A couple of other points are worthy of note at this stage: </P>
<UL>
<LI>
<P align=left>The linked list class contains pointers (references in Java) to Transaction objects. This is implicit in our Object Model, and is what the system's users would expect to see. To see why, consider the case when a new Transaction value is entered in error. The Transaction is linked to two accounts ("debit-from" and "credit-to"). If the Transaction object is shared, only one object need be modified to rectify the situation. Using two objects would either mean that either the system has to update two objects (equals more coding work), or that the user has to update two Transactions (equals greater potential for mistakes). </P></LI></UL>
<UL>
<LI>
<P align=left>Although our Object Model "debit-from" relationship uses a linked list, there are many alternatives to this choice - including the use of a relational database to underpin the system. The point is, however, no matter what mechanism is used, we are actually trying to implement a "many-to-one" relationship between an Account and a Transaction. It is this relationship that exists in the banking problem domain - not a relationship involving linked lists or collection classes. Object Modelling enables us to spot the relationship required by the problem domain, and then choose the best way of implementing it. </P></LI></UL>
<UL>
<LI>
<P align=left>So far, we have only implemented the "debit-from" relationship in one direction- from the Account class to the Transaction class. Our model does not (yet) specify in which direction the relationship will be traversed. If we need to traverse the relationship in both directions - getting from the Transaction to the related Account - our implementation will prove insufficient, and some form of double pointer schema may be needed. Much work would have been saved if we had known this fact before we had started writing the code. </P></LI></UL>
<UL>
<LI>
<P align=left>Although our Object Model provided a starting point for our implementation, it was not complete, for example new methods have been added to the Account class. </P></LI></UL>
<UL>
<LI>
<P align=left>Other factors may also influence our choice of implementation: do we need a direct form of access - for example using a Transaction number to go directly from the Account to the relevant Transaction? If we do, then a linked-list will prove an inefficient choice of implementation. Again, it would be very useful to know this type of information before we start trying to implement the relationship. </P></LI></UL>
<P align=left>From these points we can see that we need to consider the wider requirements of our system before we can come up with the right implementation of our "debit-from" relationship (not to mention the many other classes and relationships that might be required). We can't produce a good design for a system unless we consider all the required functionality - in detail. Use Cases provide the mechanism for doing this. </P>
<P align=left><FONT color=#006600><B><U>Use Cases In UML</U></B></FONT> <BR>Use Cases are used to document system requirements. They provide a useful technique which, in conjunction with Object Modelling, help us to clarify exactly what the system is supposed to do. Let's take a look at the requirements for our banking system: </P>
<P align=left><FONT color=#990000><B><U><IMG height=455 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf9.gif" width=500></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 9 - Use Cases for Banking System</U></B></FONT> </P>
<P align=left>This Use Case diagram shows us the following: </P>
<UL>
<LI>
<P align=left>The required business functions - that is, the type of operation you'd expect to find on the menu of the application once it had been developed. In this case we have identified the following functions: </P>
<LI>
<P align=left>Bank managers need to periodically print out a report detailing all the customers who are overdrawn; these appear on the branch printer </P>
<LI>
<P align=left>Customers may use the system for balance enquiries </P>
<LI>
<P align=left>Data processing staff use the system to do basic data entry (transactions on accounts) </P>
<LI>
<P align=left>Clerks may periodically request statements on behalf of Customers; </P>
<LI>
<P align=left>There are four distinct types of user of the system: Bank Managers; Clerks; Data Processing Assistants; and Customers. Each type of user typically has their own particular set of requirements for a system: hence identify user types assists in identifying all the required system functions. </P></LI></UL>
<P align=left>The Use Case diagramming technique allows us to make a first cut at defining the system requirements, and will help us in presenting these requirements back to the users of the system. It also partitions the system into single atomic business functions, which may be used as a basis for costing the system, or for planning a phased system delivery. In this case each successive phase would deliver further batches of Use Cases. <BR>Further information is still required, however, to tie down the detail of what each businese function does. Use Case Detail provides this information (explanatory notes are shown in bold): <BR>&nbsp; </P>
<TABLE cols=1 width="100%" border=1>
<TBODY>
<TR>
<TD>
<P align=left><FONT color=#006600><B><U>Use Case Detail:</U></B></FONT> Overdrawn Report&nbsp; </P>
<P align=left><FONT color=#006600><B><U>Used By:</U></B></FONT>&nbsp; <BR>Bank Manager&nbsp; </P>
<P align=left><FONT color=#006600><B><U>Inputs:</U></B></FONT>&nbsp; <BR><I>Details what information flows from the user to the system for this particular Use Case.&nbsp;</I>&nbsp; <BR>theBranchSortCode - The Sort Code of the branch for which the report is required.&nbsp; <BR>theOverdraftPeriod - how long an Account has been overdrawn before it is forms part of the report.&nbsp; </P>
<P align=left><FONT color=#006600><B><U>Outputs:</U></B></FONT>&nbsp; <BR><I>Details what information flows from the system to the external environment, in this case the printer!&nbsp;</I>&nbsp; <BR>overdraftReport (to branchPrinter) - structured as follows: customer name; current overdraft; period overdrawn (days);&nbsp; <BR>Printed for all accounts that have been overdrawn for a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; period greater than theOverdraftPeriod, and which have not already been reported (on another report) in the last 30 days.&nbsp; </P>
<P align=left><FONT color=#006600><B><U>Pre-Conditions:</U></B></FONT>&nbsp; <BR><I>What validity checks or constraints apply on the inputs (or the internal system as a whole, in some cases).</I>&nbsp; <BR>theBranchSortCode - must be a branch sort code held within the system.&nbsp; <BR>theOverdraftPeriod - must be a number between 0 and 100 days.&nbsp; </P>
<P align=left><FONT color=#006600><B><U>Post-Condition:</U></B></FONT>&nbsp; <BR><I>What changes does the Use Case make to the internal system state.&nbsp;</I>&nbsp; <BR>Updates the reportedOnDate field of overdrawn accounts.&nbsp; <BR>&nbsp;</P></TD></TR></TBODY></TABLE>
<P align=left>As work progresses on the Use Cases, the requirements of the system become clearer enabling the Object Model to be updated in parallel, helping us make sure our model (and the subsequent implementation in the chosen language) contains all the necessary classes and class inter-links. <BR>Whilst we're nearer to resolving some of the issues identified at the end of the discussion of implementing Object Models, a number are still outstanding: we still can't be sure in what direction the relationships must be implemented, whether we have identified all the methods; or what implementation of the links will best suit the use to which they'll be put. To sort out the remaining issues we'll need to look in more detail exactly how each Use Case will be implemented, using Sequence Diagrams. </P>
<P align=left><FONT color=#006600><B><U>Sequence Diagrams</U></B></FONT> <BR>Sequence diagrams, performed on a per Use Case basis, examine the flow of&nbsp; method call calls within a system. </P>
<P align=left><FONT color=#990000><B><U><IMG height=420 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf10.jpg" width=885>Figure 10 - Sequence Diagram for Overdrawn Report</U></B></FONT></P>
<P align=left>Performing a complete analysis requires that each individual Use Case must be examined, although in practise only selected Use Cases may be examined. The Sequence Diagram in figure 10 shows the Overdrawn Report Use Case defined earlier. <BR>The Overdrawn Report Use Case is thus implemented as follows: </P>
<UL>
<LI>
<P align=left>The Head-Office object (there is only one of them) has methods which correspond to each Use Case - in this case an OverdrawnReport method (this is a convenience for brevity, normally there would be a single "InitialObject" which the system would know about, and which would provide the entry point into the run-time model for all code). </P>
<LI>
<P align=left>The Head-Office OverdrawnReport method locates the relevant Branch (as determined by the Use Case input: theBranchUseCase) and cascades the request to the Branch by calling its OverdrawnReport method. </P>
<LI>
<P align=left>The Branch object in turn passes the request on down to each Account it holds (using the Account's OverdrawnReport method)! </P>
<LI>
<P align=left>Each Account then: </P>
<LI>
<P align=left>checks if it has been overdrawn for greater than the period specified by theOverdraftPeriod, which is passed as an argument to the Account.OverdrawnReport method (the detail of this is not shown - but involves summing up all the Transactions it holds, and checking the date on which it last became overdrawn). </P>
<LI>
<P align=left>if appropriate it then calls one of its own methods to print the report (detail not shown), and resets its lastReportDate attribute, again using its own method. </P>
<LI>
<P align=left>The method calls unwind until the Use Case is complete. </P></LI></UL>
<P align=left><FONT color=#990000><B><U><IMG height=430 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf11.gif" width=650></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 11 - Updated Banking System Object Model</U></B></FONT> </P>
<P align=left>Reviewing the Object Model (see figure 11), we can see a number of additions as a result of&nbsp; completing this Sequence Diagram: </P>
<UL>
<LI>
<P align=left>OverdrawnReport methods have been added to the Branch and Account classes. </P>
<LI>
<P align=left>A lastReportedDate attribute and associated methods have been added to the Account class, along with a printOverdrawnReport method. </P>
<LI>
<P align=left>The "administers" relationship between Head-Office and Branch has been qualified to indicate that "direct access" via the Branch's "sort-code" is required across the link (thus assisting in link design) - note the consequent change in the multiplicity of the relationship from many-to-one to one-to-one. </P>
<LI>
<P align=left>We have added directionality to many of the links (e.g. see the arrow-head on the Branch to Account link). </P></LI></UL>
<P align=left>Of course, we've only looked at one Use Case, so its likely the model will change further as more sequence diagrams are developed. </P>
<P align=left><FONT color=#006600><B><U>The Overall Process</U></B></FONT> <BR>From the above discussion we can see that Use Cases and Sequence Diagrams both add to integrity and completeness of our Object Model, and that a good Object Model provides a firm foundation for a good design, and hence a good implementation of the system. </P>
<P align=left><FONT color=#990000><B><U><IMG height=532 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf12.gif" width=800>Figure 12 - The Overall Process</U></B></FONT> </P>
<P align=left>This approach separates the Problem and Technical Domain aspects of the project: </P>
<UL>
<LI>
<P align=left>Problem Domain Analysis is concerned with capturing requirements and producing a first cut Object Model. Typically the Object Model will be incomplete, having only a subset of the class attributes and methods defined. </P></LI></UL>
<UL>
<LI>
<P align=left>Problem Domain Design is concerned with finalising the detail of the problem domain parts of the Object Model, and results in an Object Model with a complete set of Problem Domain specific classes, attributes and methods. </P></LI></UL>
<UL>
<LI>
<P align=left>User Interface Design is the first step that focuses on the Technical Domain aspects of the problem, and involves taking the Use Cases as defined earlier, and designing a Graphical User Interface appropriate to the Technical Architecture chosen for the project (MS Windows, X/Motif, etc.). Typically you would expect to find one controlling dialog box (which may use other subsidiary dialogs) for each Use Case in the system. Some prototyping may be appropriate at this point in the project. For small projects, prototyping and UI design may be undertaken in parallel with Use Case development. </P></LI></UL>
<UL>
<LI>
<P align=left>Technical Domain, High Level Design focuses on adding classes to meet the technical needs of the project, and is driven by the technical architecture of the project. Classes may be GUI related, DBMS (object or relational) related, distribution related (CORBA, DCOM, etc.), external systems related, or may provide an interface to internal system components such as printers. Previous Sequence Diagrams may be updated to confirm the validity of the technical design - in particular you would expect to see GUI classes appearing between the System Boundary and the Problem Domain classes. </P></LI></UL>
<UL>
<LI>
<P align=left>Finally, Detailed Technical Design, looks at link implementations, detailed data typing of attributes, full specification of all methods (including parameters), etc. The end result is a complete design of the full system. </P></LI></UL>
<P align=left>The separation between Problem Domain and the Technical Domain aspects of the system is useful in large projects, allowing the focus of those working on the project to be clearly divided, as summarised in figure 13: </P>
<P align=left><IMG height=364 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf16.gif" width=600></P>
<P align=left><FONT color=#990000><B><U>Figure 13 - Seperation Of Problem and Technical&nbsp; Domain Components of a System</U></B></FONT> </P>
<P align=left>For smaller projects (one or two persons for a couple of months) the two domains may be merged, if desired. <BR>As mentioned previously, Use Cases may be used in phasing a project; the process shown earlier does not prohibit this. A project with 50 Use Cases could be structured in three phases as shown in figure 14: </P>
<P align=left><FONT color=#990000><B><U><IMG height=273 src="http://www.uml.org.cn/UMLApplication/images/ooadwhf14.gif" width=800></U></B></FONT></P>
<P align=left><FONT color=#990000><B><U>Figure 14 - Evolutionary Phasing Of OO Project</U></B></FONT> </P>
<P align=left>The object-based structure of the application lends itself well to this approach. </P>
<P align=left><FONT color=#006600><B><U>Summary</U></B></FONT> <BR>This paper has taken a look at the Use Case, Object Modelling, and Sequence Diagramming notations of UML, how Object Modelling maps to OO programming languages, and shown how these notations hang together to complement each other. A number of other UML notations are not covered in this article, however further information can be found on www.ratio.co.uk. </P>
<P align=left>I hope you can see that OOA/D offers a number of potential benefits in an OO based development environment. These include: </P>
<UL>
<LI>
<P align=left>better modelling of the problem domain (equals happier users) </P>
<LI>
<P align=left>better overall software design with a strong focus on class structure </P>
<LI>
<P align=left>more flexible and maintainable systems through better class partitioning </P>
<LI>
<P align=left>good documentation (the notations) - and a single central overall design notation (the Object Model) </P>
<LI>
<P align=left>a flexible approach to project phasing </P>
<LI>
<P align=left>assistance in tie-ing down requirements, and </P>
<LI>
<P align=left>less work (in the long run) </P></LI></UL>
<P align=left><I>Mark Collins-Cope is Technical Director at Ratio Group Ltd., a consultancy and training company specialising in OO related methods, languages and technologies. For further information on OOA/D using UML, Java, C++, Design Patterns or related topics please call 0171 386 9600 or email info@ratio.co.uk.</I> </P>
<P align=left><B><I>Copyright</I></B> <BR><I>This material remains the copyright of Ratio Group Ltd. Licence is granted for the use of this material for personal development purposes only.</I> </P><img src ="http://www.blogjava.net/kapok/aggbug/3834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-27 09:24 <a href="http://www.blogjava.net/kapok/archive/2005/04/27/3834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用例驱动的需求过程实践</title><link>http://www.blogjava.net/kapok/archive/2005/04/25/3801.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 25 Apr 2005 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/25/3801.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3801.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/25/3801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3801.html</trackback:ping><description><![CDATA[<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD height=9>
<H3><A href="http://www.csai.cn/tech/xqgc/xq1231.htm">http://www.csai.cn/tech/xqgc/xq1231.htm</A></H3>
<H3>&nbsp;</H3>
<H3>用例驱动的需求过程实践</H3></TD></TR>
<TR>
<TD align=middle height=20>徐锋（转载自计算机世界网）　　　　2003年12月31日</TD></TR>
<TR>
<TD align=right height=20>&nbsp;</TD></TR>
<TR>
<TD vAlign=top height=3209>
<P><FONT color=#ff0000>一、需求矛盾</FONT></P>
<P>　　根据CHAO的权威统计，虽然自"软件危机"提出以来，软件工程方法得到了长足的发展与进步，但在去年的软件项目成功率仍然不足30％，绝大多数的软件项目仍然超进度、超成本。而在这些不成功的项目中，由于需求不清晰、需求不完整等方面的因素，占到了60％左右。</P>
<P>　　下面的这幅漫画虽然不乏夸张，但却是能够激起我们的深思：<BR><BR><IMG height=401 src="http://www.csai.cn/tech/xqgc/xq1231.gif" width=500> </P>
<P></P>
<P>　　根据笔者多年来从事软件需求捕获、分析工作的实践经验，认为造成这一现象的根本原因在于客户与开发人员之间的沟通存在障碍，双方都以自己的角度、自己的专业术语进行沟通，这使得大家并不能够很好地就软件需求达成共识。</P>
<P>　　由于帮助客户更好地利用信息化工具提高工作效率，是我们软件开发团队的责任，因此我们没有权利让用户理解我们所用的语言，而是反过来，我们有义务去理解用户的语言，站在用户的角度看问题。</P>
<P>　　而事实上，许多开发团队经常抱怨"我们的客户连需求都说不清楚"、"我们的客户对计算机了解太少了"。多年以来，大家都习惯从自己的角度来定义、分析问题，这也就造成了软件行业成为了一个最缺乏信任的行业，我们需要改一下习惯了。</P>
<P><FONT color=#ff0000>二、现代需求实践</FONT></P>
<P>　　针对这些现象，许多先贤们开始了实践，并且总结出了一系列优秀的需求实践：</P>
<P><FONT color=#0000ff>1）Use case：用例分析技术</FONT></P>
<P>　　鼎鼎大名的RUP是这样总结自己的：用例驱动，以体系结构为中心，迭代、增量的开发过程。Use case也伴随着RUP、UML一起名扬天下。</P>
<P>　　用例用来描绘一个系统外在可见的需求情况，是代表系统中各个项目相关人员（风险承担人，Stakeholder）之间就系统的行为所达成的契约。</P>
<P><FONT color=#0000ff>2）User Story：用户故事、用户素材</FONT></P>
<P>　　用户故事是Kent Beck在极限编程（XP）方法论中推荐的最佳实践之一。它由客户参与编写，说明他们需要系统为他们做什么，一般用客户的术语写就，三句话左右。</P>
<P><FONT color=#0000ff>3）Feature：特征</FONT></P>
<P>　　这是特征驱动开发（FDD）方法论的核心实践之一。一个特征就是一个小的，具有客户价值的功能，通常表示为&lt;action&gt;&lt;result&gt;&lt;object&gt;。</P>
<P>　　从上面的定义来看，这三种现代软件工程需求实践无一例外地遵从两个原则：一是站在用户的角度看待系统、定义系统；二是用用户看得懂的语言表达。而在笔者的实践中，鉴于以下两点考虑还是先在团队中应用了"用例分析技术"：</P>
<P>1）用户故事略显粗糙，掌握起来需要经验，没有详细的规则用于按部就班，一开始采用容易迷失方向；而用例相对来说更加形式化，易于上手；</P>
<P>2）特征看上去很有吸引力，但毕竟相关的理论还未完整，引入团队实践有些困难。</P>
<P><FONT color=#ff0000>三、用例分析技术简介</FONT></P>
<P>　　用例分析技术是Rational三友之一Ivar Jacobson先生于1967年在爱立信公司开发AXE交换机时开始研究，并于1986年总结、发布的一项源于实践的需求分析技术。Ivar先生在加盟Rational之后，与三友合作提出了UML、完善了RUP，用例分析技术也因此被人广泛了解和关注。</P>
<P>　　用例分析技术为软件需求规格化提供了一个基本的元素，而且该元素是可验证、可度量的。用例可以作为项目计划、进度控制、测试等环节的基础。而且用例还可以使开发团队与客户之间的交流更加顺畅。</P>
<P>　　许多人是在学习UML的时候接触到Use case，所以许多人都误解其为一种图表，把用例图当作用例分析的全部，其实这是错误的，用例描述才是用例分析技术的核心。下面是一个简单的例子：<BR><BR><IMG height=391 src="http://www.csai.cn/tech/xqgc/xq12312.gif" width=480> <BR><FONT color=#0000ff>3.1 参与者，Actor</FONT></P>
<P>　　参与者，定义了用户在系统交互过程中扮演的角色，其可以是一个人，也可以是另一个相关的系统。</P>
<P><FONT color=#0000ff>3.2 用例，Use case</FONT></P>
<P>　　用例实例（场景）是在系统中执行的一系列动作，这些动作将生成特定参与者可见的价值结果，一个用例定义一组用例实例（场景）。</P>
<P>　　一个用例应为参与者提供（实现）一个价值。<BR></P><FONT color=#0000ff>3.3 事件流 </FONT>
<P>　　就像类对应于对象一样，一个用例的实例就是使用场景，用例就是对使用场景进行抽象的总结：<BR><BR><IMG height=445 src="http://www.csai.cn/tech/xqgc/xq12313.gif" width=480> </P>
<P></P>
<P>　　1）前置条件：指在用例启动时，参与者（Actor）与系统应置于什么状态，这个状态应该是系统能够检测到的、可观测的；</P>
<P>　　2）后置条件：用例结束时，系统应置于什么状态，这个状态也应该是系统能够检测得到的、可观测的；</P>
<P>　　3）基本事件流：基本事件流是对用例中常规、预期路径的描述，也被称为Happy day场景，这时大部分时间所遇到的场景；它将体现系统的核心价值；</P>
<P>　　4）扩展事件流：主要是对一些异常情况、选择分支进行描述。</P>
<P>　　建议大家在编写事件流时，注意以下几点：</P>
<P>　　1）使用简单的语法：主语明确，语义易于理解；</P>
<P>　　2）明确写出"谁控制球"：也就是在事件流描述中，让读者直观地了解是参与者在控制还是系统在控制；</P>
<P>　　3）从俯视的角度来编写：指出参与者的动作，以及系统的响应，也就是第三者的角度；</P>
<P>　　4）显示过程向前推移：也就是第一步都有前进的感（例如，用户按下tab键做为一个事件就是不合适的）；</P>
<P>　　5）显示参与者的意图而非动作（光有动作，让人不容易直接从事件流中理解用例）；</P>
<P>　　6）包括"合理的活动集"（带数据的请求、系统确认、更改内部、返回结果）；</P>
<P>　　7）用"确认"而非"检查是否"：（如系统确认用户密码正确，而非系统检查用户密码是否正确）；</P>
<P>　　8）可选择地提及时间限制；</P>
<P>　　9）采用"用户让系统A与系统B交互"的习惯用语；</P>
<P>　　10）采用"循环执行步骤x到y，直到条件满足"的习惯用语。</P>
<P><FONT color=#ff0000>四、Alistair Cockburn眼中的用例分析技术</FONT></P>
<P>　　在使用用例分析技术时，很多人都觉得如何确定用例的粒度是一个难点，而且感觉到用例没有什么规则遵从，甚至有无所适从的感觉。正如Cockburn先生提出的学习用例分析技术的"守、破、离"的三个阶段：</P>
<P>　　1）守：练习基本功夫，遵循规则，照章行事；</P>
<P>　　2）破：能突破传统，因地制宜地灵活应用； 3）离：超脱任何招式与规则，达到无招胜有招的境界。</P>
<P>　　但用例分析技术却让第一阶段的初学者感到无法很快地掌握。而其所著"编写有效用例"则想为用例分析技术补充规则，让大家能够更好地掌握。</P>
<P>　　Cockburn先生在Ivar Jacobson的基础上，做了一些补充：</P>
<P>　　1）用例是契约，是系统与涉众之间达成的契约。也就是将用例朝着形式化的方向发展；</P>
<P>　　2） 将用例分成三级：</P>
<P>　　◆ 概要级：包括多个用户目标（显示用户目标运行的语境，显示相关目标的生命周期、为低层用例提供一个目录表）；</P>
<P>　　◆ 用户目标级</P>
<P>　　◆ 子功能级</P>
<P>　　不过，对于Cockburn先生的贡献，用例始祖Ivar大师并未做出任何反应。本人在实践中认为，Cockburn先生的思路与理念对于初学用例分析技术的人来说，十分有价值，使得用例分析技术更具操作性，当其同时也有点画地为牢的感觉，也许Cockburn先生也意识到这点，因此第三阶段就是"离"，没有规则，按需灵活使用。<BR></P><FONT color=#ff0000>五、如何在开发过程中应用用例分析技术</FONT> 
<P>　　用例分析技术在需求过程中的地位如下图所示：<BR><BR><IMG height=310 src="http://www.csai.cn/tech/xqgc/xq12314.gif" width=480> </P>
<P></P>
<P>　　对于用例分析技术理解上的两个最大的误区是：</P>
<P>　　1）用例分析技术包括了整个需求过程：它只是一个需求分析技术，是在传统的需求捕获技术的基础上使用的，并无法替代这些技术；</P>
<P>　　2）用例分析技术是分解技术：其实用例分析技术是一种合成技术，将在需求捕获中收集而来的零散的特性合成为用例：<BR><BR><IMG height=267 src="http://www.csai.cn/tech/xqgc/xq12315.gif" width=450> </P>
<P></P>
<P><FONT color=#0000ff>5.1 用例分析前的工作</FONT></P>
<P>　　在用例分析之前，应该完成以下工作：</P>
<P>　　1）确定涉众（Stakeholder）和用户类型（命名、简要描述、涉众代表、特征、能力）；</P>
<P>　　2）确定涉众代表（命名、简要描述、责任、参与）；</P>
<P>　　3）在项目中加入涉众代表（访谈、问卷、顾问、评审、角色扮演）；</P>
<P>　　4）创建共同的构想（问题定义、系统范围、用户目标、非功能需求à前景文档）；</P>
<P>　　5）采用传统的需求捕获技术捕获需求；</P>
<P>　　6）组建用例分析队伍（少量、有问题域知识）。</P>
<P><FONT color=#0000ff>5.2 用例分析过程中的注意事项</FONT></P>
<P>　　用例分析的过程如下图所示：<BR><BR><IMG height=260 src="http://www.csai.cn/tech/xqgc/xq12316.gif" width=480> </P>
<P></P>
<P>　　在使用中要注意：</P>
<P>　　1）用例源于涉众，请不要自己杜撰出用例；</P>
<P>　　2）用例的事件流的编写过程中，应充分加入团队的参与；</P>
<P>　　3）虽然用例源于涉众，但不要企图向他们直接问"你还有什么用例?quot;这样的问题。 <BR></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/kapok/aggbug/3801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-25 22:48 <a href="http://www.blogjava.net/kapok/archive/2005/04/25/3801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational统一过程</title><link>http://www.blogjava.net/kapok/archive/2005/04/25/3792.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Mon, 25 Apr 2005 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/25/3792.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3792.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/25/3792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3792.html</trackback:ping><description><![CDATA[<SPAN class=atitle2><A href="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/">http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/</A><BR><BR>软件开发团队的最佳实践</SPAN><BR>
<P><NAME></NAME><BR>IBM Rational<BR>2004 年 3 月 </P>
<BLOCKQUOTE>Rational Unified Process 是软件工程的过程。它提供了在开发组织中分派任务和责任的纪律化方法。它的目标是在可预见的日程和预算前提下，确保满足最终用户需求的高质量产品。</BLOCKQUOTE>
<P><A name=1><SPAN class=atitle2>什么是 Rational 统一过程（ Rational Unified Process）?</SPAN></A><BR><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B> 是软件工程的过程。它提供了在开发组织中分派任务和责任的纪律化方法。它的目标是在可预见的日程和预算前提下，确保满足最终用户需求的高质量产品。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B> 是 Rational 公司开发和维护的过程产品。Rational Unified Process 的开发团队同顾客、合作伙伴、Rational 产品小组及顾问公司共同协作，确保开发过程持续地更新和提高以反映新的经验和不断演化的实践经验。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B> 提高了团队生产力。对于所有的关键开发活动，它为每个团队成员提供了使用准则、模板、工具指导来进行访问的知识基础。而通过对相同知识基础的理解， </P>
<P>无论你是进行需求分析、设计、测试项目管理或配置管理，均能确保全体成员共享相同的知识、过程和开发软件的视图。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B> 的活动创建和维护模型。 Rational Unified Process 强调开发和维护模型--语义丰富的软件系统表达，而非强调大量的文本工作。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B>是有效使用 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Unified Modeling Language (UML)的指南</B>。UML是良好沟通需求、体系结构和设计的工业标准语言。UML 由 Rational 软件公司创建，现在由标准化对象管理机构（OMG）维护。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">Rational Unified Process</B> 能对大部分开发过程提供自动化的工具支持。它们被用来创建和维护软件开发过程（可视化建模、编程、测试等）的各种各样的产物--特别是模型。另外在每个迭代过程的变更管理和配置管理相关的文档工作支持方面也是非常有价值的。 </P>
<P>Rational Unified Process 是可配置的过程。没有一个开发过程能适合所有的软件开发。Rational Unified Process 既适用小的开发团队也适合大型开发组织。Rational Unified Process 建立简洁和清晰的过程结构为开发过程家族提供通用性。并且，它可以变更以容纳不同的情况。它还包含了开发工具包，为配置适应特定组织机构的开发过程提供了支持。 </P>
<P>Rational Unified Process 以适合于大范围项目和机构的方式捕捉了许多现代软件开发过程的最佳实践。部署这些最佳实践经验--使用 Rational Unified Process 作为指南--给开发团队提供了大量的关键优势。在下节中，我们对 Rational Unified Process 的6个基本最佳实践经验进行描述。 </P>
<P><A name=2><SPAN class=atitle2>6个最佳实践的有效部署</SPAN></A><BR>Rational Unified Process 描述了如何为软件开发团队有效的部署经过商业化验证的软件开发方法。它们被称为"最佳实践"不仅仅因为你可以精确地量化它们的价值，而且它们被许多成功的机构普遍的运用。为使整个团队有效利用最佳实践，Rational Unified Process 为每个团队成员提供了必要准则、模板和工具指导； </P>
<OL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>迭代的开发软件 
<LI>需求管理 
<LI>使用基于构件的体系结构 
<LI>可视化软件建模 
<LI>验证软件质量 
<LI>控制软件变更 </LI></OL>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">迭代的开发产品</B> -- 面对当今的复杂的软件系统，使用连续的开发方法：如首先定义整个问题，设计完整的解决方案，编制软件并最终测试产品，是不可能的。需要一种能够通过一系列细化，若干个渐进的反复过程而生成有效解决方案的迭代方法。Rational Unified Process 支持专注于处理生命周期中每个阶段中最高风险的迭代开发方法，极大地减少了项目的风险性。迭代方法通过可验证的方法来帮助减少风险--经常性的、可执行版本使最终用户不断的介入和反馈。因为每个迭代过程以可执行版本告终，开发团队停留在产生结果上，频繁的状态检查帮助确保项目能按时进行。迭代化方法同样使得需求、特色、日程上战略性的变化更为容易。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">需求管理</B> -- Rational Unified Process 描述了如何提取、组织和文档化需要的功能和限制；跟踪和文档化折衷方案和决策； 捕获和进行商业需求交流。过程中用例和场景的使用被证明是捕获功能性需求的卓越方法，并确保由它们来驱动设计、实现和软件的测试，使最终系统更能满足最终用户的需要。它们给开发和发布系统提供了连续的和可跟踪的线索。 __ </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">基于构件的体系结构</B> -- 该过程在全力以赴开发之前，关注于早期的开发和健壮可执行体系结构的基线。它描述了如何设计灵活的，可容纳修改的，直观便于理解的，并且促进有效软件重用的弹性结构。Rational Unified Process 支持基于构件的软件开发。构件是实现清晰功能的模块、子系统。Rational Unified Process 提供了使用新的及现有构件定义体系结构的系统化方法。它们被组装为良好定义的结构，或是特殊的、底层结构如Internet、CORBA 和 COM 等的工业级重用构件。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">可视化软件建模</B>-- 开发过程显示了对软件如何可视化建模，捕获体系结构和构件的构架和行为。这允许你隐藏细节和使用"图形构件块"来书写代码。可视化抽象帮助你沟通软件的不同方面，观察各元素如何配合在一起，确保构件模块一致于代码，保持设计和实现的一致性，促进明确的沟通。Rational软件公司创建的工业级标准 Unified Modeling Language(UML)是成功可视化软件建模的基础。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">验证软件质量</B> -- 拙劣的应用程序性能和可靠性是戏剧性展示当今软件可接受性的特点。从而，质量应该基于可靠性、功能性、应用和系统性能根据需求来进行验证。Rational Unified Process帮助计划、设计、实现、执行和评估这些测试类型。质量评估被内建于过程、所有的活动，包括全体成员，使用客观的度量和标准，并且不是事后型的或单独小组进行的分离活动。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">控制软件的变更</B> -- 管理变更的能力--确定每个修改是可接受的，能被跟踪的--在变更不可避免环境中是必须的。开发过程描述了如何控制、跟踪和监控修改以确保成功的迭代开发。它同时指导如何通过隔离修改和控制整个软件产物（例如，模型、代码、文档等）的修改来为每个开发者建立安全的工作区。另外，它通过描述如何进行自动化集成和建立管理使小队如同单个单元来工作。 </P>
<P><A name=3><SPAN class=atitle2>过程简介</SPAN></A><BR></P>
<P>二维结构</P>
<P>开发过程可以用二维结构或沿着两个坐标轴来表达：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>横轴代表了制订开发过程时的时间，体现了过程的动态结构。它以术语周期（cycle）、阶段(phase)、迭代（iteration）和里程碑(milestone)来表达。 
<LI>纵轴表现了过程的静态结构：如何用术语活动（activity）、产物(artifact)、 角色(worker)和工作流(workflow)来描述。 </LI></UL>
<P><A name=N100C6><B>迭代模型图显示了过程的二维结构</B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image001.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><A name=4><SPAN class=atitle2>阶段和迭代--时间轴</SPAN></A><BR>这是开发过程沿时间的动态组织结构。</P>
<P>软件生命周期被分解为周期，每一个周期工作在产品新的一代上。Rational Unified Process将周期又划分为四个连续的阶段。</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>初始阶段 
<LI>细化阶段 
<LI>构造阶段 
<LI>交付阶段 </LI></UL>
<P>每个阶段终结于良好定义的里程碑--某些关键决策必须做出的时间点，因此关键的目标必须被达到。 </P>
<P><A name=N100F1><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image002.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>过程中的阶段和主要里程碑</P>
<P>每个阶段均有明确的目标。</P>
<P><A name=N10101><SPAN class=atitle3>初始阶段</SPAN></A><BR></P>
<P><A name=N1010B><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image003.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">初始阶段的目标是为系统建立商业案例和确定项目的边界。</B> </P>
<P>为了达到该目的必须识别所有与系统交互的外部实体，在较高层次上定义交互的特性。它包括识别所有用例和描述一些重要的用例。商业案例包括验收规范、风险评估、所需资源估计、体现主要里程碑日期的阶段计划。 </P>
<P>本阶段具有非常重要的意义，在这个阶段中，关注的是整个项目进行工程中的业务和需求方面的主要风险。对于建立在原有系统基础上的开发项目来说，初始阶段的时间可能很短。 </P>
<P>本阶段的主要目标如下： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>明确软件系统的范围和边界条件，括从功能角度的前景分析、产品验收标准和哪些做与哪些不做的相关决定 
<LI>明确区分系统的关键用例（Use-case） 和主要的功能场景 
<LI>展现或者演示至少一种符合主要场景要求的候选软件体系结构 
<LI>对整个项目做最初的项目成本和日程估计(更详细的估计将在随后的细化阶段中做出) 
<LI>估计出潜在的风险(主要指各种不确定因素造成的潜在风险) 
<LI>准备好项目的支持环境 </LI></UL>
<P>初始阶段的产出是: </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>蓝图文档核心项目需求关键特色主要约束的总体蓝图 
<LI>原始用例模型(完成10%～20%) 
<LI>原始项目术语表(可能部分表达为业务模型) 
<LI>原始商业案例,包括业务的上下文、验收规范（年度映射、市场认可等等），成本预计 
<LI>原始的风险评估 
<LI>一个或多个原型 </LI></UL>
<P><A name=N10151><SPAN class=atitle3>里程碑：生命周期的目标</SPAN></A><BR></P>
<P><A name=N1015B><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image004.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>初始阶段结束时是第一个重要的里程碑：生命周期目标里程碑。初始阶段的评审标准：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>风险承担者就范围定义成本日程估计达成共识 
<LI>以客观的主要用例证实对需求的理解 
<LI>成本/日程、优先级、风险和开发过程的可信度 
<LI>被开发体系结构原型的深度和广度 
<LI>实际开支与计划开支的比较 </LI></UL>
<P>如果无法通过这些里程碑，则项目可能被取消或仔细地重新考虑。 </P>
<P><A name=N1017D><SPAN class=atitle3>细化阶段</SPAN></A><BR></P>
<P><A name=N10187><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image005.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"><I>细化阶段的目标是分析问题领域，建立健全的体系结构基础，编制项目计划，淘汰项目中最高风险的元素。</I> </B></P>
<P>为了达到该目的，必须对系统具有"英里宽和英寸深"的观察。体系结构的决策必须在理解整个系统的基础上作出：它的范围，主要功能和如性能等非功能性需求。 </P>
<P>容易引起争论，细化阶段是四个阶段中最关键的阶段。该阶段结束时，硬"工程"可以认为已结束，项目则经历最后的审判日：决策是否项目提交给构建和交付阶段。对于大多数项目，这也相当于从移动的、轻松的、灵巧的、低风险的运作过渡到高成本、高风险并带有较大惯性的运作过程。而过程必须能容纳变化，细化阶段活动确保了结构、需求和计划是足够稳定的，风险被充分减轻，所以可以为开发结果预先决定成本和日程安排。概念上，其逼真程度一致于机构实行费用固定的构建阶段的必要程度。 </P>
<P>在细化阶段，可执行的结构原形在一个或多个迭代过程中建立，依赖于项目的范围、规模、风险和先进程度。工作量必须至少处理初始阶段中识别的关键用例，关键用例典型揭示了项目主要技术的风险。通常我们的目标是一个由产品质量级别构件组成的可进化的原型，但这并不排除开发一个或多个探索性、可抛弃的原型来减少如：设计/需求折衷，构件可行性研究，或者给投资者、顾客即最终用户演示版本等特定的风险。 </P>
<P>本阶段的主要目标如下： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>确保软件结构、需求、计划足够稳定；确保项目风险已经降低到能够预计完成整个项目的成本和日程的程度。 
<LI>针对项目的软件结构上的主要风险已经解决或处理完成。 
<LI>通过完成软件结构上的主要场景建立软件体系结构的基线。 
<LI>建立一个包含高质量组件的可演化的产品原型。 
<LI>说明基线化的软件体系结构可以保障系统需求可以控制在合理的成本和时间范围内。 
<LI>建立好产品的支持环境。 </LI></UL>
<P>初始阶段的产出是：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>用例模型（完成至少80％）-- 所有用例均被识别，大多数用例描述被开发 
<LI>补充捕获非功能性要求和非关联于特定用例要求的需求 
<LI>软件体系结构描述_可执行的软件原型 
<LI>经修订过的风险清单和商业案例 
<LI>总体项目的开发计划，包括纹理较粗糙的项目计划，显示迭代过程和对应的审核标准 
<LI>指明被使用过程的更新过的开发用例 
<LI>用户手册的初始版本（可选） </LI></UL>
<P><A name=N101D6><SPAN class=atitle3>里程碑：生命周期的结构</SPAN></A><BR></P>
<P><A name=N101E0><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image006.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>细化阶段结束是第二个重要的里程碑：生命周期的结构里程碑。此刻，检验详细的系统目标 </P>
<P>和范围、结构的选择以及主要风险的解决方案。主要的审核标准包括回答以下的问题： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>产品的蓝图是否稳定？ 
<LI>体系结构是否稳定？ 
<LI>可执行的演示版是否显示风险要素已被处理和可靠的解决 
<LI>构建阶段的计划是否足够详细和精确？是否被可靠的审核基础支持？ 
<LI>如果当前计划在现有的体系结构环境中被执行而开发出完整系统，是否所有的风险承担人同意该蓝图是可实现的？ 
<LI>实际的费用开支与计划开支是否可以接受？ </LI></UL>
<P>如果无法通过这些里程碑，则项目可能被取消或仔细地重新考虑。 </P>
<P><A name=N10208><SPAN class=atitle3>构建阶段</SPAN></A><BR></P>
<P><A name=N10212><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image007.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"><I>在构建阶段,所有剩余的构件和应用程序功能被开发并集成为产品,所有的功能被详尽的测试。</I> </B></P>
<P>构建阶段，从某种意义上说，是重点在管理资源和控制运作以优化成本、日程、质量的生产过程。就这一点而言，管理的理念经历了初始阶段和细化阶段的智力资产开发到构建阶段和交付阶段可发布产品的过渡。 </P>
<P>许多项目规模大的足够产生许多平行的增量构建过程，这些平行的活动可以极大地加速版本发布的有效性；同时也增加了资源管理和工作流同步的复杂性。健壮的体系结构和易于理解的计划是高度关联的。换言之，体系结构上关键的质量是构建的容易程度。这也是在细化阶段平衡的体系结构和计划被强调的原因。 </P>
<P>本阶段的主要目标如下：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>通过优化资源和避免不必要的返工达到开发成本的最小化 
<LI>根据实际需要达到适当的质量目标 
<LI>据实际需要形成各个版本（Alpha,Beta,and other test release） 
<LI>对所有必须的功能完成分析、设计、开发和测试工作 
<LI>采用循环渐进的方式开发出一个可以提交给最终用户的完整产品 
<LI>确定软件站点用户都为产品的最终部署做好了相关准备 
<LI>达成一定程度上的并行开发机制 </LI></UL>
<P>构建阶段的产出是可以交付给最终用户的产品。它最小包括：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>特定平台上的集成产品 
<LI>用户手册 
<LI>当前版本的描述 </LI></UL>
<P><A name=N10255><SPAN class=atitle3>里程碑：初始运作能力</SPAN></A><BR></P>
<P>创建阶段结束是第三个重要的项目里程碑（初始功能里程碑）。此刻，决定是否软件、环境、用户可以运作而不会将项目暴露在高度风险下。该版本也常被称为"beta"版。 </P>
<P>构建阶段主要的审核标准包括回答以下的问题: </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>产品是否足够稳定和成熟得发布给用户? 
<LI>是否所有的风险承担人准备好向用户移交? 
<LI>实际费用与计划费用的比较是否仍可被接受? </LI></UL>
<P>如果无法通过这些里程碑,则移交不得不被延迟。 </P>
<P><A name=N10272><SPAN class=atitle3>交付阶段</SPAN></A><BR></P>
<P><A name=N1027C><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image009.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>交付阶段的目的是将软件产品交付给用户群体。</P>
<P>只要产品发布给最终用户，问题常常就会出现：要求开发新版本，纠正问题或完成被延迟的问题。 </P>
<P>当基线成熟得足够发布到最终用户时，就进入了交付阶段。其典型要求一些可用的系统子集被开发到可接收的质量级别及用户文档可供使用，从而交付给用户的所有部分均可以有正面的效果。这包括： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>对照用户期望值，验证新系统的"beta测试" 
<LI>与被替代的已有系统并轨 
<LI>功能性数据库的转换 
<LI>向市场、部署、销售团队移交产品 </LI></UL>
<P>构建阶段关注于向用户提交产品的活动。典型的，该阶段包括若干重复过程，包括 beba 版本、通用版本、bug 修补版和增强版。相当大的工作量消耗在开发面向用户的文档，培训用户。在初始产品使用时，支持用户并处理用户的反馈。开发生命周期的该点，用户反馈主要限定在产品性能调整、配置、安装和使用问题。 </P>
<P>本阶段的目标是确保软件产品可以提交给最终用户。本阶段根据实际需要可以分为几个循环。本阶段的具体目标如下： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>进行 Beta 测试以期达到最终用户的需要 
<LI>进行 Beta 测试和旧系统的并轨 
<LI>转换功能数据库 
<LI>对最终用户和产品支持人员的培训 
<LI>提交给市场和产品销售部门 
<LI>和具体部署相关的工程活动 
<LI>协调 Bug 修订/改进性能和可用性(Usability)等工作 
<LI>基于完整的 Vision 和产品验收标准对最终部署做出评估 
<LI>达到用户要求的满意度 
<LI>达成各风险承担人对产品部署基线已经完成的共识 
<LI>达成各风险承担人对产品部署符合 Vision 中标准的共识 </LI></UL>
<P>该阶段依照产品的类型,可能从非常简单到极端复杂的范围内变化。例如，现有的桌面产品的新版本可能非常简单，而替代国际机场的流量系统会非常复杂。 </P>
<P><A name=N102CB><SPAN class=atitle3>里程碑：产品发布</SPAN></A><BR></P>
<P><A name=N102D5><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image010" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>在交付阶段的终点是第四个重要的项目里程碑，产品发布里程碑。此时，决定是否目标已达到或开始另一个周期。在许多情况下，里程碑会与下一个周期的初始阶段相重叠。 </P>
<P>发布阶段的审核标准主要包括以下两个问题：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>用户是否满意？ 
<LI>实际费用与计划费用的比较是否仍可被接受？ </LI></UL>
<P><A name=N102EE><SPAN class=atitle3>迭代过程</SPAN></A><BR></P>
<P>Rational Unified Process 的每个阶段可以进一步被分解为迭代过程。迭代过程是导致可执行产品版本（内部和外部）的完整开发循环，是最终产品的一个子集，从一个迭代过程到另一个迭代过程递增式增长形成最终的系统。 </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">迭代方法的益处</B> </P>
<P>与传统的瀑布式方法相比，迭代过程具有以下的优点： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>减小了风险 
<LI>更容易对变更进行控制 
<LI>高度的重用性 
<LI>项目小组可以在开发中学习 
<LI>较佳的总体质量 </LI></UL>
<P><A name=5><SPAN class=atitle2>开发过程中的静态结构(Static Structure of the Process)</SPAN></A><BR>开发流程定义了"谁""何时""如何"做"某事"。四种主要的建模元素被用来表达 Rational Unified Process： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>角色(Workers),"谁" 
<LI>活动(Activities),"如何" 
<LI>产物(Artifacts),"某事" 
<LI>工作流（Workflows），"何时" </LI></UL>
<P><A name=N1032C><SPAN class=atitle3>活动、产物、角色</SPAN></A><BR></P>
<P><A name=N10336><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image011.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">角色、活动和工作产物</B> </P>
<P><A name=N10346><SPAN class=atitle3>角色</SPAN></A><BR></P>
<P>角色定义了个人或由若干人所组成小组的行为和责任。可以认为角色是项目组中个人戴的"帽子"。单个人可以佩戴多个不同的帽子。这是一个非常重要的区别。因为通常容易将角色认为是个人或小组本身，在 Unified Process 中，角色还定义了如何完成工作。所分派给角色的责任既包括某系列的活动，还包括成为产物的拥有者。 </P>
<P><A name=N10353><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image012.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">人与角色</B> </P>
<P><A name=N10363><SPAN class=atitle3>活动</SPAN></A><BR></P>
<P>某个角色的活动是可能要求该角色中的个体执行的工作单元。活动具有明确的目的，通常表现为一些产物，如模型、类、计划等。每个活动分派给特定的角色。活动通常占用几个小时至几天，常常牵涉一个角色，影响到一个或少量的产物。活动应可以用来作为计划和进展的组成元素；如果活动太小，它将被忽略，而如果太大，则进展不得不表现为活动的组成部分。 </P>
<P>活动的例子： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>计划一个迭代过程，对应角色：项目经理 
<LI>寻找 use cases 和 actors, 对应角色:系统分析员 
<LI>审核设计,对应角色:设计审核人员 
<LI>执行性能测试,对应角色:性能测试人员 </LI></UL>
<P><A name=N10380><SPAN class=atitle3>产物</SPAN></A><BR></P>
<P>产物是被产生的、修改，或为过程所使用的一段信息。产物是项目的实际产品、项目产生的事物，或者供向最终产品迈进时使用。产物用作角色执行某个活动的输入，同时也是该活动的输出。在面向对象的设计术语中，如活动是活动对象（角色）上的操作一样，产物是这些活动的参数。 </P>
<P>产物可以具有不同的形式： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>模型，如 Use-Case 模型或设计模型 
<LI>模型组成元素,即模型中的元素，比如类,用例（use case） 或子系统般的元素 
<LI>文档,如商业案例或软件结构文档 
<LI>源代码 
<LI>可执行文件 </LI></UL>
<P><A name=N103A0><SPAN class=atitle3>工作流</SPAN></A><BR></P>
<P>仅依靠角色、活动和产物的列举并不能组成一个过程。需要一种方法来描述能产生若干有价值的有意义结果的活动序列，显示角色之间的交互作用。 </P>
<P>工作流是产生具有可观察结果的活动序列。 </P>
<P>UML 术语中,工作流可以表达为序列图、协同图，或活动图。在本文中，使用活动图的形式来描述。 </P>
<P><A name=N103B3><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image013.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">工作流样例</B> </P>
<P>注意要表达活动之间的所有依赖关系并不是总可能或切合实际的。常常两个活动较表现的交织得更紧密，特别是在涉及到同一个角色或个人时。人不是机器，对于人而言，工作流不能按字面地翻译成程序，被精确地、机械地执行。 </P>
<P>下节中，我们将讨论开发过程中最基本的工作流，称之为核心工作流。 </P>
<P><A name=6><SPAN class=atitle2>核心工作流(Core workflows)</SPAN></A><BR>Rational Unified Process 中有9个核心工作流,代表了所有角色和活动的逻辑分组情况。 </P>
<P><A name=N103D4><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image014.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>9个核心的过程工作流 </P>
<P>核心工作流分为6个核心"工程"工作流</P>
<OL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>商业建模工作流 
<LI>需求工作流 
<LI>分析和设计工作流 
<LI>实现工作流 
<LI>测试工作流 
<LI>分发工作流 </LI></OL>
<P>和3个核心"支持"工作流</P>
<OL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>项目管理工作流 
<LI>配置和变更控制工作流 
<LI>环境工作流 </LI></OL>
<P>尽管6个核心工程工作流能使人想起传统瀑布流程中的几个阶段，但应注意迭代过程中的阶段是不同的，这些工作流在整个生命期中一次又一次被访问。9个核心工作流在项目中的实际完整的工作流中轮流被使用，在每一次迭代中以不同的重点和强度重复。 </P>
<P><A name=N1040B><SPAN class=atitle3>商业建模</SPAN></A><BR></P>
<P>决大多数商业工程化的主要问题，是软件工程人员和商业工程人员之间不能正确地交流。这导致了商业工程的产出没有作为软件开发输入而正确地被使用，反之亦然。Rational Unified Process 针对该情况为两个群体提供了相同的语言和过程，同时显示了如何在商业和软件模型中创建和保持直接的可跟踪性。 </P>
<P>在商业建模中，使用商业用例来文档化商业过程，从而确保了组织中所有支持商业过程人员达到共识。商业用例被分析以理解商业过程如何被业务支持，而这些在商业对象模型中被核实。 </P>
<P>许多项目可能不进行商业建模。 </P>
<P><A name=N1041C><SPAN class=atitle3>需求</SPAN></A><BR></P>
<P>需求工作流的目标是描述系统应做"什么"，并允许开发人员和用户就该描述达成共识。为了达到该目标，进行提取、组织、文档化需要的功能和约束；跟踪、为折衷方案及决定形成文档。 </P>
<P>蓝图被创建，需求被提取。代表用户和其他可能与开发系统交互的其它系统的 Actor 被指明。Use case 被识别,表示系统的行为。因为use case 根据 actor 的要求开发,系统与用户之间的联系更紧密。系统展示了用于再生系统的用例模型。 </P>
<P><A name=N1042C><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image015.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">样例用例模型</B> </P>
<P>每一个用例被仔细地描述。用例描述显示了系统如何与 actor 交互及系统的行为.非功能性的需求在补充说明中体现。 </P>
<P>Use case 起到贯穿整个系统的开发周期线索的作用。相同的用例模型在需求捕获阶段、分析设计阶段和测试阶段中使用。 </P>
<P><A name=N10442><SPAN class=atitle3>分析和设计</SPAN></A><BR></P>
<P>分析设计工作流的目标是显示系统"如何"在实现阶段被"实现"的。你需要一个如下系统： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>在特定的实现环境中完成用例描述中指定的任务和功能 
<LI>满足了所有的需求 
<LI>健壮的被建造（如果功能需求发生变化，易于更改） </LI></UL>
<P>分析设计结果是一个设计模型和可选的分析模型。设计模型是源代码的抽象；即设计模型充当源代码如何被组建和编制的"蓝图"。 </P>
<P>设计模型由设计类和一些描述组成。设计类被组织成具有良好接口的设计包和设计子系统，而描述则体现了类的对象如何协同工作实现用例的功能。 </P>
<P>下图是上例 use-case 模型的设计模型示例的一个部分。 </P>
<P><A name=N10464><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image016.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P><A name=N1046E><SPAN class=atitle3>设计模型的一部分</SPAN></A><BR></P>
<P>设计活动以体系结构设计为中心。结构的产物和验证是早期迭代的主要焦点。结构由若干结构视图来表达，这些视图捕获了主要的构架设计的决定。本质上，结构视图是整个设计的抽象和简化，该视图中细节被放在了一旁，使重要的特点体现得更加清晰。结构不仅仅是良好设计模型的承载媒介，而且在系统的开发中能提高任何被创建模型的质量。 </P>
<P><A name=N10479><SPAN class=atitle3>实现</SPAN></A><BR></P>
<P>实现阶段的目的： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>定义代码的组织结构--以层次化的实施子系统的形式 
<LI>实现类和对象--以构件的形式（源文件、二进制文件、可执行文件等） 
<LI>将开发出的构件作为单元进行测试 
<LI>对由单个实现者（或小组）产生的结构集成为可执行的系统 </LI></UL>
<P>系统通过完成构件而实现。Rational Unified Process 描绘了如何重用现有的组件,或实现经过良好责任定义的新构件,使系统更易于使用,提高了系统的可重用性。 </P>
<P>构件被构造成实施子系统。子系统被表现为带有附加结构或管理信息的目录形式。例如，子系统可以被创建为文件系统中的文件夹或目录，或 Rational Apex for C++ or Ada,或 Java中的包。 </P>
<P><A name=N10499><SPAN class=atitle3>测试</SPAN></A><BR></P>
<P>测试的目的是： </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>验证对象间的交互作用 
<LI>验证软件构件的正确集成 
<LI>验证所有需求被正确的实现 
<LI>识别并确保载软件发布之前缺陷被处理 </LI></UL>
<P>Rational Unified Process 提出了迭代的方法，意味着在整个项目中进行测试，从而允许尽可能早的发现缺陷，从根本上降低了修改缺陷的成本。测试类似于三维模型，分别从可靠性、功能性、应用和系统性能来进行。流程从每个维度描述了如何经历测试生命周期的几个阶段，计划、设计、实现、执行和审核。 </P>
<P>另外，描述了何时及如何引入测试自动化的策略。使用迭代的方法，测试自动化是非常重要的，它允许在每次迭代结束及为每个新产品进行回归测试。 </P>
<P><A name=N104B9><SPAN class=atitle3>发布</SPAN></A><BR></P>
<P>发布工作流的目标是成功地生成版本，将软件分发给最终用户。它包括了范围广泛的活动。</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>生成软件本身外的产品 
<LI>软件打包 
<LI>安装软件 
<LI>给用户提供帮助 </LI></UL>
<P>许多情况下，还包括如下的活动</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>计划和进行 Beta 测试版 
<LI>移植现有的软件或数据 
<LI>正式验收 </LI></UL>
<P>尽管发布工作流主要被集中在交付阶段,但早期阶段需要加入为创建阶段后期的发布做准备的许多活动。</P>
<P>Rational Unified Process 中的发布和环境工作较其它工作流包含了较少的内容。 </P>
<P><A name=N104E8><SPAN class=atitle3>项目管理</SPAN></A><BR></P>
<P>软件项目管理是一门艺术，它平衡了互相冲突的目标，管理风险，克服各种限制来成功地发布满足投资用户和使用者需要地软件。如此少的无争议的成功项目无疑是该项任务难度的证明。 </P>
<P>工作流主要集中在迭代开发过程的特殊方面。本节我们的目标是提供以下的事物来使该任务更简单。 </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>管理项目的框架 
<LI>计划、配备、执行、监控项目的实践准则 
<LI>管理风险的框架 </LI></UL>
<P>它并不是成功的灵丹妙药，但提供了管理项目能显著提高软件成功发布的方法。</P>
<P><A name=N10505><SPAN class=atitle3>配置和变更管理</SPAN></A><BR></P>
<P>本工作流中，描绘了如何在多个成员组成的项目中控制大量的产出物。控制有助于避免混乱，确保不会由以下的问题而造成产品的冲突。 </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>同步更新--当两个或两个以上的角色各自工作在同一产物上时，最后一个修改者会破坏前者的工作。 
<LI>通知不达--当被若干开发者共享的产品中的问题被解决时，修改未被通知到一些开发者 
<LI>多个版本--许多大型项目以演化的方式开发。一个版本可能供顾客使用，另一个版本用于测试，而第三个版本处于开发阶段。如果问题在其中任何一个版本中被发现，则修改需要在所有版本中繁衍，从而可能产生混乱导致昂贵的修改和重复劳动，除非变更被很好地控制和监控。 </LI></UL>
<P>工作流提供了准则管理演化系统中的多个变体，跟踪给定软件创建过程中的版本。根据用户定义地版本规则建造程序或整个版本，实施特定于现场的开发策略。 </P>
<P>工作流描述了了如何管理并行开发、分布式开发，如何自动化创建工程。这在如每天均需要频繁编译链接的重复过程中尤为重要。如果没有有力的自动化是不可能的同，时也阐述了对产品修改原因、时间、人员保持审计记录。 </P>
<P>工作流也涵盖了变更需求管理，即如何报告缺陷，在它们的是生命周期中如何管理，及如何使用缺陷来跟踪进展和发展的倾向。 </P>
<P><A name=N10525><SPAN class=atitle3>环境</SPAN></A><BR></P>
<P>环境工作流的目的是给软件开发组织提供软件开发环境--过程和工具--软件开发团队需要它们的支持。 </P>
<P>工作流集中在项目环境中配置过程的活动，同样着重支持项目的开发规范的活动。提供了逐步指导手册，介绍了如何在组织中实现过程。 </P>
<P>环境工作流还包含了提供了定制流程所必须的准则、模板、工具的开发工具箱。开发工具箱在本文后续的"定制流程的开发工具箱"中更详尽的讨论。 </P>
<P>环境工作流没有被牵涉到如选择、获取、使其运行和维护开发环境等的具体方面。 </P>
<P><A name=7><SPAN class=atitle2>Rational Unified Process －具体产品</SPAN></A><BR>Rational Unified Process 产品包括：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>能使用 web 搜索的知识基础--为全部团队成员就所有关键的开发活动提供准则、模板、工具指导。知识基础进一步划分为： 
<UL>
<LI>扩展的准则供全部成员对软件生命期所有组成部分进行参考。提供了既为高层次的思考过程，也为日常沉闷的活动进行指导的指南。该指南发布为 HTML 格式以利于独立于平台的桌面访问。 
<LI>工具指导涵盖整个生命周期工具的指引。同样，它以 HTML 格式发布.详细情况参见"工具集成"。 
<LI>Rational Rose 的例子和模板为在遵循 Rational Unified Process 时如何组织Rational Rose 的信息提供参考。 
<LI>SoDA 模板提供10个以上 SoDA 模板以协助软件文档自动化。 
<LI>Microsoft Word 模板提供了超过30个模板以帮助工作流和生命期所有部分文档化。 
<LI>Microsoft Project Plans 许多项目经理发现很难做出反映迭代开发方法的项目计划。该模板根据 Rational Unified Process 为该方法提供一个好的开端。 
<LI>Development kit 介绍了如何定制和扩展 Rational Unified Process 至采用该方法机构或项目的特定需求,同时提供了工具和模板来辅助该工作.开发工具包在本节的后续部分阐述。 </LI></UL><BR>
<LI>Addison-Wesley 出版，Philippe Kruchten 所著的 《Rational Unified Process A Introduction》。本书共 277页，对开发过程和知识基础提供了很好的介绍和概括。 </LI></UL>
<P><A name=N10565><SPAN class=atitle3>知识基础的浏览</SPAN></A><BR></P>
<P>Rational Unified Process 允许使用任何流行的浏览器如：IE、Netscape Navigator 进行浏览。使用 Rational Unified Process ，你仅需少许的鼠标点击即可获得所需的信息。该知识基础包含了许多超文本链接，各种过程元素用交互的图案来表达，很容易直观的寻找相关信息。功能强大的搜索引擎、索引、"资源管理器式外观"的树状浏览使得使用该过程很容易。浏览按钮允许如同读书一般前后翻页。 </P>
<P>信息在若干不同的视图中表现，允许你相关于角色、特定活动或工作流来查看信息。对于关键的项目角色，提供易于学习的指导过程。 </P>
<P><A name=N10575><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image017.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>交互式的图象和可导航的按钮使查找特定的信息更加方便 </P>
<P><A name=N10582><SPAN class=atitle3>定制过程的开发工具包</SPAN></A><BR></P>
<P>Rational Unified Process 足够通用及完备，如同它名字所描述的一般。然而，在某些情况下，该软件开发过程需要被修改、调整和剪裁以容纳具体的特性、约束和机构的历史情况。特别的，该过程不应该盲目的被遵循，形成许多无用的工作，产生无用产物。它应尽可能的精炼并能够快速地、可预见地产生高质量的软件。 </P>
<P>开发过程包含了开发工具包，它包括了指导如何定制过程以满足机构或项目特定需要的指南。工具包还包括了创建过程，以及搜索引擎、索引、场所地图、树型浏览器等的衍生和操作的模板。开发工具包使得能定制组织结构维持 Rational Unified Process 的感观。 </P>
<P>开发过程定制程度越高，则定制化向未来过程版本的移植越困难。开发工具包描述了减少定制化移植时工作的策略、工具和技术。 </P>
<P><A name=N10593><SPAN class=atitle3>工具集成</SPAN></A><BR></P>
<P>软件工程化过程需要工具支持系统生命期的所有活动，尤其是支持开发、维护和各种各样产物的簿记--特别是模型。迭代的开发过程对使用的工具集提出了特殊的要求，如工具的集成和模型代码之间的双向工程。同样，还需要支持跟踪需求，文档自动化以及测试自动化如促进回归测试等的工具。Rational Unified Process 可以与各种各样的工具一同使用，包括 Rational公司和其它供应商的产品。而 Rational提供许多有效支持 Rational Unified Process 良好集成的工具。 </P>
<P>下面提供了支持 Rational Unified Process 的工具清单。 </P>
<P>Rational Unified Process 对于大多数产品均提供了工具指引（Tool Mentors）。工具指引是详细介绍如何操作工具以实现开发过程的指南（即弹出什么样的窗口，对话框中的信息及如何漫游的工具）。工具指引允许将独立于工具的过程链接至日常工作的实际操作工具。 </P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>Rational Requisite ? Pro --通过使需求更易于书写，交流和修改使在整个应用开发中全体开发小组能实时更新和跟踪。 
<LI>Rational ClearQuest? -- 基于窗口的和 Web 的需求变更管理产品,时项目小组能跟踪和管理开发生命期中的所有变更活动。 
<LI>Rational Rose?98 -- 世界领先的用于商业过程建模，需求分析，构建结构设计的可视化建模工具。 
<LI>Rational SoDA? -- 为整个软件开发过程提供产品文档自动化的工具，极大减少了文档工作的时间和成本。 
<LI>Rational Purify? -- C/C++构件和应用程序开发者使用的运行错误检查工具,帮助检查内存错误。 
<LI>Rational Visual Quantify? -- C/C++、VB、Java构件和应用程序开发者使用的高级性能评测工具,帮助评估性能瓶颈。 
<LI>Rational Visual PureCoverage? -- 自动的软件测试覆盖率工具，使开发者能全面地有效地测试他们的应用程序。 
<LI>Rational TeamTest -- 创建、维护和执行自动化的功能测试，允许全面地测试代码和决定软件是否满足期望的需求和性能。 
<LI>Rational PerformanceStudio? -- 评测和预计 Client/Server 和 Web 系统性能的易于使用、准确和可升级的工具。 
<LI>Rational ClearCase? --主导市场的软件配置工具，为项目经理提供跟踪每个软件开发项目进化的能力。 </LI></UL>
<P><A name=8><SPAN class=atitle2>Rational Unified Process 的历史</SPAN></A><BR>Rational Unified Process 经过了许多年的成熟期并反映了许多人和公司的集体经验。让我们简要地看一下如下图所示它的历史： </P>
<P><A name=N105D0><B></B></A><BR><IMG alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-rupbp/image018.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/"> </P>
<P>Rational 统一过程的演进历史</P>
<P>从时间上回顾，Rational Unified Process 是 Rational Objectory Process(version 4)的直接继承者。Rational Unified Process 合并了数据工程、商业建模、项目管理和配置管理领域更多的东西，后者作为与 Prue Atria 的归并结果。它更紧密地集成至 Rational 软件工具集。Rational Unified Process 是"Rational Approach" 与Objectory process (version 3)的综合,在1995年 Rational 软件公司与 Objectory AB 合并之后。从它的 Objectory 前任,继承了过程结构和 use case 的中心概念。从它的 Rational 背景,得到了迭代开发和体系结构的系统阐述。该版本同样包括了Requisite,Inc 配置管理部分和从 SQA,?Inc 继承的详细测试过程。最后，该开发过程是第一个使用了统一建模语言(UML0.8)。 </P>
<P>Objectory process 作为 Ivar Jacobson 的 Ericsson 经验于1987在瑞典被创建。该过程称为他公司 Objectory AB 的产品。由于以 use case 概念和面向对象的方法为中心,它很快得到了软件工业的认可并被许多世界级的公司集成。Objectory process 的简单版本作为课本在1992年被出版。 </P>
<P>Rational Unified Process 是更为通用方法的一个特定的、详细的实例，该通用方法在 Ivar Jacobson,Grady Booch,和James Rumbaugh 所著的课本《The Unified Software Development Process》有介绍。 </P>
<P><A name=resources><SPAN class=atitle2>参考资料 </SPAN></A>
<UL>
<LI>Barry W. Boehm, A Spiral Model of Software Development and Enhancement, Computer, May 1988,IEEE, pp.61-72 <BR><BR>
<LI>Barry W. Boehm, Anchoring the Software Process, IEEE Software, 13, 4, July 1996, pp. 73-82. <BR><BR>
<LI>Grady Booch, Object Solutions, Addison-Wesley, 1995. <BR><BR>
<LI>Grady Booch, Ivar Jacobson, and James Rumbaugh, Unified Modeling Language 1.3, White paper,Rational Software Corp., 1998. <BR><BR>
<LI>Alan W. Brown (ed.), Component-Based Software Engineering, IEEE Computer Society, LosAlamitos, CA, 1996, pp.140. <BR><BR>
<LI>Michael T. Devlin, and Walker E. Royce, Improving Software Economics in the Aerospace and Defense Industry, Technical paper TP-46, Santa Clara, CA, Rational Software Corp., 1995 <BR><BR>
<LI>Ivar Jacobson, Magnus Christerson, Patrik Jonsson, and Gunnar ?vergaard, Object-Oriented Software Engineering-A Use Case Driven Approach, Wokingham, England, Addison-Wesley, 1992, 582p. <BR><BR>
<LI>Ivar Jacobson, M. Griss, and P. Jonsson, Software Reuse-Architecture, Process and Organization for Business Success, Harlow, England, AWL, 1997. <BR><BR>
<LI>Philippe Kruchten, The 4+1 View Model of Architecture, IEEE Software, 12 (6), November 1995, IEEE, pp.42-50. <BR><BR>
<LI>Philippe Kruchten, A Rational Development Process, CrossTalk, 9 (7), STSC, Hill AFB, UT, pp.11-16. <BR><BR>
<LI>Ivar Jacobson, Grady Booch, and Jim Rumbaugh, Unified Software Development Process, Addison-Wesley, 1999. <BR><BR>
<LI>Grady Booch, Jim Rumbaugh, and Ivar Jacobson, Unified Modeling Language-User's Guide, Addison-Wesley, 1999. <BR><BR>
<LI>Philippe Kruchten, Rational Unified Process-An Introduction, Addison-Wesley, 1999. <BR><BR>
<LI>Walker Royce, Software Project Management . A Unified Framework, Addison-Wesley, 1998. <BR></LI></UL><img src ="http://www.blogjava.net/kapok/aggbug/3792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-25 22:17 <a href="http://www.blogjava.net/kapok/archive/2005/04/25/3792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>印度项目质量管理经验 </title><link>http://www.blogjava.net/kapok/archive/2005/04/15/3318.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Fri, 15 Apr 2005 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/15/3318.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/3318.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/15/3318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/3318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/3318.html</trackback:ping><description><![CDATA[原文出处：<A href="http://www.yesky.com/20030325/1659121.shtml"><FONT size=3>http://www.yesky.com/20030325/1659121.shtml</FONT></A><BR><BR><BR><FONT size=4>　　计算机和通信技术的迅速发展，特别是Internet技术的发展与普及，为企业内部、企业与外部提供了快速、准确、可靠的信息交流渠道。信息化企业运作管理系统已成为企事业单位参与全球市场竞争的必备支持系统。正是由于这样的市场需求与技术发展现状，为我国的IT行业带来了空前发展的机遇，特别是软件行业。软件企业能否抓住这样一个难得的发展机会需要多方面的努力，其中软件质量保障在其发展过程中占有重要的位置。 众所周知，印度已成为世界上软件业增长最快的国家，目前每年软件业产值达数十亿美元，并且还在以每年30%～50%的速度增长。比较我国和印度的软件产业，就不难发现:中国拥有巨大的软件市场和世界公认的软件开发资源，在基础研究和对技术前瞻性的把握上，也有自己的优势，就整体社会经济环境而言也优于印度。此外，中国的软件开发人员费用比较低廉，仅是世界市场的1/3左右。虽然中国人并不缺乏软件开发的天赋，但是在越来越强调规模化经营的今天，先天不足的管理痼疾使我们举步维艰，难以摆脱小作坊式的软件开发模式。而印度软件业从一开始就立足于为美国软件企业服务，并遵循其软件开发的管理模式，与国际标准接轨。 </FONT>
<P><FONT size=4>　　管理上的问题不能得到彻底的解决，软件的质量保障就无从谈起。笔者最近在与印度一家通过了CMM4级评估的软件公司（以下简称A公司）进行合作的过程中，较为详细地了解了他们有关项目管理的一些详细情况，更深刻地感受到了项目管理的规范化与企业软件质量保障之间的密切关系。下面想着重从软件企业的构架，软件项目计划、项目管理、项目经理的职责等方面对印度软件的项目管理及我国软件质量保障应注意的问题进行一些经验总结，供业内人士参考。<BR>&nbsp;<BR>　　1.软件企业的组织结构 </FONT></P>
<P><FONT size=4>　　(1)A公司结构 </FONT></P>
<P><FONT size=4>　　图1是A公司的组织结构图，同国内公司差异较大的部门有QA、SSG和人力资源部门。 </FONT></P>
<P><FONT size=4></FONT>
<CENTER><FONT size=4><IMG height=262 src="http://www.yesky.com/20030325/softjt2030325_1.jpg" width=400><BR><BR>图1 </FONT></CENTER>
<P><FONT size=4></FONT></P>
<P><FONT size=4>　　* A公司中，QA(Quality Assure)部门与研发部门独立，负责监督流程的执行。QA同时负责领导与研发部门组成的联合工作组，制定公司流程。 <BR>　　* SSG(System Support Group)类似我们的IT部门，负责公司所有计算机软件和硬件资源的分配和管理。所有的办公环境和开发/实验室环境由SSG负责安装和维护，计算机资源属于SSG，由各个项目向SSG提出需求，项目结束后，设备需要交还给SSG。个人和项目组没有固定的软件和硬件资源。SSG是与研发平行的部门。 <BR>　　* 人力资源部门负责公司的人力资源管理，并维护员工的技能数据库。项目开始时，项目组向人力资源申请人力，向SSG申请计算机硬件和软件。项目结束时需要释放计算机资源给SSG，释放人力资源到人力资源池，并同时更新员工的技能数据库。研发部门的人力资源由研发总负责人和其助手分配(类似我国各公司的人力资源部)。 </FONT></P>
<P><FONT size=4>　　(2)项目组结构 </FONT></P>
<P><FONT size=4>　　1) A公司对项目组进行独立核算，项目具体负责人为PC(Project Coordinator)，负责项目计划和执行，对项目具体成员进行分工。在每个阶段的结束会议上(如概要设计结束)，PC要接受QC(Quality Coordinator)的审查。除了PC与QC的接口外，所有其他外部接口都由EM(Engineer Manager)完成，EM负责与客户打交道，向SSG、人力资源要求资源，与其他项目组协调进度。<BR>&nbsp;<BR>　　2) 汇报关系为: <BR>　　Team Member-&gt;Team Leader-&gt;PC-&gt;EM-&gt;研发总负责人。 </FONT></P>
<P><FONT size=4>　　3) 印度工程师分为7级，半年一次考评，即半年有一次升级机会。 <BR>　　1级:Software Engineer，刚毕业的本科生和研究生。 <BR>　　2级:Senior Software Engineer。 <BR>　　3级:Project Leader。 <BR>　　4级:Project Manager。 <BR>　　5级:Senior Project Manager。 <BR>　　3级可以成为PC，4级可以成为EM。刚开始平均2年升一级，越往后升职越慢。 </FONT></P>
<P><FONT size=4>　　A公司规定，一人最多可以同时兼任两个项目的PC，EM管理的项目没有限制。 </FONT></P>
<P><FONT size=4>　　A公司通常的项目组为4到5人，最多不超过10人。 </FONT></P>
<P><FONT size=4>　　以上是A公司（同时也是印度大多数规范化的软件公司）的组织结构和项目组结构。可以看出，A公司的组织结构非常清晰，各个部门分类非常细，任务明确，软件生产的每一个步骤都有专门的部门、专门的人员负责，从最基础的开发人员到负责统领全局的总经理，层层管理，沟通渠道畅通。而在我国，管理的不规范往往首先体现在公司的组织结构上，集中表现为部门的缺失和管理的交叉上。我国的软件公司，大部分规模较小，开发人员超过100人的公司很少。在印度，软件公司无论大小，都是“麻雀虽小，五脏俱全”，绝不会因为公司的规模大小而改变合理的组织结构。因此笔者认为，国内的软件企业要想有效地保障产品质量，首先就要在构架合理的组织结构上下功夫，这就如同盖高楼首先要打好地基一样，地基不打牢，结构不合理，其他方面再下功夫也是徒劳。有人说，因为国内软件企业规模小，所以造成结构设置的欠缺，但笔者认为恰恰是因为没有建立一个规范化的组织结构，才会使软件产品质量不保，进而严重影响了企业的发展扩大。 </FONT></P>
<P><FONT size=4>　　2.项目计划 </FONT></P>
<P><FONT size=4>　　凡事预则立，不预则废。这里的“预”就是指计划。对于软件企业，计划的重要性是不言而喻的。让我们先看看A公司的项目计划是如何制定的:在A公司，项目开始之前必须先估计项目的规模（以代码行数来衡量）;然后制定项目计划。通常时间为2～3周，已知的最长有5周。EM负责制定项目 EWP(Engineer Work Paper)，其中定义了项目需要的人力和计算机资源，由相关部门同意，并报研发总负责人批准后才能开始项目。 </FONT></P>
<P><FONT size=4>　　项目的正式开始时间由项目组的Kickoff Meeting算起，Closeout Meeting结束。 </FONT></P>
<P><FONT size=4>　　大概很多人都听过这样一句话：“计划赶不上变化”。这种“变化”对某些行业而言也许并不会产生太大的影响，但对于软件企业而言，却会给软件产品的质量保证带来严重的负面影响。为什么会造成这种“计划赶不上变化”的现象？究其原因，笔者认为主要是因为对计划的重视程度不够，计划过于笼统、粗糙导致可执行性太差，再加上一些人为因素的影响，必然会产生这样的后果。 </FONT></P>
<P><FONT size=4>　　如果我们的软件企业都能像A公司这样，在作计划时能考虑到每一个细节，不是仓促做出决定，而是由所有的相关部门共同对产品计划进行反复研究、制定、讨论、修改，最终形成一套系统、严密、具有很强的可执行性的计划。计划一旦形成，就严格按照计划去执行，而不受某个人、某件事的影响，那么就不仅能够减少大量资源的浪费，产品的质量也得到了保障。 </FONT></P>
<P><FONT size=4>　　因此，对计划的高度重视、周密制定、严格执行是企业有效保障产品质量的一个重要环节。 </FONT></P>
<P><FONT size=4>　　3.项目管理 </FONT></P>
<P><FONT size=4>　　当企业构架了合理的组织结构并制定了缜密的计划后，就进入了产品的开发阶段。在这个阶段中，项目管理起了重要作用，它所涉及的环节相当具体复杂，下面先介绍一下A公司在项目管理上的具体细节： </FONT></P>
<P><FONT size=4>　　(1)开发阶段和项目周期 <BR>　　开发阶段比较明显，注重各阶段应完成的功能，对本阶段应完成的工作不能留到下一阶段。<BR>&nbsp;<BR>　　(2)流程 </FONT></P>
<P><FONT size=4>　　* A公司对流程比对项目更重视。 <BR>　　* 软件开发流程非常规范和系统化，其流程的可执行性很高，并且能在实践过程中不断改进。A公司的流程已覆盖到了一个项目研发的所有方面，包括从最开始的意向到最后软件的版本发布(release)，都有相应的流程规定，基本上已形成一种工业化的软件开发。 <BR>　　* 人和流程是保证项目成功的两个最关键因素。由好的人按好的流程进行项目开发，才能最大限度地保证项目的成功。一个好的流程可以保证差的人做出来的东西不至于太差，但不能确保做出精品。通过流程可以实现一种规范化、流水线化、工业化的软件开发。 </FONT></P>
<P><FONT size=4>　　(3)计划 </FONT></P>
<P><FONT size=4>　　1) 计划详细、周到。 </FONT></P>
<P><FONT size=4>　　2) 流程中明确定义开发阶段。<BR>&nbsp;<BR>　　3) 每个阶段都列出了该阶段的各项活动，并详细描述每项活动的属性: <BR>　　* 进入条件，输入; <BR>　　* 验证方法; <BR>　　* 结束条件，输出。 </FONT></P>
<P><FONT size=4>　　4)每个阶段结束都要召开阶段结束会议。前一个阶段结束才能进入下一阶段。 </FONT></P>
<P><FONT size=4>　　5)计划中每个活动都比较具体，每个活动的时间以天（半天）为单位。计划包括了开展质量控制活动的时间。 </FONT></P>
<P><FONT size=4>　　(4)Review </FONT></P>
<P><FONT size=4>　　按印度公司流程，一般把Review和测试作为保证软件质量两个主要手段。测试的重要性就不需说明了，而Review则是一个非常简单有效并能尽早发现软件中错误的方法，可以说，任何交付物都要经Review后才能进行基线化。目前A公司有很详细全面、可执行性很高的Review流程和各种交付物的Review Checklist。 </FONT></P>
<P><FONT size=4>　　在印度软件企业，现有这么一句口号：凡事有计划，凡事必review。 </FONT></P>
<P><FONT size=4>　　(5)QA </FONT></P>
<P><FONT size=4>　　QC（质量经理）作为质量保证部门（SQA）的代表，监督和保证项目的进展遵循QMS各项流程和模板，并且收集项目中发现的一些问题和解决方法以优化流程。 </FONT></P>
<P><FONT size=4>　　(6)度量数据 </FONT></P>
<P><FONT size=4>　　CMM中比较强调用数据说话，对项目过程中基本上所有的数据都会有记录，最后把收集的数据提交质量保证部门进行分析，以改进流程。A公司的项目经理和质量经理很重视项目中的数据收集，包括各种Review数据、测试数据以及项目组员每天的活动数据等。项目经理也要维护一个项目档案，在这个项目档案中可以说包含了项目开发过程中所有的产出、开发活动、管理活动等的记录。可以这么说，有了这个项目档案，你就可以完全了解这个项目的开发过程。 </FONT></P>
<P><FONT size=4>　　(7)团队精神 </FONT></P>
<P><FONT size=4>　　印度公司都比较强调团队精神、合作精神，应该说，其流程本质上就要求员工之间的互相协调和理解。相对而言，印度员工的合作精神和协调精神都比我国员工要好得多。</FONT></P>
<P><FONT size=4>　　(8)培训 </FONT></P>
<P><FONT size=4>　　印度公司都比较强调培训，一般有专门的培训部门进行协调。在新员工进入公司后都会有公司流程和其他一些公司普遍章程的培训，以保证员工对流程的理解和执行。对于具体项目，项目经理在制定项目计划时就会在项目计划中提出所有的培训需求，包括技术上的培训和其他所需的培训。 </FONT></P>
<P><FONT size=4>　　(9)配置管理 <BR>　　在项目正式开展前，项目经理就要制定配置管理计划，并且指定配置管理员建立起配置管理库，按配置流程严格进行配置管理。在配置流程中也详细提供了对更改的控制，没有经过批准的更改请求是绝对不能进行的。 <BR>　　(10)记录 </FONT></P>
<P><FONT size=4>　　记录及时、充分、比较准确。这些记录包括:重要的邮件、会议纪要、审核记录、缺陷报告、测试报告。<BR>&nbsp;<BR>　　1)与客户和其他项目组的所有往来必须邮件记录。 </FONT></P>
<P><FONT size=4>　　2)对所有的活动都有一个跟踪落实的过程，比如对所有的Review记录和更改请求都会有一个状态标识，标识其当前状态，通过跟踪其状态来监督其落实。 </FONT></P>
<P><FONT size=4>　　3)对所有的活动，包括对文档和代码的更改都会有一个历史记录。 </FONT></P>
<P><FONT size=4>　　4)记录比较准确、比较客观。 </FONT></P>
<P><FONT size=4>　　5)许多记录都是通过定量的数值记录，强调以数据说话（CMM4级的重点就是量化管理）。 </FONT></P>
<P><FONT size=4>　　以上是A公司在项目管理中所涉及到的一些主要环节，很值得国内的软件企业在制定项目管理规划时借鉴。除此之外，我国的软件企业在产品开发管理的过程中，还易出现以下几个方面的问题: </FONT></P>
<P><FONT size=4>　　1)需求说明差─需求不清楚、不完整、太概括、或者不可测试，都会造成问题。 </FONT></P>
<P><FONT size=4>　　2)不切实际的时间表─如果在很短的时间里要求做许多事，出现错误是不可避免的。 </FONT></P>
<P><FONT size=4>　　3)测试不充分─只能根据客户意见或系统崩溃来判断系统的质量。 </FONT></P>
<P><FONT size=4>　　4)不断增加功能─在开发正在进行过程中要求增加许多新的功能。这是常见的问题。 </FONT></P>
<P><FONT size=4>　　5)交流问题─如果开发人员对客户的要求不了解，或者客户由不恰当的期望，必然会导致错误。<BR>&nbsp;<BR>　　这些问题的出现，将会对软件质量的保证产生不良影响，针对上述问题并结合A公司在项目管理方面的经验，笔者提出一些相应的解决方法，以供参考： </FONT></P>
<P><FONT size=4>　　1)可靠的需求─应当有一个经各方一致同意的、清楚的、完整的、详细的、整体的、可实现的、可测试的需求。为帮助确定需求，可使用模型 (prototypes)。 </FONT></P>
<P><FONT size=4>　　2）合理的时间表――为计划、设计、测试、改错、再测试、变更、以及编制文档留出足够的时间。不应使用突击的办法来完成项目。 </FONT></P>
<P><FONT size=4>　　3)适当测试─尽早开始测试；每次改错或变更后，都应重新测试。项目计划中要为测试和改错留出足够时间。 </FONT></P>
<P><FONT size=4>　　4)尽可能坚持最初的需求─一旦开发工作开始，要准备防止修改需求和新增功能，要说明这样做的后果。如果必须进行变更，必须在时间表上有相应的反映。如果可能，在设计阶段使用快速的模型，以便使客户了解将会得到的东西。这将会使他们对他们的需求有较高的信心，减少以后的变更。 </FONT></P>
<P><FONT size=4>　　5)沟通――在适当时机进行预排和检查;充分利用团组通信工具―电子邮件、群件(groupware)、网络故障跟踪工具、变更管理工具、以及因特网的功能。要确保文件是可用的和最新的。优选电子版文档，避免纸介质文档:进行远距离联合作业及协作;尽早使用模型，使客户的预想表达清楚。 </FONT></P>
<P><FONT size=4>　　4.PC（项目经理） </FONT></P>
<P><FONT size=4>　　项目经理是项目成败的关键人物，其对项目的成败负主要责任。因此在这里将项目经理的有关内容单独提出，以A公司为例详细说明PC在整个产品研发过程中所扮演的角色，希望能对国内软件企业的项目经理有所启示。 </FONT></P>
<P><FONT size=4>　　（1)在A公司，按流程在一个项目正式开展之前，项目经理需要完成： </FONT></P>
<P><FONT size=4>　　* 项目计划(Project Plan):在此描述整个项目所应完成的交付物、项目时间表、培训需求、资源需求、质量保证计划以及过程和交付物的定量质量目标等。 </FONT></P>
<P><FONT size=4>　　* 项目配置管理计划(Project Configuration Plan):在此指定配置管理员，描述项目配置项列表、配置管理库、版本管理计划等等。 </FONT></P>
<P><FONT size=4>　　*项目过程手册(Process Handbook):在此描述本项目所采取的裁剪后的生命周期模型和流程。 </FONT></P>
<P><FONT size=4>　　（2）在项目开发过程中，项目经理需非常了解项目进度，进行工作任务细化、具体计划和安排项目成员工作任务等工作。对突发事件项目经理需能及时合理地进行协调。 </FONT></P>
<P><FONT size=4>　　（3)总的说来，PC安排工作有这么几个特点: </FONT></P>
<P><FONT size=4>　　a.PC对软件开发具有丰富的经验，了解软件开发的普遍流程，了解各个阶段所需完成的工作，这是安排好项目组成员工作的前提，在A公司对PC的整体素质要求非常高。 </FONT></P>
<P><FONT size=4>　　b.在项目正式开展前，PC准备项目计划文档，在项目计划中包含了项目进度时间表，但此时间表比较粗，只能给出各个阶段和各个子阶段的起始结束日期。对各个阶段和各个子阶段的详细工作安排和各项工作责任人只能在项目开展工程中根据项目实际情况进行安排，一般是在每周项目组例会上进行本周详细工作安排。<BR>&nbsp;<BR>　　c.PC对工作安排往往精确到天，有时甚至精确到小时，要做到这一点，需要: </FONT></P>
<P><FONT size=4>　　* PC对本项目进展非常了解。了解渠道通常是每周组员的状态报告和直接与组员接触了解，这也需项目组成员能如实汇报工作。 </FONT></P>
<P><FONT size=4>　　* 对现阶段或本周所需完成的工作非常了解。知道现在该做什么，并且能把各项工作进行合理细致地划分，因为各个分解的工作比较细致，因此能相对精确地评估出这些工作完成所需的时间。 </FONT></P>
<P><FONT size=4>　　* PC对项目组员的能力比较了解，安排工作时能做到有的放矢。当安排的员工对工作不熟悉时，会指定相应的组员进行协助。 </FONT></P>
<P><FONT size=4>　　* PC对组员的工作安排都比较细致饱满。一般不会出现有些员工有事干，有些员工没事干的情况，当出现这种情况或员工提前完成工作时，PC就会进行相应的协调。 </FONT></P>
<P><FONT size=4>　　d.PC在项目组例会上的工作安排一般只限于本周或甚至是过后的二、三天，一般不会太长，对长时间工作的安排容易失去精确并且不易控制。相对而言，短时间的工作安排就比较精确而且容易控制，并且能不断根据完成的工作进行调整。当然，这就要求PC能根据项目计划中的项目时间表进行整体进度的把握。</FONT></P>
<P><FONT size=4>　　e.项目组例会一般一周一次（时间不能太长），但必要时（如组员工作已完成或其他事情），也可在中途召开项目会议进行工作安排，一般时间都比较短（十几分钟左右，一般不超过半小时，以免浪费时间），总之，当PC觉得需要时，就会召开项目会议。 </FONT></P>
<P><FONT size=4>　　f.当项目组出现意外事件或影响项目团结的事件时，PC能及时合理协调，解决项目组内的不和谐气氛。<BR>&nbsp;<BR>　　g.PC善于鼓励手下，发挥员工的潜能，PC往往会赞扬很好地完成了工作的组员。<BR>&nbsp;<BR>　　从上面可以看出，对PC的能力（包括技术和管理能力）要求是非常高的，我国的软件企业往往只重视PC的技术能力，但事实上，一个只精通技术的人往往不能成为一个合格的领导者， 笔者认为对PC而言，首先要求他能够比他的下属看得更远一步，顺利时不盲目乐观，遇到挫折时不茫然失措，使整个团队始终保持高昂的士气。<BR><BR>　　<STRONG>总结</STRONG></FONT></P>
<P><FONT size=4>　　以上结合印度软件项目管理的经验总结了一些我国软件质量保障应注意的问题。曾有人提出:这样一味地学习模仿，民族软件工业没有多大希望。但笔者认为，在这个问题上不妨采取“拿来主义”的办法，对于好的，事实证明是成功的经验，首先是“占有”，然后才是“挑选”和“创新”。如果能把印度的管理经验真正领会并付诸实践，相信对我们的民族软件工业一定会起到积极的推动作用。</FONT></P><img src ="http://www.blogjava.net/kapok/aggbug/3318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-15 15:50 <a href="http://www.blogjava.net/kapok/archive/2005/04/15/3318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>黑盒测试、白盒测试和灰盒测试的基本概念 </title><link>http://www.blogjava.net/kapok/archive/2005/04/05/2882.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 05 Apr 2005 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/05/2882.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2882.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/05/2882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2882.html</trackback:ping><description><![CDATA[<FONT size=2><STRONG>1. 黑盒测试</STRONG><BR>&nbsp; <B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>也称功能<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>或数据驱动<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>，它是在已知产品所应具有的功能，通过<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>来检测每个功能是否都能正常使用，在<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>时，把程序看作一个不能打开的<B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B>盆子，在完全不考虑程序内部结构和内部特性的情况下，<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>者在程序接口进行<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>，它只检查程序功能是否按照需求规格说明书的规定正常使用，程序是否能适当地接收输入数锯而产生正确的输出信息，并且保持外部信息（如数据库或文件）的完整性。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>方法主要有等价类划分、边值分析、因—果图、错误推测等，主要用于软件确认<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。“<B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。“<B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>”法是穷举输入<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>，只有把所有可能的输入都作为<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>情况使用，才能以这种方法查出程序中所有的错误。实际上<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>情况有无穷多个，人们不仅要<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>所有合法的输入，而且还要对那些不合法但是可能的输入进行<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。</FONT>
<P align=justify><FONT size=2><STRONG>2. <B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B><B style="COLOR: black; BACKGROUND-COLOR: #ffff66"></B></STRONG><B style="COLOR: black; BACKGROUND-COLOR: #ffff66"></B><BR><B style="COLOR: black; BACKGROUND-COLOR: #ffff66">　　白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>也称结构<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>或逻辑驱动<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>，它是知道产品内部工作过程，可通过<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>来检测产品内部动作是否按照规格说明书的规定正常进行，按照程序内部的结构<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>程序，检验程序中的每条通路是否都有能按预定要求正确工作，而不顾它的功能，<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>的主要方法有逻辑驱动、基路<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>等，主要用于软件验证。<BR>　　“<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>”法全面了解程序内部逻辑结构、对所有逻辑路径进行<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。“<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>”法是穷举路径<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。在使用这一方案时，<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>者必须检查程序的内部结构，从检查程序的逻辑着手，得出<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>数据。贯穿程序的独立路径数是天文数字。但即使每条路径都<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>了仍然可能有错误。第一，穷举路径<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>决不能查出程序违反了设计规范，即程序本身是个错误的程序。第二，穷举路径<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>不可能查出程序中因遗漏路径而出错。第三，穷举路径<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>可能发现不了一些与数据相关的错误。</FONT></P>
<P align=justify><FONT size=2><STRONG>3. 灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B></STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp; 灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>，确实是介于二者之间的，可以这样理解，灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>关注输出对于输入的正确性，同时也关注内部表现，但这种关注不象<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>那样详细、完整，只是通过一些表征性的现象、事件、标志来判断内部的运行状态，有时候输出是正确的，但内部其实已经错误了，这种情况非常多，如果每次都通过<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>来操作，效率会很低，因此需要采取这样的一种灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>的方法。<BR>灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>结合了<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">白</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>的要素.它考虑了用户端、特定的系统知识和操作环境。它在系统组件的协同性环境中评价应用软件的设计。<BR>&nbsp;&nbsp; 灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>由方法和工具组成，这些方法和工具取材于应用程序的内部知识<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B>与之交互的环境，能够用于<B style="COLOR: black; BACKGROUND-COLOR: #ff66ff">黑</B><B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>以增强<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>效率、错误发现和错误分析的效率。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 灰<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">盒</B><B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>涉及输入和输出，但使用关于代码和程序操作等通常在<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>人员视野之外的信息设计<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">测试</B>。</FONT></P><img src ="http://www.blogjava.net/kapok/aggbug/2882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-05 16:59 <a href="http://www.blogjava.net/kapok/archive/2005/04/05/2882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目回顾步骤（三） </title><link>http://www.blogjava.net/kapok/archive/2005/04/05/2878.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 05 Apr 2005 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/05/2878.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2878.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/05/2878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2878.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
<TBODY>
<TR>
<TD class=title vAlign=bottom align=middle height=40><B><BR><A href="http://resource.51cmm.com/ProjectManage/No161.htm">http://resource.51cmm.com/ProjectManage/No161.htm</A><BR><BR>项目回顾步骤（三）</B> <BR><BR><BR>
<HR width="80%" noShade SIZE=1>
</TD></TR>
<TR>
<TD class=hui vAlign=top height=20>
<DIV class=hui24 align=center>51CMM.COM校译 翻译：邹凤 [2004/09/20]</DIV></TD></TR>
<TR>
<TD class=matter>Retrospective Planning Worksheet<BR>Project: ____________ Planning Date: _____________<BR>项目： ____________ 计划日期： ____________<BR>
<TABLE class=hui24 cellSpacing=1 cellPadding=1 width="98%" align=center border=1>
<TBODY>
<TR>
<TD width="19%">Item</TD>
<TD width="52%">Considerations</TD>
<TD width="29%">Your Plan</TD></TR>
<TR>
<TD>Sponsor主持人</TD>
<TD>Who is the management sponsor for the retrospective?谁管理和主持回顾会？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Objectives目标</TD>
<TD>What does the sponsor want to accomplish as a result of the retrospective?主持人想通过回顾会达到什么目标？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Beneficiaries受益人</TD>
<TD>Who are the target beneficiaries of the retrospective?谁是回顾会的最终受益人？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Scope范围</TD>
<TD>Single project or multiple projects? Exactly what is being reviewed? What functional areas are included? Are specific issues of particular interest for exploration?单个项目或多个项目？回顾哪些东西？包含那些功能领域？有没有特定关注点待探讨？ </TD>
<TD>Project(s):项目：<BR>Functional Areas:功能领域：<BR>Issues:问题：</TD></TR>
<TR>
<TD>Participants参与者</TD>
<TD>Who will participate in the retrospective?谁将参与回顾会</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Deliverables交付物 </TD>
<TD>What documentation will result from the retrospective?回顾会将产生什么文档</TD>
<TD>Intermediate Documentation:中间文档Final Documentation:最终文档</TD></TR>
<TR>
<TD>Issue Generation 问题组织 </TD>
<TD>Will issue generation take place prior or during the review meeting? Using what methods?问题是在会议前还是会议中组织？使用哪些方法？ </TD>
<TD>Prior or During:会议前或会议中：<BR>Methods:方法:</TD></TR>
<TR>
<TD>Number of Meetings会议数量 </TD>
<TD>How many meetings should be planned, based on the scope of the retrospective?在回顾会的基础上应计划开几个会议？ </TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Agenda议程</TD>
<TD>List the retrospective meeting components and the time allocated to each.列出回顾会组件及各组件分配的时间</TD>
<TD>Introduction:简介：<BR>Timeline:时间表： <BR>Gather Issues:收集问题<BR>Cluster:汇总问题：<BR>Prioritize:排列优先级：Choose Key Issues:选择关键问题：Root Cause:找出问题根源：Recommend Improvements:改进意见：</TD></TR>
<TR>
<TD>Techniques技巧 </TD>
<TD>What methods will be used for the major retrospective activities?使用什么方法进行主要的回顾活动？</TD>
<TD>Cluster:汇总问题：Prioritize:排优先级：Choose Key Issues:选择关键问题：Root Cause:找出问题根源：Recommend Improvements:改进意见：</TD></TR>
<TR>
<TD>Roles角色</TD>
<TD>Who is the facilitator? Who is the scribe? What are their responsibilities?谁是推动者？谁是记录员？他们的职责是什么？</TD>
<TD>Facilitator:Responsibilities:推动者：职责：Scribe:Responsibilities:记录员：职责：</TD></TR>
<TR>
<TD>Management Role管理角色 </TD>
<TD>What is management’s role in the context of the retrospective?整个回顾会的管理角色有哪些？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Metrics度量</TD>
<TD>What project metrics will be collected for the retrospective?整个回顾会将收集哪些度量数据？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Project Artifacts项目工件</TD>
<TD>What project artifacts will be collected and examined for the retrospective?回顾会将收集并检查哪些项目工件？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Communicating Plans沟通计划 </TD>
<TD>How will the planning details be communicated to the participant, and by whom?计划的详细信息如何传递给参与者？谁负责传达？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Individual Preparation个人准备</TD>
<TD>What individual preparation is necessary prior to the retrospective meeting?在回顾会前个人该做哪些准备？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Logistics后勤准备 </TD>
<TD>What items does the facilitator need to take to the retrospective meeting (pens, markers, sticky notes, tape, transparencies, paper, laptop)? Is the room properly equipped (projectors, flipcharts, space)?推动者需要将哪些东西带到回顾会中？（笔，标志物，快贴纸，胶带，幻灯片，纸，笔记本）？房间设施是不是正常（投影仪，白板，空间是否足够）？</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Communicating Results沟通结果 </TD>
<TD>How will the meeting results be communicated? Who will receive the communication? Consider objectives, scope, deliverables.会议结果如何沟通？谁将得到沟通结果？要考虑目标，范围和交付物。</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>Follow-Up后续工作</TD>
<TD>Who will be responsible for follow-up on action plans and process improvements following the retrospective?谁将负责遵守回顾会的行动计划并按计划进行过程改进？</TD>
<TD>&nbsp;</TD></TR></TBODY></TABLE>&lt;Project&gt; Retrospective Summary Report<BR>项目回顾总结报告 
<P>&lt;date&gt;</P>
<P>Summary<BR>总结 _____________________________________________________________<BR><BR>Coordinator协调员 &lt;name&gt; _____________________________________________________________<BR><BR><BR>Sponsor主持人 &lt;name&gt; _____________________________________________________________<BR><BR><BR>Participants参与者 &lt;names and roles&gt; _____________________________________________________________<BR><BR><BR>Facilitator推动者 &lt;name&gt;<BR>_____________________________________________________________<BR><BR>Metrics度量 &lt;the total labor hours spent on planning and performing the retrospective&gt;Planning:Meeting (meeting duration multiplied by the number of participants):Documentation Production:&lt;计划和进行回顾的总工时&gt;计划会议（由参与者数量累计的会议工时）文档输出<BR>_____________________________________________________________ </P>
<P><BR>Things That Went Well<BR>做得好的方面<BR><BR>Business Issues业务问题 1. <BR>_____________________________________________________________<BR><BR>Requirements需求 1. <BR>_____________________________________________________________<BR><BR>Process过程 1. <BR>_____________________________________________________________<BR><BR>Project Management项目管理 1. <BR>_____________________________________________________________<BR><BR>Technology技术 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________ </P>
<P><BR>Things That Could Have Gone Better<BR>可以改进的方面<BR><BR>Business Issues业务 1. <BR>_____________________________________________________________<BR><BR>Requirements需求 1. <BR>_____________________________________________________________<BR><BR>Process过程 1. <BR>_____________________________________________________________<BR><BR>Project Management项目管理 1. <BR>_____________________________________________________________<BR><BR>Technology技术 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________ </P>
<P><BR>Things That Surprised Us<BR>让我们意外的事情<BR><BR>Business Issues业务 1. <BR>_____________________________________________________________<BR><BR>Requirements需求 2. <BR>_____________________________________________________________<BR><BR>Process过程 1. <BR>_____________________________________________________________<BR><BR>Project Management项目管理 1. <BR>_____________________________________________________________<BR><BR>Technology技术 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________ </P>
<P><BR>Lessons Learned<BR>经验教训<BR><BR>Business Issues业务问题 1. <BR>_____________________________________________________________<BR><BR>Requirements需求 1. <BR>_____________________________________________________________<BR><BR>Process过程 1. <BR>_____________________________________________________________<BR><BR>Project Management项目管理 1. <BR>_____________________________________________________________<BR><BR>Technology技术 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________<BR><BR>&lt;other category&gt;其他归类 1. <BR>_____________________________________________________________ </P>
<P><BR>Final Thoughts<BR>最后总结<BR><BR>Things to Keep维持原状的 1. <BR>_____________________________________________________________<BR><BR>Things to Change要改进的 1. </P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/kapok/aggbug/2878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-05 14:46 <a href="http://www.blogjava.net/kapok/archive/2005/04/05/2878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Review与CheckStyle </title><link>http://www.blogjava.net/kapok/archive/2005/04/01/2724.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Fri, 01 Apr 2005 11:01:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/04/01/2724.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2724.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/04/01/2724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2724.html</trackback:ping><description><![CDATA[Code Review与CheckStyle <BR>本文向大家介绍Code Review的主要内容，以及流行的检查Code Conventions的工具。同时，对于目前应用最为广泛的CheckStyle的应用给出详细的介绍，同时，也列举了很多使用CheckStyle的最佳实践。 <BR><BR>1. Code Review &amp; Code Conventions <BR>质量是衡量一个软件是否成功的关键要素。而对于商业软件系统，尤其是企业应用软件系统来说，除了软件运行质量、文档质量以外，代码的质量也是非常重要的。软件开发进行到编码阶段的时候，最大的风险就在于如何保证代码的易读性和一致性，从而使得软件的维护的代价不会很高。 <BR><BR>在软件开发的过程中，以下几种情形随处可见： <BR><BR>1． 软件维护时间长，而且维护人员的积极性不高： <BR><BR>做过软件维护的开发人员，尤其是在接手不是自己开发产品的源码的时候，即使有良好的文档说明，仍然会对代码中冗长、没有注释的段落“叹为观止”。理解尚且如此困难，何况要修改或者增加新的功能。因此，很多开发人员不愿意进行软件维护的工作。 <BR><BR>2． 新的开发人员融入团队的时间比较长： <BR><BR>除了没有良好的培训、文档等有效的机制以外，每个人一套的编码风格，也容易造成新成员对于已有代码的理解不够，甚至出现偏差。 <BR><BR>编码规范，作为解决以上问题的方案已经得到了很长时间的应用。而在产品或者项目实际开发的过程中，仅有Code Conventions是不能解决Code的问题的。它往往和Code Review配合，作为代码质量保证的手段。 <BR>1.1. Code Review的层次与内容 <BR>Code Review就是审查代码的质量。根据形式分为两种，一种是交叉代码审查，就是自己的代码由他人来检查，就象检查作业一样；另一种是代码会审，就是以会议的形式，大家共同审核代码的质量。 <BR><BR>Code Review 的目的有[2]： <BR><BR>² 在项目早期就能够发现代码中的BUG； <BR>² 帮助初级开发人员学习高级开发人员的经验，达到知识共享； <BR>² 避免开发人员犯一些很常见，很普通的错误； <BR>² 保证项目组人员的良好沟通； <BR>² 项目或产品的代码更容易维护； <BR><BR>一般情况下，Code Review的内容与层次如下： <BR><BR>² 编码风格与代码规范一致性：检查代码是否符合编码规范，确保所有人写的代码基本一致； <BR>² 代码满足基本的功能要求：检查代码的逻辑实现，以及单元测试的编写策略，确认实现功能性需求； <BR>² 代码满足性能等非功能性需求：非功能性需求一般不便于测试，需要借助一定的工具和Review人员的素质，针对编码中对于性能影响的瓶颈给出解决方案； <BR>² 去除冗余，提高代码可读性：适当使用 Refactorying技术，去除代码中的Bad Smell；如果有需要，可以Refactorying to Pattern。 <BR>1.2. Code Conventions的尴尬境地 <BR>从Code Review的层次分析中我们可以看到，Code Conventions是其基础。而实际的情况是，在软件开发中，两者都沦为“宣传口号”，而非切实执行的实践。 <BR><BR>造成这种情形的原因有二： <BR><BR>1. Code Conventions是开发过程的“道德”而非“法律”：很多时候，由于没有有效的工具或者辅助手段的支持，是否遵守编码规范是依靠开发人员的“道德素养”－自觉遵守，而非实际考核的指标； <BR><BR>2. Code Review的基石不牢：在第一种原因的影响下，Code Review执行的过程中，如果花费了大量的时间在代码规范的检查上，那么对于更为重要的程序执行逻辑、性能、易读性等的评审投入的精力就有限的；而这种情况反过来也使得对于编码规范的检查，通常都是走过场。最后，还是每个人一套规范，只要最终交付的产品完成指定的功能就可以啦。 <BR>2. CheckStyle <BR>面对以上描述的Code Conventions的尴尬境地，陆续有开发人员提出了自己的解决方案。目前，对于JAVA的代码规范的检查，已经有很多成熟的工具，例如CheckStyle、PMD以及Jalopy等[3]。其中，CheckStyle的应用非常广泛，众多开源项目都使用它作为检查代码规范的工具，尤其是 Jakarta 的很多项目，例如Maven、 Torque等。 <BR>2.1. CheckStyle是什么？ <BR>CheckStyle是SourceForge下的一个项目，提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程，从而使得开发人员从这项重要，但是枯燥的任务中解脱出来[1]。 <BR>2.2. CheckStyle检验的主要内容 <BR>CheckStyle默认提供一下主要检查内容： <BR><BR>² Javadoc注释 <BR>² 命名约定 <BR>² 标题 <BR>² Import语句 <BR>² 体积大小 <BR>² 空白 <BR>² 修饰符 <BR>² 块 <BR>² 代码问题 <BR>² 类设计 <BR>² 混合检查（包活一些有用的比如非必须的System.out和printstackTrace） <BR><BR>从上面可以看出，CheckStyle提供了大部分功能都是对于代码规范的检查，而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是，对于团队开发，尤其是强调代码规范的公司来说，它的功能已经足够强大。 <BR>2.3. CheckStyle的主要运行方式 <BR>目前，CheckStyle的版本是3.0，与以前的版本不同，它的配置文件是基于XML而非Properties文件。 <BR><BR>它的3.0版本提供了两种运行的方式： <BR><BR>² 命令行工具 <BR>² ANT任务 <BR><BR>同时，CheckStyle目前有很多针对流行IDE的插件，例如Eclipse、IntelliJ IDEA、JBuilder等。但是，大部分都是基于2.4的版本，新版本的特性不支持，同时配置也较为复杂。 <BR><BR>因为一般情况下，如果与开发过程与环境集成起来，编码规范的检查会更加有效，因此，作为ANT任务的运行方式使用的更加普遍。 <BR><BR>在ANT的build.xml文件中添加CheckStyle任务的步骤如下： <BR><BR>1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录； <BR>2. 建立配置文件； <BR>3. 声明CheckStyle任务： <BR>&lt;taskdef resource="checkstyletask.properties" <BR>classpath="${lib}/checkstyle-all-3.1.jar"/&gt; <BR>4. 建立CheckStyle任务： <BR>&lt;target name="checkstyle"&gt; <BR>&lt;checkstyle config="${config}/sun_checks.xml"&gt; <BR>&lt;fileset dir="${src}" includes=" **/*.java" /&gt; <BR>&lt;/checkstyle&gt; <BR>&lt;/target&gt; <BR><BR>2.4. 定制CheckStyle <BR>CheckStyle的执行基于XML配置文件，它的主要组成部分是： <BR><BR>² Module：整个配置文件就是一棵Module树。根节点是Checker Module。 <BR>² Properties：它来决定一个Module如何进行检查。每个Module都有一个默认值，如果不满足开发需求，可以设定其它的值。 <BR><BR>下面是一个示例： <BR><BR>&lt;module name="MethodLength"&gt; <BR>&lt;property name="max" value="60"/&gt; <BR>&lt;/module&gt; <BR><BR>它表示，如果方法或者构造函数的长度超过60行，CheckStyle就会报错。而默认值是150行。 <BR><BR>以下是一段CheckStyle对于Maven项目源文件的检查报告： <BR><BR>Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91 <BR>Unable to get class information for JellyException. 91 <BR>Line has trailing spaces. 93 <BR>Line has trailing spaces. 104 <BR>Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113 <BR>Parameter context should be final. 113 <BR>Line has trailing spaces. 130 <BR>Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131 <BR>Line has trailing spaces. 134 <BR>Line has trailing spaces. 135 <BR>Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137 <BR>Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156 <BR>Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168 <BR>Parameter supportAntVariables should be final. 168 <BR>'supportAntVariables' hides a field. 168 <BR>Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183 <BR>Parameter text should be final. 183 <BR><BR>一般情况下，与IDE集成在一起使用的时候，点击出错的条目，可以跳转到相应的代码。 <BR>3. CheckStyle的最佳实践 <BR>3.1. Sun’s Code Conventions的修改 <BR>在CheckStyle的最新发布版本中，有一个对于Sun的Java编码规范的配置文件信息。但是，其中有很多条目并不一定符合项目开发的需要。就算是对于很多优秀的开源项目，按照这个规范来进行检查，也会出现成千上万的错误。 <BR><BR>下面提出的一些修改意见，是从实际项目执行过程中总结出来的，可以作为大家的参考。我们以CheckStyle3.0配置文件的顺序来介绍： <BR><BR>1. 去除对于每个包都有一个package.html文件的限制； <BR>&lt;!--&lt;module name="PackageHtml"/&gt;--&gt; <BR>2. 修改对于JavaDoc Comments的限定：对于很多使用Code Generator的项目来说，需要将手写代码与生成代码、单元测试代码的检查分开进行； <BR>3. 修改对于体积大小的限制：目前，很多显示器都是17寸，而且打印方面的限制也比以前有所改善，同时，由于代码中Factory等模式的运用，以及有意义的方法名称等约定，默认每行代码的长度（80）是远远不能满足要求；对于方法长度等等，也应该根据项目情况自行决定： <BR>&lt;module name="FileLength"/&gt; <BR>&lt;module name="LineLength"&gt; <BR>&lt;property name="max" value="120"/&gt; <BR>&lt;/module&gt; <BR>&lt;module name="MethodLength"&gt; <BR>&lt;property name="max" value="300"/&gt; <BR>&lt;/module&gt; <BR>&lt;module name="ParameterNumber"/&gt; <BR>4. 修改对于Throws的的限制：允许Throws Unchecked Exception以及Throws Subclass Of Another Declared Exception。 <BR>&lt;module name="RedundantThrows"&gt; <BR>&lt;property name="allowUnchecked" value="true"/&gt; <BR>&lt;property name="allowSubclasses" value="true"/&gt; <BR>&lt;/module&gt; <BR>5. 修改成员变量的可视性：一般情况下，应该允许Protected Members以及Package Visible Members。 <BR>&lt;module name="VisibilityModifier"&gt; <BR>&lt;property name="protectedAllowed" value="true"/&gt; <BR>&lt;property name="packageAllowed" value="true"/&gt; <BR>&lt;/module&gt; <BR><BR>3.2. CheckStyle应用的最佳实践 <BR>采用CheckStyle以后，编码规范的检查就变得及其简单，可以作为一项切实可行的实践加以执行。 <BR><BR>一般情况下，在项目小组中引入CheckStyle可以按照下面的步骤进行： <BR><BR>1． 强调Code Review与Code Conventions的重要作用； <BR>2． 介绍CheckStyle； <BR>3． 初步应用CheckStyle：参照CheckStyle附带的配置文件，酌情加以剪裁，在项目的Ant配置文件中，添加CheckStyle任务，可以单独执行； <BR>4． 修改、定型CheckStyle的配置文件：按照基本配置文件执行一段时间（2～3周），听取开发人员的反馈意见，修改配置信息； <BR>5． 作为开发过程的日常实践，强制执行CheckStyle：稳定CheckStyle的配置信息，同时将CheckStyle任务作为Build的依赖任务或者配置源码控制系统（目前，CheckStyle可以与<SPAN style="COLOR: #ffa34f"><B>CVS</B></SPAN>有效集成），使得代码在加入系统之前必须通过检查。 <BR><BR>同时需要指出的是，CheckStyle的有效执行需要依赖两个条件： <BR><BR>² Ant的广泛应用：CheckStyle基于Ant执行的方式比较容易，而且可以在项目内容形成一致的执行环境。同时，也比较容易与其它任务，例如Build等发生关联。 <BR><BR>² IDE Format Code的强大功能：由于CheckStyle本身并没有提供很强大的Code Format等功能，因此，需要借助IDE的帮助，从而使得在发生错误的时候，可以很容易的进行修复。目前，主流的Java IDE都提供了这方面的功能，IDEA在这方面尤其突出。它提供的统一、可定义的Code Format Template（项目小组内部可以使用统一模板）以及方便的快捷键功能(Ctrl+Alt+T：Format Code, Ctrl+Alt+O：Optimize Import等)。 <BR><BR>4. 结论 <BR>利用CheckStyle可以方便的对于编码的Code Conventions进行检查，同时，也有效地减少了Code Review的工作，使得Reviw人员的精力更多的集中到逻辑和性能检查。 <BR><BR>参考文献： <BR><BR>[1] CheckStyle Project Website <BR>[2] Code Review 理论与实战 CSDN <BR>[3] 轻松有效检查Java代码的三个工具 ZDNet China<img src ="http://www.blogjava.net/kapok/aggbug/2724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-04-01 19:01 <a href="http://www.blogjava.net/kapok/archive/2005/04/01/2724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CVS使用经验谈 </title><link>http://www.blogjava.net/kapok/archive/2005/03/31/2642.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Thu, 31 Mar 2005 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/31/2642.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2642.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/31/2642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2642.html</trackback:ping><description><![CDATA[<DIV class=hui24 align=center>来自：UML工程组织 作者：龚天乙 [2004/11/22]</DIV><BR><A href="http://case.51cmm.com/CM/No095.htm">http://case.51cmm.com/CM/No095.htm</A><BR>CVS 是 Concurrent Version System（并行版本系统）的缩写，用于版本管理。在多人团队开发中的作用更加明显。CVS 的基本工作思路是这样的：在一台服务器上建立一个仓库，仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序。这样，就好象只有一个人在修改文件一样。避免了冲突。每个用户在使用仓库之前，首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行，然后用 cvs 命令进行提交，由 cvs 仓库管理员统一 修改。这样就可以做到跟踪文件变化，冲突控制等等。 <BR>　　由于CVS是建立在在原先 Unix 体系里很成熟的 SCCS 和 RCS 的基础上，所以CVS多是Linux（UNIX）系统中所使用，本文中服务器端设置也是以Linux为例。 <BR>　　一、CVS服务器的安装 <BR>　　首先确认系统中是否安装CVS服务： <BR>　　[root@localhost /]# rpm -qa|grep cvs <BR>cvs-1.11.2-cvshome.7x.1 <BR>　　如果命令输出类似于上面的输出则说明系统已经安装有cvs，否则就需要从安装光盘中安装cvs的rpm包，或者到http://www.cvshome.org下载。 <BR>　　1、建立 CVSROOT <BR>　　目录，因为这里涉及到用户对CVSROOT里的文件读写的权限问题，所以比较简单的方法是建立一个组，然后再建立一个属于该组的帐户，而且以后有读写权限的用户都要属于该组。假设我们建一个组叫cvs，用户名是cvsroot。建组和用户的命令如下 <BR>#groupadd cvs <BR>#adduser cvsroot <BR>　　生成的用户宿主目录在/home/cvsroot（根据自己的系统调整） <BR>　　2、用cvsroot 用户登陆，修改 /home/cvsroot （CVSROOT）的权限，赋与同组人有读写的权限：　 <BR>　　$chmod 771 . （或者770应该也可以） <BR>　　注意：这一部分工作是按照文档说明做的，是否一定需要这样没有试验，我会在做试验后在以后版本的教程说得仔细一点。如果您有这方面的经验请提供给我，谢谢。 <BR>　　3、建立CVS仓库，（仍然是 cvsroot 用户），用下面命令： <BR>　　$cvs -d /home/cvsroot init <BR>　　4、以root身份登陆，修改 /etc/inetd.conf（使用 xinetd 的系统没有此文件）和 /etc/services <BR>　　如果用的是 inetd 的系统，在 /etc/inetd.conf 里加入： <BR>　　 <BR>　　cvsserver　 stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver <BR>　　说明：上面的行是单独一整行，/usr/bin/cvs 应该是你的cvs版本的命令路径，请根据自己的系统调整．/home/cvsroot是你建立的CVSROOT的路径，也请根据上面建立目录的部分的内容做调整。 <BR>　　如果是使用 xinetd 的系统，需要在 /etc/xinetd.d/ 目录下创建文件 cvspserver（此名字可以自己定义），内容如下： <BR>　　# default: on <BR>　　# description: The cvs server sessions; <BR>　　service cvsserver <BR>　　{ <BR>　　socket_type = stream <BR>　　wait = no <BR>　　user = root <BR>　　server = /usr/bin/cvs <BR>　　server_args = -f --allow-root=/cvsroot pserver <BR>　　log_on_failure += USERID <BR>　　only_from = 192.168.0.0/24 <BR>　　} <BR>　　其中only_from是用来限制访问的，可以根据实际情况不要或者修改。修改该文件权限： <BR>　　# chmod 644 cvspserver <BR>　　在/etc/services里加入： <BR>　　cvsserver 2401/tcp <BR>　　说明：cvsserver 是任意的名称，但是不能和已有的服务重名，也要和上面修改 /etc/inetd.conf 那行的第一项一致。 <BR>　　5、添加可以使用 CVS 服务的用户到 cvs 组： <BR>　　以 root 身份修改 /etc/group，把需要使用 CVS 的用户名加到 cvs 组里，比如我想让用户 laser 和gumpwu 能够使用 CVS 服务，那么修改以后的 /etc/group 应该有下面这样一行： <BR>　　cvs:x:105:laser,gumpwu <BR>　　在你的系统上GID可能不是105，没有关系。主要是要把laser和gumpwu用逗号分隔开写在最后一个冒号后面。当然，象RedHat等分发版有类似linuxconf这样的工具的话，用工具做这件事会更简单些。 <BR>　　6、重起inetd使修改生效： <BR>　　#killall -HUP inetd <BR>　　如果使用的是 xinetd 的系统： <BR>　　# /etc/rc.d/init.d/xined restart <BR>然后察看cvs服务器是否已经运行： <BR>[root@localhost /]# netstat -lnp|grep 2401 <BR>　　tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 1041/xinetd <BR>则说明cvs服务器已经运行。 <BR><BR>　　二、管理CVS服务器 <BR>　　服务器可以用了，现在大家最关心的就是如何管理服务器，比如，我想让一些人有读和/或写 CVS 仓库的权限，但是不想给它系统权限怎么办呢？ <BR>　　不难，在 cvs 管理员用户（在我这里是 cvsroot 用户）的家目录里有一个 CVSROOT 目录，这个目录里有三个配置文件，passwd, readers, writers，我们可以通过设置这三个文件来配置 CVS 服务器，下面分别介绍这几个文件的作用： <BR>　　passwd：cvs 用户的用户列表文件，它的格式很象 shadow 文件： <BR>　　{cvs 用户名}:[加密的口令]:[等效系统用户名] <BR>　　如果你希望一个用户只是 cvs 用户，而不是系统用户，那么你就要设置这个文件，刚刚安装完之后这个文件可能不存在，你需要以 cvs 管理员用户手工创建，当然要按照上面格式，第二个字段是该用户的加密口令，就是用 crypt (3)加密的，你可以自己写一个程序来做加密，也可以用我介绍的偷懒的方法：先创建一个系统用户，名字和 cvs 用户一样，口令就是准备给它的 cvs 用户口令，创建完之后从 /etc/shadow 把该用户第二个字段拷贝过来，然后再把这个用户删除。这个方法对付数量少的用户比较方便，人一多就不合适了，而且还有冲突条件(race condition)的安全隐患，还要 root 权限，实在不怎么样。不过权益之计而已。写一个小程序并不难，可以到 linuxforum 的编程版搜索一下，有个朋友已经写了一个贴在上面了。 <BR>第三个字段就是等效系统用户名，实际上就是赋与一个 cvs 用户一个等效的系统用户的权限，看下面的例子你就明白它的功能了。 <BR>readers：有 cvs 读权限的用户列表文件。就是一个一维列表。在这个文件中的用户对 cvs只有读权限。 <BR>writers：有 cvs 写权限的用户的列表文件。和 readers 一样，是一个一维列表。在这个文件中的用户对 cvs 有写权限。 <BR>上面三个文件在缺省安装的时候可能都不存在，需要我们自己创建，好吧，现在还是让我们用一个例子来教学吧。假设我们有下面几个用户需要使用 cvs： <BR>laser, gumpwu, henry, betty, anonymous。 <BR>其中 laser 和 gumpwu 是系统用户，而 henry, betty, anonymous 我们都不想给系统用户权限，并且 betty 和 anonymous 都是只读用户，而且 anonymous 更是连口令都没有。那么好，我们先做一些准备工作，先创建一个 cvspub 用户，这个用户的责任是代表所有非系统用户的 cvs 用户读写 cvs 仓库。 <BR>#adduser <BR>... <BR>然后编辑 /etc/group，令 cvspub 用户在 cvs 组里，同时把其它有系统用户权限的用户加到 cvs 组里。（见上文） <BR>然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件，加入下面几行： <BR>laser:$xxefajfka;faffa33:cvspub <BR>gumpwu:$ajfaal;323r0ofeeanv:cvspub <BR>henry:$fajkdpaieje:cvspub <BR>betty:fjkal;ffjieinfn/:cvspub <BR>anonymous::cvspub <BR>注意：上面的第二个字段（分隔符为 :）是密文口令，你要用程序或者用我的土办法生成。 <BR>编辑 readers 文件，加入下面几行： <BR>anonymous <BR>betty <BR>编辑 writers 文件，加入下面几行： <BR>laser <BR>gumpwu <BR>henry <BR>注意：writers中的用户不能在readers中，要不然不能上传更新文件。 <BR><BR>对于使用CVS的用户要修改它的环境变量，例如laser用户的环境变量，打开/home/laser（laser的宿主目录）下的.bash_profile文件，加入 <BR>CVSROOT=/home/cvsroot <BR>export CVSROOT <BR>用laser登陆就可以建立CVS项目，如果要root使用，可以修改/etc/profile文件。 <BR><BR>现在我们各项都设置好了，那么怎么用呢，我在这里写一个最简单的（估计也是最常用的）命令介绍： <BR>首先，建立一个新的CVS项目，一般我们都已经有一些项目文件了，这样我们可以用下面步骤生成一个新的CVS项目： <BR>进入到你的已有项目的目录，比如叫 cvstest： <BR>$cd cvstest <BR>运行命令： <BR>$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start <BR>说明：import 是cvs的命令之一，表示向cvs仓库输入项目文件。 -m参数后面的字串是描述文本，随便写些有意义的东西，如果不加 -m 参 <BR>数，那么cvs会自动运行一个编辑器（一般是vi，但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器。）让你输入信息，cvstest 是项目名称（实际上是仓库名，在CVS服务器上会存储在以这个名字命名的仓库里。） <BR>v_0_0_1是这个分支的总标记。没啥用（或曰不常用。） <BR>start 是每次 import 标识文件的输入层次的标记，没啥用。 <BR>这样我们就建立了一个CVS仓库了。 <BR>建立CVS仓库的文件夹应该是“干净”的文件夹，即只包括源码文件和描述的文件加，而不应该包括编译过的文件代码等！ <BR>三、使用CVS <BR>winCVS是一个很好的CVS客户端软件，在http://cnpack.cosoft.org.cn/down/wincvsdailyguide.pdf可以下载到这个软件的使用手册。这里不在赘述了。 <BR>四、用CVS管理项目 <BR>本人正在一加公司从事该公司ERP项目的开发，在没有使用CVS的时候，多次出现了由于不同的开发人员修改同一程序，而导致程序错误，解决版本控制问题迫在眉睫。 <BR>由于这个项目采用Linux平台下JAVA开发，使用的开发工具Jbulider是支持CVS进行项目管理的，作为主程序员，我决定采用CVS进行版本控制，首先参照上文在Linux服务器上建立了CVS服务，然后我把我本地的工程文件传至服务器。 <BR>例如：我的工程文件在F:\ERP下，我把ERP下的erp.jpx文件、defaultroot文件夹和src文件夹上传至服务器/usr/local/erp下，然后登陆Linux服务器，登陆的用户是CVS的用户，其环境变量要正确（我的用户名为admin） <BR>#cd /usr/local/erp <BR>#cvs import -m "this is a ERP project" erp v_0_0_1 start <BR>这样名为erp的CVS仓库就建立了。 <BR>之后开发小组的成员可以用winCVS把该项目下载到本地： <BR>打开winCVS <BR>点击工具栏Create -&gt; Create a new repository... 弹出窗口 <BR>在Grenral中 <BR>Enter the CVSROOT填写admin@192.168.1.9:/home/cvsroot 其中admin是cvs的用户，在本例中admin也是linux的系统用户，192.168.1.9是服务器的地址，/home/cvsroot是CVS的主目录，参考上文。 <BR>Authentication中选择"passwd file on the cvs server" <BR>Use version中选择cvs 1.10 (Standard) <BR>其它项默认即可。 <BR>确认后，点工具栏Admin --&gt; Login... 会提示输入密码，输入密码后，看看winCvs的状态栏。如果提示 <BR>*****CVS exited normally with code 0***** <BR>表示登录正常。 <BR>点击工具栏Create --&gt; Checkout module...弹出对话框，其中的Checkout settings项中 <BR>Enter the module name and path on the server 填写erp，即我们建立的名为erp的CVS仓库 <BR>Local folder to checkout to 选择要下载到本地的目录，我选了F:\myerp <BR>其它项目可以默认，确定后就可以下载到本地了，在F:\myerp\下会有一个erp文件夹，其文件结构和F:\erp下的文件结构是一样的。 <BR>用Jbulider打开F:\myerp\erp\下的erp.jpx文件，这个工程文件就可以使用了。 <BR>在Jbuilder的工具栏Team --&gt; Select Project VCS 弹出对话框，选择CVS <BR>对于你要进行修改的文件，在Project View中点中该文件，然后点右键，探出快捷菜单，选择CVS --&gt; CVS Edit "xxxx.java（文件名）" <BR>第一次使用可能会提示CVS服务器的密码。 <BR>在修改之前还要选择CVS --&gt; Update "xxxx.java（文件名）" <BR>修改之后选择CVS --&gt; Commit "xxxx.java（文件名）" <BR>这样，修改的文件就保存到CVS服务器了，Update的目的是下载、比较文件。每次在修改之前都Update，保持最新版本。 <BR>CVS在项目管理使用中确实起到了良好的效果，仔细研究CVS的命令，可以更好的发挥CVS在版本控制上的能力。<img src ="http://www.blogjava.net/kapok/aggbug/2642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-31 10:11 <a href="http://www.blogjava.net/kapok/archive/2005/03/31/2642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClearCase指南-基础篇（连载二） </title><link>http://www.blogjava.net/kapok/archive/2005/03/29/2587.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 29 Mar 2005 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/29/2587.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2587.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/29/2587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2587.html</trackback:ping><description><![CDATA[<STRONG><A href="http://case.51cmm.com/CM/No098.htm">http://case.51cmm.com/CM/No098.htm</A><BR>
<DIV class=hui24 align=center>51CMM.COM原创 作者：翟朋伟 [2005/03/21]</DIV><BR>第4章 ClearCase基础<BR></STRONG>&nbsp;&nbsp;鉴于大家多少已经使用过一段时间ClearCase或是其他的版本控制工具（如Visual Source Safe、CVS等），关于软件配置管理SCM的基础概念如Working Space（工作空间，Source Safe叫Working Folder、CC叫View – 视图）、Add to Source Control、Check Out、Check In、Get Latest Version（Source Safe）/Update View（ClearCase）、…等，此处只作简单介绍或即Pass，不作深入讲解。<BR>&nbsp;<STRONG>&nbsp;4.1 ClearCase模式</STRONG><BR>&nbsp;&nbsp;ClearCase一共有2种模式：Base模式、UCM模式。不必深究、不必理解、不必区分此2种模式。<BR>&nbsp;&nbsp;我们使用的是UCM模式。<BR>&nbsp;&nbsp;<STRONG>4.2 受控元素</STRONG><BR>&nbsp;&nbsp;ClearCase管理2种对象：目录，进入CC后称Directory Version；文件，进入CC后称File Element。2者在CC中统称为Element（元素）。<BR>&nbsp;&nbsp;注意：对于个人的私有文件、目录，CC Explore中标示为“Private”类型，CC对私有文件/目录不做任何包装、限制及特殊处理。在ClearCase Explore（CC客户端工具）中也可以对之作常规操作如重命名、删除、移动等，如同Windows Explore中一样、没有任何例外！<BR>&nbsp;&nbsp;<STRONG>4.3 静态视图</STRONG><BR>&nbsp;&nbsp;Static View：静态视图，就如Source Safe，本地有一套CC服务器上文件/目录的副本，可离线工作。静态视图下，他人为看到你的Check In成果，必须在自己的客户端执行一下Update View命令。 <BR>&nbsp;&nbsp;创建视图时（参后续有关章节），记着让视图名字前缀上你的大名，以便于管理！<BR>&nbsp;&nbsp;<STRONG>4.4 动态视图</STRONG><BR>&nbsp;&nbsp;Dynamic View：动态视图，相对Source Safe等版本控制工具，动态视图概念为CC所独有。动态视图下，本机通过网络驱动器来直接访问CC服务器上的文件/目录，本机没有CC服务器上文件/目录的副本，一旦脱离CC服务器环境即无法工作，即不能离线。一旦你Check In，他人如果工作在动态视图下，可立即看到你的最新成果，他人无需执行Update View命令、Refresh（F5）一下即可。同理，如果你使用的是动态视图，无须Update View、Refresh一下你即可看到他人的最新提交成果。<BR>&nbsp;&nbsp;注意：对于动态视图，CC会在客户端创建一虚拟驱动器（M、X、Y、…），Windows Explore下访问该虚拟驱动器，将会看到该视图的完整目录、文件结构，与CC Explore（后续章节介绍）中看到的一样。甚至，……<BR><IMG height=190 src="http://case.51cmm.com/CM/Images/No098-1.gif" width=510><BR>&nbsp;&nbsp;创建视图时（参后续有关章节），记着让视图名字前缀上你的大名，以便于管理！<BR>&nbsp;&nbsp;<STRONG>4.5 活动：Activity</STRONG><BR>&nbsp;&nbsp;ClearCase中有一个重要的概念：Activity ----活动。<BR>&nbsp;&nbsp;签出（Check Out）一个文件或目录、把一个文件或是目录Add to Source Control（加入版本控制库）前，必须首先建立一个活动（可以使用一个固有的活动，也可以New一个新的活动），用于记录你的后续操作之用（未来，通过活动可以反查你对哪些文件/目录作过哪些修改）。在该活动基础上所做的一切修改称之为该活动的“变更集”。 <BR>&nbsp;&nbsp;1、 活动命名规范：<BR>&nbsp;&nbsp;a、 “人名”用Windows域帐号；“日期”为YYMMDD格式。<BR>&nbsp;&nbsp;b、 代码类：人名__模块_活动简述_日期，如：zpw_Workflow_条件转移接口定义_040205<BR>&nbsp;&nbsp;c、 PubRef共享引用、资源文件提交：PubRef_人名__模块_日期_......，如：PubRef_Lyguo_Workflow_040324_WfEngine表李玉国提交工作流的Engine组件。<BR>&nbsp;&nbsp;d、 文档类：Doc_人名__模块_日期_......，如：Doc_fjz_Service_050124_设计文档<BR>&nbsp;&nbsp;e、 …… <BR>&nbsp;&nbsp;2、 定义活动时，不仅应该命名规范、有意义，还应当给予适当注释。<BR>&nbsp;&nbsp;<STRONG>第5章 CC客户端：ClearCase Explore</STRONG><BR>&nbsp;&nbsp;本章包括如下内容：创建视图、配置项入库、签出、签入、更新视图、活动创建。<BR>&nbsp;&nbsp;通过本章学习，普通客户端将可以借助ClearCase实现常规的配置管理工作。当然，借助CC与VS、Rose的集成功能可能更方便些，但严格来说，CC与VS、Rose的邦定集成不属配置管理范畴！ <BR>&nbsp;&nbsp;常规人员和CC打交道的工具只有一个：ClearCase Explore ---- CC的客户端GUI工具。<BR>如下为CC客户端、ClearCase Explore主界面：<BR><IMG height=337 src="http://case.51cmm.com/CM/Images/No098-2.gif" width=582><BR><IMG height=334 src="http://case.51cmm.com/CM/Images/No098-3.gif" width=553><BR>&nbsp;&nbsp;通过CC Explore，不仅可以实现配置管理的常规操作（创建视图、配置项入库、签出、签入、更新视图、…），还可以直接进行普通文件/目录的常规操作：创建、删除、移动、重命名等。<BR>&nbsp;&nbsp;<STRONG>5.1 创建视图</STRONG><BR>&nbsp;&nbsp;客户端必须首先建立视图才能展开日常配置管理工作。 <BR>&nbsp;&nbsp;客户端通过ClearCase Explore.Toolbox\Base ClearCase\Create View实用工具，把服务器端一个配置好的ClearCase Project所包含的有关文件、目录元素下载到本地，建立起自己的视图。<BR>&nbsp;&nbsp;<STRONG>5.1.1 步骤零：创建个人View Storage</STRONG><BR>&nbsp;&nbsp;CC中，每个View都必须关联一个View Storage，服务器需要通过View Storage与客户端通信。<BR>&nbsp;&nbsp;View Storage很简单，就是一个普通的Windows共享目录。每个人都需要在自己的机器上创建自己的View Storage共享目录（共享权限应仅对自己开放），创建视图时，输入该共享路径即可！<BR>&nbsp;&nbsp;方便起见，所有人的ViewStorage的共享目录名字统一为：“ViewStorage”：<BR><IMG height=334 src="http://case.51cmm.com/CM/Images/No098-4.gif" width=553><BR>&nbsp;&nbsp;<STRONG>5.1.2 步骤一：启动Create View</STRONG><BR>&nbsp;&nbsp;启动Create View实用工具（ClearCase Explore、“Toolbax”Tab页、“Base ClearCase” Panel、“Create View”Button）： <BR><IMG height=538 src="http://case.51cmm.com/CM/Images/No098-5.gif" width=179><BR><IMG height=360 src="http://case.51cmm.com/CM/Images/No098-6.gif" width=504><BR>&nbsp;&nbsp;<STRONG>5.1.3 步骤二：选择Project</STRONG><BR>&nbsp;&nbsp;选中目标Project（本步骤及后续步骤截图为讲解用，实际工作中，需要加入或基于合适的CC Project如：平台技术：U9.UBF.***、应用设计：U9.Design.***、应用开发：U9.App.***）<BR>，下一步继续：<BR><IMG height=361 src="http://case.51cmm.com/CM/Images/No098-7.gif" width=503><BR>（未完待续） <img src ="http://www.blogjava.net/kapok/aggbug/2587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-29 20:25 <a href="http://www.blogjava.net/kapok/archive/2005/03/29/2587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClearCase指南-基础篇（连载一） </title><link>http://www.blogjava.net/kapok/archive/2005/03/29/2586.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 29 Mar 2005 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/29/2586.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2586.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/29/2586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2586.html</trackback:ping><description><![CDATA[<STRONG><A href="http://case.51cmm.com/CM/No097.htm">http://case.51cmm.com/CM/No097.htm</A></STRONG><STRONG><BR><BR>第1章 前言 <BR></STRONG>&nbsp;&nbsp;<STRONG>.</STRONG> 本文档凡斜体字即代表高级内容、高级概念、或可选内容，仅作粗略了解用，暂不必深入理会。<BR>&nbsp;&nbsp;<STRONG>.</STRONG> 如下如无特别说明，缩写“CC”即代表Rational ClearCase；缩写“VS”即代表Microsoft Visual Studio 2003/2005/Whidbey；缩写“VSS”即代表Microsoft Visual Source Safe。<BR>&nbsp;<STRONG>&nbsp;. </STRONG>对于代码开发人员，绝大部分配置管理工作是通过集成了ClearCase的VS.NET来进行的，除却部分操作，大部分操作在VS集成环境下进行应该更便当些。但本文档是CC的基础，也包含部分VS集成环境无法进行的操作，所以，开发人员必须仔细阅读本文档 – 单纯依靠集成了ClearCase的VS.NET是无法解决所有问题的。<BR>&nbsp;<STRONG>&nbsp;第2章 ClearCase安装</STRONG><BR>&nbsp;&nbsp;<STRONG>2.1 准备工作</STRONG><BR>&nbsp;&nbsp;<FONT color=#ff0000>. 客户机器必须加入Windwos域，客户必须用Windows域账户登录到自己的机器（即登录到域中），你的ClearCase客户端才可以正常访问ClearCase服务器、你的ClearCase客户端才可以正常工作。ClearCase使用Windows账户作为自己权限管理的基础，切！</FONT> <BR>&nbsp;&nbsp;. 网络部分、<FONT color=#ff0000>WINS设置</FONT>：网络连接、属性、TCP/IP、属性、高级、WINS、添加(A)…，加入2个WINS地址：192.168.8.4、192.168.8.6。否则安装可能失败，提示如下：<BR><IMG height=365 src="http://case.51cmm.com/CM/Images/No097-1.gif" width=554><BR>&nbsp;&nbsp;. 如果客户端是Windows 2000 Advanced Server，可能因为权限问题而无法创建视图，这是我们公司域服务器帐号同步故障所致。<FONT color=#ff0000>请先退出PDOMAIN域，然后再加入PDOMAIN域，问题应该可以解决。</FONT>注：其他类型操作系统也可能出类似故障（有时报告“…与域服务器的信任关系失败…”），解决办法同此。 <BR>&nbsp;&nbsp;. 工作方便起见，你的Windows域账户应该同时是你本机的管理员（Administrators组）。 <BR>&nbsp;&nbsp;一切Ok，开始安装工作。<BR>&nbsp;&nbsp;2.2 安装工作<BR>&nbsp;&nbsp;. <FONT color=#ff0000>注意</FONT>：ClearCase必须在Visual Studio.NET（含Whidbey）、Rational Rose之后安装，否则ClearCase与以上2者的集成将失败。 <BR>&nbsp;&nbsp;.<FONT color=#ff0000> 注意</FONT>：以后如果需要重装Visual Studio（如Whidbey版本升级）或Rose，ClearCase也必须卸掉重装、同样是后装ClearCase！ <BR>&nbsp;&nbsp;. <FONT color=#ff0000>注意</FONT>：VS.NET+ClearCase安装、配置好后，如果因为目种原因又安装了Source Safe，则VS.NET+ClearCase的集成关系失败、自动变为VS.NET+Source Safe的集成关系。如欲返回使用VS.NET+ClearCase集成，则必须卸载重装ClearCase。 <BR>&nbsp;&nbsp;.<FONT color=#ff0000> 注意</FONT>：关于原Source Safe客户端：<BR>&nbsp;&nbsp;1、 对于Visual Studio（平台技术部、应用开发部），客户端原Source Safe可以保留、不必卸载、以备浏览原Source Safe库；<BR>&nbsp;&nbsp;2、 对于Rose（应用设计部），客户端原Source Safe可以暂时保留，以备浏览原Source Safe库；当Source Safe到ClearCase的迁移工作彻底完成后，最好卸载客户端Source Safe，否则Rose与ClearCase的绑定可能（而非绝对）会受到干扰，每次启动Rose都需要重置Rose Add-In Manager，以重新绑定到ClearCase! ---- 目前来看，部分人机器环境可能有本绑定毛病。 <BR>&nbsp;&nbsp;. ClearCase Client安装启动路径：\\uf-net\ClearCaseNetSetup，启动Setup.exe......可能遇到的、需要干涉的步骤及解决如下：<BR>&nbsp;&nbsp;1、 License Agreement…步骤：当然选择I accept…、我同意……<BR>&nbsp;&nbsp;2、 最后一步，提示是否阅读有关及是否要进入Rational有关网址，不必要，勾掉2个CheckBox。<BR>&nbsp;&nbsp;3、 除却安装路径（默认：c:\program files\rational\clearcase）可以修改外，其他配置一律不得修改、须保持默认值！ <BR>&nbsp;&nbsp;. 安装完ClearCase后必须重新登录（即Windows注销操作）---- 最好重启机器、以刷新你的权限到ClearCase Server，否则不能操作ClearCase客户端！ <BR><STRONG>&nbsp;&nbsp;第3章 各部目录结构</STRONG><BR>&nbsp;&nbsp;<FONT color=#ff0000>特别提醒</FONT>：在ClearCase Explore中，你可以看到自己熟悉的目录、文件等概念。但其实，其中有些结点、目录是特殊的ClearCase后台对象（视图名、VOB、Component），你不要试图在CC Explore或Windows Explore中对这些特殊的CC Object进行删除、移动、重命名等变更操作，否则肯定只会自讨苦吃！这些概念你不必太了解，记着别变更之即可。 <BR>&nbsp;&nbsp;这些概念在CC Explore中View的节点等级关系为：<FONT color=#ff0000>视图名\VOB\Component\普通目录、文件</FONT>。即Root节点代且仅代视图名，1级节点代且仅代VOB，2级节点代且仅代Component，其他为普通目录、文件。<FONT color=#ff0000>客户端只能对Component之下的常规目录、文件作入库、Check Out、Check In、重命名、删除等操作。</FONT> <BR>&nbsp;&nbsp;这些概念在CC Explore中的体现参下节：“平台技术部目录结构”。<BR>&nbsp;&nbsp;3.1 平台技术部<BR><IMG height=417 src="http://case.51cmm.com/CM/Images/No097-2.gif" width=451><BR>&nbsp;&nbsp;3.2 应用开发部<BR><IMG height=378 src="http://case.51cmm.com/CM/Images/No097-3.gif" width=328><BR>&nbsp;&nbsp;3.3 应用设计部<BR><IMG height=381 src="http://case.51cmm.com/CM/Images/No097-4.gif" width=363><BR>（未完待续） <BR><BR><BR><A><FONT color=#ff0000>本站享有“51CMM.COM原创”文章专有使用权，未经同意任何单位或个人不得转载或将这些文章用作其他商业用途。<BR>转载其他带有“51CMM.COM”标记的文章，需注明“来自：51CMM.COM”。</FONT></A><img src ="http://www.blogjava.net/kapok/aggbug/2586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-29 20:24 <a href="http://www.blogjava.net/kapok/archive/2005/03/29/2586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一图胜千言：RUP核心概念解析</title><link>http://www.blogjava.net/kapok/archive/2005/03/29/2585.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 29 Mar 2005 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/29/2585.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2585.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/29/2585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2585.html</trackback:ping><description><![CDATA[<A href="http://case.51cmm.com/OO/No069.htm">http://case.51cmm.com/OO/No069.htm</A><BR>在实践中，笔者发现，对概念的理解不到位，特别是对概念之间的关系理解不到位，是阻碍不少人成功应用RUP的原因之一。<BR>&nbsp;&nbsp;本文采用“为概念及其关系建模”的方法，对概念及其关系进行考察，以期深入理解RUP的核心概念。 
<P><STRONG>&nbsp;&nbsp;1、弄清概念的必要性</STRONG><BR>&nbsp;&nbsp;随着软件学科和软件业的不断发展，“名词”越来越多。但是，“名词”背后的“含义”也真的有如此之多的增长吗？<BR>&nbsp;&nbsp;举个例子。1986年，Barry Boehm提出了软件开发的螺旋模型。从那时起，螺旋模型被当作软件开发的标准方法。螺旋模型还有其他不同的常用名字，比如演进模型，或者迭代模型[1]。类似的例子还有很多。<BR>&nbsp;&nbsp;看来，软件界存在不少这种“新瓶装旧酒”的现象——一个新名词出现了，它可能仅仅是披着新的表达形式的外衣，而其含义其实和某个旧名词相同。<BR>笔者认为，在软件学科飞速发展的今天，反而是踏踏实实搞清楚“变幻无穷”的诸多名词背后的真正含义，才是最便捷之道。</P>
<P><STRONG>&nbsp;&nbsp;2、本文的方法：一图胜千言</STRONG><BR>&nbsp;&nbsp;本文采用“为概念及其关系建模”这样一种方法，不仅考察单个名词的含义，还考察名词之间的关系。<BR>&nbsp;&nbsp;一图胜千言。一个概念的本质，往往需要从它同其他概念的关系中，得以体现。不仅考察个体，还考察多个个体之间的关系，这种方法在系统论中，被比喻成“1 + 1 &gt; 2”。令人愉快的是硬币的另一面，注重考察关系这种方法，从其成本角度而言却是“1 + 1 &lt; 2”。</P>
<P><STRONG>&nbsp;&nbsp;3、RUP核心概念解析<BR>&nbsp;&nbsp;3.1、任务来自问题</STRONG><BR>&nbsp;&nbsp;RUP著名的二维结构，其时间维相关的概念有阶段、迭代、里程碑等，内容维相关概念有工作流、角色、活动、工件等。但笔者发现，不少人对这些概念理解不深，特别是对概念之间的关系把握不到位，造成实践中出现问题。</P>
<P><IMG height=274 src="http://case.51cmm.com/OO/Images/No069-1.gif" width=403> </P>
<P>&nbsp;&nbsp;另外，就是迭代式开发——这种包括RUP在内的多种软件工程过程都一致推崇的最佳实践——和活动、工件这些基本概念有何关系。不知道迭代和活动、工件的关系，实际应用RUP时又如何贯彻迭代式开发的思想呢？<BR>&nbsp;&nbsp;还有，配置和变更管理对所有现代软件开发过程都是必不可少的支持活动，RUP更是将其列为“RUP的6大最佳实践”之一。但笔者发现，不少开发人员认为配置和变更管理太麻烦，仅仅是因为他们没有理解配置和变更管理和工件的基本关系。<BR>我们的任务，就来自于这些问题。我可以用一幅图解决这些问题吗？</P>
<P><STRONG>&nbsp;&nbsp;3.2、一图胜千言</STRONG><BR>&nbsp;&nbsp;下图是一幅UML类图，它概括了上述问题的相关概念，并着重表达了概念之间的关系。本图的丰富语义，我们通过下面几节细细来分析。<BR><IMG height=276 src="http://case.51cmm.com/OO/Images/No069-2.gif" width=553> </P>
<P><STRONG>&nbsp;&nbsp;3.3、角色执行活动，活动生产工件</STRONG><BR>&nbsp;&nbsp;任何软件工程过程，都少不了角色（role）、活动（activity）、工件（artifact）等概念（或者类似概念）。</P>
<P><IMG height=193 src="http://case.51cmm.com/OO/Images/No069-3.gif" width=279> </P>
<P>&nbsp;&nbsp;这些概念本身很好理解。角色是对个人或者作为开发团队的一组人的职责的规定；具体人和角色的关系，好比人和帽子的关系。活动就是角色执行的工作单元。工件就是工作的成品或半成品。<BR>&nbsp;&nbsp;倒是这些概念的关系显得更加重要。角色的职责，具体体现在他执行活动和负责工件上。工件是由活动生产出来的——工件是活动的输出；比如制定《编码规范》。然而，活动本身也可能以工件为输入——活动可能要求使用工件；比如编码活动要参考《编码规范》。还有一种关系，工件既是活动的输入又是它的输出——活动修改工件；比如修改《编码规范》。</P>
<P><IMG height=242 src="http://case.51cmm.com/OO/Images/No069-4.gif" width=334> </P>
<P><STRONG>&nbsp;&nbsp;3.4、阶段和迭代：提供不同级别的决策时机</STRONG><BR>&nbsp;&nbsp;尽早解决重大风险，是软件工程管理中的一条重要原则。正如Tom Glib所说：“如果我们不主动化解风险，那么它们会自己找上门来。”[2]心存侥幸是很危险的。<BR>&nbsp;&nbsp;RUP是风险驱动的。它将整个开发生命周期分为4个阶段：初始阶段、细化阶段、构造阶段、移交阶段。初始阶段着重化解业务风险，并确保所有涉众对项目达成一致的认识。细化阶段主要化解技术风险，要定义并创建可执行的系统架构。相对而言，当决定开始构造阶段的时候，风险已经比较小了。当然，风险是动态变化的，构造阶段和移交阶段照样会有这样那样的风险存在。</P>
<P><IMG height=206 src="http://case.51cmm.com/OO/Images/No069-5.gif" width=403> </P>
<P>&nbsp;&nbsp;RUP的每个阶段又可分为一到多个迭代周期。采用迭代式开发，意味着有持续不断的反馈；反馈是决策的基础，也是化解风险的基础。迭代式开发的一个主要目的就是尽早降低风险，通过每次迭代中分析、按重要性排序并解决主要风险，来达到尽早化解风险的目的。</P>
<P><IMG height=218 src="http://case.51cmm.com/OO/Images/No069-6.gif" width=415> </P>
<P>&nbsp;&nbsp;这个根据持续反馈来进行决策的时机，叫做里程碑（milestone）。里程碑有2种，阶段结束对应的里程碑叫做主要里程碑（major milestone）；迭代结束对应的里程碑叫做次要里程碑（minor milestone）。可以说，阶段和迭代，为开发团队提供了不同级别的决策时机。</P>
<P><IMG height=280 src="http://case.51cmm.com/OO/Images/No069-7.gif" width=450> </P>
<P>&nbsp;&nbsp;上图清晰的表达了上述分析的思想。里程碑分为主要里程碑和次要里程碑2种；阶段可以包含多次迭代；每个阶段必然有一个主要里程碑标识结束，每个迭代必然以一个次要里程碑标识结束。<BR>&nbsp;&nbsp;迭代的具体进行，是要靠角色执行相关活动。上图中的迭代和活动的多对多关系，精彩地反映了迭代开发的特点——每次迭代都执行多个（甚至全部）开发活动。</P>
<P><STRONG>&nbsp;&nbsp;3.5、配置和变更管理支持迭代式的基于基线的开发</STRONG><BR>&nbsp;&nbsp;迭代式开发意味着每个后继迭代，都以前一个迭代为基础，不断地进化和完善系统，直至完成最终产品。历史上有一段时期，为了强调这一点，RUP曾特意宣传“迭代和增量开发”。<BR>&nbsp;&nbsp;建立并管理基线（baseline），为迭代式开发提供了有力支持。基线的要点有二：一是要通过评审，二是要受配置和变更管理控制。IEEE对于基线的完整定义是：已经通过正式复审和批准的某规约或产品，它因此可以作为进一步开发的基础，并且只能通过正式的变更控制过程进行改变。<BR>&nbsp;&nbsp;配置和变更管理完成建立并管理基线的任务。置于配置和变更管理之下的工件，称为配置项（configuration item）——因此下图把配置项建模为工件的子类。而基线就是有多个配置项组成的瞬时快照——因为受配置和变更管理控制是基线的必要条件。</P>
<P><IMG height=295 src="http://case.51cmm.com/OO/Images/No069-8.gif" width=280> </P>
<P>&nbsp;&nbsp;上面讨论了“工件－配置项－基线”这些静态概念，下面再讨论一下相关动态概念。任何工件，都有可能发生变更；正如并不是所有工件都是配置项一样，变更也不一定都受控，比如，用于讨论的临时设计就不必受控。只有配置项的变更，才是需要受配置和变更管理控制的。到底哪些工件应当受控，是根据实践情况决定的，应当在规范性和灵活性之间权衡考虑。</P>
<P>&nbsp;<STRONG>&nbsp;3.6、发布是什么，发布不是什么</STRONG><BR>&nbsp;&nbsp;发布（release）是软件产品的一个稳定的、可执行的版本，它包括了发布说明、用户手册等相关工件。<BR>&nbsp;&nbsp;单纯的文档或者不能执行的软件版本，并不是发布。<BR>&nbsp;&nbsp;发布是某个迭代周期的成果，但是并非每个迭代周期都用发布。<BR>&nbsp;&nbsp;图中表达得很明白，发布是特殊的基线。这意味着发布不是单一的工件，而是工件集；而且发布的工件都应当置于配置管理的控制之下，这是因为你必须标识和跟踪这些工件，开发团队或者用户的很多活动都和它们相关。</P>
<P><IMG height=177 src="http://case.51cmm.com/OO/Images/No069-9.gif" width=460> </P>
<P><STRONG>&nbsp;&nbsp;4、总结</STRONG><BR>&nbsp;&nbsp;UML已经广泛用于软件开发活动，可视化表达使得理解和解决问题变得容易。本文是UML的另一个应用，它被用来明确概念之间的关系，希望对大家有所启发。</P>
<P>&nbsp;&nbsp;参考文献：<BR>&nbsp;&nbsp;[1] Gary Pollice等著，宋锐等译. 小型团队软件开发：以RUP为中心的方法. 中国电力出版社，2004<BR>&nbsp;&nbsp;[2] Per Kroll等著，徐正生等译. Rational统一过程：实践者指南. 中国电力出版社，2004</P>
<P>&nbsp;&nbsp;作者简介：<BR>&nbsp;&nbsp;温昱，架构设计师，松耦合空间（http://lcspace.nease.net）创办人。擅长面向对象、架构和框架设计，对设计模式、UML和软件工程有深入研究。可以通过wenyu@china.com和作者联系。</P><BR><img src ="http://www.blogjava.net/kapok/aggbug/2585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-29 20:08 <a href="http://www.blogjava.net/kapok/archive/2005/03/29/2585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>51CMM</title><link>http://www.blogjava.net/kapok/archive/2005/03/29/2580.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 29 Mar 2005 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/29/2580.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2580.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/29/2580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2580.html</trackback:ping><description><![CDATA[<A href="http://resource.51cmm.com/Requirement/No063.htm">http://resource.51cmm.com/Requirement/No063.htm</A><img src ="http://www.blogjava.net/kapok/aggbug/2580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-29 15:08 <a href="http://www.blogjava.net/kapok/archive/2005/03/29/2580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RequisitePro中需求管理的12个步骤 </title><link>http://www.blogjava.net/kapok/archive/2005/03/29/2578.html</link><dc:creator>笨笨</dc:creator><author>笨笨</author><pubDate>Tue, 29 Mar 2005 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/kapok/archive/2005/03/29/2578.html</guid><wfw:comment>http://www.blogjava.net/kapok/comments/2578.html</wfw:comment><comments>http://www.blogjava.net/kapok/archive/2005/03/29/2578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kapok/comments/commentRss/2578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kapok/services/trackbacks/2578.html</trackback:ping><description><![CDATA[<A href="http://www.uml.org.cn/gcgj/gcgj36.htm">http://www.uml.org.cn/gcgj/gcgj36.htm</A><BR>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD class=title vAlign=center align=middle height=56><B><FONT color=#ff0000 size=3>RequisitePro中需求管理的12个步骤 <!-- #EndEditable --></FONT></B></TD></TR>
<TR>
<TD class=formtitle align=middle height=40><!-- #BeginEditable "2" -->翻译者：Blueski<BR>提供日期：2001-9-20<!-- #EndEditable --></TD></TR></TBODY></TABLE>
<TABLE height=73 cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD class=content><!-- #BeginEditable "3" -->
<P class=content>&nbsp;</P>
<P class=content>需求管理是对变动的需求进行确定、组织和制作文档的过程。本文将介绍Rational Unified Process (RUP)中的有关于需求管理的基本概念，并展示如何使用RequisitePro来实行需求管理。</P>
<P>RequisitePro是很特别的产品，它集成了一个大家都很熟悉的环境：Microsoft Word，以及一个数据库来提供强有力的十分容易使用的框架，你可以用它来对产品需求进行管理。你要在需求文档中逐条标记你的需求，然后通过数据库对它们进行管理。以此为基础，你的团队可以对同一个项目进行合作与联系，并进行不断的更新。 </P>
<P>理解需求管理的第一步是建立一个通用的词汇表。Rational把需求定义为：一种在建系统必须遵循的条件或功能。需求管理应该是：可以对系统的需求进行引入、组织和文档化的一种系统化的方法与步骤，以及建立和维护开发团队和客户之间关于系统需求变更的确认的过程。</P>
<P>要注意的是目前的需求管理没有最通用的办法。以下的各步骤是作为一种起点来提供的。在你的开发环境中，由于你不断经历着你的软件的反复叠代并为此不断工作，你需要不断地重新定义你的过程，并且要找出最适合你开发需要的工作程序。 由于这是反复迭代的过程，所以你要在项目中经常经历以下的12个步骤。</P>
<P>Step 1: 分析问题并收集stakeholder needs</P>
<P>系统分析对总体任务负有责任。所有的团队成员，包括核心的stakeholder，都要帮助系统分析员从客户那里收集stakeholder needs。可以使用以下方法：</P>
<P>面谈交流<BR>问题调查表<BR>集体讨论与灵感收集<BR>讨论板<BR>原型</P>
<P>这些和客户交互的结果可以很方便地记录到RequisitePro文档中去。 </P>
<P>　 </P>
<P>Step 2: 为RequisitePro工程创建一个概要说明</P>
<P>一旦你的团队已经分析了问题，并且收集了足够的stakeholder needs，下一步是在RequisitePro中对你的项目组织安排进行规划。你可以使用Requirements Management Plan outline (rup_rmpln.dot)来创建一个需求管理计划文档。如果你使用的是RequisitePro Project Template 4.5，那么你还可以选择需求管理计划文档的类型。你可以在需求管理计划文档中记载以下信息：</P>
<P>你可能在项目中要用到的Requirements artifacts (RequisitePro文档)，例如Stakeholder需求文档、 Vision（确定性不高的）文档、软件需求文档、测试计划书，还有需求类型，例如用于stakeholder NEED,特性 FEAT, 软件需求SR(software requirement),另外还有需求属性，跟踪要点等。 </P>
<P>Step 3: 在一个可见的文本中的文档特性</P>
<P>系统分析员可以在推荐的软件产品的高层次的需求（或功能特性）上获得客户的认可。这些关键性的用户需要一个在RequisitePro中的可见的文档。系统分析员可以为功能特性Feature创建需求类型 (使用FEAT)以及Stakeholder需求(使用NEED) 作为文档中缺省的需求类型。 <BR>每一个经过肯定的特性都被标记为FEAT需求，而每一个stakeholder needs将被标记为NEED需求并放在一个不确定文档中。</P>
<P>此后系统分析员可以在RequisitePro中建立功能特性(例如：客户优先级、风险、rationale、来源等)。 在输入完以后，系统分析员为需求管理来定义有关的属性，因为它们涉及到开发周期中其它的工作。</P>
<P><BR>Step 4: 拓展需求的细节</P>
<P>一旦你的特性需求定义好了，你可以创建底层的需求(它门可能被组织成软件需求) 。在搜集了整个团队的输入以后，系统分析员将需求输入到RequisitePro，同时还定义属性用以进行跟踪。</P>
<P>还有些组织会选择use case来规划他们的需求。系统分析员和所有项目成员聚集在一处，共同探讨需求问题，对软件中所有的use case和actor角色进行鉴定。通常这会在白板或纸上进行记录，系统分析员使用这些信息并把这些use case和actor记录到Rational Rose中去。你可以在Rose中拓展use case，并把它们和RequisitePro中的需求进行关联 (参见Step 10: 和Rational Rose集成)。如果你的工作过程不包括Rose，那么何不直接把它们作为需求输入到RequisitePro。</P>
<P>Rational提倡在详细描述uses case时使用分层次等级的需求。如果你在一个很大的非常复杂的系统中，那么你可以决定是否要为某一个use case使用分离的需求类型。如果你要为2个不同的需求类型使用不同的安全设置，或者你可能希望在use case和在其中定义的需求之间建立外在的可跟踪性，或者你需要一套2个不同的需求类型中彼此分离的属性，那么这还是有必要的。</P>
<P>一旦需求被加入到RequisitePro，系统分析员（通过团队的输入协助下）可以定义一些属性来对需求进行管理。Use case用例在项目的某个过程中可能接着被加入。你的列表可能还不完善，但这没有关系，因为它可以在任何时候得到进一步的更新和完善。 </P>
<P>Step 5: 跟踪需求，并扩展到功能上去</P>
<P>一旦所有的需求都已经输入到RequisitePro中了，系统分析员在软件需求(SR)和特性(FEAT)需求之间建立了可跟踪性。我们推荐对从SR类型到FEAT类型需求的过程进行跟踪，由此可以显示SR对FEAT依赖关系。<BR>如果你选择使用use case，我们推荐对Use Case需求到FEAT需求的过程进行跟踪,因为use case依赖于对功能的定义。但在某些时候，功能特性并不和use case相对应，或者，很难通过特殊的use case来进行跟踪。在这种情况下，系统分析员要对功能需求进行Supplementary Specification (SUPL)跟踪。</P>
<P>Step 6: 对需求区分优先级</P>
<P>在需求之间设置了可跟踪性以后，系统分析员和整个团队成员要搜集并决定输入RequisitePro的需求的有限级别。</P>
<P>在你确定优先级的时候，要考虑这样一些因素：</P>
<P>需求是如何体现到产品功能、可用性、可靠性和性能中去的？<BR>在进度约束下，需求实现后的效果是否值得？<BR>现实下需求是否带来风险？<BR>该需求如果实现了，对你进行产品维护的能力有什么影响？<BR>你还必须检查你的进度。是否有时间完成所有高优先级需求？ </P>
<P>在此阶段建立比较现实的期望将帮助你的团队在进度和预算范围内开展工作。</P>
<P>使用需求属性可以帮助你确定需求的优先级别。一旦你输入了需求数据，你就可以对它们进行查询、排序并决定它们的位置。</P>
<P>在RequisitePro学习工程中，属性"Planned Iteration"字段被设为一个数值，该数值反映了软件中的反复，团队准备用该软件来实现特定的use case。一旦第一次反复叠代的范围被定义完成，而且反复叠代次数被指定到use case，系统分析员对用例执行一项Attribute Matrix查询来分离那些在软件中首次反复可被定位的用例。你可以将该Attribute Matrix保存并在以后再次查看它。</P>
<P><BR>Step 7: 对需求进行分派</P>
<P>对需求指定优先级以后，系统分析员和团队将每一个use case或者requirement指派给团队成员，这可通过使用 "Assigned To"需求属性来完成。团队中的一些人将对每一个特性的具体实现负责。<BR>通过参考上面步骤中的Attribute Matrix，分析员为每一个需求或用例填写"Assigned To"属性。这将被作为第一次反复。<BR>使用use case方法的组织将把use cases分派给use case定义者，他将对所有和流程相关的所有需求负责。</P>
<P>如果你的组织使用其它的方法，则分派也可能是其它形式： <BR>SRS系统规格文档，可以包括多组需求； <BR>或者特定格式的需求记录</P>
<P><BR>Step 8: 细化需求规格</P>
<P>团队成员 (或者use case 定义者)通过在RequisitePro中"Assigned To"属性来确认他们被分派了哪些需求。他们可以得到一张显示所有需求对个人的分派情况的列表。<BR>从该表中你可以查询一个FEAT需求类型的Traceability Matrix，以及分派给你的需求类型。你可以通过选择需求类型得到所有特性跟踪的列表，并通过它生成一个特定的文档。</P>
<P>Use case specifier将进行查询，这些查询基于从用例的类型的跟踪，然后可使用来自requirement workshop的use case描述来创建Use-Case Specification文档。<BR>Rational推荐在详细描述use case时使用分等级管理。你可以使用“属性Property”来组织你的use case需求。 可以用use case的名字来创建父一级的用例需求，并设置属性"Name"的值。你可能还要使用属性"Brief Description"或者"Basic Flow"来定义子一级的用例需求，他们可提供用例的细节。</P>
<P>Step 9: 在RequisitePro中将需求属性公布(Populating) </P>
<P>在此之前，系统分析员已通过整个团队的输入而定义了需求管理的有关属性(见前面章节)。 被分派了需求的团队成员可以将这些属性在RequisitePro中通过赋予特定的用于需求管理的值来使之公布(Populating) 。</P>
<P>Step 10: 和Rational Rose进行集成</P>
<P>如果你同时拥有Rational Rose和RequisitePro，那么有2种方法来共享数据。<BR>我们推荐使用Integrated Use Case Management来开始你的开发周期。系统分析员在Rose中定义use case ，然后在RequisitePro中使用Integrated Use Case Management特性来创建use case文档。该方法只需要通过几项菜单操作即可实现Rose和RequisitePro之间的转化和关联。对use case的修改将自动在Rose或RequisitePro中得到更新。</P>
<P>但是，如果你在RequisitePro中开发use case，并且想转换到Rose use case图，并且带有关联属性，那么你要使用Rational Synchronizer，此后你可以通过Integrated Use Case Management将这些use case关联到RequisitePro需求和文档。<BR>Rational Synchronizer可以帮助你在Rose中从RequisitePro中已经存在的需求中创建use case。如果你已经在RequisitePro中建立了大量的use case，那么这时候将很有帮助。在这种情况下，你可以用Rational Synchronizer中的rules feature来把RequisitePro中的use case需求以批处理方式转换到Rose中。然后你可以使用Integrated Use Case Management来把这些Rose use case和已经存在的RequisitePro中的use case需求进行关联。 Step 11: 通过查询来找出项目的进展状况</P>
<P>在查询以前，要在FEAT需求和指派给你的需求类型之间建立一个Traceability Matrix，(Use case specifiers将在FEAT和用例需求之间建立Traceability Matrix)。视图将以行方式显示你的FEAT需求，以列方式显示其它需求。<BR>点击Query column requirements按钮，并且在Select Attribute对话框中选择"Planned Iteration" 属性，点击OK。在Query Requirements对话框中，选择Equal to选项，然后键入你期望的反复次数。如果要看哪一项属性没有反复计划，则可以什么也不填。点击OK，并关闭每个对话框以执行查询。</P>
<P>查询结果将给出这些FEAT需求类型的跟踪情况。如果你选择了没有反复计划的类型，这样的列表可以在团队会议上被检阅，而被指派到这些需求上的反复叠代则没有任何指示。 </P>
<P>Step 12: 对变更进行管理</P>
<P>每一个项目都会在发展过程中产生变化，如何跟踪这些变化，以及如何将这些变化及时地与你的团队和经理进行及时沟通，这将是一种挑战。是否成功将取决于你跟踪需求变更的能力。系统分析员在整个项目生命周期内应进行各种查看以确定对各种不同的项目的估计是否合理正确。RequisitePro可以确定哪种需求已经变更，该需求是否需要重新定位，从而使项目的描述保持正确。这些关联将作为一种可觉察到的因素引起注意。<BR>RequisitePro包含了2个强力管理工具来帮助你记载需求的状态，跟踪对需求的变更，并加强你在变更发生时对所实行处理的分析能力。</P>
<P>Traceability提供了一种有系统性的方法来管理变更，可以建立较高层次的需求和它们的更详细精确的后期需求之间的连接。Traceability连接关系使得需求变更的跟踪变得简便。<BR>通过Rational ClearCase, Microsoft Visual SourceSafe, 或Merant (Intersolv) PVCS Version Manager 进行的版本控制可以允许你通过项目存档来跟踪变化。版本控制可以帮助你在整个开发周期内保持项目文件的变化。你可以管理多种项目的修订版。你可以用一种有组织的、协同一致的方式来找回、修改并把修订版返回到档案中去。如果你没有版本管理经理，那么你可以使用RequisitePro的Archive命令进行项目备份。</P>
<P><BR>(the end) </P>
<P>　 </P>
<P>后记：</P>
<P>以上译自Rose Enterprise 2000中的RequisitePro 4.5中的随机文档。</P>
<P>由于才疏学浅，有些词汇无法很好的翻译，主要如下： </P>
<P>Attribute Matrix不详，保留原文。<BR>iteration 反复叠代？<BR>Populating 公布？<BR>FEAT 特性需求或功能需求，SR 软件需求，stakeholder needs 原始需求？这些不同需求的定义和区别我不太清楚，建议参考别的RUP文档。 </P>
<P>　</P>
<P>此致</P>
<P>Blueski<BR></P><!-- #EndEditable --></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/kapok/aggbug/2578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kapok/" target="_blank">笨笨</a> 2005-03-29 14:51 <a href="http://www.blogjava.net/kapok/archive/2005/03/29/2578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>