第6章软件项目设计阶段的知识和管理本章要点:系统设计是软件项目成败的关键设计阶段的目标和任务系统设计阶段的团队管理和技能要求系统设计阶段的管理与控制系统设计阶段性成果和考核依据需求分析解决“做什么”,系统设计则确定“如何做”。6.1系统设计是软件项目成败的关键系统设计基于需求分析的成果,对系统做深层次的分析,从而得出一系列行之有效的系统实现方案,使整个项目在逻辑上和物理上能够得以实现。系统设计是获取高质量、低耗费、易维护的软件系统的最为核心的环节。没有或缺乏软件设计的工程只能是一个不稳定的、甚至是失败的软件系统。6.2设计阶段的目标和任务系统设计是一个将系统的需求规格转换成软件系统的说明过程。系统设计的最终目标是要完成对“软件项目交付成果如何架构”的准确回答。任务包括构建系统框架,设计系统功能,描述系统流程,建立系统的数据模型、接口模型及界面模型,形成系统的逻辑结构,告诉程序员软件系统应该“怎样做”。软件设计一般分为概要设计和详细设计两大步骤。概要设计是根据需求分析内容确定软件系统的总体框架,定义系统的初始模型。详细设计是在概要设计的基础上做进一步细化的工作,规划出系统的运行结构、功能结构、信息模型、过程模型和集成接口结构,并详细到系统编码阶段的各个类、函数、变量等对象的结构定义、流程定义和实现方案。6.3系统设计阶段的团队管理和技能要求系统设计团队是软件项目各个阶段中对技术要求最高的组织之一,并在项目经理的直接领导和协调下开展工作。主要团队成员包括:体系结构设计师、系统设计员、数据库设计员、用户界面设计员、质量管理员和配置管理员。体系结构设计师负责系统的总体规划和集成接口设计。系统设计员负责完成子系统、子模块,以及系统构件的规划与设计。数据库设计员负责整个系统的概念数据模型,以及物理数据的设计。用户界面设计员负责系统与用户交互的界面风格、整体布局及美化设计。质量管理员负责组织设计结果的质量评审工作。配置管理人员进行设计阶段的配置管理,并将设计阶段成果纳入软件配置管理。他们之间的工作关系如下图所示。6.3.1体系结构设计师职责与技术素质要求是系统设计团队中的关键人物,其职责是领导设计组成员开展系统设计任务,协调和管理系统设计团队内部的各项工作,并参与整个项目各个阶段的沟通与协调工作。主要工作包括:(1)初步定义一组在构架方面具有重要意义的元素,作为系统设计的工作基础。(2)初步定义系统的分层与组织结构。(3)提供从分析活动到设计活动的自然转移——从分析结果中确定适当的设计元素,从相关分析机制中确定适当的设计机制。(4)维持体系结构的一致性和完整性,确保当前迭代所确定的新设计元素与先前已有的设计元素可以集成;在设计过程中尽可能早地充分利用现有的构件和设计元素。(5)描述系统运行时的组织以及部署体系结构时的组织。(6)设计实施模型,以实现设计与实施间的平稳转移。注意:体系结构架构工作一般由技能互补人员组成的小型团队来完成。团队应由具有丰富相关领域设计经验的成员组成;同时,体系结构设计团队不能由大规模的团队组成。6.3.2子系统设计员的职责与技能要求子系统设计员是整个设计阶段任务得以顺利完成的核心成员,他们常常是一个协作的团队,而不是一个人。是在体系结构设计师的声接领导和协调下开展工作。主要完成的任务是:(1)将系统结构提供的行为说明转换为可作为设计基础的一组元素。(2)通过制定设计元素如何实现其行为要求,改进设计元素的定义。(3)将设计元素作为模块来实施。(4)测试所实施的模块,以核实构件/单元级别上的功能和需求满足情况。注意:①负责设计子系统的个人或团队应当熟悉本系统所采用的开发语言,并具备在系统所使用的算法或技术方面的专业技能。②负责子系统的个人或团队更应是多面手,能够合理划分设计元素间的功能,并能够理解不同备选设计方案固有的优缺点。6.3.3数据库设计员的职责与技能要求数据库设计员的主要内容是确定系统数据库对象及其之间的关系,建立系统的信息模型。主要完成的任务是:(1)确定设计中的永久类;(2)设计适当的数据库结构,以存储永久类;(3)定义存储和检索永久性数据的机制和策略,以满足系统要求的性能标准。注意:①数据库设计人员需要了解设计模型中的永久类,并且必须在关系型数据库、面向对象的程序设计与软件实施方面具备一定的应用知识。②数据库设计人员还需要充分具备处理数据库并行及分布问题的背景。③数据库设计人员是一种“浮动”的资源,为几个团队所共有,充当处理永久性问题的顾问型成员。④数据库设计人员与子系统设计人员之间的紧密协作极为重要。6.3.4界面设计人员的职责与技能要求用户界面设计是系统的形象设计,它留给用户的印象直接影响着软件的市场和用户群的占有率,因此必须得到足够的重视。主要完成的任务是:(1)分析对用户界面的需求,包括可用性需求。(2)构建用户界面原型。(3)邀请用户界面的其他相关人员参与可用性复审和使用测试会议。(4)对用户界面的最终实施方案(由设计员和实施员等其他开发人员创建)进行复审并提供相应的反馈。6.4系统设计阶段的管理与控制6.4.1系统设计阶段的进度管理做好设计阶段的进度管理与控制工作,需要做好以下几方面的具体工作:(1)考虑设计人员的能力系统设计工作的进度与质量是设计人员经验和能力的综合体现。本阶段工作进度安排一定要考虑设计人员的能力状况。在实际工作中,应结合项目的规模、费用状况及进度要求,选择合适的系统设计人员,即在成本允许的条件下,尽可能选用能力较强、经验丰富的设计人员,以获得较高的项目进度及质量。(2)做好阶段工作计划与任务分工无论何种软件项目,在设计开始时都应制定详细的阶段工作计划,使整个工作都在计划的指导下进行。对参与团队设计的人员要有明确的工作分工并制定明确的工作职责,防止工作安排中的遗漏及相互扯皮现象出现,最大限度的发挥出每个团队成员的能力和经验优势。(3)采用先进的软件技术与工具采用先进的软件技术进行设计工作,将会取得较高劳动效率。设计阶段新技术的采用主要体现在以下方面:1)采用新的系统建模方法及工具如支持建立系统功能模型的IDEFO方法,面向对象的建模工具(UML)和方法等。2)软件复用许多软件模块的设计和实现具有很大的相似性,在进行系统设计时,可将其他项目的设计结果直接拿过来使用,以获得较高的软件开发效率及较高的软件开发质量。(4)及时沟通沟通可以有效地解决以下问题:1)解决设计中的难题技术进步及用户要求的不断提高,软件开发工作的技术要求及难度越来越大。每个设计人员在设计时总会碰到一定的设计难题。通过团队协作可以充分发挥和调动每位成员的聪明才智,准确把握、合理解决设计难题,避免设计中的漏洞及问题,同时也可避免可能带来的进度延误。2)有效解决设计接口问题及采用复用技术设计中,不同人员所承担任务之间的接口工作是设计工作的一个关键。每个人不能按照自己的想法进行接口的设计,只有通过与接口方的不断交流和沟通,才能取得满意的设计效果。另外在设计工作中,不同模块间的设计可能具有很大的相似性,有效的沟通可以使设计人员彼此了解别人的工作内容,从而给设计上的复用带来了可能,保证或加快设计工作进度。3)提高人员的工作效率通过沟通,设计人员可以彼此厂解别人的工作进度,出于维护个人荣誉,会对进度较慢的人员形成一定的工作压力,从而保证设计工作的整体工作进度。(5)加强跟踪与监控,防止设计工作的反复加强项目的跟踪和管理,可以减少设计工作中的随意性、及时纠正设计中的错误。从而减少设计中的工作反复,确保设计阶段的工作进度。跟踪设计工作进度的方法有两种:一种是个人询问,另一种是召开例会。6.4.2系统设计阶段质量管理可通过做好以下工作,把好软件设计质量关:(1)对需求的正确理解需求规格说明书是软件设计的重要依据。软件项目能否最终提供符合用户需要的软件产品,就要看软件设计是否满足了需求规格说明书的全部要求。因此,设计人员对需求规格说明书内容的正确理解,是高质量完成软件设计工作的前提。(2)监理与评审设计阶段完成后,需要对系统设计进行评审。评审由质量管理人员发起和组织,参与的人员有用户、领导、开发方、监理等。通过评审,为系统实施和质量跟踪提供依据。通过评审以后,设计阶段的工作成果将纳入软件配置管理。设计阶段工作对项目的后续工作影响巨大,一旦出现设计更改,需要付出的代价是很沉重的。因此,作为设计阶段的质量把关与审核,设计过程的监理与设计评审工作应该予以高度重视。系统设计包含较高的技术和能力因素,要求设计评审人员的组成要全面,且评审人员要具有丰富的系统设计经验,只有这样才能够很好地完成评审和把关任务,防止评审工作流于形式。进行设计评审时,评审人员要以正确、负责的心态对待评审工作:一是要查找设计中存在的问题,而不是故意找茬,与设计人员过不去;二是要认识到评审工作责任的重大,如果评审工作不负责任将很可能使许多人的辛勤劳动被葬送,企业将因此付出巨大的代价。(3)复用技术的采用软件设计复用就是在进行系统设计时,发现并利用其他项目的设计成果,直接应用或进行少量修改后应用于新项目的过程。由于复用的设计已经经过其他项目的应用检验,所以复用后的设计会具有较高的设计质量。在系统设计过程中,设计人员要善于发现可复用的设计单元,善于使用复用技术提高自己的工作效率。(4)版本控制与管理对设计阶段的各个阶段性成果也需加强跟踪和管理,否则,容易使设计人员随意地进行设计结果的修改,造成设计结果的混乱。项目经理应加强设计阶段的阶段性成果的管理和控制工作,即需要将设计阶段再划分为多个子阶段,对每个子阶段完成的工作纳入管理。如果设计人员要进行设计变更,应该按照一定的变更处理流程来进行。通过这种方式,可有效防止设计工作及版本控制的混乱,提高设计成果的质量。(5)注重软件的结构设计一个好的体系结构应具备以下特征:1)具有良好的接口定义规范,便于实现与其他系统的数据交换及构件的复用。2)具有良好的系统适应性,即在需求发生变化时,软件系统能够以最小的代价适应变化的需要。3)支持并行的软件开发,即优秀的体系结构,可使软件系统的复杂性降低,使整个开发工作可管理性增强,便于实现多个开发单位的并行开发工作。4)良好的技术适应性,即系统容易适应技术的发展和变化。6.5系统设计阶段主要工作内容及采用的工具和方法软件设计分为两个主要的工作阶段:①概要设计。主要工作是将软件需求转化为数据结构和软件的系统结构;②详细设计。通过对软件结构与功能模块的细化工作,得到软件程序的数据结构、算法和实现流程。软件设计的方法主要有结构化设计方法和面向对象的设计方法两大类。本节讨论系统设计阶段的结构设计、功能设计、信息模型设计、过程模型设计以及界面设计,并介绍一些在系统设计阶段常采用的设计工具。6.5.1体系结构设计6.5.1.1体系结构设计概述软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。6.5.1.2体系结构设计原则体系结构设计的原则包括:合适性、结构稳定性、代码可复用性及模块可扩展性。(1)合适性是指体系结构是否适合于软件的“功能性需求”和“非功能性需求”。(2)结构稳定性体系结构是系统设计的第一要素,体系结构变动,建筑在其上的用户界面、数据库、模块、数据结构等也要跟着变动,这将导致项目发生混乱。所以体系结构一旦设计完成,应当保持其相对稳定不变。(3)模块可扩展性对于软件产品来讲,变化是绝对的,不变化是相对的。对于系统设计来说,要求系统设计应该适应这种变化。体系结构的稳定性是根据那些稳定不变的需求而设计的,体系结构的可扩展性则是依据那些可变的需求而设计的。稳定性和可扩展性二者之间存在辨证的关系:系统若不可扩展,那么就没有发展前途;软件系统‘‘可扩展”的前提条件是“保持结构稳定”,否则软件难以按计划开发出来。(4)代码可复用性软件复用技术有利于提高产品的质量、提高生产率和降低成本。通常一个新系统,大部分的内容是成熟的,小部分内容是创新的。可复用