我剛剛在硅谷的科技公司完成了 7 次現(xiàn)場面試,我收到了來自 Facebook 的軟件工程師的職位 Offer。下面分享一下我是怎么為面試做準(zhǔn)備的,以及我在這個過程中學(xué)到的東西。
(一)為了能到硅谷工作,我已準(zhǔn)備多年
當(dāng)我還在澳大利亞的大學(xué)學(xué)習(xí)計(jì)算機(jī)科學(xué)的時候,我總是想象著未來能成為硅谷的一名軟件工程師。我希望自己未來能夠到科技行業(yè)的創(chuàng)新中心硅谷去工作。這個目標(biāo)讓我充滿了動力,它也讓我能夠更加專注地準(zhǔn)備面試。
為了更好地學(xué)習(xí),我辭去了在墨爾本一家非常棒的公司的首席 iOS 工程師的工作,然后回到了我的家鄉(xiāng)城市珀斯。在珀斯,我開始為硅谷公司的面試做準(zhǔn)備。我知道面試準(zhǔn)備將是非常困難和艱巨的一項(xiàng)任務(wù)。
如果你告訴一群軟件工程師技術(shù)面試的流程,其中的很多工程師都會對常見的面試方法持反對意見。很多爭論來自于這樣一個觀點(diǎn):即在白板上解決算法問題實(shí)際上并無法實(shí)際代表軟件工程師是否能在實(shí)際工作中完成日常任務(wù)。
我在這篇文章中不會去討論這個話題。相反,我將從應(yīng)聘者的角度來探討不同類型的面試實(shí)踐。同時,我還會分享我自己在面試過程中學(xué)到的東西。
(二)面試是一種技能
在我準(zhǔn)備的面試的過程中,我始終知道面試是非常具有挑戰(zhàn)性的。但是直到我被第一次面試折磨之后,我才知道面試是那么困難。
在面試前,我曾使用過一些付費(fèi)和免費(fèi)服務(wù),這些服務(wù)可以讓那些擁有行業(yè)經(jīng)驗(yàn)的人通過電話對應(yīng)聘者進(jìn)行代碼和白板模擬面試。這種面試模擬練習(xí)對我應(yīng)對真實(shí)面試中所面對的壓力是非常有幫助的。但是后來我逐漸發(fā)現(xiàn),模擬面試練習(xí)只相當(dāng)于真實(shí)面試內(nèi)容的很小一部分。
我的建議是,在你沒有積累一些模擬或?qū)崙?zhàn)面試經(jīng)驗(yàn)之前,不要面試你夢寐以求的工作崗位。面試中緊張的情緒會讓你難以承受,只有通過不斷練習(xí)才能克服這種緊張的情緒。
和生活中的其他很多事情一樣,不斷練習(xí)可以增強(qiáng)你的自信。
(三)我經(jīng)歷的幾種不同類型的面試
如果你在最開始的電話面試中表現(xiàn)得足夠好,你就有機(jī)會參加現(xiàn)場面試,面試可能會持續(xù)整整幾天的時間。每次面試通常會持續(xù) 4 到 6 個小時,具體時間取決于你所面試的公司。
在我自己在硅谷面試的過程中,我總共進(jìn)行了 7 次現(xiàn)場面試,這讓我對目前的面試現(xiàn)狀有了一個獨(dú)特的看待視角。
通常情況下,現(xiàn)場面試會覆蓋三個主要面試主題:算法、架構(gòu)設(shè)計(jì)和行為,這些正是我專門研究和精心準(zhǔn)備過的面試內(nèi)容。然而,也有一些公司似乎不按常理出牌,他們會擴(kuò)大的面試內(nèi)容范圍,以考察應(yīng)聘者的更多實(shí)用技能。
下面分享一下我經(jīng)歷過的幾種面試類型:
(1)算法面試
這是最常見的面試類型。面試官會要求你在白板上解決一個問題,并據(jù)此來評估你對數(shù)據(jù)結(jié)構(gòu)、排序算法、遞歸、時間/空間復(fù)雜度分析、模式和極端案例識別等方面知識的掌握情況。在這樣的面試中,你通常會提出一個蠻力的解決方案,然后試著改進(jìn)這個解決方案,并且討論權(quán)衡不同的解決方案。
這類面試是我準(zhǔn)備最充分的面試類型,因?yàn)檫B續(xù) 6 周時間,我每一天都會練習(xí)在一個廉價(jià)的懸掛白板上解決算法問題,分析它們的時間/空間的復(fù)雜性,真正理解所寫的每一行代碼帶來的結(jié)果。
就我個人而言,我非常喜歡白板算法,因?yàn)槲也恍枰獡?dān)心編寫可編譯的語法,這讓我能夠?qū)W⒂诮鉀Q手頭要解決的問題。其他人可能不喜歡在白板上進(jìn)行算法面試,對于這些人,我要說的是,如果能堅(jiān)持練習(xí),這可能會改變他們的想法。
(2)架構(gòu)設(shè)計(jì)面試
這是一種非常有趣的面試類型,也是被我嚴(yán)重低估的一種面試。面試官會要求你在白板上設(shè)計(jì)一個系統(tǒng),比如停車場的售票系統(tǒng)、聊天通訊系統(tǒng)、推特信息流系統(tǒng)以及其他常見的系統(tǒng)。
通過這類面試,面試官考察的是,在你拿到一個寬泛的概念之后,你如何設(shè)計(jì)一個能夠滿足所有需求和限制性條件的系統(tǒng)。在這個過程中,需要應(yīng)聘者提出正確的問題,因?yàn)檫@些問題將會定義需求和限制性條件。這類面試過程更多的是一種對話,你需要在這個過程中畫一些圖表,甚至是階級結(jié)構(gòu)。所有這些都是一種高層次的交流,所以你不需要編寫任何實(shí)際的代碼。
當(dāng)然,你應(yīng)該對交流內(nèi)容進(jìn)行引導(dǎo),從而能讓面試官了解你在系統(tǒng)工作方式方面的知識。如果你是一名后端工程師,你無需探討客戶端應(yīng)用程序機(jī)制的細(xì)節(jié),除非你之前在那個領(lǐng)域積累過一定的專業(yè)技能和知識。我是一名 iOS 工程師,所以我在這類面試中會主要談到架構(gòu)模式、功能的模塊化、設(shè)計(jì)模式,而不是談?wù)撊绾螖U(kuò)展 API 端點(diǎn)之類的內(nèi)容。
(3)行為面試
面試官會問你一些關(guān)于你自己的問題以及你如何處理一些特定的情況。準(zhǔn)備這類面試并沒有準(zhǔn)備其它幾類面試那么難,但是它需要你自己做很多自我反省。
通常會問到的問題包括:
你是如何對待失敗的?
你認(rèn)為你自己最大的弱點(diǎn)是什么?
你如何解決沖突?
如果有機(jī)會可以重來,你現(xiàn)在的做法會與以前的有何不同呢?
我覺得很難把這類面試搞砸,但我發(fā)現(xiàn)很多人確實(shí)在這類面試中出了問題。他們試圖把自己的強(qiáng)項(xiàng)偽裝成弱點(diǎn),他們回答問題時只說那些他們認(rèn)為面試官會想要聽到的答案,甚至把失敗項(xiàng)目的責(zé)任轉(zhuǎn)嫁到別人身上。類似下面這樣:
“我的弱點(diǎn)就是我太專注了。”
“這個項(xiàng)目失敗主要怪 Jerry,他把這個項(xiàng)目中的大部分工作都搞砸了。”
要知道,這些面試官都是經(jīng)過嚴(yán)格訓(xùn)練過的專業(yè)人士,他們能輕易辨別那些不稱職的人,并且對應(yīng)聘者所說的廢話謊言非常敏感。他們能快速將那些不合格的候選人 Pass 掉。在面試過程中,要真誠,不要耍小聰明,要表現(xiàn)出對你的工作的熱情,承認(rèn)你的缺點(diǎn),并表現(xiàn)出有改進(jìn)缺點(diǎn)的主動性和強(qiáng)烈意愿,只有這樣,你才能得到面試官的青睞。
(4)文化匹配性
這通常是與行為面試結(jié)合在一起考察的,這主要考察你是否符合公司的價(jià)值觀。例如,F(xiàn)acebook 鼓勵黑客似的文化,鼓勵員工大膽嘗試新想法,并通過試驗(yàn)對想法進(jìn)行測試,而不是害怕打破陳規(guī),也就是所謂的“Move fast and break things”。Airbnb 希望創(chuàng)造一個讓人們在任何地方都能找到歸屬感的世界,所以他們通常會尋找那些具有良好好客技能的人才。
很多大型科技公司都非常重視企業(yè)文化,并根據(jù)應(yīng)聘者是否符合公司價(jià)值觀來決定是否錄用他們。如果你在這樣的一家公司里面試,你需要想辦法了解這家公司的價(jià)值觀,并找到你自己那些與公司文化相契合的過往經(jīng)歷,并向面試官展示出這一點(diǎn),這一點(diǎn)非常重要。
(5)結(jié)對編程
一種非常有趣的面試類型是,讓你和另外一位工程師在一個設(shè)置好的編程環(huán)境中結(jié)對編程,這和實(shí)際工作場景非常類似。你會被分配一個基本的任務(wù),任務(wù)中列出了你必須完成的一系列需求列表。在你完成每一個任務(wù)后,面試官會要求你實(shí)施更多的功能,直到到了規(guī)定的時間為止。在這個過程中,你可以自由使用你想使用的任何資源,如 Stack Overflow 或在線文檔。
我發(fā)現(xiàn),在這樣的面試中,很多候選人能否通過考察主要依賴于他們真實(shí)世界的開發(fā)經(jīng)驗(yàn)。與白板面試不同,在這類面試中需要你寫出語法正確的代碼,因此你應(yīng)該徹底了解你的編程語言和環(huán)境,因?yàn)槟憧隙ú幌M诰幊堂嬖囘^程中花太多時間去在網(wǎng)上或文檔里搜索答案。
在我之前的工作中,在我在做一項(xiàng)任務(wù)時,我會寫干凈的代碼,然后等我覺得任務(wù)完成之后再進(jìn)行優(yōu)化。這種工作方式對這種類型的面試是不利的。
(6)發(fā)現(xiàn)并修復(fù) Bug
作為工程師,我們所做的很多工作都是圍繞著找到和修復(fù)那些我們從不同渠道搜集到的 bug。在這類面試中,你會得到一個需要你去找到和修復(fù)的 bug 列表,在這個過程中,你還需要識別其他可能存在問題的代碼。
我自己只經(jīng)歷過一次這樣的面試,我覺得這類面試真的很難讓人做好準(zhǔn)備,特別對那些經(jīng)驗(yàn)所有欠缺的初級工程師更是如此。每個編碼環(huán)境都有各自的小怪癖和細(xì)微差別,我所做的很多 bug 修復(fù)工作都來自于以前的 IDE(集成開發(fā)環(huán)境)的經(jīng)驗(yàn)以及我在過去多年時間里積累的相關(guān)框架。
(7)考察專業(yè)領(lǐng)域知識
在我們今天看到的大多數(shù)通用語言中,編程基本上是相同的。如果你知道一種編程語言的面向?qū)ο缶幊蹋敲催@些技能多半能夠轉(zhuǎn)移到另一種編程語言里。但是,這類面試的考察技是不能在語言或框架之間相互轉(zhuǎn)換的。面試官將會在特定的環(huán)境下考察你在有關(guān) API、內(nèi)存管理、功能和局限等專業(yè)領(lǐng)域知識的掌握情況。
對于這類主題的面試,練習(xí)是很具挑戰(zhàn)性的。和上文中說過的發(fā)現(xiàn)并修復(fù) bug 面試類似,我覺得這類面試問題的答案大都來自于過往的經(jīng)驗(yàn)。根據(jù)你所申請的職位的級別的不同,面試官評估你的答案的標(biāo)準(zhǔn)會有所不同。例如,如果你申請的是一個初級職位,不知道為什么一個 API 的結(jié)構(gòu)是特定的,那么面試官會在這方面做出讓步,不會對你要求太高。然而,如果你申請的是一個高級職位,面試官對你的要求會更高,這時如果你不知道這個問題的答案的話,這就會給面試官留下非常不好的印象。
(8)對操作系統(tǒng)的了解
根據(jù)你所應(yīng)聘的職位或團(tuán)隊(duì)的不同,你可能會有一個專門的操作系統(tǒng)方面的面試。在這個面試中,你會被問到一些問題,面試官通過這些問題對你對計(jì)算機(jī)操作系統(tǒng)機(jī)制的理解進(jìn)行評估。說實(shí)話,這個面試有點(diǎn)讓我措手不及。操作系統(tǒng)是我早年在大學(xué)里學(xué)過的東西,但是后來慢慢都淡忘了。
(四)你該如何準(zhǔn)備?
正如我在上文中說的那樣,面試本身其實(shí)就是一種技能。即使你在日常工作中已經(jīng)是一名優(yōu)秀的程序員,或者在你在學(xué)校的成績非常優(yōu)異,但是在面試會議室里,你的這些技能并不能按1:1 的比例方式轉(zhuǎn)化為面試技能。堅(jiān)持、重復(fù)地做面試準(zhǔn)備和練習(xí)將在很大程度上決定你的面試結(jié)果。
(1)至少需要掌握這些知識
如果有人問我,我覺得應(yīng)該關(guān)注哪些方面,我建議以下幾點(diǎn):
首先學(xué)習(xí)在紙上和白板上手寫代碼,然后把它放到一個 IDE(集成開發(fā)環(huán)境)中,以便語法高亮顯示,這應(yīng)該成為你的第二天性。
對數(shù)據(jù)結(jié)構(gòu)要有深入的了解,包括他們的長處和弱點(diǎn)。
完全理解大O符號的時間和空間復(fù)雜性,這將與你的算法和排序問題完美地配對。
掌握所有主要的排序算法,因?yàn)闀r間和空間的復(fù)雜性有可能破壞你想要解決的算法的最佳解決方案。
(2)何時開始
根據(jù)你自己的時間表,越早開始越好。我面試過的很多公司都有一個 12 個月的冷卻期,面試未通過的應(yīng)聘者需要等到 12 個月后才能重新申請公司的職位。反過來說,如果你知道你無法在一年時間內(nèi)準(zhǔn)備好這個面試,,你不妨現(xiàn)在開始這個面試流程,大概感受一下面試流程具體是怎樣的,到時真正面試的時候就不會那么害怕了。
-
Facebook
+關(guān)注
關(guān)注
3文章
1429瀏覽量
54734 -
軟件工程師
+關(guān)注
關(guān)注
8文章
218瀏覽量
21136
發(fā)布評論請先 登錄
相關(guān)推薦
評論