※ [本文转录自 Oversea_Job 看板 #1PfyEDLO ]
作者: B1ack3y3 (B1ack3y3) 看板: Oversea_Job
标题: [亚洲] Agoda - Senior iOS Developer @ Bangkok
时间: Thu Aug 31 16:06:34 2017
Agoda - Senior iOS Developer 面试心得
原文是用 Markdown 写的, 复制贴上后格式整个烂掉, 我已经尽量修改了。
但如果还是有奇怪的地方请见谅。
版上应该也有目前公司同事在看,如果被你猜出来我是谁的话请不要透露:)
如果你最近也在台北找 iOS 的缺,然后面试的时候有被问到类似的问题,
也请不要问面试官是不是这篇文的作者,否则会被 reject (开玩笑的XD),
但真的不要问。
本文有点长,但重点在最后面的
“有没有在荷兰 / 德国工作的乡民愿意帮我介绍工作” XD
— 以下正文开始 —
刚完成在曼谷 Agoda 的 on-site interview,现场拿到 offer。
几个小时前才回到台北家中,趁现在记忆犹新的时候来分享一下这次的经验。
(但明天早上好像还要回公司上班耶...夭寿)
如标题,我应征的职位是 Senior iOS Developer。
一开始是 Agoda 的 HR 在 LinkedIn 上面找到我问我有没有兴趣应征该职位,
加上老婆鼓励我尝试看看,于是就在几天内把一个有点破烂的英文履历赶出来
并寄给 Agoda 的 HR,接者就开始了整个流程。
我自己是将履历审核当作是面试流程的第一关,所以在整个面试流程上我分成下面六关:
1. 履历审核
2. 线上技术测验
3. Skype Interview #1
4. iOS Code Challenge
5. Skype Interview #2
6. On-Site Interview
下面大概说明一下每一关:
1. 履历审核
其实没什么好讲的,主要就是从履历来看你的经历跟他们找的人有没有正相关
(经验是否符合他们对 Senior 的期许?)
2. 线上技术测验
采用的平台是 HackerRank,限时30分钟左右(忘记确切时间);
题型方面多半都是选则题;采用的语言则是 Swift & Objective-C 都有;
内容方面则牵涉到 iOS 开发上的各个面向的基本观念,如:
* sync & async,
* threading (GCD, OperationQueue, UI thread, background thread),
* 内存管理 (strong, weak, assign, unsafe_unretained, unowned,
印象中好像还有考到 MRC,有点忘了)
* retain cycle
* value type & reference type
* var & let
* Objective-C & Swift Generic
* Objective-C Category & Protocol
内容其实不难,主要应该是要确认应征者符合他们对于 Senior iOS Developer
的低标吧?
3. Skype Interview #1
原为 Video Interview,但因为网络问题,开始没几分钟就改成
Phone Interview了(看不到对方的脸我反而不会紧张)。
面试官是美国人,口音好懂,讲话速度慢。
这关的内容大致上就是在问你目前在公司主要的工作内容以及有哪些经验,
然后如果没有经验的话有没有概念,如:
* A/B Testing
* Unit Testing
* UI Automation Testing
* Dependency Injection
* Protocol-Oriented Programming
* Architecture Pattern (比较常听到的就 MVC, MVP, MVVM, VIPER,
如果对 Flux 或 Redux 概念熟悉的话也是可以讲)
* 目前的产品采用什么样的 Architecture Pattern以及
是否有与其他 Pattern 比较过优缺点
** 以及确认在技术上的英文沟通能力没问题(这应该是主要目的吧)**
大概是这样,有想到再补。这次面试尾声时,说接下来要请我做一个
iOS Code Challenge,我一开始以为是要线上直接做,就开始紧张了,
后来对方才说那是个作业,有一个礼拜的时间可以写。
4. iOS Code Challenge
原则上就是一个用 VIPER 架构"恶搞"出来的简易 iOS App(Objective-C
和 Swift 都有用到),README 里面还写说他们极尽可能的在恶搞这个作业
而且恶搞得很开心。受试者的任务就是:
1. 想尽办法重构、改善这个 App,并确保这个 App 符合 VIPER 的架构
2. 确定你所使用的语法符合现代的Objective-C
3. 每个 commit 只能包含一项主要改变(粒度怎么切就看个人了)
4. 加上 Unit Test
这个作业我写了两次,第一次写到一半觉得哪里怪怪的但又说不上来
(毕竟对 VIPER 只懂理论,鲜少有实务经验),就决定砍掉重练。
结果最后是在 deadline 的前一天晚上十点前才完成全部的东西,
并打包成 zip 上传。另外值得一提的点大概是:
1. 加上 UI Automation Test (这不在原本的作业需求清单中,
我是看到他们有把 UI Test 的 target也加进去,所以就额外写了)
2. 我有额外加一个 VersionHistory 用来记录我在每个 git tag 完成
了哪些事情。
上传完成之后,大概等一周左右,Agoda 就通知我约下一关线上面试。
一开始约的时间跟我收到信的时间只隔三天,我自己是觉得时间太近,
所以将时间往后延了一周。
5. Skype Interview #2
这关的面试者是**俄国人**,而且是位俄国腔很重的俄国人,讲话速度一
快起来根本听不懂在讲啥。一开始简单的自我介绍之后一样开始问我过去
的一些经验,也有问到我对 Code Challenge 的看法,并问我花了多久时
间做。我很老实的说因为我对 VIPER 不熟,我每天大概花上三四个小时
在玩弄那个东西。另外我也主动提说其实那个作业我拿到的第二天就做完了,
但就是哪里说不上的怪,所以我决定砍掉重练。
接下来开始进行 Online Coding,平台依然是 HackerRank,
但我们两个可以直接在上面写 Code、改对方的 Code
(大概就是CodePad吧,但老实说我没用过CodePad)。
这边我主要被问了两个问题:
1. 如何实作 -[NSArray enumerateObjectsUsingBlock:],
然后从这个实作衍伸出如何对 Primitive Type 做 call by address、
__block、Stack & Heap memory
2. Unit Testing,给你两个相依性绑很紧的Swift class,
如何修改来提升可测试性(不能使用第三方 Library)
这题其实跟 Code Challenge 的 Unit Test 部分有关
第二题主要问的观念其实是:
D.I. + Protocol-Oriented Programming + Mock + Stub,
平心而论也算是一个满基本的题目,但因为我过去没有太多写测试的经验,
没有很快的想出解法。中间被问了一题是:如何在不使用第三方套件的情况
下写一个 Stub 物件,我就很没用的当机了 Orz。
但其实就是先用 D.I + Protocol 将相依性解开之后,就可以在测试的
swift 档中写一个 class 来实作你切出来的 protocol,并给予固定的
response 就好....
不过第二题其实是跟 Code Challenge 的 Unit Test 部分有关,
照理来说如果好好写的话第二题不应该回答不出来
(我就是那个回答不出来的白痴...)。
不过当对方给我提示并告诉我做法的时候我,我很本能反应的叫了一声 Fuck
(是的,对方有听到) 然后我马上接者说:“我怎么没想到,我在 Code
challenge 里面就是这样写的”,然后我开始讲我在公司产品里面做了类似
的事情,然后目的就是为了方便测试怎样怎样的,试图掩盖我没回答出来的
事实(遮脸)
当第二题卡住之后我就想说我应该掰了,Agoda 面试到此为止了 Orz。
结果对方冷不防的说了一句:接下来我们的 HR 会跟你安排 On-Site 的
时间跟细节,公司会提供参加面试的机票、住宿(含早餐)、机场接送,
并且在我预期之外的问我期望薪水,好险之前有稍微想过这问题,
但事后证明想的不够周全,毕竟是第一次面试国外的公司。
6. On-Site Interview
免责声明:这段废话有点多
原本 Agoda 提供的行程是三天二夜的行程:
1. Day1 — 飞曼谷,休息
2. Day2 — 一整个下午的面试
3. Day3 — 飞回台北
此时你还不知道你面试当天的行程跟面试官的姓名,
这要等机票开票之后 Agoda 的 HR 才会寄一封信跟你说。
我老婆在知道我拿到 On-Site的机会之后就很兴奋,而且很想跟我一起去
顺便找大学同学聚聚。于是乎我就写信问 Agoda 可不可以多帮我订两个
晚上的饭店,多出来的费用我会自己负担,隔天收到 Agoda 的回信说他们
最多可以提供给我四个晚上的免费住宿。
此外,我也请他们确认航班跟座位之后跟我说好让我可以帮我老婆订机票,
他们也很贴心的帮我选了有双人空位的座位,所以我老婆很轻松的就买到
我旁边的机票....。
对了,住的是 Courtyard by Marriot Bangkok,台湾叫万豪还是万怡我忘记了。
最后行程就变成五天四夜:
1. Day1 — 早班泰航飞曼谷
2. Day2 — 自由时间
3. Day3 — 上半天在曼谷参观,下半天准备面试
4. Day4 — 原定三个面试 session ,从下午三点一路到六点
(之前有位Andre大大的分享他的on-site有四个session)
5. Day5 — 原订整天去放松吃吃喝喝,傍晚飞台北
但在 Day3 的时候 Agoda 突然寄了一封信将原本Day 4 的
3 个 session 的其中一个移到 Day 5 上午。
我想说没问题(实际上也没得选),这样我比较不会精神涣散。于是就变成:
Day 4 — 下午共两个面试 session (1hr per session)
Day 5 — 上午一个面试 session
结果 Day 4 下午原定三点开始的面试,我等到了三点四五十 HR 才出现......
整个面试 Delay,但这也没办法,只能当作有人偷偷在旁边观察你的反应。
(我确实觉得柜台小姐一直往我的方向看就是了,但绝对不可能是因为我是帅宅)
—以下才是面试内容—
1. Session 1
这关的面试者就是我第二关 Skype Interview 的俄国人,口音一样很重。
主要的讨论内容就是给我一个画面,问我会如何设计这个画面的架构。
2. Session 2
这关的面试者是一位在伦敦长大的德国人,讲话没有英国腔,
反而比较接近美国腔,但讲快的时候会觉得对方在讲德文。
这关一开始有问我平常主要使用的语言是Objective-C还是Swift?
我回Objective-C之后就开始问我Swift...好在今年4宣布之后我
也是把官方的 The Swift Programming Language 近乎整本啃完,
所以没有太困难的地方,此外也问到像是:
* Reader - Writer Problem以及如何解
* 针对 NSDateFormatter输出的结果做测试要考量哪些前置设定条件。
NSDateFormatter的测试我很废的被问倒了,因为平常要用的时候都是去
copy-paste...虽然都知道有哪些设定因该要考虑,但被问到的时候却讲
不出来。
* Frame & Bounds 的差异
* NSInteger 的长度
3. Session 3
这关的面试者是一位俄国搬到以色列再从以色列来到曼谷的俄国人,
腔调比第一位好,但讲话速度超快,要非常专心才能免强跟上。
同时这位也是 Mobile App 部门的大主管。
内容一样是关于View - VIPER Module 的架构设计、A/B 测试的架构设计、
A/B 测试的回报机制的架构设计。
结论:
其实 On-Site Interview 中,几乎每一个问题都是申论题,没有最佳解。
但必须要为自己所做的每个决定说出原因。
譬如说你是依据什么什么原则,所以才做出这样的决定,这点是非常重要的。
尤其是当你知道理论后,你也要有一个例子来说明理论,代表你真的有理解
而不是背下来。
至于为什么我被问的问题几乎都是跟架构有关,有可能是因为当他们问我
未来的目标是什么的时候,我都说我想往架构师这条路前进吧。