欢迎光临散文网 会员登陆 & 注册

软件工程导论 张海藩

2022-05-12 22:19 作者:Ctrl_CVa  | 我要投稿

1、软件危机的典型表现

(1)对软件开发成本和进度的估计常常很不准确

(2)经常出现用户对“已完成的”软件产品不满意的情况

(3)软件产品的质量往往达不到要求

(4)软件通常是很难维护的

(5)软件往往没有适当的文档资料

(6)软件成本在计算机系统总成本种所占比例逐年上升

(7)软件开发生产率提高的速度远远不能满足社会对软件产品日益增长的需求


2、消除软件危机的途径

(1)对计算机软件有一个正确的认识,软件≠程序

(2)必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。

 

(3)推广使用在实践中总结出来的开发软件的成功的技术和方法

(4)应该开发和使用更好的软件工具即技术措施,组织管理措施

 

3、瀑布模型

适用范围:需求明确,小规模软件开发传统软件工程方法学的软件过程基本上可以用瀑布模型来描述

优点:强迫开发人员采用规范的技术方法;严格地规定了每个阶段必须提交的文档;每个阶段结束前必须正式进行严格的技术审查和管理复查。

缺点:开发人员和用户之间缺乏有效的沟通,很可能导致最终开发出来的软件产品不能真正满足用户的需求。

 

4、快速原型模型

适用范围:需求不明确的

所谓快速原型模型是快速建立起来的、可在计算机上运行得程序,它所能完成的功能往往是最终的软件产品所能完成功能的子集。原型是软件开发人员与用户沟通的强有力工具,因此有助于所开发出的软件产品满足用户的真实需求。

优点:使用这种软件过程开发出的软件产品通常能满足用户的真实需求;软件产品的开发过程基本上是线性顺序过程。

缺点:这样开发出来的系统,往往可能因为折中而采取不合适的操作系统或程序设计语言。


5、增量模型

适用范围:进行已有产品升级或新版本开发;对完成期限严格要求的产品;对所开发的领域比较熟悉而且已有原型系统。

增量模型也称为渐增模型,使用增量模型开发软件时,把软件产品作为一系列增量构件来设计、编码、集成和测试。每个构件由若干个相互协作的模块构成,并且能够完成相对独立的功能。

优点:能在较短时间内向用户提交可完成部分工作的产品;逐步增加产品功能,从而使用户有较充裕的时间学习和适应新产品,减少一个全新的软件给用户所带来的冲击。

缺点:集成困难,软件结构开放不好设计。


6、螺旋模型

适用范围:内部开发的大型软件项目

把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,是一种风险驱动的迭代式开发过程。具体为不断重复生命周期模型,并在每个生命周期结构后,向用户提交一个可运行的软件产品版本。

优点:有利于已有软件得重用;有助于把软件质量作为软件开发的一个重要目标;减少了过多测试或测试不足所带来的风险;软件维护与软件开发没有本质区别。

缺点:需要相当的风险分析评估的专门技术,且成功依赖于这种技术。很明显一个大的没有被发现的风险问题,将会导致问题的发生,可能导致烟花的方向失去控制。这种模型相对比较新,应用不广泛,其功效需要进一步验证。


7、Rational 统一过程

适用范围:大型的需求不断变化的复杂软件系统项目

优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组建的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。


缺点:RUP 只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,他没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。

 

RUP 得最佳实践:迭代式开发;管理需求;使用基于构件的体系结构;可视化建模;验证软件质量;控制软件变更。 

RUP 软件开发生命周期:是一个二维的生命周期;9 个核心工作流和 4 个工作阶段。其中前 6 个是核心过程工作流程,后 3 个是核心支持工作流程。

9 个核心工作流:业务建模,需求,分析与设计,实现,测试,部署,配置与变更管理,项目管理,环境。

 4 个工作阶段:初始阶段(建立业务模型,定义最终产品视图,并且确定项目的范围);精化阶段(设计并确定系统的体系结构,制定项目计划,确定资源需求);构建阶段(开发出所有构件和应用程序,把它们集成为客户所需得产品,并且详尽地测试所有功能);移交阶段(把开发出的产品提交给用户使用)。

 

8、敏捷过程

适用范围:商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束/开发可用资源及开发时间都有较苛刻约束得小型项目

 

敏捷软件开发宣言的 4 个简单的价值观:个体和交互胜过过程和工具;可以工作的软件胜过面面俱到的文档;客户合作胜过合同谈判;响应变化胜过遵循计划。

 

9、极限编程 XP

适用范围:需求模糊且经常改变的场合。

特点:对变化和不确定性的更快速、更敏捷的反应;在快速的同时仍然能够保持可持续的开发速度。

有效实践:客户作为开发团队的成员;使用用户素材;短交付周期;验收测试;结对编程;测试驱动开发;集体所有;持续集成;可持续的开发速度;开放的工作空间;及时调整计划;简单的设计;重构;使用隐喻。

 

10、微软过程

适用范围:商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式。

 

优点:综合了 RUP 和敏捷过程的许多优点,是对众多成功项目的开发经验的正确总结缺点:对方法、工具和产品等方面的论述不如 RUP 和敏捷过程全面,人们对它的某些准则本身也有不同意见。

生命周期:5 个阶段,规划阶段,设计阶段,开发阶段,稳定阶段,发布阶段。


11、为什么说分阶段的生命周期模型有助于软件项目管理?


软件是计算机系统的逻辑部件而不是物理部件,其固有的特点是缺乏可见性,因此,管理和控制软件开发过程相当困难。分阶段的生命周期模型提高了软件项目的可见性。管理者可以把各个阶段任务的完成作为里程碑来对软件开发过程进行管理。把阶段划分得更细就能够更密切地监控软件项目的进展情况。

 

12、在进行详细设计之前先进行总体设计的必要性:


可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。

 

13、编程时使用的程序设计语言对软件开发与维护的影响?


(1)程序设计语言是人们用计算机解决问题的基本工具,因此,它将影响软件开发人员的思维方式和解题方式。 

(2)程序设计语言是表达具体的解题方法的工具,它的语法是否清晰易懂,阅读程序时是否容易产生二义性,都对程序的可读性和可理解性有较大影响。 

(3)程序设计语言所提供的模板化机制是否完善,编译程序查错能力的强弱等,都对程序的可靠性有明显影响。 

(4)程序设计语言实现设计结果的难易程度,是否提供了良好的独立编译机制,可利用的软件开发工具是否丰富而且有效等,都对软件的开发效率有影响。 

(5)编译程序优化能力的强弱,程序设计语言直接操纵硬件设施的能力等,都将明显地影响程序的运行效率。 

(6)程序设计语言的标准化程度,所提供的模板封装机制,源程序的可读性和可理解性等,都将影响软件的可维护性。

 

14、维护代价高昂——软件维护中无形的代价有:


(1)因为可用的资源必须供维护任务使用,以致耽误甚至丧失了开发的良机。

(2)当看来合理的有关改错或修改的要求不能及时满足时将引起用户不满。

(3)由于维护时的改动,在软件中引入了潜伏的错

误,从而降低了软件的质量。

(4)当必须把软件工程师调去从事维护工作时,将在开发过程中造成混乱。

(5)生产率的大幅度下降。

维护存在的问题:

(1)理解别人写的程序非常困难,而且困难程度随着软件配置成分的减少而迅速增加。

(2)需要维护的软件往往没有合格的文档,或者文档资料显著不足。

(3)当要求对软件进行维护时,不能指望由开发人员给人们仔细说明软件。

(4)绝大多数软件在设计时没有考虑将来的修改。

(5)软件维护不是一项吸引人的工作。


15、为什么在开发大型软件时,采用面向对象范型比采用结构化范型较易取得成功?


(1)结构化技术要么面向处理(如面向数据流的设计方法),要么面向数据(如面向数据结构的设计方法),但没有既面向处理又面向数据的结构化技术。用结构化技术开发出的软件产品的基本成分是产品的行为(即处理)和这些行为所操作的数据。由于数据和对数据的处理是分离的,因此,使用结构化范型开发出的软件产品本质上是一个完整的单元,由此带来的后果是软件规模越大,用结构化范型开发软件的技术难度和管理难度就越大。 

(2)与结构化技术相反,面向对象技术是一种以数据为主线,把数据和处理相结合的方法。面向对象范型把对象作为由数据及可以施加在这些数据上的操作所构成的统一体。用面向对象范型开发软件时,构成软件系统的每个对象就好像一个微型程序,有自己的数据、操作、功能和用途,因此,可以把一个大型软件产品分解成一系列本质上相互独

立的小产品来处理,不仅降低了软件开发的技术难度,而且也使得对软件开发工作的管理变得相对容易了。

 

16、为什么说面向对象方法与人类习惯的思维解题方法比较一致?


面向对象方法学的基本原则是按照人们习惯的思维方式建立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。面向对象的软件系统中广泛使用的对象是对客观世界中实体的抽象,对象实际上是抽象数据类型的实例,提供了立项的数据抽象机制,同时又具有良好的过程抽象机制(通过发消息使用公有成员函数)。因此,面向对象的环境提供了强有力的抽象机制,便于人们在利用计算机软件系统解决复杂问题时使用习惯的抽象思维工具。此外,面向对象方法学中普遍进行的对象分类过程支持从特殊到一般的归纳思维过程;面向对象方法-学中通过建立类等级而获得的继承特性支

持从一般到特殊的演绎思维过程。

 

17、功能内聚和信息性内聚的区别


(1)内聚是衡量组成模块的各个元素彼此结合的紧密程度,它是信息隐藏和局部化原理的自然扩展。设计软件时应该力求做到模块高内聚。 

(2)当采用结构化范型设计软件系统时,使用功能分解方法划分模块。组成这类模块的元素最主要是完成模块功能的可执行语句。如果模块内所有处理元素属于一个整体,完成单一完整的功能,则该模块的内聚称为功能内聚。采用结构化范型开发软件时,功能内聚是最高级的内聚。

(3)采用面向对象范型设计软件时,使用对象分解方法划分模块。对象是面向对象软件的基本模块,它是由描述该对象属性的数据及可以对这些数据施加的操作封装在一起构成的统一体。因此,组成对象的主要元素既有数据又有操作,这两类元素是同等重要的。如果一个对象可以完成许多相关的操作,每个操作都有自己的入口点,它们的代码相对独立,而且所有操作都在相同的数据结构上完成,也就是说,操作围绕对其数据所需要做的处理来设置,不设置与这些数据无关的操作,则该对象具有信息性内聚。实际上,信息性内聚的对象所包含的操作本身应该是功能内聚的。


18、多态重用与继承重用的关系。


(1)当已有的类构件不能通过实例重用方式满足当前系统的需求时,利用继承机制从已有类诞生出符合当前需要的子类,从而获得可在当前系统中使用的类构件,这种重用方式称为继承重用。

(2)如果在设计类构件时,把可能妨碍重用的、与应用环境密切相关的操作从一般操作中分离出来,作为适配接口,并且把这类操作说明为多态操作,类中其他操作通过调用适当的多台操作来完成自己的功能,则为了在当前系统中重用已有的类构件,在从已有类诞生出的子类中只需要重新定义某些多态操作即可满足当前系统的需求,这种重用方式称为多态重用。

(3)通过上面的叙述可以知道,多态重用实际上是一种特殊的继承重用,是充分利用多态性机制支持的继承重用。一般说来,使用多态重用方式重用已有的类构件时,在子类中需要重新定义的操作比较少,因此,这种重用方式的成本比继承重用方式的成本低。


19、程序设计风格


新规则:提高可重用性(准则:提高方法的内聚;减小方法的规模;保持方法的一致性;把策略和实现分开;全面覆盖输入条件的各种可能组合;尽量不使用全局信息;尽量利用继承机制),提高可扩充性(准则:封装类的实现细节;避免使用多分支语句;精心选择和定义公有方法),提高健壮性(准则:预防用户的错误操作;检查参数的合法性;不要预先设定数据结构的限制条件;先测试后优化)。


20、为什么应该尽量使用面向对象语言来实现面向对象分析和设计的结果?


面向对象语言充分支持对象、类、封装、继承、多态、重载等面向对象的概念,编译程序能够自动地在目标程序中实现上述概念,因此,把面向对象的设计结果翻译成面向对象程序设计比较容易,这就降低了编程工作量而且减少了编程错误。更重要的是,从面向对象分析到面向对象设计再到面向对象程序设计,始终使用统一的概念,既可以保证在软件开发过程的各个阶段之间平滑过渡,又有助于提高软件的可重用性和可维护性。


21、什么是强类型语言?这类语言有哪些优点?


(1)按照编译时对程序中使用的数据进行类型检查的严格程度,可以把程序设计语言划分为两类。如果语言仅要求每个变量或属性隶属于一个对象,则是弱类型的;如果语法规定每个变量或属性必须准确地属于某个特定的类,则这样的语言是强类型的。

(2)强类型的语言主要有两个优点:一是有利于在编译时发现程序错误;二是增加了优化的可能性。因此,强类型语言提高程序的可靠性和运行效率。


22、为什么推迟关键路径上的任务会延迟整个项目?

关键路径定义为一组任务(称为关键任务),这组任务决定了完成项目所需要的最短时间。如果位于关键路径上的一个关键任务的完成时间被推迟了,则关键路径上的下一个任务的开始时间和结束时间也要相应的延迟。这样依次传递,会波及关键路径上的最后一个任务,从而延迟整个项目。


23、一个程序能既正确又不可靠吗?


所谓软件可靠性,是程序在给定的时间间隔内按照规格说明书的规定成功地运行概率。通常认为,软件可靠性既包含正确性又包含健壮性,也就是说,不仅在预定环境下程序应该能正确地完成预期功能,而且在硬件发生故障,输入的数据无效或用户操作错误等意外环境下,程序也应该能作出适当的响应。

如果一个程序在预定环境下能够正确地完成预期的功能,但是在意外环境下不能作出适当的响应,则该程序就是既正确又不可靠。


24、为什么在开发软件的过程中变化既是必要的又是不可避免的?为什么必须进行配置管理?


在开发软件的过程中,下述原因会导致软件配置项发生变化:新的市场条件导致产品需求或业务规则发生变化;客户提出了新需求,要求修改信息系统产生的数据或产品提供的功能;企业改组或业务缩减,引起项目优先级或软件工程队伍结构变化;预算或进度限制,导致对目标系统的重新定义;发现了在软件开发过程的前期阶段所犯的错误,必须加以改正。


但是,变化也很容易失去控制,如果不能适当地管理和控制变化,必然会造成混乱并产生许多严重的错误。软件配置管理就是在软件的整个生命期内管理和控制变化的一组活动。可以把软件配置管理看做是应用于整个软件过程的软件质量保证活动,是专门用来管理和控制变化的软件质量保证活动。软件配置管理的目标是,使变化更正确且更容易被适应,在必须变化时减少为此而花费的工作量。从上面的叙述可以知道,软件配置管理是十分必要的。


25、 面向对象

面向对象是把一组数据结构和处理他们的方法封装在一起的对象

把具有相同行为的对象归纳为类、

通过封装隐藏类的内部细节、

通过继承使类得到泛化、

通过多态实现继续对象类型的动态分派。


●26、软件工程的重构和设计模式


软件设计模式又称设计模式,是”套被反复使用、多数人知晓的经过分类编目的.代码设计经验总结.使用设计模式是为了重用代码让代码更容易被他人理解。保证代码可靠性、程序重用性 。

重构 就是在不改变软件现有功能的基础上通过调整程度代码改善软件的质量和性能使其程序的设计模式和架构更趋合理提高软件的扩展性和维护性.


☞通俗的说法就是程序的功能和结果没有任何变化,重构只对程序内部结构进行调整,让代码更加容易理解


软件工程导论 张海藩的评论 (共 条)

分享到微博请遵守国家法律