Apple 這次的面試跟以前以 LeetCode 為主的 whiteboard 不太一樣,分享一下這次的面試經驗,也許會幫助到以後來面試的人。

話說我去年九月去了一間在 San Mateo 的 startup Roblox 工作,其實公司還不錯,也是個有名的 unicorn;可是我因為收入在矽谷貧窮線上下浮沈,所以只能住在 south San Jose,每天通勤時間視開車或 Caltrain 不定,大概在三到四個小時之間,Caltrain 還得忍受廢氣跟車上的臭味。做了大約半年以後,身體實在受不了,於是跟 manager 談過以後決定離開。

時間回到大概在一月左右,Apple 的 Operations team 找我去做 Lead/Architect,還包括 10-15% 的 international travel;主要是做 Apple 產線裡的 supply chain,這跟我之前做過的幾個 project 還滿相關的。那時候我還苦撐著通勤時間,每天換著不同的 commute method/route,所以跟 recruiter 說了謝謝再聯絡以後就沒有繼續。等到三月多我決定離開,問 recruiter 這個缺是不是還沒招到人,才開始正式的 interview。

我跟 recruiter 說,我還沒開始準備 interview aka 刷 LeetCode;phone screen 大概沒問題,如果進到 onsite,可能我要準備一陣子。recruiter 自然是無可無不可,但是她說這個 position 找滿久了,她還是建議我先開始整個 process,省得夜長夢多。

於是我先跟 hiring manager 做了一次 phone interview;大概聊了一下我之前在 eBay 寫的一個 service,套了兩個 DBCP,根據 Apache Calcite 實作了幾個原先沒有支援的 data storage,manager 問得很細,包括我怎麼實現 connection pool,怎麼在更新 data storage metadata 的情境下 retain/release connection。因為這是 lead/architect position,他也問了我們怎麼分工,我怎麼保證同組較資淺的 engineer code/project quality。

因為時間關係,我大概提了一些簡單的 maven plugins,確保 code coverage/spotbugs/dependency/code style,還有一些簡單的 CI/CD pipeline,差不多時間就用完了。

隔天 recruiter 就跟我說這輪過了,要我找 24 小時做一個 assignment;題目大概是要你用 spring-boot (這是他們主要使用的 framework)實作一個 RESTful service。題目很簡單,要求 mock service 的 unit test 也不難,但是裡面的幾個 bonus points 很弔詭;比如說某個要你實作的 bonus feature 根本就是 prometheus(題目沒說),但是你直接放 prometheus 是不行的,要寫非常少的 code 去 customize 一些 tagging。

我是寫 code 很快很短的人,寫這個題目包括 bonus 跟註解也花了大概 12 小時,送出去後隔了兩三天,recruiter 就約我去 onsite 了。

這個時候我大概還在跟 manager 討論離職的事情,LeetCode 開了一個新的 session,只刷了大概十幾題的 easy,自我感覺非常的不良好,Apple 另一個 team 的 recruiter 在此同時也找我 interview。兩個 team 討論以後,要我先把這個 team 的程序跑完以後再說;我想想大概就把這個 team 當做練功,等我正式離職以後再來慢慢刷題好了,反正 Apple 的 interview 是以 team 為單位的。

然後我就去 onsite 了。不在 Apple Park 那個飛碟裡,在飛碟往北十分鐘的 Apple Campus 3;recruiter 安排的時間也很妙,總共兩小時又十五分鐘,三個 engineer 外加 hiring manager。本來要我帶 laptop,要對我寫的 assignment 做 code review,最後電腦也沒用到。

第一個 engineer 跟我聊了一下之前做的一些 project,然後提到她最近遇到的一個 swagger 問題;因為問題非常不具體/我沒有 stackoverflow,所以我很簡單的回答了一下我的想法,她說她自己也還沒解決,可能等一下照我說的試看看;然後問我一個 string permutation 的問題,剛好在 LeetCode easy 等級,輕鬆解決。

第二個 engineer 問我相當多 Spring 的問題,還有一些不同 data storage 的 behavior,不是什麼太難的問題;後來他有一個題目我聽半天不是很懂他到底要什麼,一直到第三個 engineer 來之前,他解釋他的答案的時候,我才理解他的問題,於是小小展開了一下,表示我知道這個答案,只是聽不懂他的問題。

第三個 enginner 是 UI lead,跟我很友好的交換了一下 UI 跟 backend 間不得不說的恩怨情仇以後,也很友好的跟我討論了一下我的履歷,時間就這樣被浪費掉了。

最後一個人是 hiring manager,雖然說表定是四十五分鐘,可是最後談了可能有一個半小時;除了 phone interview 時沒有時間詳談的一些細節,他還討論了時間跟 feature 的取捨(這是每個 lead 的惡夢),CI/CD 的處理原則,某些 data storage 的使用細節,load balancing 的處理方式(我用 haproxy 做例子),reverse proxy 的實作,lambda architecture 在這個 team 的應用跟我對其的理解;還有一些 private cloud 的 feature。他最後跟我說,他把我的 code 仔細看完了,加上跟我 interview 的理解,他覺得我 “technically strong”,不過不知道我是不是 good fit。

不是就不是吧,不管你。這時候我終於從前公司脫身,我親愛的老婆幾個月前就訂了 Cabo 的 all-inclusive package,於是我打算先去度個假,曬曬太陽擺爛,回來再開始刷題。

要出發去 Mexico 前幾天,recruiter 說我上一輪表現良好,於是決定再約我去跟 senior executives 聊一聊。

好吧,妳毀了我的假期。

本來打算去 Mexico 放空的行程,變成討厭的溫書假;因為我不知道到底要念什麼,所以買了一本 Cracking PM Interview 的 Kindle 版(完全沒用),雖然只花了兩塊錢,還是覺得很浪費。另外因為之前提到 lambda architecture ,於是把 Marz 的 Big Data 重新看了一遍。Manning 真是好出版社,買實體書送全部的電子書格式;如果沒念過這本書的 backend engineer,一定要買來放在書架上,不然人家會覺得你不懂 big data。

從 Mexico 回來以後,我就上台拿衣服去了第二次的 onsite;什麼,你不知道什麼是上台拿衣服?那你真的是圖樣圖森破。

這次的 interview 在 Apple Park 飛碟裡面,建築物很高級,廁所很高級,連廁所裡的馬桶都很高級。

第一個 interviewer 是 PM,因為太忙所以遲到,主要問了我一些 resume 上的 project,還沒來得及把 architecture 畫完,他就被第二個 interviewer 趕出去了(事後才知道,他是我的老闆)。

然後第二個 interviewer 問了我一些比較複雜的 design scenario,大概跟 load balancing 還有 consistency 相關,如果對 Cassandra 有一點認識,大概就可以回答的不錯;然後我們繼續討論我在 whiteboard 上畫的那個大餅,這次我終於把圖畫完了。

第三個 interviewer 是我的 skip manager,人住 Sacramento,所以一週只來公司兩三天,公司還幫他在附近找旅館過夜;他在 Apple 已經二十幾年了,比 Jobs 凱旋回 Apple 的時間還早。因為人在外面,所以跟我是用 phone interview 的方式。主要問我有沒有做過 data quality 的相關 project,我簡單提了一下以前在 WalmartPricing 的時候組員出過的包,讓 LCD TV 可以用十塊左右的價錢買到,還有我們之後怎麼防止這件事情發生。(不是我幹的,馬的我的 code 沒有 bug)

第四個 interviewer 是友 team 的 lead,主要做 stats/reporting,他上來就問我,某個 API(就是我去要接的東西)很爛,一次只能取一個月的資料,他的 report 要生過去三年的,然後改 API 短期不可能,要怎麼辦。

我提了 parallelizing request,offline processing 這些方法,他總之就是不滿意,然後又開始狂譙 rate limiting 不合理,V2 遙遙無期;我這時候發現他不是在 interview 我,是在找我抱怨來著;等到他徹底炸裂結束,我只能安慰他,”Shall I have the opportunity, I’ll make sure your concerns are our high priorities.”

沒辦法,人在屋簷下,我還沒拿到 job offer,說不定這輪是 behavior interview 咧。後來他簡單的跟我講了他正在做一些 OLAP 的功能,我於是推薦他 Apache Kylin,他把網頁打開以後,覺得這個 project 非常有意思,因為他們組的確實作了很多 Kylin 有的 feature。

本來表訂我有五個 interviewer,可是最後一個 interviewer 臨時太忙,所以就直接放我鳥了。

馬的誰知道這個 team 有沒有 Microsoft 的 as-appropriate,或者 Amazon bar raiser 這種 practice 啊,我整個人進入 panic mode,雖然說我只刷了 LeetCode easy,掛了也是活該,可是都走這麼遠了,掛了也是很可惜啊。第四個 interviewer 跟我說,表訂的第五個人真的很忙,他知道他在忙什麼,他是真的走不開,要我不要想太多,然後就非常親切的把我彈出 Apple Park 了。

於是就開始了漫長的等待,onsite 是星期四,一直到下個星期三我才收到 recruiter 的消息,說很多人都去了某個 summit,所以沒辦法把所有的 feedback 收集齊,不過就目前的結果來說是好的,要我再等一下。

這個時候我一邊把 LeetCode 的 easy 重新刷一下(從 Mexico 回來以後都忘了好嗎),一邊接到幾間公司的 recruiter email,然後慢慢開始安排跟 recruiter 的 initial phone call;LinkedIn 的 recruiter 最積極,問我有沒有興趣直接去 onsite,我跟她說,呃,可是我還沒準備好;再下個星期三,Apple recruiter 終於再度聯絡我,說她希望星期五之前可以給我結果;星期四她寄了一個 job application 的網站給我,要我正式申請一下這個 position。

星期五中午她傳 iMessage 給我,問我什麼時候可以聊聊,約了一點,結果她又傳訊 delay 半小時;不過這時大概心理已經有數了,好人卡不用跟你這樣約來約去,於是最後總算給了我一個 offer。

經過幾次的拉扯談判以後,我星期一就簽了下去。不是在飛碟,不過可能常常要去開會,也可以偶爾去 Cupertino village 吃晚餐,然後每年可能會去中國看看,manager 說是 as-needed basis,不過因為 interviewer 沒有人講中文,感覺起來我去中國的機會好像比較高。

另外想提一下各個公司 recruiter 的 ethics;簽下去以後五分鐘,從 2016 年就一直有信件的 Google recruiter 問我有沒有興趣,我這次終於沒有跟他說沒準備好,跟他說我已經簽下去了,謝謝再聯絡;過沒幾天,Amazon recruiter 也找我,我跟她說我簽下去了,居然說你上班之前都無所謂,願意的話你明天就可以來 onsite。