1、软件工程的基本概念软件工程是指导软件开发、运行、维护的系统方法。软件工程是强调使用生存周期方法和各种结构分析及设计技术。这些方法和技术适用于软件生存周期的各个阶段。所谓软件生存周期,是指一项软件从构思起,从经过开发成功投入使用,到停止使用或被另一项软件代替的全过程。软件工程采用的生存周期方法就是从时间角度对软件开发的维护的复杂问题进行分解,把软件生存的漫长周期依次划分为若干阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。采用软件工程方法开发软件时,从对任务的抽象逻辑分析开始,一个阶段一个阶段地进行开发。前一个阶段任务的完成是下一阶段开始进行的前提和基础,而后一阶段任务的完成使得肖一
2、阶段提出的结果更加具体化。每一阶段的开始和结束都有严格标准,文档中阶段通信的工具,是阶段衔接的纽带。概括起来,软件工程的基本思想是:(1) 软件开发划分为若干个阶段,每个阶段的任务相对独立和简单。(2) 完成各阶段任务是使用系统化技术和方法论。(3) 适时地建立里程碑,从技术和管理两方面加以严格审查。(4) 在软件的整个生存周期中编制完整的文档。根据中华人民共和国国家标准 GB8567-88计算机软件产品开发文件编制指南规定,软件生存周期可以分为六个阶段:可行性研究与计划阶段,需求分析阶段,设计阶段、实现阶段、测试阶段和运行与维护阶段。其中:可行性研究与计划阶段,主要确定软件的开发目标和总体的
3、要求,进行可行性分析、投资效益分析,制定开发计划。需求分析阶段,重点对被设计的软件进行系统分析,确定对软件的各项功能,性能需求和设计约束,确定对文档编制的要求。设计阶段,根据软件需求提出多个设计,分析每个设计能履行的功能并进行相互比较,最后确定一个设计,包括软件的结构、模块的划分、功能的分配以及处理流程。当软件比较复杂的情况下,设计阶段可分成概要设计和详细设计两个步骤。 实现阶段,要完成源程序的编码、编译(或汇编)和排错调试,得出无语法错误的程序清单。测试阶段,对提出的程序全面进行测试,检查审定已编制出的文档。运行和维护阶段,软件将在运行使用中不断地被维护,根据新提出的需求进行必要而且可能的扩
4、充和删改。总之,采用软件工程可以大提高软件开发的成功率,软件的质量和生产率也会明显提高。一、可行性研究与计划软件开发之初必须要搞清楚解决的问题是什么,因此,进行可行性研究与计划是软件开发的第一步。明确软件开发目标、研究软件能否实现、提出开发计划就是可行性研究与计划的目的和任务。1 主要任务首先确切地定义用户要求解决的问题,也就是问题的性质、软件的目标和总的要求,然后是用最小的代价在尽可能短的时间内确定问题是否能够解决。具体就就是,在澄清了问题定义之后,要导出系统的逻辑模型,从此出发探索若干种解决办法。对每种解决办法都要认真仔细研究三个可行性:(1)技术可行性,即回答现有技术条件能否完成软件。(
5、2)经济合理性,即回答软件的成本与效益相比是否合算。(3)实施可行性,即回答软件在实际使用时是否可行得通。所以说,可行性研究与计划阶段要解决的关键在于对今后的行为提出建议;如果问题没有可行的解,立刻停止软件开发,以免造成更大的浪费;如果问题值得一解,则要推荐一个较好的解决方案,并为今后的工作制定一个初步的计划。 2基本步骤(1)对用户需求和现实环境进行调查。分析人员要访问有关用户,仔细阅读和分析有关材料,认真倾听理解用户口头提出的需求,从而确定问题的性质、软件的目标和规模。在复查确认的基础上,确保要解决的问题即用户要求解决的问题。(2)提出解决办法。要对现有系统进行认真研究,根据用户需求导出新
6、系统的高层逻辑模型。一般用数据流图和数据字典表示。然后把新系统的逻辑模型与用户重新交换意见,复查问题定义、工程规模和目标。从建议的逻辑模型出发,提出若干个较高层次的物理解法供比较和选择,提出书面材料。(3)进行可行性研究。根据书面材料和有关资料对欲开发的软件从经济、技术和实施等方面进行可行性研究,写出可行性研究报告。(4)评审。根据可行性研究结果,评审和审批决定软件项目是否继续。若项目可行,则制订初步的软件开发计划。3主要要求(1)实施可行性切不可忽略,技术上、经济上可行,但实施不可行的软件同样行不通。(2)进行成本/效益分析要提供几种可供选择的解答,要有确切的数据和估算方法,避免主观臆断。(
7、3)软件开发计划中要有明确的、可检查的标志。要提交齐全的、可验证的文档。包括: 可行性研究报告; 初步的软件开发计划。总之,可行性研究与计划的关键在于保证软件开发人员和用户目标一致的前提下,提交供审查批准的行动方案。二、需求分析需求分析也叫要求分析,指在准确地解决“软件必须实现什么”的问题。1主要任务(1) 确定对软件的综合需求包括四方面的需求: 功能需求,即要划分出软件必须完成的一切功能。 性能需求,包括需要的存储容量、安全性、响应时间等。 运行需求,主要是对软件运行时所处环境的要求。如支持软件运行的系统软件是什么;采用什么数据库管理系统;需要什么样的外存储器和数据通信接口等。 将来可能提出
8、的需求,即列出那些虽然眼下不属于系统开发范畴,但将来可能会提出来的需求,以便在设计过程中考虑将来的扩充和修改。(2)分析软件的数据需求任何一个软件本质上都是信息处理系统,软件必须处理的信息和软件应该产生的信息在很大程度上决定着软件的面貌,对软件设计影响深远。因此,分析软件的数据需求就成为需求分析阶段的重要任务之一。软件中的数据分析要建立在对软件功能理解的基础上,借助图形工具进行。对于要长期保存的数据分析,一般要分四个阶段进行: 对数据元素进行分组并且规范化,即把软件将要处理的数据元素分组归并成若干个实体,建立起规范化的关系。 画出实体关系图,来描述不同实体之间的关系。 事务分析,包括划分事务的
9、入口点,确定为了满足事务的数据需求所需要的实体联系数目、实体间的事务流以及需要的访问类型等等。 建立数据模型,来表明事务的类型、具体的通路、重要的加载和周期等。(3)推到出软件的逻辑模型一般用数据流图、数据字典和主要的处理算法来表示这个逻辑模型。(4)修正软件开发计划即把分析过程中得到的更深入具体的了解,在可行性研究与计划阶段制定的开发计划中修正。(5)快速产生软件原型即在较短的时间内将软件雏形呈现在用户面前,使用户可以获得关于未来的软件的更直接具体的概念,从而能够更准确地提出需求。2基本步骤既然软件本质上是信息处理系统,即将输入数据经过处理转变为输出信息的过程,而数据又决定了需要的处理和算法
10、,因此需求分析的着眼点就是数据。(1)调查开发软件的环境,进一步明确用户需求。首先搞清输出数据是由哪些元素组成的,然后沿数据流图从输出端往输入端回溯,得出输入数据元素,初步明确有关算法,交由用户仔细进行复查。(2)细化数据流图。通过功能分解可以完成数据流图的细化,即把数据流图扩展到更低的层次,之后得到一组新的数据流图,不同的元素之间的关系变得更清楚了。(3)编制文档。经过分析确定了软件具有的功能和性能,定义了软件中的数据并简略描述了处理的算法,这时首要任务是编制一份完整、一致、精确且简明易懂的软件需求说明书,此外还要修正开发计划行等。(4)严格履行审查手续。分析结果产生后,要成立审查小组对分析
11、结果进行审查,待审查通过,鉴定认可之后,方可进行下阶段工作。3主要要求(1)需求分析阶段的工作,主要由分析员承担,用户一方应派负责人代表参加。而分析员通常由研制方业务资历较高的人担任,他处在用户和设计人员之间,沟通彼此的认识和见解。经过充分分析,确定下来的软件需求应该在所编写的软件需求说明书中确切地阐述出来。(2)需求分析要以运行环境为基础,需求说明书要经过用户确认。(3)要交付需求说明书和软件开发计划等文档。需求分析是软件生存周期中的一个重要阶段。软件的功能和性能、软件需求的运行环境都在这阶段确定下来。分析的重点是数据流,需求分析结果的正确性决定软件开发能否成功。三、软件设计经过需求分析阶段
12、的工作,建立了由数据流图、数据字典和一组算法描述所定义的软件系统逻辑模型,软件必须做什么已经清楚了,下来就要进行设计阶段解决“怎样做”的问题了。1主要任务对于较大规模的软件,设计阶段也往往再细分为概要设计和详细设计两个阶段。概要设计的主要任务就是根据软件需求说明,建立目标系统的总体结构和模块间的关系,定义各功能模块的接口、控制接口,设计全局数据库/数据结构,规定设计限制,制订测试计划;详细设计的主要任务是对概要设计中产生的功能模块进行过程描述,设计功能模块的内部细节,包括算法和数据结构,为编写源代码提供必要的说明。对于小规模的软件,则要一次设计到底。应该说,经过概要设计后产生的程序、文件、数据
13、库、处理过程和文档等物理元素仍处于“黑盒子”状态,经过详细设计之后,则得到目标系统的精确描述,软件系统的“蓝图”就基本呈现出来了。2基本步骤(1)建立目标系统的总体结构。从软件需求出发,对于大规模软件系统,可以分解划分为若干子系统,然后为每个子系统定义功能模块及各功能模块间的关系,并描述各子系统的接口界面;对于小规模软件系统,则可按软件需求直接定义目标系统的功能模块及模块间的关系。对各功能模块要给出功能描述,数据接口描述,外部文件及全局数据定义。(2)数据库设计。针对数据需求进行数据库设计,经历模式设计、子模块设计、完整性和安全性设计、优化等四个步骤。(3)模块设计。将概要设计产生的构成软件系
14、统的各个功能模块逐步细化,形成若干个程序模块(可编程模块) 。采用某种详细设计表示方法对各个程序模块进行过程描述,确定各程序模块之间的详细接口信息,拟定模块测试方案。(4)制定测试计划。在软件设计中就考虑测试问题,能促使提高软件可测试性。(5)编制文档并进行审查。要编制完整的文档,并对软件设计结果进行严格的技术审查,审查通过后,有关人员要签字认可。3主要要求(1)在设计目标系统的整体结构时,应力争使其具有好的形态,各功能模块间要相对独立,降低模块接口的复杂性。(2)模块设计要尽可能按结构化程序设计原则进行。要详细地规定各程序模块之间的接口,包括参数的形式和传送方式、上下层调用关系等,确定模块内
15、的算法及数据结构。(3)要交付齐全、可验证的文档,包括: 概要设计说明书; 详细设计说明书; 数据库设计说明书; 模块开发卷宗; 测试计划。总之,软件设计就是把软件需求转化为软件的具体设计方案的过程。首先要根据软件需求,采用结构化设计技术,导出软件模块总体结构;其次是使用表格、流程图或文字等方式给出软件各个模块的具体过程描述。软件设计的结果是编程实现的直接依据。四、软件实现实现阶段亦即软件编程或叫软件编码阶段,是为软件设计阶段得出的每个模块编写程序。1主要任务就是将详细设计说明转化为所要求的程序设计语言或数据库语言书定的源程序。并对编制出的源程序进行程序单元测试,验证程序模块接口与详细设计说明
16、的一致性。2基本步骤(1)选择程序设计语言。大量实践证明,高级程序设计语言优于汇编语言。但选择何种高级程序设计语言,有三条实用标准: 高级程序设计语言有本身的特点,不同的语言适应范围有所不同。比如FORTRAN 语言更适合科学计算;VB、PB、Delph 则更适合辅助管理; C、ADA 更适合于系统和实时应用;LISP 更适合于组合问题领域;PROLOG 更适合于表达知识和推理。 环境因素,如问题性质。要解决的问题是科学计算呢,还是实时应用或辅助管理?这对程序设计语言选择有一定要求。 用户熟悉程度。(2)编程。使用所选定的程序设计语言对每个程序模块进行编程。尽管这步工作十分具体,难度相对不大,
17、但也要配齐必要的人力,以确保程序质量。程序员要掌握结构化程序设计、编程等技术方法,注意抓住程序设计语言或数据库操纵语言的特点,精心考虑程序的结构和文件组织,使编制出的程序易读、易懂、易维护、易移植,执行效率高。(3)进行程序单元测试。按照事先制定的测试方案产生一批测试数据,按照规定的方法进行程序单元测试。(4)编写完整的文档。3主要要求(1)要尽量选择符合国家标准的、适用的程序设计语言,采用结构化的程序设计方法。(2)为了提高程序的可理解性,要在源程序中加入适当的注解。(3)尽量采用增加程序可读性的排版格式,即程序内部的良好文档资料、有规律的数据说明格式、简单清晰的语句构造和输入/输出格式等。
18、(4)利用适当的软件工具辅助编程,以提高生产率和减少程序中的错误。(5)不仅要考虑对合法的输入产生测试用例,而且要对非法的、非预期的输入产生测试用例。既要对正常的处理路径进行测试,也要考虑对出错处理路径进行测试。程序模块的测试用例、预期结果及测试结果应存档保留。(6)要提交“模块开发卷宗” 。总结一下,编程是在软件设计之后进行的,程序质量主要由设计质量决定。但编程选用的语言、编程风格和途径对程序质量同样有较大影响。五、软件测试任何软件,在开发的各个阶段,由于会遇到极其复杂的情况,加上开发人员的主观认识总不可能那么周密而完美无缺,因而会不可避免地出现错误。测试阶段就是要找出并排除这些错误。1主要
19、任务所谓测试就是为了发现程序中的错误而执行程序的过程。由此定义出发,测试的主要任务就是要发现错误并改正错误,提交高质量的完全符合用户需要的软件。有人认为测试的目的是为了说明程序的正确,只要随便找几个数据,把程序走通就行了。这种认识不仅不对,而且是非常有害的。因为这可能导致去找那些容易在机器上通过的测试数据,致使隐藏的错误不易被发现。另一方面,个别测试数据走得通并不意味着程序里没有问题。因此,我们测试的目的是立足于找错误,暴露问题。2基本步骤与开发过程类似,软件测试过程也要分步骤进行,每个步骤在逻辑上是前一个步骤的继续。大型软件系统的测试可分为五个步骤:(1)模块测试。在软件设计中,每个模块要完
20、成一个子功能,模块间是相对独立的。因此,有可能把每个模块作为一个单独的实体来测试,而且通常比较容易设计检验模块正确性的测试方案。通过模块测试可以发现编程和设计中的错误,保证每个模块作为一个单元正确运行。(2)子系统测试。即把经过测试的模块装配在一起形成一个子系统来测试,重点测试模块间的协调、通信和模块的接口。(3)系统测试。即把经过测试的子系统装配成一个完整的软件系统来测试。在此过程中不仅要发现编程和设计的错误,还要验证整个软件系统是否达到了要求。如果把模块测试称为单元测试的话,那么子系统测试和系统测试则称为集成测试。(4)验收测试。验收测试是把软件系统作为单一的实体进行测试,测试内容与系统测
21、试基本类似,但是它是在用户积极参与下进行的,而且主要使用实际数据进行测试。这样就可验证软件是否确实能够满足用户的需要。(5)双轨运行。重大的软件在验收后也不可立刻撤掉原有(手工)系统而投入生产性运行,必须要经过一段时间的双轨运行考验。这样可以使用户对软件更熟悉,验证有关文档,在准生产环境中全负荷测试并验证软件,对所有文件进行整理。3主要要求(1)软件测试要建立独立的测试小组进行,并邀请用户一起参加。程序员应避免测试其本人的程序;程序设计单位在条件允许时应避免测试本单位编制的程序。测试的评审者,可邀请测试专家或其它人员。(2)要对软件的输入/输出处理进行测试,使其达到设计要求,软件的容量要留有足
22、够的余地。(3)测试前应仔细研究有关资料,测试中由程序编制者介绍程序算法,参加者随时提出问题,由编制者回答。对数据引用、数据说明、计算、比较、控制流程、接口、输入输出等逐一检查测试。测试过程中应防止审查者和软件制作者之间产生对立情绪。测试用的例子应预先估算输出结果,以便比较。全部预期结果、测试结果及测试数据应存档保留。(4)要交付完整的文档: 测试分析报告; 用户手册和操作手册; 项目开发总结报告。软件测试是保证软件可靠性的主要手段,此阶段的任务是艰巨而繁重的。测试计划、测试方案和测试结果直接影响软件质量和可维护性,要仔细记录和保存。六、使用和维护使用和维护是软件生存周期的最后一个阶段,即在软
23、件交付使用之后,为了改正错误或满足新的需要而修改软件的过程。1主要任务首先,要发现和修改在开发阶段产生、在测试阶段又未发现的错误,即改正性维护;其次,要针对运行环境的变化修改软件,即适应性维护;再次,在软件使用过程中,用户往往提出许多的需求,如增加功能或修改已有的功能,对此要进行完善性维护。这部分工作占整个维护工作的大部分;最后,为了提高软件的可靠性,减少以后的维护工作量,还要时常采取一些预防性措施,修修补补,即预防性维护。总之,软件使用和维护的过程,也就是软件功能不断扩充和更趋完善的过程。2基本步骤(1)建立维护组织。在使用和维护活动开始之前,就要正式或非正式地建立维护组织,明确责任、任务和
24、维护程序,从而大大减少可能出现的维护紊乱。(2)维护报告制度化。由软件用户或维护人员根据软件出现的错误、产生的问题或情况的变化向维护管理人员提交“软件问题报告” ,然后由维护人员向维护管理人员提交“软件修改报告” 。(3)维护要求审定。由维护管理人员对“软件修改报告”进行评审,并赋予优先级;然后由维护人员分析维护需求,对满足要求所需的工作量和条件进行估计,确定维护实施计划。(4)实施维护。按照一定的步骤对软件进行修改或扩充,完成后重新测试修改后的软件,修改所有相关的文件。通知用户修改已完成,并将修改以后的版本提交给用户。最后对维护活动进行评价,以便指导以后的维护工作。3主要要求(1) 软件维护必须在严格的管理控制下进行,避免错上加错的情况出现。(2) 尽量避免出现修改的副作用,在修改前要权衡利弊,全面考虑。(3) 在有效的管理控制下,有步骤地进行修改,软件修改后要通过测试。(4) 文档在软件使用和维护中至关重要,要与程序代码同时维护。(5) 软件使用和维护中要交付两个文档: 软件问题报告。 软件修改报告。总结起来,使用和维护是软件生存周期的最后一个阶段,也是最为费时、费力的一个阶段。由于软件工程的主要目的之一就是提出软件的可维护性,因而软件开发各阶段都要充分考虑软件维护问题。