分享一位同學的阿里、百度前端面試經驗

蜜糖柚子真好吃 發表於 2020-12-23

【第一部分 面試前的準備】
從決定找工作開始,我其實經歷過一系列思想鬥爭,最開始想的是,等自己完全準備充分之後,再開始投簡歷面試。然而,由於惰性,我發現自己很難判斷什麼時候是完全準備好的時候。

這次換工作的第一次面試,當時的心態就是抱著學習的態度,總要邁出第一步,也許當你放低了自己的預期,實際面試過程中可能也就不會那麼緊張和不自然了,我當時報的期望就是通過面試查詢自己有哪些不足,以及瞭解一下市場上的真實需求。我的目標很明確,就是要通過大廠面試。這次現場面試,讓我一下就找到了狀態,決定全力準備面試。

依稀記得當時自己一共投了7家公司,當時有四家公司(此時沒有阿里和美團)覺得有意向,還想進一步瞭解我一下,商量之後再和我約時間。後續接到面試邀約電話時,我意識到,自己還需要再準備一下。這裡有個心得是,當你覺得自己還需要再準備一下的時候,可以誠懇地和HR或者面試官約定時間,通常時間為1周左右,一般面試官也會理解。你可以說自己很珍惜這次面試機會,需要再好好準備一下。

然後,我為接下來的面試做了如下準備:

1)閱讀了《瀏覽器原理與工作實踐》專欄中關於瀏覽器渲染原理等內容

2)當時和一些同學組織了leetcode刷題小組,大概每週至少3-5題的刷題速度。每週參與線上刷題分享的活動,刷題活動共持續大概1-3個月左右,這期間穿插著面試、總結和查缺補漏。

基本上以上準備,讓我面試前增加了不少信心。

【第二部分 面試題目】
美團、阿里的具體面試題目,我按照「前端基礎知識、前端框架的底層原理、效能優化、計算機網路、演算法、前端工程化、專案經驗」這七大部分來給大家總結:

前端基礎知識,主要從前端四大模組 HTMLCSSJavaScriptDOM, BOM 方面以及前端框架如ReactVue 等準備。
CSS:

大概會有1-2個問題,主要考察各個常見佈局的實現,比如垂直水平居中、雙欄佈局、隨視窗變化的正方形、網格佈局等等,一般需要手寫程式碼,這裡推薦張鑫旭老師的 CSS 世界,多看幾遍足夠應對面試。

HTML:

在我面試的過程中這個問的不多,之前 winter 老師有一道面試題,說說你常用的 HTML 標籤,然後由這道問題可以延伸出很多細節,進而考察你對 HTML 知識的掌握。

JavaScript:

考察 JavaScript 的細節問題是最多的,通常包括但不限於:

1)JavaScript的基本型別

2)setTimeout、Promise、async/await 三者之間非同步解決方案的區別?

3)巨集任務和微任務,通常會給出一段程式碼,讓你給出輸出結果,並解釋?

4)解釋 JavaScript 的單執行緒模型,以及為什麼這樣設計?setTimeout 的延時為何做不到精確?

5)手寫實現 Promise?

6)原型鏈知識的考察,形式也是給出一段程式碼,讓你給出輸出結果,並解釋?

7)說說你用過的 ES6 語法的功能點,對 ES2017-9 的新增功能點是否有關注?

8)解釋 JavaScript 的閉包?解釋 this 指標指向的問題以及常用改變 this 指標指向的函式? apply, bind, call 三者之間的區別?

9)JavaScript 繼承的幾種方式及優缺點?

10)實現節流或者防抖程式碼?

11)fetch 是否可以共享 Cookie?兩個 then 分別對應著什麼?

12)手寫程式碼實現紅綠燈效果,紅燈3秒,綠燈1秒,黃燈2秒,迴圈重複?

13)JavaScript 是如何操作 Cookie 的?

DOM API:

這方面也很少被問到,印象中有這幾道:

1)如何翻轉 DOM?冒泡和捕獲機制,實際應用有哪些?

2)冒泡和捕獲機制,以及實際應用?

前端框架的底層原理
我們以 React 為例,經常會考察內容包括:

1)setState 的內部實現?

2)什麼是虛擬 DOM,引入虛擬 DOM 的目的,虛擬 DOM 一定能解決效能問題麼?

3)React Hooks 有哪些瞭解?

4)react redux 的底層原理?如何完成非同步請求?介紹自己常用哪些 redux 中介軟體?以組合函式的方式手寫程式碼實現中介軟體的級聯功能?

5)react 的 diff 演算法瞭解麼?

6)react 的 fiber 演算法瞭解麼?

7)react pureComponent 和 Component 有何區別?

8)react 的生命週期,新版和舊版都需要了解

9)react 的單向資料流如何理解?

10)如何設計元件?

11)react memo?

12)react 無盡列表是如何實現的?

效能優化
1)瀏覽器的渲染原理是一定會被問到的?

2)瀏覽器輸入一個 url 之後的過程,以及過程中應用了哪些快取,如何優化?

3)script 標籤和 link 標籤的先後順序對頁面載入的影響?

4)async 和 defer 的區別?

5)react native(因為我的簡歷中有寫到使用過 RN)有哪些坑?

計算機網路
1)解釋 TCP/IP 的三次握手和四次揮手?

2)解釋跨域問題以及前端常用的解決方案?

3)CORS 的細節,哪些是簡單請求?哪些是非簡單請求?

4)解釋 HTTPS? 解釋 HTTP/2?

5)HTTP 報文的格式?

演算法
1)手寫氣泡排序?

2)給定兩組數,分別以連結串列方式儲存,求和?注意進位

3)陣列去重?

4)微信紅包是如何實現的?

5)給定一組數,求和函式是帶延時的網路請求,如何在最快的時間內計算出這組資料的和?

前端工程化
1)webpack 如何拆分大檔案?

2)webpack 打包的過程?

3)webpack 的基本配置?

專案經驗
這部分大概很多同學都很關心,到底應該怎麼寫自己的專案經驗。出場率最高的問題也是介紹一下你做得最出色的專案?

首先最重要的是,實事求是。

這方面我認為主要考察候選人在工作中所承擔的角色,以及平時工作中是否注意積累和總結,其實大多數人平時是不善於總結的,我自己也是,所以平時注意寫“詳歷”是對自己很有幫助的。

關於簡歷如何寫,極客時間《面試現場》專欄中有提到,我覺得非常好,分享給大家

詳歷的結構如下:

開頭,“有段經歷,正好遇到了這個問題……”。(講清問題背景)

發展,“一般的做法是做不到的,因為……”。(講問題的複雜性和挑戰)

高潮,“我一開始用到……後來……”。(講解決方案的形成過程)

結局,“成果是……”。(講結果、影響、意義)

所謂“詳歷”,是相對於“簡歷”更詳細的工作經歷和能力的總結,用故事的方式,記錄工作的成果、職位、經驗和能力發展,相當於你的工作檔案,用於回顧個人工作經歷,撰寫簡歷,也是回答面試問題的經歷素材庫。這些素材體現你的個人經驗、技能、潛力、動機。詳歷是你個人工作經歷的故事彙編,是你能力的索引,是給你自己參考用的,隨著經歷的增加而越來越充實;而簡歷是給面試官看的,最好因職位而異。

詳歷主要有三個作用:有助於職業規劃,視覺化技能體系、經驗分佈和成長路徑。是定製簡歷的母版。提供面試素材。當被問到“這個專案最大的提高是什麼”,或者“你失敗的一次溝通是怎樣的”,你可以從準備好的詳歷中,快速選取恰當的故事,講給面試官。

【第三部分 面試流程,以及美團、阿里面試有什麼不同的體會】
(待大量補充,比如:)

可能很多同學都想知道大廠的面試流程,這裡我也簡要分享一下:

總的來說大廠對於候選人的基礎知識要求還是非常嚴格的,當然也更看重候選人的潛力和心智,因為在大廠看來知識是死的,只要時間足夠,通常都可以掌握,但是潛力和心智狀態,卻和每個人的成長軌跡和閱歷有關。

如果你想要學好WEB前端,在學習過程中,身邊沒有一個能夠指導你學習的人,可以到這個WEB前端裙:484,757,760,裡面有根據目前市場需求,錄製的最新的系統教程,不管是計算機專業想要往WEB前端方向發展,還是零基礎想轉行,都可以跟著教程學,有什麼不懂的可以在裡面問。

一面面試官通常是你未來的同事。面試主要考察候選人的基礎知識,我遇到的面試官都非常nice,會寒暄幾句,幫助你脫離緊張的情緒,然後進入正式面試環節。我記得看過一個TED的演講,內容是關於緊張,裡面講就算你真的緊張的不行,也不必擔心,因為人總是比較在意自己的,所以就算你覺得自己非常緊張了,在面試官眼中你表現得也沒有你想象的那麼緊張。

二面面試官通常是你未來的直級leader。這裡阿里和美團不一樣的點在於,當時阿里主要考察了我對於過往專案的掌握程度,以及我在專案中的角色,然後和我聊了很多個人成長方面的心得和看法;美團則側重考察了我一面面試官沒有問到的基礎知識點,這裡其實每個公司可能都不太一樣。

三面面試官通常是你整個部門的leader,主要從職業發展和候選人背景方面進行考察,過程中也會穿插著考些演算法題,不過都不難,主要考察候選率的程式設計能力的。美團到這裡就結束了,之後就是HR和你聊聊薪水,個人背景,跳槽原因等等。

阿里比較特殊,會多一輪交叉面試,四面是HRG和集團技術大佬混合面試,我個人覺得主要考察候選人的溝通、應變及潛力等等,沒太問技術相關的問題,可能我比較幸運吧

想說的是如果想求職阿里,就要做好打持久戰的準備,阿里的面試週期比較長,1-2個月也是很正常的,所以要做好心理準備,如果面試完沒有收到阿里的郵件,應該就通過面試了,沒有訊息就是最好的訊息。美團就很快,當然也看部門是否急需招人,我面試的部門當天就走完了全部流程。

【第四部分 其他 Tips】
下面這些 Tips,都是我平常自己準備面試會遵循的,希望也可以幫助到你。

簡歷編寫,如何過初步篩選
網上優化簡歷的方法論很多,我就不多展開了,我列舉一下我的簡歷框架,希望能給你一些啟發

1)儘量一頁紙展示自己的內容。

2)總體分為7個模組:個人資訊、教育及工作背景、技能清單、專案經驗、開源專案、個人部落格、自我評價,其中開源專案和個人部落格部分可有可無,如果有,自然是加分項。

3)技能清單裡面,寫清楚自己熟悉的語言、框架,甚至能證明你有某方面能力的證照。這裡需要注意的是,千萬別寫“精通”,除非你這門語言或者框架的締造者,一般來說精通一門語言或者框架確實很難。

4)專案部分,我的書寫方式是 工作+結果。挑選專案中我參與的比較重要的部分,然後描述清楚工作內容和我的產出結果,儘量數字化自己的成果,比如專案時間、程式碼量、提高百分比等。再者,專案部分一定要真實,你需要對你寫的內容瞭如指掌並且負責,否則面試官可能會認為你人品有問題。

5)自我評價部分,通常來說,適當包裝自己的優點即可。如果某個企業你十分心儀,也可以參考對方的企業文化,重點匹配自己的內容即可。另外,你寫的優點最好能用1-2個例子來佐證,比如我寫了自己自驅力強,阿里面試官問到我的時候,我就介紹了自己主動學習,參與前端訓練營的培訓、買了很多專欄並學習、關注了很多技術部落格,並寫文章總結等等。

怎麼談薪資
如果到了談錢的時候,首先恭喜你前期的努力終於快見到回報了。我們程式設計師通常都比較內向,不善於談這些,我也一樣,但談錢其實沒有什麼不好意思的。你可能跟我一樣,有著錯誤的心理認知:自己少要點,公司看到我們要的不多,可能會考慮給 Offer。實際上,當你幾輪面試過後,你應該可以判斷出自己是否有可能拿到 Offer的。這時候,你可以先調研一下行業薪資水平,然後再結合自己的水平給出自己的預期,這種情況下,你拿到的 Offer才可能不至於讓自己委屈。有時候,不敢多要也是正常的,多面試幾次,多拿到幾個 Offer,底氣自然也就足了。

養精蓄銳
面試前吃飽飯也是很重要的,記得有次面試一個大廠,沒吃早飯,然後坐地鐵1個小時,3輪面試3.5個小時,三面的時候自己的專注力和精力能明顯感覺到是跟不上的,這樣也是會影響自己臨場發揮的

【最後的心得】
以上就是我的面試經歷分享了,最後,還有幾點心得來跟大家分享:

臨時抱佛腳搜面經、背題,通常來說是沒用的,但是我們通過面試查詢不足,然後努力補足短板,及時總結是很有必要的。在找工作的過程中我每面試一家公司,都會寫面試總結,記錄面試遇到的題目,回憶自己回答好和不好的地方。
面試過程中,對於完全不知道的答案的題目,回答不知道也沒有什麼。面試是一個綜合考察的過程,不會因為你一兩個題目回答不夠好就將你淘汰,而且面試過程中如果遇到不太明白細節的問題,可以和麵試官老師做進一步溝通,這也是你展示自己溝通能力的好機會,千萬別自己悶頭苦想。試想想如果專案中遇到不會的,也會是需要虛心請教的,不然悶頭苦幹只會 delay 專案進度。
在我看來,每一次面試都是一次絕佳的學習機會,尤其是大廠的面試官老師無論是經驗、閱歷以及專業知識,都能很好的給我正向反饋。在面試百度時,二面面試官就和我聊了很多人生選擇以及個人成長方面的思考,面試阿里時也是二面面試官和我聊了很多工作方法論方面的思考,這些對我來說,比熟記幾個知識點更有價值和意義。