在软件工程面试中,会涉及到多方面的常见问题。
一、关于软件工程概念的问题
(一)软件工程的定义 软件工程是指导计算机软件开发和维护的一门工程学科。它采用工程的概念、原理、技术和方法来开发与维护软件,将经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法相结合,旨在经济地开发出高质量的软件并有效地维护它。这一学科涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
(二)软件工程方法 常见的软件工程方法包括传统方法(也称为经典软件工程方法、生命周期方法或结构化范型)和面向对象方法。传统方法按照软件生命周期的各个阶段顺序进行开发,如瀑布模型,将软件生命周期中的各个活动规定为线性连接,包括需求分析、设计、编码、测试、运行与维护等固定顺序。而面向对象方法则以对象为核心,将数据和操作封装在一起,具有更好的可维护性和可扩展性等优点。
二、软件生命周期相关问题
(一)软件生命周期的阶段
- 问题定义
- 这一阶段需要弄清用户需要计算机解决什么样的问题,提出系统目标和范围的说明,然后提交用户审查和确认。例如,在开发一个电商系统时,要明确是要解决用户便捷购物、商家高效管理商品和订单等问题,确定系统是面向小型商家还是大型企业等范围界定。
- 可行性分析
- 要把待开发系统的目标以明确的语言描述出来,并从经济、技术、法律等多个方面进行可行性分析。比如从经济上看,开发一个新的大型软件系统是否有足够的资金支持,包括开发成本、运营成本等;从技术上看,现有的技术是否能够实现系统的功能需求,是否存在技术瓶颈等;从法律上看,系统的开发和运营是否符合相关法律法规,是否涉及知识产权等问题。
- 需求分析
- 其基本任务是深入描述软件的功能和性能、确定软件设计的约束和软件同其它系统元素的接口细节、定义软件的其它有效性需求等。包括明确功能需求(软件必须具备的功能)、性能需求(如响应时间、吞吐量等技术性能指标)、环境需求(软件运行时所需的软、硬件要求)、用户界面需求(人机交互方式、输入输出数据格式)等。例如,一个办公软件可能需要支持多人同时在线编辑文档,这就是功能需求;要求在1秒内响应操作,这是性能需求;需要运行在Windows和Mac系统上,这是环境需求;要有简洁易用的图形界面,这是用户界面需求。
- 开发阶段(设计、实现、测试)
- 设计阶段:包括概要设计和详细设计。概要设计要设计出软件总的体系结构,如确定模块划分、模块之间的调用关系等;详细设计则要对每个模块进行详细的算法设计、数据结构设计等。
- 实现阶段:完成源程序的编码工作,将设计转化为实际的代码。
- 测试阶段:软件测试要经过单元测试、集成测试、确认测试、系统测试等步骤。单元测试针对软件的最小可测试单元(如函数或类)进行验证;集成测试检查模块之间的接口是否正确;确认测试检查已实现的软件是否满足需求规格说明书中的需求;系统测试把软件与其他系统元素(如硬件、其他支持软件、数据、人工等)结合在一起进行测试。
- 维护
- 包含改正性维护(由于开发测试的不彻底、不完全而修正错误)、适应性维护(适应环境变化,如软件从Windows系统移植到Linux系统时的修改)、完善性维护(根据用户在使用过程中提出的建设性意见增加功能等)、预防性维护(改善软件系统的可维护性和可靠性,如优化代码结构)等类型。
三、软件需求分析相关问题
(一)需求分析的任务 需求分析的任务是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统“做什么”的问题。这包括确定软件的功能和性能要求、确定软件设计的约束条件(如硬件限制、开发时间限制等)、定义软件同其他系统元素(如数据库、外部接口等)的接口细节、确定软件的其他有效性需求(如安全性、可靠性需求等)。
(二)需求分析的主要步骤
- 问题识别
- 明确功能需求,例如开发一个社交媒体软件,功能需求可能包括用户注册登录、发布动态、关注好友、评论点赞等功能。
- 确定性能需求,如系统要能支持一定数量的并发用户访问,页面加载时间不能过长等。
- 明确环境需求,是基于Web浏览器访问,还是需要开发移动端应用,对服务器的配置要求等。
- 确定用户界面需求,如界面风格是简洁现代还是功能丰富复杂,输入输出数据的格式(如日期的显示格式等)。
- 分析与综合,导出软件的逻辑模型
- 分析人员对获取的需求进行一致性分析检查,在分析、综合中逐步细化软件功能,划分成各个子功能。然后用图文结合的形式,建立起新系统的逻辑模型。例如,可以使用数据流图(DFD)来描述系统中数据的流动和处理过程,用数据字典来定义系统中用到的数据元素等。
- 编写相关文档
- 编写“需求规格说明书”,把双方共同的理解与分析结果用规范的方式描述出来,作为今后各项工作的基础。
- 编写初步用户使用手册,着重反映被开发软件的用户功能界面和用户使用的具体要求,从用户使用的观点考虑软件。
- 编写确认测试计划,作为今后确认和验收的依据。
- 根据需求分析阶段对系统的进一步了解,修正完善软件开发计划,更准确地估计开发成本、进度及资源要求。
四、软件工程模型相关问题
(一)瀑布模型
- 特点
- 瀑布模型是将软件生命周期中的各个活动规定为线性连接的模型,各阶段由前至后、相互衔接的固定顺序,如同瀑布流水逐级下落。它是以文档作为驱动的,适合于软件需求很明确的软件项目。例如,在开发一些传统的企业管理软件,需求已经经过详细调研和确定,就可以采用瀑布模型。在瀑布模型中,每个阶段都有明确的输入和输出,前一个阶段的输出是后一个阶段的输入。如需求分析阶段的输出需求规格说明书是设计阶段的输入,设计阶段的输出(如设计文档)是编码阶段的输入等。
- 优缺点
- 优点:容易理解,管理成本低;强调开发的阶段性早期计划及需求调查和产品测试。
- 缺点:客户必须能够完整、正确和清晰地表达他们的需要;开始2个或3个阶段,很难评估真正的进度;项目结束时,会出现大量的集成和测试工作;需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超出预算。
- 特点与关系
- V模型是瀑布模型的一个变体,它提供了一种验证确认活动应用于早期软件工程工作中的方法。它的左边是开发过程,右边是测试过程,两者相互对应。例如,在需求分析阶段对应的是验收测试计划,设计阶段对应的是系统测试计划,编码阶段对应的是单元测试计划等。这表明测试工作应该尽早介入开发过程,而不是等到开发完成后才开始测试。
- 优缺点
- 优点:与瀑布模型类似,容易理解,管理成本低,同时强调了测试与开发过程的紧密结合,有助于提高软件质量。
- 缺点:由于它仍然是一种线性的模型,如果需求发生变更,变更在模型中的传递可能会比较复杂,导致项目的调整成本较高,而且前期对需求的准确性要求仍然较高。
- 特点
- 增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。使用增量模型,第1个增量往往是核心的产品。例如,开发一个在线教育平台,第一个增量可能是实现课程的播放功能,用户注册登录功能等核心功能。然后客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生最终的完善产品。
- 优缺点
- 优点:容易理解,管理成本低;强调开发的阶段性早期计划及需求调查和产品测试;第一个可交付版本所需要的成本和时间很少;开发由增量表示的小系统所承担的风险不大;减少用户需求的变更;运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。
- 缺点:如果没有对用户的变更需求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;如果需求不像早期思考的那样稳定和完整,那么一些增量就可能需要重新开发、重新发布;管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
- 原型模型
- 特点:是预期系统的一个可执行版本,反映了系统性的一个选定的子集,一个原型不必满足目标软件的所有约束,目的是能快速、低成本地构建原型。例如,在开发一款新的手机游戏时,为了快速验证游戏的玩法是否受用户欢迎,可以先构建一个简单的原型,包含基本的游戏场景、操作方式等。原型模型开始于沟通,其目的是定义软件的总体目标,标识需求,然后快速制定原型开发的计划,确定原型的目标和范围,采用快速射击的方式对其进行建模,并构建原型。
- 适用场景:适用于软件需求缺乏准确认识的情况,通过让用户尽早接触原型,提出反馈意见,来逐步明确软件的需求。
- 螺旋模型
- 特点:螺旋模型是一种风险驱动的模型,它将软件开发过程视为一个螺旋式的迭代过程,每个迭代周期都包含制定计划、风险分析、实施工程和客户评估四个阶段。在每个迭代中,都会开发出一个更完整的软件版本。例如,在开发一个大型的航空航天软件系统时,由于项目的复杂性和高风险性,采用螺旋模型可以在每个迭代中对风险进行评估和控制,逐步完善软件。
- 适用场景:适用于规模较大、风险较高的软件项目,尤其是那些需求不太明确,并且在开发过程中可能会有较多变化的项目。
五、软件测试相关问题
(一)测试阶段
- 单元测试
- 单元测试是对软件的最小可测试单元(如函数或类)进行验证。工作内容包括编写和执行单元测试用例。例如,在一个Java程序中,对一个计算两个数之和的函数进行单元测试,要测试不同类型的输入(如正数、负数、零等),验证函数的输出是否正确。单元测试可以发现函数内部的逻辑错误、边界条件处理错误等。
- 集成测试
- 集成测试是检查与设计相关的软件体系结构的有关问题,也就是检查概要设计是否合理有效。它主要测试模块之间的接口是否正确,例如,在一个由多个模块组成的电商系统中,测试商品模块和订单模块之间的接口是否能正确传递数据,包括商品信息、订单数量等数据的传递是否准确。
- 确认测试
- 确认测试主要是检查已实现的软件是否满足需求规格说明书中确定了的各种需求。例如,需求规格说明书中规定电商系统的搜索功能要支持模糊搜索,在确认测试中就要验证搜索功能是否真的实现了模糊搜索。
- 系统测试
- 系统测试是把已确认的软件与其他系统元素(如硬件、其他支持软件、数据、人工等)结合在一起进行测试,以确定软件是否可以交付使用。比如,在一个医疗设备管理系统中,要将软件与医疗设备硬件、医院的其他信息管理软件等结合起来测试,确保整个系统在实际运行环境中的稳定性和可靠性。
- 黑盒测试与白盒测试
- 黑盒测试:黑盒测试把软件看作一个黑盒子,不考虑内部结构,只关注输入和输出。例如,在测试一个计算器软件时,只输入不同的数字和运算符,看输出结果是否正确。黑盒测试的方法包括等价类划分、边界值分析、决策表等。
- 白盒测试:白盒测试则关注软件的内部结构,对程序的逻辑结构进行测试。例如,对一个有循环结构和条件判断的函数,测试各种可能的执行路径。白盒测试的方法包括语句覆盖、判定覆盖、条件覆盖等。
- 功能测试与非功能测试
- 功能测试:主要测试软件的功能是否满足需求,如前面提到的电商系统的搜索功能、购物车功能等的测试。
- 非功能测试:包括性能测试(如软件的响应时间、吞吐量等性能指标的测试)、安全测试(如验证软件是否存在安全漏洞,如SQL注入漏洞等)、兼容性测试(测试软件在不同的操作系统、浏览器等环境下的兼容性)等。
声明:本文网友投稿,观点仅代表作者本人,不代表鲸选型赞同其观点或证实其描述。