前言
從某種角度來講,這裡的 “輕鬆” 並不輕鬆,因為沒有一定的技術功底,面試依然很難,可是換個角度來想,你面的又不是 P7、P8、P9、P10、P11……如果你面的僅僅是一個工作在一線的普通工程師,不需要多年工作積累的人脈和管理經驗,也不一定需要很強的業務能力,只要你在技術的某些方面有過人之處,你就有機會,這樣想是不是輕鬆了很多呢?
準備
如果你要面試一些大廠,(這裡以個人經歷的淘寶面試為例),準備肯定是需要的,就算是網上的各種技術大神,從繁忙的業務專案中脫離,回答一些具體的技術問題時,在沒有準備的情況下,也很難回答的出色,畢竟這不像他們寫文章或者回答問題時有充足的查閱、消化和總結的時間。
比如我以前在學 JavaScript 的時候,看過冴羽大大的《JavaScript 深入系列》,當時覺得作者真是一個技術功底紮實的人,後來有幸在面試前與冴羽大大有所交流,他告訴我他當時為了準備面試,把自己寫的文章又看了一遍,我以為是這類人都比較認真的緣故,然後他跟我說,因為他忘了……忘了……(/□\*)
嗯,回到正題,那麼我們要準備哪些內容呢?要知道技術題目的準備其實並不是最重要的,能夠明白一些面試的道理才是準備的開始。
準備範圍
前端的知識繁雜瑣碎,即便你想面面精通,也是心有餘而力不足,準備面試的時候,也是這樣,沒有人會精通各個方面,說精通的往往各個方面都很淺,面試官其實也非常瞭解這一點,畢竟爺爺也是從孫子走過來的,尤其是面試官往往還是各技術團隊的主管,尤其明白團隊成員擅長的方面並不是一樣的,面試的時候也不會要求面試者面面精通,部分有深入理解,部分熟悉,部分了解即可。
所以對於面試者而言,面試不一定就要準備的非常充分,什麼演算法、React 原理、Vue 原始碼、遊戲引擎、EcmaScript 規範,都能答得頭頭是道,深入淺出,回答之餘還能展示點 leader 的潛質,獲得面試官內心的陣陣驚歎……醒醒吧,少年,你的能力或許能超過面試官,但是見識肯定比不過。
而且抱著這樣幻想的人,往往在準備面試的過程中非常痛苦,因為很多知識並不是你看看書,查下資料就能明白的了,沒有那麼久的時候去實踐、思考、消化,你是很難有深刻理解的,強行理解也只會顧此失彼,背個知識點而已。背知識點倒不是問題,就怕你說的自己很牛逼,面試的時候稍微問個有點深度的問題,理解程度就被看穿了,這就很容易拉低面試官對你的印象分了。
所以如果你要準備,先做的就是斷舍離,精簡自己要準備的知識範圍,從自己的實際業務、以及擅長或感興趣的技術出發,深入探究和準備,比如我就選擇了自己擅長的方面,重點準備了 JavaScript 底層、React、HTTP 等方面的知識,什麼演算法、Canvas、Vue,這方面的知識一點都沒有看,也許你會想,如果你被問到了怎麼辦?
如果被問到了,就直接說不會!絕大部分的不會對面試官而言並不是扣分項,反而還能快速的幫助面試官找出面試者擅長的方向,最討厭的就是明明不是很熟,卻還想要隨口裝下逼,搞得自己高大上、涉獵廣、有深究,然後就被面試官不斷追問,最後只能尷尬的說其實我平時還是幹什麼什麼比較多……面試官心裡肯定也是 MMP,不熟扯什麼犢子!
如何準備
嗯,回到正題,確定了要準備的範圍,那麼該如何準備呢?
既然選了實際業務、以及擅長或者感興趣的技術,你一定知道一些你知道自己不知道的知識點,就比如說我是剛學習前端的新人,雖然我對原型及原型鏈的概念不明白,但是我聽說過,知道自己不知道原型鏈,那我就可以把“原型”這個關鍵詞記錄下來,這樣的關鍵詞初期你會記很多,記錄下來後分個類,然後逐個在 Google、掘金、知乎上搜相關文章,優先找一些高瀏覽量、高讚的文章或者回答閱讀和消化,覺得自己理解的差不多了,嘗試以一個面試者或者給新人介紹的角色去梳理這些知識點,梳理的同時最好能及時記錄下來。
此外學習的時候肯定會遇到很多新的不知道的知識點,接著記錄下來,只要你確定了自己的範圍,新的知識點會越來越少的。
也許你會想,這個準備說的如此簡單,可真到準備的時候,就比如說準備 React,那麼多知識點呢,我豈不是至少要準備一兩個月?
再具體一點,就比如研究虛擬 DOM 的實現,在平時還有工作的情況下,至少也要一個月吧?
其實還真是的,如果你基礎比較欠缺,準備幾個月確實是需要的,要不然你還真以為有什麼祕籍就能輕鬆拿各種大廠的 offer 嗎?
但是你也要知道,這已經是比較快的路了,不走彎路才是最快的路。
此外,如果你真的花一個月的時間只准備一個虛擬 DOM 的實現,對其中 diff 演算法、最短編輯演算法非常清楚的話,說真的,我肯定要面一場講一次,講一次虐面試官一次!
準備程度
確定了要準備的範圍、以及如何準備,那麼要準備到什麼程度呢?
絕大部分的知識點,你知道就可以了,但是,如果所有的知識點都只是瞭解一下,這樣的準備是遠遠不夠的。
難道在學習的過程中就沒有一點疑問?有疑問的時候有沒有嘗試去深究一下呢?
做專案的時候有沒有過想過這個專案如果有什麼什麼功能就好了?又有沒有嘗試去實現這個功能,哪怕要自己寫個外掛來實現呢?
在多人合作的時候,有沒有覺得某些方面的流程需要優化,又有沒有想過該怎麼優化,加快合作效率?
在團隊建設的時候,有沒有覺得團隊中哪個地方沒有做好,或者是規範、或者是腳手架、或者是元件庫、或者是某些技術沉澱,有沒有想過幫助團隊做的更好?
如果你有這樣的想法,請珍惜並且努力的去做,因為這樣的想法你不需要實現太多,幾個就行,而且你做這些東西佔用的時間將不到你學習和工作的 5%,但卻能撐起你面試中 50% 的內容。
案例
面試中經常會講到什麼 STAR 法則,在我看來,就是準備些能夠展示你優秀特質的案例,既然是案例,一需要你事先準備,二需要從你的實際經歷出發。
上文講到的各種想法,你努力實現後,就非常適合改寫成案例。
案例的基本結構就是當時你遇到了什麼問題,然後怎麼去解決的,最後收穫了什麼,或者你在學習什麼的時候對什麼問題感到很好奇,然後深入研究,探索出了原因。
這個東西很重要,又很難,首先是你要從自己的業務或者自己感興趣的問題出發,其次是努力的解決或者研究問題。
舉兩個稍微具體的例子,就比如你開發一個腳手架,然而腳手架並不能完全滿足你的需求,你就會想到如果能實現某個自動的功能就好了,然後你對網上找的各種解決方案都不是很滿意,於是你自己去研究實現,花了一週時間寫了一個外掛,釋出在 npm 上,漂亮的解決了這個問題,然後外掛在公司的各個專案中都有應用到。
或者是說在學習 JavaScript 亂序的時候,看到了一種 Math.random() 實現亂序的方式,雖然方法很驚豔,但是大家卻說這種方式是不能實現真正的亂序的,為了瞭解本質,我深入探究了 V8 原始碼,最終明白是 V8 插入排序演算法導致的問題,(這個具體的原因可以參考冴羽大大的《JavaScript專題之亂序》)
基本套路就是這樣,解決的方式或者研究的東西越有深度越好,這些真實立體的例子會極大的提高你在面試官的印象分。
面試
什麼是面試?如果 Google 搜這個問題,你會得到這樣的定義:
面試,是一種在特定場景下,經過精心設計,通過考官與應試者雙方面對面地觀察、交談等雙向溝通方式,科學測評應試者能力素質、個性品質等要素的人員甄選方式。
雖然書面上是寫著考察能力素質、個性品質這種看似抽象的東西,其實說白了就三點:
技術能力達標,能夠完成團隊的日常工作
讓人願意與之相處
會在公司呆很久
在此基礎上,如果你工作年限比較少,能夠展示出不錯的學習能力、或者對於技術的熱情,如果工作年限比較長,對於技術有更廣泛的視野,有人脈和管理經驗,這些都是大大的加分項。
關於第一點,能夠完成團隊中現在的工作,不一定就需要面試者與團隊的技術棧匹配,就比如說團隊主要的技術棧是 React,你如果 Vue 很好,只要你對技術沒有偏見,依然是可以的,因為你如果 Vue 能做的很好,React 也一定能做的很好,不過真正的問題在於,當技術棧不匹配的時候,面試者是否能在面試官不熟悉的情況下表現出自己的深入研究,還有就是能否表明自己願意重新開始,重新學習的一種 open 的心態。
關於第二點,讓人願意與之相處,因為對於面試官而言,招的不僅僅是下屬,還是同事,能夠融入團隊是件很重要的事情,而對於面試者而言,就需要展現自己一些比較亮眼的特質,比如什麼國家二級運動員、鋼琴六級、二次元小 V、單車去西藏等等,這些事情不僅會給面試官留下深刻的印象,而且會讓人覺得這人很有趣,願意與之相處,實在沒有的話,也沒有太大關係,可以先好好反思人生,然後被問到的時候簡單說下自己的興趣愛好就行,最最基本的要做到面試官態度好時我也態度好。
關於第三點,會在公司呆很久,如果你在上一家公司工作穩定,呆了兩年以上,這個問題倒不用太擔心,對於那些頻繁跳槽的人來說,如果能真誠的解釋下頻繁跳槽的原因,表明願意好好工作的心意,相信面試官和 HR 也會好好理解的。
面試官
與面試官交流的時候,你可能會感到恐慌,覺得面試官好可怕的一個人,但是如果你入職後與之接觸或者問他身邊的人,一般都會是一個比較隨和的人,想想也確實如此,面試時間短暫,又是從完全陌生到部分陌生,一方又是能決定你工作機會的人,萬一對方是大廠,自己內心還有幾分想要這個 offer,各種不對稱很容易就造成了自己內心的恐懼,在面試的過程中如果遇到點挫折,很容易就直接自暴自棄,任由宰割,但是如果你能意識到面試官其實也是個隨和的人,在發揮不好的時候,你大可以坦蕩承認自己的緊張、不足,然後再重振旗鼓,引導面試到自己擅長的方面,最怕的就是遇到些不會的問題,然後就氣勢直降,發揮越來越差,最後只能內心懷著一點點期望,希望面試官還能給自己一次機會,這樣的自己想想都覺得好可惜。
回到正題,除了面試官比較隨和之外,面試官的水平還可能不如你,不過要注意僅僅是可能,有的面試官是團隊中的一線主力,這種還好,整天忙著加班做業務專案的人,絕大部分是沒有足夠時間去研究技術細節實現的,還有的面試官是團隊的主管,更注重管理和業務,這些時候都需要你去談一些比較深入的細節實現,充分體現出你在某些技術方面的深入研究。
當然了,面淘寶的話,對很多細節實現的人都非常瞭解的人還是有的,不過是不是,其實面試的時候面著面著就感受出來了,因為有某些特長的人一般都忍不住秀下自己的特長,對於這些技術大神也是一樣,技術就是他們的特長,這些人往往在追問你細節的情況下,還能根據你的回答,給你普及知識,然後引導你更加深入,這種情況就只能靠個人發揮了,但如果面試官在追問細節的情況下,僅僅是聽你講,你倒是可以嘗試深入細節去講講。
刷題
在沒有明確自己要準備的技術範圍時,去刷題只是用戰術上的勤奮掩蓋戰略上的懶惰,而且如果你要面淘寶,你在網上刷的那些面試題真不一定適合你……
但是!刷題是要的,只是要明確範圍。
引導
如果任由面試官提問,絕大部分的面試官會習慣性的將問題帶到他所擅長的部分,這種是最危險的,因為此時面試官對於提問的問題往往是有比較明確的答案,而對於這些問題的理解程度你很可能達不到面試官的理解水平,很容易就被面試官掌握節奏,所以你需要一開始就引導面試官去提問你擅長的方向,無論是簡歷、還是自我介紹、還是回答、哪怕是承認自己知識的不足之後,也要努力的引導面試官往你擅長或者準備的方向走。
簡歷
簡歷很重要,很重要,很重要,一般面試官都會根據你的簡歷進行提問,簡歷所以很大程度上決定了面試官對你的提問方向。
那麼我們該如何寫好一個簡歷呢?我個人認為就一個標準:不要寫廢話!
這要求你在簡歷寫的每一句話都必須是有意義的,並且做好了被提問的準備。
什麼是有意義,寫個人姓名和聯絡方式是有意義的,寫星座是有意義的嗎?這個問題還真是見仁見智,細細一想好像沒有什麼意義,但再細細一想,假如我面得是運營,寫個水瓶座會不會表明自己年輕的一種心態呢?
又比如寫專案經歷是有意義的,寫自我評價是有意義的嗎?這個又是見仁見智了,我確實見過很多簡歷寫了自我評價,但在我看來,寫的既沒有乾貨,也不讓人信服,絲毫作為不了判斷的依據,感覺更像是湊字數,但確實也見過有些簡歷自我評價寫的不錯,可以作為加分項。
討論這些只是希望你寫簡歷的時候能夠斟酌每一句話的意義所在,以及換成其他的內容意義是否更大?
除了內容要有意義外,對於寫的每一句,你是否都做好了被提問的準備?
就比如說其實你主要的技術棧是 Vue,然後曾經在其他專案裡參與了一點 React 相關的開發,而自己對於 React 其實也就是了解點基本語法,再加上偶爾看到文章的那麼一點了解,那你是否還要在專案經歷中提及 React 呢?
如果是我的話,我一句都不會寫,因為搞不好你的面試官對 React 比較熟一點,Vue 提問不了什麼有深度的地方,就深挖你 React 的知識,而你其實又不熟,最後搞得兩者都很尷尬,所以乾脆一點都不寫,不給面試官留任何機會。
當然如果面試官直接提問你 React 方面的知識,你大可以說以前做專案的時候,接觸過一點,基本語法是熟悉的,不過還是 Vue 最熟悉,相比面試官也不會為難你,再追問 React 的知識,這可比簡歷上裝逼寫 React ,然後被提問,問到慫可好太多了。
如果你這樣逐漸精簡你的簡歷,對於絕大部分人來說,很快你就會發現你的簡歷可能連半頁紙都不到,不過沒有關係,少即是多,去掉就是一種進步,因為你去掉的那些內容在面試官看來其實沒有任何意義,也不會成為選取依據,反而還分散了面試官的注意力,搞不好還會帶來一種劣質簡歷的既視感,引起厭惡。
那麼我實在沒有內容可寫了怎麼辦呢?總不能空著一半簡歷吧?說真的,沒有內容就去努力準備,造一些能寫上去的內容,拿些沒有意義的內容充數更多的作用是自我安慰。
最後在這裡補充一個技巧,如果你做過移動端的作品,你可以直接在簡歷上印上二維碼,方便麵試官直接看到你的作品。
自我介紹
在阿里的面試要求裡,自我介紹是一定要有的流程,面試官不可以因為時間緊急就省略掉面試者的自我介紹環節,而自我介紹環節又是面試官開始與你直接產生交流的第一步,一定要大概率確保面試官會往你準備的方向提問。
首先簡歷上的重複資訊就不用說了,建議是簡單介紹完自己後,就直接上個人主要的專案經歷,或者技術棧,或者這幾年的成長經歷,言語間最好能勾起面試官的提問興趣,但是不要只羅列你做了什麼,重點是表達你做了什麼,學到了什麼,收穫了什麼,如果有具體的數字證明就更好了。
其次是介紹的時候,不要說的太流暢,語速也不要太快,在重點關鍵詞比如具體的數字,技術棧的時候,最好裝作思考的樣子故意說慢一點,這樣會更容易引起面試官的注意。
最後是內容越短越好,這可能會有些反常識,因為一般都會告訴你滿打滿算,但實際上技術面試一般都會至少 40 分鐘起,真正決定面試者是否能通過還是在於一系列的問題,講短些一是不用擔心時間限制,二是說多了面試官也記不住,留下關鍵資訊讓面試官提問就好了,三是就是這麼有個性,與眾不同,沒有想到吧……
回答問題
回答問題的時候,遇到不會的問題不要慌,先直接說不會,不要“啊……嗯……”的拖時間,然後想想是否有相關的知識點可以說一下,然後講講相關的知識點,對這一方面實在不瞭解的話,直接承認自己的不足,然後講講自己擅長或者準備好的方向。
其實是如果遇到實現準備好的問題時,不要說的太流暢,至少要有點思考和回憶的樣子,該有的卡頓還是要有的。
還有就是切忌裝逼以及急於展現自己,有的面試者為了顯示自己涉獵廣,講某個東西的時候,會扯到自己其實並不熟悉的內容,然後就被面試官不停追問……因為你實在是不清楚面試官會根據什麼進行追問和深挖,而且有經驗的面試官往往都會提問些你之前可能沒有注意的問題,所以儘量還是往在你擅長的方面上扯。
開放性題目
在面試的後期,你還會遇到很多開放性題目,常見的不外乎以下 14 道題目,所以以下題目請都準備一份回答,剩下的就看你自由發揮了。
你的優點
你的缺點
最近在看什麼書? 怎麼學習的前端知識? 保持自我學習?
為什麼要從事前端?
為什麼離職?
你的職業規劃
有什麼問題問我的嗎?
最近專案解決的一個技術難點,即專案中遇到了哪些坑?怎樣解決的?
最近做的最成功的一次分享是什麼
說一件你做的最酷的事情是什麼
怎樣理解前端工程化?
前端發展趨勢?
框架選型依據?
所在團隊工作流程的介紹、以及你在團隊中的定位和技術排名
以上問題請不要太如實回答,回答的時候請再配上一個具體的案例,案例的基本套路上面有講,能編成有意思的段子最好,案例可在多個問題中複用,真實面試的時候,請裝的越真越好。
如果你能明白以上這些點,其實我面試時候的題目就不那麼重要了,不過想必你肯定很好奇,所以我也來講一講。
內推
內推其實是阿里最大的招人渠道,儘自己所能找學長、找朋友、找大神,而且成功內推一個比如說 P6 級別的人,內推人可以獲得幾千的推薦費,所以你如果找他們幫忙內推,他們一般都會非常樂意。
不過這些我是直到進來後才知道的,我當時知道的是內推一般都會直接獲得面試機會,所以我還是鼓足勇氣,忐忑的在知乎給冴羽大大發了私信,因為平時有關注他的部落格,覺得為人很隨和,希望至少能給我個建議之類的,不過冴羽大大人真的很好,不僅幫我修改簡歷,內推,還給我講了很多面試技巧,深表感謝。
第一輪電話面
內推的第二天晚上大約 7 點鐘,就接到了面試官的電話,一般面試官都會先詢問你的時間是否合適,我當時剛準備回家,接到電話後,就說正在回家的路上,約到了 7 點半再面試。
於是我果斷喝了一杯水,然後帶了電腦、紙條和中性筆,找了一個會議室,反鎖後就開始回顧紙條上寫的一些系統的知識點,比如說什麼效能優化和跨域的解決方法……
7 點 32 分,面試官打了電話,說真的,這種說好 7 點半,然後晚了 2 分鐘打電話,真的是嚴重消耗面試者的精神,嚴重消耗。
面試的開始永遠是一個自我介紹,一句話表明身份後,就開始介紹自己的專案經歷和主要的技術棧,然後面試官就我所做的專案做了一些提問和了解,我則重點闡述了我基於專案所做的一些優化點和帶來的效果。
然後因為我簡歷中單獨寫了一項“技術關鍵字”,於是面試官就提問了一些技術問題,比如
什麼是作用域鏈?
繼承的原理和應用
虛擬 DOM 的原理
所幸都是些基本的問題,作用域鏈可以看冴羽大大的 JavaScript 深入系列,繼承的話,如果寫過 EventEmitter 和幾個原生元件應該就會有體會,虛擬 DOM 算是準備 React 知識時一個必定要準備的知識點,可以直接搜到很多文章,我在準備時因為時間充足,所以重點看了 React keys 的作用,以及由 keys 引發的一個陣列發生了增加、刪除、移動操作,如何根據前後兩個陣列算出具體由哪些步驟可以從之前的陣列到之後的陣列,雖然這個演算法我也是迷迷糊糊的,但是感覺面試官肯定對這方面也沒有深入的瞭解,畢竟這個知識點很深入,所以就講的很果斷,希望我是秀了一把……
然後就問了效能優化,還好我有準備,嘿嘿……
最後是一些開放性題目,比如還有什麼是你擅長但沒有展示的,這幾年工作的收穫之類。
最最後就是有什麼問面試官的嗎?其實沒有,不過我還是問了一個,“根據我今天的表現,面試官對我有什麼建議?”
面試官給的評價是“知識比較有體系,但是脫離業務”。
說的很準確,我差不多也感受到可以準備二面了。
第二輪電話面
第一輪如果說比較偏技術的話,第二輪就比較偏開放,這主要是因為面試官的等級提升了,關注的點也會有所不同。
自我介紹後,然後就我的技術棧進行了提問,比如說我即做過移動端的活動頁面,又做過 PC 端的後臺專案,就問了我移動和 PC 以及 toB 和 toC 專案的區別。又比如說我講到我寫了一套腳手架,就問我有沒有什麼二次開發?然後我就講了我寫外掛的經歷。然後又問了我如何在團隊推廣我的腳手架之類的。
然後就是各種開放性問題,比如:
1 - 3 年的規劃
為什麼會選擇離開?
如果你再待一年,你會做什麼?
如何選擇新的技術選型?
前端發展趨勢
團隊的組成、在團隊的定位、技術排名
最後就是有什麼問面試官的嗎?其實也沒有,但我又問了跟一面同樣的問題。
面試官給的建議主要是學習和技術選型上的建議,我差不多也感受到可以準備三面了。
技術三面及 HR 面
這次是視訊面,嗯,如果有什麼建議的話,就是一定要穩住、一定要穩住、一定要穩住。
因為這次的面試官不僅又提高了一個等級,而且技術也是業界槓槓的,對於各種語言也頗有了解,不僅從多個語言的角度碾壓了我,而且還利用面試官優勢強行將話題轉到他擅長的話題上,結果他講的比我還多,雖然我面著面著就知道我一定能過了,但依然被面得心態失衡,導致我在回答 HR 的問題時發揮的也很糟糕,總之是一次很慘的經歷,慘的我此時回顧既憤恨又無奈……
總結
面試的內容就這麼多啦,想要拿到大廠的 offer 又怎麼會是件輕鬆的事情呢?平時學習的時候要有總結,做專案的時候要有優化,點滴積累才能有面試的輕鬆,但根本上還是要有對於技術的興趣,對於優秀的追求,有這些的時候那些技巧和方法才能發揮最大的價值。