1软件的概念、特征
1.1软件的概念
软件是一系列程序、数据及其相关文档的集合,其中三要素,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序的开发、维护和使用有关的图文资料。计算机软件的核心是程序。
1.2软件的特征
-
软件是一种逻辑实体,不是具体的物理实体;
-
软件产品生产方式主要是研制。
-
软件具有复杂性,其开发和运行受计算机系统制约。
-
软件的开发尚未完全摆脱手工生产方式,因此其成本非常昂贵。
-
软件不存在磨损老化问题,存在退化问题。
1.3软件生命周期
-
可行性研究和项目开发计划
-
需求分析:软件功能需求与非功能需求
-
概要设计:功能模块设计
-
详细设计:数据结构与算法设计
-
编码:实际编码实现
-
测试:测试软件正确性,是否满足用户需求
-
维护:根据客户需求变更软件功能
2软件危机的原因与表现
2.1什么是软件危机?
软件危机(Software Crisis):指由于落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。实际上,⼏乎所有软件都不同程度地存在问题。
问题 它包括两⽅⾯的问题:
①如何开发软件,已满⾜对软件⽇益增⻓的需求; 满足需求
②如何维护数量不断膨胀的已有软件; 维护已有
2.2软件危机有哪些典型表现?
(1) 软件开发计划难以制订。
(2) 软件开发费用和进度失控。
(3) 软件产品无法让用户满意。
(4) 软件产品的质量难以保证。
(5) 软件通常没有适当的文档资料。
(6) 软件通常是不可维护的。
(7) 软件成本在计算机系统总成本中所占比例逐年上升。
2.3为什么会出现软件危机?
答:
客观
①⼀⽅⾯与软件本身的特点有关,另⼀⽅⾯也与软件开发与维护的⽅法不正确有关
②软件不同于硬件,它是计算机系统的逻辑部件⽽不是物理部件。由于软件缺乏可⻅性,在写代码并在计算机上试运⾏之前,软件开发过程的进展情况较难权衡,软件的质量也难以评价,因此,管理和控制开发过程相当困难。软件在运⾏过程中不会因为使⽤时间过⻓⽽被“⽤坏”,如果运⾏发现了错误,很可能是遇到了⼀个在开发时期引⼊的在测试阶段没能检测出的错误。因此软件维护常意味着改正或修改原来的设计,这就客观上使得软件⽐较难维护
③软件的⼀个显著特点是规模庞⼤,⽽且程序复杂性将随着程序规模的增加⽽呈指数上升
主观
④计算机系统发展的早期阶段软件开发的个体特点,忽视软件需求分析的重要性,认为开发就是写程序并设法使之运⾏,轻视软件维护,忽视评审,忽视测试等
⑤引⼊⼀个变动要对所有已完成的配置成份都做相应的修改,因此代价剧增
2.4怎样消除软件危机?
(1)软件危机产生的内在原因 一方面是软件生产本身存在着复杂性,另一方面是与软件开发和维护所使用的方法不合理。
(2)软件开发需要对程序设计方法等问题进行研究,也需要对软件的需求、设计、测试、维护和管理等方法进行研究。人们逐渐感到采用工程化的原则和方法从事软件开发过程研究的必要性。“软件工程”应运而生。
3软件工程的概念及组成
3.1什么是软件⼯程?
软件工程是开发、运行、维护和修复软件的系统方法,其中,“软件”的定义为:计算机程序、方法、规则、相关的文档资料以及在计算机上运行时所必需的数据
主要思想:按照工程化的原理、原则和方法开发、运行、维护软件。
3.2 软件工程过程
软件工程过程是指在软件工具支持下,所进行的一系列软件工程活动,通常包含以下四个阶段:
- 软件规格说明:规定软件功能及其运行环境
- 软件开发:产生满足规格说明的软软件
- 软件确认:确认软件能够完成客户提出的需求
- 软件演进:为满足客户的变更需求,软件必须在使用的过程中演进
3.3软件⼯程三要素
软件⼯程包括技术和管理两⽅⾯的内容
软件⼯程⽅法学包括三个要素:⽅法、⼯具、过程
软件工程⽅法: 完成软件开发的各项任务的技术⽅法,研究软件开发“如何做”。
软件工程工具:研究支撑软件开发方法的工具,为方法的运用提供自动或者半自动的支撑环境。软件工具集成环境又称计算机辅助软件工程(Computer Aided Software Engeineering , CASE)
软件工程过程则是指将软件工程方法与软件工具相结合,实现合理、及时地进行软件开发的目的,为了开发高质量软件规定各项任务的工作步骤。
3.3.1⽅法
结构化开发方法
结构化开发方法:是一种面相数据流的开发方法,他的基本原则是功能的分解与抽象
指导思想:自顶向下,逐步求精
面相对象开发方法
Object-Oriented Software Development,OOSD
-
基本思想:对问题领域进行自然分割,以更接近人类思维方式建立问题领域的模型,以便对客观的信息实体进行结构和行为的模拟,从而使设计的软件更加直接地表现问题的求解过程。
-
OOSD = OOA + OOD + OOP
analyse design program
-
定义:面相对象 = 对象 + 类 + 继承 + 消息
-
对象
-
对象:对象是对客观事物或者概念的抽象表述,对象不仅能表示具体的实体,也能表示抽象的规则、计划或者事件。
-
每个对象都存在一定的状态state、内部标识identity。可以给对象定义一组操作(opertation),对象功过其运算所展示的特定行为称为对象行为behavior;对象本身的性质称为属性(attribute);对象将他自身的属性及运算包装起来称为封装(encapsulation);因此对象是一个封装数据属性和操作行为的实体。
-
数据描述对象状态,操作可操纵对象私有数据,改变对象状态。
-
当其他对象向该对象发送消息,该对象响应时,其操作才得以实现。对象内的操作也叫方法。
-
-
类
-
类,又称对象类(Object Class),是一组具有相同数据结构和相同操作的对象集合。类是对象的模板,在一个类中每一个对象都是他的实例(Instance)。类具有属性,用数据结构来描述类的属性;类具有操作,他是对象行为的抽象。
-
由于对象是类的实例,在进行系统分析和设计时,通常把注意力集中在类上,而不是具体的对象。
-
-
继承
- 继承(Inheritance)以现存的定义作为基础,建立新定义的技术,是子类和父类之间共享数据结构和方法的机制。
-
消息
-
消息指对象之间在交互中所传递的通信信息,消息使对象之间互相联系,协同工作,实现系统的各种服务。
-
消息传递:通常一个对象向另一个对象发送信息请求某项服务,接受对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象,这种通信机制叫做消息传递
-
-
OOA
-
解决做什么?
-
他的基本任务是要建立以下三种模型
-
对象模型(信息模型)定义构成系统的类和对象,他的属性和操作
-
状态模型(动态模型)描述任何时刻对象的联系及其联系的改变,即时序。常用状态图,事件追踪图。
-
处理模型(函数模型)描述系统内部数据的传送处理
-
-
OOD
-
在需求分析的基础上,进一步解决"如何做”。
-
分为概要设计和详细设计
其中OOA与OOD是面相对象开发方法的关键
总结:面相对象的方法以对象为核心,强调模拟现实世界种的概念,而不是算法,尽量用符合人类认识世界的思维方式来渐进的分析、解决问题,对软件开发所有阶段进行综合考虑,能够有效的降低软件开发的复杂度,使软件的易用性和易拓展性都得到了提高,而且能够更好的适应需求的变化,提高软件的质量。
原型开发方法
-
原型开发方法:基本思想是花费少量的代价建立一个可运行系统,使用户及早获得学习的机会
-
该模型强调的是开发人员与用户不断交互,通过原型演进不断适应用户任务改变的需求,将维护和修改阶段的工作尽早进行,使用户提前验收,从而使软件产品更加适用
⼯具
⼯具:为运⽤⽅法⽽提供的⾃动的或半⾃动的软件⼯程的⽀撑环境
过程
过程:为了获得⾼质量的软件所需要完成的⼀系列任务的框架,它规定了完成各项任务的⼯作步骤
4.例题
1.假设⾃⼰是⼀家软件公司的总⼯程师,当把图 1.1 给⼿下的软件⼯程师们观看告诉他们及早发现并改正错误的重要性时,有⼈不同意这个观点,认为要求在错误进⼊软件之前就清除它们是不现实的,并举例说:“如果⼀个故障时编码错误造成的,那么,⼀个⼈怎么能在设计阶段清除它呢?”应该怎么反驳他呢?
答:可以从两⽅⾯来回答:
(1)在软件开发的不同阶段进⾏修改需要付出的代价是很不同的,在早期引⼊变动,涉及的⾯较少,因⽽代价也⽐较低;⽽在开发的中期,软件配置的许多成分已经完成,引⼊⼀个变动要对所有已完成的配置成分都做相应的修改,不仅⼯作量⼤,⽽且逻辑上也更复杂,因⽽付出的代价剧增。
(2)在软件“已经完成”时在引⼊变动,当然需要付出更⾼的代价。在后期引⼊⼀个变动⽐早期引⼊相同变动所需付出的代价⾼ 2~3 个数量级。
2.简述结构化范型和⾯向对象范型(软件工程的两大范型)的要点,并分析它们的优缺点。
结构化范型:传统⽅法学也称⽣命周期⽅法学或结构化范型
要点:
①它采⽤结构化技术(结构化分析 SA、结构化设计 SD、结构化实现 SP)来完成软件开发的各项任务,并使⽤适当的建模⼯具或软件⼯程环境来⽀持结构化技术的运⽤,这种⽅法学吧软件⽣命周期的全过程依次划分为若⼲个阶段,然后顺序地完成每个阶段的任务;
②其工作模型采用瀑布模型,将软件开发过程划分为若干相互区别而又彼此联系的阶段,每个工作阶段以上一个阶段的工作结果为依据,同时作为下一阶段的工作基础,;
③每个阶段结任务完成之后,产生相应的文档。
优点:把软件⽣命周期划分成若⼲个阶段,每个阶段的任务相对独⽴,⽽且⽐较简单,便于不同⼈员分⼯协作,从⽽降低了整个软件开发⼯程的困难程度;在软件⽣命周期的每个阶段都采⽤科学的管理技术和良好的技术⽅法,保证了软件的质量;显著提⾼了软件开发的成功率和⽣产率。
缺点:软件开发过程是个充满回溯的过程,而瀑布模型却将其硬性分割为独立的几个阶段,不能从本质上反映软件开发过程本身规律。过分强调复审,并不能完全避免较为频繁的变动。若需求变化,软件变动很难实现。
⾯向对象范型:
要点:⾯向对象⽅法 = 对象 + 类 + 继承 + ⽤消息通信
它是⼀种以数据为主线,把数据和对数据的操作紧密的结合起来的⽅法;⾯向对象⽅法学的出发点和基本原则,是尽量模拟⼈类习惯的思维⽅式,使开发软件的⽅法和过程尽肯能接近⼈类认识世界、解决问题的⽅法与过程,从⽽是描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能⼀致。
优点:
a、按照⼈类习惯的思维⽅法,对软件开发过程所有阶段进⾏综合考虑;
b、软件⽣存期各阶段所使⽤的⽅法、技术具有⾼度的连续性
c、软件开发各个阶段有机集成,有利于系统的稳定性
d、⾯向对象⽅法特有的继承性和多态性,进⼀步提⾼了⾯向对象软件的可重⽤性
结构化范型强调⾃顶向下顺序地完成软件开发的各阶段任务;
⾯向对象⽅法学的软件开发过程是⼀个主动地多次反复迭代的演化过程。
结构化设计和面相对象设计有何区别?
结构化设计:系统被划分成多个模块,这些模块被组织成一个树型结构。根就是主模块,叶子是最低级的功能模块。这棵树也表示调用结构:每个模块都调用自己的直接下级模块,并被自己的直接上级模块调用。顶层模块负责收集应用程序最重要的那些执行策略,底层模块实现处理细节。在这个体系结构中越靠上层位置,概念的抽象层次就越高。但是,由于上层模块需要调用下层模块,所以这些上层模块就依赖于下层模块的处理细节。也就是说,当实现细节发生变化时,抽象也会受到影响;如果想复用某一个抽象的话,就必须把它依赖的细节都一起拖过去。
面向对象设计:上层创建的抽象不依赖于任何细节,而细节则高度依赖于上层的抽象。这种依赖关系的变化正是结构化设计与面向对象设计的根本区别。
6.软件工程有哪些基本思想?
软件工程化思想的核心是把软件看做是一个工程产品,这种产品的生产过程需要通过需求分析、设计、实现、测试、管理和维护。
8.分解与抽象的关系是什么?
9.软件工程有哪些活动?它们之间的关系是什么?
软件工程活动包括开发活动、维护活动、管理活动和过程改进等。
规划设计以及实现项目,项目上线后维护项目,软件项目开发过程复杂,需要有项目计划,分步骤,完成
软件产品的特性是什么?
-
软件是一种逻辑实体
-
软件产品的生产主要是研制过程
-
软件具有复杂性,其开发过程常受到计算机系统的限制
-
软件成本高昂,其开发方式目前尚未完全脱离手工生产方式
-
软件不存在老化磨损问题,但存在退化问题
软件发展有几个阶段?各有何特征?
1 程序设计阶段。 硬件特征:价格贵、存储容量小、运行可靠性差。 软件特征:只有程序、程序设计概念,不重视程序设计方法。 2 程序系统阶段。 硬件特征:速度、容量及工作可靠性有明显提高,价格降低,销售有爆炸性增长。 软件特征:程序员数量猛增,开发人员素质低。 3 软件工程阶段。 硬件特征:向超高速、大容量、微型化及网络化方向发展。 软件特征:开发技术有很大进步,但未获得突破性进展,软件价格不断上升,未完全摆脱软件危机。
什么是软件危机,其产生的原因是什么
软件危机(Software Crisis):指由于落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。实际上,⼏乎所有软件都不同程度地存在问题。
问题 它包括两⽅⾯的问题:
①如何开发软件,已满⾜对软件⽇益增⻓的需求; 满足需求
②如何维护数量不断膨胀的已有软件; 维护已有
什么是软件过程,有哪些主要的软件过程模型,他们各自有什么特点
软件工程过程则是指将软件工程方法与软件工具相结合,实现合理、及时地进行软件开发的目的,为了开发高质量软件规定各项任务的工作步骤。
有哪些主要的软件开发方法
结构化开发方法、原型化开发方法、面相对象开发方法
软件生命周期各阶段的主要任务是什么
1.可行性研究和项目开发计划。该阶段必须要回答的问题是 “软件系统要解决的问题是什么”
2.需求分析。该阶段的任务是,通过分析准确地得出“软件系统必须做什么”,即软件系统必须具备哪些功能
3.概要设计。主要任务是确定软甲体系结构,划分子系统模块以及确定模块之间的关系。并确定系统的数据结构和进行界面设计
4.详细设计。即对每个模块完成的功能、算法进行具体描述,把功能描述变为精确的、结构化的过程描述
5.编码。该阶段把每个模块的控制结构转换成计算机可接受的程序代码,即编写以某种特定程序设计语言表示的“源代码”
6.测试。是保证软件质量的重要手段,其主要方式是在设计测试用例的基础上检验软件的各个组成部分,
7.维护。交付软件后售后。
原型化方法的核心是什么,它具有哪些特点
原型化方法的基本思想是花费少量代价建立一个可运行的系统,使用户及早获得学习的机会。
强调软件开发人员与用户的不断交互,通过原型的演进不断适应用户任务改变的需求,将维护和修改阶段的工作尽早进行,使用户验收提前,从而使软件产品更加适用。
面相对象的开发方法为什么逐渐成为软件开发的主流方法
传统开发方法存在软件重用性差、可维护性差、应对需求的灵活性差等问题,应用结构化方法开发的软件,其稳定性、可修改性和可重用性都不是很好;
面向对象的开发方法有效克服了传统方法的不足,采用与人类习惯相一致的思维方法,在提高软件系统的稳定性、可修改性、可重用性、可维护性、以及应对需求的灵活性等方面具有明显优势。
什么是软件开发环境,他对软件开发过程有和意义
软件开发环境是指包括方法、工具和管理等多重技术在内的综合系统,是为了支持系统软件和应用软件的工程化开发和维护维护而使用的一组软件,是一组软件工具的集合。
优势:良好的软件开发环境能够建华软件开发过程,提高软件开发质量
敏捷开发的核心思想是什么,以xp方法为例进行说明
敏捷开发的核心思想是以用户需求为进化为核心,采用迭代、增量式的方法进行软件开发。将项目分解为数个短期迭代周i,快速响应呢需求进行增量开发,由团队自身寻找最佳工作方式来完成工作。
极限编程以用户需求作为软甲开发的中级目标,是一种以实践为基础的软件工程过程,极限编程强调测试,是一种测试驱动开发的方法,强调代码质量和及早发现问题,以适应环境和需求的变化。
软件开发工具的集成可以分为哪几个层次
一个集成化的CASE开发环境通常需要完成以下三个层次集成:
(1)平台的集成。平台是指CASE工具运行所处的计算机硬件和操作系统环境。
(2)界面的集成。界面集成是指集成化的CASE环境中的各种软件开发工具都采用统一的用户交互界面和方式,以达到减少用户学习和使用这些工具的难度和复杂度的目的。
(3)数据的集成。为了实现不同的CASE工具之间的数据交换与共享,数据的集成是集成化的CASE开发环境需要解决的一个核心问题。
集成化的CASE环境相对于彼此独立的软件开发工具有哪些明显的优势
集成化的CASE环境具有如下优势:
(1)软件开发过程中的所有信息都采用统一的存储格式,集中统一存储在共享的中心数据库中,使得在软件工具之间、开发人员之间、开发活动的各个过程之间可以方便而高效地进行数据的共享和交换。
(2)集成化的CASE环境由于采用了统一的用户界面,为软件开发人员提供了更为方便的使用平台,并且改善了开发人员之间的协调能力。
(3)集成化CASE环境的使用,可以贯穿软件开发的各个阶段,包括分析、设计、编码、测试、维护和配置,这使得软件开发活动和相关的开发信息可以流畅地由一个开发阶段过渡到下一个开发阶段。
(4)集成化的CASE环境也具有更好的可移植性,使其可以适用于不同的硬件平台和操作系统。
1.3⽂档的作⽤
通信的⼯具
起备忘录的作⽤
⽂档提⾼软件开发过程的能⻅度
记录开发过程的有关信息
作为阶段成果和结束标志