赞
踩
(1-1) 相关概念
软件,计算机软件是与计算机操作系统有关的程序、规程、规则及其文档和数据的统称。
软件 = (程序 + 数据)+文档
名词 | 解释 |
---|---|
程序 | 按预期功能和性能来设计执行的语句序列 |
数据 | 程序处理信息的数据结构 |
文档 | 与程序开发、维护和使用有关的资料 |
(1-2) 软件分类
①通用软件产品。由软件开发机构制作并在市场上公开发售,可以独立使用。
②定制软件产品。根据用户需求而开发的定制化软件产品。
两类产品的区别。通用软件产品的软件描述由开发人员自己完成;定制软件产品的软件描述由客户给出,开发人员只根据客户需求开发即可。
(2-1) 固有特性
①复杂性。软件中不仅要客观体现世界的自然规律,还要集成各种各样的功能。
②抽象性。软件不是客观存在的物质,是有大脑思考加工后的逻辑产物。
③依赖性。软件的开发和运行常受到计算机硬件的限制。
为了减少依赖性,提出来可移植性的概念。
④软件使用特性。软件在投入市场后,需要不断进行维护和再开发。
(2-2) 生产特性
①软件开发特性。软件开发特性体现在技术复杂性和管理复杂性两个方面。
技术复杂性:
软件提供的功能一般比硬件产品提供的功能要多,各项功能的实现,需要对代码的取舍、算法的优化等方面进行考虑。
管理复杂性:
- 软件产品的可视化程度底,难以判断当前的开发进度;
- 软件结构的合理性差,结构不合理会使管理成本过高。
②软件产品形式特性。软件产品设计成本极高但生产成本极低,因此软件的复制机极其容易,所以对软件的知识产权保护要格外重视。
③软件维护特性。软件维护分为纠错性维护、完善性维护和适应性维护。
纠错性维护:对投入运行软件产生的问题进行更正;
完善性维护:根据用户的再需求,对产品进行修改;
适应性维护:根据软件产品所依赖的硬件或环境来对软件进行修改。
软件危机促进了软件工程的诞生。
二十世纪六七十年代,软件规模不断扩大,其功能和复杂性都进一步增加。以往的软件开发过程无法解决这些问题,导致财力、人力等资源大量浪费。
(2-1) 软件生产率低。
表现1: 软件生产效率的提升速度远跟不上计算机的普及速度,加上开发人员的匮乏和开发方式的低下,使得供需差距不断扩大。
表现2: 由于缺乏有效的管理开发体系,现有的开发知识和经验无法充分复用,因此浪费了大量的人力、物力和财力。
(2-2) 软件产品常与用户要求不一致。
表现1: 开发人员与用户之间的信息交流往往存在着差异,因此导致诸多问题在后期集中暴露。
表现2: 开发人员与用户之间存在着知识背景、交流方式和对开发软件理解等诸多方面的差异。
(2-3) 软件复杂度的增加
表现: 缺乏有效的开发软件和开发方法,过分依赖于开发人员的技巧和创造性。因此软件的可靠性和质量开始下降。
(2-4) 不可维护性突出
表现: 软件的局限性和欠灵活性,不仅使错误常常难以纠正,也对后期的维护和完善造成阻碍。
(2-5) 软件文档不完全、不一致
表现: 由于软件文档不规范、不完整、不一致,给软件开发、交流、管理和维护带来了很多困难。
(3-1) 软件独有的开发和维护特点。
表现1: 软件的抽象性、复杂性和不可预见性,使软件开发进度难以估测、软件错误发现较晚、软件质量难以评价。
表现2: 由于软件错误往往具有隐蔽性,因此软件的纠错和维护往往难以保证。
(3-2) 软件开发人员的错误认识。
表现: 部分软件开发人员认为“软件开发就是编程”,忽视了需求分析和文档的重要性。
(3-3) 软件开发的自动化程度低。
表现: 软件开发仍然离不开开发人员的个人创造和手工操作,无法达到高度自动化生产。
(1) 早期软件工程
(2) 现代软件工程
即:按工程化的原则和方法组织软件开发是有效的,是摆脱软件危机的一个主要出路。
即:软件开发是一个多元化的过程,要充分考虑其相互关系以开发出最适合用户的软件产品。
软件工程三要素为: 过程、方法、工具。
软件质量通过可用功能性、可靠性、可用性、效率、可维护性、可移植性和可复用性等方面来综合评价。
(1-1) 可用功能性
可用功能性指软件所实现的功能是否符合规范和是否达到用户的预期需求。
(1-2) 可靠性
可靠性指软件在规定的时间内,是否能够正常的工作运行。
(1-3) 可用性
可用性指用户使用该软件所具备的基本能力。
(1-4) 效率
效率指软件在限定条件下实现某种功能所占用的计算机资源空间。
(1-5) 可维护性
可维护性指软件在环境改变或发生故障时,完成维护软件所需要的付出程度。
(1-6) 可移植性
移植性指软件在运行环境发生改变时,所需要的工作量。
(1-7) 可复用性
可复用性指在其他软件开发过程中,本软件是否可以为其他软件提供帮助或借鉴。
软件过程主要有6个活动组成,分别为沟通、策划、建模、构建、部署、进化。
(2-1) 沟通
在软件开发前,与用户沟通和协作极为重要。这对了解项目目标,收集需求和定义软件特性和功能相当重要。
(2-2) 策划
开发策划有助于是软件开发过程可视化、有序化,便于开发者了解当前的开发进度和整体开发路径。
软件项目计划
软件项目计划定义和描述了软件工程的工作内容。。它包括了执行的技术任务、可能的风险、资源的需求、工作产品和工作进度计划。
(2-3) 建模
软件开发过程可以通过模型化来建立整个软件的结构体系。同过软件模型的不断优化,为软件的开发提供更好的方案。
(2-4) 构建
对软件的编码和测试进行全方面构建,便于日后发现软件的错误。
(2-5) 部署
通过软件和客户的对接,让用户进行评测并反馈意见。
(2-6) 进化
针对客户和市场的变化进行完善修改。
软件过程的典型支持性活动
- 软件项目的跟踪与控制;
- 风险管理;
- 软件质量保证;
- 技术评审;
- 测量;
- 软件配置管理;
- 可复用管理;
- 工作产品的准备和生产。
(3-1) 结构化方法(以功能为主)
结构化方法是以软件功能为目标来进行软件构建,其中包括了结构化分析、结构化设计、结构化实现、结构化维护等相关内容。主要通过数据流的方式来对软件加工和结构化设计。
(3-2) 面向对象方法(以事物为主)
面向对象强调以问题域中的事物为中心,根据事物的本质特征进行思考和发现、认识问题。通过对事物种种特征的认识来把他们高度的抽象化为对象,通过各个对象之间的关系来设计软件模型。其中,寻找各个对象之间的关系是该过程的核心内容。
常见的软件开发工具:
静态建模:例图、类图、对象图、组件图、配置图;
动态建模:协作图、序列图、状态图、活动图。
(1) 系统软件
操作系统、驱动器、网络软件、远程通信处理器、编译器、编辑器等。
(2) 独立应用软件
办公软件、图片处理软件等。
(3) 嵌入式控制系统
什么是嵌入式控制系统?
- 一类由软件控制系统和硬件管理设备组成的系统。
智能手环、智能手表、汽车仪表盘显示软件等。
(4) 以网络为中心的交互式应用
浏览器web应用、移动设备上的APP、云计算相关等。
(5) 娱乐系统
主要由各类游戏组成。
娱乐系统的高交互质量是其与其他系统的重要区别。
(6) 建模和仿真系统
用于科研或工程领域的相关软件,旨在系统模拟物理过程和环境。
(7) 数据采集系统
通过一系列传感器采集数据并加以分析的软件。
(8) 人工智能软件
机器人、识别软件、人工神经网络等。
本节主要介绍web应用的常见三种结构。
(1-1) 结构介绍
在C/S结构的系统中,数据库安装在服务器上,应用程序则安装在客户端上。
(1-2) 结构优点
(1-3) 结构缺点
(1-4) 结构典范
微信、支付宝、微博、银行ATM取款系统等。
(2-1) 结构介绍
在B/S结构的系统中,数据库和应用程序均被安装在服务器端,用户通过浏览器来访问服务器的而应用程序,再有服务器上的应用程序直接访问数据库。
(2-2) 结构优点
(2-3) 结构缺点
(2-4) 结构典范
新闻浏览网站、电子商务网站等。
(3-1) 云计算介绍
云计算使数据处理在大量的分布式计算机上,而非本地计算机或远程服务器中。通过大量的分布式处理来完成各类程序软件的执行。
(3-2) 云计算的功用
(3-3) 云计算优点
(3-4) 云计算缺点
(3-5) 云计算典范
腾讯云、阿里云等。
一个软件系统应为用户提供价值而非无任何作用的软件产品。这一原则是下列所有原则的根基。
软件开发过程应当在合理的管理下进行,主要软件开发过程才能更加合理、高效。
软件系统应当高效运行,不浪费计算机资源;同时,要保障软件运行的安全并不易受到外来攻击。
在软件开发前必须要充分了解到你需要做什么,预期目标是什么。这样才会对软件开发有个明确的预期,以降低中途破产的机率。
软件开发应当尽可能的使用当前已有的资源,这样可以最大程度的降低软甲开发成本。
保证软件的生命周期持久且持续有较高的存在价值,避免软件产品过早的被市场淘汰。
软件也有一个孕育、诞生、成长、成熟和衰亡的生存过程,我们把这个过程叫做软件的生命周期。
软件开发中所遵循的路线图称为软件过程。软件过程提高了软件过程的稳定性、可控性和有组织性。
软件过程由软件描述、软件设计和实现、软件有效性验证和软件进化四种基本活动构成。
软件描述阶段是软件项目的早期阶段,主要有软件分析人员和用户合作,针对有待开发的软件系统进行分析规划和规格描述,确定软件需要做什么,为后期开发做好准备。
需求工程
需求工程的目的是生成一个达成一致意见的需求文档,定义能满足客户需求的软件项目。通常该文档需要表达两个层次的内容:
- 最终用户和客户需要的用户需求描述;
- 开发人员需要的详细系统描述。
需求工程的基本流程
(1-1) 概述
软件设计是对实现系统的结构、系统的数据、系统构件间的接口以及所用算法的描述。
(2) 基本活动
根据先前的软件设计方案由软件开发人员开始对软件进行编码。同时,软件开发人员要及时对软件代码进行测试和纠错,最终实现满足需求的软件。
软件有效性验证是查看系统是否符合它的描述及系统是否符合客户的预期。
软件开发人员对每个构件单独测试,不受其他构件的影响。
开始对单个构件进行集成,检测整个系统是否会出现错误,也开始关注系统是否能够满足功能性需求和非功能性需求。
该阶段测试不在像前两阶段使用模拟数据,开始使用用户的真实数据。根据真实数据的反馈,发现系统中的错误和纰漏。这是软件产品投入市场的最后一次测试。
alpha测试(α测试)
若软件是为特定客户开发的特定软件,在接收测试时称之为alpha测试。α测试的最终目的是开发人员和客户都承认交付的软件 是满足最初的定义的。
beta测试(β测试)
若软件是要在市场上发行的,在上市前的测试称之为beta测试。β测试旨在将软件先行发布给部分用户,通过小部分用户的使用反馈来完善和纠错该软件。
软件进化的目标是保障软件的正常运行及对软件进行更新维护。
瀑布模型师软件工程最早的范例。
瀑布模型存在的问题:
V模型提供了一种将验证和确认动作应用于早期软件工程工作中的直观方法。
V模型是瀑布模型的一个变体。
增量模型把系统分成了多个模块,每个模块重复进行相应过程。
增量过程模型的优点:
通过面向对象的方法将事务的实体封装成包含数据和数据处理方法的对象,并抽象为类。最后经过适当的设计和实现的类称之为构件。并且这些构件还具有一定的通用性。
构件复用模型的主要任务:
抛弃式原型只适合于小型、简单、处理过程比较明确、没有大量运算和逻辑处理的系统。
进化式原型是先开发出一个原型系统让用户使用,然后再根据用户的反馈不断进行修改。
进化式原型存在的问题:
螺旋模型是瀑布模型和原型进化模型相结合而来的,并且里面添加了风险分析这一过程。螺旋模型常用于大型项目软件。
(1-1) 概述
软件统一开发过程(Rational Unified Process,RUP)是基于面向对象统一建模语言(UML)的一种面向对象的软件过程。
(1-2) 优点
RUP的优点是由用例驱动,以架构为核心,采用迭代和增量的开发策略。
(1-3) 迭代方式
(2-1) 初始阶段
该阶段是为系统建立业务用例和确定项目的边界。
(2-2) 细化阶段
该阶段的目标是分析问题域,建立健全体系结构基础,淘汰项目中风险最高的元素。
(2-3) 构建阶段
该阶段的目标是开发所有构件和应用程序,把它们集成为客户需要的产品,并详尽测试他们的功能。
(2-4) 转换阶段
该阶段旨在用户在真实的使用环境下,使用用户真实的数据进行测试,用户反馈报告缺陷及必要的变更。
该阶段的主要活动:
在开发过程中,宁愿牺牲一些软件质量、降低某些需求来获得软件的快速支付。敏捷软件开发强调可以运行软件的快速交付而不那么看重中间产品。
敏捷方法适用于需求萌动、快速改变的中小型软件项目。
极限编程(eXtreme Programming,XP)使用面向对象的方法最为开发模型,其包括了策划、、设计、编码、测试4个框架活动。
(2-1) 策划
策划活动首先要建立一系列描述待开发软件的必要特征和功能的故事。
策划故事的排序标准:
(2-2) 设计
XP设计严格遵循保持简洁原则。使用简洁而不复杂的描述。并且设计只满足目标即可,不鼓励额外功能性设计。
(2-3) 编码
编码活动中的关键是结对编程,XP建议两个人面对同一台计算机对同一个故事进行编程。这样提供了实时解决问题和实时质量保证的机制,使得开发人员能集中精力解决手头问题。
(2-4) 测试
测试优先的开发方案是XP的重要创新之一。XP是先写测试程序然后才写代码。
XP验收测试也是客户测试,通过客户反馈的数据二评审软件功能。
可行性研究的目的不是解决问题,而是用最小的代价在最短的时间内确定问题是否可以解决。
可行性研究的实质就是在较高层次以较抽象的方式进行系统分析和设计的过程。
在问题定义阶段初步确定项目规模和目标,并且对系统的约束和限制进行相应的表示出来。
一般从技术可行性、经济可行性、社会可行性这三个方面进行研究。
(2-1) 技术可行性
确认现有的技术资源是否可以完成预期的软件项目。
一般从以下方面来考虑技术可行性:
(2-2)经济可行性
通常对开发的成本进行估算及效益的评估,确定要开发的项目是否值得投资开发。
(2-3) 社会可行性
判断项目的开发是否符合当代社会的法律法规,是否符合当代社会的主流价值观。
可行性研究的根本任务是对以后的行动方针提出建议。如果问题没有可行的解法,则应当放弃任务;若有可行的解法,则应当用一个较优解来完成任务。
同时,可行性研究的成本占工程总成本的5%~10%。
通过可行性研究可以基本判断项目是否在技术上存在可能,是否在市场上存在可能。通过可行性分析,可以帮助开发人员及用户了解项目的成功率也有助于减少开发者和用户的损失。
面对复杂的系统时,一个比较好的解决方法是分层次地描绘出这个系统,从而达到化繁为简的目的。
通常首先用一张高层次的系统流程图描绘系统总体概况,表明系统的关键功能;然后分别把每个关键功能扩展到适当的详细程度,画在单独的一页纸上。
数据流图是一种图形化技术,是系统逻辑功能的图形化表示,它描绘信息流和数据从输入移动到输出过程中所经受的转换。
名称应代表整个数据流(或数据存储)的内容。
命名时要先为数据流命名,再为处理命名。处理的命名要代表整个处理过程,通常使用动宾结构。
根据以往经验和数据,估算一个功能大致所需要的源程序行数。在得出行数后,用每行代码的平均成本乘以行数就可以大致确定该软件的成本。而且每行代码的平均成本取决于软件的复杂度和工资水平。
(2-1) 方法步骤
(2-2) 典型环境下各个开发阶段需使用的人力百分比
任务 | 人力百分比 |
---|---|
可行性研究 | 5% |
需求分析 | 10% |
设计 | 25% |
编码和单元测试 | 20% |
综合测试 | 40% |
通过自动估计成本法可以得到较为客观的估计结果。但是需要长期大量的数据为基础和良好的数据库系统作为支持。
通常用货币的利率来表示货币的时间价值。
i
,若现在存入P
元,则n
年后可以得到的钱数为:F
也就是P
元钱在n
年后的价值。n
年后能收入F
元钱,那么这些钱的当前价值为:投资回收期就是使累计的经济效益等于最初投资所需要的时间。
在该工程的整个生命周期内累计经济效益(当前收入的值)与投资之差。
投资回收率计算方程:
P=F1/(1+j) + F2/(1+j)2 + …… +Fn/(1+j)n。
说明:P是当前投资额;Fi是第 i 年年底的效益;n是系统的使用寿命;j是投资回收率。
IEEE软件工程标准词汇表中把需求定义为:
需求通常体现为三部分:业务需求、用户需求、系统需求。
需求工程分为:需求开发和需求管理两部分。
(1-1) 需求获取
需求获取的目的是从项目的战略规划开始建立最初的原始需求。 需要研究系统将来的应用环境、确定系统的涉众、了解现有问题、建立新系统的目标、获取任务细节和用户具体需求。
(1-2) 需求分析
需求分析的目的是保证需求的完整性和一致性。 以原始需求和业务过程细节出发,将目标、功能和约束结合成软件行为,建立系统模型。随后对系统模型进行分析,发现并弥补遗漏的需求。
(1-3) 需求规格说明
需求规格说明的目的是将完整的、一致的需求与能够满足需求的软件行为以文档的方式明确的固定下来。
(1-4) 需求验证
需求验证的目的是保证需求及其文档的正确性,即反映了用户的真实意图。 它的另一个目标是通过检查和修正。保证需求及其文档的完整性和一致性。
需求管理的目的是在需求开发活动之后,保证所确定的需求能够在后续的项目中有效的发挥作用,保障各种活动的开展都符合需求要求。
(1-1) 知识理解困难
(1-2) 默认知识现象
业务需求、高层解决方案及系统特性被记录下来,定义为项目前景和范围文档。
前景 描述了产品的作用及最终功能,它将涉众都统一到一个方向上。
范围 为项目划定了需求的界限。
过程步骤:
常见约束源:
约束源 约束 理由 操作性 销售订单数据的一份完整备份必须被保存在原有系统的数据库中一年的时间 数据丢失的风险太大,所以新旧系统要并行运行至少一年的时间 系统及操作系统 应用在服务器上不应该占用超过20M的空间 服务器上可用的存储空间有限 设备预算 系统必须在已有的服务器和主机上开发 成本控制及已有的系统维护 人员资源 固定的人力资源,没有外部资源 在现在预算下操作成本已经固定 技术要求 应用面向对象的方面 相信这种技术的应用会增加生产率并增强软件的可靠性
信息来源的主要途径:
外部资料:各项法规、市场信息等;
内部资料:企业计划、指标、经营分析报告、合同、账单、统计报表等。
自由格式问卷为回答者提供灵活回答问题的方式;
固定格式问卷需要实现设定选项或几种答案供用户选择。
结构化访谈指开发人员向访谈对象提出一系列事先设计好的问题,这些问题可以是开放性的也可以是封闭式的;
非结构化访谈指没有事先确定的问题,开发人员只是向访谈对象提出访谈的主题或问题,且只有一个谈话框架。
过程建模就是处理需求获取活动所得到的信息,发现系统的功能和与外界的交互,建立能够实现系统功能的过程分解结构,形成系统的过程模型,并用图形的方式将过程模型描述出来。
过程建模的主要技术有:上下文图、数据流图、微规格说明书和数据字典。
上下文图是数据流图的一个特定层次,用来说明系统的上下文环境、确定系统的边界。
(2-1) 作用
数据流图常用来建立过程的分解结构。
(2-2) 基本元素
①外部实体
外部实体是指处于待构建系统之外的人、组织、设备或者其他软件系统。 所有的外部实体联合起来构成了软件系统的外部上下文环境。
它们与软件系统的交互流就是软件系统与外部环境的接口,这些接口联合起来定义了软件系统的系统边界。
②过程
过程是指施加于数据的动作或者行为,它们会使数据发生变化。
过程描述的内容是对数据处理行为的概括,这种概括可以表现为不同的抽象层次。
③数据流
**数据流是指数据的流动,他是系统与其环境之间或者系统内两个过程之间的通信形式。**数据流必须和过程是关联的,它要么是过程的数据输入,要么是过程的数据输出。
④数据存储
数据存储是系统软件需要在内部收集、保存,以供日后使用的数据集合。
数据流描述的是动态的数据;数据存储描述的是静止的数据。
(2-3) 规则
(2-4) 分层结构
数据流图定义了3个层次类别的结构图,分别为:上下文图、0层图、N层图
①上下文图
上下文图是数据流图最高层次的图,是系统功能最抽象的部分。上下文图将这个系统看作一个整体,这个过程实现系统的所有功能。上下文图有且只有一个过程,该过程表示整个系统。
上下文图需要表示出系统所有和系统交互的外部实体,并描述交互的数据流(系统输入和系统输出)。
②0层图
0层图是位于上下文图下面一层的图。 它被认为是上下文图中单一过程的描述,是对该单一过程的第一次功能分解。
0层图通常被用来作为整个系统的功能归纳图。 建立0层图需要分析需求获取的信息,归纳出系统的主要功能,并将它们描述为几个高层次的抽象过程。有一些重要数据也会在0层图中存储出来。
0层图应该描述的简洁、清晰。 因此在描述复杂的系统时,0层图不应该出现太过具体的过程和数据存储。
③N层图
0层图中的每个过程都可以进行分解,从而展示更多细节。被分解的过程称为父过程,分解后产生的揭示更多细节的数据流图称为子图。对0层图的过程分解图称之为1层图。
0层图中较为复杂的过程应该是按照功能分解的做法扩展成一个更详细的数据流图。功能分解是一个拆分功能的描述,将单个复杂过程变为多个更加具体、更加准确和更加细节的过程。
N层图不再进行细分的条件:
1)所有过程都已经被简化为一个选择、计算或者数据库操作;
2)所有的数据存储都仅仅表示了一个单独的数据实体;
3)用户已经不关心比子图更加细节的内容,或者子图的描述已经详细得足以支撑后续的开发活动;
4)每一个数据流都已经不需要进行更加详细得切分,以展示对不同数据的不同处理方式;
5)每一个业务、事务、计算机的屏幕显示和业务报表都已经被表示为一个单独的数据流;
6)系统的每一个最底层菜单选项都能在子图中找到独立的过程。
(3-1) 作用
在数据流图结构中,所有复杂的过程都被解释为低层次的数据流子图。但是最低层次的子图没有得到充分的解释。为了充分描述系统功能,需要描述原始过程的逻辑处理,因此需要借助微规格技术说明来实现。
微规格说明主要有3中技术,分别为:结构化语言、判定表、判断树。
(3-2) 结构化语言
①相关概念
结构化语言借用了结构化程序设计的特点,比自然语言更加严谨和明确。
结构化语言的语法分为内层和外层。
②缺点
③适用范围
如果包含一般顺序执行的动作或循环执行的动作,建议使用结构化语言。
④示例
(3-3) 判定表
①相关概念
②判定表的结构组成
条件和行动 | 规则 |
---|---|
条件声明 | 条件选项 |
动作声明 | 动作选项 |
③判定表构造步骤
合并原则:找出动作选项在同一行的,检查上面的每一个条件的取值是否影响该操作的执行;如果条件的取值不起作用,则可以合并等价操作,否则不能简化。
④适用范围
如果存在复杂的条件组合或动作,或者要求判定分析的完备性,建议用判定表进行描述。
⑤示例
(3-4) 判定树
①相关概念
若判定过程十分复杂,那么利用判定表进行描述会使得表的规模十分庞大,导致信息难以理解。因此需要借助判定树辅助理解。
②适用范围
如果条件和动作的顺序非常关键,或者希望用更加直观的方式来描述各种组合和动作,建议用判定树描述。
③示例
(4-1) 作用
(4-2) 数据元素描述规范
项目 | 内容 |
---|---|
名称 | 数据元素的原始名称 |
别名 | 数据元素的其他名称 |
使用地点 | 使用该数据元素的位置 |
使用方法 | 该数据元素扮演的角色(输入流、输出流或者是数据存储) |
适用范围 | 该数据元素的存在范围 |
描述 | 对数据元素内容的描述 |
单位/格式 | 数据元素的数据类型 |
(4-3) 数据字典常用符号
过程建模是以数据在系统中的产生和使用为重点,以数据交换的过程为核心,通过建立层次结构的过程模型来描述。它同时描述了系统的行为和数据。
数据建模通常使用**实体关系图(ER图)**进行。ER图使用实体、属性、关系这3个基本的构建单位来描述数据模型。
(2-1) 实体
实体是描述事物的元素,是需要在系统中收集和存储的现实世界事物的类别描述。
(2-2) 属性
①相关概念
②标识符
在把实例归类为实体进行统一形式的描述之后,需要一种唯一确定和表示每个实例的手段。
(2-3) 关系
①相关概念
②关系度数
关系的度数指参与关系的实体数量,是度量关系复杂度的一个指标。
③关系基数
关系的基数也称之为关系的约束。一个实体在关系中的基数定义了在该关系中其他实体实例确定的情况下,该实体实例可能参与关系的数量。
关系分为3种,分别为:一对一、一对多、多对多。
(2-4) ER图的创建
依据充分描述信息的ER图创建:
如果在建立ER图之前,所需要的数据描述信息已经得到充分的获取,那么ER图的创建过程是从信息的描述中辩识和描述数据模型元素的过程。
依据硬数据表单的ER图创建:
除了文本信息,硬数据表单也是建立数据模型的理想材料。
结构化的分析方法使用ER图来进行描述系统的数据,使用过程模型来描述系统的行为。但是在ER图和过程模型之间的协同问题上始终没有下形成有效的解决方案。
没有任何关联功能的实体都是可疑的,不对任何数据进行操作的过程都是可疑的。
功能/实体 | 学生 | 课程 | 注册 |
---|---|---|---|
修改课程信息 | RU | ||
注册课程 | R | R | C |
取消课程注册 | R | R | D |
需求规格说明活动就是将需求及其软件解决方案进行定义和文档化,并传递给开发人员的需求工程活动。
系统需求文档从软件、硬件和人力整个系统的角度出发,描述系统的需求和解决方案。系统需求文档的内容较为抽象,具有概括性的特点。并且大多数项目都是以该项目为基础开发的。
下图为IEEE 830-1998标准给出的模板。
验证 = 验证 + 确认
评审也称为同级评审,是指由作者之外的其他人来检查产品问题的方法。评审主要采用静态分析手段,并且原则上,每一个需求都需要经过评审。
需求管理阶段的主要任务包括建立和维护需求基线、建立需求跟踪信息、进行变更控制。
需求基线,是被明确和固定的需求集合,是项目团队需要在某一特定产品版本中实现的特征和需求集合。
为了有效管理需求,需要建立良好的配置管理和对需求进行版本控制。
需求属性:ID、来源、产生日期、产生理由、优先级、软件预期成本…
基线的版本控制工作可以通过git等版本管理工具来实现。
为了避免软件系统开发过程或演化过程中发生与需求基线不一致、偏离风险增大的现象所导致的软件开发质量、成本和事件出现错误,因此提出了需求跟踪。
软件设计分为概要设计阶段和详细设计阶段。概要设计阶段将软件需求转化要完成体系结构设计、数据设计和接口设计;详细设计阶段要完成过程设计,对结构的表示进行细化,最终得到详细得数据结构和算法描述。
体系结构设计定义软件模块及其之间的关系。软件的结构化设计一般分为两类:
根据需求阶段的ER图来确定软件涉及的文件系统结构和数据库的表结构。
确定软件各个组成部分的内部数据结构和算法。
(1-1) 相关概念
模块是能够独立完成一定功能的程序语句的集合,即数据结构和程序代码的集合体。
模块也是软件构成的基本单位。
常见的模块有:函数、过程、子程序。
(1-2) 模块-成本关系
抽象是从众多公共事物中抽取公共的、相似的方面,忽略他们之间的差异,即抽取出每一个事物本质的特征而避开底层的细节。
将一个模块的内部实现细节进行隐藏起来,即封装。模块外部只能通过模块间的接口进行消息传递。
信息隐藏有利于后期软件的修改,确保当修改一个模块时不会影响其他部分。
(4-1) 相关概念
模块独立性指软件系统中每个模块完成一个相对独立子功能的能力,而且要和其他的模块接口是简单链接的。
通常从耦合和内聚两个角度来衡量系统的独立性。
良好的程序追求的是低耦合、高内聚的状态。
(4-2) 耦合
这里的数据结构不是简单的数据,而是记录、数据等数据结构。
(4-3) 内聚
典型的时间内聚:系统的初始化。
结构图可以清楚的反映出软件模块之间的层次调用关系和联系,严格的定义了各个模块的名字、功能和接口。
(1-1) 结构图的图形符号
模块,用矩形框进行表示。模块的名字要恰当的反映模块的功能。
模块间的调用关系,用单向箭头进行表示。箭头由调用模块指向被调用模块。
模块间的信息传递,在连接线先旁边话短箭头进行表示。尾端为空心圆的短箭头表示数据信息;尾端为实心圆的表示控制信息。
模块中的条件调用和循环调用,条件调用用菱形表示、循环调用用弧形符号表示。条件调用和循环调用的条件一般无需注明。
HIPO图由H图和IPO图两部分组成。H图描述软件总的模块层次结构;IPO图描述每个模块的输入输出、处理功能及模块的调用的详细情况。
(1) H图
H图为层次图,是用树形结构的一系列多层次的矩形框描述软件系统的结构。
(2) IPO图
IPO图为输入、处理、输出图,IPO图使用简单而又少量的符号,方便的描述出输入数据、数据处理、输出数据之间的关系。
①深度:结构图中的层次数量。
②宽度:结构图中同一层模块的最大模块数量。
③扇入:结构图中调用一个给定模块的调用模块数目;一个模块的扇入数越大,说明共享该模块的上级模块越多。
④扇出:结构图中一个模块直接调用的下属模块的数目。扇出数一般是2~5,最多不要超过9。
模块的控制域:模块本身及所有直接或间接从属它的模块的集合。
模块的作用域:受一个模块内的一个判定影响的所有模块的集合。
在一个良好的软件系统中,模块的作用域是控制域的子集。
复杂的接口往往会带来较高的耦合度。
经过这两个过程的的信息流称为变换流。
事务流也称为数据流。事务流沿输入通路到达事务中心,事务中心根据输入数据的类型在若干条活动通路中选出一条来执行。
结构图的改进技巧:
- 减少模块间的耦合度;
- 消除**管道*模块;
- 控制扇出数量。
顺序文件、直接存取文件、索引顺序文件、分区文件、虚拟存储文件。
概念结构设计是设计数据库的概念模型,通常采用ER图进行设计。
逻辑结构设计提供了有关数据库内部构造的更加接近于实际存储的逻辑描述。通常将概念结构中的ER图映射成为数据库中的逻辑结构。
(2-1) 映射步骤
横切:用于记录与时间相关的实体对象;
竖切:用于实例较少而属性较多的映射。
常见的关系映射:1:1关系映射、1:N关系映射、M:N关系映射。
物理结构设计是在逻辑结构设计的基础上建立数据库的物理模型,即数据库管理系统中的表、索引、视图等。
人机界面是人机交互的主要方式,用户界面的质量直接影响用户对软件的使用、用户情绪和工作效率、用户软件产品的评价,以及软件产品的竞争力和寿命。
一般设计技巧:
结构化程序设计采用自上而下、逐步求精的设计方法,这种方法符合抽象和分解的原则,是人们解决复杂问题的常用方法。采用这种先整体后局部、先抽象后具体的步骤开发的软件一般都具有清晰的层次结构。
结构化程序设计能提高程序的可读性、可维护性和可验证性,从而提高软件的生产率。
程序流程图独立于任何一种程序设计语言,较为直观、清晰的展示程序逻辑。
N-S图也称为盒图,是一种符合结构化程序设计原则的图像描述工具。
PAD图也称为问题分析图,是表示程序逻辑结构的图形工具。
伪码是一种介于自然语言和形式化语言之间的半形式化语言,用于描述功能模块的算法设计和加工细节。
下图为IEEE 1016-1998标准的模板。
即面向对象=对象+类+继承+通信。
对象是系统中用来描述客观事物的一个实体,他是构成系统的一个基本单位,由一组属性和对这个属性进行操作的一组服务组成的封装体。
服务和属性是构成对象的两个基本要素。
同一个对象在软件的不同阶段会有不同的表现形式:
- 分析阶段:对象主要是从问题域中抽象出来的,反应的是概念的实体对象;
- 设计阶段:主要结合实现环境增加用户界面对象和数据存储对象;
- 实现阶段:使用一种确切的程序设计语言来详细描述该对象的代码。
类是具有相同属性和服务(方法)的一组对象的集合,他为该类的全部对象提供了统一的抽象描述,内部也包括属性和服务两个部分。
类是对象的抽象,而对象是类的实例,类在现实世界是不存在的,类被具体化后得到的对象是具体存在于客观世界的实例。
一个对象让另一个对象执行它的某种方法称为发消息,所发送的消息中需要包含接收消息的对象名和方法名。
在面向对象中,所有的功能都是通过对象之间互发消息来实现的,消息机制可以像搭积木一样,快速开发出一个全新的系统。
通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,通过它们之间的关系带来动态绑定和实体的多态性。
封装把对象的属性和服务结合成一个独立的系统单元,将对象外部的特征(使用的方法)与内部的实现细节(属性和方法是如何实现的)分开。通过封装信息体现出来事务的相对独立性。
继承是指一个类的定义中可以派生出另一个类的定义,派生出的类(子类)可以自动拥有父类的全部属性和服务。
类的继承是软件重用的一种形式,通过继承的属性和行为扩充原有类的功能,进而节省开发时间。
(3-1) 重写
若子类中定义的某种方法与父类具有相同的名称和参数,则该方法称为重写。
(3-2) 重载
若一个类中定义了多个同名的方法,它们或有不同的参数个数或参数类型,则称之为重载。
(3-3) 接口的多态性
在一个接口中定义的抽象方法,可以有多个类以不同的方法来实现这个接口中的抽象方法。
面向对象的分析,就是抽取和整理用户需求建立问题域精确模型的过程。
常见的UML图:
面向对象的建模过程:
上下文图是数据流图的一个特定层次,用来说明系统的上下文环境、确定系统的边界。
活动图本质上是一种流程图,它着重表现一个活动到另一个活动的控制流,是内部处理驱动的流程。
(1-1) 用途
起始点指的是一连串活动的开始点,在一个活动图中起始点有且只有一个。
(1-2) 图示
(2-1) 用途
结束点指的是一连串活动的终结点,在一个活动图中可以有多个结束点。
(2-2) 图示
(3-1) 用途
活动指人或系统的一连串执行细节。
(3-2) 图示
(4-1) 用途
活动图能表示对象的数据流和控制流。在活动图中,对象可以作为动作的输入或输出,或简单的表示指定动作对对象的影响。
当对象是一个动作的输出时,用一个从动作指向对象的虚线箭头来表示;当对象是一个动作的输入时,用一个从对象指向动作的虚线箭头来表示。
(4-2) 图示
[ ]
来表示约束,即依据条件来约束迁移。通过分区,可以将活动分配给相对于的角色。在UML中通常使用泳道图来表示。
下图为快餐选购系统活动图:
(1-1) 作用
用例代表着用户对系统的一个“完整的期望”,一个用例代表某个特定的用户在完成该期望后就可以离开系统。
(1-2) 图示
(2-1) 作用
执行者代表系统外部对于系统有影响力的用户或外部系统。
(2-2) 图示
(3-1) 作用
边界代表着系统的范围,利用边界可以可视化地展示系统的内外之分。
(3-2) 图示
(4-1) 作用
执行者与执行者之间可以有泛化关系。
(4-2) 图示
(5-1) 作用
执行者与用例之间的关系,只能用关联关系表示执行者启动用例。
(5-2) 图示
(6-1) 种类
(6-2) 图示
下图为快餐修够系统用例图:
类的种类:
- 实体类: 是从客观世界中的实体对象归纳和抽象出来的,用于长期保存系统中的信息,以及提供对这些信息的相关处理行为。
- 边界类: 是从系统和外界进行交互的对象中归纳、抽象出来的,它是系统的对象和系统外的执行者连接的媒介,外界的消息只有通过边界类对象的实例才能发送给系统;
- 控制类: 是用于协调系统边界类和实体类之间的交互。
类主要由类名、属性、操作构成。
(1-1) 类名
(1-2) 属性
UML符号 | 意义 |
---|---|
+ | 公有属性:能够被系统中其他任何操作查看和使用 |
- | 私有属性:仅在内部类可见,只有类内部的操作才能存取操作 |
# | 受保护属性:供类中的操作存取,并且该属性也被其子类使用 |
[可见性] 属性名 [:类型] [=初始值{约束特性}]
(1-3) 操作
[可见性] 操作名 [(参数表)] [:返回类型] [约束特性]
关联表达了两个类对象彼此间的结构性关系。
示例:
(3-1) 作用
泛化关系表达了两个类之间“一般”与“特殊”的关系。一般来说,会为了增加系统的弹性而设计泛化关系。
(3-2) 图示
整体-部分关系分为聚合与组合两种。
图示:
依赖关系是一种使用关系,依赖关系的两个类并没有结构上的关联。
图示:
多重性通常在关联或整体-部分关系中加以使用。代表着对象关系结构中,彼此能够允许的最少或最多的数量。
图示:
下图为计算机销售系统的静态模型:
相关概念
对象在UML中以“对象名称:类名称”的方式来表达。若使用“:类名称”来表达对象,则代表该对象并没有被指定特定的名称。
(2-1) 相关概念
常见的四种消息类型:
(2-2) 图示
下图为快餐选购系统的时序图:
通过状态图来支持基于事件的模型。状态图用来描述一个类对象在不同用例间状态的迁移。当一个用例或某个事件发生时,类对象的状态就会发生迁移。状态图有助于分析人员审核业务逻辑,以完善静态模型。
(1-1) 相关概念
在一个状态机或状态机图中,有且只有一个起始状态。
(1-2) 图示
(2-1) 相关概念
结束状态代表整个状态机到此结束。在一个状态机或状态机图中,可以有多个结束状态。
(2-2) 图示
(3-1) 相关概念
圆边矩形代表系统状态,其中可能包括此状态中执行动作的简单描述。
(3-2) 图示
(4-1) 相关概念
状态与状态之间利用迁移来表达期间的关系,这代表状态的变化情形。带标签的箭头代表促使系统从一种状态变为另一种状态的激励因素。
(4-2) 图示
因为某个事件发生而造成状态的迁移时,在迁移关系上可以标记该事件,这称之为事件触发器。
下图为商品下单的状态图:
面向对象的设计是将分析所创建的分析模型转换为设计模型;同时通过进一步细化需求,对分析模型加以补充和修正。在面向对象设计中,主要考虑系统做什么,而不是系统怎么做。
面向对象是以面向对象分析产生的系统规格说明书为基础,设计出描述如何实现各项需求的解决方案,这个解决方案是后续进行系统实现的基础。
软件设计创建了软件的表示模型,该设计模型提供了软件体系结构、数据结构、接口和构建的细节,这些细节都是实现系统说必须的。
软件设计是建模活动的最后一个软件工程活动,后续就紧接着进入构建阶段编码和测试。
通过基于场景的元素、基于类的元素和行为元素所表示的需求模型是设计任务的输入,而数据或类的设计、体系结构设计、接口设计和构建设计是设计任务的输出。
(4-1) 基本概念
如果一个类对象过多的依赖其他类对象来完成自己的工作,不仅会给理解、测试、修高造成困难,还会大幅降低该类的可复用性和可移植性。
(4-2) 耦合类型
交互耦合:对象之间的耦合通过消息连接来实现。
[降低交互耦合]
遵循规则:
1)尽量降低消息连接的复杂程度。应该尽量减少消息中包含的参数个数,降低参数的复杂程度;
2)减少对象发送或接收的消息数。
继承耦合:继承是一般化类与特殊类之间的一种耦合形式。在本质上,通过继承关系结合起来的父类与子类,构成了系统中粒度更大的模块。
[提升继承耦合程度]
(5-1) 相关概念
内聚性是衡量一个模块内部各个元素彼此结合的紧密程度。
(5-2) 内聚类型
(1-1) 结构描述
将系统组织成分层结构,每一层中包含一组相关的功能。每一层提供服务给紧邻的上一层,因此最底层是有可能被整个系统所使用的核心服务。
(1-2) 使用时机
(1-3) 结构优点
(1-4) 缺点
用于显示数据和接收用户输入的数据,为用户提供一个人机交互式操作的界面。
主要针对具体问题进行操作,也可以理解成对数据层的操作、对数据业务逻辑处理。
业务逻辑层的主要任务:
其功能主要是负责数据库的访问。
数据访问层的主要任务:
由于层是一种弱耦合结构,层与层之间的依赖是向下的,低层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何影响。
MVC是模式-视图-控制器的缩写。它用一种业务逻辑、数据、界面显示相互分离的方法组织代码,将业务逻辑聚集到一个部件中,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
最典型的MVC模式应用是:JSP+Servlet+JavaBean+DAO
包图由若干个包及包之间的关系组成。包是一种分组机制,将同类的类、对象、模型元素放在一起,形成高内聚、低耦合的类集合。包也就是一个子系统。
在MVC框架模式下,可以将属于同一层次的类放在相同的包中,即从逻辑上体现了系统的体系结构,又方便后期的组织编码开发。
(1-1) 包
包是包图的最基本元素。
包图的表示:
(1-2) 依赖关系
一个包中的类需要引用另一个包中的类或对象才能完成功能时,两个包之间形成依赖关系。
依赖关系由一条加箭头的虚线表示。
通过MVC模式建模
构件是具有相对独立功能、可以明显辩识、接口由契约制定、语境有明显依赖关系、可独立部署且多由第三方提供的可组装软件实体。
构件的主要组成元素包括构件和接口。接口是一个构件给其他构件的一组操作。
(1-1) 构件
构件是系统中可以被抽换的物理部件,一个构件通常会实现一组特定的接口。
(1-2) 提供接口
构件可以利用提供接口来表达某个构件的接口集合,提供接口是向其他构件提供服务的,在构件内部需要实现该接口的全部特征。
(1-3) 需求接口
构件如果需要其他构件的服务才能运作,可以利用需求接口来表达。
(1-4) 依赖关系
构件之间的依赖关系表示一个构件需要另一些构件才能有完整的意义。
依赖关系用一个带箭头的虚线来表示。
部署图是用于描述系统硬件的物理拓扑结构及在此结构上运行的软件。
部署图用于静态建模,是表示运行时过程节点的结构、构件实例及其对象结构的图。展示了构建图中所提到的构件是如何在系统硬件上部署的,以及各个硬件之间是如何连接的。
(1-1) 节点
节点是存在于运行时,代表一项计算机资源的物理元素。节点可以分为处理器和设备两种类型。
(1-2) 构件
构件是系统可替换的物理部件。
(1-3) 关联关系
关联关系通过一条直线来进行表示,用于指出节点之间存在的某种通信关系。
(1-4) 依赖关系
必须在构造软件之前确定软件是否可以工作。。为了保证设计的正确性、以及早期设计表示(即数据、体系结构和接口设计)的一致性,构件级设计需要以一种可以评审设计细节的方式来表示软件。它提供了一种评估数据结构、接口和算法是否能够工作的方法。
在这里,每个构件类的定义或者处理说明都转化为一种详细设计,该设计采用图形或基于文本的形式来详细说明内部的数据结构、局部接口细节和处理逻辑。
从分析类到设计类,需要增加更多实现所需的属性、方法及接口的详细设计。每个构件都要实施细化,细化一旦完成,要对每个属性、操作和接口进行更进一步的细化。对适合每个属性的数据结构必须予以详细说明。此外还需要说明实现与操作相关处理逻辑的算法细节,最后是实现接口所需机制的设计
用例反映了系统的需求,界定了系统的边界,涵盖了所有的系统运用场景。因此通过对用例场景的分析设计、对用例中对象间的通信机制进行描述,可以准确识别出实现该用例的全部设计类,以及其所需的属性和方法及接口的定义。
从分析类到设计类的转换需要具体的设计模式,在MVC中为 分析类 + 设计模式 = 设计类 这个模式。
在UML中边界对象、控制对象、实体对象的表示图如图所示:
用户界面设计的三个准则:
基于构件的开发
硬件设备包括计算机主机、输入输出设备、存储设备、辅助设备(稳压电源、空调设备等)、通信设备等,要咱找系统设计方案购置、安装、调试这些设备。
应用软件往往不是从底层进行开发的,而是建立在一定系统软件的基础上。
即使从底层开发,也需要准备编程语言软件、系统开发的工具软件、数据库管理软件等。软件的配置方案已经包含在系统设计方案中,按照配置方案进行落实就可以了。
由于系统实施工作量大,需要更多的参与人员,而且软件分析员和软件设计员也并不可能参与到具体的系统实施,而是主要承担组织者和管理者的角色,负责系统需求和系统设计方案的修改和落实。因此需要进行人员的补充,特别是具体编程人员的加入。
由于新增加的人员没有参加系统分析和系统设计阶段,所以必须对这些新增人员进行培训,使他们尽快熟悉到开发任务中去。
虽然数据字典和数据库设计书规定了数据的格式,但是系统在编程和测试过程中,需要使用到实际的数据,方便编程人员对程序进行调试和测试工作。
而数据的收集、整理、录入是一项繁琐的工作,又要保证工作质量,又要花费大量的人力和物力。
一般来说,确定数据库物理模型之后,就应当进行数据的整理、录入。这样既分散了工作量,又可以为系统调试提供真实的数据。
由于构件详细到代码,首先需要选择实现系统的编程语言、开发环境,这些在设计阶段都已经得到了考虑。
MyEclipse是基于Eclipse开发的企业级集成开发环境,主要用于Java、JavaEE及移动应用的开发。
JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序,
Apache Tomcat服务器是一个免费的开源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
MySQL是一个关系型数据库管理系统,关系型数据库将数据保存到不同的表中,而不是放到一个大仓库中,这样就增加了速度并且提高了其灵活性。
配置管理是管理变更中软件系统的一般过程。配置管理的目标是支持系统集成过程,使得每个开发人员可以在管理中访问工程代码和文档、查找变更、编译连接构件并生成系统。
配置管理的基本活动:
软件在一台计算机(宿主机)上开发,但在另一台机器(目标机)中允许,一般情况下,称之为开发平台和运行平台。这些平台不只是指硬件设备,同时还包括安装的操作系统和其他支持软件。
如果开发平台和运行平台是相同的,这样就可以在同一台计算机上开发和测试软件。如果开发平台和运行平台不同,则需要将开发好的软件迁移到运行平台进行测试,或者在开发环境中安装模拟器。
模拟器通常在开发嵌入式系统时使用,用来模拟一个硬件设备。但是开发模拟器的成本较高,只会对当前最常见的几种硬件架构进行模拟。
开发平台所具备的基本条件:
- 集成编译器和句法导向的编译系统,能够创建、编辑和编译代码;
- 具有编程语言调试系统;
- 具有图形编辑工具;
- 具有测试工具;
- 具有项目支持工具。
软件质量的评价方向:
G.J.Myers提出的程序测试的3个观点:
- 测试是为了证明程序有错,而不是为了证明程序无错;
- 一个好的测试用例在于它发现至今没有发现的错误;
- 一个成功的测试是发现了至今未发现的错误的测试。
测试用例是为了测试能够高效、可靠地进行,对大量的数据中设计的具有代表性或者特殊性的数据进行测试,用来检验某个程序或者路径是否满足特定的要求。
测试用例通常包括测试目标、测试环境、输入数据、测试步骤及预期结果等,以便测试某个程序路径或核实程序是否满足某个特定需求。
在设计测试用例时,需确定测试策略、产品线、产品特性、质量需求等目标,来建立测试用例框架。通常从功能性测试目标和非功能性测试目标来分别进行设计。
在逐步细化设计具体测试用例时,应根据需求规格说明书中的描述、相关的功能模块及操作流程等寻找设计上的弱点、逆向考虑惯性思维及可能的异常输入情况。
测试用例常用组成元素包括用例ID、用例名称、测试目的、测试级别、测试环境、输入数据、测试步骤、预期结果、结论、日期等。
黑盒测试通常在程序界面处进行测试,通过需规格说明书的规定来检测每个功能是否能够正常运行。
只知道系统的输入和输出,不需要了解程序内部结构和内部特性的测试方法称为黑盒测试。
常用方法有:边界值分析法、等价类划分法、因果图、场景法。
边界值测试倾向于选择系统边界或边界附近的数据来设计测试用例,这样暴露出程序错误的可能性就会更大一些。
边界值测试一般遵循的原则:
等价类的划分是将输入域的数据划分为若干不相交的子集,在这些子集中的数据对于揭露程序中的错误是等效的,继而从每个子集中选取具有代表性的数据。
等价类的划分包括有效等价类和无效等价类两种情况。
(3-1) 基本概念
因果图方法适用于多种组合情况产生多个相应动作的情形。
在因果图中,以直线连接左右节点。左节点表示输入状态(原因),右节点表示输出状态(结果)。
(3-2) 因果图的四种关系
(3-3) 因果图的约束关系
在实际情况下,输入状态、输出状态之间都可能存在某些依赖关系,称之为约束。
(3-4) 因果图设计测试用例的步骤
场景法一般包含基本流和备选流,从一个流程开始,通过描述经过的路径来确定过程,经过遍历所有的基本流和备选流来完成整个场景。
场景法设计测试用例的步骤:
白盒测试又称结构测试。白盒测试清楚地了解了程序结构和处理过程,检查程序结构及路径的正确性,检查软件内部动作是否按照设计说明的规定正常进行。
白盒测试方法主要有逻辑覆盖测试法和基本路径法。
逻辑覆盖测试是根据程序内部的逻辑结构来设计测试用例的技术。逻辑覆盖可以分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖和路径覆盖。
||
和&&
,则无法全面地测试到。基本路径测试是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
基本路径测试主要过程:
**灰盒测试是介于白盒测试与黑盒测试之间的测试。**灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不像白盒测试那样详细、完整。灰盒测试结合了白盒测试和黑盒测试的优点,相对于黑盒测试和白盒测试而言,投入的时间相对较少,维护量也较小。
灰盒测试考虑了用户端、特定的系统和操作环境,主要用于多模块的较复杂系统的集成测试阶段。灰盒测试既使用被测对象的整体特性,又使用被测对象的内部具体实现,即它无法知道函数内部具体内容,但是可以知道函数之间的调用。灰盒测试重点检验软件系统内部模块的接口。
灰盒测试能够有效地发现黑盒测试的盲点,可以避免过渡测试,能够及时发现没有来源的更改,行业门槛比白盒测试低。但是灰盒测试不适用简单的系统,相对于黑盒测试来说门槛较高,测试没有白盒测试那么深入。
单元测试是软件开发过程中所进行的最低级别的测试活动,其目的在于检查每个单元能否正确实现详细设计说明中的功能、性能、接口和设计约束等要求,发现单元内部可能存在的各种缺陷。单元测试作为代码级功能测试,目标就是发现代码中的缺陷。
单元测试是对软件设计的最小单元进行测试。对于一个模块或者一个方法来说,并不是独立存在的,因此在测试时需要考虑到外界与它的联系。
例如,如果对Java或者C++这种面向对象语言进行测试,则被测的基本单元可以是类,也可以是方法。
我们需要用到一些辅助模块来模拟被测模块与其他模块之间的联系。
辅助模块有以下两种:
集成测试即组装测试,将已测试过的模块组合成子系统,其目的在于检测单元之间的接口有关的问题,逐步集成为符合概要设计要求的整个系统。
集成测试的方法策略可以粗略地划分为非渐增式集成测试和渐增式集成测试。
自顶向下集成是从主控模块开始,以深度优先或者广度优先的策略,从上到下组合模块。在测试过程当中,需要设计桩模块来模拟下层模块。
自顶向下集成测试方法要求首先测试控制模块,可以较早的验证控制点和判定点,也有助于减少对驱动模块的需求,但是需要编写桩模块。
自底向上集成是从程序的最底层功能模块开始组装测试逐步完成整个系统。这种集成方式可以较早的发现底层的错误,而且不需要编写桩模块,但是需要编写驱动模块。
三明治集成也叫作混合法,是将自顶向下和自底向上两种集成方式组合起来进行集成测试, 即对于软件结构的居上层部分使用自顶向下集成方式,对于软件结构居下层部分使用自底向上方式集成,将两者相结合的方式完成测试。
三明治集成兼有自顶向下和自底向上两种集成方式的优缺点,适合关键模块较多的被测软件。
确认测试是根据需求规格说明书来进一步验证软件是否满足需求。
经过确认测试,可以对软件做出结论性的评价,如软件各方面是否满足需求规格说明书规定,是否是一个合格的软件。
软件经过检验发现有哪些偏离了需求规格说明书的规定,列出缺陷清单并与开发部门和用户协商解决。确认测试的目标是验证软件的有效性。
确认测试一般包括有效性测试和软件配置审查。
有效性测试是在模拟的环境下,运用黑盒测试方法,验证被测软件是否满足需求规格说明书列出的需求。经过确认测试,应为该软件给出以下结论性的评价。
配置审查工作在确认测试中是重要的一个环节,主要在于确保已开发软件的所有文件资料均已撰写完毕,资料齐全、条目清晰,足以支持运行以后的软件维护工作。
配置审查的文件资料包括用户所需的资料如下:
系统测试是将已经确认的软件、硬件等元素结合起来,对整个系统进行总的功能、性能等方面的测试。 系统测试是软件交付前最重要、最全面的测试活动之一。
系统测试是根据需求规格说明书来设计测试用例的。
系统测试的内容非常多,也很繁杂,主要有以下内容:
验收测试是检测产品是否符合最终用户的要求,并在软件正式交付前确保系统能够正常工作且可用,即确定软件的实现是否满足用户需要或者合同的要求。验收测试是软件正式交付使用之前的最后一个阶段。
验收测试应完成的主要测试工作包括配置复审、合法性检查、文档检查、软件一致性检查、软件功能和性能测试与测试结果评审等工作。
验收测试主要由用户代表来完成, 用户代表通过执行典型任务来测试软件系统,根据平时使用系统的业务来检验软件是否满足功能、性能等方面的需求。
验收测试的结果有两种:一种为功能、性能满足用户要求,可以接受;另一种为软件不满足用户要求,用户无法接受。
验收测试的策略通常有3种,分别为:正式验收测试、AIpha测试(即非正式验收测试)、Beta 测试。验收测试的策略通常根据合同的需求、公司的标准及应用领域的基础来选择。
正式验收测试通常是系统测试的延续,是一项严格的过程。在很多组织中,正式验收测试是完全自动执行的。
对于正式验收测试来说,要测试的功能和特性、细节都是已知的,测试是可以自动执行并进行回归测试的。
但是,正式验收测试需要大量的资源和计划,并且由于测试时只会查找预期的缺陷,因此无法发现主观原因造成的缺陷。
Alpha 测试(即非正式验收测试)是用户在开发方的场所进行的活动, 用户在开发人员的指导下对软件进行使用,开发人员记录发现的错误和遇到的问题。
Alpha 测试是在受控的环境中进行的,不能由程序员或者测试人员来完成。Alpha 测试的关键在于尽可能还原用户实际运行情况和用户的实际操作,并且尽最大努力涵盖所有可能的用户操作方式。
Beta 测试是由最终用户在客户场所进行的活动。 开发人员通常不在Beta 测试的现场,因此,Beta 测试是软件在开发人员不能控制的真实环境中进行使用的。
用户记录在Beta测试过程中遇到的一切问题,并定期把这些问题反馈给开发人员。在接到反馈报告后,开发人员对软件进行必要的修改。
回归测试是指修改了旧代码后,重新进行测试活动。 回归测试严格来讲并不是一个阶段,而是可以存在于软件测试各个阶段过程的测试技术。
在软件生命周期中的任何一个阶段,只要软件发生了改变,就可能会带来问题,因此需要进行回归测试回归测试的目的就是检验缺陷是否被正确修改,以及修改的过程中有没有引出新的缺陷。
为了在给定的经费、时间、人力的情况下高效地进行回归测试,需要对测试用例库进行维护,并且依据一定的策略选择相应的回归测试包
测试用例的维护是一个不断的过程,随着软件的修改或者版本的更迭,软件可能添加一些新的功能或者某些功能发生了改变,测试用例库中的测试用例因此可能不再有效或者过时,甚至不再能够运行,需要对测试用例库进行维护,以保证测试用例的有效性。
在回归测试时,由于时间和成本的约束,将测试用例库中的测试用例都重新运行一遍是不实际的,因此,在进行回归测试时,通常选择一组测试包来完成回归测试。在选择测试包时,可以采用基于风险选择测试、基于操作剖面选择测试及再测试修改的部分等策略。
在进行回归测试时,一般会遵循以下步骤:
实施准备阶段制订软件实施计划,为后期的实施过程做好详尽的准备工作。
业务交流阶段根据准备阶段确定的实施策略,完成相关的工作。
业务交流阶段的成果为:
软件实施培训阶段需完成软件培训环境的搭建。软件实施培训包括系统管理员培训、数据库管理员培训和操作员培训。
在数据准备阶段,需要对数据进行整理及规范化。软件系统的运行通常需要特定的数据基础,即软件是否能够成功实施也依赖客户是否能够准确、全面、规范化地提供软件所需的基础数据。 数据的整理与规范化主要包括历史数据的整理、数据资料的格式化及各类基础数据的收集与电子化。
系统初始化阶段为:
新老系统切换是由先运行系统的工作方式向所开发的系统工作方式转换的过程。同时,系统的设备、数据、人员等也要发生转换。
新老系统切换的方式:
直接切换法 | 并行切换法 | 分段转换法 | |
---|---|---|---|
优点 | 简单、费用低,有一定的保护措施 | 可以保证系统的延续性,新老系统可以进行比较,并且可以平稳可靠的过度 | 避免了直接转换的风险及并行转换的高昂费用,可以平稳可靠的过度 |
缺点 | 风险大 | 费用高,容易延长系统转换的时间 | 容易出现接口问题,适用于大型系统 |
按照制订的新老系统切换计划完成切换,新系统即投入试运行。在试运行的过程中需要协助用户完成系统的日常维护工作,并提供技术支持。
在系统试运行的过程中收集、整理用户的反馈意见。根据系统的试运行情况,协助用户编制系统试运行报告。若达到试运行的目标,则向用户提出系统验收申请,并完成准备工作,如制订系统验收计划。
系统验收包括组织、完成新系统的验收工作,在协助甲方用户撰写系统验收报告。系统验收以后便开始实际运行,提供系统运行过程中的日常维护与技术支持工作。
软件维护是软件生命周期的最后一个阶段,是对原有系统的一种修改,基本任务是保证软件在一个相当长的时期内能够正常运行。由于软件在使用过程中需要不断地发现和排除错误,以及适应新的要求,所以软件工程的主要目的就是提高软件的可维护性,减少软件维护所需要的工作量,降低维护成本。
国标GB/T11457-95对软件维护给出如下定义。
- 在一个软件产品交付使用后对其进行修改,以纠正故障。
- 在一个软件产品交付使用后对其进行修改,以纠正故障、改进其性能和其他属性,或使产品适应改变了的环境。
软件维护根据要求进行的维护原因不同,可以分为改正性维护、适应性维护、完善性维护和预防性维护四类。
改正性维护是一种限制在原需求说明书的范围之内,修改软件中的缺陷或者不足的过程。因为软件开发时的测试不彻底、不完全,软件必然会有一些隐藏缺陷遗留到运行阶段,而这些隐藏的缺陷在某些特定的环境下就会暴露出来。
计算机科学技术领域的各个方面都在迅速进步,大约每过36个月就有新一代的硬件出现,而应用软件的使用寿命却很长,远远长于最初开发这个软件时的运行环境的寿命。
因此,适应性维护是为了使软件适应操作环境变化而进行的修改软件的活动,是既不可避免又经常要进行的维护活动。
操作环境的变化包括外部环境(新的硬件、软件配置)和数据环境(数据库、数据格式、数据输入/输出方式、数据存储介质等)。适应性维护可以是修改原有在DOS操作系统中运行的程序,使之能在Windows操作系统中运行;可以是修改两个程序,使它们能够使用相同的记录结构;可以是修改程序,使它能够适用于另一种终端设备。
完善性维护是为了改善、加强系统的功能和性能,改进加工的效率,提高软件的可维护性,而对软件进行的维护活动。完善性维护可以认为是一种有计划进行的软件“再开发”的活动。
实践表明,在所有维护活动中,完善性维护所占大约50%以上的工作量,比重是最大的。
预防性维护需要根据现有的信息对未来的环境变化进行预测,再根据预测的结果采取相应的解决措施,是为了提高软件未来的可维护性、可靠性等质量目标,为以后进一步改进软件奠定良好的基础。
随着软件规模的扩“大和软件复杂程度的增加,软件维护的工作越来越困难,费用也越来越昂贵。开发一个上线后就完全不需要改变的软件是不可能的。在过去的几十年里,软件维护的费用不断上升。
维护费用只是软件维护中的显性代价,除了费用,还有一些隐形代价也不可忽视,例如,软件维护占用太多资源而耽误了开发良机;维护过程中软件的改动引入了潜在缺陷,降低了软件质量;看起来合理的有关错误或修改的要求不能及时满足用户时引起用户的不满等。
维护的工作可以划分为生产型活动(分析评价、修改设计、编写程序代码等)和非生产型活动(程序代码功能理解、数据结构解释、接口特点和性能界限分析等)。
在软件维护中,软件维护的工作量影响软件成本的大小。而影响维护工作量的因素主要有以下6种:
软件维护主要有三类副作用:修改代码的副作用、修改数据的副作用和修改文档的副作用。
在对数据流、体系结构设计、模块过程或者任何其他有关特性进行修改时,必须对其支持的技术文档进行更新。如果没有及时进行更新,则在以后的维护工作中,可能因为阅读了老旧的技术文档而对软件特性做出不正确的评价,产生修改文档的副作用。
对文档进行及时更新及进行有效的回归测试可以减少软件维护的副作用。
软件维护的过程首先需要建立维护机构,然后确定维护报告的内容并进行相应的维护工作,记录维护流程、保存记录,最后确定评估及复审标准。
通常,标准的维护机构由维护管理员、系统管理员、维护决策机构、配置管理员和维护人员构成。在维护开始前明确维护责任可以大大减少维护过程中可能出现的混乱现象。
软件的维护要求应按照标准规范提出。维护申请报告是由用户填写的外部文件,通常包含错误的说明(输入数据、错误清单等内容),这是计划维护活动的基础,后续维护工作的关键。
经维护人员与用户进行反复协商,明确错误的情况及对业务的影响等,由维护管理员确认维护的类型,由软件组织内部制定出软件修改报告。
软件修改报告通常包含此次维护需求的类型、维护申请的优先级、完成申请表中所提出的需要的工作量及成本、预计修改后产生的影响等内容。软件修改报告提交给维护决策机构审查批准后进行维护工作的安排。
在实施维护的过程中,需要完成以下工作:
在维护过程中的有效数据应收集保存,形成良好的维护文档记录,以便统计出维护性能方面的度量模型。需要记录的数据一般包括程序的标识、程序交付及安装日期、程序安装后运行的次数、运行时发生故障导致运行失败的次数、进行程序修改的次数内容及日期等。根据提供的定量数据,可以对软件项目的开发技术、维护工作计划、资源分配及其他许多方面做出正确的判断。
维护工作完成之后,对维护情况进行评审,并且对相应问题进行总结。维护评审可以为软件机构提供重要的反馈信息。
软件的可维护性决定了软件生命周期的长短。
软件是否能够被理解、改正、适应和完善新的环境的难易程度,决定了软件可维护性的好坏。因此,软件的可维护性与软件的可理解性、可测试性和可修改性3个因素密切相关。
软件可维护性可定性地定义为:维护人员理解、改正、改动和改进这个软件的难易程度。
在衡量软件可维护性时通常用这7个质量特性来衡量:可理解性、可测试性、可修改性、可靠性、可移植性、可使用性和效率。
对于不同类型的维护,这7种特性的侧重点也不相同。要将这些质量要求贯彻到各开发阶段的各步骤中。软件的可维护性是产品投入运行以前各阶段针对上述质量特性要求进行开发的最终结果。
开发阶段 | 可维护性因素 |
---|---|
分析阶段 | 明确维护的范围和责任;检查每条需求,分析维护时可能需要的支持;明确哪些资源可能会变化,以及变化后带来的影响;了解系统可能的扩展与变更。 |
设计阶段 | 设计系统扩展、压缩和变更的方法;做一些变更或适应不同软硬件环境的实验;遵循高内聚、低耦合原则;设计界面不受系统内部变更的影响;每个模块只能完成一个功能。 |
编码阶段 | 检查源程序与文档是否一致;检查源程序的可理解性;源程序是否符合编码规范。 |
测试阶段 | 维护人员与测试人员一起按照需求文档和设计文档测试软件的有效性和可用性;维护人员将收集的出错信息分类统计,为今后的维护奠定基础。 |
提高软件的可维护性的技术途径通常从以下几个方面进行。
(2-1) 建立完整的文档管理体系
软件的文档包括用户文档和系统文档两类:
(2-2) 明确质量标准,设定不同侧重点
在软件的需求分析阶段就明确软件质量目标,确定标准,保证软件质量。软件的质量特性有些是相互促进的,有些是相互抵触的。针对不同软件设定不同的侧重点。例如,信息管理系统更强调可使用性和可修改性。
(2-3) 注重软件质量保证审查
在软件开发的每个阶段工作完成之前,都要进行严格的评审。进行软件质量保证审查来检测软件在开发和维护过程中发生的质量变化,用以提高软件的可维护性。若检测出问题,则可以及时纠正,控制了软件维护成本,延长软件系统的有效生命周期。
(2-4) 采用易于维护的技术和工具
采用易于维护的技术和工具进行软件开发,有利于提高软件的可维护性。
例如,采用面向对象、软件复用等先进的开发技术;采用模块化进行开发,减少模块间的相互影响;采用结构化进行程序设计;选择可维护性高的程序设计语言等。
软件的开发不会因为系统的交付而停止,它贯穿系统的整个生命周期。软件在开发完成后用户使用期间,由于业务变更和用户期待的改变,使得对现有系统出现了新的需求,对软件进行修改也是不可避免的。
这些对系统的修改、提升性能或其他非功能特性,都意味着系统在交付以后是在不断进化以满足变更的需求。软件开发与进化是一个集成、完整、增量式的过程。
软件进化过程在相当程度上依赖于所维护的软件的不同类型和参与开发过程的机构和人。
在所有机构中,系统变更建议都是系统进化的动力。这些变更建议可能包括在发布的颜本中还没有实现的已有需求、新的需求请求、系统所有者的补丁要求和来自系统开发团队的改进软件的新想法和建议。变更识别的过程和系统进化是循环和持续的,并且贯穿于系统的生命周期。
变更实现的过程可以看作是一个开发过程的迭代过程,在此迭代过程中完成对系统修改的版本的设计、实现和测试。
在进化过程中,要详细分析需求,因此往往在变更分析的早期阶段原本不明显的一些变更要求逐渐浮现出来。
这意味着所提出来的变更有可能要修改,并且在实现前需要进一步地与客户讨论。
遗留系统是过去开发的计算机系统,通常使用了目前已经过时或不再使用的技术。这些系统的开发可能在生命周期中一直持续,通过变更来适应新需求、新运行平台等方面的变化。
遗留系统不仅包括硬件和软件,还包括遗留的业务过程和步骤。对这类系统的一部分进行变更将不可避免地导致其他组成部分的变更。
遗留系统不仅仅是旧的软件系统,它包含社会和技术双重因素在内的基于计算机的系统,包括软件、硬件、数据和业务过程。
遗留软件的维护和升级通常会受到预算、期限等多种因素的约束,因此开发人员需要对遗留软件系统的实际情况进行准确的评价,然后选择最合适的进化策略。
遗留系统的进化策略有如下几个:
遗留软件系统的评价:
系统质量的评价从技术因素和环境因素两个方面进行。
从技术角度来评价一个软件系统,需要同时考虑应用软件本身及软件运行的环境。
环境包括硬件和所有相关的支撑软件,如对系统维护所需要的编译器等。通常,环境评价考虑的因素包括厂商稳定性、失效率、已使用时间、性能、保障需求、维护成本及互操作性等。技术评价考虑的因素包括可理解性、文档、数据、性能、程序设计语言、配置管理、测试数据及人员技术能力等。
软件再工程是指对既存对象系统进行调查,并将其中非可重用构件改造为新形式代码的开发过程。软件再工程的主要特点之一是最大限度地重用既存系统中的各种资源。
软件再工程可以通过对遗留系统进行全部或者部分的改造,来提高已有软件的质量或者商业竞争力。软件再工程开始于已有的系统,通过改善原始系统的结构和产生新的系统文档,使得系统的可维护性得到提高。
实施软件再工程可以减少重新开发软件的风险,降低开发软件的成本。软件再工程的成本比重新进行软件开发要小得多。当一个系统有很高的业务价值,同时需要很高的维护费用时,对系统实施再工程就是一个较好的办法。
典型的软件再工程过程模型定义了六类活动:库存目录分析、文档重构、逆向工程、代码重构、数据重构以及正向工程。
(1-1) 库存目录分析
库存目录分析包含关于每个应用系统的基本信息,如应用系统的名称、构建日期、已进行实质性修改次数、过去 18个月报告的错误、用户数量、文档质量、预期寿命、在未来 36个月内的预期修改次数、业务重要程度等。
库存目录分析阶段,应对每一个现存软件系统采集上述信息并通过局部重要标准对其排序,根据优先级不同选出再工程的候选软件,进而合理分配资源。对于预定将使用多年的程序、当前正在成功使用的程序和在最近的将来可能要做重大修改或增强的程序,可能成为预防性维护的对象。
(1-2) 文档重构
文档重构是对文档进行重建。软件老化的最大问题便是缺乏有效文档。 由于文档重构是一件非常耗时的工作,不可能为数百个程序都重新建立文档,因此,在文档重构的过程中,针对不同情况,文档重建的处理方法也是不同的。
若一个程序是相对稳定的,而且可能不会再经历什么变化,那么就保持现状,只针对系统中当前正在修改的部分建立完整文档,便于今后维护。如果某应用系统是完成业务工作的关键,而且必须重构全部文档,则应设法把文档工作减少到必需的最小量。
(1-3) 逆向工程
逆向工程是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素。 以制作出功能相近,但又不完全一样的产品。
逆向工程通常针对自己公司多年前的产品。期望从旧的产品中提取系统设计、需求说明等有价值的信息。逆向工程的关键在于从详细的源代码实现中抽取出抽象说明的能力。对于实时系统,由于须繁的性能优化,实现与设计之间的对应关系比较松散,设计信息不易抽取。
逆向工程导出的信息可以分为实现级、结构级、功能级及领域级4个抽象层次。
对于一项具体的维护任务,般不必导出所有抽象级别上的信息,如代码重构任务,只需获得实现级信息即可。
逆向工程根据源程序的类别不同,可以分为对用户界面的逆向工程、对数据的逆向工程和对理解的逆向工程。
(1-4) 代码重构
代码重构是软件再工程最常见的活动,目标是重构代码生成质量更高的程序。通常,重构并不修改软件的整个体系结构,仅关注个体模块的内部设计细节和局部数据结构,用新生成的易于理解和维护的代码替代原有的代码。
通常,对于具有比较完整、合理的体系结构,但是个体模块的编码方式比较难以理解、测试和维护的程序,可以重构可疑模块的代码。
(1-5) 数据重构
数据重构是对数据结构进行重新设计,适应新的处理要求。 代码的修改往往会涉及数据,并且随着需求的发展,原有的数据可能已经无法满足新的处理要求,因此需要重新设计数据结构,即对数据进行再工程。
数据重构是一种全范围的再工程活动,通常,数据重构始于逆向工程活动,分解当前使用的数据体系结构,必要时定义数据模型、标识数据对象和属性,并从软件质量的角度复审现存的数据结构。
(1-6) 正向工程
正向工程从现存软件中提取设计信息并用以修改或重建现存系统以提高系统整体质量。 当一个正常运行的软件系统需要进行结构化翻新时,就可对其实施正向工程。通常,被再工程的软件不仅重新实现现有系统的功能,而且加入了新功能和提高了整体性能。
软件再工程的方法有再分析、再编码和再测试3种。
国际标准是指由国际联合机构制定和公布,提供各国参考的标准。
国际标准化组织有着广泛的代表性和权威性,它所公布的标准也有较大的影响。20世纪60年代初,该机构建立了“计算机与信息处理技术委员会”(简称IOS/TC 97),专门负责与计算机有关的标准化工作。
国家标准是由政府或国家级的机构制定或批准,适用于全国范围的标准。 比较常见的国家标准如下。
行业标准是由行业机构、学术团体或国防机构制定,并适用于某个业务领域的标准。 典型的该类机构如电气和电子工程师协会(IEEE)。
- GJB——中华人民共和国国家军用标准。这是由我国国防科学技术工业委员会批准,适合于国防部门和军队使用的标准。例如,1988年发布实施的《GJB473-1988军用软件开发规范》。
- DOD-STD(Department of Defense-Standards)—美国国防部标准。适用于美国国防部门。
由于软件工程工作的需要,一些大型企业和公司制定了适用于本部门的规范。例如,美国IBM公司通用产品部在1984年制定的《程序设计开发指南》,供该公司内部使用。
由某一科研生产项目组织制定,且为该项任务专用的软件工程规范。例如,计算机集成制造系统的软件工程规范。
管理人员 | 开发人员 | 维护人员 | 用户 |
---|---|---|---|
可行性分析(研究)报告;项目开发计划;软件配置管理计划;软件质量保证计划;开发进度月报;项目开发总结报告 | 可行性分析(研究)报告;项目开发计划;软件需求规格说明;接口需求规格说明;软件(结构)设计说明;接口设计说明;数据库(顶层)设计说明;测试计划;测试报告 | 软件需求规格说明;接口需求规格说明;软件(结构)设计说明;测试报告 | 软件产品规格说明;软件版本说明;用户手册;操作手册 |
(2-1) 可行性与计划研究阶段
在可行性分析(研究)与计划阶段内,要确定该软件的开发目标和总的要求,进行可行性分析、投资一收益分析,制订开发计划,并完成可行性分析报告、开发计划等文档。
(2-2) 需求分析阶段
在需求分析阶段,由系统分析人员对被设计的系统进行系统分析,确定对该软件的各项功能、性能需求和设计约束,以及对文档编制的要求,作为本阶段工作的结果。
一般来说,软件需求规格说明(也称为软件需求说明、软件规格说明)、数据要求说明和初步的用户手册应该编写出来。
(2-3) 设计阶段
在设计阶段,系统设计人员和程序设计人员应该在反复理解软件需求的基础上,提出多个设计,分析每个设计能履行的功能并进行相互比较,最后确定一个设计。
这些设计包括该软件的结构和模块或 CSCI(计算机软件配置项)的划分,功能的分配,以及处理流程。在被设计系统比较复杂的情况下,设计阶段应分解成概要设计阶段和详细设计阶段两个步骤。在一般情况下,应完成的文档包括结构设计说明、详细设计说明和测试计划初稿。
(2-4) 实现阶段
在实现阶段,要完成源程序的编码、编译(或汇编)和排错调试,得到无语法错误的程序清单。
(2-5) 测试阶段
在测试阶段,该程序将被全面地测试,已编制的文档将被检查审阅。一般要完成测试分析报告。
作为开发工作的结束,所生产的程序、文档以及开发工作本身将逐项被评价,最后写出项目开发总结报告。
在整个开发过程中(即前五个阶段中),开发团队要按月编写开发进度月报。
(2-6) 运行与维护阶段
在运行和维护阶段,软件将在运行使用中不断地被维护,根据新提出的需求进行必要而且可能的扩充和删改、更新和升级。
每一种文档都具有特定的读者。
这些读者包括:个人或小组,软件开发单位的成员或社会上的公众,从事软件工作的技术人员、管理人员或领导干部。
他们期待着使用这些文档的内容来进行工作,如设计、编写程序、测试、使用、维护或进行计划管理。
因此,这些文档的作者必须了解自己的读者,文档的编写必须注意适应特定读者的水平、特点和要求。
本标准列出的文档编制规范的内容要求中显然存在某些重复,较明显的重复有两类:
这是为了方便每种文档各自的读者,每种文档应该自成体系,尽量避免读一种文档时又不得不去参考另一种文档。
当然,在每一种文档中,有关引言、说明等同其他文档相重复的部分,在行文上、所用术语上、详细程度上要有一些差别,以适应各种文档的不同读者的需要。
(3-1) 应编制的文档种类
一般来说,当项目的规模、复杂性和失败风险增大时,文档编制的范围、管理手续和详细程度将随之增加,反之,则可适当减少。
为了恰当地掌握这种灵活性,本标准要求贯彻分工负责的原则,这意味着:
(3-2) 文档的详细程度
从同一份提纲起草的文件的篇幅大小往往不同,可以少到几页,也可以长达几百页。对于这种差别,本标准是允许的。此详细程度取决于任务的规模、复杂性和项目负责人对该软件的开发过程及运行环境所需要的详细程度的判断。
(3-3) 文档的扩展
(3-4) 章、条的扩张与缩并
在软件文档中,一般宜使用本标准提供的章、条标题。但所有的条都可以扩展,可以进一步细分,以适应实际需要。反之,如果章条中的有些细节并非必需,则也可以根据实际情况缩并,此时章条的编号应相应地变更。
(3-5) 程序设计的表现形式
本标准对于程序的设计表现形式并未做出规定或限制,可以使用流程图、判定表的形式,也可以使用其他表现形式,如程序设计语言(PDL)、问题分析图(PALb)等。
(3-6) 文档的表现形式
本标准对于文档的表现形式亦未做出规定或限制,可以使用自然语言,也可以使用形式化语言,还可以使用各种图、表。
(3-7) 文档的其他种类
当本标准中规定的文档种类尚不能满足某些应用部门的特殊需要时,可以建立一些特殊的文档种类要求,如软件质量保证计划、软件配置管理计划等,这些要求可以包含在本单位的文件编制实施规定中。
软件工程文档标准 GB/T 8567-2006
—— writing by Pan Qifan(潘琦藩) ——
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。