我的四次Facebook面試經歷
在 FB 已經工作了已經快三年了,在這段日子裡我學到了很多也成長得很快,一切似乎都有序地推進著,可回過頭看加入 FB 的過程卻有些一波三折。翻看郵件記錄,我總共面了 FB 四次:頭兩次面完後我被拒了,第三次拿到了Offer但換成我拒了他們,直到第四次才達成一致加入進來。
第一次面試是在研究生剛畢業的時候,那會兒社交網路正火,對於 FB 和 Twitter 這些比較熱門的公司都會收到很多簡歷,所以對於New Grad來說申請的門檻卻要高很多,我也嘗試網上申請但都石沉大海。
後來是通過 Interviewstreet (網站現在已經更名為 ofollow,noindex" target="_blank">HackerRank 了)這個線上程式測試平臺才拿到了面試機會。當時 Interviewstreet 上的題庫很小但難度很高,只要做完8道題就可以解鎖網站上公司申請功能。我當時只是覺得在上邊做題很有趣,就一直不停地鑽研著,也要感謝一位學長在題目解法上給了我很多的指點讓我更快地領悟了各種演算法的真諦。在艱難地完成了8道題後,我就隨便點了網站上包括 FB 在內的幾個知名公司提交了申請,我也沒有覺得會有下文只是繼續在上邊做題來努力提高排位。
在我去 Seattle 面試 Amazon 的路上,我收到了 Interviewstreet 給 FB recruiter的引薦郵件。這讓我感到非常驚喜,立刻表達了我強烈的興趣,然後順利安排了電話面試。電面一共面了兩題,第一題很快就解決了,但是第二道關於二分查詢的變體我卻卡在了條件檢查上了,最後是通過電子郵件把最後的答案發了過去。在郵件裡我還把我寫二分法的部落格連結貼了上去來表達我是懂這個演算法,好在面試官給了我 onsite 的機會。
因為那時候在忙著畢業的事情,還要帶家人在美國遊玩,所以把面試安排到了一個月以後。也因為如此,我並沒有能夠充分地去準備面試。
在去面試的前一週,我又飛了一次 Seattle 去面 Amazon,因為前一次的面試表現可能並不太出彩,所以他們又換了個組來面。週三飛去,週五飛回,週末跟朋友聚會做畢業離別,週一飛去 SFO,週二面試。因為 Syracuse 去這兩個城市都沒有直飛,所以飛機做了很長時間,體力的消耗也是巨大的。現在想想其實當時應該直接從西雅圖飛到三番去,這樣就不用東西部來來回回的了。
Onsite面試的問題都比較基礎,有一道關於二叉樹的問題,在第一次亞馬遜onsite的時候我被問了一模一樣的,雖然我有看解答思路,但是這次我又沒能給出最優解,就這麼“掛在了樹上”。其中一輪是 behavioral 的面試,因為之前其實對 Facebook 並沒有太多的瞭解,用的也很好,剛畢業也懵懵懂懂的,英語表達也欠流利,所以能感覺出來我的回答完全沒有打動面試官。只是記得最深的問題就是“What do you want to change Facebook?” 所以在後來的時候我一直在思考這個問題。
第一次面試也就此結束,但也能感覺到其實那2012年加入Facebook其實也並不是太難,當時他們還剛剛上市獲得巨大融資所以會瘋狂擴張,其實是加入的最好時機。只可惜我沒有抓住。
第二次面試在2013年7月,當時也在第一家公司工作又一年了其實也蠻適應的,也認識了一些人來幫我推薦,所以又拿到了一次面試 Facebook。而且因為我已經在灣區了,所以電面也直接安排成 onsite 的形式,只是只有一輪演算法類的。
其實當時被問的問題並不難,只是有些刁鑽,只要想到點子上實現就只是簡單的排序後再遍歷計數。可是我卻一直卡在那裡想不清楚條件應該是什麼,所以沒有能夠完成。最後是面試官告訴了那個解題的要點是什麼,聽完我一下子恍然大悟,但為時已晚。當時如果多問些問題求提示可能會好很多。
第三次面試Facebook 的過程就特別的戲劇化,2014年底那兒其實剛進 Twitter 的 Android 組才半年,Facebook 的 recruiter 主動聯絡了我提供機會,我想試著面面看了。第一次安排電面後,我因為一些個人原因不能參加,於是提出推遲到半個月後,他們也非常樂意地幫我重新安排了面試時間放在那個中午12點。
接著,我就安排好了那天請假在家好進行電話面試,也跟太太說了那天我會有空在家。結果太太中間為了預約了牙醫的問診,我當時好像想反正那天在家就去看看牙齒吧,而看牙時間也是在中午。於是那天我就去看牙了,完全忘記了有面試的事情。直到我躺在牙醫的躺椅上,才隱約想起來我好像留在家裡是有其他什麼事情,一下子從椅子上驚起跟醫生告別開車往回家趕。更不巧的巧合是,我的手機還沒電關機了,所以也沒有辦法在路上接到面試官的電話來說明原因。
等我回到家,充上電開啟手機時,面試的時間已經過去15分鐘了。我便給recruiter打電話希望讓對方聯絡上面試官再打給我。面試官也很友好,很快有打了過來,我們就正式開始了面試過程。因為時間的關係,我記得好像也沒有開啟電腦去做題目,只是簡單了聊了些我的技術背景,為什麼想加入 Facebook,面試題也只是口頭說了一下思路。之後便按時結束了面試。
這次電面雖然看起來並不合理也不算合格,但是還是拿到了 onsite 的機會。一個月後我開車去了 Facebook 總部,四輪面試正常的2輪 Coding 1輪 System Design 和1輪Behavioral。除了一輪 Coding,其他的基本都發揮著跟我 level 對應的水平,沒什麼出彩的地方也沒有重大失誤。
那輪 Coding又是二分查詢的變體,當面試官出完題後我先給出了線性的解法,時間複雜度 O(n) 空間複雜度 O(1)。很快面試官就問能不能再優化,我想空間上已經到極限了,只能是時間上的優化,但達到 O(1) 是不可能的,就只能是 O(log n),要達到這個時間水平就只能用二分,而題目也正好是個陣列。整體思路上都是對的方向,只是我糾結在那條件判定沒能理清邏輯,最後沒能完成程式碼。
一週後 recruiter 就打來電話通知結果,也反應出是一輪 coding 不夠好,希望能夠加面一輪。由於11月底和12月都是假期比較多,所以那輪面試被安排到了2015年一月初。加面雖然只有一輪,但也是onsite形式,那次面試官是 manager 職位的,考察重點就明顯放在寫程式碼的能力上,而不像之前那個比較年輕的工程師鑽在解法技巧上。所以問了三道題目都比較簡潔明瞭,我也很輕鬆地完成了三道題目的程式碼。
很快又過來不到一週,recruiter 就發來郵件確認了 offer letter。只是當時在 Twitter 的 Android 核心組學到了很多,想在 Android 方面繼續深造,而 Facebook 提供的職位只是 General Engineer 會偏向產品,所以就表示了歉意沒有接受offer。
之後每個月,recruiter 都會發郵件來詢問我的情況和意向,我們一直保持著交流,甚至在對方離開 Facebook 加入另一家科技公司後還有一起聚餐交流,當然也是想招我過去。之後我的 case 被轉給了 Facebook 的另一個recruiter,依然會時不時地發郵件關心我的情況。
第四次面試是在2015年底,當時 Twitter 裁員了,雖然我沒有失去工作,但是在那段事件裡的任務開展得並不太如意,也害怕再一輪的裁員,於是就開始尋找新的機會。聯絡了 Facebook 的 recruiter,他們表示之前的 offer 依然有效,只需要重新確定入職時間。但我表達希望能獲得 Android Engineer的職位,由於在 Facebook 這是不同的方向,有不一樣的面試流程,所以他們又幫我轉給了 Android 的 recruiter,所以就需要重新面試。只不過因為我已經過了coding的部分,所以沒有電面,onsite也是隻有兩輪,針對 Android 的 Design 和 Behaviorial 各一輪。
面試也是比較中規中矩,面試官都很友好,能感受出Android上的知識和技術都很豐富。其中一位還留下了郵箱給我,在我進入 Facebook 之後還保持著交流,對我從開始的選組到後來的工作適應都提供了很多指導。
就這樣我正式加入了Facebook,回看面試的過程再結合自己在公司裡做面試官時的過程,其實不能感覺出 Facebook 對於初級工程師的招聘要求並不是特別的難,都是比較基礎性的問題,主要考察寫程式碼的能力。當然能不能拿到 offer 有時還要看當時對於該職位的需求有多大,這一定程度上看運氣。比如近前幾年對於 Android 的需求很大,最近對於 AI 和 ML 的工程師招收很多。如果想要拿到高 level,對於coding的要求還是一樣的基礎,只是主要考察的要素都集中在 design 和 behavioral上,考察的點也更將廣泛。
在我成為Facebook裡面試官的後,我也秉承著我面試時 Facebook 面試官對我的友好和麵試側重。比如有個電面的人因為時差弄錯了時間讓我在面試室等了半個小時,在 recruiter 重新建立聯絡後我也很樂意地在當天晚些時候重新面試了對方;還有一次 onsite,對方在演算法上並沒有準備好再加上是最後一輪比較累了,首道簡單的問題也完全答不上來,我便不再追加問題而是坐下來回答對方感興趣的問題並灌輸 Facebook 的好。