Categories
程式開發

2020年最常见的25个Web开发面试问题


本文最初发布于Medium网站,经原作者授权由InfoQ中文站翻译并分享。

你把闹钟设定在了下午2:45。

Web开发面试预定在下午3:00开始。

你耐心而紧张地看着时间一点点流逝,神经都绷得死死的,两手不知不觉间微微颤抖,等待着手机铃声响起的一刻。你在想面试官会对你抛出一堆什么样的面试问题。你的精神越来越脆弱,汗珠一滴滴落了下来。“我真的为这次编程面试做好准备了吗?”你开始质疑自己。

你看了看手机——下午3:05。没有未接来电。什么都没有。

你着急地再次确认了一遍——下午3:15……还是沉默。

你在压力下已经过了半小时,满头大汗,默默地抱怨,心跳声清晰可闻。你开始胡思乱想,突然惊慌失措……是电话号码填写错误了吗?还是他们干脆把你忘了?

你的脑海里爆发了激烈的战斗,想要克服焦虑的情绪。希望之火快要熄灭了,你抓起满是汗水的手机,最后再确认一遍……然后,它响了。

立刻接通,说出“你好”二字,试图掩盖颤抖的音调,压制嘴唇和手指的抖动,同时与脑海中涌起的紧张感搏斗。彼此介绍已毕,然后是……针对Web开发人员的五花八门的面试问题让你措手不及,你的答案几乎没一个像样的。

你意识到自己已经搞砸了。排山倒海的焦虑感迎面袭来。你感觉胸口压了一块大石,连呼吸都成了困难。头晕眼花,突然什么都想不起来了。你忘了自己在哪里,在和谁交流……什么都忘掉了。双手被汗液浸湿,连握住手机都成了难事。

你知道,想要留下好印象的机会已经十分渺茫了,如果事前的准备能更充分些,或许结果就不会那么糟了。

为避免这种情况,你需要为下一次编程面试做足准备。你需要大致了解对方会问出哪些针对Web开发人员的面试问题。在参加电话或现场面试之前,这样的准备工作可以增强你的自信,并减少焦虑情绪。

在本文中,我将讨论开发面试流程背后的规则——面试官最可能问哪些问题?如何漂亮地给出回应,让苛刻的他们点头称赞?

软件开发面试是一种谈判

首先,你需要意识到Web开发面试更像是一场谈判。你可能从小就被教导要在面试过程中无懈可击,并准确回答所有问题,这样才能给面试官留下好印象,拿到工作。

现实根本不是这么回事。

当然,你肯定要给人留下深刻印象才行。但是,如果你觉得面无表情地盯着你的面试官,然后像机器人一样回答所有面试问题……就能留下好印象的话,你的误会就大了。

你需要与未来的雇主轻松地交流,同时展现出自信、知识和好奇心,最重要的是热情。

雇主在招聘员工时主要会考虑以下内容:

  1. 性格。
  2. 基本资格。
  3. 文化认同。
  4. 热情。

你的性格需要有足够的适应性,意思是说你应该能轻松与团队打成一片。你还要提出清晰明确的问题,并对面试官的提问给出详尽的答案。

当然,你还需要具备符合岗位要求的基本资格。似乎很多人都将注意力集中在了这一点上(这当然没错),但这只是整个等式中四分之一的部分。

文化认同——这与你的性格息息相关。你必须能够与团队保持同步,并融入团队认可的文化氛围。

最后,对工作充满激情。你会发现这种热情的影响力多么惊人。

比如说,你的简历可能不如其他竞争对手那么亮眼。但如果你表现出强烈的热情,愿意全力以赴,那就可以击败其他求职者赢得工作。当然,这一套并不是每次都行得通。不过雇主一般更有可能雇佣热情满满的员工。

下面,我们就来看一看你可能会遇到的一些最常见的Web开发面试问题(和答案)。首先从专业软件工程师的行为问题开始,然后转向更偏技术的问题。

无论你是前端,后端还是全栈软件开发人员,这些常见的计算机科学面试问题都会帮助你为下一次编程面试做好准备。

注意:某些行为问题在Web设计面试中也会遇到。因此如果你是Web设计师,那么本文也能帮你备战下一次Web设计面试。

你开始编程的契机是?或者为什么你选择了软件开发这个职业?

多数面试官会从介绍性问题问起。应对这些软件工程师面试问题时,只需照常回复即可。尽量坦诚地回答。告诉他们是什么激发了你对编程的兴趣,以及为什么你要申请这个职位。

到目前为止,你的编程经验有多少?

如果你正在申请入门级的Web开发人员工作,由于你可能刚刚毕业或刚从培训班出来,面试官不会要求应聘者有多年经验(他们甚至可能会跳过这个问题)。但是,如果你要应聘的是高级软件工程师,则需要有多年的经验打底才能应聘这个Web开发岗位。

你熟悉敏捷方法吗?

你需要熟悉诸如看板和Scrum之类的敏捷框架,因为今天的公司都在采用敏捷实践,并逐渐淘汰瀑布流模式。面试官还可能问你有关SDLC(软件开发生命周期)流程的问题。

你正在使用哪些编程语言?

问题很简单。你应该重点提到那些Web开发工作用的最多的语言。

如今,拥有多种语言(例如C++JavaPython)的开发经验肯定会给你的面试官留下深刻的印象。

你最擅长的语言是什么?

坦率回答,并给出具体解释。有时,面试官可能会进一步询问:“使用这些语言时你会感到兴奋吗”,但这种情况很少见。你的答案当然应该是肯定的,然后说明你为什么会感到兴奋。

你是否有兴趣进一步发展自己的技能?

这更偏向于一个软技​​能问题。软件工程是一项工作,你需要不断提升自己,增强自己的技能水平。雇主想看到的是,他们的开发人员擅长最新的技术并在不断打磨自己的技能。因此,这个面试问题的答案显然是肯定的,你还可以多谈一谈你在学习新的编程技能时最感兴趣的内容。

你最喜欢从事哪些类型的项目?

谈一谈与你应聘的岗位类型接近的那些项目。如果你没有类似的案例,那就坦诚相待,并告诉他们点燃你对软件开发的激情的因素都有哪些。

谈一谈你最引以为傲的软件工程项目。你在其中具体有哪些出色的表现?

问到这个问题时,面试官想要听到的答案应该涉及一些非常困难的挑战,你的团队里很少有人能应付这些挑战,而解决问题的就是你。要记住,关键在于不要讨好面试官,对方很容易就能看出来的。你会给人留下糟糕的印象。谈到那些只有你才能解决的问题时,语气要轻松自然。这里的要点是你应该展现自信和头脑,并谦虚地回答问题。

谈一谈你最失败的软件开发项目。再来一次的话你会怎么做?

这又是一个软技能问题。生活就是不断吸取教训的过程。尽可能坦诚,公开承认你过去犯了哪些错误。谈谈你学到了什么教训。总之,请告诉对方你是怎样应对最失败的经历,并变得更加强大的。

你对我们公司了解多少?

面试之前要做足功课。浏览他们所有的社交媒体资料,找出那些能让你的面试官印象深刻的边缘信息。对公司表现出热情。热情在面试过程中起着重要作用。

你是否对我们公司的某个项目感兴趣?

和上面一样——在面试之前做足研究和分析工作,表现出你的热情。告诉面试官你为什么想要参与那些项目。这样他们就能知道你的热情背后有着怎样的动力,并且知道你不是在特意讨好他们了。

上面这些Web开发面试问题可能出现在电话面试中,也可能会在现场问到。

下面的技术面试问题通常会出现在现场面试里,但有时也可以在远程面试时提到。如果是远程的情况,面试官会要求你共享屏幕,看你怎样一边写代码一边回答面试问题。

请记住,你会被问到的技术问题类型在很大程度上取决于你申请的岗位类别。我们将尝试覆盖一些最常见的软件开发面试问题,并给出合理的答案选项,这样你就可以根据自己的情况做调整了。

技术面试问题

你如何管理类模块和资产?

编写程序的方法有很多,而且没有对错之分。你想加入的公司可能有一套编写代码的标准,并且可能会将你的答案与他们的标准做比较。通常,大多数公司都希望聘用习惯最简单编程方法的开发人员,并对那些喜欢复杂方法的应聘者敬而远之。这是因为公司都希望能轻松维护代码和编写文档。

具体讲一下AJAX(JavaScript)。能谈一谈你上次使用它的情况吗?

当面试官问你这类软件工程师的“解释性”问题时,重点实际上不是要背定义,而是告诉对方你在编程中是怎样用这些技术的。这会告诉面试官你实际上可以“思考”,并展示出你编程的方式。

AJAX是”异步JavaScript和XML”的缩写。AJAX是一种借助XMLHTMLCSSJavaScript创建更好、更快、更具交互性的Web应用程序的技术。

你如何向非技术背景的利益相关者解释API的概念?

API是不同软件产品之间的通信使者。它让各个软件系统之间可以相互通信和同步。例如,你可以使用Facebook的API在你自己的网站上显示你在Facebook发布的帖子,并允许人们直接在你的网站上共享或评论你的帖子,无需切换到Facebook上。

解释非功能性需求和功能性需求?

非功能性需求描述了系统的类型(可访问性、可维护性、安全性)。而功能需求描述了系统的特定功能细节。

黑盒测试和白盒测试有什么区别?

黑盒测试仅用于在给定输入的情况下建立正确的输出。相比之下,白盒测试还涵盖了这个功能的实现——测试它的实现是否正确。

可以谈谈模型-视图-控制器(MVC)架构吗?

它将数据与用户界面分离开来。MVC架构主要用于GUI应用程序。模型层包含数据,视图层将数据发送给用户,而控制器则是根据用户输入对模型进行更改。

什么是递归函数?

直接或间接调用自身的函数。递归会一直持续到函数到达一组参数,并返回一个值而非递归调用自己为止。递归函数可以很快地解决某些问题。

请以最简单的方式解释大O符号。

大O符号告诉我们一种算法有多快。无论你要评估别人的算法还是自己的算法,这都非常重要。

大O符号(也称为朗道符号)告诉我们函数的运行时或空间要求随输入增长的情况。也就是说算法速度不是以秒为单位,而是以操作数量的增长情况来衡量。

A*算法的机制?

这是一种广泛用于寻路和图遍历的计算机算法。它与一种启发式函数搭配,这种函数会估算从节点A到节点B的成本。每个步骤中的节点都挤在一起放在优先级队列中。

它使用公式f(n)=g(n)+h(n),将与起始节点相邻的每个节点及其成本估算值添加到队列中。g(n)是从起始节点到节点n的实际成本,而h(n)是启发式函数。在每一步,具有最低成本估算值f(n)的节点都会进一步扩展。当最后一个节点是扩展节点时,路径就完成了。

你对面向对象编程(OOP)有什么看法?

你可以在freeCodeCamp上参考这篇关于OOP的详尽指南。这篇指南细化解释了这个概念。

https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/

你的SQL技能怎么样?

也许数据库不是你工作的核心内容,但你也需要了解数据的结构。你谈到的SQL实践经验肯定会为你的Web开发面试加分不少。

编写一个函数来计算第N个斐波那契数。

以下代码段来自Geeksforgeeks。这是一个很好的例子。

https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/

在C++中:

//Fibonacci Series using Recursion
#include
using namespace std;
int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
int main ()
{
int n = 9;
cout << fib(n);
getchar();
return 0;
}
// This code is contributed
(Credits to Akanksha Rai)

反转一个字符串(str:String)

面试官要求你反转字符串时,并不是说他们会要求你在生产代码中实际实现reversed()。他们只想看看你是用什么方法来解决问题的。

显然,大多数大型技术企业都会向你提出算法问题,尤其是FAANG公司。

以下代码段来自Geeksforgeeks。它给出了一个完美的例子。

// A Simple C++ program to reverse a string
#include 
using namespace std;
// Function to reverse a string
void reverseStr(string& str)
{
int n = str.length();
// Swap character starting from two
// corners
for (int i = 0; i < n / 2; i++)
swap(str[i], str[n — i — 1]);
}
// Driver program
int main()
{
string str = “geeksforgeeks”;
reverseStr(str);
cout << str;
return 0;
}

归根结底,公司要找的是聪明的人。算法问题是一个很好的筛选手段,可以淘汰很多“愚蠢”的候选人。

一道编程题:

以前微软在面试中用过这道题,它是一道很好的编程题目。

你有一个介于1到N之间的N+1个整数的列表。你知道其中至少有一个重复项,但也可能有更多重复项。例如,如果N=3,则你的列表可能是3、1、1、3,或者可能是1、3、2、2。打印出一个不止一次出现在列表中的数字。(也就是说,在第一个示例中,你可以打印“1”或“3”,而不必同时打印两者。)

最明显的方法是将列表中的每个数字与其他所有数字对比,这个方法具有O(n²)的时间和O(1)的空间复杂度。

那么我们假设列表很大,所以你需要更快的算法。

我可以只使用一个布尔数组,然后使用整数值作为索引(时间复杂度为O(n))来遍历列表,数组/哈希的空间复杂度是O(n)。

假设列表特别大,所以你不能复制它。也许你有8GB的内存,而列表有6GB大。

我可以对数字排序并对比相邻的对。如果我使用像mergesort这样的原地排序算法,那就是O(n*logn)的时间复杂度和O(1)的空间复杂度。

如果你想要比O(n²)更快,又负担不起那么多额外空间,还无法操纵原始列表,该怎么办?例如,列表可能位于只读CD上。

(到这里,几乎所有人都需要一到两个提示。)

我想我可以二进制搜索重复的数字。例如,我遍历列表并统计1到N/2之间的整数数量。如果计数大于N/2,那么我就知道该范围内存在重复项。否则,重复项必然存在于N/2+1到N的范围内。一旦我知道重复项所在的那一半范围,我就可以在那一半进行递归和二进制搜索,然后继续重复该过程,直到找到重复的数字。时间复杂度为O(n*logn),空间复杂度为O(1)。

小结

写到这里就差不多了。无论你是初级Web开发人员还是高级软件工程师,都希望你能从本文找到有用的面试问题和答案。你可以再读一遍,以进一步增强信心。

请记住,你在Web开发面试中的表现并不会影响你的软件工程技能。如果你头几次搞砸了——没什么大不了的。只需准备下一次面试即可。最终,你将在自己梦寐以求的公司中找到一个职位,你所经历的所有面试都是有意义的。

如果你正在寻找DevOps工具(带有直观的问题跟踪器、git存储库、内置的CI/CD和可发布的文档),请随时尝试Codegiant(https://codegiant.io/home

原文链接:https://blog.codegiant.io/25-web-developer-interview-questions-and-answers-3030b21ae016