﻿<?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-★yesjoy★-文章分类-软件工程学</title><link>http://www.blogjava.net/yesjoy/category/13916.html</link><description>&lt;font color="red"&gt;★&lt;/font&gt;&lt;font color="blue"&gt;总在爬山 所以艰辛;总在寻梦 所以苦痛&lt;/font&gt;&lt;font color="red"&gt;★&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 07 Sep 2010 02:02:23 GMT</lastBuildDate><pubDate>Tue, 07 Sep 2010 02:02:23 GMT</pubDate><ttl>60</ttl><item><title>ISO软件工程模板(10)模块开发说明</title><link>http://www.blogjava.net/yesjoy/articles/125278.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125278.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125278.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125278.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27675.html">http://www.linuxdby.com/html/linux/system/20070505/27675.html</a><br>
<h3>1．标题</h3>
<p>&#160;</p>
<p>　　[系统名称和标识符]<br>　　[模块名称和标识符]<br>　　[程序编制员签名]<br>　　[卷宗的修改文本序号]<br>　　[修改完成日期]<br>　　[卷宗序号]<br>　　[编排日期]</p>
<p>
<h3>2．模块开发情况表</h3>
<p>&#160;</p>
<p>　　[&#8230;&#8230;]</p>
<p>
<h3>3．功能说明</h3>
<p>&#160;</p>
<p>　　[扼要说明本模块的功能,主要是输入、要求的处理、输出。可以从系统设计说明书中摘录。同时列出在需求说明书中对这些功能的说明的章、条、款。]</p>
<p>
<h3>4．设计说明</h3>
<p>&#160;</p>
<p>　　[说明本模块的设计考虑]</p>
<p>
<h3>5．硬件部分的设计结果</h3>
<p>&#160;</p>
<p>　　1）经项目组调试通过的硬件成品1件<br>　　2）设计文件：<br>　　《原理图》<br>　　《PCB图》<br>　　《BOM清单》<br>　　《可编程器件及烧录进制文件》<br>　　《必要测试点波形图或硬件指标评细说明》<br>　　《原理详细说明》<br>　　《与系统内其他部分接口软硬件详细说明》<br>　　这些文件可以附件的形式列后。</p>
<p>
<h3>6．软件的设计结果</h3>
<p>&#160;</p>
<p>　　要给出所产生的本模块的第一份无语法错的源代码清单以及已通过全部测试的当前有效的源程序代码。</p>
<p>
<h3>7．测试说明</h3>
<p>&#160;</p>
<p>　　说明直接要经过本模块的每一项测试，包括这些测试各自的标识符和编号、进行这些测试的目的、所用的配置和输入、预期的输出及实际的输出。</p>
<p>
<h3>8．复审的结论</h3>
<p>&#160;</p>
<p>　　把实际测试的结果，同需求说明书、系统设计说明书中规定的要求进行比较和给出结论</p>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 11:02 <a href="http://www.blogjava.net/yesjoy/articles/125278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(9)详细设计说明书</title><link>http://www.blogjava.net/yesjoy/articles/125275.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125275.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125275.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125275.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27674.html">http://www.linuxdby.com/html/linux/system/20070505/27674.html</a><br>
<h3>1.引言</h3>
<p>&#160;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　[说明编写这份详细设计说明书的目的，指出预期的读者。]</p>
<p><strong>1.2背景</strong></p>
<p>　　a.[待开发系统的名称；]<br>　　b.[列出本项目的任务提出者、开发者、用户。]</p>
<p><strong>1.3定义</strong></p>
<p>　　[列出本文件中用到的专门术语的定义和外文首字母组词的原词组。]</p>
<p><strong>1.4参考资料</strong></p>
<p>　　[列出有关的参考资料。]</p>
<p>
<h3>2. 系统的结构</h3>
<p>&#160;</p>
<p>　　[给出系统的结构框图，包括软件结构、硬件结构框图。用一系列图表列出系统内的每个模块的名称、标识符和它们之间的层次结构关系。]</p>
<p>
<h3>3．模块1（标识符）设计说明</h3>
<p>&#160;</p>
<p>　　[从本章开始，逐个地给出各个层次中的每个模块的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块，尤其是层次比较低的模块或子程序，其很多条目的内容往往与它所隶属的上一层模块的对应条目的内容相同，在这种情况下，只要简单地说明这一点即可。]</p>
<p><strong>3.1模块描述</strong></p>
<p>　　[给出对该基本模块的简要描述，主要说明安排设计本模块的目的意义，并且，还要说明本模块的特点。]</p>
<p><strong>3.2功能</strong></p>
<p>　　[说明该基本模块应具有的功能。]</p>
<p><strong>3.3性能</strong></p>
<p>　　[说明对该模块的全部性能要求。]</p>
<p><strong>3.4输入项</strong></p>
<p>　　[给出对每一个输入项的特性。]</p>
<p><strong>3.5输出项</strong></p>
<p>　　[给出对每一个输出项的特性。]</p>
<p><strong>3.6设计方法（算法）</strong></p>
<p>　　[对于软件设计，应详细说明本程序所选取用的算法，具体的计算公式及计算步骤。]<br>　　[对于硬件设计，应详细说明本模块的设计原理、元器件的选取、各元器件的逻辑关系，所需要的各种协议等。]</p>
<p><strong>3.7流程逻辑</strong></p>
<p>　　[用图表辅以必要的说明来表示本模块的逻辑流程。]</p>
<p><strong>3.8接口</strong></p>
<p>　　[说明本模块与其它相关模块间的逻辑连接方式，说明涉及到的参数传递方式。]</p>
<p><strong>3.9存储分配</strong></p>
<p>　　[根据需要，说明本模块的存储分配。]</p>
<p><strong>3.10注释设计</strong></p>
<p>　　[说明安排的程序注释。]</p>
<p><strong>3.11限制条件</strong></p>
<p>　　[说明本模块在运行使用中所受到的限制条件。]</p>
<p><strong>3.12测试计划</strong></p>
<p>　　[说明对本模块进行单体测试的计划，包括对测试的技术要求、输入数据、预期结果、进度安排、人员职责、设备条件、驱动程序及桩模块等的规定。]</p>
<p><strong>3.13尚未解决的问题</strong></p>
<p>　　[说明在本模块的设计中尚未解决而设计者认为在系统完成之前应解决的问题。]</p>
<p>
<h3>4．模块2（标识符）设计说明</h3>
<p>&#160;</p>
<p>　　[用类似第3条的方式，说明第2个模块乃至第N个模块的设计考虑。]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 11:01 <a href="http://www.blogjava.net/yesjoy/articles/125275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(8)组装测试计划</title><link>http://www.blogjava.net/yesjoy/articles/125273.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125273.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125273.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125273.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27673.html">http://www.linuxdby.com/html/linux/system/20070505/27673.html</a><br>
<h3>1.引言</h3>
<p>&#160;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　说明编写这份测试计划目的，指出预期的读者。</p>
<p><strong>1.2背景</strong></p>
<p>　　a.待开发系统的名称；<br>　　b.列出本项目的任务提出者、开发者、用户。</p>
<p><strong>1.3定义</strong></p>
<p>　　列出本文件中用到的专门术语的定义和外文首字母组词的原词组。</p>
<p><strong>1.4参考资料</strong></p>
<p>　　列出有关的参考资料。</p>
<p>
<h3>2．计划</h3>
<p>&#160;</p>
<p><strong>2.1系统说明</strong></p>
<p>　　[提供一份图表，并逐项说明被测系统的功能、输入、输出等质量指标，作为叙述测试计划的提纲。]</p>
<p><strong>2.2测试内容</strong></p>
<p>　　[列出组装测试和确认测试中的每一项测试内容的名称标识符、这些测试的进度安排以及这些测试的内容和目的。]</p>
<p><strong>2.3测试1（标识符）</strong></p>
<p>　　[给出这项测试内容的参与单位及被测试的部位。]</p>
<p>　　2.3.1进度安排<br>　　[给出对这项测试的进度安排，包括进行测试的日期和工作内容。]</p>
<p>　　2.3.2条件<br>　　[陈述本项测试工作对资源的要求。包括：]<br>　　a.硬件<br>　　b.软件<br>　　c.人员</p>
<p>　　2.3.3测试资料<br>　　列出本项测试所需的资料。</p>
<p>　　2.3.4测试培训<br>　　说明或引用资料说明为被测系统的使用提供培训的计划。规定培训的内容、受训的人员及从事培训的工作人员。</p>
<p><strong>2.4测试2（标识符）</strong></p>
<p>　　用与本测试计划2。3条相类似的方式说明用于另一项及其后各项测试内容的测试工作计划。<br>　　。。。。。。</p>
<p>,h3&gt;&lt;3．测试设计说明
<h3></h3>
<p>&#160;</p>
<p><strong>3.1测试1（标识符）</strong></p>
<p>　　[说明对第一项测试内容的测试设计考虑。]</p>
<p>　　3.1.1控制<br>　　[说明本测试的控制方式。]</p>
<p>　　3.1.2输入<br>　　[说明本项测试中所使用的输入数据及选择这些输入数据的策略。]</p>
<p>　　3.1.3输出<br>　　[说明预期的输出数据。]</p>
<p>　　3.1.4过程<br>　　[说明完成此项测试的一个个步骤和控制命令。]</p>
<p><strong>3.2测试2（标识符）</strong></p>
<p>　　[用与本测试计划3。1条相类似的方式说明第2项及其后各项测试工作的设计考虑。]<br>　　[。。。。。。]</p>
<p>
<h3>4．评价准则</h3>
<p>&#160;</p>
<p><strong>4.1范围</strong></p>
<p>　　[说明所选择的测试用例能够检查的范围及其局限性。]</p>
<p><strong>4.2数据整理</strong></p>
<p>　　[陈述为了把测试数据加工成便于评价的适当形式，使得测试结果可以同已知结果进行比较而要用到的转换处理技术；如果是用自动方式整理数据，还要说明为进行处理而要用到的硬件、软件资源。]</p>
<p><strong>4.3尺度</strong></p>
<p>　　[说明用来判断测试工作是否能通过的评价尺度，如合理和输出结果的类型、测试输出结果与预期输出之间的容许偏离范围、允许中断或停机的最大数。]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 11:01 <a href="http://www.blogjava.net/yesjoy/articles/125273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(7)数据库设计说明书</title><link>http://www.blogjava.net/yesjoy/articles/125272.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125272.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125272.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125272.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27672.html">http://www.linuxdby.com/html/linux/system/20070505/27672.html</a><br>
<h3>1.引言</h3>
<p>&#160;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　[说明编写这份数据设计说明书的目的，指出预期的读者。]</p>
<p><strong>1.2背景</strong></p>
<p>　　a.[待开发数据库的名称和使用此数据库的软件系统的名称；]<br>　　b.[列出本项目的任务提出者、开发者、用户。]</p>
<p><strong>1.3定义</strong></p>
<p>　　[列出本文件中用到的专门术语的定义和外文首字母组词的原词组。]</p>
<p><strong>1.4参考资料</strong></p>
<p>　　[列出有关的参考资料。]</p>
<p>
<h3>2．外部设计</h3>
<p>&#160;</p>
<p><strong>2.1标识符的状态</strong></p>
<p>　　[联系用途，详细说明用于唯一地标识该数据库的代码、名称或标识符，附加的描述性信息亦要给出。如果该数据库属于尚在实验中、尚在测试中或是暂时使用的，则要说明这一特点及其有效时间范围。]</p>
<p><strong>2.2使用它的程序</strong></p>
<p>　　[列出将要使用或访问此数据库的所有应用程序，对于这些应用程序的每一个，给出它的名称和版本号。]</p>
<p><strong>2.3约定</strong></p>
<p>　　[陈述一个程序员或一个系统分析员为了能使用此数据库而需要了解的建立标号、标识的约定。]</p>
<p><strong>2.4专门指导</strong></p>
<p>　　[向准备从事此数据库的生成、从事此数据库的测试、维护人员提供专门的指导。]</p>
<p><strong>2.5支持软件</strong></p>
<p>　　[简单介绍同此数据库直接有关的支持软件。说明这些软件的名称、版本号的主要功能特性。列出这些支持软件的技术文件的标题、编号及来源]</p>
<p>
<h3>3．结构设计</h3>
<p>&#160;</p>
<p><strong>3.1概念结构设计</strong></p>
<p>　　[说明本数据库将反映的现实世界中的实体、属性和它们之间的关系等的原始数据形式，包括各数据项、记录、系、文卷的标识符、定义、类型、度量单位和值域，建立本数据库的每一幅用户视图。]</p>
<p><strong>3.2逻辑结构设计</strong></p>
<p>　　[说明把上述原始数据进行分解、合并后重新组织起来的数据库全局逻辑结构。]</p>
<p><strong>3物理结构设计</strong></p>
<p>　　[建立系统程序员视图。]</p>
<p>
<h3>4．运用设计</h3>
<p>&#160;</p>
<p><strong>4.1数据字典设计</strong></p>
<p>　　[对数据库设计中涉及到的各种项目一般要建立起数据字典，以说明它们的标识符、同义名及有关信息。]</p>
<p><strong>4.2安全保密设计</strong></p>
<p>　　[说明在数据库的设计中，将如何通过区分不同的访问者、不同的访问类型和不同的数据对象，进行分别对待而获得的数据库安全保密的设计考虑。]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 11:00 <a href="http://www.blogjava.net/yesjoy/articles/125272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(6)概要设计说明书 </title><link>http://www.blogjava.net/yesjoy/articles/125271.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125271.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125271.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125271.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27671.html">http://www.linuxdby.com/html/linux/system/20070505/27671.html</a><br>
<h3>1．引言</h3>
<p>&nbsp;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　[说明编写这份概要设计说明书的目的，指出预期的读者。]</p>
<p><strong>1.2背景</strong></p>
<p>　　a.[待开发软件系统的名称；]<br>　　b.[列出本项目的任务提出者、开发者、用户。]</p>
<p><strong>1.3定义</strong></p>
<p>　　[列出本文件中用到的专门术语的定义和外文首字母组词的原词组。]</p>
<p><strong>1.4参考资料</strong></p>
<p>　　[列出有关的参考资料。]</p>
<p>
<h3>2．总体设计</h3>
<p>&nbsp;</p>
<p><strong>2.1需求规定</strong></p>
<p>　　[说明对本系统的主要的输入输出项目、处理的功能性能要求。包括]</p>
<p>　　2.1.1系统功能</p>
<p>　　2.1.2系统性能<br>　　　　2.1.2.1精度<br>　　　　2.1.2.2时间特性要求<br>　　　　2.1.2.4可靠性<br>　　　　2.1.2.5灵活性</p>
<p>　　2.1.3输入输出要求</p>
<p>　　2.1.4数据管理能力要求</p>
<p>　　2.1.5故障处理要求</p>
<p>　　2.1.6其他专门要求</p>
<p><strong>2.2运行环境</strong></p>
<p>　　[简要地说明对本系统的运行环境的规定。]</p>
<p>　　2.2.1设备<br>　　[列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能。]</p>
<p>　　2.2.2支持软件<br>　　[列出支持软件，包括要用到的操作系统、编译（或汇编）程序、测试支持软件等。]</p>
<p>1　　2.2.3接口<br>　　[说明该系统同其他系统之间的接口、数据通信协议等]</p>
<p>　　2.2.4控制<br>　　[说明控制该系统的运行的方法和控制信号，并说明这些控制信号的来源。]</p>
<p><strong>2.3基本设计概念和处理流程</strong></p>
<p>　　[说明本系统的基本设计概念和处理流程，尽量使用图表的形式。]</p>
<p><strong>2.4结构</strong></p>
<p>　　[给出系统结构总体框图（包括软件、硬件结构框图），说明本系统的各模块的划分，扼要说明每个系统模块的标识符和功能，分层次地给出各模块之间的控制与被控制关系。]</p>
<p><strong>2.5功能需求与系统模块的关系</strong></p>
<p>　　[本条用一张矩阵图说明各项功能需求的实现同各模块的分配关系。]</p>
<center>
<table cellSpacing='"0"' cellPadding='"2"' border='"0"'>
    <tbody>
        <tr>
            <td>　　　</td>
            <td>[系统模块1]</td>
            <td>[系统模块2]</td>
            <td>[&#8230;&#8230;]</td>
            <td>[系统模块m]</td>
        </tr>
        <tr>
            <td>[功能需求1]</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[功能需求2]</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[┇]</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[功能需求n]</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
        </tr>
    </tbody>
</table>
</center>
<p><strong>2.6人工处理过程</strong></p>
<p>　　[说明在本系统的工作过程中不得不包含的人工处理过程。]</p>
<p><strong>2.7尚未解决的问题</strong></p>
<p>　　[说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。]</p>
<p>
<h3>3．接口设计</h3>
<p>&nbsp;</p>
<p><strong>3.1用户接口</strong></p>
<p>　　[说明将向用户提供的命令和它们的语法结构，以及相应的回答信息。]<br>　　[说明提供给用户操作的硬件控制面板的定义。]</p>
<p><strong>3.2外部接口</strong></p>
<p>　　[说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持系统之间的接口关系。]</p>
<p><strong>3.3内部接口</strong></p>
<p>　　[说明本系统之内的各个系统元素之间的接口的安排。]</p>
<p>
<h3>4．运行设计</h3>
<p>&nbsp;</p>
<p><strong>4.1运行模块组合</strong></p>
<p>　　[说明对系统施加不同的外界运行控制时所引起的各种不同的运行模块组合，说明每种运行所历经的内部模块的支持软件。]</p>
<p><strong>4.2运行控制</strong></p>
<p>　　[说明每一种外界的运行控制的方式方法和操作步骤。]</p>
<p><strong>4.3运行时间</strong></p>
<p>　　[说明每种运行模块组合将占用各种资源的时间。]</p>
<p>
<h3>5．系统数据结构设计</h3>
<p>&nbsp;</p>
<p>　　[不涉及软件设计可不包含]</p>
<p><strong>5.1逻辑结构设计要点</strong></p>
<p>　　[给出本系统内软件所使用的每个数据结构的名称、标识符以及它们之中每个数据项、记录、文卷和系的标识、定义、长度及它们之间的层次的或表格的相互关系。]</p>
<p><strong>5.2物理结构设计要点</strong></p>
<p>　　[给出本系统内软件所使用的每个数据结构中的每个数据项的存储要求，访问方法、存取单位、存取的物理关系、设计考虑和保密条件。]</p>
<p><strong>5.3数据结构与程序的关系</strong></p>
<p>　　[说明各个数据结构与访问这些数据结构的各个程序之间的对应关系。]</p>
<center>
<table cellSpacing='"0"' cellPadding='"2"' border='"0"'>
    <tbody>
        <tr>
            <td>　　　</td>
            <td>[程序1]</td>
            <td>[程序2]</td>
            <td>[&#8230;&#8230;]</td>
            <td>[程序m]</td>
        </tr>
        <tr>
            <td>[数据结构1]</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[数据结构2]</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[┇]</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
            <td>　　　</td>
        </tr>
        <tr>
            <td>[数据结构n]</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
            <td>　　　</td>
            <td>　&#8730;　</td>
        </tr>
    </tbody>
</table>
</center>
<p>
<h3>6．系统出错处理设计</h3>
<p>&nbsp;</p>
<p><strong>6.1出错信息</strong></p>
<p>　　[用一览表的方式说明每种可能的出错或故障情况出现时，系统输出信息的形式、含意及处理方法。]</p>
<p><strong>6.2补救措施</strong></p>
<p>　　[说明故障出现后可能采取的变通措施。包括：]<br>　　a.后备技术 [说明准备采用的后备技术，当原始系统数据万一丢失时启用的副本的建立和启动的技术，例如周期性地把磁盘信息记录到磁带上去就是对于磁盘媒体的一种后备技术。]<br>　　b.降效技术 [说明准备采用的后备技术，使用另一个效率稍低的系统或方法来求得所需结果的某些部分，例如一个自动系统的降效技术可以是手工操作和数据的人工记录。]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.恢复及再启动技术 [说明将使用的恢复再启动技术，使软件从故障点恢复执行或使软件从头开始重新运行的方法。] </p>
<p>&#160;</p>
<p><strong>6.3系统维护设计</strong></p>
<p>　　[说明为了系统维护的方便而在程序内部设计中作出的安排，包括在程序中专门安排用于系统的检查与维护的检测点和专用模块。]<br></p>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:58 <a href="http://www.blogjava.net/yesjoy/articles/125271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(5)用户手册 </title><link>http://www.blogjava.net/yesjoy/articles/125270.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125270.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125270.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125270.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27670.html">http://www.linuxdby.com/html/linux/system/20070505/27670.html</a><br>
<h3>1．引言</h3>
<p>&#160;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>1.2背景</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>1.3定义</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>1.4参考资料</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p>
<h3>2．用途</h3>
<p>&#160;</p>
<p><strong>2.1功能</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>2.2性能</strong></p>
<p>　　2.2.1精度<br>
<p>　　[&#8230;&#8230;]</p>
<p>　　2.2.2时间特性<br>　　[&#8230;&#8230;]</p>
<p>　　2.2.3灵活性<br>　　[&#8230;&#8230;]</p>
<p><strong>2.3安全保密</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p>
<h3>3．运行环境</h3>
<p>&#160;</p>
<p><strong>3.1硬设备</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>3.2支持软件</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>3.3数据结构</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p>
<h3>4．使用过程</h3>
<p>&#160;</p>
<p><strong>4.1安装与初始化</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>4.2输入</strong></p>
<p>　　4.2.1输入数据的现实背景<br>　　[&#8230;&#8230;]</p>
<p>　　4.2.2输入格式<br>　　[&#8230;&#8230;]</p>
<p>　　4.2.3输入举例<br>　　[&#8230;&#8230;]</p>
<p><strong>4.3输出</strong></p>
<p>　　4.3.1输出数据的现实背景<br>　　[&#8230;&#8230;]</p>
<p>　　4.3.2输出格式</p>
　　[&#8230;&#8230;]
<p>&#160;</p>
<p>　　4.3.3输出举例<br>　　[&#8230;&#8230;]</p>
<p><strong>4.4文卷查询</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>4.5出错处理与恢复</strong></p>
<p>　　[&#8230;&#8230;]</p>
<p><strong>4.6终端操作</strong></p>
<p>　　[&#8230;&#8230;]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:57 <a href="http://www.blogjava.net/yesjoy/articles/125270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(4)需求说明书</title><link>http://www.blogjava.net/yesjoy/articles/125269.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125269.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125269.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125269.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27669.html">http://www.linuxdby.com/html/linux/system/20070505/27669.html</a><br>
<h3>1．引言</h3>
<p>&#160;</p>
<p><strong>1.1编写的目的</strong></p>
<p>　　说明编写这份需求说明书的目的,指出预期的读者.</p>
<p><strong>1.2背景</strong></p>
<p>　　a. 待开发的系统的名称;<br>　　b.本项目的任务提出者、开发者、用户；<br>　　c.该系统同其他系统或其他机构的基本的相互来往关系。</p>
<p><strong>1.3定义</strong></p>
<p>　　列出本文件中用到的专门术语的定义和外文首字母组词的原词组。</p>
<p><strong>1.4参考资料</strong></p>
<p>　　列出用得着的参考资料。</p>
<p>
<h3>2．任务概述</h3>
<p>&#160;</p>
<p><strong>2.1目标</strong></p>
<p>　　叙述该系统开发的意图、应用目标、作用范围以及其他应向读者说明的有关该系统开发的背景材料。解释被开发系统与其他有关系统之间的关系。</p>
<p><strong>2.2用户的特点</strong></p>
<p>　　列出本系统的最终用户的特点，充分说明操作人员、维护人员的教育水平和技术专长，以及本系统的预期使用频度。</p>
<p><strong>2.3假定和约束</strong></p>
<p>　　列出进行本系统开发工作的假定和约束。</p>
<p>
<h3>3．需求规定 </h3>
<p>&#160;</p>
<p><strong>3.1对功能的规定</strong></p>
<p>　　用列表的方式，逐项定量和定性地叙述对系统所提出的功能要求，说明输入什么量、经怎么样的处理、得到什么输出，说明系统的容量,包括系统应支持的终端数和应支持的并行操作的用户数等指标。</p>
<p><strong>3.2 对性能的规定</strong></p>
<p>　　3.2.1精度<br>　　说明对该系统的输入、输出数据精度的要求，可能包括传输过程中的精度。</p>
<p>　　3.2.2时间特性要求<br>　　说明对于该系统的时间特性要求。</p>
<p>　　3.2.3灵活性<br>　　说明对该系统的灵活性的要求，即当需求发生某些变化时，该系统对这些变化的适应能力。</p>
<p><strong>3.3输入输出要求</strong></p>
<p>　　解释各输入输出数据类型，并逐项说明其媒体、格式、数值范围、精度等。对系统的数据输出及必须标明的控制输出量进行解释并举例。</p>
<p><strong>3.4数据管理能力要求（针对软件系统）</strong></p>
<p>　　说明需要管理的文卷和记录的个数、表和文卷的大小规模，要按可预见的增长对数据及其分量的存储要求作出估算。</p>
<p><strong>3.5故障处理要求</strong></p>
<p>　　列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。</p>
<p><strong>3.6其他专门要求</strong></p>
<p>　　如用户单位对安全保密的要求，对使用方便的要求，对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。</p>
<p>
<h3>4．运行环境规定</h3>
<p>&#160;</p>
<p><strong>4.1设备</strong></p>
<p>　　列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能，包括：<br>　　a.处理器型号及内存容量<br>　　b.外存容量、联机或脱机、媒体及其存储格式，设备的型号及数量<br>　　c.输入及输出设备的型号和数量，联机或脱机；<br>　　d.数据通信设备的型号和数量<br>　　e.功能键及其他专用硬件</p>
<p><strong>4.2支持软件</strong></p>
<p>　　列出支持软件，包括要用到的操作系统、编译程序、测试支持软件等。</p>
<p><strong>4.3接口</strong></p>
<p>　　说明该系统同其他系统之间的接口、数据通信协议等。</p>
<p><strong>4.4控制</strong></p>
<p>　　说明控制该系统的运行的方法和控制信号，并说明这些控制信号的来源。</p>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:57 <a href="http://www.blogjava.net/yesjoy/articles/125269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(3)数据要求说明书 </title><link>http://www.blogjava.net/yesjoy/articles/125268.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125268.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125268.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125268.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27668.html">http://www.linuxdby.com/html/linux/system/20070505/27668.html</a><br>
<h3>1．引言</h3>
<p>&#160;</p>
<p><strong>1.1编写目的</strong></p>
<p>　　说明编写这份数据要求说明书的目的，指出预期的读者。</p>
<p><strong>1.2背景</strong></p>
<p>　　a.待开发软件系统的名称；<br>　　b.列出本项目的任务提出者、开发者、用户以及将运行该项软件的计算站或计算机网络系统。</p>
<p><strong>1.3定义</strong></p>
<p>　　列出本文件中用到的专门术语的定义和外文首字母组词的原词组。</p>
<p><strong>1.4参考资料</strong></p>
<p>　　列出有关的参考资料。</p>
<p>
<h3>2．数据的逻辑描述</h3>
<p>&#160;</p>
<p>　　对数据进行逻辑描述时可把数据分为动态数据和静态数据。</p>
<p><strong>2.1静态数据</strong></p>
<p>　　列出所有作为控制或参考用的静态数据元素。</p>
<p><strong>2.2动态输入数据</strong></p>
<p>　　列出动态输入数据元素。</p>
<p><strong>2.3动态输出数据</strong></p>
<p>　　列出动态输出数据元素。</p>
<p><strong>2.4内部生成数据</strong></p>
<p>　　列出向用户或开发单位中的维护调试人员提供的内部生成数据。</p>
<p><strong>2.5数据约定</strong></p>
<p>　　说明对数据要求的制约。逐条列出对进一步扩充或使用方面的考虑而提出的对数据要求的限制。对于在设计和开发中确定是临界性的限制更要明确指出。</p>
<p>
<h3>3．数据的采集 </h3>
<p>&#160;</p>
<p><strong>3.1要求和范围</strong></p>
<p>　　按数据元的逻辑分组来说明数据采集的要求和范围，指明数据的采集方法，说明数据采集工作的承担者是用户还是开发者。</p>
<p><strong>3.2输入的承担者</strong></p>
<p>　　说明预定的对数据输入工作的承担者。如果输入数据同某一接口软件有关，还应说明该接口软件的来源。</p>
<p><strong>3.3预期处理</strong></p>
<p>　　对数据的采集和预处理过程提出专门的规定，包括适合应用的数据格式、预定的数据通信媒体和对输入的时间要求等。对于需经模拟转换或数字转换处理的数据量，要给出转换方法和转换因子等有关信息，以便软件系统使用这些数据。</p>
<p><strong>3.4影响</strong></p>
<p>　　说明这些数据要求对于设备、软件、用户、开发单位所可能产生的影响。</p>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:55 <a href="http://www.blogjava.net/yesjoy/articles/125268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(2)项目开发计划</title><link>http://www.blogjava.net/yesjoy/articles/125266.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125266.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125266.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125266.html</trackback:ping><description><![CDATA[转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27667.html">http://www.linuxdby.com/html/linux/system/20070505/27667.html</a><br>
<h3>1. 引言</h3>
<p>&#160;</p>
<p><strong>1.1 编写目的</strong></p>
<p>　　[说明编写这份项目开发计划的目的，并指出预期的读者。]</p>
<p><strong>1.2 背景</strong></p>
<p>　　a. 待开发软件系统的名称；<br>　　b.本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络；<br>　　c.该软件系统同其他系统或其他机构的基本的相互来往关系。</p>
<p><strong>1.3 定义</strong></p>
<p>　　[列出本文件中用到的专门术语的定义和外文首字母组词的原词组。]</p>
<p><strong>1.4 参考资料</strong></p>
<p>　　[列出用得着的参考资料。]</p>
<p>
<h3>2. 项目概述</h3>
<p>&#160;</p>
<p><strong>2.1 工作内容</strong></p>
<p>　　[简要地说明在本项目的开发中须进行的各项主要工作。 ]</p>
<p><strong>2.2 主要参加人员</strong></p>
<p>　　[扼要地说明参加本项目开发工作的主要人员的情况，包括他们的技术水平。]</p>
<p><strong>2.3 产品</strong></p>
<p>　　2.3.1 程序<br>　　[列出需移交给用户的程序的名称、所用的编程语言及存储程序的媒体形式，并通过引用有关文件。逐项说明其功能和能力。]</p>
<p>　　2.3.2.文件 <br>　　[列出需移交给用户的每种文件的名称及内容要点。]</p>
<p>　　2.3.3.服务<br>　　[列出需向用户提供的各项服务。 ]</p>
<p>　　2.3.4.非移交的产品 <br>　　[说明开发集体应向本单位交出但不必向用户移交的产品。 ]</p>
<p><strong>2.4 验收标准 </strong></p>
<p>　　[对于上述这些应交出的产品和服务，逐项说明或引用资料说明验收标准。]</p>
<p><strong>2.5 [完成项目的最迟期限]</strong></p>
<p><strong>2.6 [本计划的批准者和批准日期]</strong></p>
<p>
<h3>3. 实施计划</h3>
<p>&#160;</p>
<p><strong>3.1 工作任务的分解与人员分工</strong></p>
<p>　　[对于项目开发中需完成的各项工作，从需求分析、设计、实现、测试直到维护，包括文件的编制、审批、打印、分发工作，用户培训工作，软件安装工作等，按层次进行分解，指明每项任务的负责人和参加人员。]</p>
<p><strong>3.2 接口人员</strong></p>
<p>　　[说明负责接口工作的人员及他们的职责。]</p>
<p><strong>3.3 进度</strong></p>
<p>　　[对于需求分析、设计、编码实现、测试、移交、培训和安装等工作，给出每项工作任务的预定的开始日期、完成日期及所需资源，规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件。]</p>
<p><strong>3.4 预算</strong></p>
<p>　　[逐项列出本开发项目所需要的劳务以及经费的预算和来源。]</p>
<p><strong>3.5 关键问题</strong></p>
<p>　　[逐项列出能够影响整个项目成败的关键问题、技术难点和风险，指出这些问题对项目的影响。]</p>
<p>
<h3>4.支持条件</h3>
<p>&#160;</p>
<p>　　[说明为支持本项目的开发所需要的各种条件和设施。]</p>
<p><strong>4.1 计算机系统支持</strong></p>
<p>　　[逐项列出开发中和运行时所需的计算机系统支持，包括计算机、外围设备、通讯设备、模拟器、编译程序、操作系统、数据管理程序包、数据存储能力和测试支持能力等，逐项给出有关到货日期、使用时间的要求。]</p>
<p><strong>4.2 需由用户承担的工作</strong></p>
<p>　　[逐项列出需要用户承担的工作和完成期限，包括需由用户提供的条件及提供时间。]</p>
<p><strong>4.3 需由外单位提供的条件</strong></p>
<p>　　[逐项列出需要外单位分合同承包者承担的工作和完成的时间。]</p>
<p>
<h3>5.专题计划要点</h3>
<p>&#160;</p>
<p>　　[说明本项目开发中需制订的各个专题计划的要点。]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:53 <a href="http://www.blogjava.net/yesjoy/articles/125266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO软件工程模板(1)可行性研究报告 </title><link>http://www.blogjava.net/yesjoy/articles/125265.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 20 Jun 2007 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/125265.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/125265.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/125265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/125265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/125265.html</trackback:ping><description><![CDATA[<p>转贴来自：<a href="http://www.linuxdby.com/html/linux/system/20070505/27666.html">http://www.linuxdby.com/html/linux/system/20070505/27666.html</a><br></p>
<h3>1. 引言</h3>
<p>&#160;</p>
<p><strong>1.1 编写目的</strong></p>
<p>　　[编写本可行性研究报告的目的，指出预期的读者。]</p>
<p><strong>1.2 背景</strong></p>
<p>　　a.[所建议开发的软件系统的名称；]<br>　　b.[本项目的任务提出者、开发者、用户及实现该软件的计算站或计算机网络；]<br>　　c.[该软件系统同其他系统或其他机构的基本的相互来往关系。]</p>
<p><strong>1.3 定义</strong></p>
<p>　　[列出本文件中用到的专门术语的定义和外文首字母组词的原词组。]</p>
<p><strong>1.4 参考资料</strong></p>
<p>　　[列出用得着的参考资料。]</p>
<p>
<h3>2. 可行性研究的前提</h3>
<p>&#160;</p>
<p>　　[说明对所建议开发的软件的项目进行可行性研究的前提。]</p>
<p><strong>2.1 要求</strong></p>
<p>　　[说明对所建议开发的软件的基本要求。]</p>
<p><strong>2.2 目标</strong></p>
<p>　　[说明所建议系统的主要开发目标。]</p>
<p><strong>2.3 条件、假定和限制</strong></p>
<p>　　[说明对这项开发中给出的条件、假定和所受到期的限制。]</p>
<p><strong>2.4 进行可行性研究的方法</strong></p>
<p>　　[说明这项可行性研究将是如何进行的，所建议的系统将是如何评价的，摘要说明所使用的基本方法和策略。]</p>
<p><strong>2.5 评价尺度</strong></p>
<p>　　[说明对系统进行评价时所使用的主要尺度。]</p>
<p>
<h3>3. 对现有系统的分析</h3>
<p>&#160;</p>
<p>　　[这里的现有系统是指当前实际使用的系统，这个系统可能是计算机系统，也可能是一个机械系统甚至是一个人工系统。]<br>　　[分析现有系统的目的是为了进一步阐明建议中的开发新系统或修改现有系统的必要性。]</p>
<p><strong>3.1 处理流程和数据流程</strong></p>
<p>　　[说明现有系统的基本的处理流程和数据流程。此流程可用图表即流程图的形式表示，并加以叙述。]</p>
<p><strong>3.2 工作负荷</strong></p>
<p>　　[列出现有系统所承担的工作及工作量。]</p>
<p><strong>3.3 费用开支</strong></p>
<p>　　[列出由于运行现有系统所引起的费用开支。]</p>
<p><strong>3.4 人员</strong></p>
<p>　　[列出为了现有系统的运行和维护所需要的人员的专业技术类别和数量。]</p>
<p><strong>3.5 设备</strong></p>
<p>　　[列出现有系统所使用的各种设备。]</p>
<p><strong>3.6 局限性</strong></p>
<p>　　[列出本系统的主要局限性。]</p>
<p>
<h3>4. 所建议的系统</h3>
<p>&#160;</p>
<p><strong>4.1 对所建议系统的说明</strong></p>
<p>　　[概括地说明所建议系统，并说明在第2条中列出的那些要求将如何得到满足，说明所使用的基本方法及理论根据。]</p>
<p><strong>4.2 处理流程和数据流程。</strong></p>
<p>　　[给出所建议系统的处理流程式和数据流程。]</p>
<p><strong>4.3 改进之处</strong></p>
<p>　　[按2.2条中列出的目标，逐项说明所建议系统相对于现存系统具有的改进。]</p>
<p><strong>4.4 影响</strong></p>
<p>　　[说明新提出的设备要求及对现存系统中尚可使用的设备须作出的修改。]
<p>
<p>　　4.4.1.对设备的影响<br>　　[说明新提出的设备要求及对现存系统中尚可使用的设备须作出的修改]</p>
<p>　　4.4.2.对软件的影响<br>　　[说明为了使现存的应用软件和支持软件能够同所建议系统相适应，而需要对这些软件所进行的修改和补充。]</p>
<p>　　4.4.3.对用户单位机构的影响<br>　　[说明为了建立和运行所建议系统，对用户单位机构、人员的数量和技术水平等方面的全部要求。]</p>
<p>　　4.4.4.对系统运行过程的影响<br>　　[说明所建议系统对运行过程的影响。]</p>
<p>　　4.4.5.对开发的影响<br>　　[说明对开发的影响。]</p>
<p>　　4.4.6.对地点和设施的影响<br>　　[说明对建筑物改造的要求及对环境设施的要求。]</p>
<p>　　4.4.7.对经费开支的影响<br>　　[扼要说明为了所建议系统的开发，统计和维持运行而需要的各项经费开支。]</p>
<p><strong>4.5 技术条件方面的可能性</strong></p>
<p>　　[本节应说明技术条件方面的可能性]</p>
<p>
<h3>5. 可选择的其他系统方案</h3>
<p>&#160;</p>
<p>　　[扼要说明曾考虑过的每一种可选择的系统方案，包括需开发的和可从国内国外直接购买的，如果没有供选择的系统方案可考虑，则说明这一点。]</p>
<p><strong>5.1 可选择的系统方案1</strong></p>
<p>　　[说明可选择的系统方案1，并说明它末被选中的理由。]</p>
<p><strong>5.2 可选择的系统方案2</strong></p>
<p>　　[按类似5。1条的方式说明第2个乃至第n个可选择的系统方案。]<br>　　[&#8230;&#8230;]</p>
<p>
<h3>6. 投资及效益分析</h3>
<p>&#160;</p>
<p><strong>6.1 支出</strong></p>
<p>　　[对于所选择的方案，说明所需的费用，如果已有一个现存系统，则包括该系统继续运行期间所需的费用。]</p>
<p>　　6.1.1 基本建设投资<br>　　[包括采购、开发和安装所需的费用。]</p>
<p>　　6.1.2 其他一次性支出 </p>
<p>　　6.1.3 非一次性支出<br>
<p>　　[列出在该系统生命期内按月或按季或按年支出的用于运行和维护的费用。]</p>
<p><strong>6.2 收益</strong></p>
<p>　　[对于所选择的方案，说明能够带来的收益，这里所说的收益，表现为开支费用的减少或避免、差错的减少、灵活性的增加、动作速度的提高和管理计划方面的改进等，包括：</p>
<p>　　6.2.1 一次性收益]<br>　　[说明能够用人民币数目表示的一次性收益，可按数据处理、用户、管理和支持等项分类叙述。]</p>
<p>　　6.2.2 非一次性收益<br>　　[说明在整个系统生命期内由于运行所建议系统而导致的按月的、按年的能用人民币数目表示的收益，包括开支的减少和避免。]</p>
<p>
<p　　>6.2.3 不可定量的收益<br>　　[逐项列出无法直用人民币表示的收益。] </p>
<p>&#160;</p>
<p><strong>6.3 收益/投资比</strong></p>
<p>　　[求出整个系统生命期的收益/投资比值。]</p>
<p><strong>6.4 投资回收周期</strong></p>
<p>　　[求出收益的累计数开始超过支出的累计数的时间。]</p>
<p><strong>6.5 敏感性分析</strong></p>
<p>　　[是指一些关键性因素与这些不同类型之间的合理搭配、处理速度要求、设备和软件的配置等变化时，对开支和收益的影响最灵敏的范围的估计。]</p>
<p>
<h3>7. 社会因素方面的可能性</h3>
<p>&#160;</p>
<p><strong>7.1.[法律方面的可行性]</strong></p>
<p><strong>7.2.[使用方面的可行性]</strong></p>
<p>
<h3>8. 结论</h3>
<p>&#160;</p>
<p>　　[在进行可行性研究报告的编制时，必须有一个研究的结论]</p>
</span>
<img src ="http://www.blogjava.net/yesjoy/aggbug/125265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2007-06-20 10:51 <a href="http://www.blogjava.net/yesjoy/articles/125265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷软件开发（下篇）</title><link>http://www.blogjava.net/yesjoy/articles/62680.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 09 Aug 2006 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/62680.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/62680.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/62680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/62680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/62680.html</trackback:ping><description><![CDATA[
		<h2>敏捷软件开发（下篇）</h2>
		<hr width="95%" color="red" size="1" />
		<font size="2">NetReptile推荐 [2005-7-17]</font>
		<br />
		<font size="2">出处：ZDNet</font>
		<br />
		<font size="2">作者：Brian Swan</font>
		<br />
		<font size="2"> <font size="+0"><br /><br /><p></p><p></p><p>在敏捷软件开发方法上中下系列的最后一篇文章里，我们将探讨开发小组如何与客户交互，如何让其参与到开发过程里来。</p><p>在《敏捷软件开发》上中下系列的上篇里，我们了解了开发人员做法以及技术优势如何带来质量的显著提高。在中篇里，我们探讨了开发小组做法以及如何建立一个效率最高的开发小组，并重点研究了代码编写标准、连续集成和用于描述系统的通用语言。现在，我们要看看最外面的圆环——“统一小组做法（one team practice）”，这其中包括开发人员、测试人员和客户——并帮助更好地协调业务和IT。</p><p>协调业务和IT——“统一小组”做法<br />敏捷软件开发里的统一小组指的是敏捷开发小组和所有的利益相关人为了一个共同的目标结成一个团队工作。尽管小组里的每个成员都必须把各自主要精力放在具体的任务上，但是小组更喜欢开放的、真诚的和频繁的沟通，而不是暗地里的操作。</p><p>统一小组强调由开发人员作出技术决定而由客户作出业务决定，一贯如此，毫无例外。高度的交流，例如每日例会以及项目辐射（在《中篇》里讨论过）会帮助增加交流并不断持续下去，以确保及时获得频繁的反馈信息。</p><p>这一概念对于将敏捷开发的所有元素集中到一起是必需的。</p><p>创建背景并取得需求——第一步<br />在你开始敏捷开发的这一部分之前，从客户、业务方和用户取得需求信息；他们才是定义需求的人。由于业务方在这些做法中扮演了至关重要的角色，所以他们必须完全理解自己在敏捷开发环境里的角色是什么，以及他们能够做到什么。让其高速运转起来肯定需要进行讨论会和其他培训工作。</p><p>在解释敏捷开发的时候，需要向业务人员阐明的重要优势有：</p><ol><li>能够，在任何时候，改变其对最小成本的观点。 
</li><li>能够根据来自市场或其他地方的反馈进行调整和应变。 
</li><li>在任何时候都知道项目的状态，并具备可预见能力。 
</li><li>能够从业务的角度参与项目的指导工作。 </li></ol><p><em>重要的成功因素</em></p><ul><li>理解——客户将需要某种程序的培训才能确切地理解他们在敏捷开发环境里扮演的角色。 
</li><li>沟通——以协作的形式与客户进行交谈和沟通是十分重要的。在整个项目过程中都应该这样，但是从一开始就坚持这样显得尤其重要。 </li></ul><p>客户／业务方介入——第二步<br />在这一步骤里，我们要通过用户的素材和验收测试让客户参与到开发过程里来。很多客户可能在编写用户素材或者验收测试上经验不多或者完全没有经验；再强调一次，可能需要某种程度的讨论会或者培训来帮助其完成任务。</p><p><b>用户的素材</b><br />用户的素材就是“需求”。每个素材都代表系统需要如何解决某个特定的问题。然而，用户的素材不是大量的写满需求的文档，而是写在素材卡上，应该作为实现更进一步谈话的引子。</p><p><b>好的素材需要什么？</b><br />客户，或者更加常见的客户小组，需要聚在一起，在一张5x3寸的素材卡上为系统编写用户素材。我们用财物管理软件公司3Q Solutions来作为例子：</p><p>“客户希望能够获得一个规则引擎，从而可以用规则来评估顾客的经济状态。”</p><p>这一要求或者素材存在的问题是太不明确。编写好素材卡的正确规则应该是INVEST：</p><p><strong>独立的</strong><strong>（</strong><strong>I</strong>ndependent）<br />可协商的（<strong>N</strong>egotiable）<br />垂直的（<strong>V</strong>ertical）<br />可估计的（<strong>E</strong>stimable）<br />短小的（<strong>S</strong>mall）<br />可测试的（<strong>T</strong>estable）</p><p>面的素材显然是不可估计的（很难判断它需要花多长时间）、不短小的（这是一个非常巨大的、不明确的要求），也是不可测试的（你如何能够对像这样的要求进行由测试驱动的开发工作？）。所以下面这样一个素材可能会更好：</p><p>“客户希望能够分析顾客当前拥有的现金量——太多、太少，还是刚刚好（取决于生活方式的成本和对风险的态度）。”</p><p>这一素材就满足了我们INVEST标准的所有要求。当这个素材在小组（客户和开发方）中讨论的时候，它很明显地就传达了客户真正需要的是具备说明规则引擎的能力。上面的例子表明，一条规则就足够说明用户的需要。这就是编写素材的方法。重要的是，素材要引发产生对话，而对话带来对客户需求的明确和真正理解。</p><p><b>沟通</b><br />要记住，素材的主导思想是，它们是发生更进一步对话的引子。其原因是语言要以上下文和理解为基础。没有提问，没有对话，我们将无法体会其中微妙的含义。我们就以Matt Cohn’s Buffalo这个短语为例子。Buffalo（布法罗市）是美国纽约州的一座城市，是野牛（bison）的同义词，还有动词“欺骗和困惑”的意思。所以这样一个句子“Buffalobuffalobuffalobuffalo”是成立的。或者更加明确一点就是来自（纽约州）布法罗市的野牛欺骗了其他的野牛（bison from Buffalo (NY) intimidate and confuse other buffalo）。所以如果没有上下文，这个短语就是毫无意义的。</p><p>在每张素材卡的背面，我们建议客户快速记下任何有关验收测试的想法。</p><p><b>验收测试</b><br />验收测试用来保证：</p><ol><li>客户确信给定的功能能够满足设计的要求。 
</li><li>给予开发人员一个明确的停止点：当验收测试通过的时候，功能就被实现了。 </li></ol><p>在敏捷开发项目里，客户要编写所有的验收测试。在项目初期，开发人员可能需要与客户紧密合作，以编写验收测试的内容。</p><p>我们还建议你使用AT框架并将测试自动化。开人员人需要能够随着他们不断加入新功能而反复地运行这些测试。</p><p>下面就是与上述素材相关的AT框架的例子。</p><p>交互测试（示例）</p><p>//概述<br />“分析顾客的现金收支状况，考察他们在给定的生活方式成本和对风险的态度的条件下是否握有过多的现金。”</p><p></p><table cellspacing="3" cellpadding="0" width="400" border="0"><tbody><tr><td><p>//设置顾客数据</p></td><td><p> </p></td><td><p> </p></td></tr><tr><td><p>UserClicksMainMenu</p></td><td><p>MenuFinancialObjectives</p></td><td><p> </p></td></tr><tr><td><p>UserInputsText</p></td><td><p>FinancialObjectivesAttitudeToRisk</p></td><td><p>“3－低回报－长线投资”</p></td></tr><tr><td><p>UserClicksMainMenu</p></td><td><p>MenuCurrentBalanceSheet</p></td><td><p> </p></td></tr><tr><td><p>UserInputsText</p></td><td><p>CurrentBalanceSheetTotalCash</p></td><td><p>30000</p></td></tr><tr><td><p>UserClicksMainMenu</p></td><td><p>MenuFinancialObjectives</p></td><td><p> </p></td></tr><tr><td><p>UserInputsText</p></td><td><p>FinancialObjectivesLifestyleCost</p></td><td><p>25000</p></td></tr><tr><td><p>//现金规则</p></td><td><p> </p></td><td><p> </p></td></tr><tr><td><p>TestValueOfText</p></td><td><p>AnalyseObservation</p></td><td><p>“如果担心风险，你应该维持不超过#12,500的现金结余。”</p></td></tr><tr><td><p>TestValueOfText</p></td><td><p>AnalyseRecommendation</p></td><td><p>“考虑将#17,500从现金帐户转移到可投资的资产上。”</p></td></tr><tr><td><p>TestValueOfText</p></td><td><p>AnalyseDestination</p></td><td><p>“查询投资本金总额，将多余的现金转移到现金存储帐户，除非用现金购买资产。”</p></td></tr><tr><td><p>//hyperlink</p></td><td><p> </p></td><td><p> </p></td></tr><tr><td><p>UserClicksControl</p></td><td><p>AnalyseDestination</p></td><td><p> </p></td></tr><tr><td><p>TestValueOfLabel</p></td><td><p>WorkAreaTitle</p></td><td><p>“本金总额”</p></td></tr></tbody></table><p>在3Q公司，客户会编写验收测试，并以电子文本的形式每天提交给开发小组。所有的验收测试都会被尽早地提供给开发小组。这一过程与测试－编码－重整循环配合得相当好，它使得开发人员可以在进行验收测试失败之后，运行通过测试－编码－重整循环，然后重新运新验收测试，直到看到其通过测试。每个素材都可能多次进行验收测试，但是一旦所有的验收测试都通过了，那么该素材／功能的实现就完成了。</p><p><em>重要的成功因素</em></p><ul><li>不慌不忙——用户素材不容易写好，所以在进行首批任务和讨论任务的时候给自己充裕的时间。 
</li><li>验收测试帮助——开发人员可能需要从一开始就与客户一起编写验收测试。专门为这一任务拨出时间——好的验收测试将带来不同寻常的收获。 
</li><li>寻求帮助——如果意识到你和你的小组需要帮助——去寻求帮助吧，不要犹豫！ 
</li><li>已有的需求文档——如果有现成的需求文档，你要将它用作编写素材的基础。要记住，把这些文档当作“新的”素材。它们是对话的要点，而不是定好的要求。 </li></ul><p>策划——第三步<br />敏捷软件开发有三个层次的策划：</p><ol><li>高层次的发布策划，在这里策划项目的所有发布。这通常取决于项目的规模，但是某些项目的多次发布要求对长达18个月的期限的高层次策划。 
</li><li>发布策划，第一次发布在这里被策划。每次发布之间的间隔为3个月。 
</li><li>反复策划，通过其来策划下两个星期的工作。 </li></ol><p>这一三级策划过程的目的是让小组首先理解最终的目标，但是只详细策划他们现在所知的内容——未来两周的工作。</p><p><b>发布策划</b><br />在高层次发布策划阶段，客户和开发人员应该在一起共同讨论和理解整个系统。通常已经存在的需求文档能够用于启动这一讨论。在理想状况下，客户应该在开会的时候带上含有即将发布的大多数内容的素材卡。</p><p>在会议过程中，开发人员将需要估计素材的难度。这可以在会议过程中或者在会议之后进行。我们建议每个人相互比较各自素材，并把具有相同难度的素材集中到一起。然后，使用一个从最简单到最难的测量表，你就可以开始估计每个素材（的难度了）。小组使用不同的方法来给素材评分，按照难度分别打上1到10分。</p><p>现在客户能够策划最初的高层次发布计划了。高层次发布并不一定要十分精确，优先顺序和估计都不需要很可靠，但是它会为小组定下方向和提供决策的足够信息。</p><p><b>小型发布</b><br />下一步，客户需要拿走估计好的素材卡，并根据最近一个发布将素材的重要性的优先顺序排列好。客户需要考虑它们需要系统立即实现什么，因而这些素材将构成即将进行的发布。这些估计在这里变得十分重要，因为开发人员已经估计的是他们能够给定的发布时间里完成什么；（这个给定的时间）在大多数情况下是3个月。</p><p>短期发布循环可以保证紧密的反馈循环，还能让小组把精力放在与项目紧密相关的重要目标上。</p><p><b>反复策划</b><br />现在小组需要为未来两周制定具体的计划。再强调一次，客户必须将素材的优先顺序排列出来，详细说明他们希望在未来两周里看到的功能。</p><p>这些素材卡然后就被放到两周的反复（发布里）。最近的一次反复将是小组立即进行的工作。他们将交付这个反复，也就是全力工作、软件测试和取得反馈（即再次为未来两周策划），然后再次开始。如果素材在一个反复之前就完成了，开发人员会要求获得更多的素材。如果所有的素材都看起来是无法完成的，那么开发人员和客户要共同将素材移到下一个反复里或者适当地分割一下素材。</p><p>两周的反复让客户可以充分利用任何变化。例如，3Q公司碰到了一个很有预见能力的客户。他意识到一个按计划放在发布后期的素材事实上需要更早完成。在经过一个简短的讨论之后，小组用客户要求的素材替换掉了当前发布里具有同等价值的素材。那么成本呢？只是一个15分钟的对话。</p><p>以上只是对策划过程如何工作的简要概述。我们建议寻求对该过程这一部分的一些帮助或者指导，因为它可能会十分复杂，仔细调整常常也是必需的。</p><p>这一反复过程和发布策划分别要每两个星期和每三个月进行一次。</p><p><em>重要的成功因素</em></p><ul><li>在反复中期进行一次检查——尽早检查小组在反复中期的进展情况。 
</li><li>估计就是这样——小组一开始的估计常常会偏离甚远——开发人员都是乐观主义者！但是随着小组进展到新的反复并适应这一过程，估计（的准确性）或者速度（小组工作有多快）就会确定下来。 
</li><li>昨天的天气——一旦完成了一个反复，你将对小组的速度有一个粗略的概念——两个星期里可以交付多少素材。这就是小组认可的在未来两周里的速度和小组工作量。随着小组的成熟，具备更好地进行估计的能力，你的速度可能会提高，然后固定在一个稳定的速度上。 
</li><li>速度不是一根棍子——而是对管理者的提醒——速度不是用来鞭打小组的大棒；它是用来测量自然波动的。 
</li><li>决策——客户或者客户小组必须具有决策权，或者能够迅速进行决策，尤其是在需要变化或者适应的时候。 
</li><li>协商的意愿——客户必须愿意就范围等内容进行协商。这才是敏捷开发的工作方式：就范围进行协商，排列最具业务价值的功能的优先顺序。 </li></ul><p>敏捷开发里的策划可能会很困难，所以我们建议你去寻求一些帮助，并花时间来完成它。</p><p>保持高效——第四步<br />逐步推进这一过程的最佳方法之一是有一个在现场的客户。最理想的方法是让客户坐在小组成员当中，这样就可以随时回答问题。这限制了开发人员的随意猜想。此外，在现场的客户能够以最快的速度回答开发人员的疑问。</p><p>这并不意味着这个客户不去从事他的“日常”工作，而是说他就在周围准备好回答问题。即使隔着一层楼也会影响沟通。要进行面对面的对话，而不是用电话或者电子邮件。</p><p>显然，设置现场客户并不总是可能的，在这种情况下，他应该尽可能地接近小组，并尽可能地参加每日例会。如果这也不可能，那么你就要让他参加日常会议——至少一周一次——以确保你在不断地去的反馈意见和沟通。</p><p>对反馈和沟通的增加也需要定期进行回顾。这最好应该在每个反复结尾的时候进行。这样的回顾能够让小组有机会坐下来检查上一个反复，并弄清楚什么做得好、什么做得不好，以及下一次能够把什么做得更好。应该问三个问题：什么有用？什么没有用？我们要改进什么？</p><p><em>重要的成功因素</em></p><ul><li>现场与否？——现场客户或许会带来一些问题，但是如果可能的话还是要找一个现场客户。如果无法实现，就要寻找其他的途径来确保定期的沟通。 
</li><li>回顾——把在每次反复结束的时候进行回顾作为一条纪律定来下，并把人们的想法付诸行动。 </li></ul><p>我们刚刚更加仔细地探讨了《上篇》里第一个图表的外层圆环，它需要所有参与者的同意。这可能是敏捷开发里最困难的一部分，但是它能够很好地协调业务和IT，而且其好处不仅对于业务而且对于IT也是很有价值的。</p><p>总结<br />尽管在本系列里我们向你讲解了如何一步步地培养敏捷软件开发的能力，以及如何从内到外树立开发人员的信心，然后是开发小组的信心，最后是整个项目小组的信心。从在Exoftware公司的经验可以看出，很多公司都选择为某个项目建立一个完整的敏捷开发实验小组，并让一个指导老师手把手地帮助小组。如果你选择这一方法，你将具有从所有做法直接获得好处的优势，此外，它将给你适应你具体环境的有价值的信息。简单地说有：</p><p><b>实验性的敏捷软件开发——如何开始</b><br /><i>你的目标是什么？</i><br />评估你现在所处的位置以及你想要去哪里，这对于使用敏捷开发做法来说是至关重要的。这将帮助你确定希望取得的预期成果。对其的外部评估常常也是很有用的，因为它们将为处理你的问题提供一个客观的视角。</p><p><i>实验性的敏捷开发</i><br />虽然我们已经叙述了开发敏捷开发的一种方法，但是在一个项目上引导实现敏捷开发是理解敏捷开发方法是否适用于你的机构的最佳方法，它还会帮助你了解如何适应自己的环境。</p><p><i>测量标准</i><br />如果可能的话，你要在项目开始前或者在实现敏捷开发做法之前收集一些测量标准。即使这些标准来自于其他的项目，它们也将有助于为敏捷开发已经实现的内容提供一个良好的基准。你还要确保能够在敏捷开发项目过程中以及之后收集到一些高标准的测量标准。缺陷率、测试内容或者最终期限都是很好的且简单易行的高标准测量标准。</p><p><i>环境</i><br />要明白实验性的敏捷开发可能要求对你的物理环境进行一些改变。例如，开放的工作空间是敏捷开发真正起效的必要条件。</p><p><i>寻求帮助</i><br />外部的帮助能够指导你的实验性项目迈向成功。它能够帮助你理解你在哪里以及你想去哪里，并且能够向你指明如何让敏捷开发适应你的环境，从而到达这一目标。此外，外部帮助可以确保小组集中精力回答随时出现的问题。为将敏捷开发应用到其他工程小组里而树立一个业务案例也是十分重要的。</p><p><i>Brian Swan是<a href="http://www.exoftware.com/"><font color="#78ba00">Exoftware公司</font></a>教授敏捷开发的指导老师。他在敏捷开发的技术和管理方面具有相当丰富的经验，曾经带领很多小组成功地转换到了敏捷开发，并以敏捷开发的思想和做法来培训开发人员和管理人员。他在Exoftware公司和在敏捷开发方面的工作使他到过很多公司，并对其开发小组产生了持续的、积极的影响。Brian先前的经验还包括担任Napier大学的讲师，讲授软件开发和人机互动。Brian可以通过<a href="mailto:bswan@exoftware.com?Subject=Builder Article"><font color="#78ba00">电子邮件</font></a>联系上。</i></p><p></p><p></p><p> </p></font></font>
<img src ="http://www.blogjava.net/yesjoy/aggbug/62680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2006-08-09 23:33 <a href="http://www.blogjava.net/yesjoy/articles/62680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷软件开发（中篇） </title><link>http://www.blogjava.net/yesjoy/articles/62679.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 09 Aug 2006 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/62679.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/62679.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/62679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/62679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/62679.html</trackback:ping><description><![CDATA[
		<h2>敏捷软件开发（中篇） </h2>
		<br />
		<font size="2">NetReptile推荐 [2005-7-17]</font>
		<br />
		<font size="2">出处：ZDNet</font>
		<br />
		<font size="2">作者：Brian Swan</font>
		<br />
		<font size="2"> <font size="+0"><br /><br /><p></p><p>在《敏捷软件开发》上中下系列的上篇里，我们探讨了开发人员做法，也回顾了技术优势如何大幅提高软件质量。第一部分把重点主要放在了测试－编码－重整循环上。现在我们转到中间一个圆环，看看敏捷开发做法如何在小组这一层次发挥作用。</p><p><img src="http://tk.files.storage.msn.com/x1pxOYwqu4SjF6-9eGuLAtm5ieNloxalwGqqoxj7TWRO_vbNpBGCZdoPM6JujDdF8aqnQYzsWttm0DZRiXG745No6fjjb7y3kIgzXL879I1pcbxzg5HsbTeySS-2gQf8M2V_XLoYRNvYIpypvQsvSG4_su-frLwaB2j" /></p><p>让小组高效工作——小组做法<br />一旦每个开发人员都在紧密围绕中心圆环的反馈循环工作时，我们就可以看看整个开发小组能够如何以更加敏捷的方式工作。小组这一层次的做法是敏捷开发的核心，因为它们能够显示出小组成员可以如何更加高效地一起工作并推动共同进行技术决策。我们将分别从四个方面来讨论小组的这种改变——设定基调、基于小组的代码编写标准、提高和保持效率、采用“统一小组”方式（包括与开发小组直接相关的东西）的首要步骤。我们给你举的例子来自于3Q Solutions公司，这是一家生产财物管理系统并完全使用敏捷开发方法的软件公司。</p><p>设定基调——第一步<br />敏捷软件开发的一个中心思想是小组朝着一个共同的目标工作。尽管很多流程都提倡小组工作，但是敏捷开发（真正）融合了支持小组工作的做法，并将小组工作放到了日常做法里。在开始讨论小组做法之前，我们需要先为小组设定一个基调，让他们开始感觉更像是一个真正的小组。</p><p><b>开放的工作空间</b><br />为更加开放的、基于小组的敏捷开发方式设定基调的一种最佳方法是为小组创造一种开放的工作空间（open workplace）。这意味着要建立一个或多个开放的区域，并尽最大可能进行沟通和合作。你想要专门了解什么样的环境能够让配对编程更容易。小格间和办公室是与敏捷开发开放工作空间格格不入的，所以应该避免其出现。在一家与Exoftware有合作关系的公司里，开放空间区域只被用于工作，里面只有用于配对编程、集成和构建软件的机器。其它的所有区域都留给带有Internet连接和电话的个人计算机。如果你有这样的空间，这就是应该考虑的东西，因为它有助于清楚地表明“当我们在工作区的时候，我们在工作”。</p><p>不要低估开放的工作空间对于小组的重要性——这就是为什么我们将其作为第一步的原因。下面的一幅照片就是是3Q Solutions开发小组的工作空间。</p><p><img src="http://tk.files.storage.msn.com/x1pxOYwqu4SjF6-9eGuLAtm5ieNloxalwGqqoxj7TWRO_sm6vc-ddh8koIJCgO88jwxGpzL9LLHuQv4_hc1ttcobuabD2eXs5jgTtsIP946PEYrvqz_KClCzJ9IEm-13ag4obPnmRP0tEYT7e2S72wYw53PY6mU5-wi" /></p><p>请注意，两张大桌子（下面没有文件柜）被摆在一起，构成了最适合配对编程的办公桌。</p><p><b>集体主义主人翁精神</b><br />我们想要介绍的下一个思想是集体主义主人翁精神（Collective Ownership）。敏捷编程的这种中心思想是让每一个人都对整个系统负责，每一个人都有更改代码的自由。这是一种重要的思维方法，因为它让小组的注意力都集中到了项目上，从而确保有一个共同的目标。与配对编程相关的其它步骤也强调这种思想，但是尽早引入这种思想是非常好的。</p><p><b>简单设计</b><br />敏捷开发崇尚简单的渐进设计，而不是剧烈的颠覆式设计。其目标是（首先）只指设计我们所了解的项目的那些部分，仅此而已，然后让该设计随着时间的推移而逐渐改进，这有助于提高灵活性并将变化导致的成本最小化。</p><p>我们就从3Q Solutions公司举一个例子，有一个客户要求获得一个规则引擎（rules engine）。小组传统的做法是花上数月时间开发规则引擎，然后可能还是无法把它卖出去。在与客户共同协商的情况下，小组决定设计一个满足规则引擎工作要求的最简单系统，并为每一条规则创建一个瘦垂直系统（a thin vertical system）。这就给予了客户他们真正需要的东西——可证明的规则——并确保投资抵消了投入的时间。这样小组可以在保持灵活性的同时从一开始就不断改进设计。简单设计是一个复杂的领域，研究它的最佳方法是获得外部的帮助。</p><p><i>重要的成功因素</i></p><ul><li><b>赞同——</b>整个开发小组坚持尝试使用敏捷开发以及开发小组圆环里的做法极其重要。如果不能这样坚持，开始甚至保持这样的做法都是非常困难的。 
</li><li><b>沟通——</b>这一点怎么强调都不够。保证小组里高层次的沟通和对诸如集体主义主人翁精神这样的概念的理解非常重要。 
</li><li><b>配对编程——</b>配对编程为很多小组做法提供支持，并将加强小组的沟通和凝聚力。 
</li><li><b>行政——</b>如果没有行政上的支持，创造开放工作空间将会非常困难。在某些情况下，当行政机构的官僚主义作风盛行的时候，我们只用进行一些改变就行了。 
</li><li><b>每日例会——</b>这一个每天早上进行的简单会议，供开发人员讨论当日面临的工作和问题。这样的会议应该是站着开的，因为其时间不应该超过几分钟。 </li></ul><p>小组编写代码——第二步<br />既然我们已经安置好了工作空间，并设定了小组的基调，我们现在就需要看看小组是如何处理代码的。我们这里的目标是确保所有通过配对编程编写的代码都能无缝地集成在一起，并且符合小组所承认的标准。通过推动第二步的进行，我们为支持第一步还有很大一段路要走。</p><p>代码编写标准<br />无论你是否决定采用敏捷编程，代码编写标准（coding standard）是一个非常好的最佳做法。这一步骤涉及让小组创立一套他们能够完全理解和坚持使用的代码编写标准。代码编写标准给予我们下列优势：</p><ul><li>它让我们能够轻松地读懂别人的代码，这样所有人都可以进行（代码）交换。 
</li><li>代码为未来接手的小组提供了一个绝佳的信息源，即使有小组成员离队。 
</li><li>新的小组成员有一套指导方针——而不是瞎猜。 </li></ul><p>大多数小组都会利用已有的框架，并围绕其构建自己的一套标准。这里的关键要素是开始，立即解决小组正在奋力解决的问题，然后根据需要向前推进。也不要为了标准而去强行推行标准——这毕竟是整个小组需要共同认可、相信和使用的东西。下面是3Q公司代码编写标准文档的一小段。</p><p><strong>CamelCase</strong></p><p>CamelCase里的一切、类名称都以大写字母开始，而方法和字段的名称则不需要。</p><p>任何内容都不要放在有大括号的那一行。</p><p></p><table cellpadding="0" border="0"><tbody><tr><td><p>字段以下划线开头：</p></td><td><p>_fieldname</p></td></tr><tr><td><p>变量名不以下划线开头：</p></td><td><p>variableName</p></td></tr><tr><td><p>方法：</p></td><td><p>public void methodName(String stringValue)</p></td></tr></tbody></table><p> </p><p><strong>接口公开</strong></p><p>公共方法在类的最上部，后面跟有受保护的方法，然后才是私有方法。将所有继承自抽象类或者实现结构的方法都靠前放置，这是一个好主意。</p><p>尽可能做到立即就能找到一个类，并马上可以感觉到其功能以及它如何实现该功能，而不需要滚屏。</p><p><strong>方法和类的名称</strong></p><p>让其名称能够说明其功能。注意，不同的开发人员对于什么样的方法可读有不同的看法，他们更喜欢从周围的类，甚至是方法里的参数看出其作用。对这一点还存在争议，但是从名字来判断一个方法的作用是肯定可行的，因此：<br />doIForAllX()<br />就不理想，但是：<br />setupAllTableRowItems()<br />就很好。</p><p>而：<br />createRows()<br />可能更好。</p><p>[getVarvscalculateVar, 直接的getter对方法]</p><p>[不要将查询与作业混在一起]</p><p><strong>方法的抽象</strong></p><p>方法里的代码的抽象程度应该与同一个方法里其他所有代码的相同。这样的话，事件的自然过程能够被弄清楚。例如：</p><p>public void initializeDataBase()<br />{<br />  _connection = createConnection ();<br />  setUpTable();.<br />  For (inti=0;i&lt;tableRows;i++)<br />    SetUpTableRow(i); <br />}</p><p>你稍稍一瞥，不用费什么功夫就可以读懂它。我们在3Q的时候非常珍惜视力，所以把这段代码变成了几个清晰明了的步骤，就像下面这样：</p><p>public void initializeDataBase()<br />{<br />  setUpConnection();<br />  setUpTable();<br />  setUpTableRow();<br />}</p><p>这就有可能：</p><p>1.感觉到事情进展得怎么样</p><p>2.很容易就浏览到我们希望找到的类的确切部分（如果我们对表格行的设置感兴趣，我们就按住Ctrl点击setUpTableRow()）。</p><p><strong>得墨忒尔</strong><strong>法则（</strong><strong>Law of Demeter</strong><strong>，即最少知识法则）</strong></p><p>类应该只能够访问那些可以直接从其字段或者变量访问到的方法。对送进来的对象或者类自行实例化的对象的参考也是如此。</p><p>一般情况下，不要这么做……</p><p>publicintcalculateRetirementFund()<br />{<br />return getClient().getRetirementDetails().getRetirementFund();<br />}</p><p>……而要这么做：</p><p>public void calculateRetirementFund (RetirementDetails details) <br />{<br />return details.getRetirementFund();<br />}</p><p>这有助于为类设定范围并减少不必要的方法调用和委派。</p><p><strong>顺序选择迭代</strong></p><p>一般可以将方法分为下面三种类型。一系列事件，一个接一个；对集合的搜索或过滤；以及对集合或者数组的迭代。</p><p><strong>收集方法、向量创建、向量设置、向量功能（</strong><strong>vector dosomething</strong><strong>）</strong></p><p>集合一次又一次地出现，每次都是同样的问题，主要同类型有关。如果在集合里有一个任意的运行库强制转换（casting），那么总有出现错误类型的机会，导致强制转换异常的出现。</p><p>让集合变成可以针对具体类型，这使得在编译的时候检查往集合里加入的内容成为可能，同时还让根据类型来适应自定义的集合方法变得更容易。</p><p><strong>不要使用临时变量——用查询来替代临时变量</strong></p><p>在有关重整的书上查找这个内容——“用查询来替代临时变量”，最好不要抱着临时变量不放，它会增加代码的复杂性，给阅读者带来困难，同时减少了对算法作进一步重整的可能性。</p><p><strong>测试打破常规</strong></p><p>过多的设置意味着不佳的模式。你应该只需要设置那些与你正在测试的类直接相关的对象。</p><p>尽量让单元测试精细化，这将带来可移植性更强的代码，并将它推向更加清晰、更加独立的实现。</p><p><strong>通过回调制针测试</strong></p><p>回调制针（backpointer）完全就是个麻烦事，应该避免其出现。它会带来相当多的异常，状态模式就是其中一个。一定要了解自己实现回调指针的理由。如果理由是“它会起作用”，那么你就在失去什么东西。</p><p><strong>视图测试——将测试三要素实例化</strong></p><p>在一个构造完好的应用程序里，视图层应该从域抽象出来，达到一种不需要创建视图就能够测试该应用程序的程度。不够精细的测试需要更加经常地更改。见上文<b>测试打破常规</b>。</p><p>这只是来自一个不断改进的小例子。我再提醒一遍，从简单的开始，保持其基本框架，得到所有人的同意。</p><p> </p><p>连续集成<br />瀑布式方法的一个缺陷是代码库的集成往往每隔数周或者数月之久才进行一次。新的错误常常会随着代码的集成而不断暴露出来，我们不得不花额外的时间来更正错误并重新集成。如果集成不是频繁进行，那么反馈就不可能像应该的那么紧密。敏捷开发要求进行更加频繁的集成——在3Q的案例里，这意味着每天要集成一到两次。</p><p>大多数小组一般都会有一台构建计算机，成对的开发人员能够利用其检查在测试－编码－重整循环里编写好的代码。每对开发人员都有确信其代码在被集成到代码库之前就已经经过测试和重整。一旦检验完毕，自动化的构建计算机就会编译所有的代码，运行所有的测试，并通过显示器（向小组）显示出来——构建过程是否需要引起注意——例如：新加入的代码有没有破坏什么东西？</p><p>这会做两件事情：</p><ul><li>从代码被集成（进代码库）到小组意识到存在问题之间的时间间隔会被减到最小。 
</li><li>构建显示器将信息传达给整个小组——不论是集成成功完成——还是需要引起注意——这让小组可以立即作出相应的反应。 </li></ul><p>像这样频繁的集成意味着软件的构建是不停进行的，任何人在任何时候都可以参与构建过程。构建过程需要被自动化，以便使集成尽可能地容易，这是十分重要的。下面就是3Q公司的构建监视器的向小组传达信息的一个例子。</p><p><img src="http://tk.files.storage.msn.com/x1pxOYwqu4SjF6-9eGuLAtm5ieNloxalwGqqoxj7TWRO_vLkQDrL6GXaoUSSJ11s7vZ_8zLU5RxwFwXyadb51Xl1D53lQr5Uav4fzCrLlSM-r89MLUcY9x_mjgwqTOmFqRpsyNj5taAB8JRevhRrmRmWz3b0Bq1rXI8" /></p><p><img src="http://tk.files.storage.msn.com/x1pxOYwqu4SjF6-9eGuLAtm5ieNloxalwGqqoxj7TWRO_uOEIvg9Vp-sLw4arC58Ld3NCUubkKiJfdPLBCa1QhoazQAKUfZROAyR8Lz7IvU6P8A0PidsKey3Vc7wEM287GHMORTfTEinU5RPwxxW9fnzEpPDOB5la6o" /></p><p><img src="http://tk.files.storage.msn.com/x1pxOYwqu4SjF6-9eGuLAtm5ieNloxalwGqqoxj7TWRO_tYYD7voIk9gq29mokZvLjRbfNk_sv1tIHq-CQSwiD32UIPhQE0eSgngD_CEw_Tf5yvCwQvzIiLKjs_eOI8HtnskPDmL6-GegdIZLrv5fXw01pNnj9bWkWJ" /><br /><br />就如上面图画所显示的，构建服务器能够向小组提供额外的信息。 </p><p></p><p><i>重要的成功因素</i></p><ul><ul><li><b>自动化</b>——这需要成为一个自动化的过程。否则你将不得不专门找一个开发人员来维持构建过程——这可不是一个有意思的工作。首先就要营造环境，取得设备和实现自动化。 
</li><li><b>TCR</b><b>和配对编程</b>——对于这一层次的集成工作，小组必须按照测试－编码－重整循环来进行，这样他们才有信心保证所有的问题只会发生在集成过程里。如果没有TCR循环，这一部分的过程将会非常困难。 
</li><li><b>按部就班</b>——就像这个小标题说的，不慌不忙地从简单的地方开始，然后随着时间的推移来逐步改进——尤其是在代码编写标准这一块。 </li></ul></ul><p>保持高效率——第三步<br />就如我们在《上篇》里说的，敏捷开发过程是一项工作强度很大的编程方式。除此之外，软件开发本身就压力重重，而小组累垮的可能性非常高。</p><p>可持续的步伐意味着开发小组现在和未来的工作都将非常艰苦。加班不是我们希望鼓励的事情，尽管有的时候需要如此。如果小组不得不加班工作，那么我们想要尝试将可持续步伐里的加班时间控制在一到两周而不是一到两个月。再强调一遍，敏捷开发是一项强度很大的工作；配对编程要求很多交互和重视，测试－编码－重整循环也是如此。尽管敏捷开发会引发我们小组的最大潜能，但是我们需要清楚很多时候的大量加班会累垮整个小组的风险。</p><p><i>重要的成功因素</i><br />这是管理者必须十分清楚的一个领域。确保小组在整个项目里保持合理的步伐是其主要职责。</p><p>开始转移到统一小组——第四步<br />有的人可能认为Metaphor的概念应该来得更早一些，但是我们建议在这一阶段快结束的时候才引入它，因为这是我们首次提到客户／业务方（customer／business）。Metaphor是客户与开发人员之间系统的通用语言。它看起来可能不重要，但是以Exoftware的政府顾客为例，开发小组一般都把业务方（也就是定义系统需求的人）当作客户。但是对于业务方而言，“客户”指的是最终用户。这就导致开发人员和“业务方”之间的困惑和挫折。</p><p>Metaphor的作用不只是一门通用语言——它还与上下文和对系统是什么的高层次理解有关。在这里我们能够采取步骤做到真正地与我们的业务合作伙伴沟通并共享共同的目标。3Q公司使用一种叫做Adaptor Tree Hierarchy体系，它通过一门客户／业务方共同认可的语言给予开发人员一个广阔的系统视野。例如：</p><p>ThreeQData</p><ul><li>todaysDate 
</li><li>marriage 
<ul><li>spouse 
</li><li>economicindicators 
</li><li>client 
<ul><li>lossofincomestory 
<ul><li>annualincome 
</li><li>coveramortisationeroision 
</li><li>... </li></ul></li><li>managedfundstory 
</li><li>pensionstory </li></ul></li></ul></li></ul><p>这个树形结构的每一部分都可以扩展出更多细节，能够轻易地改变，并提供一个很好的系统视角，同为整个小组提供一门通用的语言。</p><p> </p><p><i>重要的成功因素</i></p><ul><li><b>坚持到底</b>——只有当你坚持使用的时候Metaphor才会有效。它将会成为日常语言的一部分，但是适应它需要花时间。 
</li><li><b>从基本的开始</b>——从Metaphor的基本框架开始，了解它，使用它，然后以此为基础来创建它。 
</li><li><b>取得帮助</b>——让尽可能多的相关业务方／客户参与Metaphor的创建——让其他人尽早参与进来是至关重要的。 </li></ul><p>敏捷开发的小组做法的目的是帮助小组把重点放在集体工作上，并理解其共有的做法和目标。尽管有的做法，比如代码编写标准，能够在隔离的情况下完成，但是如果与具体的开发人员做法，例如测试－编码－重整和配对编程结合起来，那么这些小组做法将发挥最大效用。</p><p>本系列的最后一部分将探讨开发人员小组如何开始同客户方／业务构成“统一小组”。</p><p> </p><p><i>Brian Swan</i><i>是<a href="http://www.exoftware.com/"><font color="#78ba00">Exoftware公司</font></a></i><i>教授敏捷开发的指导老师。他在敏捷开发的技术和管理方面具有相当丰富的经验，曾经带领很多小组成功地转换到了敏捷开发，并以敏捷开发的思想和做法来培训开发人员和管理人员。他在Exoftware</i><i>公司和在敏捷开发方面的工作使他到过很多公司，并对其开发小组产生了持续的、积极的影响。Brian</i><i>先前的经验还包括担任Napier</i><i>大学的讲师，讲授软件开发和人机互动。Brian</i><i>可以通过<a href="mailto:bswan@exoftware.com?Subject=Builder Article"><font color="#78ba00">电子邮件</font></a></i><i>联系上。</i></p></font></font>
<img src ="http://www.blogjava.net/yesjoy/aggbug/62679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2006-08-09 23:30 <a href="http://www.blogjava.net/yesjoy/articles/62679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷软件开发（上篇）</title><link>http://www.blogjava.net/yesjoy/articles/62678.html</link><dc:creator>★yesjoy★</dc:creator><author>★yesjoy★</author><pubDate>Wed, 09 Aug 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/yesjoy/articles/62678.html</guid><wfw:comment>http://www.blogjava.net/yesjoy/comments/62678.html</wfw:comment><comments>http://www.blogjava.net/yesjoy/articles/62678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yesjoy/comments/commentRss/62678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yesjoy/services/trackbacks/62678.html</trackback:ping><description><![CDATA[
		<h2>敏捷软件开发（上篇） </h2>
		<br />
		<font size="2">NetReptile推荐 [2005-7-17]</font>
		<br />
		<font size="2">出处：ZDNet</font>
		<br />
		<font size="2">作者：Brian Swan</font>
		<br />
		<font size="2"> <font size="+0"><br /><br /><p></p><p>作为三篇系列文章的第一篇，我们将带你了解敏捷软件开发的重要做法——如何使用它们、你可能会碰到什么样的问题，以及你将从它们那里获得什么。</p><p>敏捷软件开发不是一个具体的过程，而是一个涵盖性术语（umbrella term），用于概括具有类似基础的方式和方法。这些方法，其中包括极限编程（Extreme Programming）、动态系统开发方法（Dynamic System Development Method）、SCRUM、Crystal和Lean等，都着眼于快速交付高质量的工作软件，并做到客户满意。</p><p>尽管构成这个敏捷开发过程的每种方法都具有类似的目标，但是它们实现这个目标的做法（practice）却不尽相同。我们把在自己完成所有过程中经历过的最佳做法集中到了本系列的文章里。</p><p>下面的图表基本勾画出了我们提炼出来的这些敏捷开发最佳做法。最中间的圆环代表一对程序员日常工作的做法。紧接着的中间一个圆环表示开发人员小组使用的做法。最外面的一个圆环是项目所涉及的所有人的做法——客户、开发人员、测试人员、业务分析师等等。</p><p>这些圆环里的所有做法都直接与四个角上显示的敏捷开发的核心价值相关：沟通（Communication）、反馈（Feedback）、勇气（Courage）和简单（Simplicity）。也就是说，每个做法都给予我们一条实现敏捷开发价值并让它们成为该过程一部分的具体方法。</p><p> <img src="http://tk.files.storage.msn.com/x1pnp_rgmi5o537Q53I9vofWuCfgqHuvhLEGGhK7O-an2n13JioXeZbMRClwqslqgk3XRhVgxN4R_8ytpnWc6W9Zp2mqqURWf5Zd7J07NIq65_DAxk3p1IVCi734O_7p4ML4mpqwa5_Rhg" /></p><p>在理想状况下，如果决定采用敏捷软件开发的方法，你就应该在一个经过管理层许可的敏捷开发实验项目里尝试所有的作法。这是掌握敏捷开发的最好方法之一，因为这样能保证得到支持，为你的努力提供更多的回报，帮助捕捉学习到的东西，这样你才能让敏捷开发过程来适应你独特的环境。</p><p>然而，这并不总是可行的，所以有的时候最好采用步步为营的方法。在这种情况下，我们建议从最里面的圆环向外面的圆环推进。也就是从开发人员实践开始，然后是小组这一层次的做法，最后再融入“统一小组（one team）”的概念。</p><p>为技术优势设个限——开发人员做法<br />技术优势是敏捷开发过程的核心。为了让其他的做法真正生效，我们必须在开发人员中进行技术优势的培训。从表面上看，技术优势可能看起来并不是核心优先对象，但是如果把我们注意力都放在上面，它将确保我们编写出不同寻常的优秀代码。这反过来同样会给予公司、客户，以及用户对软件和对我们交付能力的信心。</p><p>开发人员做法（developer practice）是我们推动技术优势的切实可行的方法。即使是独立完成，而没有其他敏捷开发做法的介入，开发人员做法也能够给你的软件带来巨大的收益。</p><p>开发人员做法可以被分解为四个做法（如果你把实际的编写代码的过程加上去就是五个做法）。它们分别是测试－编码－重整循环（Test-Code-Refactor cycle）、配对编程（Pair Programming）和简单设计（Simple Design）等。</p><p>测试－编码－重整（TCR）循环——第一步<br />由测试驱动的开发和重整常常被当作是各自独立做法，但是它们事实上是TCR循环的一部分。要建立我们正在寻求的紧密反馈循环，我们就需要把它们放在一起。</p><p>我们在这里的目标有两层：测试让我们对代码质量的充满信心，并能表明我们加入新代码的时候没有破坏任何东西；重整和测试有助于让代码变成我们就代码实际在做什么而进行沟通的最真实形式——任何人都应该可以看到它，并知道什么是什么。</p><p>由测试驱动的开发（TDD）是一个循环，它从测试失败开始，然后是编写足够的代码通过测试，再是重整代码，使得代码在实现系统当前功能的条件下尽可能地简单。</p><p>测试－编码－重整循环非常短暂——也就几分钟。如果超出这个时间范围那就意味着测试的级别过高，有可能加入了未经测试的实现代码。</p><p>在本文的开始部分，我们不会举出TDD的例子，有关的内容会在后面<sup><a href="http://www.builderau.com.au/manage/0,39024662,39177663-6,00.htm#references"><font color="#78ba00">2, 3, 4</font></a></sup>详细讨论。在这里，从整体上把握并把重点放在TCR循环更有趣的方面上会更加有用。</p><p>就同任何极限编程／敏捷开发项目一样，要做的第一个素材（story）是一个经过简化的应用程序，用来完整地说明程序的功能。在本文里，这样的应用程序是一个二十一点纸牌游戏。在经过简化的第一个素材里，只有一个玩家外加一个发牌人，每个玩家只会得到两张牌，获胜者是两张牌发完后点数最大的人。</p><p>素材／要求<br />一个简单的二十一点纸牌游戏</p><ul><li>玩家下注 
</li><li>给玩家和发牌人每人两张牌 
</li><li>给获胜者支付奖金（玩家获胜的机会为2:1） </li></ul><p>验收测试<br />要知道我们的素材什么时候完成就需要经过一系列验收测试。我们这个简单游戏的验收测试如下：</p><p></p><table cellspacing="3" cellpadding="0" width="358" border="0"><tbody><tr><td width="115"><p><b>玩家获胜</b></p></td><td width="116"><p><b>发牌人获胜</b></p></td><td width="115"><p><b>平局</b></p></td></tr><tr><td width="115"><p>玩家赌注总额＝100</p></td><td width="116"><p>玩家赌注总额＝100</p></td><td width="115"><p>玩家赌注总额＝100</p></td></tr><tr><td width="115"><p>发牌人赌注总额＝1000</p></td><td width="116"><p>发牌人赌注总额＝1000</p></td><td width="115"><p>发牌人赌注总额＝1000</p></td></tr><tr><td width="115"><p>玩家下注10</p></td><td width="116"><p>玩家下注10</p></td><td width="115"><p>玩家下注10</p></td></tr><tr><td width="115"><p>玩家发到10 &amp; 9</p></td><td width="116"><p>玩家发到8 &amp; 9</p></td><td width="115"><p>玩家发到8 &amp; 9</p></td></tr><tr><td width="115"><p>发牌人发到8 &amp; 9</p></td><td width="116"><p>发牌人发到10 &amp; 9</p></td><td width="115"><p>发牌人发到8 &amp; 9</p></td></tr><tr><td width="115"><p>玩家赌注总额＝110</p></td><td width="116"><p>玩家赌注总额＝90</p></td><td width="115"><p>玩家赌注总额＝100</p></td></tr><tr><td width="115"><p>发牌人赌注总额＝990</p></td><td width="116"><p>发牌人赌注总额＝1010</p></td><td width="115"><p>发牌人赌注总额＝1000</p></td></tr></tbody></table><p>任务<br />素材往往单独解决起来往往非常困难，所以在一般情况下我们都把它分解为一系列任务来完成。在本文的二十一点纸牌游戏里，需要进行下列任务：</p><ul><li>创建一副牌 
</li><li>创建一个投注台面 
</li><li>创建一手牌 
</li><li>创建游戏 
</li><li>创建一副牌</li></ul><p>在把素材分解成为任务的时候，我们可以把各个任务再分解成一系列待办事项，从而指导我们进行测试。这让我们可以保证在通过所有测试之后完成这个任务。对于这一副牌，我们有下列事项需要完成。</p><ul><li>向牌桌上放一张纸牌 
</li><li>在发牌的同时将其从牌桌上移走 
</li><li>检查牌桌是否为空 
</li><li>检查牌桌上纸牌的张数 
</li><li>将牌桌上的一副牌的张数限制为52张（如果超过，就要显示异常） 
</li><li>不断发牌，直到发完 
</li><li>洗牌 
</li><li>检查牌桌上纸牌的张数是否正确 </li></ul><p>在进行过第一轮的几个简单测试之后，我们的待办事项列表就像下面这样了：</p><ul><li><s>向牌桌上</s><s>放一张纸牌</s></li><li>在发牌的同时将其从牌桌上移走 
</li><li><s>检查牌桌是否为空</s></li><li><s>检查牌桌上纸牌的张数</s></li><li><s>将牌桌上一副牌的张数限制为</s><s>52</s><s>张（如果超过，就要显示异常）</s></li><li>不断发牌，直到发完 
</li><li>洗牌 
</li><li>检查牌桌上纸牌的张数是否正确 </li></ul><p>下一个要进行的测试是从牌桌上发牌。当我们在为测试方法编写代码的时候，我们所扮演的角色就是将要编写的应用程序的用户。这就是为什么我们给自己的类创建的接口要与给用户的接口像类似的原因。在本文的这个例子里，我们将按照命令／查询分离原则（Command/Query Separation Principle<sup><a href="http://www.builderau.com.au/manage/0,39024662,39177663-6,00.htm#references"><font color="#78ba00">5</font></a></sup>）编写出下面这样的代码。</p><p>Deck类。如<b>列表</b><b>A</b>所示。</p><p><b>列表A</b></p><p>import java.util.List; </p><p>import java.util.ArrayList; </p><p>public class Deck { </p><p>    private static final int CARDS_IN_DECK = 52; </p><p>    private List cards = new ArrayList(); </p><p>    public boolean isEmpty() { </p><p>        return size() == 0; </p><p>    }</p><p>     public int size() { </p><p>        return cards.size(); </p><p>    }</p><p>     public void add(int card) throws IllegalStateException { </p><p>        if(CARDS_IN_DECK == size()) </p><p>            throw new IllegalStateException("Cannot add more than 52 cards"); </p><p>        cards.add(new Integer(card)); </p><p>    }</p><p>     public int top() { </p><p>        return ((Integer) cards.get(0)).intValue(); </p><p>    }</p><p>     public void remove() { </p><p>        cards.remove(0); </p><p>    }</p><p> } <br /><br /></p><p>我们所有的测试都通过了，而且我们没有看到任何重复或者其他必要的重整，所以应该是时候进行下面的测试了。然而事实却不是这样的。我们top和remove方法的实现里有一个潜在的问题。如果对一个空的Deck调用它们，会发生什么？这两个方法都会从纸牌的内部列表里跳出一个IndexOutOfBoundsException异常，但是目前我们还没有就这个问题进行沟通。回头看看简单性的原则，我们知道自己需要沟通。我们的类的用户应该知道这个潜在的问题。幸运的是，我们将这种测试当作是一种沟通的方式，因此我们增加了下面的测试。<br /><br /></p><p>public void testTopOnEmptyDeck() { </p><p>    Deck deck = new Deck(); </p><p>    try { </p><p>        deck.top(); </p><p>        fail("IllegalStateException not thrown"); </p><p>    } catch(IllegalStateException e) { </p><p>        assertEquals("Cannot call top on an empty deck", e.getMessage()); </p><p>    } </p><p>}  </p><p>public void testRemoveOnEmptyDeck() { </p><p>    Deck deck = new Deck(); </p><p>    try { </p><p>        deck.remove(); </p><p>        fail("IllegalStateException not thrown"); </p><p>    } catch(IllegalStateException e) { </p><p>        assertEquals("Cannot call remove on an empty deck", e.getMessage()); </p><p>    } </p><p>} <br /><br />上面都是异常测试（Exception Test<sup><a href="http://www.builderau.com.au/manage/link%20link"><font color="#78ba00">2</font></a></sup>）的例子。我们再一次运行这些测试看它们失败，然后加入实现让它们通过。<br /><br />public int top() { </p><p>    if(isEmpty()) </p><p>        throw new IllegalStateException("Cannot call top on an empty deck"); </p><p>    return ((Integer) cards.get(0)).intValue(); </p><p>}</p><p> public void remove() { </p><p>    if(isEmpty()) </p><p>        throw new IllegalStateException("Cannot call remove on an empty deck"); </p><p>    cards.remove(0); </p><p>} </p><p>尽管guard语句有重复，但是我们决定不去管它，没有将它们简化成一个共同的方法。这是因为沟通的价值超过了重复的代价，当然这只是一个个人的选择。</p><p>一手牌<br />我们已经完成了对牌桌和投注台面的测试和实现，现在就到了创建一手牌的时候了。待办事项列表再一次发挥其作用，我们得到了下面这样一个列表：</p><ul><li>创建一个一开始没有纸牌的空手 
</li><li>向手上加入纸牌 
</li><li>检查一只手是否击败了另一手 
</li><li>检查一只手是否爆了</li></ul><p> </p><p>为空手增加一个测试很简单，我们继续到给手上加入纸牌。</p><p>public void testAddACard()<br />{<br />  Hand hand = new Hand();<br />  hand.add(10);<br />  assertEquals(1, hand.size());<br />  hand.add(5);<br />  assertEquals(2, hand.size());<br />} </p><p>我们运行测试，然后加入实现。</p><p>public void add( int card )<br />{<br />  cards.add(new Integer(card));<br />}</p><p>测试通过了，我们没有看到Hand类里有任何重复。但是我们刚刚给Hand加上的实现和给Deck加上的方法极其相似。回头看看牌桌的待办事项列表，我们记得必须检查牌桌（上纸牌的张数）是否正确，我们最后也对手做同样的事情。</p><p>public void testAddInvalidCard() { </p><p>    Hand hand = new Hand(); </p><p>    try { </p><p>        hand.add(1); </p><p>        fail("IllegalArgumentException not thrown"); </p><p>    } catch(IllegalArgumentException e) { </p><p>        assertEquals("Not a valid card value 1", e.getMessage()); </p><p>    }</p><p>     try { </p><p>        hand.add(12); </p><p>        fail("IllegalArgumentException not thrown"); </p><p>    } catch(IllegalArgumentException e) { </p><p>        assertEquals("Not a valid card value 12", e.getMessage()); </p><p>    } </p><p>} </p><p>我们加入了下面的实现来通过测试。</p><p>public void add( int card )<br />{<br />  if(card &lt; 2 || card &gt; 11)<br />    throw new IllegalArgumentException("Not a valid card value " + card);<br />  cards.add(new Integer(card));<br />} </p><p>但是现在我们在Deck和Hand里有相同的guard语句，用来检查该自变量是否代表着正确的纸牌值。简单性的原则要求我们删除重复，但是在这里情况并不像Extract Method重整<sup><a href="http://www.builderau.com.au/manage/0,39024662,39177663-6,00.htm#references"><font color="#78ba00">6</font></a></sup>这么简单。如果我们看到多个类之间存在重复，这意味着我们缺失了某种概念。在这里我们很容易就看到Card类担负起了判断什么值是有效的责任，而Deck和Hand作为Card的容器变得更具沟通性。</p><p>我们引入了Card类以及相应的Deck和Hand重整，如列<b>表</b><b>B</b>：</p><p>public class Card { </p><p>    private final int value; </p><p>    public Card( int value ) { </p><p>        if( value &lt; 2 || value &gt; 11 ) </p><p>            throw new IllegalArgumentException( "Not a valid card value " + value ); </p><p>        this.value = value; </p><p>    }</p><p>     public int getValue() { </p><p>        return value; </p><p>    } </p><p>}</p><p> public class Deck { </p><p>    private static final int[] NUMBER_IN_DECK = new int[] {0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 16, 4};</p><p>     … </p><p>    public void add( Card card ) throws IllegalStateException { </p><p>        if(NUMBER_IN_DECK[card.getValue()] == countOf(card)) </p><p>            throw new IllegalStateException("Cannot add more cards of value " + card.getValue()); </p><p>        cards.add(card); </p><p>    }</p><p>     public Card top() { </p><p>        if(isEmpty()) </p><p>            throw new IllegalStateException("Cannot call top on an empty deck"); </p><p>        return (Card) cards.get(0); </p><p>    }</p><p>     … </p><p>    private int countOf(Card card) { </p><p>        int result = 0; </p><p>        for(Iterator i = cards.iterator(); i.hasNext(); ) { </p><p>            Card each = (Card) i.next(); </p><p>            if(each.getValue() == card.getValue()) </p><p>                result++; </p><p>        }</p><p>         return result; </p><p>    } </p><p>}</p><p> public class Hand { </p><p>    … </p><p>    public void add( Card card ) { </p><p>        cards.add(card); </p><p>    } </p><p>    … </p><p>} </p><p>测试－编码－重整循环的每一阶段都涉及不同类型的思想。在测试阶段，重点放在了被实现的类的接口上。编写代码是为了让测试尽可能快地通过测试。而重整阶段可以被当作是使用简单性原则进行指导的微型代码审查。有没有重复的或者看起来类似的代码，不仅仅是在当前的类里，而且是在系统的其他类里？现在的实现可能会出现什么问题，类的用户能够与之顺利沟通吗？</p><p><i>重要的成功因素</i></p><ul><li>小步前进——TCR对于开发人员来说不是一个很容易的转换。一次只进行一个步骤，同时还要明白它学习起来有一定难度。 
</li><li>严格遵守原则——只进行TDD或者只进行重整并不能让整个TCR循环一蹴而就。给自己足够的时间来尝试，并取得效果。压力和最终期限会迫使小组回到原来的习惯上——一定要小心！ 
</li><li>重整过程——与小组的所有成员交换意见，了解一下他们的反馈 
</li><li>理解——确保整个小组都完全理解TCR循环是什么，如何实现它。考虑一下就此主题进行员工培训和讲座。 </li></ul><p>配对编程——第二步<br />TCR循环可以由某个开发人员独自完成，但是敏捷开发和TCR循环的真正威力来自于配对编程（pair programming）。在敏捷开发里，开发人员每两人一组编写所有的生产代码，其中一人担当“驱动者（driver）”（负责操作鼠标和键盘），而另一个人同驱动者一道解决问题和规划更大的图景。编程配对里的这个驱动者可以按需要进行轮换。配对让你能够实现眼前的目标，同时确保不会忽略项目的整体目标。它会保证有人在考虑下一步的走向和下一个要解决的问题。</p><p>虽然配对编程引起了很多争议，但是大多数优秀的开发人员还是在按照这一方法进行开发，至少有的时候是这样的。管理人员们可能会相信配对编程降低了生产效率，然而尽管开发小组的生产效率在一开始会有所降低，但是研究已经表明从质量和增加的生产效率的角度来看，配对编程远远超过了开发人员单独工作的质量和效率<sup><a href="http://www.builderau.com.au/manage/0,39024662,39177663-6,00.htm#references"><font color="#78ba00">7</font></a></sup>。而另一方面，开发人员可能会觉得配对编程非常困难，因为它需要与人们更多的交互过程，并与另一个开发人员一起编写代码。但是这也是建立一种相互学习的环境的最好方法。</p><p> </p><p>实施配对编程</p><p>1.       不要独断专行——要讨论。与你的小组成员讨论配对编程的思想及其优劣，而不是独断专行地给他们定规则。配对编程是开发人员相互学习的绝好机会。</p><p>2.       确定你的小组需要多少配对。配对编程是一项工作强度很大但是令人满意的工作方式。</p><p>3.       不要让配对编程人员每天连续工作八个小时——否则你的小组会吃不消的。从较短的时间开始——每天一到两个小时，看看它是如何进展的，然后随着小组信心的增强而延长时间。</p><p>4.       定期检查。如果你已经决定尝试再次进行敏捷开发，你就需要确保为小组营造了正式的环境，以便（定期）就项目进度进行反馈。</p><p><i>重要的成功因素</i></p><ul><li>尝试它——如果你不去尝试，你就永远不了解它。 
</li><li>时间——给你小组（足够的）时间来尝试，并一步一步来完成。 
</li><li>沟通——配对编程会暴露一些有争议的问题——要保证沟通的渠道畅通。 
</li><li>配对恐惧症——你可能会碰到拒绝或者不希望与别人搭配工作的人。通常情况都是有别的原因驱使他们这样做，所以你需要找出并解决这些原因。 
</li><li>花时间思考——开发人员需要时间来思考并想出主意——确信给他们留出了时间做别的事情。 </li></ul><p>从整体上讲，我们在这里说的是要尝试这种方法——首先尝试测试－编码－重整循环，一旦你让它运转起来，就尝试一下配对编程。你应该马上就可以看到质量的提升，以及团队里沟通层次的提高。</p><p>我们在本文没有谈及的内容很简单——增量设计。敏捷编程喜欢简单的增量、改进的设计，而不是在编写代码之前的大型设计。很多人都认为敏捷编程不喜欢设计——事实并不是如此，而应该是只要满足最低需要就行了。</p><p>在本系列的第二部分里，我们将更加仔细地探讨简单设计以及一套的开发团队做法。</p><p><u>参考资料</u></p><p>1.       Beck K和Andres C，《极限编程详解：变化，第二版（<i>Extreme Programming explained: embrace change 2nd ed</i>.）》，Pearson Education出版社，2005年。</p><p>2.       Beck K，《测试驱动的开发：举例（<i>Test-driven development: by example</i>）》，Pearson Education出版社，2003年。</p><p>3.       Jeffries R、Anderson A、Hendrickson C，《实现极限编程（<i>Extreme Programming installed</i>）》，Addison-Wesley出版社，2001年。</p><p>4.       Wake W，《极限编程探讨（<i>Extreme programming explored</i>）》，Addison-Wesley出版社，2002年。</p><p>5.       Meyer B，《构建面向对象的软件，第二版（<i>Object-oriented software construction 2nd ed</i>.）》，Prentice Hall出版社，1997年。</p><p>6.       Fowler M，《重整：改进原有代码的设计（<i>Refactoring</i><i>: improving the design of existing code</i>）》，Addison Wesley Longman出版社，1999年。</p><p>7.       Williams L等，《强化配对编程案例（<i>Strengthening the Case for Pair-Programming</i>），美国犹他大学计算机系，1999年。</p><p><i>Brian Swan</i><i>是<a href="http://www.exoftware.com/"><font color="#78ba00">Exoftware公司</font></a></i><i>教授敏捷开发的指导老师。他在敏捷开发的技术和管理方面具有相当丰富的经验，曾经带领很多小组成功地转换到了敏捷开发，并以敏捷开发的思想和做法来培训开发人员和管理人员。他在Exoftware</i><i>公司和在敏捷开发方面的工作使他到过很多公司，并对其开发小组产生了持续的、积极的影响。Brian</i><i>先前的经验还包括担任Napier</i><i>大学的讲师，讲授软件开发和人机互动。Brian</i><i>可以通过<a href="mailto:bswan@exoftware.com?Subject=Builder Article"><font color="#78ba00">电子邮件</font></a></i><i>联系上。</i></p><p></p><p> </p></font></font>
<img src ="http://www.blogjava.net/yesjoy/aggbug/62678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yesjoy/" target="_blank">★yesjoy★</a> 2006-08-09 23:29 <a href="http://www.blogjava.net/yesjoy/articles/62678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>