Sicheng’s blog

The Sicheng's blog

我所经历的欧美科技公司的面试

从 17 年 10 月份到德国工作,到现在 2022 年,四年期间我面试了很多家公司。作为程序员,时不时的去面试一下是非常好的习惯,这样你可以了解一下市场上的薪资水平如何,也可以了解市场上对于程序员的技能需求是怎么样的,毕竟软件工程师是一个需要不断学习的职业。还有一个好处是,面试需要的技能其实并不完全和你平时的工作紧相关,偶尔面试能让你不要完全忘记面试的技能。

每个科技公司的面试大致都由 4 – 6 轮构成,每一轮的内容各个公司都大同小异,但是各个公司,甚至不同的组侧重点都不一样,有些公司喜欢考算法多一点,有些公司喜欢问项目经验多一点。但是总体而言,基本上各轮面试都可能会有下面说的几种形式之一。

home work

有些公司在和HR聊完以后,在正式的技术面试之前会发一个 home work 给你做。往往是要求你完成一个小项目,完成以后把项目代码发过去。这种项目往往说不希望你花太多时间,最多也就两个小时,但是期望你的代码是 production ready , 并且有完善的测试。个人非常不喜欢这种技术面试的方式,因为不同于其他的面试方式,因为你不知道面试官的标准在哪里,所以这种小项目理论上你可以无限打磨的你的代码。

我要不要写这个测试?恩还是写吧,万一因为没有测试挂了呢。

我要不要写一个运行指引?恩还是写吧,万一面试官不知道怎么运行呢。

我还见过的 home work 里面给的代码有注释 this is just an toy project, so we take a short cut,但是给你的要求是 you should right production-ready code.

我曾经花了一个星期写了一个作业,最后倒在了谈薪资的那一轮。

所以我的建议是

如果不是非得找工作,尽量避免这种面试。如果决定面试了,就尽可能的把作业做的尽善尽美。花两三个小时搞一个半吊子的方案是肯定过不了面试官的 review,而且你还是浪费了时间。


算法

这种面试形式是经常见到的,也是被讨论最多的,关于如果准备算法面试我之前的博文了提到了。这种面试形式也是被讨论最多的,因为美国的科技公司的标准化面试都有 3 – 4 轮的算法题。我强烈推荐一个叫做花花的博主,他的题解是我见到的做的最好的。在这里我就不在累述了。

系统设计

系统设计我碰到过两种,一种是非常教科书般的系统设计题目,比如设计一个短链接服务,设计一个 Uber,  设计一个 Twitter 等等。这种没什么好说的,去 Github 上 system design primer 或者 Educative 上的 Grokking the System Design Interview 看看思路,然后尝试用自己的话给表达出来。另外一种比较有意思的方式是面试官往往要你设计一个他们正在做的项目,这种基本上没有标准答案,也是比较能考察出候选人的真实水平。比如我有一次在一个面试中,被问到如何设计一个用消息队列设计一个任务系统,聊着聊着面试官说他们现在就在用这个,但是遇到了A B C 问题。我正好又做过相关的工作,就给了几个解决方案,最后顺利的拿到了 offer。

Pair programing / low level design / OO design

不同于算法题,这种面试往往是要你打开 IDE 去写一小段代码,比如设计一个类,设计一个模块等等。我个人比较喜欢这种面试,这算是最贴近日常工作的一种形式了。比如这是一个典型的 low level design 的题目:

设计一个超市里面的扫码器,这个扫描器能扫描述货物的条形码,最后在结账的时候能够输出总金额。

这种题目往往用非常简单的文字描述,实际上面试官也考察候选人理清需求的能力。我作为面试官参加了很多次针对一个候选人面试以后的讨论,提到的最多的问题就是说这个候选人没有把问题给了解清楚就开始写代码了。回到刚刚那个题目,其实需要考虑的点挺多,比如金额怎么存,从哪里获取价格信息,最后输出的内容除了金额是否还需要明细等等。

这种题目往往不涉及到什么复杂的算法,但是在面试中过程可以真实考察候选人的真实的代码能力,例如代码的可测试性,代码结构的划分是否合理,测试案例的设计,变量函数命名的合理性等等。采取这种面试方法的公司还挺多,其实准备的方式也很简单,就是在平时的工作中,努力的提高自己的代码水平,不需要特地去刷题。这也是我作为面试者和面试官都喜欢这种面试方式的原因。我推荐一本叫做 A Philosophy of Software Design 的书,里面讲如何组织代码。


八股文

没错,国外科技面试也有面试八股文的,一般是小公司问的多。国外的八股文没有国内那么八股,因为其实面试官也是半吊子水平,动不动要你调优 JVM,操纵字节码等等。我的建议是对于平时工作中用到的框架,语言,数据库,中间件去做一些深入的了解而且不是只停留在 API 调用的层面,这是对一个资深程序员的最基本的要求。你在你简历上写到任何东西在任何一轮技术面试中都会被问到,你必须要对你简历上写的东西有足够了解。虽然现实情况是,很多人加入公司以后不是做一个新项目,技术选型早已完成,但是不妨自己问自己,如果现在这个项目刚刚开始,我应该如果选择技术框架,为什么要选择关系型数据库还不是 NoSQL 数据?

项目经历

项目经历往往是在各个面试轮之间穿插着问,因为实际情况是,你做的项目可能面试官也不了解,问不出什么东西。我唯一碰到的一次是有一个公司有专门项目经历轮,就是在一堆人面前讲一下你之前的做的一个你觉得有挑战的项目。我之前做过一个用 AWS Kinesis 实时报警的事情,并且写在了自己的英文博客上。当时面试的时候,就直接对着自己的博客文章讲了一遍,然后和面试官们讨论。这种面试形式不多,而且有时候也涉及的知识产权商业机密什么的,所以无需特殊准备。

行为面试

这种面试通常是由你的 hiring manager,也就是招人的 manager 来进行的。主要考察你的软技能,包括团队合作,为什么换工作啊。如果面试亚马逊,这种面试就是所谓的 LP (leadship principle),YouTube 上有一个博主专门讲亚马逊的 LP 面试。我对这种面试的感觉特别矛盾,一方面我不相信真的有那么完美的人,在工作中能够和团队亲密无间的合作,能够一直不断的提升团队的 bar,能够一直把客户放在第一,能够坚持自己的判断但是又能够虚心听取其他人的建议,等等。我在进行这种面试的时候,免不了要编故事,而且我也编得非常糟糕。但是另外一方面,这些好的品质确实是成为一个优秀的程序员所不可或缺的。 好比我之前的呆过的阿里,最后一轮面试都是 HR 的闻“味”环节,看看你有没有所谓的阿里味。这听起来很荒唐,但是等我到了阿里以后发现,那些晋升得快的人,阿里味都很足。


总结

以上就是我这几年参加过的面试中碰到的所有的方式,总得来说,想要顺利通过技术公司的面试,拿到心仪的 offer 主要分两方面。第一方面是平时工作中的积累,包括

– 对项目中用到的技术栈,语言,中间件,数据库特性的深入理解,有助于你进行系统面试。

– 对自己代码能力的不断提升。

– 多看看比自己级别高的同事是如何推进项目和技术决策的,看看自己能否推动一些技术决策。

另外一方面,可以在面试期间突击一下 LeetCode,这是硬功夫,也是游戏规则。

最后祝大家在虎年都拿到自己心仪的 offer,拿大包裹。

4 thoughts on “我所经历的欧美科技公司的面试

  1. 还有一个点是工作经历,会不会hr问你为什么跳槽这么频繁,这个事怎么回答好呢?我挂过一两次是因为这个。看作者也挺频繁的了。

    1. 在德国这边还好吧,大家不会太看重的。国内 HR 倒是喜欢这么 PUA 应聘者。我自己很少投简历,我都是把求职状态打开,这样 HR 会自己联系我,那么自然就不会介意这个问题了。

Leave a Reply

Your email address will not be published.