前言
年后我就開始準備面試了,包括兩方面:
- 基本的數據結構和算法。從去年11月份開始,我開始有計劃性地寫 leetcode 算法題,前前后后有刷100多道題目(還有 lintcode 以及刷微博知乎遇到的題目),算是比較慢的了(解題記錄 和 Repo)。
- 完善個人簡歷上提到的項目,把想到的坑都補完(比如提到了MySQL,就把MySQL 相關的面試題準備下)。
關于投遞渠道
毫無疑問,內推是最靠譜的。除此之外,v2ex 求職版塊的資源非常非常好,可能比內推效率更高。一般大公司的技術團隊,都會單獨發布招人信息,等于是直接走內推渠道。個人感覺,按照靠譜程度排名是這樣子的:內推 > v2ex > 官網 > 拉勾等第三方求職網站
面試經歷(開始時間排序)
由于碩士階段學的是非常底層的計算機基礎方面的知識,在選擇投遞崗位上,我沒有特別偏好(但不想做太底層)。所以主要投遞兩個崗位:后端開發工程師(自己更擅長)和前端開發工程師(很早有涉及,在2016年開始關注和了解 React 以及 node.js)。考慮到自己的前端項目經歷不夠豐富,我花很多時間在復習前端方面的知識,以至于后來面試后端崗位的時候,大部分靠之前積累的知識。
1. 螞蟻金服支付寶前端工程師(社招、V2EX)
整整用了將近一個月的時間,一共五面,包括最后HR面試(阿里的HR權利比較大),一面應該是以后工作的同事面我的,計劃是4道leetcode medium 難度的題目(后來實際給我出了3道題目,加一個簡單的問答題)。一開始我根本沒看懂題目,題目是讓你寫一個數據結構來存儲給定的 JSON 格式數據,我花了很久聯想到之前做過的一題 copy linkedList with random pointer,于是按照那個思路來寫,終于寫出來了。第二題類似第一題,有點 copy double linkedList 的感覺,但是每個 node 會有head, next, previous pointer,需要逐一解決,比較像 reverse linkedlist。第三題是一道DFS + 回溯的題目,如果一開始沒想到這種解法,短時間里很難解出來。一面是我在IDE上寫好了代碼之后,粘貼給面試官看,我自己寫的時候非常緊張,還好面試官沒有給我太大壓力,中途我雖然寫題目,但是中間一直在和面試官討論思路。一面一共花了1個半小時。
二面是直屬 leader 面試,三面是部門 leader,都面了我大概37分鐘,主要內容是描述自己的個人項目經歷,以及前端項目經歷,我二面差點以為掛了,因為面試官問到了我對 react redux 的理解,尤其是問我 redux 里面的 store, action, reducer,如果不需要 action 會怎么樣,我按照自己的理解回答了很多,但是最后面試官說我理解有誤,整個人心都涼了。還好最后給通過了。
四面是交叉面試,別的部門的面試官來面我,總的來說,沒有很為難我,主要聊的是自己為什么選擇前端方向和過往項目經歷。
阿里的面試流程非常長,幾乎是兩周3輪面試。
2. 小紅書后端開發工程師(社招、拉勾)4面拿到offer
小紅書的面試雖然是提前一個禮拜安排的(我特意要求HR在下周安排面試,這樣我可以在上海用幾天時間把預約好的公司面試完畢),但卻是最意想不到的,因為整整面試了4個小時(下午3點到7點),由于之前搜到的面經幾乎沒有,也只能硬著頭皮上了。
小紅書的公司在復興SOHO二樓,辦公室高大上,我被帶進了一個會議室之后,就開始了漫長的車輪戰。
一共3個面試官,前兩個是后端開發的工程師,第三個是電商部門的leader,每個人面試我的過程是一樣的:
- 一道 leetcode easy 難度的白板算法題,(類似 leetcode happy number,split function implementation,rotate sorted array )
- 個人項目經歷
- 兩道系統設計題目以及相關的 follow up
其中系統設計題目很有壓力,自己的項目當中很少遇到實際業務導向的題目,印象中的題目有:
- Restful API 設計
- 數據庫 sharding 分片是什么,MySQL怎么做擴容
- 對電商系統有多少了解?庫存系統數據庫設計包括哪些,盡可能詳細的描述從用戶請求發出到系統后臺處理的全部過程
- 訂單下單30分鐘內可以取消,數據庫和業務邏輯該如何設計(涉及到鎖)
- 哈希的原理,為什么hash的查找和加入都是O(1)
- 訂餐系統設計數據庫設計(要求同一時刻進餐的桌數不能超過總桌數,同時需要考慮多人預定不能沖突)
第三輪面試是壓力最大的,面試官總能一針見血的問到你的薄弱處,比如問到我訂餐系統數據庫的時候,我絞盡腦汁想了三種方案,才最后讓我通過。最后HR面試之前,已經確定拿到了offer,所以終于舒口氣了。
總的來說,小紅書的面試是最艱難的,雖然算法難度簡單,但是系統設計題目由于沒有準備的很充分,加上缺少業務經驗,我幾乎是想到了所有能想到的方法來解答。
3. Bilibili Python/PHP 開發工程師(內推) 二面掛
B站的面試安排在小紅書面試的第二天上午十點半 on site,到了公司先讓我從 python 和 php 兩套試卷里選一套寫,題目主要考的語言熟練度和一些基本常識,我選的是 php 試題(然而我 php 已經大半年沒碰了),寫到20分鐘左右,一面的兩個面試官過來面我,沒有算法題,全是系統設計或者和語言相關的題目,印象中的題目有:
- injection dependency 是什么?
- 瀏覽器 跨域是什么,如何跨域以及如何防止跨域?
- php isset() 和 empty() 的區別
- php的autoload有了解么?
- paxos 原理 (我有提到研究生上課看過很多分布式系統論文,比如 paxos,然后就被問了,那還是一年前看的,已經忘記的差不多了,所以千萬不要給自己挖坑,最后我只好說自己印象不太深)
二面應該是部門 leader 面試,難度明顯提升,印象中的題目有: - node.js 的事件循環機制和異步模型
- unix select 和 epoll 的區別
- unix 中如何產生子進程,父進程和子進程的區別是什么
- MySQL 索引策略,為什么 B+ 樹當中key是遞增的
- redis 消息隊列實現(我在描述簡歷的時候,有提到消息隊列,結果面試官就一直問我redis消息隊列的實現方式還有數據類型,又是給自己挖坑,悲劇了)
- 為什么有 nginx 做負載均衡了,還需要 pm2 來管理 node 進程
b 站面試一共用了1小時40分鐘,由于給自己挖了太多坑,但是又都沒有填好。面試官最后讓我回去等通知,我覺得應該是悲劇了。
4. 杭州有贊前端開發工程師(校招、官網)二面掛
一面是遠程視頻面試,兩道在線編程題目,其中第二題是寫一個 JavaScript 事件模型。其他問題包括不限于:
- CSS 盒子模型
- JS 繼承
- CSS 文檔流(塊元素和內聯元素)
- UDP 和 TCP 的區別
- 為什么 TCP 會有第三次握手,第三次去掉可以么
二面是晚上9點半接到的電話面試,突然接到電話,電話聊完了,我才發現這是二面。整個電話面試基本上圍繞了一個問題來說:你怎么看待前端工程師處理切圖這種瑣碎工作的?我回答的顯然沒有得到對方的滿意。20分鐘面試就結束了。我當時最好的做法應該是和面試官安排第二天再面試才對。當晚9點之前已經花了1個半小時做完了美團前端工程師校招的筆試題,腦袋有點混沌的感覺。
5. Strikingly node.js 工程師(社招、V2EX)一面掛
Strikingly 是位于上海的一家創業公司,主要面向海外用戶提供建站方案,早年拿了YC的投資,一直有關注,技術團隊在國內的前端領域比較有名。
然而我一面就掛了,面試我的是公司的CTO 郭達峰,沒有算法題,問的是 node.js 相關的知識點,還是準備得不夠,問到我 shrinkwrap, micro 和 macro task 沒有回答出來。skype面完之后,留給了2道 JavaScript 編程題,一個是寫帶有定時器的函數(函數調用依次間隔1s, 1.5s, 2.25s),第二個是寫一個類似Vue的雙向綁定庫。有寫出來,但是寫的不夠好。
6. 搜狐研究院Web開發工程師(校招、內推)二面等通知
HR先打電話安排了一面電話面試,整體感覺比較輕松,由于之前的面試經歷,問答題問到的問題都有準備過,算法題是一道簡單的二分法題目。面試官感覺不錯,在等二面通知。
7. 其他
主要投遞上海和杭州的公司。北京的公司也投遞過,但是社招的在簡歷環節就被篩掉了。其實三月末到四月份才春招的高峰,比如美團的校招和網易的校招補招。
結語
錯過去年九月份的校招真的是非常遺憾,因為很多大公司在今年的春招面向的是2018年的大三或者研二的學生。只有少數公司還有去年秋招補招的名額。** 所以就只能好好盡全力去準備了,等機會來了,至少不能因為自己沒準備好而錯過。** 還有就是不能一直悶著頭做準備,感覺差不多的時候就可以出手了,機會有時候會比狀態更重要。
算法和數據結構方面,必須要有一定的積累和練習(我覺得可以另開一個話題聊刷題心得了)。而且往往臨場的環境是很難預料的,我在技術筆試或者 on site 面試的前一晚,都會手寫代碼,把一些重要的基本題型再重新捋一遍思路。就算法題而言,leetcode easy 和 medium 難度的題目以及可以應付絕大多數的面試了。
另外,我覺得需要注意到下面幾點,都是血淚的教訓:
- 只要接到面試電話,不管在不在外面,都給自己一點時間調整下狀態(比如安排一個小時候之后)。如果是比較重要的筆試,或者算法面試,一定要和面試官安排晚幾天面試。一般面試官不會拒絕。
- 如果是現場面試,一定要提前半小時到現場,尤其是早高峰時間。
- 遇到不會寫的題目,先嘗試冷靜,然后聯系過往知識,比如數據結構的題目,一般來說離不開常見的數據類型。還有,先別急著寫,把暴力破解或者最簡單的解法和思路和面試官說,一般面試官只要認可你的思路,就一定會問:有沒有時間復雜度更低的算法。這等于告訴你了你,你的思路是沒問題的。就算最后沒有寫出最優解,你也至少能把暴力破解的答案寫出來。
- 系統設計的題目也一樣,把所有可能的答案和思路先說出來,看面試官的反應,只要不差太多,都能夠答到點上。
- BAT大廠的簡歷,早點投遞,因為面試流程較長;創業公司的簡歷,盡早投遞,因為相對更缺人。
- 盡量選一些簡單的公司面試來攢點面試經歷,等面到難一點公司心態上不會太緊張。我3月份的第一個面試就是支付寶,寫算法題的時候,緊張到不行。
- 我自己感覺選擇上午10點半面試,狀態最好。