四、资深工程师、应届生和实习生

原文:Chapter 4: Experienced Engineers, New Grads, and Interns

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

这是我们的“Google面试准备系列完全指南”的第四章。

我们的读者有着完全不同的背景。有些已经在业内一段时间了,有些是国际学生,有些正在寻找谷歌的实习。

准备过程可能会有很大的不同,取决于你的背景和目标。 这就是为什么在本章中,我想为每种面试者提供更具体的提示。

基本上,我把面试者分为三类:资深工程师,新毕业生和实习生。 如果你正在寻找管理职位,这篇文章不适合你。 另外,如果你还没有阅读以前的章节,我强烈建议你看看他们。

相似和不同

无论你的背景是什么,面试过程在内容和形式上差不多。例如,无论你经验丰富或缺乏经验,你总会被期望写出可靠的代码。

基本上,像 Google,Facebook,Uber 这样的公司的面试主要集中在数据结构,算法,系统设计和测试(我不涉及沟通这样的非技术部分)。让我把它们在这里拆解一下:

  • 数据结构。候选人应该非常熟悉树,哈希表,栈/队列等所有基本数据结构。一个很好的例子是,如果你正在实现一个 BFS,你应该清楚使用哪个数据结构。
  • 算法。如果面试官要求你逐层遍历树,你知道使用哪种算法吗?而且,许多人往往忽视的是时间和空间的复杂性。我想说,如果候选人在分析复杂性方面有困难,我很难给他/她一个好的分数。
  • 测试。确保代码能够正常工作是非常重要的。有些人甚至是 TDD 的铁杆粉丝。在练习编码问题时,总是问自己如何测试你的解决方案?你会提供哪些测试用例?作为一名面试官,我通常会寻找能够覆盖这些角落案例的候选人,并且能够将代码模块化以便于测试。
  • 系统设计。这是高级和低级工程师之间的一大区别。设计一个可扩展和健壮的系统并不是一件容易的事情。我们很快就会在整个章节中讨论这个话题。

实习生的系统设计通常是可选的。但是每个人都需要数据结构,算法和测试。

此外,即使提出同样的问题,企业对学生的期望通常也较低,这是合理的,因为他们没有太多的工作经验。

作为一个面试官,我通常会问类似的问题,不管背景如何。对于实习生,我可能会选择比较容易的问题,但是我肯定会要求大家写代码。

应届生和实习生

事实上,在面试准备方面,我并没有看到应届生和实习生之间的过大差异。 虽然实习生可能门槛更低,但面试过程是完全一样的。

专注于数据结构/算法

如果你精通基本的数据结构/算法,你至少完成了 80%。 我并不夸张。 这是因为没有人期望学生有太多的工作经验,所以公司只能测试基础知识。 另外,拥有扎实基础通常是面试官寻找的第一件事。

在我看来,如果学生对基础知识非常熟悉,那就意味着他知道自己的代码,他知道自己在做什么。

因此,在这个领域花尽可能多的时间和精力。 回顾你的教科书并练习足够的编程问题。 如果有什么捷径的话,一定要把重点放在基础上。

项目和实习

虽然面试官的期望值较低,但如果你做了一些很酷的项目,那真的会很不一样。 如果是课程项目,个人项目或实习,也没有关系。

在面试开始时,你通常有机会介绍自己,并简要解释你之前的一些“经验”。 之前的实习会很棒,因为这表明你之前从事过真正的项目。

如果距离面试还有很长的时间(半年以上),那么做一些项目,而不是仅仅做一些编程问题,确实是值得的。 另一个好处是准备系统设计面试真的很有帮助,我们很快就会在后面的章节中讨论这个问题。

另一个任务是花时间准备你的介绍。 找出你想突出显示的项目,并使你的语言清晰易懂。 不要以为面试官具有所有的背景。

资深工程师

最大的陷阱

在进行了大量的面试后,我得出结论:应届生在编程问题上总体胜过资深工程师。

每个人都知道,如果你已经在工业界工作了一段时间,你可能会发现一些编程问题棘手,难以解决。而且真的需要一些时间才能回忆起你过去所做的所有事情。

更重要的是,一旦你写了大量的生产代码,你就会有一种错觉,就是你可以很容易地破解所有的编程问题。但是,这不是事实,因为我们必须承认,编程问题与真实项目还是有很大不同的。

从这个角度来看,作为一名资深工程师,高估自己的面试技巧是非常危险的。你应该做一个新手来准备,并且脚踏实地。

以往的经验

资深工程师最大的优势之一是有以前的工作经验。但是,并不是每个人都知道如何最好地使用它。

在每次面试的开始,候选人通常有机会谈论他们过去的工作。很多人不理会这个,这是最大的错误之一。

作为一名面试官,如果候选人对新工作做了一些神奇的或非常有意义的事情,我会留下深刻的印象。换句话说,如果一些项目既不相关又不神奇,不用费神去说明。我见过这么多人不停地谈论他过去的工作,其中大部分都是无聊的。

底线是你至少应该花一些时间准备介绍。经验法则是针对不同的公司和不同的团队准备不同的故事。显示过去所做的相关事情确实是一个加分项。

时间管理

本章中我还会简要讨论时间管理,因为很多人抱怨由于作业或当前的工作,他们没有时间准备。

一般来说,学生是否有更多的时间准备,这很难说。但事实是,简短的时间表总是更好。让我详细解释一下。

有些人喜欢做一年的计划,每天只能花半小时或者没有时间。另一种方法是将你的计划挤压到三个月的时间,但每天都花费很多时间。后者通常效果更好。

对于学生来说,我知道总有课程项目或期末考试会消耗掉你的所有时间。尝试每天分配 3-4 小时。可能是早上 2 小时,晚上 2 小时。或者你可以根据你的课程调整时间表。但关键是持之以恒。如果偶尔因为某些原因而停止准备一周的话,它将不起作用。说实话,面试官不关心你的 GPA,只要它不是非常低。你应该优先考虑一切。

对于有全职工作的人,你最好利用你早晚的时间。很少有人可以提早起床,做一些工作,这是你区别于其他候选人的原因。另外,面试之前的几天,如果可能,请休息几天。

持之以恒是我在这里给出的最重要的建议。

总结

有时候,资深工程师和学生之间的差异完全在于心态。

应届生/实习生对面试太害怕了,因为他们认为他们对软件构建一无所知。 但是,由于期望低,只需要有一个扎实的计算机科学基础。

同样,资深工程师往往高估自己的面试技巧,因为他们每天都在写代码。 事实是,他们比学生更可能在编程问题上失败。

无论你的背景是什么,关注你可以改变的事情,像练习编程问题和准备你的介绍。

顺便提一下,如果你想得到资深的面试官的更多指导,可以查看 Gainlo,以便与 Google,Facebook 等公司的工程师进行模拟面试。