在网络上看到Andyy分享获得Facebook职务offer的经验谈,觉得他写的很有内容,再加上
我的朋友正在准备应征美国的软件工程师,因此把原文翻译出来跟大家分享。
想问板上的各位,以硅谷为目标的人多吗?
网页版:https://goo.gl/eYYsTU
纯文字:
获得硅谷的工作offer究竟有多难?来听听一位Facebook新进开发工程师分享面试经验!
“我刚完成7家硅谷不同科技公司的现场面试(2017年11月),最后选择接受Facebook给我
的offer。以下就来分享我如何准备面试,以及学到的心得。”
前往硅谷的遥遥路途》
当我还在澳洲的大学读计算机科学的时候,我就时常想着未来要在硅谷当软件工程师。硅
谷是新创科技的中枢,虽然也有许多胎死腹中的发明。这个目标让我很有冲劲,我不断向
前努力。
我之前的工作在墨尔本一家公司担任首席iOS工程师,离职后回到我的家乡伯斯进修充电
。我就在这个时候开始潜心准备前往硅谷的面试,开始走上这条万分艰钜的路。
如果你跟许多不同的软件工程师讨论起coding interview的话题,许多人的提出的想法会
与一般常见的面试做法相异。这些人所持的论调可能是觉得在coding interview(又称白
板面试)解决一道又一道算法问题跟软件工程师每天实际要做的日常庶务并不一样。
在这篇文章中,我不会触及这些讨论。相反的,我会从我自己亲身经历面试过程的观点,
来分享不同公司的面试文化与做法,并且将文章重点放在我从这过程中所学到的东西。
面试就像考试一样需要答题技巧》
在准备过程中,我一直知道想获得硅谷工程师的offer不是一件容易的事,但一直到我真
正开始进行面试过程后,我才体会到这真是比登天还难。
在投递履历的过程中,我有使用免费和付费的模拟面试服务,让我可以和有业界经验的人
先透过电话进行虚拟的coding interview。这样的练习对于承受实际面试的压力绝对是必
要的。不过以后见之明而言,模拟面试和真正的面试还是有相当大的距离。
如果你从未进行过模拟面试的淬炼就直捣黄龙应征你内心最爱的dream job,那么我可能
非常不建议你这么做。实际面试的紧张会全面性地影响你的表现,而这样的紧张只能经由
不断的练习来舒缓。
唯有借由持续不断的练习,你才会逐渐培养出面试时的自信。
我所遇到的不同面试关卡》
如果你已经充分准备并且在一开始的电话面试表现良好,那么你可能会获得实际参与
coding interview的机会。到场面试的流程可能长达4至6小时,依不同公司而有所差异。
这趟硅谷之行,我费尽苦心将7家不同的面试安排在同一次行程中,而这也让我对于目前
硅谷的面试生态获得第一手的资讯。
一般来说,现场面试会包含三个主题:算法、系统设计、人格特质,而我的事前准备也
同样是针对这三个主题。然而,有些公司并不是完全按照这样的安排,而会在面试时涵盖
更多实际操作技巧。
针对这些主题,我会在以下依序描述。
【算法面试】
这是最常见到的面试主题。面试官会请你在白板上解一个问题,借此判断你的专业知识是
否足够,包括资料结构、算法分类、递回、时地分析、模式与设想极端情况。在这一关
,你通常会先想到一个用暴力法解题的答案,然后再试着去改善这个答案并且提出不同解
法下可能需要的妥协。
这些内容是我准备面试过程中主要专注的方向,我每天不间断地准备了六个礼拜,在家里
挂一个白板不停地解题,分析时地复杂度,并且仔细研读每一行程式所起的功能。
对我而言,我喜欢在白板上做演算因为我不需要担心真正compile时的语法错误,而只要
专注在解决一个问题。有些人可能不喜欢在白板上算,但我的建议是,只要不断练习,你
对白板演算的想法可能会改观。
【系统设计面试】
这是面试中一个有趣的主题,而且是我事前准备低估的部份。面试官会请你设计一个系统
(在白板上),例如停车计费系统、即时通讯软件、社群动态等常见的系统。
在这一关,面试官要考核你的事你如何掌握一个大略的概念来设计出系统,并且系统要符
合所有的条件与限制。身为一个面试者,你的任务是询问正确的问题,协助自己厘清系统
应该要有的功能和面临的限制。面试进行像是一场对话,间歇参杂手绘图表与即席教学。
你需要表达的是抽象的概念与设计,而不需要真正写出可执行的程式。
当然,在对话进行的过程中,你要记得适时的在话语中展现对于系统运作的了解。如果你
是后端工程师,你不会真的去谈到客户端应用软件的机制等细节,除非你在那方面有累积
一些经验。我个人是iOS的工程师,所以我会尽量谈到系统架构、功能模组化、设计模式
等熟悉的领域,而不是扩张API端点、增加人力、云端运算服务等部分。
【人格特质面试】
面试官会问一些有关于你自己的问题,还有面对不同情境时会采取哪些行动。准备这一关
倒不像算法那么困难,但依然需要你重新检视有关于自己的过往经历。
问题可能会像是:
●你如何面对失败?
●你最大的弱点是什么?
●你如何解决冲突?
●如果能够重来一次,你会选择重做哪件事?
我认为要在这一关出包是满不可能的,但事实上,我听到许多人搞砸了这一关。他们可能
试着想把自己的优点装成缺点,打造一些他们认为面试官会想要听到的答案,或甚至把失
败的专案
怪到其他人头上。例如:
●我的缺点就是我太专注了
●那全是杰克的错,他在整个专案期间一直请病假
这些面试官都受过完整的训练,能够精准地看出废柴与废文。如果你试图用唬烂或欺骗的
方式度过这一关,基本上是把自己获得offer的机会拱手让人。试着做自己,展现你的真
诚、对工作的热诚,承认你的不足之处并且主动表示要如何改善,这样就足够了。
【企业文化匹配性】
这个主题通常会跟人格特质一起进行,主要是想确认你是否符合这家公司的企业文化与价
值。举例来说,Facebook信奉类似网络骇客的大胆与创造,从错误中尝试,不怕弃旧迎新
。然而,Airbnb的理念则是想要创造一个人们不管旅行到哪边都很有归属感的世界,所以
他们想要找的是很有主人风范与懂得待客之道的人才。
许多科技业龙头公司都很注重企业文化以及录用符合公司信念价值的人才。如果你面试的
公司也很看重企业文化匹配性,事先查询该公司的经营理念是很重要的。在你的过往事蹟
中找寻与这家公司价值有关的案例,让你能够完整的传递你的价值与该公司符合,并且在
面试时获得共
鸣。
【配对写程式】
一个满特别的面试关卡,你会跟另外一个工程师分配到一组,并且可以使用一台已经有开
发环境的电脑设备,就跟实际的工作环境类似。你会被分到一个任务,上面列有你应该达
成的项目。当你每完成一个项目,面试官会继续要求你增加更多的功能,直到测试时间用
完为止。你可以自由使用任何需要的资源,包括Stack Overflow或是线上文件。
我觉得能通过这一关的面试者通常是要有实战经验的。跟白板面试不同,你写出的程式必
须没有语法错误、compile成功,因此你对于语言和使用环境要非常的熟。否则,可能光
是在网络上找答案就会浪费你许多时间。
在我前一份工作,我很在意clean code,甚至专案定案后我会再进行最后一次编修让程式
的可读性趋近完美,也方便其他专案成员理解我的code。我的这个习惯让我在这一关有点
吃亏,因为我太早就进行最后的编修,让复原变得有点困难。我建议在这一关可以不用那
么在意clean code,只需要向面试官提及你在实际作业的时候会写clean code,但现在时
间有限无法顾及那么多,面试官是可以理解与接受的。
【除错与修补】
工程师的主要任务之一是接受多个来源的报错与修补。在这一关,你会拿到一张错误与修
补的清单,同时还要一面注意是否有未列在清单上的潜在错误。
我只有遇到一家公司有这个面试关卡,但我觉得这一关是很事前准备的,尤其对于刚毕业
的新鲜人或资历尚浅的工程师来说。每个程式环境都会有独特的注意事项与眉眉角角,我
自己在这方面的经验主要来自IDE(集成开发环境)以及过去几年来接触过的框架。
【测试领域专门知识】
写程式在大部分的主流语言中有很多是相同的。如果你会用物件导向的某种程式语言,那
么对于你学习另一种语言时也会很有帮助。
然而,这一关是在测试你特定语言与框架的知识,而非跨语言通用的部份。你会被问到和
特定环境有关的API、内存管理、容量、限制、发展史等知识。
这一关并不好准备。与上面提到的除错类似,我觉得这也是要靠实战经验。依照你所应征
的职位等级,你所提供的答案可能会占不同的权重。例如,如果一个应征初阶职位的人不
知道为什么API是以现在的模样所建构,那可能还无伤大雅。但是如果应征的是资深工程
师的职位,在这一关可能就会被扣不少分数。
【作业系统知识】
根据你所应征的职位或部门,你可能会有一关面试是专门在谈作业系统的。在这一关,你
被问到的问题是用来评估你对于电脑作业系统低阶语言运作模式的了解。
老实说,我没料到会有这一关。作业系统是我在年代久远的大学时修过的课,现在差不多
都还给老师,因此面试时的表现没有很好。
准备方向建议》
如前所述,面试就和考试一样需要答题技巧。即使你目前是一个在工作上表现很优秀的工
程师,或是在学校的成绩很好,那些成就不一定会反映在你实际面试时的表现。
坚持不懈,重复练习,始终如一的准备面试,才是能够影响你是否获得offer的关键因素
。
【至少要有的知识】
如果有人问我,面试准备应该专注在哪些领域?我会建议这些部份:
●练习用手写程式,先写好以后才放到IDE重新看一遍,将这个动作练到如呼吸一般自然
●钻研资料架构的知识,包括不同架构的优缺点比较。我发现从头开始学习建构资料可以
学到抽象概念以外的东西
●彻底了解大O(渐进符号)与时地复杂性,这会对你的算法与解题有帮助
●了解主流的排序算法,因为时地复杂性可能会影响到你用来解决算法的答案。
【准备时间要多久】
依照你的时程,你可能会希望早点或晚点开始。我面试的许多公司都有12个月内不接受再
次应征的规定。另一方面,如果你知道你一年内都不会完全准备好,那么还不如现在就开
始面试并且接受现实的洗礼吧!至少,你会知道实际发生的状况,等到你真的充电完成后
并准备开始“认真”面试时,内心对于面试流程已经有底了。
【别担心】
请相信自己做得到!
原文作者:Andyy Hope
原文连结:
https://medium.freecodecamp.org/software-engineering-interv…
本文为 Random English Everyday原创翻译,转载请保留出处
**