1.问题定义
问题定义是弄清用户需要计算机解决的问题根本所在,以及项目所需的资源和经费.通过向用户调查,编写"系统目标与范围的说明"文档,该文档需再次经用户签字同意.
2.可行性研究
可行性研究是为了弄清所定义的项目是不是可能实现和值得进行的.研究的过程,实际上是一次大大简化了的系统分析和系统设计的过程.但是,这个过程的目的不是解决用户提出的问题,仅是确定这个问题是否值得去解决,即在投人大量资金前研究成功的可能性,减少所冒的风险.即使研究的结论是不值得进行,花在可行性研究上的精力也不算白费,因为它避免了一次更大的浪费.
(1)研究的内容
对研究中可能提出的任何一种解决方案,都要从经济技术、运行和法律诸方面来研究其可行性,作出明确的结论供用户参考.
A.经济可行性 实现这个系统有没有经济效益?多长时间可以收回成本?
B.技术可行性 现有的技术能否实现这一新系统?有哪些技术难点?建议采用的技术先进程度怎样?
C.运行可行性 为新系统规定的运行方式是否可行?例如,若新系统是建立在原来已担负其他任务的计算机系统上的,就不能要求在实时在线的状态下运行,以免与原有的任务相矛盾.
D.法律可行性 新系统的开发,会不会在社会上或政治上引起侵权、破坏或其他责任问题?
(2)研究的步骤
可行性研究从消化"系统目标与范围的说明"开始,到提出关于新系统的推荐方案为止,通常要经过下列几步:
A.细化和修改"系统目标与范围的说明",得出新系统的逻辑模型,这一步又可细分如下:
1.进一步了解"系统目标与范围的说明"的含意,着重弄清用户想要解决的问题;
2.带着上述问题访问用户,弄清当前系统的工作过程,并用"系统流程图"加以描述;
3.导出当前系统和新系统的逻辑模型,用数据流图(DFD)描述;
4.再访用户修改DFD图,并对"系统目标与范围的说明"做必要的补充与修改.
后两步工作要反复进行,直到得出准确的"系统目标与范围的说明"和系统逻辑模型为止.
B.导出新系统的解决方案,根据新系统的逻辑模型,设想几种可能的解决方案,以便用户选择.
C.推荐建议的方案,在对上一步提出的各种方案分析比较的基础上,提出向用户推荐的方案.
3.需求分析
需求分析在于弄清用户对系统的全部需求,并用"需求规格说明书"的形式准确地表达出来.需求规格说明书通常由数据流图、数据字典和加工说明等一整套文档组成.这些文档既是系统逻辑模型的描述,也是下一步进行设计的依据.需求分析有如下几步:
(1)通过对现实环境的调查研究,获得当前系统的具体模型;
(2)去掉具体模型中的非本质因素,抽象出当前系统的逻辑模型;
(3)分析当前系统与目标系统的差别,建立目标系统的逻辑模型;
(4)对目标系统进行完善和补充,并写出完整的需求说明;
(5)对需求说明进行复审,直到确认文档齐全,并且符合用户的全部需求为止.
可行性研究与需求分析的工作颇为相似,但也有不同:(1)可行性分析要考虑多种解决方案,需求分析只考虑已经选定的一种解决方案;(2)前者的目的在于确定是否可行,DFD图不必分解过细,后者要对新系统做完整的描述,必须包括足够的细节.
"需求说明"应该具有准确性和一致性. 因为它是连接计划时期和开发时期的桥梁,也是系统设计的依据.任何含混不清,前后矛盾,或者一个微小的错漏,都可能导致误解或铸,成系统的大错,在纠正时付出巨大的代价.
"需求说明"应该具有清晰性和没有二义性.因为它是沟通用户和系统分析员思想的媒介,双方要用它来表达对于需要计算机解决的问题的共同理解.如果在需求说明中使用了用户不易理解的专门术语,或用户与分析员对要求的内容可以作出不同的解释,便可能导致系统的失败.
"需求说明"应该直观.易读和易于修改.为此应尽量采用标准的图形、表格和简单的符号来表示,使不熟悉计算机的用户也能一目了然.
4.软件设计
软件设计的任务,就是把分析阶段产生的需求说明转换为用适当手段表示的软件设计文档.软件设计通常分两个阶段完成.第一个阶段是概要设计,用来确定软件的结构,即软件的组成,以及各组成成分(子系统或模块)之间的相互关系.第二阶段是详细设计,其任务是确定模块内部的算法和数据结构,产生描述各模块程序过程的详细设计文档.
在设计阶段,设计人员要完成两种文档:概要设计说明书和详细设计说明书.前者主要规定软件的结构,后者则着重描述程序的过程.
(1)概要设计说明书包括.
·以图表形式表示的软件总体结构;
·模块的外部设计,包括关于各模块功能性能与接口的简要描述;
·数据结构设计,包括数据模式、访问方法和存储要求等.
(2)详细设计说明书包括
·表示每一模块软件结构的图表,确定每一模块使用的数据结构;
·对逐个模块的程序描述,包括算法和逻辑流程,输人/输出项、外部接口等;
·为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的测试.
传统的程序设计方法是结构化程序设计:自顶向下,逐步求精;其程序结构是按功能划分若千个基本模块,这些模块形成一个树状结构 ,各模块之间的关系尽可能简单,在功能上相对独立,每一模块内部均是由顺序、选择和循环三种基本结构组成,其模块化实现的具体方法是使用子程序.结构化程序设计由于采用了模块分解与功能抽象、自顶向下、分而治之的手段,从而有效地将一个较复杂程序系统的设计任务分成许多易控制和处理的子任务,这些任务都是可独立编程的子程序模块.每一个子程序都有一个清晰的界面,使用起来非常方便.结构化程序设计方法虽然具有很多的优点,但它是一种面向数据/过程的设计方法,它把数据和过程分离为相互独立的实体,程序员在编码时必须时刻考虑所需处理的数据的格式.对于不同的数据格式,即使要做同样的处理或对相同的数据格式要做不同的处理,都需要编写不同的程序,因此结构化程序的可重用性不好.另一方面,当数据和过程相互独立时,总存在着用错误的数据调用正确的程序模块或用正确的数据调用了错误的程序模块的可能性.因此,要使数据与程序保持相容,已经成为程序员的一个沉重负担.上述这些问题,结构化程序设计方法本身是解决不了的,它需要借助面向对象程序设计方法给予解决.
面向对象程序设计既吸取了结构化程序设计的一切优点,又考虑了现实世界与面向对象解空间的映射关系,它所追求的目标是将现实世界的问题求解尽可能简单化.面向对象程序设计将数据及对数据的操作放在一起,作为一个相互依存、不可分割的整体来处理,它采用数据抽象和信息隐藏技术,将对象及对对象的操作抽象成一种新的数据类型一类,并且考虑不同对象之间的联系和对象类的重用性.面向对象程序设计优于传统的结构化程序设计,其优越性表现在:它有希望解决软件工程的两个主要问题一一软件复杂性控制和软件生产率的提高,此外它还符合人类的思维习惯,能够自然地表现现实世界的实体和问题,它对软件开发过程具有重要意义.面向对象程序设计能支持的软件开发策略有:①编写可重用代码;②编写可维护的代码;③共享代码;④精化已有的代码.有了高质量的可重用代码就能有效地降低软件的复杂度和提高开发效率.面向对象方法,尤,其是它的继承性,是一种代码重用的有效途径.开发者在设计软件时可以利用一些已经被精心设计好并且经过测试的代码,这些可重用的代码被组织和存放在程序设计环境的类库中.由于类库中这些类的存在,使以后的程序设计过程变得简单,程序的复杂性不断降低,正确性不断加强,也越来越易于理解、修改和扩充.
5.系统实现
系统实现分编码和测试两个阶段.编码是使用选定的程序设计语言,把模块的过程性描述翻译为用该语言书写的源程序.为此,程序设计人员除应熟悉所用语言的功能和程序开发环境外,尤其要仔细阅读设计文档一详细设计文档和概要设计文档.弄清要编码模块的外部接口与内部过程.编码产生的源程序,应该正确可靠,简明清晰,而且具有较高的效率.前两点要求是一致的 ,因为源代码越是清楚和简明,就越便于检验源代码和模块规格说明的一致性,越容易对它进行测试和维护.但是,清晰和效率却常有矛盾,要求清晰性好的程序一般效率较低,而要求效率高的程序清晰性不好.对于大多数模块,编码时应该把简明清晰放在第一位.所以,程序设计人员不仅要养成良好的编码风格,而且要十分熟悉所使用的语言,以便能得心应手、恰到好处地运用语言的特点,为提高程序的清晰性和效率服务.
编码完成后,就要对源程序进行测试.软件测试是一项繁重的工作,统计表明,开发较大规模的软件,有40%以上的精力是耗费在测试上的.即使富有经验的程序员,也难免在编码中发生错误,何况,有些错误在设计甚至分析阶段早已埋下了祸根.无论是早期潜伏下来的错误或编码中新引人的错误,若不及时排除,轻则降低软件的可靠性,重则可能导致整个系统的失败.测试的目的是发现程序中的错误,是为了证明程序有错,而不是证明程序无错.在软件开发过程中,分析、设计与编码等工作都是建设性的,惟独测试带有破坏性,因为它抱着"吹毛求疵"的目的,明确宣布要在程序中"找岔子".如果为了证明程序无错而进行测试,错误就可能在你眼皮底下漏过;反之,只要抱着证明程序有错的目的去测试,就会把大部分存在的错误都找出来.