精华内容
下载资源
问答
  • 软件工程导论--软件工程概述

    万次阅读 多人点赞 2019-09-26 17:41:23
    1 软件软件危机 1.1 软件的特性 软件是一种逻辑实体,而非具体的物理...  软件产品一般分为两类:通用软件产品(如数据库软件、文字处理软件、绘图软件工程管理工具…)和定制软件产品(如电子设备的控制软...

    1 软件与软件危机

    1.1 软件的特性

    • 软件是一种逻辑实体,而非具体的物理实体;
    • 软件产品的生产主要是研制
    • 软件具有“复杂性”,其开发和运行常受到计算机系统的限制;
    • 软件成本昂贵,其开发方式目前未完全摆脱手工生产方式;
    • 软件不存在磨损和老化问题,但是存在退化问题

      软件产品一般分为两类:通用软件产品(如数据库软件、文字处理软件、绘图软件、工程管理工具…)和定制软件产品(如电子设备的控制软件、特定的业务处理系统、空中交通管制系统…)。

    1.2 软件的发展

    • 程序设计时代:1946~1956年,生产方式为个体手工劳动,使用机器语言和汇编语言,程序难读难修改,可靠性差;
    • 程序系统时代:1956~1968年,生产方式为作坊式的小集团合作生产,使用高级语言,提出了结构化方法,该阶段产生软件危机。
    • 软件工程时代:1968年至今,生产方式为工程化的生产,使用数据库、开发工具、分布式、面向对象技术等来开发软件,开发技术有很大进步,但没有突破性进展,软件价格不断上升,没有完全摆脱软件危机。

    1.3 软件危机
      随着计算机应用的日益普及,软件数量急剧增长,软件产品质量低下,可维护性差,这些问题不断堆积形成日益尖锐的矛盾,这种现象即为软件危机。
      为此,NATO(北约组织)于1967年提出“软件工程”概念,次年于计算机科学国际会议上得到签署,软件工程学由此产生。

    1.软件危机的主要表现

    • 对软件开发成本和进度的估计常常很不准确;
    • 用户对“已完成的”软件系统不满意的现象经常发生;
    • 软件产品的质量往往靠不住;
    • 软件常常是不可维护的;
    • 软件通常没有对应的文档资料;
    • 软件成本在计算机系统总成本中所占的比例逐年上升;
    • 软件开发生产率提高的速度远远跟不上计算机应用迅速普及及深入的趋势。

    2.产生软件危机的原因

    • 软件是计算机的逻辑部件而不是物理部件。软件问题是在开发时期引入的而在测试阶段没能测出来的故障,修改软件故障要修改软件原来的设计。
    • 软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,软件开发工作量随软件规模增大非线性增长。
    • 与早期软件开发个体化特点有关:认为软件开发就是写程序并设法使之运行,轻视需求分析和软件维护。也就是说是和软件开发和维护有关的许多错误认识和作法的形成,可以归因于在计算机系统发展的早期阶段软件开发的个体化特点。
    • 缺乏正确的理论指导。缺乏有力的方法学和工具方面的支持。由于软件开发不同于大多数其他工业产品,其开发过程是复杂的逻辑思维过程,其产品极大程度地依赖于开发人员高度的智力投入。由于过分地依靠程序设计人员在软件开发过程中的技巧和创造性,加剧软件开发产品的个性化,也是发生软件开发危机的一个重要原因。

    3.缓解软件危机的途径

    • 方法:推广使用在实践中总结出来的开发软件的成功的技术和方法;
    • 工具:开发和使用好的软件工具;
    • 组织管理:组织良好、管理严密、各类人员协同配合。

    2 软件工程

    2.1 软件工程的概念

      软件工程是一类工程,是将理论与知识应用于实践的科学,它借鉴了传统工程的原则与方法以求高效的开发高质量的软件。

    2.2 软件工程框架

      软件工程的框架可概括为:目标、过程、原则。

    • 目标:生产具有正确性、可用性以及开销合宜的产品;
    • 过程:生产一个最终可以满足需求且达到工程目标的软件产品所需要的步骤,包括开发过程、运作i过程、维护过程;
    • 原则:选取适宜的开发范型、采用合适的设计方法、提供高质量的工程支持、重视开发过程的管理。

    2.3 软件生命周期

      软件生命周期(Software Life Cycle,SLC)是指软件产生直到报废的生命周期,包括可行性分析和项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。

    • 可行性分析和项目开发计划:该阶段回答的问题是要解决什么问题?需要多少费用?需要多长时间?
    • 需求分析:确定软件系统必须具备的功能;
    • 概要设计:开发人员把确定的个项功能需求转换成需要的体系结构,即设计软件的结构;
    • 详细设计:为每个模块的功能进行具体描述,即模块的控制结构是怎样的;
    • 编码:把每个模块的控制结构转换成程序代码;
    • 测试:保证软件质量的重要手段,设计测试用例以检验软件的组成;
    • 维护:已交付的软件投入正式使用后,为了改正软件运行错误,或者为了满足用户新的需求而加入新功能的修改软件的过程。

    3 软件过程模型

    3.1 瀑布模型
      该模型规定了各项关键的软件工程活动,自上而下,如同瀑布一样固定次序。

    1.特点
      瀑布模型是以文档形式驱动的,是一种整体开发模型,逆转性很差或着说不可逆转。

    2.适用条件

    • 开发期间需求没有或者很少变化;
    • 分析设计人员对应用领域很熟悉;
    • 低风险项目;
    • 用户使用环境很稳定;
    • 用户提出需求以外,很少参与开发工作。

    3.优点

    • 每个阶段的任务与目标很明确;
    • 可为每个阶段指定开发计划,进行成本预算,组织开发力量了;
    • 通过阶段评审,将开发过程纳入正确轨道;
    • 严格的计划性保证软件产品按时交付。

    4.缺点

    • 缺乏灵活性,无法适应用户需求的改变;
    • 开始阶段的小错误被逐渐放大,可能导致软件产品报废;
    • 返回上一级的开发需要十分高昂的代价;
    • 随着软件规模和复杂性的增加,软件成品成功的概率大幅下降。

    3.2 快速原型模型

      借助软件开发工具或环境尽快的构造一个实际系统的简化模型。

    1.特点

    • 利用原型法技术能够快速实现系统的初步模型,以便准确的获取用户的需求;
    • 采用逐步求精方法使原型逐步完善。

    2.适用条件

    • 不能预先确切定义需求的软件开发;
    • 项目组成员不能很好协同配合,相互交流或通信上存在困难;
    • 已有产品或产品的原型,只需客户化的工程项目;
    • 项目所在领域是那些简单而熟悉的行业;
    • 要求进行产品移植或升级的软件项目。

    3.优点

    • 开发者与用户充分交流,可以澄清模糊需求;
    • 开发过程与用户培训过程同步;
    • 为用户需求的改变提供了充分的余地;
    • 开发风险低,产品柔性好;
    • 开发费用低,时间短;
    • 系统易维护,对用户友好。

    4.缺点

    • 开发者在不熟悉的领域中不易分清主次,原型不切题;
    • 限制了开发人员的创新;

    3.3 增量模型

      也称为渐增模型,是遵循递增方式来进行软件开发的。在该模型中,软件产品被作为一组增量构件(模块),其中第一个增量构件往往实现软件的基本需求,提供最核心的功能。

    1.特点

    • 任务或功能模块驱动,可以分阶段提交产品;
    • 开发过程中有多个任务单,多个任务单的集合构成项目的《需求规格说明书》。

    2.适用条件

    • 客户能够接收分阶段交付;
    • 项目为中等或高风险项目;
    • 用户可参与到整个软件开发过程中;
    • 开发需要使用面向对象语言或第四代语言;
    • 软件开发组织拥有较好的类库,构件库。

    3.优点

    • 短时间内向用户交付可完成部分工作的产品;
    • 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品;
    • 项目总体性失败的风险比较低。

    4.缺点

    • 分析设计人员若对应用领域不熟悉,难以一步到位;
    • 软件系统的组装和拆卸行不强。

    3.4 螺旋模型

      该模型综合了瀑布模型和快速原型模型的优点,还增加了两者都忽视的风险分析,把开发活动和风险管理结合起来,将风险减到最小并控制风险。

    1.特点

    • 每一圈是一个阶段;
    • 每一个阶段又有一个活动;
    • 降低了开发的风险。

    2.适用

    • 内部开发的大规模软件项目。

    3.优点:风险驱动
    4.缺点:只能用于大型内部软件产品,开发者必须精通风险分析和风险排除。

    展开全文
  • 软件工程导论—软件与软件工程

    千次阅读 多人点赞 2020-05-02 12:47:35
    文章目录1. 软件与软件危机1.1.... 软件工程学2.1. 软件工程学的概念2.2. 软件工程项目的基本目标2.3. 软件工程的八项原则2.4. 软件工程的本质特征2.5. 软件工程的七条基本原理3. 软件工程方法学3.1. 软件工程方法...

    1. 软件与软件危机

    1.1. 软件的概念和特点

    软件是计算机系统中与硬件相互依存的另一部分,它是包括程序数据及其相关文档的完整集合。

    其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料。

    与之相似的是,在1983年IEEE组织对软件下的定义是:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必需的数据

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

    软件有以下七个特点:

    1. 软件是一种逻辑实体,而不是具体的物理实体,因而它具有抽象性;
    2. 软件的生产与硬件不同,它没有明显的制造过程;
    3. 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。但就目前的软件工程环境应用而言,在不更新升级的情况下软件的平均寿命大约为5年,如果一个软件5年内没有任何更新,那么它将面临淘汰;
    4. 软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖性;
    5. 软件的开发至今尚未完全摆脱手工艺的开发方式;
    6. 软件本身是复杂的,这种复杂性可能来自它所反映的实际问题的复杂性,例如相当多的软件工作涉及到社会因素,复杂性也可能来自程序逻辑结构的复杂性;
    7. 软件成本相当昂贵
      在这里插入图片描述

    1.2. 软件规模的分类与发展阶段

    软件的分类并没有一个绝对的标准,但一般情况下都会用软件规模来对软件进行分类,如下表:

    类别 参加人员数 研制期限 产品规模(源程序行数)
    微型 1 1~4周 0.5K
    小型 1 1~6月 1K~2K
    中型 2~5 1~ 2年 5K~50K
    大型 5~20 2~3年 50K~ 100K
    甚大型 100~1000 4~5年 1M
    极大型 2000~5000 5~10年 1M~10M

    软件发展的四个时期及其特点

    1. 程序设计的原始时期(1950~1950年代末),这时既没有汇编语言也没有高级语言,程序员只能用机器指令编写程序;
    2. 基本软件期(1950年代末~1960年代末),出现了汇编语言,并逐渐普及。随着高级语言的发展,编译技术也有较大的发展;
    3. 程序设计方法时代(1960 年代末~1970年代中期) 。 这一时期,与硬件费用下降相反,软件开发费急剧上升。于是人们提出了结构式程序设计和模块化程序设计等程序设计方法,设法降低软件的开发费用;
    4. 软件工程时期(1970年代中期~现在)。软件开发技术不再仅仅是程序设计技术,而是包括了与软件开发的各个阶段,如需求分析、设计、编码、单元测试、综合测试、使用和维护及其整体有关的各种管理技术。
    特点\时期 基本软件期 程序设计方法时代 软件工程时期
    软件所指 程序 程序及说明书 程序、文档、数据
    主要程序设计语言 汇编及机器语言 高级语言 软件语言
    软件工作范围 程序编写 设计、编码和测试 软件周期
    软件使用者 程序设计者本人 少数用户 市场用户
    软件开发组织 个人 开发小组 开发小组及大中型软件开发机构
    软件规模 小型 中小型 大中小型
    决定质量的因素 个人编程技术 小组技术水平 技术水平及管理水平
    开发技术和手段 子程序和程序库 结构化程序设计 数据库,开发工具,开发环境,
    工程化开发方法,标准和规范,
    网络及分布式开发面向对象技术及软件复用
    维护责任者 程序设计者 开发小组 专职维护人员
    硬件特征 价格高、存储容量小、工作可靠性差 速度、容量及工作可靠性有明显提高 向超高速,大容量,微型化及网络化方向发展
    软件特征 完全不受重视 软件技术的发展不能清足需要,出现软件危机 开发技术有进步,但未获突破性进展,价格高未完全摆脱软件危机

    1.3. 软件危机

    1968年在西德Garmish召开的国际软件工程会议上正式提出软件危机的概念:计算机软件的开发和维护过程所遇到的一系列严重问题。

    1.3.1. 软件危机的表现

    软件危机一般表现在以下五个大方面:

    1. 对软件开发成本和进度的估算很不准确。 实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。软件开发人员常常在对用户要求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就匆忙着手编写程序;另外软件成本在计算机系统总成本中所占的比例逐年上升。由于微电子学技术的进步和生产自动化程度不断提高,硬件成本逐年下降,然而软件开发需要大量人力,软件成本随着通货膨胀以及软件规模和数量的不断扩大而持续土升。美国在1985年软件成本大约已占计算机系统总成本的90%。
    2. 软件产品不符合用户的实际需要。 通常情况下用户也不知道自己想要什么,导致开发时常常出现产品与预期不匹配的现象,实际上当前的软件技术已经十分发达,搞明白了需求基本上都能通过技术实现,如下图是软件技术与需求之前的增长关系:
      在这里插入图片描述
    3. 软件产品质量不可靠。 软件可靠性和质量保证的确切的定量概念刚刚出现不久,软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中,这些都导致软件产品发生质量问题;计算机软件不仅仅是程序,还应该有三整套文档资料。这些文档资料应该是在软件开发过程中产生出来的,而且应该是"最新式的"(即和程序代码完全一致的)。软件开发组织的管理人员可以使用这些文档资料作为“里程碑”,来管理和评价软件开发工程的进展状况:软件开发人员可以利用它们作为通信工具,在软件开发过程中准确地交流信息;对于软件维护人员而言,这些文档:资料更是必不可少的。
    4. 缺少软件文档,大型软件系统经常失败。 缺乏方法指导和工具支持导致很多程序中的错误是非常难改正的,甚至一旦换了一个新的硬件环境就不能正常运行,也不能根据用户的需要在原有程序中增加一些新的功能。"可重用的软件"还是一个没有完全做到的、正在努力追求的目标,人们仍然在重复开发类似的或基本类似的软件
    5. 软件开发效率不高,与计算机应用的迅速发展不匹配。 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。软件产品"供不应求"的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。
    1.3.2. 软件危机产生的原因

    客观原因:软件本身特点,例如逻辑部件复杂、规模庞大等等。

    在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件,在运行过程中不会因为使用时间过长而被"用坏",如果运行中发现了错误很可能是遇到了一个在开发时期引入的,在测试阶段没能检测出来的错误。

    软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。

    主观原因:程序员不正确的开发方法,忽视需求分析,并且错误地认为软件开发等于程序编写,轻视软件维护。

    主观上的错误认识和作法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。目前相当多的软件专业人员对软件开发和维护还有不少其他的糊涂观念,在实践过程中或多或少地采用了错误的方法和技术,这可能是使软件问题发展成软件危机的主要原因。

    对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。另一方面还必须认识到程序只是完整的软件产品的一个组成部分,一个软件产品必须由一个完整的配置组成,主要包括程序、文档和数据等成分,他们缺一不可。

    软件问题要尽早解决
    作好软件定义时期的工作,是降低软件,成本提高软件质量的关键。在实际的软件开发中,在软件开发的不同阶段进行修改需要付出的代价是很不相同的,大约如下图所示,它表示了错误发现的越晚,付出的代价越高。
    在这里插入图片描述
    因此可以说,轻视维护是一个巨大的错误。统计数据表明,实际上用于软件维护的费用占软件总费用的55%~70%。软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。

    软件危机案例:
    IBMOS/360操作系统被认为是一个典型的案例,到现在为止,它仍然被使用在360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。

    IBM公司开发OS/360系统,共有4000多个模块,约100万条指令,投入5000人年,耗资数亿美元,结果还是延期交付,在交付使用后的系统中仍发现大量(2000个以上)的错误,造成无法估计的安全隐患。

    1.3.3. 软件危机如何解决

    实际上就目前的手段而言,软件工程只能解决主观上造成软件危机的原因,对于软件本身特点,例如逻辑部件复杂、规模庞大等客观原因,软件工程是无能为力的。

    主观危机的解决途径主要有两条:1、组织管理。2、技术措施

    组织管理可以采用工程项目管理方法;

    技术措施上提升软件开发技术与方法,灵活运用软件工具。应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。并且应该开发和使用更好的软件工具,在软件开发的每个阶段都有许多繁琐重复的工作需要做,在适当的软件工具辅助下,开发人员可以把这类工作做得既快又好。

    为了消除软件危机,首先应该对计算机软件有一个正确的认识,首当其冲的就是彻底消除"软件就是程序"的错误 观念,要明确一个软件必须由一个完整的配置组成,是程序、数据及相关文档的完整集合。

    2. 软件工程学

    2.1. 软件工程学的概念

    软件工程学是在1968年,北约计算机科学会议上由Fritz Bauer提出的,他给出的软件工程学的定义为:用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。其中包含了三个要素:方法、工具、过程

    软件工程学的中心思想是把软件当作一种工业产品,要求采用工程化的原理与方法对软件进行计划、开发和维护。因此可以说,软件工程学是一门指导计算机软件开发和维护的工程学科,它包含了开发技术和工程管理两方面。

    2.2. 软件工程项目的基本目标

    软件工程的目的是为了实现按预期的进度和经费完成软件生产计划,提高软件的生产率和可靠性。

    具体来说就是要达到以下几个主要的目标:

    1. 付出较低的开发成本;
    2. 达到要求的软件功能;
    3. 取得较好的软件性能;
    4. 开发的软件易于移植;
    5. 需要较低的维护费用;
    6. 能按时完成开发工作,及时交付使用。

    但是软件工程的各个目标是不可能全部满足的,下图表示了软件工程目标之间的关系,可见,软件工程的最终目标只能是实现一个均衡的系统。
    在这里插入图片描述

    2.3. 软件工程的八项原则

    1. 抽象
      抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象,自顶向下、逐层分解的办法控制软件开发过程的复杂性。例如,软件瀑布模型、结构化分析方法、结构化设计方法,以及面向对象建模技术等都体现了抽象的原则。
    2. 封装(信息隐蔽)
      将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。这就是信息封装,使用与实现分离的原则。使用者只能通过模块接口访问模块中封装的数据。
    3. 模块化
      模块是程序中逻辑上相对独立的成分,是独立的编程单位,应有良好的接口定义。如C语言程序中的函数过程,C++语言程序中的类。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统。
    4. 局部化
      要求在一个物理模块内集中逻辑上相互关联的计算机资源,保证模块之间具有松散的耦合,模块内部具有较强的内聚。这有助于加强模块的独立性,控制解的复杂性。
    5. 确定性
      软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。这有助于人们之间在交流时不会产生误解、
      遗漏,保证整个开发工作协调致。
    6. 一致性
      整个软件系统(包括程序、文档和数据)的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致。
    7. 完备性
      软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审。
    8. 可验证性
      开发大型的软件系统需要对系统自顶向下逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性。

    2.4. 软件工程的本质特征

    软件工程关注于大型程序的构造
    "大"与"小"的分界线并不十分清晰。通常把一个人在较短时间内写出的程序称为小型程序,而把多人合作用时半年以上才写出的程序称为大型程序。

    软件工程的中心课题是控制复杂性
    软件所解决的问题十分复杂,通常不得不把问题分解,使得分解出的每个部分是可理解的,而且各部分之间保持简单的通信关系。用这种方法并不能降低问题的整体复杂性,但是却可使它变成可以管理的。

    软件经常变化
    绝大多数软件都模拟了现实世界的某一部分。现实世界在不断变化,软件为了不被很快淘汰,必须随着所模拟的现实世界一起变化。因此,在软件系统交付使用后仍然需要耗费成本,而且在开发过程中必须考虑软件将来可能的变化。

    开发软件的效率非常重要
    目前,社会对新应用系统的需求超过了人力资源所能提供的限度,软件供不应求的现象日益严重。因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的方法和工具。

    和谐地合作是开发软件的关键
    软件处理的问题十分庞大,必须多人协同工作才能解决这类问题。为了有效地合作,必须明确地规定每个人的责任和相互通信的方法。纪律是成功地完成软件开发项目的一个关键。

    软件必须有效地支持它的用户
    开发软件的目的是支持用户的工作。软件提供的功能应该能有效地协助用户完成他们的工作。

    有效地支持用户意味着必须仔细地研究用户,以确定适当的功能需求、可用性要求及其他质量要求(例如,可靠
    性、响应时间等)。有效地支持用户还意味着,软件开发不仅应该提交软件产品,而且应该写出用户手册和培训材料。

    在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人
    软件工程师是诸如Java程序设计、软件体系结构、测试或统一建模语言(UML)等方面的专家,他们通常并不是图书馆管理、航空控制或银行事务等领域的专家,但是他们却不得不为这些领域开发应用系统。缺乏应用领域的相关知识,是软件开发项目出现问题的常见原因。

    有时候,软件开发者通过访谈、阅读书面文件等方法了解到用户组织的“正式”工作流程,然后用软件实现这个工作流程。但是,决定软件系统成功与否的关键问题是,用户组织是否真正遵守这个工作流程

    2.5. 软件工程的七条基本原理

    著名的软件工程专家B.W.Boehm综合学者们的意见,于1983年在一篇论文中提出了软件工程的七条基本原理。这七条原理是确保软件产品质量和开发效率的原理的最小集合。

    这七条原理是互相独立的,其中任意6条原理的组合都不能代替另一条原理。同时这七条原理又是相当完备的,虽然不能用数学方法严格证明它们是一个完备的集合,但是可以证明在此之前已经提出的一百多条软件工程原理都可以由这七条原理的任意组合蕴含或派生。

    七条基本原理:

    1. 用分阶段的生命周期计划严格管理
      经统计发现,在不成功的软件项目中有一半左右是由于计划不周造成的。因此应该把软件生命周期划分成若千个阶段,并相应地制定出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理。不同层次的管理人员都必须严格按照计划各尽其职地管理软件开发与维护工作,绝不能受客户或上级人员的影响而擅自背离预定计划;一般来说软件的生命周期分为定义阶段、可行性研究阶段、需求分析阶段、程序设计阶段、编码阶段、测试阶段、运行维护阶段。
    2. 坚持进行阶段评审
      软件的质量保证工作不能等到编码阶段结束之后再进行,这样说至少有两个理由:
      第一,大部分错误是在编码之前造成的,根据统计,设计错误占软件错误的63%,编码错误仅占37%;
      第二,错误发现与改正得越晚,所需付出的代价也越高;
      因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵循的重要原则。
    3. 实行严格的产品控制
      在软件开发过程中改变需求是难免的,只能依靠科学的产品控制技术来顺应这种要求。也就是说,当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置管理。
      所谓基准配置又称为基线配置,它们是经过阶段评审后的软件配置成分。基准配置管理也称为变动控制,指的是一切有关修改软件的建议,特别是涉及到对基准配置的修改建议,都必须按照严格的规程进行评审,获得批准以后才能实施修改。绝对不能谁想修改软件,就随意进行修改。
    4. 采用现代程序设计技术
      从提出软件工程的概念开始,人们一直把主要精力用于研究各种新的程序设计技术,并进一步研究各种先进的软件开发与维护技术。实践表明,采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。
    5. 结果应能清楚地审查
      软件产品不同于一般的物理产品,它是看不见摸不着的逻辑产品。软件开发人员的工作进展情况可见性差,难以准确度量,从而使得软件产品的开发过程比一般产品的开发过程更难于评价和管理。为了提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限来规定开发组织的责任和产品标准,从而使得所得到的结果能够清楚地审查。
    6. 开发小组的人员应该少而精
      软件开发小组的组成人员的素质应该好,而人数则不宜过多。素质高的人员的开发效率比素质低的人员的开发效率可能高几倍至几十倍,而且素质高的人员所开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。
      此外,随着开发小组人员数目的增加,因为交流情况讨论问题而造成的通信开销也急剧增加。当开发小组人员数为N时,可能的通信路径有N(N-1)/2条,可见随着大数N的增大,通信开销将急剧增加。
    7. 承认不断改进软件工程实践的必要性
      遵循上述六条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但是,仅有上述6条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第7条基本原理。按照这条原理,不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。

    3. 软件工程方法学

    3.1. 软件工程方法学的概念

    软件工程包括技术和管理两方面的内容,是技术与管理紧密结合所形成的工程学科。通常把在软件生命周期全过程中使用的整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。

    软件工程方法学包含3个要素:

    1. 方法,是完成软件开发的各项任务的技术方法,回答"怎样做"的问题;
      在这里插入图片描述
    2. 工具,是为运用方法而提供的自动的或半自动的软件工程支撑环境;
      在这里插入图片描述
    3. 过程,是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。

    3.2. 传统软件工程与面向对象软件工程

    3.2.1. 传统软件工程与面向对象软件工程的对比

    目前使用得最广泛的软件工程方法学有传统方法学(面向数据流/结构化方法学)面向对象方法学。他们分别代表了两种程序设计方法:即结构化程序设计(程序=数据结构+算法) 和 面向对象程序设计(程序=对象+请求消息)

    两种方法学的软件开发流程如下所示:
    传统软件工程:软件分析→总体设计→详细设计→面向过程的编码→测试。会有一个清楚的流程体系。
    面向对象软件工程:软件分析与对象抽取→对象详细设计→面向对象的编码→测试。

    3.2.2. 传统软件工程的生命周期

    所谓软件生命周期,软件从产生、发展到成熟,直至衰亡为止的整个过程。

    它由八个小阶段组成:

    国标《计算机软件开发规范》将软件生存周期分为可行性研究与计划、需求分析、总体设计、详细设计、实现(编码和单元测试)、集成测试、确认测试、使用和维护共八个小阶段

    这八个小阶段又可以分为三个时期:

    1. 计划时期。问题定义、可行性分析
      问题定义阶段必须回答的关键问题是"要解决的问题是什么?"如果不知道问题是什么就试图解决这个问题,显然是盲目的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。
      可行性研究阶段的关键是明确要解决问题,找出行得通解决方法,并且给出粗略的计划。系统分析员需要从经济、技术、社会(操作)等方面对软件项目进行可行性分析。可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。可行性研究的结果是使用部门负责人作出是否继续进行这项工程的决定的重要依据。可行性研究以后的那些阶段将需要投入更多的人力物力。及时终止不值得投资的工程项目,可以避免更大的浪费。
    2. 开发时期。需求分析、软件设计(总体设计、详细设计)、编码、测试(单元测试和集成测试)
      需求分析阶段需要确定目标系统的任务目标以及必须具备哪些功能。系统分析员必须和用户密切配合,充分交流信息以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法表示在需求分析阶段确定的系统逻辑模型是以后设计和实现系统的基础。这个阶段的一项重要任务,是用正式文档准确地记录对目标系统的需求,这份文档通常称为需求《规格说明书》。
      总体设计阶段应该明确用什么方法去实现目标系统。首先,应该根据需求分析阶段的结果设计出实现目标系统的多种可选的方案。通常至少应该设计出低成本、中等成本和高成本等3种方案。软件工程师在充分权衡各种方案的利弊的基础上,推荐一个最佳方案。制定出实现最佳方案的详细计划。一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系,最终完成总体设计后需要记录在文档中,这份文档称为《总体设计说明书》。
      详细设计阶段的任务就是把实现目标系统的方法具体化。详细设计也称为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所需要的算法和数据结构,最终形成一份《详细规格说明》,这种规格说明应该包含必要的细节,程序员可以根据这些细节写出实际的程序代码。
      编码和单元测试阶段的关键任务是写出正确的、容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境,选取适当的程序设计语言,把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试(调试)编写出的每一个模块。
      集成测试阶段的关键任务是通过各种类型的测试(及相立的调试)使软件达到预定的要求。最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试;所谓验收测试则是按照规格说明书的规定,由用户对目标系统进行验收。必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验,集成测试和验收测试结束后应该形成文档《测试报告》,里面应当写明测试计划、测试方案和结果。
    3. 运行时期。软件维护
      软件维护阶段是要通过各种必要的维护活动使系统持久地满足用户的需要"。通常有四类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化,例如Windows迁移到Linux;完善性维护,即根据用户的要求改进或扩充软件使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。每一项维护活动都实质上是经历了一次压缩和简化了的软件定义和开发的全过程。

    实际从事软件开发工作时,软件规模、类型、开发环境及技术方法等因素会影响到阶段划分,及各阶段的执行顺序,形成不同生存周期模型,又称过程模型。也就是说以上的三个时期所包含的阶段不一定非要按照国标来进行,应当按照实际情况灵活安排软件周期。

    4. 软件开发模型

    软件开发模型实际上是软件工程三要素中"过程"要素的展开,下面介绍几种经典的软件开发模型

    4.1. 传统开发模型

    4.1.1. 瀑布模型(waterfall model)

    瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍然是软件工程中应用得最广泛的文档驱动的过程模型。如下图所示为传统的瀑布模型

    在这里插入图片描述
    瀑布模型区别与其他模型最大的特点有三个:

    1. 阶段间具有顺序性和依赖性
      (1)必须等前一阶段的工作完成之后,才能开始后一阶段的工作;
      (2)前一阶段的输出文档就是后一阶段的输入文档。因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。
    2. 推迟实现
      对于规模较大的软件项目来说,往往实现(编码和测试)开始得越早最终完成开发工作所需要的时间反而越长。这是因为,前面阶段的工作没做或做得不扎实,过早地考虑进行程序实现,往往带来灾难性后果瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,清楚地区分逻辑设计与物!理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要的指导思想
    3. 质量保证
      软件工程的基本目标是优质、高产。为了保证所开发的软件的质量,在瀑布模型的每个阶段都应坚持两个重要做法:
      (1)每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务;
      (2)每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。

    传统的瀑布模型过于理想化了,事实.上,人在工作过程中不可能不犯错误。实际的瀑布模型是带"反馈环"的,如下图所示。
    在这里插入图片描述
    实际的瀑布模型当在后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品之后再回来继续完成后面阶段的任务。

    4.1.2. 快速原型模型(rapid prototype model)

    快速原型模型是低成本的,进行循环需求分析的一个快速开发模型。它的基本结构如图所示。
    在这里插入图片描述
    原型是值快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集,然后在用户的不断使用中探明用户需求,不断对原型进行改进,最终完成需求分析。

    因此它的两个最大的优点就是:

    1. 原型系统已经通过与用户交互而得到验证,据此产生的规格说明文档正确地描述了用户需求,因此,在开发过程的后续阶段不会因为发现了规格说明文档的错误而进行较大的返工。
    2. 开发人员通过建立原型系统已经学到了许多东西,因此,在设计和编码阶段发生错误的可能性也比较小,这自然减少了在后续阶段需要改正前面阶段所犯错误的可能性。

    4.2. 演化开发模型

    4.2.1. 增量模型(incremental model)

    增量模型也称为渐增模型。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和
    测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。开发流程如下图所示
    在这里插入图片描述
    下图是每一个增量构建的实现过程图:
    在这里插入图片描述

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

    但是它也是有缺陷的,增量模型面临的最大困难就是必须保证在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品。必须把软件的体系结构设计得便于按这种方式进行扩充,向现有产品中加入新构件的过程必须简单、方便,也就是说,软件体系结构必须是开放的。

    4.2.2. 螺旋模型(spiral model)

    螺旋模型的基本思想是,使用原型及其他方法来尽量隆低风险。理解这种模型的一个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。从本质上来讲,螺旋模型就是一个加入了风险分析的快速原型模型。

    螺旋模型的主要优势在于,它是风险驱动的。它的开发过程如图所示:
    在这里插入图片描述

    一个螺旋式周期包括下面4个完整步骤:

    1. 确定目标,选择方案,选定完成目标的策略
    2. 从风险角度分析该策略
    3. 启动一个开发阶段
    4. 评价前一步的结果,并计划下一轮的工作

    4.3. 面向对象开发模型

    4.3.1. 构件集成模型(component integration model)

    构建集成模型是一个典型的面向对象开发模型,它的一个典例就是各种开发IDE,例如Visual Studio,可以查找加载各种构建。

    构建集成模型有着以下五个特点:面向对象、基于构件库、融合螺旋模型特征、支持软件开发的迭代方法、软件重用

    在这里插入图片描述

    展开全文
  • 计算机考研复试面试常问问题 软件工程

    千次阅读 多人点赞 2020-04-17 21:06:50
    计算机考研复试面试常问问题 软件工程篇 使用前需知(拒绝白嫖,从你我做起,你只需点个赞就行): 需要pdf直接打印版,可在公众号"程序员宝藏"回复复试上岸获取(会持续更新) 在复习过程中,我用心查阅并整理了...

    计算机考研复试面试常问问题 软件工程篇

    在这里插入图片描述

    使用前需知(拒绝白嫖,从你我做起,你只需点个赞就行):

    需要pdf直接打印版,可在公众号"程序员宝藏"回复复试上岸获取(会持续更新)

    在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!

    声明:一些边边角角的没有收集,毕竟是考研面试,不是笔试,这样也能减轻大家的负担!

    此系列一共有8篇:编程语言篇|数据结构篇|操作系统篇|组成原理篇|计算机网络篇|数据库篇|软件工程篇|计算机专业英语篇(还未全部完成,敬请期待,你们的支持和关注是我最大的动力!)

    个人整理,不可用于商业用途,转载请注明出处。

    需要408电子书2021版,可在公众号"程序员宝藏"回复408电子书获取

    需要408初试视频2021版,可在公众号"程序员宝藏"回复408视频获取

    需要复试机试视频,可在公众号"程序员宝藏"回复机试必过获取

    加油,大家都可以上岸!!!让我们一起努力!!!


    1、什么是软件工程?目前有哪几种主要的软件工程方法?

    概括地说,软件工程是指导计算机软件开发和维护的一门工程学科.采用工程的概念、原理、技术、和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。

    主要有传统方法也称为经典软件工程方法或生命周期方法或结构化范型和面向对象方法。

    2、软件的生命周期

    软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期。软件生存周期包括:

    (1)问题定义:弄清"用户需要计算机解决什么样的问题”,提出"系统目标和范围的说明“,提交用户审查和确认。

    (2)可行性分析:把待开发系统的目标以明确的语言描述出来,并从经济、技术、法律等多个方面进行可行性分析。

    (3)需求分析:弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。

    (4)开发阶段:设计、实现(完成源程序的编码)、测试

    (5)维护:改正性维护(由于开发测试的不彻底、不完全),适应性维护(适应环境变化),完善性维护(使用过程中提出的一些建设性意见),预防性维护(改善软件系统的可维护性和可靠性)。

    3、软件过程

    软件生命周期所涉及的一系列相关过程,是指一套关于项目的阶段、状态、方法、技术和开发、维护软件的人员以及相关Artifacts(计划、文档、模型、编码、测试、手册等)组成。包含基本过程类、支持过程类、组织过程类。

    (1)基本过程类包括获取过程、供应过程、开发过程、运作过程、维护过程和管理过程。

    (2)支持过程类包括文档过程、配置管理过程、质量保证过程、验证过程、确认过程、联合评审过程、审计过程以及问题解决过程。

    (3)组织过程类包括基础设施过程、改进过程、培训过程。

    4、软件需求分析的任务是什么?有哪些主要步骤?

    需求分析的基本任务是深入描述软件的功能和性能、确定软件设计的约束和软件同其它系统元素的接口细节、定义软件的其它有效性需求,总之,需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统的 “做什么” 的问题。

    主要步骤

    1.问题识别

    (1)功能需求:明确所开发的软件必须具备什么样的功能。

    (2)性能需求:明确待开发的软件的技术性能指标。

    (3)环境需求:明确软件运行时所需要的软、硬件的要求。

    (4)用户界面需求:明确人机交互方式、输入输出数据格式。

    2.分析与综合,导出软件的逻辑模型

    分析人员对获取的需求,进行一致性的分析检查,在分析、综合中逐步细化软件功能,划分成各个子功能。用图文结合的形式,建立起新系统的逻辑模型。

    3.编写文档

    (1)编写“需求规格说明书”,把双方共同的理解与分析结果用规范的方式描述出来,作为今后各项工作的基础。

    (2)编写初步用户使用手册,着重反映被开发软件的用户功能界面和用户使用的具体要求,用户手册能强制分析人员从用户使用的观点考虑软件。

    (3)编写确认测试计划,作为今后确认和验收的依据。

    (4)修改完善软件开发计划。在需求分析阶段对待开发的系统有了更进一步的了解,所以能更准确地估计开发成本、进度及资源要求,因此对原计划要进行适当修正。

    5、软件工程模型

    常见软件工程模型如下:

    1)瀑布模型:将软件生命周期中的各个活动规定为线性连接的模型,包括需求分析、设计、编码、测试、运行与维护,由前至后、相互衔接的固定顺序,如同瀑布流水逐级下落。

    瀑布模型是以文档作为驱动、适合于软件需求很明确的软件项目的模型。

    2)V模型:瀑布模型的一个变体,提供了一种验证确认活动应用于早期软件工程工作中的方法。

    瀑布模型的优点:1)容易理解,管理成本低;2)强调开发的阶段性早期计划及需求调查和产品测试。

    瀑布模型的缺点:1)客户必须能够完整、正确和清晰地表达他们的需要;2)开始2个或3个阶段,很难评估真正的进度;3)项目结束时,出现大量的集成和测试工作;4)需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超出预算。

    3)增量模型:融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。

    使用增量模型,第1个增量往往是核心的产品。客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品。

    增量模型的优点:1)容易理解,管理成本低;2)强调开发的阶段性早期计划及需求调查和产品测试;3)第一个可交付版本所需要的成本和时间很少;4)开发由增量表示的小系统所承担的风险不大;5)减少用户需求的变更;6)运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。

    增量模型的缺点:1)如果没有对用户的变更需求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;2)如果需求不想早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;3)管理发生的成本、进度和配置的复杂性可能会超出组织的能力。

    4)演化模型:是迭代的过程,软件开发人员能逐步开发出更完整的软件版本,适用于软件需求缺乏准确认识的情况,典型的演化模型有原型模型和螺旋模型。

    4.1)演化模型之原型模型:是预期系统的一个可执行版本,反映了系统性的一个选定的子集,一个原型不必满足目标软件的所有约束,目的是能快速、低成本地构建原型。

    原型模型开始于沟通,其目的是定义软件的总体目标,标识需求,然后快速制定原型开发的计划,确定原型的目标和范围,采用快速射击的方式对其进行建模,并构建原型。

    根据原型的目的,可分为三种:1)探索型原型:目的是弄清目标的要求,确定所希望的特性,并探讨多种方案的可行性;2)实验型原型:目的是验证方案或算法的合理性,是在大规模开发和实现前,用于考查方案是否合适、规格说明是否可靠等;3)演化型原型:目的是将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统。

    4.2)演化型模型之螺旋模型:将瀑布模型与演化模型结合起来,加入了两种模型均忽略的风险分析,弥补了这两种模型的不足。螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型相符合:

    螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,从而做出应有的反应。因此,该模型特别适用于庞大、复杂并且具有高风险的系统。

    5)喷泉模型:一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,喷泉模型使开发过程具有迭代性和无间隙性。

    优点:提高软件项目的开发效率,节省开发时间。

    缺点:开发阶段是重叠的,开发过程中需要大量的开发人员,不利于项目的管理。需要严格的管理文档,使得审核的难度加大。

    6、简述结构化分析、设计的要点:

    结构化分析方法适合于数据处理类型软件的需求分析。 其要点是"自顶向下"地开发系统,由整体到各组成部分,由表及里,由抽象到具体,逐步求精.

    (1) 模块化 (2)由顶向下,逐步求精.(3)上层模块分解为下层模块,有三种不同的结构形式,即顺序结构,选择结构和循环结构.

    7、软件测试的目标是什么,有哪几种主要有测试方法? 软件测试的目标:

    (1)测试是为了发现程序中的错误而执行程序的过程;

    (2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;

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

    软件测试的方法有动态测试、静态测试和正确性证明。

    a.黑盒测试: 黑盒测试是将被测软件看出一个黑盒子,只考虑系统的输入和输出,完全不考虑程序内部的逻辑结构和处理过程。 黑盒测试的依据是开发各阶段的需求规格说明。

    b.白盒测试:白盒测试是将黑盒子打开,研究源代码和程序内部的逻辑结构;

    8、白盒测试主要有哪些覆盖?

    语句覆盖、判定覆盖、 条件覆盖、判定/条件覆盖、条件组合覆盖、 点覆盖、 边覆盖、路径覆盖

    9、选择一种程序设计语言的主要有哪些依据?

    为了使程序容易测试和维护以减少生命周期的总成本,选用的高级语言应该有理想的模块化机制,以及可读性好的控制结构和数据结构;

    为了便于调试和提高软件可靠性,语言特点应该使编译程序能够尽可能多地发现程序中的错误;

    为了降低软件开发和维护的成本,选用的语言应该有良好的独立编译机制。

    上述这些要求是选择语言的理想标准,但是在实际选用语言时不能仅仅考虑理论上的标准,还必须同时考虑实用方面的各种限制。 (1)系统用户的要求 (2)可以使用的编译程序 (3)可以得到的软件工具 (4)系统规模 (5)程序员的知识 (6)软件可移植性要求 (7)软件的应用领域

    10、软件的维护的目标是什么,有哪几种维护类型?

    纠正在使用过程中暴露出来的错误而进行的改进性维护,适应外部环境的变化而进行的适应性维护,改进原有的软件而进行的完善性维护,以及改进将来的可维护性和可靠性而进行的预防性维护。 软件维护的分类: 软件维护主要划分为纠错性维护、适应性维护和完善性维护。

    (1)纠错性维护。由于前期的测试不可能揭露软件系统中所有潜在的错误,用户在使用软件时仍将会遇到错误,诊断和改正这些错误的过程称为纠错性维护。

    (2)适应性维护。由于新的硬件设备不断推出,操作系统和编译系统也不断地升级,为了使软件能适应新的环境而引起的程序修改和扩充活动称为适应性维护。

    (3)完善性维护。在软件的正常使用过程中,用户还会不断地提出新的需求。为了满足用户新的需求而增加软件功能的活动称为完善性维护。

    11、简述提高软件质量的主要措施。

    复审:是在软件生命周期每个阶段结束之前,都采用一定的标准对该段产生的软件配置成分进行严格的正式或非正式的检测。

    复查:是检查已有的材料,以断定在软件生命周期某个阶段的工作是否能够开始或继续。

    管理复审:是向开发组织或使用部门的管理人员提供有关项目的总体状况、成本和进度等方面的情况,以便他们从管理角度对开发工作进行审查。

    测试:包括测试计划、测试过程和测试结果3个阶段。

    12、面向对象如何实现模块独立性,其耦合和内聚的含义是什么?

    因为对象是由数据及可以对这些数据施加的操作所组成的统一体,而且对象是以数据为中心的,操作围绕对其数据所需做的处理来设置,没有无关的操作。因此,对象内部各种元素彼此结合得很紧密。内聚性相当强,由于完成对象所需要的元素(数据和方法)基本上都被封装在对象内部,它与外界的联系自然就比较少。因此,对象之间的耦合通常比较松。总之,面向对象使用对象、类、继承和消息的方法,既使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信来实现模块的独立性。

    13、面向对象和面向过程软件工程有哪些区别?

    (1)面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

    (2)面向过程是把一件事一项工程分解成为一个个小的功能,用一个个函数来实现;面向对象是把事情看成是一个个小的对象组成的,或者说一个个小部分组成的,这些对象之间的相互关系,构成了整个项目.在面向对象的思想中,万物皆对象。而"类",就是对象的抽象或者说是概括。

    14、简述对象、类、消息、方法的基本概念。

    (1)对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

    (2)类是具有相同或相似性质的对象的抽象。对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。 类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

    (3)对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。

    (4)类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。

    15、简述面向对象分析设计的三个模型。

    答:三个模型:对象模型、动态模型、功能模型

    (1)对象模型描述系统的静态结构,包括类和对象,它们的属性和操作,以及它们之间的关系。构造对象模型的目的在于找出与应用程序密切相关的概念。对象模型用包含对象及对象的关系图表示。

    (2)动态模型着重于系统的控制逻辑,考察在任何时候对象及其关系的改变,描述这些涉及时序和改变的状态。动态模型包括状态图和事件跟踪图。状态图是一个状态和事件的网络,侧重于描述每一类对象的动态行为。事件跟踪图则侧重于说明系统执行过程中的一个特点“场景”,也叫做脚本(scenarios),是完成系统某个功能的一个事件序列。脚本通常起始于一个系统外部的输入事件,结束于一个系统外部的输出事件。

    (3)功能模型着重于系统内部数据的传送和处理。功能模型表明,通过计算,从输出数据能得到什么样的输出数据,但不考虑参加计算的数据按什么时序执行。功能模型由多个数据流图组成,它们指明从外部输出,通过操作和内部存储,直到外部输出的整个数据流情况。功能模型还包括了对象模型内部数据间的限制。功能模型中的数据流图往往形成一个层次结构,一个数据流图的过程可以由下一层的数据流图作进一步的说明。

    16、UML 里面有哪些图?

    UML 图包括九种:使用案例图、类图、对象图、构件图、部署图、活动图、协作图、状态图、序列图。在这些图中使用案例图、类图、序列图是最有用的。
    1、需求
    采用用例图描述需求。
    2、 分析
    采用类图描述静态结构
    采用顺序图、合作图、活动图、状态图描述动态行为
    3、设计
    采用类图、包,对类的接口进行设计
    4、 实现
    将类用某现象对象语言实现
    5、继承与交付
    构件图、包、部署图
    6、 测试
    单元测试——类图和类的说明书

    17、 软件系统的三个测试阶段

    开发测试:在开发过程中对系统进行测试以发现bug和缺陷。

    发布测试: 在系统发布给用户之前,单独的测试团队测试系统的完整版本。

    用户测试 : 其中系统的用户或潜在用户在自己的环境中测试系统。

    展开全文
  • 软件工程-软件工程基本概念

    千次阅读 2018-10-16 22:38:30
    软件工程的概念、基本原理、方法学; 软件生命周期,主要软件过程的特点。 一、软件危机的定义:软件开发和维护过程中所遇到的一系列严重问题; 二、软件危机产生原因:用户需求不明确、缺乏科学理论作为指导、...

    知识要点:

    软件危机的概念、原因以及消除途径;

    软件工程的概念、基本原理、方法学;

    软件生命周期,主要软件过程的特点。

    一、软件危机的定义:软件开发和维护过程中所遇到的一系列严重问题;

    二、软件危机产生原因:用户需求不明确、缺乏科学理论作为指导、软件开发规模越来越大、软件产品的复杂程度越来越高;

    三、消除途径:

    1)研究软件的客观规律性,建立与系统化软件生产有关的概念、原则、方法、技术和工具,指导和支持软件系统的生产活动,

    达到降低软件生产成本,改进软件产品质量,提高软件生产率水平的目标;

    2)将软件生命周期各阶段使用的软件工具有机的集合成一个整体,形成能够连续支撑软件开发和维护全过程的集成化软件支撑

    环境,从管理和技术两方面解决问题;

    软件危机的主要表现:软件开发进度和成本难以预测;产品功能难以满足用户需求;

                                        产品质量得不到保障;缺少适当的文档资料;

                                        软件开发生产率的提高速度,跟不上计算机应用的普及和深入;

    软件工程方法学

    传统方法学(生命周期方法学或结构化泛型):采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件

    工程环境来支持结构化技术的运用。把软件生存周期的全过程划分为若干个阶段,然后顺序的完成每个阶段的任务。对于相邻

    的两个阶段,前一阶段的结束标准就是后一阶段的开始标准(后一阶段任务使得前一阶段任务解法更加具体化),每一个阶段结束

    都必须经过技术审查和管理复审,从技术和管理两方面对该阶段的成果进行审查,审查通过后进入下一阶段,反之要进行返工处

    理且返工后仍需进行审查。

    优点:每个阶段任务独立且比较简单,降低了整个软件开发的困难程度;在每个阶段结束前都采用科学的管理技术与良好

    的技术方法,从技术和管理两方面进行严格审查;保证了软件质量,提高了软件可维护性以及软件开发的成功率。

    面向对象方法学:(对象+类+继承+用消息通信)

    四、软件工程的定义:

    指导软件系统开发的工程的工程学科,采用工程化的概念、原理、技术和方法进行软件开发和维护,把实践证明的、科学的

    管理措施与最先进的技术结合起来,以经济地开发出高质量的软件并有效地维护它;

    五、软件工程的基本原理(七条):

    用分阶段的生命周期计划严格管理、坚持进行阶段评审、实行严格的产品控制、采用现代化程序设计技术

    结果能够清楚地审查、开发小组人员应当少而精、承认不断改进软件工程的必要性;

    六、软件生命周期:

    问题定义、可行性研究、需求分析、总体设计、详细设计、程序编码、软件测试、运行维护

    七、流常用的软件过程:

    瀑布模型:

    1)具有顺序性和依赖性,后一阶段任务必须等前一阶段完成后才能进行,前一阶段的输出文档是后一阶段的输入

    文档,只有前一阶段的输出文档正确,后一阶段的才能获得正确的结果。

    2)该模型清楚地区分逻辑与物理设计,尽可能的推迟物理实现。

    3)每个阶段都必须完成规定的文档,每个阶段结束前都要对完成的文档进行评审,尽早的发现问题改正错误。

    快速原型模型:增量模型、螺旋模型、喷泉模型、Rational同一过程、敏捷过程与极限编程、微软过程;

    展开全文
  • 软件工程导论—软件测试

    万次阅读 多人点赞 2020-05-13 21:26:49
    1. 软件测试基础 2. 单元测试 3. 集成测试 4. 确认测试 5. 白盒测试技术 6. 黑盒测试技术 7. 调试 8. 软件可靠性
  • 软件工程

    千次阅读 热门讨论 2015-09-27 13:36:45
    1、软件工程的起源  从1970年开始,软件的数量急剧膨胀,一些复杂的,大型的软件开发项目被提出来,但是最终都得到了一个悲惨的结局。很多软件项目的开发时间大大超出了规划的时间表,一些项目导致了财产的流失,...
  • 软件工程导论复试 本文用书 《软件工程导论》第六版张海藩、牟永敏 清华大学出版社 一、软件工程学概述 软件危机:计算机软件开发和维护时遇到的一系列严重问题 典型表现: (1) 对软件开发成本和进度的估计常常很...
  • 软件工程导论

    千次阅读 多人点赞 2019-06-12 20:13:11
    软件工程概述 1.1软件 1.2软件危机 1.3软件工程 1.4软件生命周期 1.5软件过程 第二章.可行性研究 2.1可行性研究的任务 2.2可行性研究过程: 2.3系统流程图 2.4数据流图(DFD) 2.5数据字典(DD) 2.6成本...
  • 我最近在网上读到一篇有关软件工程师电话技术面试的文章,为了拿到 offer,一个工程师必须在电话里完成一个非常复杂的代码挑战。他表现得很好,也拿到了 offer,但在加入公司后,他发现他所做的工作与预期相去甚远。...
  • 系列索引:《软件工程与实践》第三版 软件工程课程知识梳理 本章目录: 系列索引:《软件工程与实践》第三版 软件工程课程知识梳理 本章目录: 本章重难点: 1.1 软件工程的发展 1.1.1 软件危机概述 1.1.2 ...
  • 面试常见问题——软件工程(一)

    千次阅读 多人点赞 2016-10-09 16:42:13
    7、软件工程定义,与软件工程方法学的关系 8、软件生命周期(软件过程模型),瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点 9、分析模型(数据字典、数据流图、实体-关系图、状态转换图)
  • 软件工程期末考试题库(超全)

    万次阅读 多人点赞 2020-12-18 18:25:49
    软件工程期末考试题库 ...软件的复杂性是( A ),它引起人员通信困难、开发费用超支、开发时间超时等问题。 A. 固有的         B. 人为的   C. 可消除的         D. 不可降低的 在结
  • 软件工程导论期末复习

    千次阅读 2019-12-05 15:23:44
    (2)软件工程的中心课题是控制复杂性 (3)软件经常变化 (4)开发软件的效率非常重要 (5)和谐的合作是开发软件的关键 (6)软件必须有效的支持他的用户 **(7)在软件工程领域中通常由具有一种文化背景的人替...
  • 软件工程小结

    千次阅读 热门讨论 2013-12-23 16:55:42
    软件工程视频终于看完了,感觉有点儿困。不知道是不是因为前面对于软件的生存期比较熟的原因,感觉前面的听起来还行,但是一讲到管理这部分,我就有点儿撑不住了,总忍不住想睡觉。  软件工程就是为了更好的开发...
  • 软件工程软件工程过程与方法

    万次阅读 2016-06-23 17:29:48
    尽管程序员领着一份不错的薪水,可是他们也同样付出了巨大的精力与时间。随着软件规模的日益庞大,用户...而软件工程正是研究如何以系统性的、规范化的 、可定量的过程化方法高效开发与管理、维护软件的交叉性学科。
  • 软件工程导论 期末知识点复习总结

    万次阅读 多人点赞 2018-06-30 10:38:31
    2015软件工程期末复习知识点 软件是计算机程序、方法、规则、相关的文档以及运行计算机系统时所必需的数据的总和(狭义定义:软件=程序+数据+文档) 软件的特性:软件是复杂的、软件是不可见的、软件是不断变化...
  • 软件工程专业

    千次阅读 2016-10-04 16:03:34
    软件工程专业16340111 本人学院目录 简介 二级学科 课程 就业 简介 软件工程是将工程应用于软件的设计、开发、实施、测试和维护的一种系统化方法。 软件工程的典型形式定义是: 1.研究、设计、开发和测试操作...
  • 软件工程--概述

    千次阅读 多人点赞 2020-11-11 21:04:38
    软件是一个逻辑实体,依赖于硬件和 OS,在运行维护期间,不会像硬件一样出现磨损与老化,只会出现退化问题软件的开发以人工开发为主,不仅成本高、风险高,还受到社会因素的影响,在生产过程中,软件开发与硬件...
  • 软件工程概念:采用工程的概念、原理、技术和...(2)软件工程的中心课题是控制复杂性 (3)软件经常变化 (4)开发软件的效率非常重要 (5)和谐的合作是开发软件的关键 (6)软件必须有效地支持它的用户 (...
  • 软件工程面试

    千次阅读 2018-07-05 20:32:57
    一、软件分析:是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言表达出来的过程,基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到...
  • 软件工程测试题

    千次阅读 多人点赞 2020-07-07 10:48:57
    初识软件工程 软件工程方法是( )。 为了获得高质量软件而实施的一系列活动 为开发软件提供技术上的解决方法 为支持软件开发、维护、管理而研制的计算机程序系统 为了理解问题和确定需求而采取的一些技术和...
  • 软件工程的设计意义

    千次阅读 2013-11-07 00:14:28
    一个健壮的程序必然有良好的设计,软件工程设计是构建复杂软件中必不可少的重要环节。 1、明确软件工程的目标 在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可
  • 软件工程试题大全

    千次阅读 多人点赞 2019-07-02 15:19:11
    软件工程基础 一. 选择题 1。软件需求分析阶段的工作,可以分为4个方面:需求获取,需求分析,编写需求规格说明书以及(B) A).用户 B).需求审评 C).总结 D).都不正确 2。在原型法中称(A)为用户/设计者,开发人员根据用户...
  • 软件工程(二)——软件工程

    千次阅读 热门讨论 2014-10-11 15:36:01
    接下来,我们就要介绍软件工程“是什么”的问题。 一、是什么?  软件工程是为了解决软件危机而出现的。  那何为软件危机?  目前,一些小型系统已经无法满足人们的需求,软件开发者就要设计出大型系统来满足...
  • 软件工程概论题库

    千次阅读 多人点赞 2019-06-25 13:15:30
    软件工程复习题 一、选择题: 开发软件所需高成本和产品的低质量之间有着尖锐的矛盾,这种现象称做(C)。 A.软件工程 B.软件周期 C.软件危机 D.软件产生 瀑布模型本质上是一种(A)模型。 A.线性顺序B.顺序迭代C...
  • 软件工程复习整理

    千次阅读 多人点赞 2019-07-07 21:46:44
    软件工程复习整理 第一章:软件工程概述 软件:是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合 软件危机: 对软件开发成本和进度的估计常常不准确 用户对“已完成的”...
  • 前言:在实际的大规模软件实践中,笔者所带领的事业群总是碰到各种各样的项目交付问题,特别是规模稍微大一点的软件项目,更是如此,总是看到我们的项目经理或愁眉苦脸,或通宵达昼,或垂头丧气,或又将告诉你将延迟...
  • 软件工程导论习题

    万次阅读 2020-09-08 20:48:17
    软件工程软件工程专业的一门重要学科,掌握好软件工程原理是开发软件的重要基础知识。本博客对软件工程导论部分习题解释,以更加深理解。
  • 软件工程》60’ 一.、软件过程 1、软件过程的概念 答: 1)**软件过程描述为为了开发出客户需要的软件,什么人、在什么时候、做什么事以及怎么做这些事以实现某一种的具体目标。**ISO9000把过程定义为:“使用资源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 290,977
精华内容 116,390
关键字:

软件工程复杂工程问题