软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据以及相关文档的完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文材料。
计算机软件的开发和维护过程所遇到的一系列严重问题。
做好软件定义时期的工作,是降低软件成本提高软件质量的关键。
用工程、科学和数学的原则和方法研制、维护计算机软件的有关技术及管理方法。
抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象、自顶向下、逐层分解的办法控制软件开发过程的复杂性。例如:软件瀑布模型、结构化分析方法、结构化设计方法,以及面向对象建模技术等都体现了抽象的原则。
将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。
模块是程序在逻辑上相对独立的成分,是独立的编程单位,应有良好的接口定义。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统。
要求在一个物理模块内集中逻辑上相互关联的计算机资源,保证 模块之间具有松散的耦合,模块内部具有较强的内聚。这有助于加强模块的独立性,控制解的复杂性。
软件开发过程中所有概念的表达应该是确定的、无歧义的、规范的。这有助于人们之间在交流时不会产生误解、遗漏,保证整个开发工作协调一致。
整个软件系统(包括程序、文档和数据)的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致。
软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审。
开发大型的软件系统需要对系统自顶向下、逐层分解。系统分解应遵循系统已于检查、测试、评审的原则,以确保系统的正确性。
把软件生命周期划分为若干个阶段,并相应地制定出切实可行的计划,然后严格按照计划对软件的开发和维护工作进行管理。
软件的质量保证工作不能等到编码阶段结束之后再进行。错误发现与改正越晚,所需付出的代价也越高。因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵循的重要原则。
采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。
应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使得所得到的结果能够清楚地审查。
通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也称为范型(paradigm)。
问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”
通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。
这个阶段回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决方法吗?”
技术上、经济上、操作上、时间上、法律上
这个阶段的任务仍然不是具体解决问题,而是确定“为了解决这个问题,目标系统必须做什么?”,主要是确定目标系统必须具备哪些功能。
系统分析员必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图(DFD)、数据字典(DD)和简要的算法表示。
在需求分析阶段确定的系统逻辑模型是以后设计和实现系统的基础。这个阶段的一项重要任务是用正式文档准确地记录对目标系统的需求,这份文档通常称为 规格说明书(specification)。(SRS)
这个阶段必须回答的关键问题是:“怎样实现目标系统?”
成果:系统结构图(SC)
一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。总体设计的另一项主要任务是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系。
这个阶段的任务就是把解法具体化,也就是回答这个关键问题:“应该怎样具体地实现这个系统呢?”
这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
详细设计也称为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。
这个阶段的关键任务是写出正确的、容易理解、容易维护的程序模块。
程序员应该根据目标系统的性质和实质环境,选择一种适当的高级程序设计语言,把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。
这个阶段的关键任务是通过各种类型的测试使软件达到预定的要求。
最基本的测试是集成测试和验收测试。
集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。
验收测试是按照规格说明书的规定,由用户对目标系统进行验收。
必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。
这个阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。
瀑布模型是文档驱动的。
瀑布模型的特点:
阶段间具有顺序性和依赖性
推迟实现的观点
瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要指导思想。
质量保证的观点
快速原型模型适用于中小型软件,且需求模糊的用户。
快速原型模型的特点:
种类:
使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
**增量:**小而可用的软件
增量模型的特点:
螺旋模型是风险驱动的。
螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险。理解这种模型的一个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。
螺旋模型的特点:
一个螺旋式周期:
构建集成模型的特点:
可行性研究的目的不是解决问题,而是确定问题是否值得去解决。
可行性研究最根本的任务是对以后的行动方针提出建议。
可行性研究的本质是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。
可行性研究需要的时间长短取决于工程的规模。一般来说,可行性研究的成本只是预期的工程总成本的5%~10%。
典型的可行性研究过程有下述一些步骤:
分析员对问题定义阶段书写的关于规模和目标的报告书进一步复查确认,改正含糊或不确切的叙述,清晰地描述对目标系统的一切限制和约束
优秀的设计过程通常总是从现有的物理系统出发,导出现有系统的逻辑模型,再参考现有系统的逻辑模型,设想目标系统的逻辑模型,最后根据目标系统的逻辑模型建造新的物理系统。
通过前一步的工作,分析员能够使用数据流图,描绘数据在系统中流动和处理的情况,从而概括的表达出对新系统的设想。为了把系统描绘的更清洗准确,还应该有一个初步的数据字典,定义系统中使用的数据。
新系统的逻辑模型实质上表达了分析员对新系统必须做什么的看法。分析员应该和用户一起再次复查问题定义、工程规模和目标,这次复查应该把数据流图和数据字典作为讨论的基础
前4个步骤构成一个循环,直到提出的逻辑模型完全符合系统目标。
分析员应该从他建议的系统逻辑模型出发,导出若干个较高层次的物理解法供比较和选择。
导出供选择的解法的最简单的途径,是从技术角度出发考虑解决问题的不同方案。
分析员应该为所推荐的方案草拟一份开发计划,除了制定工程进度表之外还应该估计对各类开发人员和各种资源的需要情况,应该指明什么时候使用以及使用多长时间。
此外,还应该估计系统生命周期每个阶段的成本。
最后,应该给出下一个阶段(需求分析)的详细进度表和成本估计。
系统流程图是概括地描绘物理系统的传统工具。它的基本思想是用图形符号以黑盒子形式描绘组成系统的每个组件(程序、文档、数据库、人工过程等)
系统流程图表达的是数据在系统各部件之间流动的情况,而不是对数据进行加工处理的控制过程,因此尽管系统流程图的某些符号和程序流程图的符号形式相同,但是它却是物理数据流图而不是程序流程图。
数据流图是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换(加工、处理)。
四种基本符号: