rational统一过程和螺旋模型比较,优势有哪些

软件工程学,是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科,它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。下面是软件工程的现状:

在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。同时,各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,提高人们的工作效率,同时提升了生活质量。

软件工程师是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为系统分析员,软件设计师,系统架构师,程序员,测试员等等。人们也常常用程序员来泛指各种软件工程师。

软件的开发到底是一门科学还是一门工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。

很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。

在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。

软件工程是在遇到软件危机的时候提出来的,其定义是将系统化的、严格约束的、可量化的方法应用到软件的开发、运行和维护,即将工程化应用软件。软件工程研究目标是提高软件的质量和开发效率。目前比较受关注的5种相对并列的软件质量属性分别为:正确性、健壮性、安全性、高效性、易维护性。近年来,随着计算机网络逐步成为主要的软件运行环境,人们在质量的基础上更多的关注可信性。在开发效率这方面,开发人员的素质对项目的成败很重要,若要对实际的开发过程进行量化的话,则比较困难。不同于传统的一些工程项目,软件工程中的部署环节所占的比重较小。在拿到一个软件项目之后,需要对该项目进行总体分析后,选择合适的开发过程模型、开发方法、质量度量方法和具体的开发环境。主要的开发模型包括:瀑布模型、迭代模型、螺旋模型以及第四代模型等。开发方法有:结构化方法、面向数据结构方法、面向对象方法和构件化方法。

作为一门学科,软件工程至今仍然处于快速的成长时期,以下四方面是推动软件向前发展的主要力量:

1、更符合人类思维模式的软件模型。

2、支持高效高质量的软件开发。

3、支持高效能、高可靠、易管理的软件运行。

4、更全面、有指导意义的质量评价。

软件到底还是人类智力的产物,不是一种客观存在,且至今软件形态仍处在不断演化的过程中,其上述的特点使得软件的研究面临着许多和传统学科不同的挑战,包括技术上的挑战、研究方法上的挑战和学科基础的挑战。互联网和通信设备的发展,淡化了地狱对软件开发的影响,使得全球化的软件开发成为了可能。全球化的软件开发,有效的利用了各地区的资源,将软件项目分解并把任务分配给各地区完成,进而提高了软件开发的效率,降低了软件项目的开发成本。但其存在的问题是存在着跨地域之间的协调障碍。具体表现在:有效沟通少、成员状态不透明、开发过程工具等不兼容。目前,全球化的软件开发日益成为软件领

域关注的焦点之一。在网络的协同式开发方面,国内有学者踢出了“群体软件工程”的概念:云计算和网联网的发展衍生了超量的信息系统。群体软件工程的开发原则:使用者即设计者,使用者即开发者,使用者即维护者。自从云计算出现后,大量的软件将运行在集中的服务器上,这样就给软件工程带来了新的发展机遇。在云计算的模式下,可以获取到软件运行状况的信息,可以获取到用户的行为,获取开发人员的行为。随着运行平台和使用模式的发展,新形态的软件也在不断出现。对不同类型的软件,既要探求其共性的方法,又要分别研究各自特点,寻找到适合具体类型软件的方法,总的来说,目前软件工程领域的发展有限,需要进一步的去探索。

学院名称:信息科学与工程学院

软件工程是在遇到软件危机的时候提出来的,其定义是将系统化的、严格约束的、可量化的方法应用到软件的开发、运行和维护,即将工程化应用软件。软件工程研究目标是提高软件的质量和开发效率。目前比较受关注的5种相对并列的软件质量属性分别为:正确性、健壮性、安全性、高效性、易维护性。近年来,随着计算机网络逐步成为主要的软件运行环境,人们在质量的基础上更多的关注可信性。在开发效率这方面,开发人员的素质对项目的成败很重要,若要对实际的开发过程进行量化的话,则比较困难。不同于传统的一些工程项目,软件工程中的部署环节所占的比重较小。在拿到一个软件项目之后,需要对该项目进行总体分析后,选择合适的开发过程模型、开发方法、质量度量方法和具体的开发环境。主要的开发模型包括:瀑布模型、迭代模型、螺旋模型以及第四代模型等。开发方法有:结构化方法、面向数据结构方法、面向对象方法和构件化方法。构件是比对象更大的软件实体。软件度量的作用则是依靠对软件的分析,发现其中的缺陷,予以消除。一般有静态分析和动态分析,之间的区别为是否运行软件。软件工程的进步离不开计算机辅助工具和相应的环境。最近人们对基本的开发方法的关注度有所下降,更多的关注特定的软件开发方法。例如敏捷方法、模型驱动方法、面向服务的方法。敏捷方法顾名思义就是在几周或者几个月的时间内完成相对较小的功能。模型驱动则是在给定的平台上转换模型,尽可能的生成更多的代码。服务的方法强调的是软件实体的外在表现,现在这种方法还没完全成型。对应软件库的复用,需要的则是具体的API的使用规则。软件质量保障的主要方法包括静态缺陷查找、测试、修复、检测等。在动态测试方面,有两个较大影响力的基本动态符号执行的工具:针对基于.NET程序的通用测试工具Pex,以及针对二进制码形式的程序安全测试工具SAGE。20世纪90年代后,提出的一系列自动和半自动恢复软件特征和软件实现代码间的追踪关系的技术,降低了软件维护的负担,主要包含两种技术路线:①以可视化的方式展示实现代码中的多种依赖关系,让维护人员通过浏览这些依赖关系确定追踪关系。②通过实际执行和信息检索等技术获取软件特征和软件实现代码间的初步联系,进一步通过程序分析确定追踪关系。基于数据的软件工程旨在通过对过往软件开发过程各个阶段数据的分析和抽象,获得并积累软件开发知识和规律,为今后的软件开发提供及时有效的信息和辅助开发人员进行决策判断。大型软件公司在这方面有大量的私有数据,这些过往的数据对指导公司的决策具有重要意义,这也是产生基于数据软件工程的重要动力之一,另一方面,开源世界里存在大量的公共历史数据,也为基于数据的软件工程提供了数据基础,进一步的促进了基于数据的软件工程的发展。软件工程在中国的发展,比如南京大学徐家福在80年代到90年代的研究成果有:对需要分析的自动化支持、对系统分析与编程的自动化支持、对元层程序转换的自动化支持。1980年开始,中科院的唐稚松领导的团队提出的全球第一个可执行的时序逻辑语言XYZ/E,可以直接书写其中自动机的状态转换过程。还有北京大学的杨芙清等致力开发大规模的软件工程环境,为中国软件企业提供了系列“青鸟”方法与产品。近几年来,国内对缺陷检测的研究颇为热门,这类工作的目标是自动分析出软件中存在的缺陷,以提高软件质量、降低软件维护的成本。北京大学的梅宏等重点研究了基于缺陷模式的缺陷检测。缺陷模式指明了缺陷代码片段的特征,缺陷检测工具通过将受检程序和缺陷模式进行匹配来发现程序中的缺陷。他们研究了如何自动地获取这些缺陷模式,并进一步研究了如何对缺陷检测工具报告出来的缺陷列表进行排序,以提高程序员排查缺陷的效率。随着软件周期的推移,软件会在不同层次上进行演化,在软件演化过程中,程序会随着其所使用的框架而发生演化。这一方面,北京大学的梅宏等提出了通过分析软件演化历史以抽取当框架发生演化时程序自动调

整的规则。软件的在线演化要求软件在运行过程中进行演化,演化的动作不能影响软件的运行。南京大学的吕健等踢出了一个分布式算法,保证了分布式系统演化过程中版本的一致性。代码的合成也是研究的热门,代码的自动合成可以减少程序员编程的工作量。上海交大的赵建军等踢出了一个方法,这个方法可为使用API编程的程序员自动的推荐出API使用的参数。相比较以上的研究方法,在软件开发过程中,起主导作用的还是程序员。南京大学的荣国平等人在对软件教育的问题上进行了研究,提出两个学生为单位进行学习和完成作业时达到的学习效果要优于单个学生独自学习的效果。作为一门学科,软件工程至今仍然处于快速的成长时期,以下四方面是推动软件向前发展的主要力量:

1、更符合人类思维模式的软件模型。

2、支持高效高质量的软件开发。

3、支持高效能、高可靠、易管理的软件运行。

4、更全面、有指导意义的质量评价。软件到底还是人类智力的产物,不是一种客观存在,且至今软件形态仍处在不断演化的过程中,其上述的特点使得软件的研究面临着许多和传统学科不同的挑战,包括技术上的挑战、研究方法上的挑战和学科基础的挑战。互联网和通信设备的发展,淡化了地狱对软件开发的影响,使得全球化的软件开发成为了可能。全球化的软件开发,有效的利用了各地区的资源,将软件项目分解并把任务分配给各地区完成,进而提高了软件开发的效率,降低了软件项目的开发成本。但其存在的问题是存在着跨地域之间的协调障碍。具体表现在:有效沟通少、成员状态不透明、开发过程工具等不兼容。目前,全球化的软件开发日益成为软件领域关注的焦点之一。在网络的协同式开发方面,国内有学者踢出了“群体软件工程”的概念:云计算和网联网的发展衍生了超量的信息系统。群体软件工程的开发原则:使用者即设计者,使用者即开发者,使用者即维护者。自从云计算出现后,大量的软件将运行在集中的服务器上,这样就给软件工程带来了新的发展机遇。在云计算的模式下,可以获取到软件运行状况的信息,可以获取到用户的行为,获取开发人员的行为。随着运行平台和使用模式的发展,新形态的软件也在不断出现。对不同类型的软件,既要探求其共性的方法,又要分别研究各自特点,寻找到适合具体类型软件的方法,总的来说,目前软件工程领域的发展有限,需要进一步的去探索。

2.2软件开发的基本策略

人们都有自己的世界观和方法论,能自然而然地运用于生活和工作中。同样,程序员脑子里的软件工程观念会无形地支配其怎么去做事情。软件工程三十年的发展,已经积累了相当多的方法,但这些方法不是严密的理论。实践人员不应该教条地套用方法,更重要的是学会“选择合适的方法”和“产生新方法”。有谋略才会有好的战术。几千年前,我们的祖先就在打闹之际写下了很多心得体会,被现代人很好地运用于工业和商业。本节讲述软件开发中的三种基本策略:“复用”、“分而治之”、“优化——折衷”。

复用就是指“利用现成的东西”,文人称之为“拿来主义”。被复用的对象可以是有形的物体,也可以是无形的成果。复用不是人类懒惰的表现而是智慧的表现。因为人类总是在继承了前人的成果,不断加以利用、改进或创新后才会进步。所以当我们欢度国庆时,要搞清楚祖国远不止50岁,我们今天享用到的财富还有上下五千年人民的贡献。进步只是应该的,不进步则就可耻了。

复用的内涵包括了提高质量与生产率两者。由经验可知,在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。一般地可以相信成熟的东西总是比较可靠的(即具有高质量),而大量成熟的工作可以通过复用来快速实现(即具有高生产率)。勤劳并且聪明的人们应该把大部分的时间用在小比例的创新工作上,而把小部分的时间用在大比例的成熟工作中,这样才能把工作做得又快又好。

把复用的思想用于软件开发,称为软件复用。据统计,世上已有1000亿多行程序,无数功能被重写了成千上万次,真是浪费哪。面向对象(Object Oriented)学者的口头禅就是“请不要再发明相同的车轮子了”。

将具有一定集成度并可以重复使用的软件组成单元称为软构件(Software Component)。软件复用可以表述为:构造新的软件系统可以不必每次从零做起,直接使用已有的软构件,即可组装(或加以合理修改)成新的系统。复用方法合理化并简化了软件开发过程,减少了总的开发工作量与维护代价,既降低了软件的成本又提高了生产率。另一方面,由于软构件是经过反复使用验证的,自身具有较高的质量。因此由软构件组成的新系统也具有较高的质量。利用软构件生产应用软件的过程如图1.5所示。

软件复用不仅要使自己拿来方便,还要让别人拿去方便,是“拿来拿去主义”。面向对象方法,Microsoft公司的COM规范 [Rogerson 1999],都能很好地用于实现大规模的软件复用。

分而治之是指把一个复杂的问题分解成若干个简单的问题,然后逐个解决。这种朴素的思想来源于人们生活与工作的经验,完全适合于技术领域。软件人员在执行分而治之的时候,应该着重考虑:复杂问题分解后,每个问题能否用程序实现?所有程序最终能否集成为一个软件系统并有效解决原始的复杂问题?

图1.6表示了软件领域的分而治之策略。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。软件的分而治之不可以“硬分硬治”。不像为了吃一个西瓜或是一只鸡,挥刀斩成n块,再把每块塞进嘴里粉碎搅拌,然后交由胃肠来消化吸收,象征复杂问题的西瓜或是鸡也就此消失了。

2.2.3优化——折衷

软件的优化是指优化软件的各个质量因素,如提高运行速度,提高对内存资源的利用率,使用户界面更加友好,使三维图形的真实感更强等等。想做好优化工作,首先要让开发人员都有正确的认识:优化工作不是可有可无的事情,而是必须要做的事情。当优化工作成为一种责任时,程序员才会不断改进软件中的算法,数据结构和程序组织,从而提高软件质量。

著名的3D游戏软件Quake,能够在PC机上实时地绘制高度真实感的复杂场景。Quake的开发者能把很多成熟的图形技术发挥到极致,例如把Bresenham画线、多边形裁剪、树遍历等算法的速度提高近一个数量级。我第一次看到Quake时不仅感到震动,而且深受打击。这个PC游戏软件的技术水平已经远胜于我所见识到的国内领先的图形学相关科研成果。这对我们日益盛行的点到完止的研发工作真是莫大的讽刺。所以当我们开发的软件表现出很多不可救药的病症时,不要怨机器差。真的是我们自己没有把工作做好,写不好字却嫌笔钝。

就假设我们经过思想教育后,精神抖擞,随时准备为优化工作干上六天七夜。但愿意做并不意味着就能把事情做好。优化工作的复杂之处是很多目标存在千丝万缕的关系,可谓数不清理还乱。当不能够使所有的目标都得到优化时,就需要“折衷”策略。

软件中的折衷策略是指通过协调各个质量因素,实现整体质量的最优。就象党支部副书记扮演和事佬的角色:“…为了使整个组织具有最好的战斗力,我们要重用几个人,照顾一些人,在万不得已的情况下委屈一批人”。

软件折衷的重要原则是不能使某一方损失关键的职能,更不可以象“舍鱼而取熊掌”那样抛弃一方。例如3D动画软件的瓶颈通常是速度,但如果为了提高速度而在程序中取消光照明计算,那么场景就会丧失真实感,3D动画也就不再有意义了(如果人类全是色盲,计算机图形学将变得异常简单)。

人都有惰性,如果允许滥用折衷的话,那么一当碰到困难,人们就会用拆东墙补西墙的方式去折衷,不再下苦功去做有意义的优化。所以我们有必要为折衷制定严正的立场:在保证其它因素不差的前提下,使某些因素变得更好。

下面让我们用“优化——折衷”的策略解决“鱼和熊掌不可得兼”的难题。

问题提出:假设鱼每千克10元,熊掌每千克一万元。有个倔脾气的人只有20元钱,非得要吃上一公斤美妙的“熊掌烧鱼”,怎么办?

解决方案:化9元9角9分钱买999克鱼肉,化10元钱买1克熊掌肉,可做一道“熊掌戏鱼”菜。剩下的那一分钱还可建立奖励基金。

2.3一些不正确的观念

本节例举并分析一些不正确的软件工程观念,可帮助初学者少犯相似的错误。

观念之一:我们拥有一套讲述如何开发软件的书籍,书中充满了标准与示例,可以帮助我们解决软件开发中遇到的任何问题。

客观情况:好的参考书无疑能指导我们的工作。充分利用书籍中的方法、技术和技巧,可以有效地解决软件开发中大量常见的问题。但实践者并不能因此依赖于书籍,这是因为:(1)现实的工作中,由于条件千差万别,即使是相当成熟的软件工程规范,常常也无法套用。(2)软件技术日新月异,没有哪一种软件标准能长盛不衰。祖传秘方在某些领域很吃香,而在软件领域则意味着落后。

观念之二:我们拥有最好的开发工具、最好的计算机,一定能做出优秀的软件。

客观情况:良好的开发环境只是产出成果的必要条件,而不是充分条件。如果拥有好环境的是一群庸人,难保他们不干出南辕北辙的事情。

观念之三:如果我们落后于计划,可以增加更多的程序员来解决。

客观情况:软件开发不同于传统的农业生产,人多不见得力量大。如果给落后于计划的项目增添新手,可能会更加延误项目。因为:(1)新手会产生很多新的错误,使项目混乱。(2)老手向新手解释工作以及交流思想都要花费时间,使实际开发时间更少。所以科学的项目计划很重要,不在乎计划能提前多少,重在恰如其分。如果用“大跃进”的方式奔向共产主义,只会产生倒退的后果。

观念之四:既然需求分析很困难,不管三七二十一先把软件做了再说,反正软件是灵活的,随时可以修改。

客观情况:对需求把握得越准确,软件的修修补补就越少。有些需求在一开始时很难确定,在开发过程中要不断地加以改正。软件修改越早代价越少,修改越晚代价越大,就跟治病一样道理。

2.4一些有争议的观念

本节探讨一些有争议的观念,目的不在于得出“正确”或“错误”的评断,而在于争议会激发更多理性的思考。

争议之一:如果软件运行较慢,是换一台更快的计算机,还是设计一种更快的算法?

作者观点:如果开发软件的目的是为了学习或是研究,那么应该设计一种更快的算法。如果该软件已经用于商业,则需谨慎考虑:若换一台更快的计算机能解决问题,则是最快的解决方案。改进算法虽然可以从根本上提高软件的运行速度,但可能引入错误以及延误进程。技术狂毫无疑问会选择后者,因为他们觉得放弃任何可以优化的机会就等于犯罪。

类似的争议还有:是买现成的程序,还是彻底自己开发?技术人员和商业人士常常会有不同的选择。

争议之二:有最好的软件工程方法,最好的编程语言吗?

作者观点:在软件领域永远没有最好的,只有更好的。能解决问题的都是好方法或是好语言。程序员在最初学习Basic、Fortran、Pascal、C、C++等语言时会感觉一个比一个好,不免有喜新厌旧之举。而如今 的Visual Basic、Delphi、Visual C++、Java等语言各有所长,真的难分优劣。开发人员应该根据客观条件,选择自己熟悉的方法和语言,才能保证合格的质量与生产率。

程序设计是自由与快乐的事情,不要发誓忠于某某主义而自寻烦恼。

争议之三:编程时是否应该多使用技巧?

作者观点:就软件开发而言,技巧的优点在于能另辟蹊径地解决一些问题,缺点是技巧并不为人熟知。若在程序中用太多的技巧,可能会留下隐患,别人也难以理解程序。鉴于一个局部的优点对整个系统而言是微不足道的,而一个错误则可能是致命的。作者建议用自然的方式编程,少用技巧。

《狼三则》的故事告诉我们“失败的技巧通常是技俩”。当我们在编程时无法判断是用了技巧还是用了技俩,那就少用。《卖油翁》的故事又告诉我们“熟能生巧”,表明技巧是自然而然产生的,而不是卖弄出来的。卖油翁的绝技是可到中央电视台表演的,而他老人家却谦虚地说:“没啥没啥,用熟了而已”。

争议之四:软件中的错误是否可按严重程度分等级?

作者观点:在定量分析时,可以将错误分等级,以便于管理。微软的一些开发小组将错误分成四个等级 [Cusumano 1996],如表1.1所示。

一级严重:错误导致软件崩溃。

二级严重:错误导致一个特性不能运行并且没有替代方案。

三级严重:错误导致一个特性不能运行但有替代方案。

四级严重:错误是表面化的或是微小的。

表1.1 错误的四个等级

上述分类是非常技术性的,并不是普适的。假设某个财务软件有两个错误:错误A使该软件死掉,错误B导致工资计算错误。按表1.1分类,错误A属一级严重,错误B属二级严重。但事实上B要比A严重。工资算多了或者算少了,将会使老板或员工遭受经济损失。而错误A只使操作员感到厌烦,并没有造成经济损失。另一个示例是操作手册写错,按表1.1分类则属四级严重,但这种错误可能导致机毁人亡。

开发人员应该意识到:所有的错误都是严重的,不存在微不足道的错误。这样才能少犯错误。

软件工程学科发展到今天,已经有了很多方法和规范,学之不尽。本章只在宏观上讨论了软件工程的一些

思想,更具体的内容将在后面的章节论述。无论是什么好方法,贵在理解与灵活运用,而不可当成灵丹妙药,不象“吃了脑黄金或脑白金,就能使一亿人先聪明起来”。

工作在第一线的软件开发人员是程序员和程序经理,他们决定着软件的命运。良好的程序员队伍和出色的管理是软件项目成功的必要条件。管理不是管制,不是去卡住人家的脖子,因为程序员不是一群野鸭子。管理的目的是让大家一起把工作做好,并且让各人获得各自的快乐和满足。当一个组织被出色地领导时,雇员甚至不知道他们已被领导。在项目完成时,他们会自豪地说:“看看我们通过努力取得的成绩吧”。所以管理者不能老惦记着自己是一个官,而应时刻意识到自己是责任的主要承担者。

我们经常会听到有经理头衔的人在高谈阔论:“编程我不会,做个项目还不easy?派个人去搞系统分析,回头再叫几个程序员把需求译成程序,不就OK了吗?”

不懂英语的人准以为easy和OK是贬义词。要让软件项目失败很容易,只要符合下列条件之一即可:

(1)项目经理对软件一无所知;

(2)技术负责人对编程不感兴趣;

(3)真真编写代码的程序员是临时雇用的。

如果上述三个条件同时具备,就请放心失败好了。

让我们少幻想自己是比尔·盖茨,先当好程序员和程序经理再说。

早期的程序员干活能从软件直通硬件,个个生猛无比。又因他们的作息时间、言行举止与常人不太一样,久而久之就给人们留下了“神秘”、“孤僻”的印象。如今软件行业被炒得热火朝天,有能耐的程序员即便躲在大山岙的军工厂里也能被挖出来。而更多原本不是程序员的人操起几本“速成”、“二十一天通”等书籍也加入了这个行业。现在国内号称有上百万程序员,这支大军鱼龙混杂,已搞不清那些是正规军,那些是民兵游击队了。

1.软件危机的概念 系统的数据要求,功能需求,性能需求,显示出程序的轮廓。

软件危机是指在计算机软件开发、使用与可靠性需求,可用性需求,出错处理需求,混合方式

维护过程中遇到的一系列严重问题和难接口需求,约束,逆向需求以及将来可能优点:综合了以上两种策略的长处 题。提出的需求。9.确认测试

补充: 5.常使用的图形工具 确认测试又称有效性测试。有效性测试是

1.软件危机的表现有哪些? 实体-联系图,数据流图,状态转换图,在模拟的环境下,运用黑盒测试的方法,答:1)对软件开发成本和进度的估计常层次方框图,warnier图,IPO图。验证被测软件是否满足需求规格说明书常很不准确。第五章 列出的需求。任务是验证软件的功能和性

2)用户对已完成的软件不满意1.总体设计的任务 能及其他特性是否与用户的要求一致。对的现象时有发生。划分出组成系统的物理元素——程序、文软件的功能和性能要求在软件需求规格

3)软件产品的质量往往是靠不件、数据库、人工过程和文档等等 说明书中已经明确规定,它包含的信息就住的。设计软件的结构。也就是要确定系统中每是软件确认测试的基础。

4)软件常常是不可维护的。个程序是由哪些模块组成的,以及这些模10.什么是白盒测试,其测试技术有那些,5)软件通常没有适当的文档资块相互间的关系。覆盖标准的强弱程度

料。2.模块化思想 白盒测试是一种测试用例设计方法,盒子

6)软件成本在计算机系统总成就是把程序划分成独立命名且可独立访指的是被测试的软件,白盒指的是盒子是本中所占比例逐年上升。问的模块,每个模块完成一个子功能,把可视的,你清楚盒子内部的东西以及里面

7)软件开发生产率提高的速度这些模块集成起来构成一个整体,可以完是如何运作的。“白盒”法全面了解程序内远跟不上日益增长的软件需求。成指定的功能满足用户的需求。部逻辑结构、对所有逻辑路径进行测试。

2.产生软件危机的原因主要有哪些? 3.衡量模块独立的标准(内聚和耦合的白盒测试的测试方法有代码检查法、静态答:1)用户对软件需求的描述不精确。含义,种类)结构分析法、静态质量度量法、逻辑覆盖

2)软件开发人员对用户需求的内聚:标志着每一个模块内各个元素彼此法、基本路径测试法、域测试、符号测试、理解有偏差。结合的紧密程度,是信息隐藏和局部化概路径覆盖和程序变异。

3)缺乏处理大型软件项目的经念的自然拓展。偶然内聚,逻辑内聚,时种覆盖标准:语句覆盖、判定覆盖、条件验。间内聚,功能内聚,顺序内聚,通信内聚,覆盖、判定/条件覆盖、条件组合覆盖和

4)开发大型软件易产生疏漏和过程内聚。路径覆盖发现错误的能力呈由弱至强的错误。耦合:是对一个软件结构内不同模块之间变化。

5)缺乏有力的方法学的指导和互连程度的度量。数据耦合,控制耦合,11.什么时候黑盒测试,其测试技术有哪有效的开发工具的支持。特征耦合,公共环境耦合,内容耦合。些,(等价划分,边介值分析法)

6)面对日益增长的软件需求,4.启发式规则 黑盒测试也称功能测试,它是通过测试来人们显得力不从心。1.改进软件结构提高模块的独立性检测每个功能是否都能正常使用。

2软件的概念 2.模块规模应该适中等价类划分的办法是把程序的输入域划完成特点功能的程序以及数据结构和文 3.深度、宽度、扇出和扇入都应适当 分成若干部分(子集),然后从每个部分档 4.模块的作用范围应在控制范围之内中选取少数代表性数据作为测试用例

3.软件工程的基本原理 5.力争降低模块接口的复杂程度 边界值分析是通过选择等价类边界的测

1.用分阶段的生命周期计划严格管理 6.设计单入口单出口的模块试用例。边界值分析法不仅重视输入条件

2.坚持进行阶段评审 7.模块功能应该可以预测 边界,而且也必须考虑输出域边界。它是

3.实行严格的产品控制 5.面向数据流的设计方法把信息流映射对等价类划分方法的补充。

4.采用现代程序设计技术 成软件结构 12.软件调试技术有哪些

5.结果应能清楚地审查 信息流:变换流,事物流 蛮干法,蛮干法可能是寻找软件错误原因

6.开发小组的人员应该少而精 映射:变换分析,事物分析 的最低效的方法,仅当所有其他方法都

7.承认不断改进软件工程实践的必要性失败的情况下才使用。

4软件生命周期分成哪几个阶段?各阶第六章 回溯法,回溯法是一种相当常用的调试方段的任务是什么? 1.详细设计的基本任务 法,当调试小程序时很有效。从发现症

1.问题定义: 1.为每个模块确定采用的算法。2.确定状的地方开始,人工沿程序的控制流往回

2.可行性研究:研究问题的范围,探索这每一模块使用的数据结构追踪分析源程序代码,知道找出错误原因个问题是否值得去解决,是否有可行的解3.确定模块接口的细节,包括对系统外为止。

决方法。部的接口和用户界面,对系统内部其 原因排除法,对分查找法、归纳法、演绎

3.需求分析:主要是确定目标系统必须具它模块的接口,以及关于模块输入数据、法都属于原因排除法。

备哪些功能 输出数据及局部数据的全部细节。13.软件可靠性(可靠性和可用性的含义)

4.总体设计: 4.为每一模块设计出一组测试用例。

5.详细设计:就是把解法具体化,设计出2.程序的三种基本结构

程序的详细规格说明。顺序结构,选择结构,循环结构

6.编码和单元测试:写出正确的容易理解3.详细设计的工具

容易维护的程序模块。1.图形工具

7.综合测试:通过各种类型的测试使软件2.表格工具

达到预定的要求 3.语言工具

8.软件维护:通过各种必要的维护活动使4.jackson方法

系统持久地满足用户的需要。(改正性维5.复杂性度量的方法

护,适应性维护,完善性维护,预防性维Halstead方法:它根据程序中运算符和

护)操作数的总数来度量程序的复杂程度

5.瀑布模型,快速原型模型,增量模型,McCabe方法 :McCabe方法根据程序控制

螺旋模型的特点 流的复杂程度定量度量程序的复杂程度,瀑布模型阶:段时间具有顺序性和依赖第七章

性。推迟现实的观点。质量保证的观点。1.选择程序设计语言应考虑哪些因素

快速原型模型:软件产品的开发基本上是1.系统用户的要求

线性顺序进行的,本质是“快速”加速软2.可以使用的编译程序

件的开发过程,节约软件开发成本。3.可以得到的软件工具

增量模型:能在较短时间内向用户提交可4.工程规模

完成部分工作的产品。逐步增加产品功5.程序员的知识

能,可以使用户有较充裕的时间学习和适6.软件可移植性要求

应新产品,从而减少一个全新的软件可能7.软件的应用领域

给客户组织带来的冲击。2.良好的编程风格包括哪些方面

螺旋模型:对可选方案和约束条件的强调1.程序内部的文档2.数据说明 3.语句构

有利于已有软件的重用,也有助于把软件造4.输入输出 5.效率

质量作为软件开发的一个重要目标。减少3软件测试的目标

了过多的测试或测试不足带来的风险。更目的:(1)测试是为了发现程序中的错误

重要的是在螺旋模型中维护只是模型的而执行程序的过程;

另一个周期,在维护和开发之间并没有本(2)好的测试方案是极可能发现迄今为

质区别。风险驱动的。止尚未发现的错误的测试方案;

(3)成功的测试是发现了至今为止尚未

第二章 发现的错误的测试。

1.可行性研究的目的 定义:为了发现程序中的错误而执行程序

就是用最小的代价在尽可能短的时间内的过程。

确定问题是否能够解决。补充:

补充: 软件测试步骤 :

可行性研究的步骤 :(1)模块测试(2)子系统测试(3)系统

1.复查系统规模和目标。测试(4)验收测试(5)平行运行

2.研究现有的系统。4.确定测试计划是在哪个阶段制定的3.导出新系统高层逻辑模型。5.黑盒测试和白盒测试的概念

4.进一步定义问题黑盒测试

5.导出和评价供选择的解法。1把程序看作一个黑盒子,完全不考虑程

6.推荐行动方针序的内部结构和处理过程

7.草拟开发计划2对程序接口进行测试,检查程序功能是

8.书写文档提交审查 否能按规格说明书的规定正常使用;

程序是否能适当地接受输入数据并产生

2.系统流程图的作用 正确的输出信息;

系统流程图是描绘物理系统的传统工具,程序运行过程中能否保持外部信息的完

它用图形符号来表示系统中的各个部件。整性

它表达了系统中各个元素之间的信息流白盒测试

动的情况。1把程序堪称装在一个透明的白盒子里,3.数据流图的概念 测试者完全知道程序的结构处理算法

数据流图是一种图形化技术,它描绘信息2按照程序内部的逻辑测试程序,检测程

流和数据从移动到输出的过程中所经受序中的主要执行通路是否都能按的变换。预定要求正确工作

4.数据流图里面的符号,画数据流图。6.测试的步骤及每个步骤形成的文档

5.数据字典最基本的功能,以及与数据流单元测试:(模块测试)发现的往往是编

图的关系。码和详细设计的错误

最基本的功能:在软件分析和设计的过程集成测试:着重测试模块的接口 中给人提供关于数据的描述信息。

关系:数据流图和数据字典共同构成系统系统测试:发现的往往是软件设计中的错的逻辑模型,没有数据字典,数据流图就误,也可能发现需要说明中的错误 不严格,然而没有数据流图,数据字典也验收测试:(确认测试)往往发现需求说难于发挥作用。只有数据流图和对数据流明书中的错误 图中每个元素的精确定义放在一起,才能7.渐增式和非渐增式的区别 共同构成系统的规格说明。“非渐增式”,即先独立地测试每一模块,第三章 然后将所有这些模块连接到一起运行; 1.需求分析属于哪一个阶段,任务是什“渐增式”,即在已测试过的N个模块的么。基础上再增加一个模块,再对N十1个模需求分析是软件定义时期的最后一个阶块进行测试。段.渐增式比非渐增式优越,因为用渐增式,1.确定对系统的综合要求(功能需求,性如果是“由顶向下”则可利用前面已测试能需求,可靠性和可用性需求,出错处理过的模块,而不必另外准备驱动模块,如需求,接口需求,约束,逆向需求,将来果是“由底向上”,也可利用已测试过的可能提出的要求)模块,不必再准备桩模块。渐增式可以较2.分析系统的数据要求早地发现模块界面之间的错误,有利于排3.导出系统的逻辑模型 错,检查比较彻底 4.修正系统开发计划2.需求分析的产品是什么 8.自顶向下,自下而上,以及混合策略的3.面向过程的分析方法主要是建立三类优缺点 模型 自顶向下数据模型(按照用户的观点对数据建立的优点:能较早显示整个程序的轮廓,向用模型,把用户的数据要求清楚,准确地描户展示程序的概貌,取得用户的理解与支述出来。描述了从用户角度看到的数据,持。缺点:当测试上层模块时因使用桩它反应了用户的现实环境,属性,联系),模块较多,很难模拟出真实模块的全部功功能模型,行为模型(通过描绘系统的状能,使部分测试内容被迫推迟,只能等待态及引起系统状态转换的事件来表示系换上真实模块后再补充测试。统的行为)由底向上4.软件需求规格说明书的内容 优点:测试从下层模块开始,测试设计用通常用自然语言完整,准确,具体地描述例比较容易。缺点:在测试的早期不能

1.谈谈你对软件工具的理解,你用过什么软件工具

软件工具是指为支持计算机软件的开发、维护、模拟、移植或管理而研制的程序系统。它是为专门目的而开发的,在软件工程范围内也就是为实现软件生存期中的各种处理活动(包括管理、开发和维护)的自动化和半自动化面开发的程序系统。

开发软件工具的最终目的是为了提高软件生产率和改善软件的质量。

软件工具分为六类:模拟工具、开发工具、测试和评估工具、运行和维护工具、性能质量工具和程序设计支持工具。

应该是看对象来选择测试工具!比如:

内存泄漏测试工具:Purify

单元测试工具:Junit

2.什么是软件的可维护性:

软件可维护性即维护人员对该软件进行维护的难易程度,具体包括理解、改正、改动和改进该软件的难易程度。

3.软件开发和写程序有什么不同?软件开发的内容是:需求、设计、编程和 测试 维护!

软件需求分析就是回答做什么的问题。它是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言(形式功能规约,即需求规格说明书)表达出来的过程。本阶段的基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可。需求分析的主要方法有结构化分析方法、数据流程图和数据字典等方法。本阶段的工作是根据需求说明书的要求,设计建立相应的软件系统的体系结构,并将整个系统分解成若干个子系统或模块,定义子系统或模块间的接口关系,对各子系统进行具体设计定义,编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书,组装测试计划。

软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块是指能实现某个功能的数据和程序说明、可执行程序的程序单元。可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。模块,然后进行模块设计。概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。

软件编码是指把软件设计转换成计算机可以接受的程序,即写成以某一程序设计语言表示的“源程序清单”。充分了解软件开发语言、工具的特性和编程风格,有助于开发工具的选择以及保证软件产品的开发质量。

软件测试的目的是以较小的代价发现尽可能多的错误。不同的测试方法有不同的测试用例设计方法。两种常用的测试方法是白盒法测试对象是源程序,依据的是程序内部的的逻辑结构来发现软件的编程错误、结构错误和数据错误。结构错误包括逻辑、数据流、初始化等错误。用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果。白盒法和黑盒法依据的是软件的功能或软件行为描述,发现软件的接口、功能和结构错误。其中接口错误包括内部/外部接口、资源管理、集成化以及系统错误。黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。黑盒法。

维护是旨在已完成对软件的研制(分析、设计、编码和测试)工作并交付使用以后,对软件产品所进行的一些软件工程的活动。即根据软件运行的情况,对软件进行适当修改,以适应新的要求,以及纠正运行中发现的错误。编写软件问题报告、软件修改报告。

4.什么是软件设计的”高内聚 低耦合”

内聚:一个模块内各个元素彼此结合的紧密程度

耦合:一个软件结构内不同模块之间互连程度的度量

对于低耦合,(模块的独立性)

一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合.对于高内聚:

在一个模块内,让每个元素之间都尽可能的紧密相连。也就是充分利用每一个元素的功能,各施所能,以最终实现某个功能。

5.case在软件工程中的作用

Engineering计算机辅助软件工程。CASE的一个基本思想就是提供一组能够自动覆盖软件开发生命周期各个阶段的集成的、减少劳动力的工具。CASE已被证明可以加快开发速度,提高应用软件生产率并保证应用软件的可靠品质。CASE工具由许多部分组成,一般我们按软件开发的不同阶段分为上层CASE和下层CASE产品。上层或前端CASE工具自动进行应用的计划、设计和分析,帮助用户定义需求,产生需求说明,并可完成与应用开发相关的所有计划工作。下层或后端CASE工具自动进行应用系统的编程、测试和维护工作。

除非下层CASE和上层CASE工具的供应商提供统一界面,否则用户必须编写或重新将所有信息从上层CASE工具转换到下层CASE工具。独立的CASE工具供应商愈来愈希望将它们的工具连接在一起建立统一的界面以减少用户不必要的开发工作。

CASE工具带来的好处

计算机专业人员利用计算机使他们的企业提高了效率,企业的各个部门通过使用计算机

提高了生产率和效率,增强了企业的竞争力并使之带来了更多的利润。

6.为什么要进行软件测试?常用的软件测试的方法有哪些?

软件测试的目的:尽可能发现并改正被测试软件中的错误,提高软件的可靠性。

软件测试方法主要包括单元测试,集成测试,系统测试,用户测试,回归测试。

还有就是自定而下,和自下而上的方法。

7.谈谈你对保证软件质量的技术和方法的认识? 1.作为一个软件质量保证人员需要良好的沟通能力,因为如果没有良好的沟通能力,很多问题都没有办法解决,原因很简单,测试人员发现了bug,开发人员或项目经理在怎么不理,但是他们都会想到,万一测试人员发现了bug而自己忽视了,那么就有可能成为软件里的一颗不定时地炸弹,那么作为一个开发人员或项目经理对bug的重视程度肯定相对比较高,至少要看测试人员发现的bug,但是QA就不一定了,因为QA保证的流程的正确的执行,相关人员就是认为流程不重要,只要我开发的产品没有问题那就没有问题,客户肯定不会关注我的流程,在加上古人的名言“结果说明了一切”,所以没有良好的沟通能力,一些问题将很难去解决,做起来就没有成就感。

2.个人感觉比沟通能力更重要的是,坚持原则,在遇到困难的时候,是不是还能坚持原则,在遇到项目组的种种不理不睬的时候,是不是还能坚持原则,在项目组不按照计划走的时候,是不是还能坚持原则。

3.个人心态,我工作三年的经历告诉我,如果开发和测试相比,开发是天堂,测试是地狱的话,但如果测试和QA相比的话,那测试就是天堂,QA就是地狱,所以心态很重要,在三年里我就锻炼成一个非常好的心态,随便怎么说CMMI没用,随便怎么说CMMI就是写文档,随便怎么说QA真烦人,我笑容依然灿烂,从容面对,而且一个QA要有坚定的信念,如果你都不相信过程能给项目开发带来好处,那你还指望谁能相信。

8.提高软件生产率有哪些手段?

1.挑选精干人员(管理 计划不好 技术搭配不当)

2.提高阶段效率 3消除人工阶段

4.减少重复劳动 5.建造简单产品

6.重用软部件库(已经存在的软件功能部件

9.什么是软件的可靠性和有用性

可靠性就是指软件运行的稳定性,可用性就是操作的便利性。比如一辆汽车,可靠性好应该归功于机械部分,可用性好则是内饰和中控系统的功劳。

10什么是软件规格说明?作用是什么?将其形式化的意义是什么?

11.什么是软件重用?实现软件重用的方法有哪些?

软件重用,是指在两次或多次不同的软件开发过程中重复使用相同或相似软件元素的过程。软件元素包括程序代码、测试用例、设计文档、设计过程、需要分析文档甚至领域知识。通常,可重用的元素也称作软构件,可重用的软构件越大,重用的粒度越大。

根据软件开发的不同阶段实现软件重用主要有四个途径:

抽象:对重用对象概括提炼,从而得到能全面描述侧重算法和数据结构的软件构件的各部分的描述。

选择:是对重用对象进行存放,匹配和检索的功能。

实例化:对数据类型中对象进行参数的提供 转换。

12.什么是软件移植?你认为构造一个工具实现windows到Unix的移植有意义吗?难大不? 软件可移植性是指代码可以在不同平台间移植,我们一般说的软件的可移植性指的是软件可移植性,简单的说就是指源代码移到不同的平台下(不同的操作系统,例如从Windows

下移到Linux下)时,需要修改的内容越少,移植性越好。要保证软件可移植性,就是少用或不用系统特有的东西,比如你用C语言编程,你可以使用C语言本身的库,但不要用

WindowsAPI函数,因为WindowsAPI函数在Linux下是没有的,如果想移植到Linux平台下,使用WindowsAPI函数的部分代码就要做出修改了。

我要回帖

更多关于 螺旋模型的优缺点和适用范围 的文章

 

随机推荐