現狀和背景
我是今年二本畢業的,大三升大四的暑假期間開始學習前端,在這之前一直在小公司打滾。
在這樣的背景下,我從2020年末到2021年三月底為止;基本面完了深圳大多大公司和一些小公司;這篇文章主要是分享自己的一些經歷。
面試情況
- 騰訊 - offer
- 京東凹凸實驗室 - 談薪環節
- 字節跳動 - 談薪環節
- 富途證券 - offer
- Coding - 談薪談崩
- 順豐 - 筆試 + 一面(薪酬面試官直言給不到,就沒繼續下去)
- 還有一些中途掛了的公司(螞蟻、阿里國際化、大疆、微眾)
可能大家覺得面試收獲不錯,但其實我拿到的大廠offer基本是2021年3月份左右收到的,而面試掛掉的基本是2020年年末;當時真是陷入了自我懷疑和崩潰之間,還好我沒有放棄,一路摸爬滾打最終選擇了騰訊。
說實話,普通二本進大廠很難,但並不是沒有機會。想進大廠,就得知道大廠校招看重什么?
校招看什么
校招看重的是四個光環:名校光環、競賽光環、實習光環、項目光環!!!就像很多同學以為刷刷Leetcode就能拿offer一樣,實際幫他拿到offer的是他的學校名字,而不是LeetCode。
學校,在我們踏進去的那一刻就決定了。而另外三個卻是我們可以自己爭取的。這些內容無論你是應聘大公司還是小公司都是非常有競爭力的,跟着做吧。
在大學期間,有很多的算法競賽、ACM競賽,盡量參加全國性的,有含金量的比賽,這才能眼前一亮。
去大公司實習,相比校招進入大公司,那是簡單很多,二本學校的學生,也能進得去實習。而且在大公司都有實習生轉正的機會。
即便進不去大公司實習,在校招時,有實習經歷,也會是簡歷上很重要的一項。而且一般有實習經歷,就會有項目經驗,這真是一舉兩得。
如果實在沒時間實習,或者實習中沒做什么項目的話,那怎么辦呢?在簡歷中最重要的就是項目經驗了,如何解決呢?
敲黑板!!!沒有項目經驗就造項目經驗!!!!
現在網上那么多的實戰教程、github上遍地的源碼分享,都可以為你所用。
在面試時,這些項目經驗都可以寫上,最關鍵的是自己要弄通、弄會,盡量先仿一遍,自己再從頭到尾自己再寫一遍,把所有涉及到的知識點都弄通弄會。面試的時候,就實話實說,就說你自己仿的,沒有關系,做為面試官,我們更看重的是你會啥並且你是不是真的會。
說了這么多,其實想告訴大家的是,不要以為在985/211名校就能不努力了,每年名校畢業找不到工作的大有人在。只有在名校且成績好的同學,才不需要努力。而可笑的是這部分人卻恰恰是最努力的人群。
面試前准備
扎實的技術基礎是面試大廠的前提
- JavaScript基礎(ES6+)
- 瀏覽器基礎(Dom Api、Bom Api、運作機制、渲染原理等等)
- 算法基礎(常見數據結構的應用(棧、隊列、樹、鏈表)、dfs、bfs、簡單的dp)
- 網絡基礎(https、http、http2、dns、tcp等等)
上面這些基礎知識算上是基本要求,而且大多需要日常的積累,基礎問題最好還要答出具體的應用場景和解決了什么問題。
例子:
- 棧的應用:實現面包線或者路由組件,是典型的棧。
- dfs:vue diff過程中采取的策略就是dfs,優勢是****。
- http2解決了什么問題?解決了http大請求阻塞等等。
另外就是原理題目要答的夠細致:
- 瀏覽器加載/解析流程
- 瀏覽器渲染原理
- event loop工作原理
- 最好能夠去看一遍HTML Standard。
如果對自己這方面的技術有信心后,就可以去刷面試題進行查漏補缺(面試題真的只能當查漏補缺看)。
另外不要看不起一些基礎技術,覺得用到去查就行了,常見被我們忽略的基礎:
- 正則表達式(我一開始忽略了,死的很慘)
- 隱式轉換(我一開始忽略了,死的很慘)
可能其他同學也會有各種平時覺得用不上的技術,壓根看不上的技術,覺得沒必要看。但到真的問到就涼了,所以我覺得是看的越多成功率越高。
框架層面,類似react和Vue反而沒有太多問題,基本上了解實現原理,看過核心源碼,理解設計上的理念就問題不大。
工程項目基礎
我之前實習是做金融方面的業務,雖然存在一定的復雜度,但業務專業性太強,面試官根本不懂我做得是啥;一開始我只要聊自己寫的業務,面試官基本處於懵逼狀態,然后就掛了。
所以后面工程和項目相關,我主要說的就是大家都能聽得懂的方向了:
- 性能優化(內存、初始化)
- 前端監控(用戶軌跡埋點、錯誤監控)
在回答項目問題的過程中個人個人認為需要說清楚下面的問題:
- 為什么要做這件事情(交代背景和原因)
- 實施過程是怎么樣的,遇到了什么困難,如何解決?(確認你參與度)
- 最后取得了什么樣的成效(最好能提供實際數據)?
- 拓展:在大量的用戶(數據)環境下,會遇到什么樣的問題
面試過程中技巧
面試過程中除了寫編程題和問一些基礎問題;其余時間基本都屬於聊天,所以重點在於能把天聊下去。聊得開心也就過了;聊得卡頓,讓面試官頻繁看簡歷找問題問,基本就涼了。
所以事先准備一套能夠足夠深入聊下去的技術方向就顯得非常重要,自己腦補好一套連續的問題,自問自答;在面試過程中,引導面試官到自己事先准備好的方向。
前端大廠面試寶典
我把之前刷過的大廠面試題做了一個整理,分了HTML、css、JavaScript、React、Vue、瀏覽器、服務端與網絡、算法等等.....現在分享給大家,希望能幫助到想在這條路上一路走到黑的朋友。
HTML
- html 語義化
- canvas 相關
- svg和canvas的區別?
- html5有哪些新特性?
- 如何處理HTML5新標簽的瀏覽器兼容問題?
- 說說 title 和 alt 屬性
- HTML全局屬性(global attribute)有哪些
CSS
- 讓一個元素水平垂直居中,到底有多少種方案?
- 浮動布局的優點?有什么缺點?清除浮動有哪些方式?
- 使用display:inline-block會產生什么問題?解決方法?
- 布局題:div垂直居中,左右10px,高度始終為寬度一半
- 盒模型
- CSS如何進行品字布局?
- CSS如何進行聖杯布局
- CSS如何實現雙飛翼布局?
- 什么是BFC?
- 觸發條件
- BFC渲染規則
- 應用場景
…
JavaScript
- JS原始數據類型有哪些?引用數據類型有哪些?
- null是對象嗎?為什么?
- ‘1’.toString()為什么可以調用?
- 0.1+0.2為什么不等於0.3?
- 什么是BigInt? 為什么需要BigInt?
- 如何創建並使用BigInt?
- typeof 是否能正確判斷類型?
- instanceof能否判斷基本數據類型?
- 能不能手動實現一下instanceof的功能?
- Object.is和===的區別?
- [] == ![]結果是什么?為什么?
- JS中類型轉換有哪幾種?
- == 和 ===有什么區別?
- 對象轉原始類型是根據什么流程運行的?
- 如何讓if(a == 1 && a == 2)條件成立?
- 什么是閉包?
- 閉包產生的原因?
- 閉包有哪些表現形式?
- 如何解決下面的循環輸出問題?
- 原型對象和構造函數有何關系?
- 能不能描述一下原型鏈?
- JS如何實現繼承?
- 函數的arguments為什么不是數組?如何轉化成數組?
- forEach中return有效果嗎?如何中斷forEach循環?
- JS判斷數組中是否包含某個值
- JS中flat—數組扁平化
- 數組中的高階函數
- 能不能實現數組map方法 ?
- 能不能實現數組reduce方法 ?
- 能不能寫一個完整的深拷貝?
- 數據是如何存儲的?
- V8 引擎如何進行垃圾內存的回收?
- 描述一下 V8 執行一段JS代碼的過程?
- 宏任務(MacroTask)引入
- nodejs 和 瀏覽器關於eventLoop的主要區別
- nodejs中的異步、非阻塞I/O是如何實現的?
- JS異步編程有哪些方案?為什么會出現這些方案?
- 能不能簡單實現一下 node 中回調函數的機制?
- Promise 憑借什么消滅了回調地獄?
- Promise 如何實現鏈式調用?
- 現Promise的 all 和 race
- 解釋一下async/await的運行機制
…
HTTP
- HTTP 報文結構是怎樣的?
- HTTP有哪些請求方法?
- GET 和 POST 有什么區別?
- 如何理解 URI?
- 如何理解 HTTP 狀態碼?
- 簡要概括一下 HTTP 的特點?HTTP 有哪些缺點?
- 對 Accept 系列字段了解多少?
- 對於定長和不定長的數據,HTTP 是怎么傳輸的?
- HTTP 如何處理大文件的傳輸?
- HTTP 中如何處理表單數據的提交?
- HTTP1.1 如何解決 HTTP 的隊頭阻塞問題?
- 對 Cookie 了解多少?
- 如何理解 HTTP 代理?
- 如何理解 HTTP 緩存及緩存代理?
- 為什么產生代理緩存?
- 源服務器的緩存控制
- 客戶端的緩存控制
- 什么是跨域?瀏覽器如何攔截響應?如何解決?
…
TCP協議
- 能不能說一說 TCP 和 UDP 的區別?
- 說說 TCP 三次握手的過程?
- 為什么是三次而不是兩次、四次?
- 三次握手過程中可以攜帶數據么?
- 說說 TCP 四次揮手的過程
- 為什么是四次揮手而不是三次?
- 介紹一下 TCP 報文頭部的字段
- 說說 TCP 快速打開的原理(TFO)
- 說說TCP報文中時間戳的作用?
- TCP 的超時重傳時間是如何計算的?
- 說一說 TCP 的流量控制
- 說說 TCP 的擁塞控制?
…
瀏覽器
- 說一說瀏覽器緩存?
- 說一說瀏覽器的本地存儲?各自優劣如何?
- 說一說從輸入URL到頁面呈現發生了什么?(網絡)
- 談談你對重繪和回流的理解
- 能不能說一說XSS攻擊?
- HTTPS為什么讓數據傳輸更安全?
- 能不能實現事件的防抖和節流?
- 能不能實現圖片懶加載?
Vue
- 什么是MVVM?
- mvvm和mvc區別?它和其它框架(jquery)的區別是什么?哪些場景適合?
- 組件之間的傳值?
- Vue 雙向綁定原理
- 描述下 vue 從初始化頁面–修改數據–刷新頁面 UI 的過程?
- 虛擬 DOM 實現原理
- Vue 中 key 值的作用?
- Vue 的生命周期
- Vue 組件間通信有哪些方式?
- vue 中怎么重置 data?
- 組件中寫 name 選項有什么作用?
- vue-router 有哪些鈎子函數?
- route 和 router 的區別是什么?
- 說一下 Vue 和 React 的認識,做一個簡單的對比
- Vue 的 nextTick 的原理是什么?
- Vuex 有哪幾種屬性?
…
數據結構與算法
-
鏈表
簡單的反轉鏈表
區間反轉
兩個一組翻轉鏈表
K個一組翻轉鏈表
如何檢測鏈表形成環?
如何找到環的起點
合並兩個有序鏈表
合並 K 個有序鏈表
判斷回文鏈表 -
棧和隊列
有效括號
多維數組 flatten
普通的層次遍歷
二叉樹的鋸齒形層次遍歷
二叉樹的右視圖
完全平方數
單詞接龍
優先隊列
關於堆的說明
實現一個最大堆
實現優先隊列
前 K 個高頻元素
合並 K 個排序鏈表
什么是雙端隊列?
滑動窗口最大值
棧實現隊列
隊列實現棧 -
二叉樹
前序遍歷 / 中序遍歷 / 后序遍歷
最大深度 / 最小深度
對稱二叉樹
二叉樹的最近公共祖先
二叉樹的直徑
二叉樹的所有路徑
二叉樹的最大路徑和
…