Skip to main content

软件工程

1. 软件工程基础

  • 软件危机:随着软件复杂度提升,开发成本、软件质量、生产效率等问题。
  • 软件工程:以工程学思路进行软件开发,消除软件危机。

软件工程的三要素:

  1. 方法:完成软件工程项目的技术手段
  2. 工具:支持软件的开发、管理、文档生成
  3. 过程:支持软件开发的各个环节控制、管理

信息系统生命周期模型

五阶模型:系统规划——系统分析——系统设计——系统实施——运行维护

四阶模型:立项——开发——运维——消亡

系统规划:确定信息系统的发展战略,研究建设新系统的必要性和可能性、给出拟建系统的备选方案并进行可行性研究。

系统分析:进行详细调查、描述业务流程、指出局限性和不足、确定逻辑模型。

系统设计:概要设计(设计软件的结构、组成模块和模块间调用关键和每个模块的功能)和详细设计物理模型。

系统实施:计算机等设备的配置、安装和调试、程序的编写和调试、人员培训、数据文件转换、系统调试与转换。

运行维护:记录系统运行情况、进行必要的修改、评价系统的工作质量和经济效益。

软件生命周期

软件产品从考虑其概念到产品交付使用,直至最终退役为止的整个过程。

  1. 计划阶段:确定待开发系统的总体目标和范围,可行性研究和预算、进度估算
  2. 分析阶段:分析、整理和提炼用户需求,编写需求规格说明书和初步用户手册。
  3. 设计阶段:根据需求规格说明书,确定软件体系结构,确定每个模块的实现算法、数据结构和接口,编写设计说明书,并组织评审。
  4. 实现阶段:将设计的各个模块编写成计算机可接受的程序代码和相关文档。
  5. 测试阶段:测试各个功能模块,然后将各个模块集成起来,进行功能需求测试。
  6. 运行维护阶段:后期运维,增删改。

2. 软件开发模型

典型软件生命周期模型

  1. 瀑布模型
  2. 螺旋模型
  3. 迭代模型
  4. V模型
  5. 原型化模型
  6. 敏捷方法

瀑布模型

瀑布模型是一个经典的软件生命周期模型,一般将软件开发分为:可行性分析(计划)、需求分析、软件设计(概要设计、详细设计)、编码(含单元测试)、测试、运行维护等几个阶段。

在这里插入图片描述

瀑布模型中,上一项活动的输出作为当前活动的输入完成当前活动后,进行评审,通过则进下一项,否则返回之前。

特点:也称为生命周期法、预测型、计划驱动,是结构化方法中最常用的开发模型,本质是“一次通过”。适用范围是需求明确或很少变更的项目,或开发团队比较弱、有厚实的行业实践基础、整批一次性交付有利于干系人。

螺旋模型

螺旋模型是一个演化软件过程模型,在瀑布模型和原型化模型的基础上的演进而来的。每一次迭代都包含了四个步骤:制订计划、风险分析、实施工程、客户评估。

在螺旋模型中,软件开发是一系列的增量发布。

螺旋模型在每一次迭代中增加了风险分析。

在这里插入图片描述

迭代模型

迭代模型中,每个阶段都执行一次传统的、完整的串行过程串,执行一次过程串就是一次迭代。每次迭代涉及的过程都包括不同比例的所有活动。(多次交付)

RUP软件统一过程就是迭代模型的一种。RUP中被分解为4个顺序的阶段:初始阶段(Inception)、细化阶段(Elaboration)、构建阶段(Construction)和交付阶段(Transition),这4个阶段的顺序执行就形成了一个周期。

在这里插入图片描述

V模型

V模型从整体上看起来,就是一个V字型的结构 ,由左右两边组成。

  • 左边的下划线分别代表了用户需求、需求分析、概要设计、详细设计。
  • 右边的上划线代表了单元测试、集成测试、系统测试和验收测试。

特点:细化了瀑布模型中的测试部分、开发阶段清楚、便于控制开发。适用于需求明确、需求变更不频繁的情况。

V模型特点:

  1. 单元测试的主要目的是针对编码过程中可能存在的各种错误。
  2. 集成测试的主要目的是针对详细设计中可能存在的问题。
  3. 系统测试主要针对概要设计,检查系统作为一个整体是否有效地得到运行。
  4. 验收测试通常由业务专家或者用户进行,以确认产品能真正符合用户业务上的需要。
  5. V模型用于需求明确和需求变更不频繁的情形。

在这里插入图片描述

原型化模型

原型化模型第一步就是创建一个快速原型,能够满足项目干系人与未来的用户可以与原型进行交互,再通过与相关干系人进行充分的讨论和分析,最终弄清楚当前系统的需求,进行了充分的了解之后,在原型的基础上开发出用户满意的产品。

原型特点:

  1. 实际可行
  2. 具有最终系统的基本特征
  3. 构造方便、快速,造价低

原型分类:

  1. 抛弃型原型:原型在系统真正实现以后就放弃不用了
  2. 进化型原型:通过修改和追加功能的过程逐渐丰富,演化成最终系统。

敏捷开发模型

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法,相对于传统软件开发方法的“非敏捷”,更强调程序员团队和业务专家之间的紧密写作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、奏而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织的方法,也更注重软件开发中人的作用。Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发。

特点:较小增量、快速迭代(2-4周)、变更驱动、每次交付最有价值成果、 适用:小型或中型软件开发团队,并且客户的需求模糊或多变。

常见的敏捷开发方法有:

  • 极限编程(XP)
  • Scrum
  • 自适应软件开发
  • 水晶方法
  • 特性驱动开发

在这里插入图片描述

3. 软件开发方法

信息系统开发方法

常用开发方法:结构化方法、面向对象方法、原型化方法、面向服务的方法。

结构化方法由结构化分析(SA)、结构化设计(SD)和结构化程序设计(SP)组成。

精髓:自顶向下、逐步求精和模块化设计。

在这里插入图片描述

结构化方法主要特点:

  1. 开发目标清晰化
  2. 开发工作阶段化
  3. 开发文档规范化
  4. 设计方法结构化

结构化方法的缺点:

  1. 开发周期长
  2. 难以适应需求变化
  3. 很少考虑数据结构

结构化方法特别适合于数据处理领域的问题,但不适应于规模较大、比较复杂的系统开发。

面向对象开发方法

面向对象(OO)方法:认为客观世界是由各种对象组成的,任何事物都是对象,与结构化方法类似,OO方法也划分阶段,但其中的系统分析 、系统设计和系统实现三个阶段之间已经没有“缝隙”,也就说,这三个阶段的界限变得不明确。

面向对象的方法(OO)构建在类和对象之上,随后发展起来的建模技术将相关对象按照业务功能进行分组,就形成了构件(Component)的概念。

大型信息系统的开发,通常是将结构化方法和OO方法结合起来。首先,使用结构化方法进行自顶向下的整体划分;然后,自底向上地采用OO方法进行开发。

优点:具有更好的复用性,有利于用户和开发人员沟通,缩短开发时间。

面向对象三大特征:封装性、继承性和多态性。

原型化方法

原型化方法也称为快速原型法(简称为原型法)。根据用户初步需求,利用系统开发工具,快速地建立一个系统模型展示给用户,在此基础上与用户交流,最终实现用户需求的信息系统快速开发。

水平原型

通常只是功能的导航,但并未真实实现功能,主要用在界面上。

垂直原型

也称为结构化原型,实现了一部分功能,垂直原型主要用在复杂的算法实现上。

抛弃式原型

探索式原型,指的是达到预期的目的之后,原型本身被抛弃。

演化式原型

演化式原型为开发增量式产品提供基础,逐步将原型演化成最终系统,主要用在必须易于升级和优化的场合,尤其是WEB项目。

面向服务方法

对于跨构件的功能调用,采用接口的形式暴露出来。 进一步将接口的定义与实现进行解耦合,催生了服务和面向服务的开发方法。 如何使信息系统快速响应需求和环境变化,提高系统可复用性,信息资源共享和系统之间的互操作性,成为了影响信息化建设效率的关键问题,而SO的思维方式恰好满足了这种需求。

关注业务,业务驱动,以开放标准封装业务流程和已有的应用系统,实现应用系统之间的互相访问。

4. 软件开发语言

标记语言

一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码,常用于格式化和链接,如HTML、XML。

脚本语言

又称为动态语言,是一种编程语言,用来控制软件应用程序,只在调用时进行解释,可以定义函数和变量,比编译型语言的语法和规则更简单灵活,跨平台移植难度低。典型的脚本语言:Python、JavaScript、VBScript、PHP。

编译型语言

程序在执行之前需要一个专门的编译过程,把程序编译成机器语言,比如exe文件。程序执行效率高,依赖编译器,跨平台移植难度大,编译型语言代表有:C、C++、Java。

是否生成目标代码是编译和解释的最根本区别。

5. 软件测试

这是历年的网工高频考点,务必掌握。

静态测试

不运行程序,检查文档(检查单)或代码(桌面检查、代码走查、代码审查)。

动态测试

白盒测试

用于软件单元测试中。

按照程序内部逻辑结构设计测试用例,进行测试。最常用的技术是逻辑覆盖。

黑盒测试

用于集成测试、确认测试和系统测试。

根据SRS的规定来设计测试用例。

技术有:等价类划分、边界值分析、判定表、因果图、状态图、随机测试、猜错法、正交试验法。

测试分类

在这里插入图片描述

测试类型

在这里插入图片描述