0%

最近的海外面试(前端)经历

从去年 10 月开始投简历到今年 1 月为止,这三个多月的时间我断断续续面了五六家海外的公司,主要集中在欧洲和澳洲,面的都是前端开发的职位。这里就介绍下整个面试经历,希望对有同样想法的同学有所帮助。

做简历和写求职信

简历大家自然都有,这里我要说的是如果要找海外的工作,最好在LinkedIn上维护一份详细的英文简历,不管你是否打算在 LinkedIn 上投简历,这都是很有用的。

  • 首先,很多公司在投简历的时候不要你发送的 PDF 简历,而是要求你在它自己的网站上填写一堆信息(想想国内的一些国企就知道了),包括教育经历、工作经历、项目经验等等,每次都填不得闹心死。而 LinkedIn 的好处就是,作为全球最主流的社交求职网站,绝大部分让你手填简历的网站都是支持从 LinkedIn 导入的,所以,维护好 LinkedIn 可以让你一次填写多处使用。

  • 另外,还是有很多猎头或公司 HR 在 LinkedIn 上搜候选人的,比如我面 Facebook 的机会就是 HR 主动邮件联系我说在 LinkedIn 上看到的。

LinkedIn 上的简历可以要多详细写多详细,同时我觉得自己制作的 PDF 简历应该言简意赅,这点相信大家都有共识。我也做过简历筛选,就我自己来讲,我非常希望能有几个关键词或几个 bullet 就让我看明白候选人的优势。这一点同样适用于项目经历,我比较喜欢看到项目经历下面直接列几个 bullet,告诉我“这是个什么项目”,“你在里面贡献了啥”,“有什么重大的改进”等等。

这里安利下我的一个简历生成项目,只需要维护一份中英文的 JSON 文件,即可生成在线的 web 简历和 PDF 简历。

除了简历之外,国外很多职位在投递的时候会强制要求你写求职信(其实国内很多外企也有类似要求)。求职信(cover letter)一般就是介绍下“我对这个职位很感兴趣啊”,“我有很多经历啊”,“我的优势很适合这个职位啊”等等。与简历类似,我认为求职信也要言简意赅。比如说,第一段可以写写从哪看到这个职位,如何感兴趣,一两句话就行。最后一段可以写写希望能给面试机会好好聊聊,也是一两句话。最重要的中间一段我一般直接用 bullet 这么写:

1
2
3
4
5
6
7
Highlights of my career:
* 5+ years' experiences in Internet industry
* 3 years' experiences on Front end development, experienced in Angular.js, React
* Experienced in building a web app from scratch and doing unit/e2e testing
* Passionated on using CI to automate building/testing/deployment
* Specific focus on architectural improvement and workflow automation
* Love open source, check my github on https://github.com/PinkyJie

当然,内容要根据职位的 JD 做相应修改,反正就是在不撒谎的前提下把你的经历往 JD 的要求上尽量靠呗。

去哪投简历

准备好了简历和求职信,那么就开始搜职位投简历吧。我前前后后也试了很多求职网站,包括一些全球有名的求职网站如Monster,以及一些地域性的求职网站:

说实话效果都不是很好,感觉里面更多的面向本地人,你无法分辨这个职位到底想不想招外国人。一个偶然的机会我看到了StackOverflow Jobs,没错,就是那个大家常去的问答网站,它居然有一个 Jobs 版块,并且这个版块有非常适合找国外工作的筛选机制。直接上图吧:

图1

  • 出来筛选界面以后,点击其中的Perks选项卡,勾上其中的两项”Visa Sponser”和”Offers relocation”,这两项是最适合我这种海外求职者的,它们的意思是:

    • Visa Sponser: 是说公司会协助你办理签证,有的是全权帮你办理,有的是协助办理。当然,工作签证没有公司协助一般是不行的。但这句话表明这个职位是愿意招非本国公民的。
    • Offers relocation: 是说公司会给你报销从别的国家搬到公司所在地所产生的一些费用,有的还会协助你租房、融入当地生活等等。

图2

这两项就是为我们这种海外求职者量身准备的。

  • 除此之外,StackOverflow 还支持很多别的筛选,也很实用。比如下面的Tech选项卡里可以选择感兴趣的技术标签和不感兴趣的技术标签,这比直接搜职位名称要高效准确很多,可以准确匹配你想要搜的技术、库。另外几个选项卡有兴趣也可以自行探索,Compensation可以设置工资范围,Background可以设置工作年限,Compnay可以直接设置想搜索的公司名称。

图3

个人经验,StackOverflow 上的回复率非常高,我拿到的面试机会基本全部都是 StackOverflow 上投的。另外,有一种错觉就是会在 StackOverflow 上招聘的公司起码技术氛围还行吧。如果公司有大牛的话,在 StackOverflow 的公司介绍页面还可以看到他们的 StackOverflow 账号,“你将与下面这些人共事”。就地理位置上来说,StackOverflow 上的前端职位德国和荷兰比较多,这也印证了“柏林”和“阿姆斯特丹”是欧洲的 IT 中心之说。至于公司类型,可以说大公司小公司创业公司都有的,比如宝马总部慕尼黑在招自动驾驶算法工程师哦!

除了”Visa Sponser”和”Offers relocation”以外,有时还会看到”Provides Equity”,乍一看这是“提供公平机会”的意思,其实它的意思是这个职位有机会可以拿到公司的股票。另外有很多职位的名称上会包含(m/f)的字眼,这个意思是这个职位男女均可,很多德国的职位都会带这个。之所以如此奇怪是因为德语中很多职位名词男女是不一样的,比如“男秘书”和“女秘书”两个词是不同的,一般职位上只会写一个词,加上(m/f)(德语里是(m/w))就代表这个职位男女都招。回头专门写一篇吐槽德语的文章吧。。。

面试前的准备

投了简历后就等吧,被拒是很正常的,我就收到差不多二十封拒信,但一旦有面试机会来可要好好抓住。那如何准备面试呢?先来看看一般的面试流程吧,就我个人经验,一般的面试都会有三四轮甚至更多:

  1. 做算法题:一般是一些在线平台如CodilityHackerRank等,限时让你解题,在线提交代码。
  2. HR 面:跟国内差不多,问问简单的经历,然后来点 behavioral interview 等,但有的也会涉及简单的技术问题,国外的很多 HR 的 title 都是 Technical Recruiter。
  3. 技术面:一般长达两三个小时,会有不同的人轮流面,包括“共享屏幕敲代码”以及和简历项目相关的问题等等,基本跟国内差不多。

下面就从这三个方面说说如何准备面试。

首先来说说算法题,就前端来说我目前碰到的稍微复杂一点的算法题大部分都是考递归。当然,去刷一些复杂的算法题肯定是有好处的,但我觉得一个好的 js 基础加理解递归似乎更重要一点。这里我推荐两个 GitHub 上的库,可以做做看看。

  • js-bits: 详细讲解了 js 基础里的方方面面,建议可以配合示例代码好好理解。
  • exercises: 列举了一些常见的 js 面试题,有些简单有些复杂,可以自己写写试试。项目的设计很有意思,clone 以后,需要在每个文件夹里写index.js实现要求的函数,然后每个文件夹下有测试,测试跑通就过了。

当然 HackerRank 站点上本身有很多很多的题目可以做,可以自己注册个账号练练。除了多做题练习之外,还有几点也很重要。

  • 时间观念。目前我碰到的算法题在线测试环节都是限时的,一旦点击开始就没法停止,一般都是一两个小时左右的,所以一定要找自己能空出大把时间的时候来做。所有考试都一样,不要在一道题上花费大量时间,不会做先跳过就是了。
  • 熟悉界面操作。每个算法题网站有自己的编辑器,一般都是左边题目右边编辑器。第一次进入都会有一个教程指引你如何操作,一定要认真看(看教程是不计时的)。我的习惯一般是本地开一个 sublime,编辑好了本地用 node 跑跑,没问题了再复制代码上去。
  • 考虑边界情况。这些在线测试给你的示例测试数据一般都很简单,没有什么边界情况,但你提交代码后它会把你的算法在一堆数据上跑,这些数据你是看不到的,全跑过了才算通过。这就需要写代码时自己考虑各种边界情况。
  • 很多网站一道题只能提交一次。这点非常重要,一旦提交,你将没法再次修改代码,一定要谨慎提交。很多网站会有一个run和一个submit按钮,run就是用示例数据或自己添加的数据跑你的代码,可以多次,submit就是直接提交去跑看不到的数据。看指引的时候一定要看清楚是否允许提交多次。

下面来说说 HR 面,跟国内其实差不多,主要看自己的口语表达了。有几个问题是一定问会的,比如“介绍下自己的工作经历”,再比如 motivation,即“你为什么想要找一份海外工作?为什么对我们公司感兴趣?”,再比如“你理想的工作环境是怎么样的?”,可以好好准备准备。感觉介绍自己的工作经历这块挺重要的,我刚开始总觉得没啥介绍的,一二十秒就完事了,后来我总结了下,其实这个问题可以变成“每段工作经历中有什么特别难忘的事?”,这样自己可以多说说,对方也可以听得更有意思一点,更可以把自己的优势穿插其中,事半功倍啊。除了上面说到的问题,每家都有自己的其他问题,咋准备呢?这里推荐一个超级牛逼的网站:GlassDoor,一句话,这个网站就是公司界的大众点评,上面有各种 Review:公司评价、面试评价、薪水评价等等。这里说说前两个,面试评价自不用说,很多人会写到“问了哪些问题”,都可以作为提前准备的参考。另外一个公司评价也很有用,里面会写公司的 Pros 和 Cons,有的条目甚至 CEO 会亲自回复。这里不仅可以用来感知这个公司到底是否靠谱,更重要的是可以用里面的 Cons 来“反击”HR。因为 HR 面的结尾一般会问你是否有啥问题要问,人家都这么问了,你不问几个问题岂不是显得不尊重哈哈!这时可以说“看到公司有一些负面评价,请问你如何看待?”,虽然对方的解释可能很主旋律很官方,但我觉得这问题可以让对方觉得:你是有做功课的。

最后来说说技术面,这块就跟国内差不多了,一般是好几个人由浅入深的问。有的会涉及前面算法题环节你的代码及犯的错误,有的会针对你的背景问一些具体的库的使用一类的。关于这块的准备,我认为首先还是基础,可以以这个库Front-end-Developer-Interview-Questions里的问题为提纲自查下自己的基础是否牢靠,除此之外自己以前做过的一些项目代码可以拿出来看看,以免被问到一些细节。同样的,技术面的最后也会问你是否有问题要问,这个时候我最喜欢的问题就是“介绍下作为开发者在公司的一天是怎样的?”,这是一个很有意思的问题,你基本可以从中了解到公司的项目如何进行、开发流程、文化等等。我觉得歪果仁还是很喜欢发问的孩子的,而且面试时间就那么长,你多问几个问题,他们就可以少问你几个问题,是不是^_^

除此之外,还有一个问题不能忽视:时差!好多个国家不仅有时差,还有夏令时冬令时什么的,非常烦。这里推荐一个牛逼的网站:World Time Buddy,一目了然。

图4

不管是 HR 面还是技术面,一般都是事先邮件约好时间的,要么电话要么 Skype,建议事先把自己的 Skype 放过去让对方事先添加好,以防输错 SkypdId 查找不到的问题,可以告知对方查不到请直接打电话。

各个公司的面试经历

前面啰嗦了那么多,下面就详细说说我目前参与过的各个公司的面试经历吧,流水账式介绍。

Booking.com

Booking.com 是全球旅游住宿最大的网站了吧,总部在荷兰阿姆斯特丹,一直在海外招人。这个职位我是在Github Jobs上投的,后来发现 StackOverflow 上也有的。投了以后很快就给回信了,面试的流程是:
线上做题、HR 面、技术面、onsite 技术面(就是说最后一轮给你报销路费住宿去阿姆斯特丹面去吧)。由于自己准备非常不充分,只面了两轮就挂了。

第一轮的做题区别于前面说的算法题,他们完全考 HTML/CSS/JS/jQuery 基础,全是选择题,20 分钟做完。难度还是比较低的,基本是一些“inline 和 block 区别啊”,闭包,原型链一类的基础题。提交了答案第二天就约下一轮了。第二轮对方直接打电话过来的,问了下一些以前的工作经历,完事后玩命问 A/B 测试的问题,比如“怎么做 A/B 测试啊?测试结果如何评判啊?”等等,虽然不是特别难,但奈何很多东西我不知道如何用英文表示,当时已经被问懵逼的我连最简单的“转化率”这个词都不知道怎么用英文表达。。。果不其然,第二天就收到邮件说挂了。

总结下来,还是得好好看 JD 啊,虽然 JD 上确实写了要懂 A/B 测试,但我毫无准备加上我从来没做过 A/B 测试,所以最后懵逼了。所以说 JD 不是随便写的,准备面试时一定要对里面强调的东西引起足够重视啊。

mycs

mycs 是一家德国柏林的家具公司,其站点上有很多家具可视化的展示以及定制操作,感觉像是一家规模不大的创业公司。这家公司是我唯一面完所有流程而挂掉的公司(其他一般都是第二轮挂了),所以还是有很多东西可说的。

首先是他们的流程,没有 HR 面,就是两轮技术面+做一个小项目。这家公司是唯一问我类似“井盖为啥是圆的”这种开放式问题的公司,他们的问题是“你住上海是吧,上海有多少个公交车站,你能估算一下吗?”。由于口音问题,”bus stop”这个词我听了几遍没听懂,幸好我俩共享了屏幕,他就直接打出来了。听到这问题当时我就懵逼了,还带这样事的,当时我给的方案是:假设上海有 200 条公交线路,70%在市区,30%在郊区,市区平均有 15 个站,郊区平均 20 个站,市区比较繁华,不同线路公用 30%的公交站,郊区公用 10%。就这么算出了一个数字给他,当然里面的假设全是我瞎扯的。后来对方查了下维基百科还是啥的,发现我算的数字不对(那肯定了。。。),然后俩人讨论了下没算对的原因,里面的各种假设需要怎么调整等等,整个过程还是挺有意思的。接下来就是共享屏幕敲代码做题了,我俩用的 jsfiddle,我记得做了两道题:

  1. 两个数组,元素是单个字母,如[a, b, c][e, f, t],列举出两数组各取一个元素组合出的所有字符串的集合,并剔除重复项。
  2. for 循环里放一个 setTimeout,怎么把循环变量传到 setTimeout 的 callback 里去。

题目不难,做完后围绕第一题聊了下 performance 问题,如何减少循环次数,如何去重快一点等等。我当时只想到可以每个数组自己先去重再进行合并。。。后面又问了一些 angular 的问题本轮面试就结束了,马上就约了第二轮的面试。第二轮面试是个法国人,dev manager,第一次体会到法国人的懒散,约好的面试时间迟到了将近 20 分钟。。。第二轮感觉涉及前端的比较少,问了下什么情况下选用什么框架的问题,问了下以前的一个项目的前后端整体架构结构,然后问了些排序以及复杂度,比如“如何理解快排的复杂度”,最后问了一些后端的东西,具体的问题我也没啥印象了,只记得答得不太好。第二轮由于对方迟到面的时间不长,对方说下一轮是做题了,会给 6 到 8 小时做一个项目。约好了周末发给我做,结果这法国哥们太懒散,两周后才发给我,说是忘记了,而且还不是周末发的。。。这个项目也挺有意思的,对方直接在 Github 上把我加到一个私有项目里,这个项目是一个 Tic-Tac-Toe 的游戏(就是小时候玩的画个井字,一人画叉,一人画圈,谁先连成 3 个谁获胜),项目里只带了一个基于 express 的 API 定义以及一个单元测试,目标是让你完成 API 里调用的开局、下棋逻辑,保证测试通过并完善测试提高覆盖率,然后实现一个前端页面调用这个 API 保证游戏可以玩。这个考察的东西就很多了,我觉得是一个非常有意思的面试题,典型的 TDD 啊。做完以后发个 pull request,对方直接给 review 意见,然后再根据 review 修改提交。整个项目我唯一没完成的是电脑逻辑如何决定下一步棋画在哪个格子里,当时时间原因直接写了个简单逻辑:画在第一个空格子里。项目做完以后过了几天就收到反馈:被拒,原因是感觉我前端挺好的,但这个职位需要的后端知识没有其他几个候选人强。不过我最后也释然了:反正所有打着前端工程师的幌子招全栈工程师的都是耍流氓!

Zalando

Zalando 是总部位于德国柏林的一家时尚电商,在欧洲十几个国家都有业务,感觉像欧洲的唯品会。这家的面试流程中规中矩:算法题、HR 面、技术面。算法题有三道,有两个多小时,时间非常充裕。有一道我记不清了,其他两道是:

  • 一道是计算停车场收费,涉及简单的时间计算和分段计价。没啥难度,边界条件考虑好,细心就好。
  • 另一道比较有意思,给一个 HTML 页面,里面可能有嵌套列表,如 ul 包含 ul/ol,或 ol 包含 ul/ol。题目就是给定一个 HTML 页面,计算出最大的嵌套深度。递归即可搞定。

这家的算法题网站比较不同的就是“提交后立即显示结果”,所以做完后我就发现有一题我边界条件没考虑好,没拿满分。提交后过了几天就收到约第二轮面试,不过约了两周后我也是醉了。。。

第二轮就是 HR 面了,除了常见的问题以外,这家的 behavioral interview 类的问题问了特别多,我记得有:

  • 遇到过什么挑战,如何解决?
  • 同事们最喜欢你哪些地方?
  • 同事们觉得你有哪些不好的地方?你是如何解决的?
  • 同事的哪些行为最让你不爽?你是怎么应对的?
  • 如果你需要指出同事的缺点,你一般会怎么做?

当然,behavioral interview 的问题有一些技巧,但我觉得还是以自己的经历出发实事求是,针对每个问题能举一些自己身上的例子比较好。没什么答案是绝对的好与不好的,关键看自己咋表达了吧。最后 HR 还跟我聊到了亚洲人性格偏腼腆,不会直接表达等等。。。完事以后就约了下一轮面试了,也是终面:三个小时三个人技术面。

这家的技术面我觉得是最到位的,三个人分工不同,很有层次感。第一个人主要是聊了下前面算法题我做错的那道,我俩直接共享屏幕敲代码,对方把我错的代码复制过来,让我重新做。由于前面已经知道自己没考虑边界,一下就做出来了。针对这个题的代码,我们又聊了编码习惯,一个是我的变量命名不太直观,另一个因为我习惯字符串转数字用+号搞定。对方谈到写代码还是以可读性为主,我也举了几个例子表示赞同。后来对方又贴了一道题让我现在做,主要就是用原生 js 模拟 jQeury 的一些函数及链式调用,难度不大。休息了几分钟后第二轮就来了,感觉偏前后端整体架构。对方说了一个场景,需要开发一个留言审核系统,让我尽可能详尽的说说如何设计开发,包括前端页面布局、API 设计、DB 表设计,如何避免多人操作同一个留言等等。期间我还主动聊起来自动化测试的话题,说自己喜欢 TravisCI,然后共同语言来了,噼里啪啦浪费了几分钟面试时间。又休息了几分钟第三轮就来了,看我的简历用过两年 angular,玩命问 angular 的问题,比如“双向邦定如何实现的”,“ng-if 和 ng-hide 区别”,“如何优化长列表的渲染”,“track by 为何能加快渲染速度”等等,完了以后也聊了一会测试及自动化部署的问题。比较有意思的是,还剩十分钟的时候对方问我“你有问题吗?没有的话我再问你几个问题。。。”,我当然立马回答“有”啦!^_^ 最终又过了两周 HR 通知拿到 offer 了。

Atlassian

Atlassian 是总部位于澳大利亚悉尼的软件公司,可能很多人听名字比较生,但他家的产品是个程序都用过:JIRA, Confluence, SourceTree, Bitbucket,可以说是一家程序员非常向往的公司。这家的流程也是:算法题、HR 面、技术面,我只走到了 HR 面,说实话我至今没搞明白这家为啥拒了我。

这家的算法题是我面过这么多家里最难的,90 分钟做 5 道题,分值不同难度也不同,不需要全部做完。时间关系我只做了 4 道,做完第 4 道时已经只剩 5 分钟了,我看了下第 5 题的题目确定自己半小时也做不完就直接放弃了。5 道题我已经记不大清了,只说说我有印象的:

  • 有一道题,是自己定义了一种进制算法,让把一些输入的字符串按规则进行进制转换。参考二进制计算规则即可。
  • 还有一道题,控制一个吊车扔方块到一个棋盘里,车上有方块,定义了一堆命令如移动、下落等等,然后给定一串命令,打印出该串命令控制吊车后在棋盘拼出的图案代表的十六进制(?,记不清了,不确定)
  • 最后一道题,文本处理,给了一堆联系人信息,按指定规则提取。

没想到我虽然只对了 4 道题,对方依然给了 HR 面的机会。HR 面就让介绍了下以往经历,我就记得我吧嗒吧嗒说一堆,然后 HR 一直”it’s awesome”,谁知道过了一周直接一封拒信,我回信问原因也没理我。。。后来想想,可能跟我司以前招人理念差不多吧:这孩子还不错,就是没啥亮点。。。

GetYourGuide

GetYourGuide 是一家总部位于德国柏林的旅游预定网站。这家公司我本来非常感兴趣的,看公司的技术博客感觉氛围相当好,很喜欢组织技术分享,是柏林当地多个技术型 meetup 的组织方,但面下来这家给我的体验非常不好。先是约了面试时间留了 Skype,对方给了一个网站输入自己的 availablity(可以面试的时间),我选了一个时间提交后对方一直没反应,直到这个时间过了一天以后对方回邮件说我选的时间不在 9AM-6PM 之间。。。我当时就有点无语,没关系那我再选一个时间吧,我就告诉他我每天的某个时间段都是 OK 的。这次对方回了个邮件,安排了面试,但面试时间压根不在我给的时间区间里。。。我又回邮件说那个时间段我不行,重新安排吧,对方答应了我的新时间。氮素!我在约定时间等了 10 几分钟没人加我 Skype,然后就给对方发邮件问咋回事,一直到一个多小时后对方才回邮件说没法联系到我,关键是这一个小时我 Skype 一直在线啊。。。最后只好又约了下周新面试时间。万万没想到,过几天我收到一封邮件,里面堂而皇之的说“我们的技术人员和你聊过了,很高兴你花时间介绍你的经历,但我们觉得你不太合适这个职位”,尼玛,从头到尾没人面试过我啊。。。我当时真火了,立马回邮件骂了回去“我困惑了,没人面过我,你们的面试流程太不专业,太有问题了,这不公平”。对方答应了重新安排面试,经过这一番周旋,可算得到了面试机会。

第一轮是 HR 面,是个英国人,随便聊了下经历,聊得还挺开心的,介绍了下后面的流程:做项目、技术面、CEO/CTO 面。对方给的项目也很有意思,GetYourGuide 有一个公共 API,随机返回当前某个用户正在其网站浏览的旅游景点信息,包括用户名、景点名、经纬度信息,要求是做一个页面,将这些信息反映在地图上。一个不是很复杂的项目,我直接用了谷歌地图的 SDK,setInterval 请求 API 拿到信息,将这些信息以卡片加锚点的形式显示在地图上。代码提交以后,好几天没啥反应,后面偶然登了下 Skype,发现 HR 在 Skype 上给我留言:拒了,原因是技术觉得我做的项目用户体验不好,卡片弹出太频繁。。。当时我就有点不爽,首先,拒掉候选人不发邮件居然用 Skype。。。另外,卡片弹出太频繁这种不算是这个项目的重点吧,当然也可能是人家要求太高了。。。反正这家整个流程下来让我感觉不爽。

IRESS

IRESS 是一家总部位于澳大利亚墨尔本的财务咨询公司,我面的是悉尼的职位。流程同样是:算法题、两轮技术面、HR 面。算法题的题目我已经完全没印象了,只记得是 120 分钟 3 道题,时间很充裕,难度也适中。对方的反馈非常快,提交了代码没过几天就安排下轮面试,两个技术人员电话面,问了些 JS 的一些基础问题、ES6、angular 和 react 的渲染机制等等,结束后就立马安排了下一轮,说下一轮可能会涉及算法相关。第二轮同样是这两个人面,上来就问了一个问题:

你走进一个房间,里面有一堆螺丝和螺母,大小不一,怎样迅速让螺丝和螺母一一配对?

我本来还以为又是一个开放问题,想了半天也没找到方案,只能答说最笨的方法就是随便挑一个螺丝,然后一个一个螺母找呗。结果对方说如果从编程的角度来考虑有什么办法呢?我突然想到了二分查找法,随便找一个螺母,拿螺丝一个个试,比这个螺母小的螺丝放一堆,大的放另一堆,直到找到匹配的为止。这是第一轮循环,第二轮再随便找一个螺母,和第一轮的对比,比第一轮大就从大的一堆里找,小的话则从小堆里找。确定了堆以后,继续使用这种方法继续分堆,如此反复继续找下去。对方说,那就分析下这样的复杂度吗?我一听明白了,这有点类似“二叉搜索树”啊,用二叉树就能分析它的时间复杂度。于是就跟着这个讨论讲下去,分析最好与最差的情况。期间也饶了一些弯子,对方也会给一些提示,就这么磕磕巴巴的下来了。后来对方还问了一些关于前端安全的问题,XSS、CSRF 等等,我直接举了一些例子讲了讲就算过去了。由于澳洲比国内块三小时,面试都是早上进行的,中午 HR 就打电话过来,说技术面反馈很 positive,又随便问了一些 HR 问题,当天下午就给 offer 了。

Facebook

Facebook 不用介绍了,我面的是伦敦的职位。有意思的我虽然投过 Facebook 但一直没反馈,HR 说是在 LinkedIn 上看到我的。。。面试流程跟 Booking 很像:HR 面、一到两轮技术面、onsite 技术面。大厂果然都是这风范,最后一轮都是旅游面。第一轮面试都是随便聊聊经历,花了很长时间给我介绍了伦敦主要负责的广告业务,让我问了几个问题。最后问了一些 js 的基础问题:如 apply/call 区别,如何模拟堆和栈的操作,介绍下数组和对象等等,都是比较简单的问题。我心说这大厂 HR 都懂这些啊,上 LinkedIn 一查这个 recruiter,尼玛 UC 伯克利毕业。。。第一轮结束当场就约了下一轮面试,电话技术面,需要共享屏幕做题。第二轮是个做安卓的面的,我也感到很神奇。。。对方先是让做了一个简单的 HTML/CSS 设计:一张图片上放一个按钮,鼠标移上去就显示按钮,移走就隐藏。我就直接写 CSS 代码给他,然后他又加限制条件让做一些简单变化。完事以后就是 js 问题了:拍平一个嵌套数组,也是非常常见的递归,我直接写代码完成了。完事以后就围绕这个递归开始讨论,有什么性能瓶颈等等。我就在那一直讲整体的复杂度跟嵌套深度、数组长度有关等等,感觉没扯清楚,最后对方直接说,递归会导致 call stack 太深,导致性能问题。然后又加了限制说,不用递归怎么解。。。我想了半天没方案,最后对方给了点提示,试试一直调用 concat 看看,在他的提示下我也磨磨唧唧的写了出来答案。不过当时就感觉对方不太满意,随后让我问几个问题,我就问了下我常问的“开发者的一天”啊,“平时是否重视单元测试和集成测试”等等,第二轮就这么结束了。

虽然是伦敦的职位,但面试都是美国那边进行的,而技术面只能在 10AM 以后进行,也就是国内时间半夜两点,所以美国的时差跟我们还是很尴尬的,要么半夜面,要么早上七八点面,作为夜猫子的我选了半夜。。。第二轮面完后也就三点多了,一觉醒来就收到邮件说拒了。想想可能对方觉得“这种问题还需要提示,磕磕巴巴做半天,这孩子还是算了吧”。。。

面试小 tip

这里讲讲我自己总结的面试流程里要注意的其他一些点。

  • “共享屏幕敲代码”注意点啥?很多 HR 在约面试的时候就会在邮件里提醒你,我这里也总结几个点:
    • think out loud。这句意思就是说,拿到题以后别坐那一直想,啥话也不说。有想法就立刻说出来,即便想到解决方法也不要一上去就写代码,先把自己打算的解决方案和对方讲一讲。一是保持交流对方不至于干坐着,另一个是有时候很可能由于紧张,虽然知道怎么解决但代码没写好,这个时候由于你先前就讲过解决方案,面试官也会沿着你的思路给你相应提示。
    • brute force开始。brute force 意思是暴力方案,比如说一道题我想不到更好方案,只会玩命循环,性能很差。没关系,先写出来,然后以这个为基础继续迭代,实在无法进行下去就寻求面试官提示。因为很多时候对方看中的是你一步一步分析问题寻求解答的过程。
    • 注意边界条件,这个算法题部分也提到过。
  • 做项目注意点啥?就我自己来说,我做的两个项目都没有使用类 MVC 框架,因为考虑到时间限制的问题。当然,时间允许的话用 angular/react 也是 OK 的,但是类似的框架都需要花费一些时间在项目配置上。我基本都是 jQuery 直接做的,虽然可能很多人看不上,但我觉得如果能用 jQuery 把项目结构、分层搞得很清晰的话,也会是一个亮点啊。这里安利一篇我好久以前写的文章:用 Backbone 的思想写 web 页面 ,我都是用文章里介绍的结构来做项目的。
  • 面试时听不懂咋整?这个问题应该很常见吧,我本人来说,英音基本无力,欧洲其他各地的口音我也不是全能 catch 住。这个问题的解决很简单:听不懂就问!讲讲我的几个真实例子。
    • 跟柏林 HR 面的时候问我“工作中最让你 frustrated(沮丧)的事是啥?”,奈何这个词我死活没听懂。我就直接问“frustrate”这个词啥意思,对方很友好的跟我说“upset, not happy”的意思。还是同一个人,有次挂电话时说“it was nice talking to you”,不知道语调问题还是咋的,我 sorry 了三遍,对方说到第四遍我才懂,尴尬的回了句“me too”。
    • 有的时候觉得尴尬,可以说“Your voice is breaking up. The network is not stable. I didn’t hear you.”来打幌子,反正都是电话或网络,信号本来就不好,就说没听清让对方重复下呗。
    • 还可以用这种方法,如果听不懂就把自己听到的意思整理一下,向对方确认“did you mean that xxx”,如果对方发现你理解的不对,自然会换种说法重新表达。
  • 对方问工资应该怎么谈?这个问题确实比较复杂,一个陌生地方,消费水平和工资水平都无法得知。这里我推荐几个有用的网站:
    • PayScale:有各个地区的各个职业的工资水平,可以限定年限、工种甚至公司,非常全,可以参考。
    • GlassDoor:前面提到的 GlassDoor 是有工资评价的,都是各个公司的职位工资,参考价值比较大。
    • NUMBEO:这个网站有各个城市的消费水平统计,每个城市有一个 1-100 的指数,以纽约为参考(即纽约全球消费水平最高,为 100),通过这个指数你可以对这个城市的消费有一个基本的认识。另外,网站含有大量统计数据,小到牛奶蔬菜价格,大到租房买房价格都有,非常具有参考性。这个网站还有对比功能,选两个城市,会告诉你各种价格对比,然后会估算一个值:比如在上海拿到 xxx 工资的话,在柏林拿到多少工资才能保证生活质量不下降。这个值非常有用!

总结

总之,整个流程下来,我觉得找海外工作并没有想象中那么难,当然也可能是大公司我都没走到后面的流程。。。但我想说的是,有想法就行动,光想着出国什么也不干,那啥用也没有。