50 个软件工程面试问题及答案
面向应届生的软件开发人员面试问题及答案
1) 软件的重要类别有哪些?
- 系统软件
- 应用软件
- 嵌入式软件
- Web 应用程序
- 人工智能软件
- 科学软件。
2) 计算机程序和计算机软件的主要区别是什么?
计算机程序是一段编程代码。它执行一项明确定义的任务。另一方面,软件包括编程代码、文档和用户指南。
3) 什么是软件再工程?
它是软件开发的一个过程,用于提高软件系统的可维护性。
4) 简要描述软件开发过程
软件开发生命周期包括以下阶段:
- 需求分析
- 规格说明
- 软件架构
- 实施
- 测试
- 文档
- 培训和支持
- 维护
5) 有哪些 SDLC 模型?
瀑布模型、螺旋模型、大爆炸模型、迭代模型和 V 模型是一些著名的SDLC 模型。
6) 什么是验证和确认?
验证
验证是指确保软件实现特定功能的活动集。
验证
它指的是确保软件是根据客户需求构建的活动集。
7) 在软件开发过程中,“调试”是什么意思?
调试是消除错误的过程。它是成功测试的一个非常重要的部分。
8) 如何确保您的代码既安全又快速?
在软件开发中,安全永远是第一位的。所以如果程序的执行很慢,我将尝试找出原因并找出提高其时间复杂度的方法。
9) 说出两个用于跟踪软件需求的工具?
有很多方法可以跟踪需求。
两个常用的方法是:
- 创建需求规格文档以列出所有需求。
- 创建 Excel 表格,列出需求、类型、依赖性、优先级等。
10) Stubs 和 Mocks 的主要区别是什么?
Stub 是界面的最小实现,通常返回硬编码数据,而 Mock 通常根据预期验证输出。这些预期在测试中设置。
11) 您喜欢用什么语言编写编程算法?
每位开发人员在编程语言选择方面都有自己的看法。不过,应该偏好高级语言,因为它们是动态的。例如 C 和 C++ 语言。
12) 什么是计算机软件?
计算机软件是一个软件包,包括一个软件程序、其文档以及如何使用该软件的用户指南。
13) 在您看来,哪个 SDLC 模型最好?
没有这样的排名,因为 SDLC 模型是根据开发过程的需求来采用的。它可能因软件而异。
14) 什么是软件项目经理?他的角色是什么?
软件项目经理是负责管理软件开发项目的个人。
项目经理负责项目规划、监控进度、沟通。他还管理风险和资源,以在时间、成本和质量约束内交付项目。
15) 什么是软件范围?
软件范围是一个明确定义的边界。它包括开发和交付软件产品所做的所有类型的活动。
软件范围定义了将作为软件一部分交付的所有功能和工件。范围还确定了产品将做什么?项目不包含什么?什么是项目估算?
此过程有助于估算软件产品的各个方面。此估算可以咨询专家或使用预定义公式来确定。
16) 如何计算软件产品的大小?
软件产品的大小可以通过以下两种方法计算:
- 计算交付的代码行数
- 计算交付的功能点数
17) 什么是功能点?
功能点是软件产品提供的功能。它被认为是衡量软件大小的最重要指标。
18) 有哪些可用的软件项目估算技术?
最常用的估算技术是:
- 分解技术
- 经验技术
19) 什么是软件配置管理?
软件配置管理是跟踪和控制软件中发生的变化的过程。
变更控制是一项功能,可确保对软件系统所做的所有更改都是一致的,并且是使用组织规则和法规创建的。
20) 如何衡量项目执行情况?
我们可以通过活动监控、状态报告和里程碑清单来衡量项目执行情况。
21) 谈谈一些项目管理工具。
根据软件项目的需要,有许多类型的管理工具可供使用。其中一些是 Pert 图、甘特图、资源直方图、状态报告等。
22) 什么是软件需求?
软件需求是拟议软件系统的功能描述。它被假定为目标系统、其功能和特性的描述。
23) 什么是可行性研究?
这是衡量软件项目开发对组织有多么实用和有益。软件分析师进行研究以了解项目的经济、技术和运营可行性。
- 经济方面:包括培训成本、附加工具成本以及项目成本和效益的总体估算。
- 技术方面:评估技术方面。这个系统有可能开发吗?评估将在其上运行软件的机器和操作系统的适用性,软件开发知识以及可用于此项目的工具。
- 运营方面:在这里,分析师需要评估组织能否顺利适应项目需求所做的更改。该问题是否值得以估算成本解决?
在研究了所有这些之后,创建了最终的可行性报告。
24) 什么是功能需求和非功能需求?
功能需求是用户对拟议软件产品的功能期望。
非功能需求与安全性、性能、用户界面的外观和感觉有关。
25) 什么是软件度量?
软件度量提供了软件过程各个方面的度量,这些度量分为:
- 需求度量:需求长度、完整性
- 产品度量:代码行数、面向对象度量、设计和测试度量。
26) 什么是模块化?
模块化是一种将软件系统划分为多个离散模块的技术。这些模块期望独立执行任务。
27) 什么是内聚性?
内聚性是衡量模块元素之间内部依赖性的指标。
28) 提及一些软件分析与设计工具?
一些最重要的软件分析和设计工具是:
- 数据流图
- 结构化图
- 结构化英语
- 数据字典
- 层次输入处理输出图
- 实体关系图和决策表
29) 什么是 0 级数据流图?
最高抽象级别称为 DFD 的 0 级。它也称为上下文级 DFD。它将整个信息系统描绘成一个图。
30) 结构化英语和伪代码的主要区别是什么?
结构化英语是本地方言。它用于编写程序模块的结构。它使用编程语言关键字。另一方面,伪代码更像编程语言,但没有特定语言的语法。
面向有经验的软件工程面试问答
31) 什么是结构化设计?
结构化设计是问题的概念化。它也称为解决方案设计,基于“分而治之”策略。
32) 什么是函数式编程?
它是一种编程方法,它使用数学函数的概念。它提供计算方法作为数学函数,这些函数还产生与程序状态无关的结果。
33) 什么是质量保证与质量控制?
质量保证检查开发软件时是否遵循了正确的流程,而质量控制则侧重于维护软件产品的质量。
34) 什么是 CASE 工具?
CASE 是计算机辅助软件工程的缩写。它们是一套自动化的软件应用程序,用于支持、增强和加强 SDLC 活动。
35) 哪种流程模型能在软件出现问题之前消除缺陷?
无瑕疵软件工程方法能在软件出现问题之前消除缺陷。
36) 解决这个问题
抽屉里有二十只不同类型的袜子,在一个黑暗的房间里。最少需要拿多少只袜子才能确保你有一双匹配的袜子?
如果你拿出三只袜子,即使概率是 50%,它们也可能是同一种类型。概率永远不等于现实。因此,要“确保你有一双匹配的袜子”,唯一的方法是拿出至少 11 只袜子。
37) 如何确保你写的代码能够处理各种错误情况?
我可以编写测试来定义预期的错误情况。
38) 解释线程和进程的区别?
进程是计算机程序的实例。在一个程序中可能有一个或多个线程。
39) 说出 EXE 和 DLL 的区别?
exe 是一个可执行程序,而 DLL 是一个可以被程序动态加载和执行的文件。它是程序的外部代码存储库。由于两者都是不同的程序,因此可以重用同一个 DLL,而不是将其代码包含在自己的文件中。它还减少了所需的存储空间。
40) 什么是强类型和弱类型?哪个更好?为什么?
强类型在编译时检查变量的类型。另一方面,弱类型在运行时检查系统类型。其中,强类型总是更受青睐,因为它能最大限度地减少错误。
41) 描述接口导向、面向对象和面向方面编程的区别。
- 接口编程是基于契约的。
- 面向对象是一种编写具有单一目的的粒状对象的方式。
- 面向方面编程是将代码进行区分,以便各种对象承担主要任务,而辅助任务由独立的对象承担。
42) 为什么使用 catch (exception) 总是错误的?
这是一个坏主意,因为:
- 由于没有定义变量,因此无法读取异常。
- 当你知道异常类型时,使用异常是好的。
43) 通过 HTTP 标头传递什么类型的数据?
脚本和元数据通过 HTTP 标头传递。
44) 如何确定需求的优先级?
首先,你需要通过评估数据结构来设计系统。然后你应该转到支持它所需的代码结构。
45) 给出面向对象设计和基于组件设计的区别?
面向对象设计可以在一定程度上轻松地封装到基于组件的设计中。
46) 何时使用多态性?
当继承类时需要覆盖功能时,将使用多态性。它是关于共享类和共享契约的。
47) 堆栈和队列的区别是什么?
- 队列总是先进先出。
- 堆栈总是后进先出。
48) 测试代码质量的关键是什么?
在我看来,单元测试框架对于测试代码质量至关重要。
49) 您认为软件维护是否昂贵?
在我看来,如果我们使用正确的开发流程,软件维护永远不会昂贵。
50) 给出标签和分支的区别?
标签用于版本发布,是用于此目的的临时持有位置。但是,当更改合并到主干时,分支会被删除。
51) 受保护的类级别变量在哪里可用?
派生自基类的任何子类都可以访问受保护的类级别变量。
52) 是否有可能为单个 try 语句执行多个 catch 块?
是的。可以为单个 try 语句执行多个 catch 块。
53) 何时需要将类声明为抽象?
在以下情况下,我们应该将类声明为抽象:
- 当类继承自抽象类,但并非所有抽象方法都已被重写时。
- 当类中的至少一个方法被声明为抽象时。
54) 开发一个算法,输出您当前的位置以及该区域的 ATM 位置列表。找到离您最近的 K 个 ATM。
创建一个 getDistance(a, b) 方法,该方法计算 a 和 b 之间的距离。
代码
import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; public class PrioRQueueExample { public static void main(String[] args){ PriorityQueue<Double> pq = new PriorityQueue<Double>((x,y)-> {Double z = y-x;return z.intValue(); }); PrioRQueueExample pqe = new PrioRQueueExample(); //Number of ATMs to return i.e. K int num_ATMs = 3; double curr_loc = 0.00; Map<String,Double> nallATMLocs = new HashMap<String,Double>(); //Map of ATM names and their distance co-ordinates nallATMLocs.put("atm1",45.0); nallATMLocs.put("atm2",78.0); nallATMLocs.put("atm3",54.0); nallATMLocs.put("atm4",64.0); nallATMLocs.put("atm5",35.0); nallATMLocs.put("atm6",42.0); nallATMLocs.put("atm7",57.0); nallATMLocs.put("atm7",1.00); nallATMLocs.forEach((atm,dist) ->{if(pq.size() < num_ATMs){ pq.add(pqe.getLocation(curr_loc,dist));} else{ if( pq.peek() > pqe.getLocation(curr_loc,dist)){ pq.poll(); pq.add(pqe.getLocation(curr_loc,dist)); } } }); pq.forEach(atmLoc -> System.out.println(atmLoc)); } private double getLocation(double curr,double atm){ return atm - curr; } }
这些面试问题也将有助于您的口试