歡迎光臨
每天分享高質量文章

剛收到了Facebook的Offer,我是這樣為面試做準備的

(點選上方公眾號,可快速關註)

英文:Andy Hope,譯文:36氪/郝鵬程

http://36kr.com/p/5104870.html


我剛剛在矽谷的科技公司完成了7次現場面試,我收到了來自Facebook的軟體工程師的職位Offer。下麵分享一下我是怎麼為面試做準備的,以及我在這個過程中學到的東西。


(一)為了能到矽谷工作,我已準備多年


當我還在澳大利亞的大學學習電腦科學的時候,我總是想象著未來能成為矽谷的一名軟體工程師。我希望自己未來能夠到科技行業的創新中心矽谷去工作。這個標的讓我充滿了動力,它也讓我能夠更加專註地準備面試。


為了更好地學習,我辭去了在墨爾本一家非常棒的公司的首席iOS工程師的工作,然後回到了我的家鄉城市珀斯。在珀斯,我開始為矽谷公司的面試做準備。我知道面試準備將是非常困難和艱巨的一項任務。


如果你告訴一群軟體工程師技術面試的流程,其中的很多工程師都會對常見的面試方法持反對意見。很多爭論來自於這樣一個觀點:即在白板上解決演演算法問題實際上並無法實際代表軟體工程師是否能在實際工作中完成日常任務。


我在這篇文章中不會去討論這個話題。相反,我將從應聘者的角度來探討不同型別的面試實踐。同時,我還會分享我自己在面試過程中學到的東西。


(二)面試是一種技能


在我準備的面試的過程中,我始終知道面試是非常具有挑戰性的。但是直到我被第一次面試折磨之後,我才知道面試是那麼困難。


在面試前,我曾使用過一些付費和免費服務,這些服務可以讓那些擁有行業經驗的人透過電話對應聘者進行程式碼和白板模擬面試。這種面試模擬練習對我應對真實面試中所面對的壓力是非常有幫助的。但是後來我逐漸發現,模擬面試練習只相當於真實面試內容的很小一部分。


我的建議是,在你沒有積累一些模擬或實戰面試經驗之前,不要面試你夢寐以求的工作崗位。面試中緊張的情緒會讓你難以承受,只有透過不斷練習才能剋服這種緊張的情緒。


和生活中的其他很多事情一樣,不斷練習可以增強你的自信。


(三)我經歷的幾種不同型別的面試


如果你在最開始的電話面試中表現得足夠好,你就有機會參加現場面試,面試可能會持續整整幾天的時間。每次面試通常會持續4到6個小時,具體時間取決於你所面試的公司。


在我自己在矽谷面試的過程中,我總共進行了7次現場面試,這讓我對目前的面試現狀有了一個獨特的看待視角。


通常情況下,現場面試會改寫三個主要面試主題:演演算法、架構設計和行為,這些正是我專門研究和精心準備過的面試內容。然而,也有一些公司似乎不按常理出牌,他們會擴大的面試內容範圍,以考察應聘者的更多實用技能。


下麵分享一下我經歷過的幾種面試型別:


(1)演演算法面試


這是最常見的面試型別。面試官會要求你在白板上解決一個問題,並據此來評估你對資料結構、排序演演算法、遞迴、時間/空間複雜度分析、樣式和極端案例識別等方面知識的掌握情況。在這樣的面試中,你通常會提出一個蠻力的解決方案,然後試著改進這個解決方案,並且討論權衡不同的解決方案。


這類面試是我準備最充分的面試型別,因為連續6周時間,我每一天都會練習在一個廉價的懸掛白板上解決演演算法問題,分析它們的時間/空間的複雜性,真正理解所寫的每一行程式碼帶來的結果。


就我個人而言,我非常喜歡白板演演算法,因為我不需要擔心編寫可編譯的語法,這讓我能夠專註於解決手頭要解決的問題。其他人可能不喜歡在白板上進行演演算法面試,對於這些人,我要說的是,如果能堅持練習,這可能會改變他們的想法。


(2)架構設計面試


這是一種非常有趣的面試型別,也是被我嚴重低估的一種面試。面試官會要求你在白板上設計一個系統,比如停車場的售票系統、聊天通訊系統、推特資訊流系統以及其他常見的系統。


透過這類面試,面試官考察的是,在你拿到一個寬泛的概念之後,你如何設計一個能夠滿足所有需求和限制性條件的系統。在這個過程中,需要應聘者提出正確的問題,因為這些問題將會定義需求和限制性條件。這類面試過程更多的是一種對話,你需要在這個過程中畫一些圖表,甚至是階級結構。所有這些都是一種高層次的交流,所以你不需要編寫任何實際的程式碼。


當然,你應該對交流內容進行引導,從而能讓面試官瞭解你在系統工作方式方面的知識。如果你是一名後端工程師,你無需探討客戶端應用程式機制的細節,除非你之前在那個領域積累過一定的專業技能和知識。我是一名iOS工程師,所以我在這類面試中會主要談到架構樣式、功能的模組化、設計樣式,而不是談論如何擴充套件API端點之類的內容。


(3)行為面試


面試官會問你一些關於你自己的問題以及你如何處理一些特定的情況。準備這類面試並沒有準備其它幾類面試那麼難,但是它需要你自己做很多自我反省。


通常會問到的問題包括:


  • 你是如何對待失敗的?

  • 你認為你自己最大的弱點是什麼?

  • 你如何解決衝突?

  • 如果有機會可以重來,你現在的做法會與以前的有何不同呢?


我覺得很難把這類面試搞砸,但我發現很多人確實在這類面試中出了問題。他們試圖把自己的強項偽裝成弱點,他們回答問題時只說那些他們認為面試官會想要聽到的答案,甚至把失敗專案的責任轉嫁到別人身上。類似下麵這樣:


  • “我的弱點就是我太專註了。”

  • “這個專案失敗主要怪Jerry,他把這個專案中的大部分工作都搞砸了。”


要知道,這些面試官都是經過嚴格訓練過的專業人士,他們能輕易辨別那些不稱職的人,並且對應聘者所說的廢話謊言非常敏感。他們能快速將那些不合格的候選人Pass掉。在面試過程中,要真誠,不要耍小聰明,要表現出對你的工作的熱情,承認你的缺點,並表現出有改進缺點的主動性和強烈意願,只有這樣,你才能得到面試官的青睞。


(4)文化匹配性


這通常是與行為面試結合在一起考察的,這主要考察你是否符合公司的價值觀。例如,Facebook鼓勵駭客似的文化,鼓勵員工大膽嘗試新想法,並透過試驗對想法進行測試,而不是害怕打破陳規,也就是所謂的“Move fast and break things”。Airbnb希望創造一個讓人們在任何地方都能找到歸屬感的世界,所以他們通常會尋找那些具有良好好客技能的人才。


很多大型科技公司都非常重視企業文化,並根據應聘者是否符合公司價值觀來決定是否錄用他們。如果你在這樣的一家公司裡面試,你需要想辦法瞭解這家公司的價值觀,並找到你自己那些與公司文化相契合的過往經歷,並向面試官展示出這一點,這一點非常重要。


(5)結對程式設計


一種非常有趣的面試型別是,讓你和另外一位工程師在一個設定好的程式設計環境中結對程式設計,這和實際工作場景非常類似。你會被分配一個基本的任務,任務中列出了你必須完成的一系列需求串列。在你完成每一個任務後,面試官會要求你實施更多的功能,直到到了規定的時間為止。在這個過程中,你可以自由使用你想使用的任何資源,如Stack Overflow或線上檔案。


我發現,在這樣的面試中,很多候選人能否透過考察主要依賴於他們真實世界的開發經驗。與白板面試不同,在這類面試中需要你寫出語法正確的程式碼,因此你應該徹底瞭解你的程式語言和環境,因為你肯定不希望在程式設計面試過程中花太多時間去在網上或檔案裡搜尋答案。


在我之前的工作中,在我在做一項任務時,我會寫乾凈的程式碼,然後等我覺得任務完成之後再進行最佳化。這種工作方式對這種型別的面試是不利的。


(6)發現並修複Bug


作為工程師,我們所做的很多工作都是圍繞著找到和修複那些我們從不同渠道蒐集到的bug。在這類面試中,你會得到一個需要你去找到和修複的bug串列,在這個過程中,你還需要識別其他可能存在問題的程式碼。


我自己只經歷過一次這樣的面試,我覺得這類面試真的很難讓人做好準備,特別對那些經驗所有欠缺的初級工程師更是如此。每個編碼環境都有各自的小怪癖和細微差別,我所做的很多bug修複工作都來自於以前的IDE(整合開發環境)的經驗以及我在過去多年時間裡積累的相關框架。


(7)考察專業領域知識


在我們今天看到的大多數通用語言中,程式設計基本上是相同的。如果你知道一種程式語言的面向物件程式設計,那麼這些技能多半能夠轉移到另一種程式語言裡。但是,這類面試的考察技是不能在語言或框架之間相互轉換的。面試官將會在特定的環境下考察你在有關API、記憶體管理、功能和侷限等專業領域知識的掌握情況。


對於這類主題的面試,練習是很具挑戰性的。和上文中說過的發現並修複bug面試類似,我覺得這類面試問題的答案大都來自於過往的經驗。根據你所申請的職位的級別的不同,面試官評估你的答案的標準會有所不同。例如,如果你申請的是一個初級職位,不知道為什麼一個API的結構是特定的,那麼面試官會在這方面做出讓步,不會對你要求太高。然而,如果你申請的是一個高階職位,面試官對你的要求會更高,這時如果你不知道這個問題的答案的話,這就會給面試官留下非常不好的印象。


(8)對作業系統的瞭解


根據你所應聘的職位或團隊的不同,你可能會有一個專門的作業系統方面的面試。在這個面試中,你會被問到一些問題,面試官透過這些問題對你對計算機作業系統機制的理解進行評估。說實話,這個面試有點讓我措手不及。作業系統是我早年在大學裡學過的東西,但是後來慢慢都淡忘了。


(四)你該如何準備?


正如我在上文中說的那樣,面試本身其實就是一種技能。即使你在日常工作中已經是一名優秀的程式員,或者在你在學校的成績非常優異,但是在面試會議室裡,你的這些技能並不能按1:1的比例方式轉化為面試技能。堅持、重覆地做面試準備和練習將在很大程度上決定你的面試結果。


(1)至少需要掌握這些知識


如果有人問我,我覺得應該關註哪些方面,我建議以下幾點:


  • 首先學習在紙上和白板上手寫程式碼,然後把它放到一個IDE(整合開發環境)中,以便語法高亮顯示,這應該成為你的第二天性。

  • 對資料結構要有深入的瞭解,包括他們的長處和弱點。

  • 完全理解大O符號的時間和空間複雜性,這將與你的演演算法和排序問題完美地配對。

  • 掌握所有主要的排序演演算法,因為時間和空間的複雜性有可能破壞你想要解決的演演算法的最佳解決方案。


(2)何時開始


根據你自己的時間表,越早開始越好。我面試過的很多公司都有一個12個月的冷卻期,面試未透過的應聘者需要等到12個月後才能重新申請公司的職位。反過來說,如果你知道你無法在一年時間內準備好這個面試,,你不妨現在開始這個面試流程,大概感受一下麵試流程具體是怎樣的,到時真正面試的時候就不會那麼害怕了。


覺得本文有幫助?請分享給更多人

關註「演演算法愛好者」,修煉程式設計內功

贊(0)

分享創造快樂