Published on

转职前端工程师的海外求职 (德荷英日新) 心得 II — 找工作与面试篇

目錄

嗨,相信你会点入这篇文章,可能是因为你看到 coding bootcamp 的标题,也可能是有海外求职的打算。在往下读之前请先让我介绍自己,以及说说这系列心得会谈先什么。假如你有觉得符合你的需求再往下读,可能比较不会浪费时间 (因为文章会有点长 XD)。

先说说我的背景,我是个平凡的台湾人,人生前 24 年没碰过程式,两年前开始透过线上课程 (YouTube & Udemy) 自学程式。去年报名了线上 Alpha Camp 的实战课程 (Alpha Camp 是一个线上 coding bootcamp,详见此),后来转职软体业,目前是有约一年多开发经验的前端工程师。

前阵子因为家庭规划要搬去欧洲,所以我也顺着找了在欧洲的软体工程师工作,最后有顺利拿到一些工作机会。由于过去在网路社群中 (Medium 与 PTT 等地方),获得很多前人分享的宝贵经验,因此希望透过接下来两篇文章回馈社群。

第一篇心得《转职前端工程师的海外求职 (德荷英日新) 心得 I — coding bootcamp 之后的能力养成篇》会是谈 coding bootcamp 后的能力养成。主要是网路上比较多分享从非本科转成工程师,但比较少分享转职成功后的持续养成 (我的经验来说,转职后反而才是挑战的开始)。

而这一篇我会分享我获得各国面试机会的过程,以及线上面试各国前端软体工程师的实际经验 (包含被问到的问题)。虽然我面试的公司基本上没有签面试的 NDA,但为了必免麻烦,我不会直接写公司名称,但会有足够的资讯让大家推敲 XD 另外就是我会分区域写,所以假如你只对某个区域的工作机会感兴趣,可以直接跳去那个段落。

先在最前面声明,我是转职且开发年资不深,所以这篇文可能适合的,会是前端工作经验 0–2 年这个区间的资浅工程师。因为资深工程师面试会被问到的问题跟资浅工程师应该不太一样,所以假如是资深工程师,这篇可能对你会没太大帮助 (除非你想从面试官的角度,参考国外面试官会问哪些问题)。

另外,因为我面试的公司数量也没有真的很多,所以可以看成仅是一个资料点能参照。毕竟海外求职方式百百种,我虽然顺利拿到机会,但也仅是其中一种。推荐大家多看几篇不同经验,然后也可以上 Glassdoor 多爬爬别人的评论、面试经验文,会对全貌有更多了解。

最后,虽然这篇心得是用中文写,但我各国加起来总共面了快十间公司,不论德国、荷兰、日本、新加坡,以及一间在台美商,全都是用英文进行。

如何获得欧洲区的机会

地缘与签证的原因,台湾人要拿到新加坡与日本的机会相对容易,网路上也有比较多的经验分享,大家爬个文就容易找到 (我下面分享该两国的面试经验时也会简易提到我如何获得面试机会),这边主要聚焦在欧洲区的西欧。假如不排斥西欧以外的地方,网路上的资讯看起来,东欧与北欧也是很缺人;但我因为个人偏好所以主要聚焦在西欧。

如这篇的前辈提到的,欧洲区现在闹软体人才荒;这个现象可以看到包含荷兰有祭出 30% ruling (外国人前五年的减税方案),以及德国在 IT 产业拿到蓝卡的门槛比较低等政策,可以看到各国都透过国家策略来吸引国际软体人才。

因为我自己会的外文只有英文,所以锁定只会英文也能工作与生存的欧洲地区,加上一些个人偏好的考量下,将范围限缩到爱尔兰的都柏林、英国的伦敦、荷兰的阿姆斯特丹,以及德国的柏林。在锁定完这些国家后,我基本上按照这篇前辈分享的方式 (这篇是我爬完超多文章后,觉得帮助最多的一篇,感谢原作者大大!),改了自己的 LinkedIn 有兴趣的工作地点,以及开始加一些欧洲的猎人头与人资,同时开始投履历。

必须说,假如你已经在软体业有 3 年以上经验,只要英文履历写得不差,基本上要获得面试机会不是难题。但假如是跟我一样,是透过 bootcamp 转职,且只有一年开发经验,可能就要做好多数会收到罐头讯息的状况。很多罐头信都回说他们想找更资深的人,但碍于我开发年资不足,就只能认命,并专注在愿意给我机会的公司。

至于怎么写好一个软体工程师的履历呢? 在众多资源中,我个人最推荐 Rahul Pandey 的 YouTube 频道。他是 Facebook 的 Staff Engineer,同时兼任史丹佛大学的 CS 课程讲师,负责教 Android 开发。虽然频道多数内容是 Android 开发,但同时也有从如何求职、如何刷题,到如何写履历 (例如这个影片实际比较了普通的履历与好的履历,很有帮助),以及实际成为工程师后如何精进的各类分享。只能说是个非常佛心的人呀,大推!

我基本就照着上面那位台湾前辈、Rahul Pandey 的方法,让我在一个月内陆续拿到柏林与阿姆斯特丹的面试机会。同时因为我 LinkedIn 求职地点也设定了新加坡与日本,可能因为这两地也很缺软体人才,所以即使我没主动求职,也陆续不少猎头与人资找上来。因为想说不浪费练习面试的机会,因此虽然没有真的想去新加坡与日本,但还是面了几间公司。

薪资与福利

在往下看实际面试经验前,可能有人会好奇在欧洲的公司待遇如何。比较大的公司,基本上都可以上 levels.fyi 或是 Glassdoor 看。身为仅有一年左右全职开发经验的转职平凡人,我自然没有面试像 FAANG 这类大厂。不过即使是一般的公司,我最后有拿到 offer 的荷兰与德国的公司,薪水部分是每年六万欧元上下 (约台币两百万上下),给薪假则是每年 26–28 天不等。然后荷兰公司有提供高技术移民签证,德国公司则是协助欧盟蓝卡的申请。

这样的薪资与福利在欧洲能过什么样的生活,对比起台湾又如何,在网路上有蛮多文章讨论,这边就不多谈,纯粹提供一个资料点给大家参考~

欧洲区面试谈

先说其实我没有真的面试英国的公司。最主要是我已经谈妥也签约新的工作后,才拿到英国的面试机会,所以后来没有真的面试。有趣的是,上面说我没面试 FAANG 这类大厂,但我有拿到的两个英国面试机会,其中一个是 FAANG 当中的亚麻 XDD

不过因为已经签完新工作的约,加上我先前有在新加坡跟日本的非 FAANG 大厂分别在资料结构演算法,以及系统设计被电的经验。评估下来我觉得自己可能要再蹲个一年多准备,以及我相信我目前人在亚洲都拿得到面试机会,未来人直接搬去欧洲,应该不担心没机会。因此这边的面试谈主要只有荷兰与德国的。不过上面提到的获得面试的方法,看来也同样适用于英国。

我这次经验下来,觉得要申请欧洲公司可能需要多一点耐心 (特别是我是八月开始申请,夏季特别多人去放假)。因为欧洲的劳动法规执行严格,员工在放假时就真的在放假,换句话说面试流程被拉很长,可能是因为员工在休假。举例来说,荷兰的 P 公司,我一面完后,人资来信说要帮我安排下个阶段,同时 cc 了一位该人资的同事,说因为她接下来要休两周的假,所以会转给该同事接手。第二阶段是一个回家作业,我写完之后寄给接手的人资,她说会帮我转给工程团队作审核;然后我一等过了两周,想说怎么都没收到回覆,于是寄信去问接手的人资,结果收到自动回覆信件,原来该接手的人资也去放假了。然后在她休假完后,才进一步收到回覆,这样辗转就过了快三周才进到下一轮 orz…。

另一间荷兰 G 新创 (LinkedIn 上写 20–50 人规模的),在我二面结束后,寄信来说想邀我进到三面,但因为现在我申请的那个团队的工程师都放假去了,所以现在很难安排到面试,请我再耐心等候……。是直到两周后才又被联系安排面试。我当时心里想说新创不是通常会步调比较快、比较拼吗? 没想到荷兰连新创都很让员工生活与工作很平衡,觉得这挺好的。

欧洲这样的慢步调,对申请者来说可能煎熬,但换个角度想,欧洲工作真的是让人更有生活,员工也是休假排好排满。从这观点来看,欧洲真是颇吸引人的。总之,假如在申请时,等一段时间都没收到回覆,不要放弃希望,因为很可能是人资或工程团队在休假 XD

在实际面试上,欧洲公司跟我在台湾的经验没有差很多,主要分成出作业 (take-home assignment) 跟直接考资料结构演算法类的公司。可能因为我不是面试大厂,所以仅有一间是考线上直接白板题,其他都是出作业类。所以假如你跟我一样会是以中小型公司或新创为主,可能多加强前端实作能力,会比较有帮助;但假如是要冲大厂的人,专注在刷题会比较有效益。

出作业类的公司

我的第一个作业类别的面试,是荷兰的 P 公司。该公司是在做生鲜电商的,因为强调永续,在我申请的期间,正好获得盖兹基金会 6 亿欧元的 D 轮领投。可能因为拿到新一轮募资,所以大举招人,成为我最早获得面试机会的公司 (虽说后来荷兰 P 公司的员工休假都休好休满,让流程拉得很长…)。

前面第一轮是先跟人资聊聊,问的问题不出为什么想换工作、为什么想来荷兰 (欧洲),此外也问了一些过去工作经验的问题,都是网路上常见的那种。人资聊完后,就被邀请进到技术审核关卡,第一关是先有一个简单的 take-home assignment,写完后会跟工程团队讨论我写的程式码;说有过的话才会有 virtual onsite。

先说结论,我在技术审核后没有通过,所以没有进到他们的 virtual onsite。但我必须说,申请荷兰 P 公司的经验让我大彻大悟,也让我后续在写各类 take-home assignment 时特别认真,在思考架构、选择的工具等等,都会准备深入的理由。甚至之后的 take-home assignment 我还都把测试补上,因为被 P 公司说假如有写测试会更好;在那之前我本来想说不过是个作业,没特别想要写测试,但殊不知这点也被拿出来点评。

几个在这关卡被挑战的问题

  • 某个东西为何用这技术? 为何写法是这样? 为什么不选其它方式等等?
  • 为什么这个元件这样设计? 为什么这元件做这么多事? 这样不会很难重复利用、测试吗?
  • 为什么这个元件这样命名? 为什么这个函式这样命名?
  • 为何 data model 这样设计? 这样不会有多余的东西吗?

总之本来只想说快速写完这个作业,写出来功能都能动就快速交出去,但现实是,他们不只想要能写出功能的人,而是要能写出无暇程式码、能够运用设计模式到程式中的人。后来想想也很合理,假如作业 + 针对作业的技术讨论,是主要筛选方式,那当然要把毕生所熟知的软体设计原则都用上,才能更有助于通过这项考核。

我很感谢荷兰 P 公司是我作业类别的第一间,虽然流程拖很久,被狠狠地挑战一番后最后也没录取,但正是因为这个经验,让我后来大彻大悟。一般来说 3–5 小时就能写完的小作业,我会搞十多小时才弄完,并且把荷兰 P 公司挑战我的所有问题,都拿来问自己一遍,然后有觉得不够好的地方就重构。也因为这样,后来的作业考核都有通过,甚至被后来有拿到 offer 的德国 S 公司说作业写得很不错 (殊不知这是前面先被洗过脸后发愤图强的结果 XDD)。

考演算法类的公司

上面有提到,我只有一间欧洲的公司有考白板题,是荷兰 G 新创。面试总共有四轮,第一轮是跟一般人资关类似,就是问出国动机、过去的工作经验这类的。第二轮则是两个工程师加上一个产品经理,线上三对一,大约一个半小时。

这一关前面前面由产品经理主导,问以下类别的问题:

  • 过去跑敏捷的经验、团队协作经验 (例如跟产品经理、设计师的协作)
  • 过去开发经验中,有遇到什么特别的难题? 如何应对?
  • 如果遇到共事的人对你的表现不满意,并直接来跟你说时,你会怎么应对?
  • 假如在开发时仰赖第三方供应商,但他们的更新还没推出,这时导致你准备要开发的项目被卡住,你会怎么做?

后面换到工程师提问时,才有比较技术面的问题

React 相关的问题,印象深刻的问题包含:

  • 为什么要用 React? 比起 Vanilla JavaScript,React 有哪些特点?
  • 解释 React 中的 higher-order component,过去实际有用过哪些 HOC?
  • React 有哪些常见会造成效能的问题? 要怎么解决?
  • 有用个 React profiler 吗? 可以分享一下使用的经验? 如何靠 profiler 找问题?

Redux 相关的问题,印象深刻的问题包含:

  • 解释 Redux 用途
  • 解释 pure function,以及 reducer 为什么要是 pure function?
  • Redux Thunk vs. Redux Saga 的差别、分析两者分别适合什么情境?

另外还有问了 Git 的问题,但就比较是快问快答

  • 问了 git cherry-pick 要怎么用?
  • 还有 rebase 与 merge 的差别与分别适用情境为何?

第三关则是考白板题,也是一个半小时,先请我自我介绍,然后问了我过去专案经验相关的问题,接着就是三题白板题。前面两题就是比较简单的,第一题是给一个字串,然后写一个函式,回传该字串当中有几个母音;这题只要有注意一下大小写的处理,基本上是 LeetCode Easy 的题目。第二题则是常见的 LeetCode 412 Fizz Buzz 的变形,只要能善用 modulo operator 基本就能解出来,也是 LeetCode Easy。而第三题则是比较难一点,是需要用我上一篇有提到的 Floyd’s cycle detection algorithm 来解的题目,算是 LeetCode Medium,不过假如熟悉该演算法的逻辑,基本上这题也不太是问题。

最后一轮则是再跟 CTO 面,但这边反而没有技术相关,问得更多是了解我这个人,了解我对生涯发展的规划与想像;同时让我问问题。基本上有点像是聊天一般地结束这个关卡。

欧洲区小结

如上面提到,我前面太小看作业关卡,假如遇到这类型的关卡,绝对不能只是写出来能动就好;尽可能把毕生学到的软体设计原则都用上,把程式码写得够干净,会是能否进到下一阶段的关键。而白板题、React、JavaScript 的问题则跟其他地方一样,就是多练习题目准没错。至于人资类的问题,就是练习好英语自我介绍、海外求职动机、专案经验介绍、团队协作经验介绍;然后多准备一些问题,因为几乎每一关最后都有一个环节是让申请者提问。

这边特别推荐 Tech Interview Handbook (是由一位 Facebook Staff Engineer 汇整出来的宝典,他也是著名的 LeetCode Blind 75 的作者),里面的 Behavioral Round 的问题,以及 Questions to ask 的问题,对我在准备时帮助很多!

新加坡面试谈

最开始我其实没考虑新加坡,最主要是因为我是很怕热的人,住台湾时觉得夏天最难受,因此不敢想像搬去新加坡。不过可能因为我把 LinkedIn 求职地点之一设定成新加坡,也陆续收到一些面试邀约,其中包含新加坡最大的电商 S 购物等公司。

S 购物对我来说是很有启发性的一次面试,跟前面提到的荷兰 P 新创一样有启发性,但方向不太一样。若说荷兰 P 新创让我知道作业要好好写,那么 S 购物就是让我知道我对 JavaScript 这门语言、对 React 的底层运作有多不熟、多需要加强。在被 S 购物电翻后,我就疯狂加强自己的 JavaScript 与 React 相关的深度知识。

假如你要面试 S 购物的前端工程职缺,除了确保自己 JavaScript 跟使用的框架够熟外,我会推荐你务必要把 Glassdoor 上面的 Software Engineer 以及 Frontend 相关的面试经验分享全部看过,以及把 LeetCode 中该公司高频题都刷过一轮;以下我会由我的惨痛经验分享,为什么这么做有帮助。

S 购物的第一轮会是人资面,就是被人资在 LinkedIn 上联系,然后约了一个 30 分钟的视讯电话,主要就是问人资类的问题,例如为什么想换工作、为什么对 S 购物有兴趣,能 relocate 到新加坡吗? 家人支持自己出国工作吗? 等等这类问题 (跟 Glassdoor 上分享的基本都差不多)。

接着会用一个在 Glassdoor 被骂翻的 Glider.ai 来做 OA。题目分成选择题,考对网页开发的熟悉程度。举例来说,假如关掉浏览器的分页后,以下哪些的资料会被清掉 (cookie, session, indexedDB, localStorage)。或是 JavaScript 的熟悉程度,例如非同步 (asynchronous) 与 event loop 的运作机制细节,实际问题类似这一题,以下程式码印出的结果为何 (不知道的话可参考这篇)。

Promise.resolve().then(() => {
  console.log('Promise1');
  setTimeout(() => {
    console.log('setTimeout2');
  }, 0);
});
setTimeout(() => {
  console.log('setTimeout1');
  Promise.resolve().then(() => {
    console.log('Promise2');
  });
}, 0);

另外也有考两题演算法题,但都是 LeetCode Easy 的问题,其中一题是字串的处理,另一题则是网路上找得到的 Maximum sum of non-leaf nodes among all levels of the given binary tree。过了 OA 之后就会进到第一轮技术面试。

虽然人资的信上写第一轮技术面试会是问前端相关的知识,但实际上完全不是这么一回事……。我在这一轮只有三题白板题……。第一题是简单的字串处理,大概是 LeetCode Easy;第二题则是实作函式快取。

第三题则是要把字串转换成 2D 阵列,但有几个 edge cases 需要处理。我把题目中的城市改为台湾的城市,但问题基本不变。这题只要能处理掉空白、以及后面的那个双引号问题,基本上不会太困难。

第一轮三题算是有解出来后,有幸在隔天收到第二轮技术面试邀请。虽然人资的信上写第二轮技术面试会是问电脑科学相关的问题,搭配白板题,但实际上再次完全不是这么一回事……。我在这一轮有三分之二的题目是被问跟前端有关,只能说人资跟面试官之间的认知有很大落差呀 XD

进到第二轮时,前面第一题先是要手写 debounce 函式,因为这题是蛮常见的题目,先前有写过,所以算顺利完成。但是第二题就直接被电惨,要实作一个 LRU cache,这题虽然我先前看过题目的标题,但因为它在 AlgoExpert 中被归类在 Very Hard 的题目 (不过 LeetCode 把它归类 Medium),我先前就想说我才一年半经验,还是面试前端,应该不会被问到这题吧,于是就没有练习过。透过这个惨痛的教训,想跟同为资浅前端的人说,想要面大厂,平常练一下难度高的题目还是有必要的。

因为题目要求 O(1) 时间复杂度来处理 get 与 put,我当下有想到用 hash table 搭配 linked list 来解这一题。我当时说出这个思路时,面试官就说,不然你先建一个 doubly linked list 吧。但这时就显露出我对 JavaScript 不熟之处,我在面试当下建不出来一个 doubly linked list ,然后就挂在那边。后来面试官看我实在写不出来,就叫我讲完我的思路,然后就往下问前端的问题。

这边先稍微插播一下,上面有提到 LeetCode 高频题要多做,原因是我在面试后上网查,发现 LRU cache 就是 S 购物在 LeetCode 上被回报最高频的题目之一。假如我是在面试前知道这资讯,肯定会多练习几次,只可惜我是面试完后才知道。所以看到这边的你,千万不要铁齿,高频题优先刷可能让你少走我走过的冤枉路……。

接着进到前端类的问题,又是另一番轰炸。基本上就是问了 React 与 Redux 底层类的问题。以 React 来说,一路被问到 React 的 reconciliation 机制是怎么运作? 因为先前我读过 React 官方 Advanced Guides 每一篇且有做笔记,所以到这边都还算顶得住,不过后面就开始慢慢没办法招架。

后面问了 Redux 的问题,然后每当我讲了一个点,就会被往下开始追问,到后面追问 Redux 效能问题,问说 Redux 会问每个 connected component 要不要 re-rendering,这要怎么实作? 以及这么做导致 O(n) 效能不好该怎么解决?

这边就是我挂机的时刻,当下我真的回答不出来,因为我在那之前只用过 Redux,没去研究过它是怎么实作。我也从来没想过假如我要写一个类似 Redux 的套件,我会怎么做到把效能从 O(n) 变成 O(1)? 虽然面试当下答不出来,但事后去查,发现这些问题在前端社群还真是被探讨过,甚至 Facebook 内部就有一个实验性的专案 Recoil,就是做到 Redux 在做的事,然后用 O(1) 的方式实践。

这个经验引发我一个思考,在面试时我答不出来,当然只能怪自己过去了解不够深入。不过我一直以来都有追踪的 Dan Abramov (React 团队核心成员,同时也是 Redux 共同发明者),他在他的部落格文章中,谈到 React 底层的技术时,都有特别讲 you don’t need to know this to be productive in React。所以有些东西我读过去就想说,不深知也还好,毕竟不影响工作上使用 React 与 Redux。

但在 S 购物这轮高强度的面试下,我在想的确不用知道这些底层也可以把 React 或 Redux 写得很好,但可能会过不了这类面试 XDD 所以到底要不要把这些深入搞懂呢? 我想端看你是不是发自内心好奇,或者你是不很想去会问这种深度技术问题的公司。假如想去的话,那建议还是好好搞懂吧!

总之很合理地,因为我没顺利写出 LRU cache,被追问 Redux 实作问题又答不出来,这关自然就挂彩了。不过必须说这真的是个很棒的学习经验,让我清楚知道我自己的不足。好在我欧洲区的一些技术面试其实是在这场面试之后,在这场被电完我开始疯狂加强这些。上面提到的荷兰 G 新创问的那些 React 与 Redux 问题,每问一题我就在被追问前,自己主动讲个三四层,他们工程师有说很 impressed 我能讲到那些,殊不知是因为我先前被惨电后发愤图强 XDD

新加坡虽然后续还有其他机会,但因为后来拿到欧洲的 offer,就没继续面下去。不过 S 购物的经验真的是让我开了眼界,也希望这个被惨电的经验,对想去挑战新加坡大厂的前端工程师们有帮助。

同时这个经验让我体认到,把自己的非第一志愿地区,做为前导的面试练习是很不错的方式。目标为欧洲的我,在面欧洲之前,透过新加坡的面试,累积了高强度的英文技术面试经验。虽然被惨电,但被电当充电,而且充得很饱很满 XDD

日本面试谈

因为在疫情前我每年至少去日本玩两次,所以虽然目标在欧洲,但我仍把 LinkedIn 的求职地点之一设定成为东京,但没抱特别多期待。不过陆续也有几位猎头私讯提供面试机会,然后我就想说不试白不试,当练习的机会,所以就把履历给了猎头。接触几个下来,我个人感觉最专业的是一间叫 Wahl+Case 的公司,该猎头很详尽地跟我介绍日本现在的资讯/软体产业现状,然后也帮我投了几间公司。以下跟大家分享猎头跟我说的一些资讯:

现在日本资讯的工作市场很缺工程师,该猎头说基本上日本国内已经找不太到人了,所以日本的公司才开始往海外找人,甚至不少公司的软体工程师,外国人的人数比日本人还多。然后说因为这样,所以其实不太有日文的要求,沟通的语言都是英文。

日本很多职缺虽然会写要求 3 年以上经验,但是即使经验不到也可以申请 (我就只有一年多一点)。猎头说之所以会设定 3 年以上,是因为日本公司觉得通常要至少 3 年经验才能通过他们的技术面试。但事实上过去也很多不到 3 年经验的人通过,所以不用因为自己年资不够深就不申请。

日本我有遇到的也是分成作业与考演算法的两种类别。因为分别被拒跟因为拿到欧洲 offer 后主动婉拒后续,以下与大家分享比较特别的经验的:

出作业类的公司

日本我只有遇到一个是作业类别的公司,是 N 新创。他们出了一个 code refactoring 作业,我觉得是很不错的作业。比起从零写一个小专案,这个 refactoring 作业花的时间就稍微少一点,然后又能测出懂不懂软体设计原则、懂不懂如何写干净的程式码。

考演算法类的公司

演算法类的公司则是跟其他国家都差不多。举例来说一家算大公司的 W 公司,前面先给了一个 HackerRank 的 OA。 HackerRank 著名的就是题目都写很长 (几乎是在考英文阅读能力呀 XD),假如对这种长叙述不熟的人,推荐多上 HackerRank 做题目练习。

比较特别的地方是,该公司的 HackerRank 除了算法的题目外,还有申论题。事后查了一下,题目是比较类似 System Design 一点,就是需要了解整个系统的运作,了解前后端如何协作来做到题目中的要求。因为我的算法题目跑测试时都有过,但最后 HackerRank 关卡没通过,我猜这边的申论题是我挂掉没通过的原因。

反思了一下,如上面提到日本猎头说日本公司会希望找 3 年以上,是因为觉得 3 年以上经验的人才能过得了他们的面试。我在想这背后的原因之一,可能也是因为这种类似 System Design 的问题。我自己先前在网路上看到,多半是比较资深的工程师面试才会问 System Design,所以我就没特别准被。不过对于跟我一样不到两年开发经验,又想越级打挂的前端大大们,推荐还是准备一下 System Design,才不会像我一样挂掉。

在台外商

上面有提到,我把我的 LinkedIn 求职地点设定为欧洲各国与日本新加坡,但可能因为我所在的工作地点仍是台北,所以还是有不少在台湾的人资与猎头来找。因为我很确定要到海外生活、做全球化的产品,所以一开始会问能不能有国外办公室,或是有没有外派、全远端的机会,假如都没有的话就就先婉拒邀约。因此最后仅有跟两间总部在海外、且有其他海外办公室的在台外商面试。 我有面的这两间可能因为都有募资顺利,所以都在大举扩招;我猜可能蛮多在台的前端大大们会接触到,所以这边我尽可能写得详细一点。

港商 O 新创

港商 O 新创是做纯网路保险的,我在先前就已经耳闻该公司,主要因为台湾前端有好几个社群活跃的人在该公司,算是因此建立了对该公司的人都很热爱技术的第一印象。该公司目前主要只找 mid-senior level 的,所以我蛮讶异仅一年左右开发经验的我也能获得面试机会 XD

该公司的流程是分成三关,技术关卡前是先跟人资聊,主要是了解个人职涯发展、为什么会开始想找工作;同时也听人资介绍该公司以及开发团队。聊完后的技术关卡第一关是 90 分钟的线上技术测验,是用 coderbyte 这个平台进行,主要分成简单的演算法题目、JavaScript 与 TypeScript 题目,以及 React 的题目。

演算法题目第一题是很常见的 LeetCode 15. 3Sum 的变形 (output 要求不太一样,但概念一样) ,属于 LeetCode Medium 的题目,这题几乎是必刷的题目,所以我先前其实在 AlgoExpert 与 LeetCode 上都写过,在线上测验时我是用常见的 two pointers 来解这题。另外一题是做字串转换,就是给一个字串,要把里面的英文字转换成后一个字,然后遇到母音的话要大写 (例如 'abcd' 要变成 'bcdE' ),这题我是透过 charCodeAt() 以及 fromCharCode() 这两个 JavaScript 内建方法,搭配一个母音的 hash Map 来完成,难度算是 LeetCode Easy。顺道一提,coderbyte 这平台有镶嵌 Google 搜寻,所以假如有不熟的语法,可以直接在上面搜寻。

React 的部分有一题手写题,是给一个 array of objects,然后要建一个表单出来。我是中规中矩地用 map() 方法,搭配上 <ul> 以及 <li> 来完成。这个对于有在用 React 做日常开发的人来说应该都不会太难。除了手写题之外,也有问一些概念题,例如 React PureComponent 的用途? 以及在 function component 可以如何做到相同效果? 算是面试常见题目,不过特别注意,这边是简答题,不是选择题,且需要用英文作答。

JavaScript 是问了我在美商 H 公司被问过的 Scope 题目,再次附上这篇文章,能懂的话基本上这题不会太难。然后还问了一题 IIFE 的题目,跟实作一个简单的 Curry 函式,基本上能手写出这篇里面 Curry 实作的部分,那题就不会是问题。而 TypeScript 的话是问了 Generics 用途为何? 并要求手写一个范例。我刚好之前看过这篇用 React 的 useState 来讲解 Generics 的文章,所以就写了一个简易版 useState,然后透过该范例来说明。

线上测试后的隔周一收到港商 O 新创的第二场面试邀请,有趣的是,这是我面快十间公司、超过三十场面试中,唯一用中文进行的,反而觉得不太习惯 XDD 这关总共两小时,前面 1.5 小时是技术面试,由三位工程师进行,其中一位是 hiring manager (也是团队中的 Tech Lead);后面 0.5 小时则是由 HR 进行。技术面试前面会有 hiring manager 介绍公司、产品、团队,以及让申请者有机会提问任何问题。

在介绍完也让我提问后,就进入到我被问问题的阶段。这阶段没有直接手写的白板题,主要都是问概念与思路。 我还记得的 JavaScript 题目包含以下

  • script tag 当中的 async 与 defer 有什么功用? 两者的区别? 这边还出了一个情境题问我,在该情境下该用哪一个? 结果我当下没有完全理解题目,说了一个不是正确的回答,感谢面试官协助导正我的观念。
  • JavaScript 的 shallow copy 与 deep copy 有什么区别? 哪个是传一个 reference? 如果要实作 deep copy 该怎么做? 这种 lodash 手写类的题目真的很常出现,大家务必要熟。我当下回答的版本是透过 recursive 的方式来实践的,思路如下:

React 相关的问题则是有

  • useMemouseCallback 的区别为何? 什么情境该用什么? 这里我有顺利回答后,被追问了「可以用 useMemo 来处理函式吗?」这边我没回答的很好,面试官补充其实 useCallback 背后也是透过 useMemo 的概念来做到。
  • 为何要用 Redux Toolkit? 说明 Redux Toolkit 的优点 (会问这题,是因为我履历有写到我有用 Redux Toolkit 的经验。自己履历上的写的每个东西真的都要熟呀~)
  • Redux Thunk 如何使用? 运作机制为何? (因为我在的公司都是用 createAsyncThunk 所以我就回答了它的用法,以及它搭配 extraReducerbuilder pattern 做操作)

另外也有 Web 相关的问题

  • 问了效能优化的经验 (因为我履历中有写到,所以我当下就分享一下我们当时的做法)
  • 说明 localStorage 跟 sessionStorage 差别? 分别适用时机? (可参考这篇 MDN )
  • 说明 cookie 机制 (可参考这篇 MDN)
  • 说明 http caching (刚好我先前读过这篇 MDN 的文章,还有这篇 web.dev 的文章,就讲了 Cache-Control, ETag, 以及 Last-Modified 三种机制)
  • 问了浏览器中提供的 preloadprefetchpreconnect 等功能 (这篇写得很清楚)

另外也有 CSS 类的问题

一连串的问题后,最后也留给我一些时间问问题。结束之后换 HR 进行提问,这部分的问题就比较是了解个人发展偏好、了解过去一些团队协作经验;另外也让我有机会提问。我自己在跟工程师们,以及跟 HR 的提问都问了不少团队协作、文化、以及问了一些个人经验的问题

这次的面试经验算是让我意识到,我过去点的技能点比较多在 JavaScript、React 的知识点,以及 LeetCode 的刷题;但是 Web 相关的 (浏览器相关的),以及 CSS 的我就相对薄弱了一些,这两部份答得不是太深入详尽。我觉得与港商 O 新创的面试是很不错的经验,让我在后续的准备上,知道自己还有更广的面向应该加强。

美商 H 公司

美商 H 公司 是做室內設計與居家裝修的電商公司,因為已經募資到 E 輪,估值 40 億美元,所以基本上不太能說是新創了。當時的流程是獵頭接觸後,有一次初步的電話談話,主要是了解我接下來的職涯發展、為何想換工作等等。聊完沒太大問題後,就幫我送履歷給該公司,然後就約了第一次面試。因為他們正在大舉徵才,如果對這間公司有興趣的前端大大們,可以在 LinkedIn 上找獵才公司 MVP Fastlane,在接觸的過程中,感受得到他們很尊重應徵者,很推薦 (這邊特別感謝當初接洽我的 James,幫我與該公司做了許多的協調。有興趣這間的人,James 有說可以找他)。

因為是跟美國總部面試,所以當時被開的時段是台灣晚上 12 點,或是早上 7 點或 8 點。如果對這間公司有興趣,可能要特別注意這點,面試的時間是比較罕見的 (但好處是不用請假面試 XDD)。因為是直接面美國總部,所以 我當時特別上了一畝三分地、Glassdoor 看了一下過來人的面試經驗,蠻推薦大家這樣做的,因為我就剛好有一題被問到一樣的。另外就是台灣也有過去的申請者曾分享面試經驗,可以看到這篇-2020 年底碩士新鮮人軟體找工作紀錄跟心得分享(前端為主)、這篇-面試心得 - Houzz,還有這篇-2020 Software Engineer / Backend Engineer 面試心得

我的第一面是對到一個 Staff Engineer。一開始對方先請我自我介紹,然後請我聊聊我過去的開發經驗,在分享的過程被追問了很多問題。比較特別的地方是,追問的問題很多是產品面的。我先前就聽說美國軟體公司很重視產品思維,在該次面試中很直接應證了這點。所以推薦假如要準備這間的前端,可能要練習一下用英文介紹自己做過的專案、用的技術,甚至回答一些從技術角度看 UIUX 的問題 (例如要實作某 UI,或是要能提供某 UX,可以用什麼技術之類的)。

前面被追問了十五分鐘左右,才真的進到技術問題。技術總共被問到三題,第一題是很經典的 JavaScript scope 問題,以及相關的追問問題。具體來說,假如你能解釋這篇文章在講的東西,這題應該會沒問題。

第二題則是 Glassdoor 上有看到的類似問題。簡單來說就是給一串網址 (字串),然後要能夠去 parse 該網址的 query params。具體來說會是例如下面這樣 (題目沒完全一樣,但概念是這樣)。這題有幾個要注意的,一個是如果某個 key 重複出現,要讓 value 是一個陣列;以及要能把那些看似亂碼的東西作轉換 (JavaScript 有個內建的 decodeURI() 方法在做這件事)。因為題目不難,我蠻順利地解出來。

第三題則是手寫 debounce 函式。假如你有看上面的話,這題其實我在新加坡 S 購物的技術二面也被問過。只能說這種手寫出 lodash 裡面常見的函式,幾乎是前端面試必備的題目 (我一路被問到好多次,包含上面分享的港商 O 新創就有問 cloneDeep XDD)。所以假如對 debouncethrottleflattencloneDeep 等等手寫不熟的人,這些務必事先練習,確保面試時被問到,會寫得出來。假如你沒頭緒怎麼實作的話,其實網路上有很多人有寫文章教學,例如這篇就講得很淺顯易懂,推薦讀讀~

三題技術題之後,面試官也讓我有一些時間發問。在我問完一些我對該公司好奇的點後,結束了第一面。過了第一輪後,接下來被連續約了兩輪面試,因為也都是對在美國的工程師,所以兩個也都安排在早上七點面。不過因為我在第一面與後續兩輪面試之間,回應接受了歐洲的 offer,所以就主動取消了後續的兩輪面試;這邊就沒辦法有後續的實際經驗分享了。