软件是计算机系统中与硬件相互依存的部分,包括:
软件是三者的完整集合。
软件工程是应用计算机科学理论、技术及工程管理原则和方法,研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
工程项目的三个基本要素:进度、成本和质量的可控
软件工程是一门工程性学科,目的是成功地建造一个大型软件系统。所谓成功,就是要达到以下几个目标:
付出较低的开发成本。
达到要求的软件功能。
取得较好的软件性能。
开发的软件易于移植。
需要较低的维护费用。
能按时完成开发任务,及时交付费用。
开发的软件可靠性高。
软件工程方法学包括三个要素,即方法、工具和过程。
方法是完成软件工程项目的技术手段,回答“怎么做”问题;
工具是为运用方法提供自动或半自动的支撑环境;
过程是为了获取高质量软件所需要完成的一系列任务框架,包括支持软件开发各个环节的控制和管理。
也称为结构化方法—结构化分析(SA,Structure Analysis)、结构化设计(SD,Structure Design)和结构化编程(SP,Structure Programming),使用适当的软件工具和软件工程环境来支持结构化技术的应用。
结构化方法是用的开发模式是瀑布模型;
是文档驱动开发的一种方法;
便于分工协作,降低软件复杂度和开发难度;
提高了生产率和软件的可维护性。
适合中小型软件项目的开发。
面向对象方法学解决问题的过程是一个从一般到特殊的演绎思维过程,也包括了从特殊到一般的归纳思维过程。
- 面向对象方法开发软件的过程是一个主动、多次反复迭代(OOA、OOD、OOP)的过程,在概念和表示方法上的一致性保证了在各个开发阶段之间的无缝过渡。
- 往往采用UML语言驱动开发软件。
- 降低了软件产品的复杂性,提高了软件的可理解性,简化了软件的开发和维护难度。
- 对象的相对独立、继承和多态性,促进和提高了软件的可重用性。
适合大型软件项目的开发。
结构化方法和面向对象方法对于不同的软件系统各有优劣。
结构化方法把解空间分数据和功能两部分,可以更加清晰地进行需求分析和功能分解,数据流图能够细致地说明数据在各个功能模块之间的流动和变化,更适于系统设计的前期阶段。
面向对象方法能够把数据和功能以对象为单位封装成一个整体,更直观地表达对象的状态变化和对象间的交互,更加准确地分析功能的实现过程,更适于在软件后期细化系统的具体行为。
- 使用SA进行需求分析,建立数据字典,构建总的和分层的数据流图。
- 使用模块结构图设计系统的独立功能块,做出模块内的程序流图。
- 结合数据流图,聚合同类模块,规约类(归纳出用例图);根据程序流图,设计类的属性和类的方法。
- 使用OOD建立系统的动态模型,分析对象的行为和协作。
- 总体面向对象程序设计,细节结构化程序设计优化,实现代码层。
无论使用哪种开发方法,或者是混合哪几种开发方法,都要因地制宜,依据需求分析和系统要求,做出最好的选择或组合。
- 采取适宜的开发模型。与系统设计有关,强调的是控制易变的需求。
- 采用合适的设计方法。有助于实现软件的模块化、抽象与信息隐藏、局部化、一致性以及适应性等。
- 提供高质量的工程支持。在软件过程中,软件开发、测试、管理工具和环境对软件工程的支持颇为重要。
- 重视开发过程的管理。利用可用的资源、提高软件产品的质量、提高软件组织的生产能力等,实现有效的软件工程。
每项基本原则都非常重要,既重视软件技术的应用,又强调软件工程的支持和管理,最重要的是在实践中实施。
是指软件从构思之日起,到报废或停止使用的生命周期。
周期内有问题定义、可行性分析、需求分析、系统设计、编码和单元测试、综合测试、验收与运行、维护升级到废弃等阶段。
这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、过程、审查、并形成文档,文档便于交流或备查,以提高软件的质量且便于软件的维护。
主要任务:
这个时期的工作通常称为系统分析,由系统分析员负责完成。
软件定义时期又可以进一步划分为问题定义、可行性研究和需求分析3个阶段。
主要任务:
软件开发时期具体设计和实现在前一个时期定义的软件,前两个阶段统称系统设计,后两个阶段则称为系统实现。
主要任务:是使软件持久地满足用户的需要,具体表示为:
通常对维护时期不再进一步划分阶段,但是每一次维护活动本质上都是一次压缩和简化了的定义和开发过程。
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
概括地说,软件过程描述为了开发出用户需要的软件,什么人(Who)、在什么时候(When)、做什么事(What)以及怎么做(How)这些事以实现某一个特定的具体目标。
过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑。
软件过程模型就是一种开发策略,这种策略针对软件工程的各个阶段提供了一套泛型,使工程的进展达到预期的目的。
对一个软件的开发无论其大小,都需要选择一个合适的软件过程模型,这种选择基于项目和应用的性质、采用的方法、需要的控制,以及要交付的产品的特点。
通常使用生命周期模型简洁地描述软件工程。生命周期模型规定了把生命周期划分成各个阶段以及各阶段的执行顺序。因此,也称为过程模型。
1970年温斯顿·罗伊斯(Winston Royce)提出了著名的“瀑布模型”,直到80年代早期,它一直是唯一被广泛采用的软件开发模型。
定义:
- 从上一项活动接收该项活动的工作对象作为输入,利用这一输入实施该项活动应完成的内容给出该项活动的工作成果,并作为输出传给下一项活动。
- 评审活动的实施,确认后继续下一项活动;否则,返回前面甚至更前面的活动。
- 需求经常变化的项目而言,瀑布模型毫无价值。
优点:
缺点:
适用于:
定义:
是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
快速原型模型允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义,快速设计开发出软件系统的原型,该原型向用户展示待开发软件的全部或部分功能和性能。
缺点:
适应于:
把原型用于开发的需求分析阶段,目的是要弄清用户的需求,确定所期望的特性,并探索各种方案的可行性。它主要针对开发目标模糊,用户与开发都对项目都缺乏经验的情况,通过对原型的开发来明确用户的需求。
主要用于设计阶段,考核实现方案是否合适,能否实现。对于一个大型系统,若对设计方案心中没有把握时,可通过这种原型来证实设计方案的正确性。
这种原型主要用于及早向用户提交一个原型系统,该原型系统或者包含系统的框架,或者包含系统的主要功能,在得到用户的认可后,将原型系统不断扩充演变为最终的软件系统。将原型的思想扩展到软件开发的全过程。
是把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。
运用增量模型的软件开发过程是递增式的过程。相对于瀑布模型而言,采用增量模型进行开发,开发人员不需要一次性地把整个软件产品提交给用户,而是可以分批次进行提交。
即有计划的产品改进模型,它从一组给定的需求开始,通过构造一系列可执行中间版本来实施开发活动。第一个版本纳入一部分需求,下一个版本纳入更多的需求,依此类推,直到系统完成。每个中间版本都要执行必需的过程、活动和任务。
增量模型的最大特点就是将待开发的软件系统模块化和组件化。基于这个特点,增量模型具有以下优点:
实现难点:
适用于:
采用一种周期性的方法来进行系统开发,会导致开发出众多的中间版本。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。螺旋模型是在瀑布模型和快速原型模型的基础上增加了风险分析活动。
螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:
螺旋模型每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。
优点:
缺点:
适用于:
是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程。
该模型中,软件开发过程自下而上周期的各阶段是相互迭代和无间隙的。
在喷泉模型中,软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分。无间隙指在各项活动之间无明显边界,如分析和设计活动之间没有明显的界限。因此,易于实现软件的复用。
缺点:
适用于:
定义:
分阶段地通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,定期达到既定目标。
定义:
帮助软件企业对软件工程过程进行管理和改进,增强开发与改进能力,按时地、不超预算地开发出高质量的软件
对象点、代码行(LOC)和功能点(FP)估算法,这是不同的估算技术,但有许多共同特性:
给出了3个层次的软件开发工作量估算模型,这3个层次的模型在估算工作量时,对软件细节考虑的详尽程度逐级增加。
3个层次的估算模型分别是:
使用规模估算信息,应用组装模型使用的是对象点;早期设计阶段模型使用的是功能点,功能点可以转换为代码行;体系结构模型使用的是代码行。
甘特图(Gantt chart)又称为条状图,通过条状图来显示项目、进度,和其他时间相关的系统进展的内在关系随着时间进展的情况。以提出者亨利·劳伦斯·甘特(Henry Laurence Gantt)先生的名字命名。甘特图以图示通过活动列表和时间刻度表示出特定项目的顺序与持续时间。
是制定进度计划时另一种常用的图形工具,它同样能描绘任务分解情况以及每项作业的开始时间和结束时间;此外,它能显式地描绘各个作业彼此间的依赖关系。
在PERT图中,用箭头表示作业(例中的刮旧漆、刷新漆以及清理油漆),用圆圈表示事件(一项作业的开始或结束)。需要明确的是,事件仅仅定义时间点,并不消耗时间和资源。
绘制出工程网络后,系统分析员就可以借助它估算工程进度。为此,需要在PERT图上增加一些必要的信息。
某些作业有一定程度的机动余地,即实际开始时间可以比预定时间晚一些,或者实际持续时间可以比预定的持续时间长一些,但并不影响工程的结束时间。一个作业的全部机动时间的计算公式如下所示:
数据流图(没有任何的物理部件,描述的是业务数据的来龙去脉及加工规则)或数据流程图(Data Flow Diagram,DFD)是描述系统中数据流程的一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。
数据流图是系统逻辑功能的图形表示,即使不是专业的计算机技术人员也容易理解它。因此,数据流图是系统分析员和用户之间极好的沟通工具。
此外,设计数据流图时只需要考虑必须完成的基本逻辑功能,完全不需要考虑如何具体实现这些功能,所以,数据流图也是软件设计的基础。
在结构化开发方法中,数据流图是需求分析阶段产生的结果。根据具体转化方式,可以将数据流图转化为软件结构图。因此,分层数据流图是结构化开发方法的核心和基础。
数据流。是数据在系统内传播的路径,因此,数据流由一组成分固定的数据组成。数据流必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。
数据源或终点。数据源或终点则代表系统之外的实体,可以是人、物或其他软件系统(不能是自身系统)。
对数据的加工。加工就是对数据进行处理,它接收一定的数据输入,对其进行处理,并产生输出。通常,在数据流图中忽略出错处理,基本要点是描绘“做什么”,而不是“怎么做”。
数据存储。数据存储表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。
1)顶层(0层)数据流图的绘制:
2)1层数据流图的绘制:
4)画子加工的分解图:
5)对数据流图和加工编号:
1)命名。不论数据流、数据存储还是加工,合适的命名使人们易于理解其含义。
2)画数据流而不是控制流。数据流反映系统“做什么”,不反映“如何做”,因此,箭头上的数据流名称只能是名词或名词短语,整个图中不反映加工的执行顺序。
3) 一般不画物质流。数据流反映能用计算机处理的数据,因此,对目标系统的数据流图一般不要画物质流。
4) 保证数据守恒。每个加工至少有一个输入数据流和一个输出数据流,反映出此加工数据的来源与加工的结果,且输入流不同于输出流(否则,加工只是一个管道,毫无意义)。
5)编号。分层的数据流图中,上层图为父图,直接下层图为子图。子图及其所有的加工都应按层次级别编号。
6) 父图与子图的平衡。子图的输入输出数据流同父图相应加工的输入输出数据流必须一致(在数量和名字上相同),即父图与子图的平衡。
7)局部数据存储。局部的数据存储不是父图中加工的外部接口,而只是本图中某些加工之间的数据接口。
8)提高数据流图的易懂性。合理分解加工,可以减少加工之间输入、输出数据流的数目,增加数据流图的可理解性。
9)分解要掌握适度。当分解涉及具体的实现一个功能时就不应该再分解了;每次只对一个功能进行分解。
定义:
就是贯穿整个软件开发生命周期、对软件产品进行验证和确认的活动过程,其目的是尽快尽早地发现在软件产品中存在的各种问题,即与用户需求、预先的定义不一致的地方。
测试只能查找出程序中的错误,而不能证明程序是正确的。
定义:
把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。
白盒测试法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按预定要求正确工作。因此,白盒测试又称结构测试。
定义:
是以程序内部的逻辑结构为基础的设计测试用例的技术。从覆盖源程序语句的详尽程度分析,大致有以下一些不同的覆盖标准: