软件工程
面试准备
author:slightwjq
2023年3月6日
软件危机:计算机软件开发和维护过程中所遇到的一系列严重问题。
主观原因:忽视需求分析、轻视软件维护、没有认识到程序只是软件的一部分、没有认识到开发只是软件生命周期的次要阶段
客观原因:软件是逻辑实体缺乏可见性、软件维护困难、软件规模庞大
软件工程方法学:把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为泛型。主要包括三要素:方法、工具和过程。
方法学分为传统方法学(生命周期方法学)和面向对象方法学。
软件生命周期:
- 软件定义:
- 问题定义:弄清楚解决什么问题
- 可行性研究:是否可行
- 需求分析:系统需要具备什么功能
- 软件开发:
- 总体设计:设计软件结构,确定模块间关系
- 详细设计:对每个模块进行设计,确定算法数据结构
- 编码和单元测试:实现模块并测试
- 综合测试:使达到预期
- 软件维护:
- 运行维护:使软件在整个生命周期满足用户需求
软件生命周期模型:
- 瀑布模型:将软件生存周期活动依照顺序连接。缺乏灵活性。
- 快速原型模型:快速建立可运行的软件。设计不准确。
- 增量模型:先完成系统子集开发,再逐步增加功能。集成困难。
- 螺旋模型:在快速原型模型的每个阶段之前增加风险分析。风险估计困难。
- 喷泉模型:面向对象的模型,有迭代和无缝的特性。
- 其他模型:
可行性研究:
经济可行性、技术可行性、操作可行性等。
数据流图(DFD):描述信息流和数据从输入到输出过程所经受的变换。只是在描绘数据在软件中流动和被处理的逻辑过程。
画法:
(1):确定系统输入输出、源点以及终点。
(2):画系统顶层数据流图。
(3):自顶向下分解,画出分层数据流图。
数据字典:关于数据的信息集合,即对数据流图中包含的所有元素定义的集合。
需求分析
任务:确定对系统的综合要求、分析系统的数据要求、导出系统的逻辑模型、修正系统开发计划
分析建模
模型:是指为理解事物而对事物做出的一种抽象。
- 模型分类:
- 数据模型(实体-联系图,即E-R图):描绘数据对象及数据对象之间的关系。
- 功能模型(数据流图):描绘数据在系统中流动时被处理的逻辑过程,指明系统具有的变换数据的功能。
- 行为模型(状态转换图):描绘系统的各种行为模式在不同状态间转换的方式。
验证软件需求:
从哪些方面验证软件需求的正确性:一致性、完整性、现实性、有效性。
总体设计
设计过程包括系统设计阶段和结构设计阶段。
模块化:把程序划分为独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定功能满足用户需求。
抽象:抽出事物本质特性而暂时不考虑它们的细节。
逐步求精:逐步揭露除底层细节。
信息隐藏和局部化:指一个模块内包含的信息对于不需要这些信息的模块是不能访问的和指把一些关系密切的软件元素物理地放得彼此靠近,有助于信息隐藏。
模块独立:是模块化、抽象、信息隐藏和局部化概念的直接结果。度量标准是耦合和内聚。
耦合:对模块之间互联程度的度量。
内聚:模块内部彼此结合的紧密程度。
目标是高内聚低耦合。
描绘软件结构用层次图IPO和结构图(描述传递信息和调用方式)
详细设计
目的是确定怎样具体地实现所要求的系统,得出对目标的精确描述。
任务是过程设计(每个模块的实现算法)、数据设计(软件数据结构)和接口设计(各模块之间的接口)。
结构程序设计:只用三种基本的控制结构(选择结构、顺序结构、循环结构)实现的单入口单出口的程序。
人机界面设计是接口设计的重要组成部分,常遇到系统响应时间、用户帮助设施、出错信息处理、命令交互四个问题。
过程设计工具:程序流程图、盒图(N-S图)、PAD图、判定表、判定树、过程设计语言(PDL)。
实现与测试
软件生命周期中的编码和测试称为实现。
软件测试的目标是为了发现错误而执行程序的过程。
- 软件测试的准则:
- 所有测试都应该能追溯到用户需求。
- 应该远在测试之前就制定测试计划。
- Pareto原理:80%的错误是由20%的模块造成的。
- 应该从“小规模”测试开始,并逐步进行大规模测试。
- 穷举测试是不可能的,测试只能证明程序有错误,但不能证明程序无错误。
- 为了尽最大可能的发现错误,应该有独立的第三方担任测试工作。
黑盒测试法:将软件看作黑盒,不考虑内部结构和处理过程,只考虑输入输出,又称为功能测试。
包含等价类划分法(把数据分为若干等价类)和边界值分析法(选取临界值进行测试)
白盒测试法:完全知道内部结构和处理算法,将程序看做透明的白盒子,根据逻辑测试程序内部是否按照预期进行,又称结构测试。
测试用例:测试输入和输出结果
测试方案:测试目的、测试用例的集合
- 软件测试的步骤:
- 单元测试(模块测试):每个模块作为独立实体进行测试。
- 测试依据:详细设计文档
- 测试技术:白盒测试
- 子系统测试:将模块集成为一个子系统进行测试,着重测试模块的接口。
- 目标:发现接口有关问题
- 集成方法:上层模块使用自顶向下集成、下层模块采用自底向上集成
- 系统测试:将子系统组装成完整的系统进行测试。
- 验收测试:在用户的参与下,使用实际数据进行测试。
- 目标是验证软件有效性
- Alpha测试:用户在开发者的场所在开发者的指导下进行测试
- Beta测试:用户在用户场所进行,遇到问题报告给开发者,开发者进行修改
- 目标是验证软件有效性
- 平行运行:同时运行新系统和旧系统,以便比较处理结果。
- 单元测试(模块测试):每个模块作为独立实体进行测试。
调试:是在测试发现错误后排除错误的过程。
软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功运行的概率。
软件可用性:程序在给定时间点,按照规格说明书的规定成功运行的概率。
软件维护
软件维护是在已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
- 改正性维护:诊断和改正错误的过程。17~21%
- 适应性维护:为了和变化了的环境适当地配合而进行的修改软件的活动。18~25%
- 完善性维护:为了满足在用户提出的增加新功能或修改已有功能的要求和一般性的改进要求。50~66%
- 预防性维护:为了提高未来的可维护性和可靠性,也称为软件再工程。4%
- 有逆向重构、代码重构、数据重构、正向工程。
结构化和非结构化维护差别巨大,维护的代价十分高昂。
决定软件可维护性的因素:可理解性、可测试性、可修改性、可移植性、可重用性。
面向对象方法学
软件项目管理
通过计划、组织和控制等一系列活动,合理地配置和使用各种资源以达到既定目标。
估算软件规模方法:代码行技术、功能点技术。
软件质量是软件与明确地和隐含地定的的需求相一致的程度。
保证软件质量的措施有基于非执行测试、基于执行测试、程序正确性证明。
- 本文作者: 魏静崎
- 本文链接: https://slightwjq.github.io/2023/10/17/软件工程-面试准备/
- 版权声明: 该文章来源及最终解释权归作者所有