本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。
你把闹钟设定在了下午 2:45。
Web 开发面试预定在下午 3:00 开始。
你耐心而紧张地看着时间一点点流逝,神经都绷得死死的,两手不知不觉间微微颤抖,等待着手机铃声响起的一刻。你在想面试官会对你抛出一堆什么样的面试问题。你的精神越来越脆弱,汗珠一滴滴落了下来。“我真的为这次编程面试做好准备了吗?"你开始质疑自己。
你看了看手机——下午 3:05。没有未接来电。什么都没有。
你着急地再次确认了一遍——下午 3:15……还是沉默。
你在压力下已经过了半小时,满头大汗,默默地抱怨,心跳声清晰可闻。你开始胡思乱想,突然惊慌失措……是电话号码填写错误了吗?还是他们干脆把你忘了?
你的脑海里爆发了激烈的战斗,想要克服焦虑的情绪。希望之火快要熄灭了,你抓起满是汗水的手机,最后再确认一遍……然后,它响了。
立刻接通,说出“你好”二字,试图掩盖颤抖的音调,压制嘴唇和手指的抖动,同时与脑海中涌起的紧张感搏斗。彼此介绍已毕,然后是……针对 Web 开发人员的五花八门的面试问题让你措手不及,你的答案几乎没一个像样的。
你意识到自己已经搞砸了。排山倒海的焦虑感迎面袭来。你感觉胸口压了一块大石,连呼吸都成了困难。头晕眼花,突然什么都想不起来了。你忘了自己在哪里,在和谁交流……什么都忘掉了。双手被汗液浸湿,连握住手机都成了难事。
你知道,想要留下好印象的机会已经十分渺茫了,如果事前的准备能更充分些,或许结果就不会那么糟了。
为避免这种情况,你需要为下一次编程面试做足准备。你需要大致了解对方会问出哪些针对 Web 开发人员的面试问题。在参加电话或现场面试之前,这样的准备工作可以增强你的自信,并减少焦虑情绪。
在本文中,我将讨论开发面试流程背后的规则——面试官最可能问哪些问题?如何漂亮地给出回应,让苛刻的他们点头称赞?
首先,你需要意识到 Web 开发面试更像是一场谈判。你可能从小就被教导要在面试过程中无懈可击,并准确回答所有问题,这样才能给面试官留下好印象,拿到工作。
现实根本不是这么回事。
当然,你肯定要给人留下深刻印象才行。但是,如果你觉得面无表情地盯着你的面试官,然后像机器人一样回答所有面试问题……就能留下好印象的话,你的误会就大了。
你需要与未来的雇主轻松地交流,同时展现出自信、知识和好奇心,最重要的是热情。
雇主在招聘员工时主要会考虑以下内容:
性格。
基本资格。
文化认同。
热情。
你的性格需要有足够的适应性,意思是说你应该能轻松与团队打成一片。你还要提出清晰明确的问题,并对面试官的提问给出详尽的答案。
当然,你还需要具备符合岗位要求的基本资格。似乎很多人都将注意力集中在了这一点上(这当然没错),但这只是整个等式中四分之一的部分。
文化认同——这与你的性格息息相关。你必须能够与团队保持同步,并融入团队认可的文化氛围。
最后,对工作充满激情。你会发现这种热情的影响力多么惊人。
比如说,你的简历可能不如其他竞争对手那么亮眼。但如果你表现出强烈的热情,愿意全力以赴,那就可以击败其他求职者赢得工作。当然,这一套并不是每次都行得通。不过雇主一般更有可能雇佣热情满满的员工。
下面,我们就来看一看你可能会遇到的一些最常见的 Web 开发面试问题(和答案)。首先从专业软件工程师的行为问题开始,然后转向更偏技术的问题。
无论你是前端,后端还是全栈软件开发人员,这些常见的计算机科学面试问题都会帮助你为下一次编程面试做好准备。
注意:某些行为问题在 Web 设计面试中也会遇到。因此如果你是 Web 设计师,那么本文也能帮你备战下一次 Web 设计面试。
你需要熟悉诸如看板和 Scrum 之类的敏捷框架,因为今天的公司都在采用敏捷实践,并逐渐淘汰瀑布流模式。面试官还可能问你有关 SDLC(软件开发生命周期)流程的问题。
问题很简单。你应该重点提到那些 Web 开发工作用的最多的语言。
如今,拥有多种语言(例如 C++、Java 和 Python)的开发经验肯定会给你的面试官留下深刻的印象。
坦率回答,并给出具体解释。有时,面试官可能会进一步询问:“使用这些语言时你会感到兴奋吗”,但这种情况很少见。你的答案当然应该是肯定的,然后说明你为什么会感到兴奋。
这更偏向于一个软技能问题。软件工程是一项工作,你需要不断提升自己,增强自己的技能水平。雇主想看到的是,他们的开发人员擅长最新的技术并在不断打磨自己的技能。因此,这个面试问题的答案显然是肯定的,你还可以多谈一谈你在学习新的编程技能时最感兴趣的内容。
谈一谈与你应聘的岗位类型接近的那些项目。如果你没有类似的案例,那就坦诚相待,并告诉他们点燃你对软件开发的激情的因素都有哪些。
问到这个问题时,面试官想要听到的答案应该涉及一些非常困难的挑战,你的团队里很少有人能应付这些挑战,而解决问题的就是你。要记住,关键在于不要讨好面试官,对方很容易就能看出来的。你会给人留下糟糕的印象。谈到那些只有你才能解决的问题时,语气要轻松自然。这里的要点是你应该展现自信和头脑,并谦虚地回答问题。
这又是一个软技能问题。生活就是不断吸取教训的过程。尽可能坦诚,公开承认你过去犯了哪些错误。谈谈你学到了什么教训。总之,请告诉对方你是怎样应对最失败的经历,并变得更加强大的。
和上面一样——在面试之前做足研究和分析工作,表现出你的热情。告诉面试官你为什么想要参与那些项目。这样他们就能知道你的热情背后有着怎样的动力,并且知道你不是在特意讨好他们了。
上面这些 Web 开发面试问题可能出现在电话面试中,也可能会在现场问到。
下面的技术面试问题通常会出现在现场面试里,但有时也可以在远程面试时提到。如果是远程的情况,面试官会要求你共享屏幕,看你怎样一边写代码一边回答面试问题。
请记住,你会被问到的技术问题类型在很大程度上取决于你申请的岗位类别。我们将尝试覆盖一些最常见的软件开发面试问题,并给出合理的答案选项,这样你就可以根据自己的情况做调整了。
AJAX 是"异步 JavaScript 和 XML"的缩写。AJAX 是一种借助 XML、HTML、CSS 和 JavaScript 创建更好、更快、更具交互性的 Web 应用程序的技术。
API 是不同软件产品之间的通信使者。它让各个软件系统之间可以相互通信和同步。例如,你可以使用 Facebook 的 API 在你自己的网站上显示你在 Facebook 发布的帖子,并允许人们直接在你的网站上共享或评论你的帖子,无需切换到 Facebook 上。
大 O 符号(也称为朗道符号)告诉我们函数的运行时或空间要求随输入增长的情况。也就是说算法速度不是以秒为单位,而是以操作数量的增长情况来衡量。
这是一种广泛用于寻路和图遍历的计算机算法。它与一种启发式函数搭配,这种函数会估算从节点 A 到节点 B 的成本。每个步骤中的节点都挤在一起放在优先级队列中。
它使用公式 f(n)=g(n)+h(n),将与起始节点相邻的每个节点及其成本估算值添加到队列中。g(n) 是从起始节点到节点 n 的实际成本,而 h(n) 是启发式函数。在每一步,具有最低成本估算值 f(n) 的节点都会进一步扩展。当最后一个节点是扩展节点时,路径就完成了。
https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/
也许数据库不是你工作的核心内容,但你也需要了解数据的结构。你谈到的 SQL 实践经验肯定会为你的 Web 开发面试加分不少。
以下代码段来自 Geeksforgeeks,这是一个很好的例子。
https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
在 C++ 中:
//Fibonacci Series using Recursion
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)
面试官要求你反转字符串时,并不是说他们会要求你在生产代码中实际实现 reversed()。他们只想看看你是用什么方法来解决问题的。
显然,大多数大型技术企业都会向你提出算法问题,尤其是 FAANG 公司。
// A Simple C++ program to reverse a string
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;
}
归根结底,公司要找的是聪明的人。算法问题是一个很好的筛选手段,可以淘汰很多“愚蠢”的候选人。
以前微软在面试中用过这道题,它是一道很好的编程题目。
最明显的方法是将列表中的每个数字与其他所有数字对比,这个方法具有 O(n²) 的时间和 O(1) 的空间复杂度。
我想我可以二进制搜索重复的数字。例如,我遍历列表并统计 1 到 N/2 之间的整数数量。如果计数大于 N/2,那么我就知道该范围内存在重复项。否则,重复项必然存在于 N/2+1 到 N 的范围内。一旦我知道重复项所在的那一半范围,我就可以在那一半进行递归和二进制搜索,然后继续重复该过程,直到找到重复的数字。时间复杂度为 O(n*logn),空间复杂度为 O(1)。
写到这里就差不多了。无论你是初级 Web 开发人员还是高级软件工程师,都希望你能从本文找到有用的面试问题和答案。你可以再读一遍,以进一步增强信心。
请记住,你在 Web 开发面试中的表现并不会影响你的软件工程技能。如果你头几次搞砸了——没什么大不了的。只需准备下一次面试即可。最终,你将在自己梦寐以求的公司中找到一个职位,你所经历的所有面试都是有意义的。
如果你正在寻找 DevOps 工具(带有直观的问题跟踪器、git 存储库、内置的 CI/CD 和可发布的文档),请随时尝试 Codegiant。
参考阅读:
https://blog.codegiant.io/25-web-developer-interview-questions-and-answers-3030b21ae016
InfoQ 读者交流群上线啦!各位小伙伴可以扫描下方二维码,添加 InfoQ 小助手,回复关键字“进群”申请入群。大家可以和 InfoQ 读者一起畅所欲言,和编辑们零距离接触,超值的技术礼包等你领取,还有超值活动等你参加,快来加入我们吧!
点个在看少个 bug 👇