作者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 中,几乎每一个问题都是申论题,没有最佳解。
但必须要为自己所做的每个决定说出原因。
譬如说你是依据什麽什麽原则,所以才做出这样的决定,这点是非常重要的。
尤其是当你知道理论後,你也要有一个例子来说明理论,代表你真的有理解
而不是背下来。
至於为什麽我被问的问题几乎都是跟架构有关,有可能是因为当他们问我
未来的目标是什麽的时候,我都说我想往架构师这条路前进吧。
----
结果:
Offer Get,基本底薪也跟我开出去的一样,但因 package 内容与预期不符,
现在正试着重谈薪水。
如果没有谈成功,应该就不会接 offer 了,毕竟结了婚要考虑的人事物变多了..
另一方面,其实我最想去的地方是欧洲(荷兰 / 德国),
有没有乡民愿意帮我介绍工作 Q_Q
本文起始於:2017 / 08 / 31 03:00 AM
第一版完成於:2017 / 08 / 31 02:40 PM
第二版完成於:2017 / 08 / 31 为免隐私问题,移除部分日期
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.32.32.253
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Oversea_Job/M.1504166797.A.558.html
※ B1ack3y3:转录至看板 Soft_Job 08/31 16:08
※ 编辑: B1ack3y3 (114.32.32.253), 08/31/2017 16:41:52
※ 编辑: B1ack3y3 (114.32.32.253), 08/31/2017 16:42:42
1F:推 WarmBed: 好详细 08/31 20:38
2F:推 sean2449: 曼谷offer多少?荷兰德国薪资也不高,税超高! 08/31 21:52
3F:推 fortinet: Agoda开多少?荷兰和德国税後薪资不高喔,你为什麽想去 08/31 22:55
4F:→ fortinet: 欧洲 08/31 22:55
5F:→ B1ack3y3: 想去欧洲是着眼在环境,曼谷的税後薪资其实跟我和我老婆 08/31 23:23
6F:→ B1ack3y3: 在台湾的税後薪资加总後没高多少,但必须多负担房租费用 08/31 23:24
7F:→ B1ack3y3: 所以去曼谷的话反而还比在台湾赚的少... 08/31 23:24
8F:→ B1ack3y3: BTW, 环境指的是生活环境 08/31 23:24
9F:推 fortinet: 那如果你在意税後薪资欧洲一定会让你失望... 09/01 01:43
这我理解, 所以对我来说下面两条件其一成立就可以了:
1. 生活环境好, 税後薪资即使不优但只要可接受范围内就还好
2. 生活环境不好, 那税後薪资就要高
那究竟怎样的生活环境算好, 这就是主观的问题了, 因为每个人的评核标准不同
※ 编辑: B1ack3y3 (111.250.159.129), 09/01/2017 01:54:42
10F:→ fortinet: 软体工程师年薪glassdoor有, 存的钱会比在台湾领百万年 09/01 01:48
11F:→ fortinet: 薪少. 如果你老婆非理工不会德语或荷语, 大概也找不到 09/01 01:49
12F:→ fortinet: 工作, 你们总收入更比不上台湾, 只赢在环境跟工时. 09/01 01:51
13F:→ B1ack3y3: 抱歉...不知道有没有修到你的推文 09/01 01:56
14F:→ B1ack3y3: 工时也是一个重点 09/01 01:58
15F:→ happyennovy: 荷兰工作需要会荷语吗? 最近才完成一个和荷兰人的合 09/01 09:00
16F:→ happyennovy: 作,他们英文超好的,德国的话不会德语大概是很难找工 09/01 09:00
17F:→ happyennovy: 作... 09/01 09:01
18F:→ sean2449: 之前面Berlin的AMZN有经验也面不错,也才谈到7万...税40 09/01 09:03
19F:→ sean2449: %...房租一个月1500 09/01 09:03
20F:→ sean2449: 普通软体公司都在4-6W之间而已 09/01 09:04
21F:推 fortinet: 不会荷语非理工, 如果你在台湾能进得去一线外商还有机会 09/01 09:27
22F:→ fortinet: 当地大部分公司还是需要荷语, 不会讲第一关就刷掉了 09/01 09:28
23F:→ happyennovy: 原来如此...德国的话我妹有很不错的学历但是德语没到 09/01 09:46
24F:→ happyennovy: C1 然後没有工作经验大公司也几乎都不要就是了 09/01 09:46
25F:推 knust: 有看有推长知识 09/01 11:28
26F:推 miluco: 我来欧洲旅行多次,每次来的感想就是,好漂亮,好好玩, 09/01 15:01
27F:→ miluco: 但东西好难吃,很多地方很脏乱,所以来旅行很ok,要我长 09/01 15:01
28F:→ miluco: 住还要拿低薪那真的是免了 09/01 15:01
29F:→ happyennovy: 我觉得东西很好吃耶XD... 我反而不习惯台湾的食物了 09/02 04:56
30F:→ happyennovy: 添加物太多, 但是欧洲真的税很高, 税後薪水剩没多少 09/02 04:56
31F:→ happyennovy: 在台湾没房贷的话, 其实可能可以存比较多 09/02 04:56
32F:→ lingerptt: 台北租出去补贴就好,成家上班族,能出去还是跑一跑 09/03 09:38