從面試官的角度分享一些後端校招經驗

1. 寫在前面

寫在前面
我從去年年初開始在美團當校招面試官,參加了 17 屆春招和 18 屆秋招兩屆面試,總共就面試了五十多我的。原本我也就是剛開始學着當面試官,不應妄談經驗,可是由於最近換了一份工做,將來幾年都不會再有國內互聯網公司的校招經驗了,因此不如趁熱分享一下,免得知識過時。本文是我的體會,並且經驗很少,讀者姑妄聽之就好,沒必要太認真。前端

這篇文章主要針對的是徘徊在 offer 線上下的同窗,由於做爲面試中的初試官,也在這部分同窗上花心思比較多,如何保證經過的質量、如何保證面試的公平性等等,明顯能經過的同窗反而不用花太多心思,offer 的定級交給複試官就好。文章中會用校招圈子的通用標準來描述 offer 等級:批發價、SP、SSP。更高的等級(例如阿里星)就不討論了,拿到 SSP 的候選人我都沒見過幾個。web

開始以前也必須聲明一下, 面試是一件隨機性很大的事情(PS:以前聽過一個準備華爲面試的講座分享,講座上就提到過不少大公司就像華爲同樣都有專門的面試團隊。另外建議你們在面試一個公司的時候瞭解一下這個公司究竟是不是適合本身、瞭解一下這個公司的價值觀。最好不要海投!!!) 。看學生的帖子常常會說某個公司的面試是什麼樣的,可是其實面試的標準每一個人都不一樣,面試官會用本身的方法去評估一我的在不一樣維度上的分數。在實際操做中,公司很難經過培訓等手段統一整個公司的面試標準。一個組、或者是公司派往一個城市的面試團隊之間卻是有可能經過不斷磨合來統一標準。反過來講,整個互聯網圈子因爲人員流動太快,公司之間的面試體系差別卻是不大,一個面試官可能今年在百度,明年在阿里,他會用一樣的體系去評估候選人,而後根據公司的標準去選擇錄取線。面試

這裏寫圖片描述

在面試的時候,面試團隊會盡可能統一標準。不一樣的團隊因爲負責人的偏好可能會有不一樣的傾向、好比有的團隊會看重潛力、看重學習能力,另一個團隊則看重基礎知識,要求錄取的同窗基礎必須紮實。由於標準不一樣,一個公司派往一個城市的兩個團隊可能會給一個同窗給出不一樣的結果。因此我認爲,在後端技術面試體系(而不是招聘流程)的角度談公司意義不大。最近幾年校招同窗在論壇上對面試官的評價和討論愈來愈多,面試官出言不慎很容易給公司惹事,所以公司每每要求面試官少給學生反饋。我看到不少同窗面試幾場下來,只知道面試官問了什麼問題,卻對面試官如何從這些問題中勾勒出一個候選人的知識結構毫無概念,也不知道本身再哪些方面有缺陷,但願本文能給你提供一個不同的視角,學會從面試官的角度思考如何提問,如何評估候選人的水平。算法

2. 如何獲取面試機會

這裏寫圖片描述
獲取面試機會,也就是投遞簡歷,一般就是三種渠道:內推、網申和霸面。數據庫

各個公司都會給內推多一點機會,有的承諾不須要筆試,有的不承諾可是經過機會也比網申大一些,總之儘可能找人內推。可是內推也不是必定能獲得面試機會,經過 HR 篩簡歷以後可能面試官還要篩一次簡歷(或者是各個組本身從簡歷池裏挑人,有的簡歷一直到最後都沒被挑走)。編程

網申通常須要筆試,筆試經過還須要 HR 篩選才能見到面試官。筆試如今都是網上答題,客觀題就不說了,主觀題(例如寫代碼)通常除了系統跑測試用例以外還會有面試官人工判卷。若是是算法題,面試官會判斷是否最優解,若是不是最優解,即便測試用例都經過了也會扣幾分。筆試的標準通常不會過高,能寫出來就行,沒有最優解也能拿到面試機會。後端

不一樣公司的筆試時間不免會衝突,只能作一個,這時候選你喜歡的公司作就好了。互聯網行業的校招中優秀學生的話語權很大,只要簡歷夠好,不參加筆試也有可能獲得面試機會。數組

面試的當天按時到場就能夠了,實在不能來能夠提早問問 HR 可否改個時間面試。放鴿子確實不禮貌,不過 HR 一般也會打電話問一下緣由。若是是以爲確定經過不了,我倒以爲不妨試試,參加面試實戰絕對是提升最快的方法。微信

若是沒有獲得面試機會,去現場霸面也是能夠的。提早一點到,把簡歷交給 HR,而後等通知。因爲面試當天通常會有爽約的學生,因此也會有閒着的面試官,若是是接受霸面的公司,HR 會收集簡歷給面試官看一下,以爲簡歷不錯的一般會獲得面試機會,並且不會由於是霸面就提升經過標準。網絡

另外,幾輪面試官之間會傳遞一些信息,例如哪方面很好,哪方面有欠缺,哪方面沒問之類的。因此也不要糾結爲何某輪面試官問的方向有點奇怪,這都是爲了更全面的評估候選人。

3. 後端的知識體系

這裏寫圖片描述

在校園招聘中,後端能夠說是要求最寬的職位了。你若是去面試 iOS,確定要作過 App,若是去面試前端,確定要寫過 JS,若是要面試算法,確定要作過機器學習。可是面試後端,卻不必定要作事後端。在實際面試中,咱們遇到過各類專業的同窗,通訊、自動化已經算是關聯性較高的了,化工、機械之類的工科也很多,不少同窗都徹底沒有接觸事後端開發,可是拿到了後端 offer。

在面試中,我會按照三個方面去考察:

  1. 手寫代碼
  2. 計算機基礎
  3. 後端開發

3.1. 手寫代碼

這裏寫圖片描述
一個企業不管按照什麼樣的標準去招軟件工程師,手寫代碼都是基本的能力。尤爲是校招的時候,應屆生的項目經驗很少,手寫代碼的重要性就更高了。可是代碼題通常不會太難,像手寫紅黑樹這種難度的題通常不會出現。

考慮到面試時間一般都是半小時到一小時之間,手寫代碼的時間也不會超過 20 分鐘,按照這個時間去卡,就是默寫常見算法(查找、排序等等)或者簡單一些,可是須要現場思考的代碼,通常是 LeetCode 上的 medium 或者 easy 難度,若是 easy 難度的題都作不出來,面試官內心真的要打問號了。

除了手寫代碼以外,可能會有一個不須要寫代碼的算法題,考察對數據結構的理解和分解問題的思路,這個的難度會大一些,也沒辦法估算範圍,只能平時多思考了。

3.2. 計算機基礎

這裏寫圖片描述

計算機基礎一般指的就是考研的四門課,計組通常不會有人問,可是若是沒學好計組的話操做系統、數據庫之類的題可能會理解不深。另外三門課也都是計算機和軟件學生應該具有的基礎知識。

數據結構的水平可能在算法題裏體現出來,若是直接問的話通常不會問太難。有可能問鏈表和數組的區別這種熱身題,也可能出二叉樹前中後序遍歷這種簡單的動手題。

計算機網絡能夠考察的內容主要集中在 TCP/IP 協議上。還可能問 DNS、七層模型之類的問題。網絡這門課不少同窗偏向於死記硬背,對原理性的東西掌握不足,面試的時候通常會先問是什麼,而後問爲何,能把協議設計的原理講明白纔算是合格。

操做系統主要是問進程線程模型,進程間通訊,內存模型,pv 操做之類的。和計算機網絡相似,這門課也有不少同窗死記硬背,面試的時候通常會結合編程問,例如問 Java 中的進程線程實現之類的問題。來考察是背下來的仍是真的理解。

3.3. 後端

這裏寫圖片描述
前面說面試後端能夠沒作事後端,可是若是作事後端的話絕對是加分項,也容易成爲面試的主戰場。對於面試官來講,最須要的一個就是本身很是熟悉,候選人也下過功夫的領域,這樣才能提出有足夠深度的問題,考察出候選人的學習能力。這部分由於不是每一個人都要掌握的,因此通常是結合簡歷上的項目經歷問,簡歷上寫作過什麼纔會問什麼,千萬不要在簡歷上寫本身沒作過和只是打了一下醬油的項目。

我認爲屬於後端的領域包括:編程語言和框架(例如 Java 語言和 Java Web 框架)、數據庫、HTTP、中間件、分佈式系統、系統設計和解決實際問題的能力。這裏語言用 Java 作例子。

Java 語言在語法方面能夠考察的很少,不少面試官喜歡問 Java 類庫的實現,好比哈希表就是一個很常見的題,能夠問 HashTable, HashMap 的區別,若是須要併發的話怎麼辦,ConcurrentHashMap 的實現原理,HashMap 在 JDK 不一樣版本的演進,什麼時候從鏈表換成紅黑樹等等。若是要在簡歷上寫熟悉 Java 的話,最好把經常使用的數據結構代碼都讀一下。此外,多線程、垃圾回收也是很是常見的問題,多看面經的都知道,再也不贅述。

Java Web 你們熟悉的通常是 SSH,若是有 Spring MVC, MyBatis, SpringBoot 的知識也很好。這套技術棧面試官通常都很熟悉,候選人的水平是簡單的照着視頻作過一遍開發,仍是深刻了解過框架的原理,甚至本身試着仿製和修改過框架,都很容易考察出來。

數據庫主要指的是 MySQL 這樣的關係型數據庫。你們在學校裏通常都學過數據庫原理,好比索引的數據結構、三範式。在實踐中通常也作過索引優化,選一兩個例子問原理,還能夠考察對數據結構的理解。

HTTP 對於作過網站的同窗應該都熟悉,尤爲是有的同窗簡歷上還寫熟悉 RESTful,能夠問的問題都不少,好比 GET POST 的區別能夠很容易的看出學習的深度。另外 Session 和 Cookie 也是很是好的考察點,是照着視頻搭的網站仍是本身研究過,研究的多深一問就明白了。在個人經驗中,只有一半作過 Web 的候選人知道 Session 是依賴 Cookie 實現的。

中間件和分佈式系統通常是實習過的同窗纔會問到。應屆生可能理解不會太深,可是仍是有很明顯的區分度。例如 Redis 不少人都會寫到簡歷上,有的同窗只是會調接口,有的同窗知道接口後面是怎麼實現的,還有的同窗不但知道實現,還思考過原理,能講出來爲何要這麼作。

系統設計是很好的題目,聊起來輕鬆,就是有些費時間,無論候選人的水平怎麼樣都能花掉 10 到 20 分鐘。有時候前面能問的很深刻,就沒有時間作系統設計,也有簡歷太簡單,沒什麼可問的,就問兩個系統設計湊夠時間。我出系統設計題通常是描述一個簡單的系統,若是是業務系統,讓候選人寫出數據庫表就能夠了,若是是性能要求比較高的系統,可能會涉及到對中間件的使用和 sharding。系統設計中能夠考察的點就多了,可否考慮到一致性、冪等、冗餘、橫向擴展、將來需求、搜索、統計等等的需求均可以體現出來。

最後可能還會注意到項目中一些比較難的問題,讓候選人複述當時是怎麼作的,若是問題很通用的話,還能夠增長條件,讓問題變得更復雜,現場思考解決方案。這些都是很難提早準備的,可是若是解決問題的時候作過足夠多的調研和思考,在面試的時候都能反映出來。

4. 經過的標準

這裏寫圖片描述
在上述的知識範圍中,如何肯定一個候選人是否經過、和給什麼等級的 offer 呢?我相信每一個公司都爲確立標準和統一標準費盡了心思。可是最後落到面試官手裏的並非一個一應俱全的打分表,而是先後幾輪面試官在溝通一個個候選人的評價時造成的感受。

在標準的確立上,有的 leader 會很是看重候選人的學習能力,只要表現出來很強的學習能力,就算基礎知識不好也能夠。還有的 leader 要求基礎必須好,就算很聰明,對計算機基礎沒有足夠的瞭解也不行。若是想多收 offer,而不是碰運氣撿一兩個 offer 的話,最好能把本身的短板都補齊,在全部的領域都作到有基礎,而後有突出的優勢。

手寫代碼是最最基本的要求,面試軟件工程師不寫代碼確定是不行的,可是不一樣的面試官也有不一樣的要求。有些公司的面試會讓候選人手寫二分查找,冒泡排序之類的,做爲正在找工做的應屆生,不少人都會把常見的查找和排序算法背下來,因此考察效果通常。

面試官通常都有本身得題庫,我也是會準備幾道題,上來會先寫一個單向鏈表空間複雜度 O(1) 的翻轉,這道題應該說足夠簡單,從個人經驗看,80% 的人都能寫出來,寫不出來的話若是還有時間可能會再出一道簡單的題,兩道題都寫不出來就能夠找題目殺時間了。第一道題寫出來就會再出一道稍微難一些的題,若是兩道題都能寫出來,代碼就算合格了。第二道題通常有不少種解法,也有一些擴展問題,若是思路很清晰,能直接找到最好的解法,擴展問題也回答的很好,在代碼部分就算是表現優秀。若是思路不是很清楚,可是通過提示以後想到了方法,這輪只能算是勉強過關。

通常的後端面試,寫代碼都不會出很難的題,一來時間有限,太難就沒辦法問別的了。二來比較難的算法題,思路都十分的精巧,面試的時候能作出來的人,大部分都是刷題的時候作過,而不是水平高到能在幾分鐘以內想出來。其實在後端開發中,只要對常見的數據結構理解充分,可以靈活應用就夠了。

計算機基礎知識的三個方面,學計算機的同窗一般都瞭解的不錯,跨專業的同窗在這方面可能會適當放寬,可是也不能一無所知。通常數據結構是必須掌握的,操做系統和網絡若是沒學過能夠不瞭解。

舉一個例子:TCP 創建和斷開鏈接的過程候選人通常都能寫出來。寫出來以後我會問,爲何 TCP 斷開鏈接要比創建鏈接多一次操做?這個問題聽起來很傻,可是不是全部人都能答出來。若是這個問題回答不出來,能夠說 TCP 的知識只是死記硬背的,根本不理解。還有一個知識點是 2MSL,知道這個時間是怎麼推算出來的,差很少就是全部候選人中的前 30% 了。

除了手寫代碼和計算機基礎,剩下的方面都是可選項,不少碩士應屆生,研究生期間和導師作某個方向的研究,歷來沒寫事後端應用,那隻要基礎知識很紮實,研究作的也不錯就能夠了。還有一些同窗正好相反,基礎知識比較差,可是動手能力很強,本身作過許多東西,這類就要求關於項目的問題回答的很好,表現出很強的自學能力才能經過。

項目的問題我舉個例子,若是一個同窗作過微信公衆號的支付部分,那我會讓他畫一下微信支付的流程圖,而後問從微信的角度考慮,設計流程時,如何防止用戶篡改價格,如何防止重複支付,若是網絡鏈接斷開了,怎麼獲取支付結果,如何防止重放攻擊等等。真的作過項目的同窗,至少流程圖是能畫出來的,可是這遠遠不夠。可以從微信支付的流程中學到支付 API 的設計思路,而且在本身設計 API 的時候可以用上,纔算是學習能力強的候選人。

代碼、計算機基礎、後端這三個方面都合格,或者某一方面有缺陷,可是有優點能補上的同窗就能拿到批發價的 offer 了。批發價的範圍很廣,從剛剛及格,到能力至關全面可是沒有突出亮點的同窗都會拿到批發價。

SP 根據不一樣公司的狀況差異就很大了,有的公司求賢若渴、品牌不夠或者批發價給的低,都有可能致使 SP 比較水。我在美團的時候見到的 SP 不多,不少在 BAT 拿到 SP 的同窗在咱們這裏都沒拿到。一般來講拿到 SP 的同窗都有一兩個大公司的實習經歷,而且對本身實習時的工做很是熟悉。

關於實習,我看到有不少同窗說實習沒有用,其實並不必定。實習很看公司,若是是去小科技公司改頁面或者作作 CRUD,給什麼任務就作什麼任務,對公司的框架、技術體系、業務運轉都一片模糊的話,實習的做用確實不大。可是若是有在一二線互聯網公司中,深度參與到項目中的實習經歷,能夠在項目這部分遠遠超過在校園裏本身作練手小項目的同窗。

要想從實習經歷中表現出很強的學習能力,實習的時候必定要積極,不光交給你的任務要完成,還要努力瞭解整個系統的架構,最好還要知道架構設計的緣由,在瞭解緣由的時候還會觸及到業務背景。實習是一次很全面的考驗,勤奮的同窗可能會努力幹活,可是沒有足夠的好奇心和自我驅動力很難了解到面試官想問的那些問題。

對於沒有實習的同窗,也不是沒有辦法,好比參加競賽。ACM 天然最好,沒有參加 ACM 的也能夠參加一些比較偏向動手的比賽,我印象很深的是有一個同窗參加阿里中間件競賽,雖然沒進決賽,可是講初賽的幾輪改進已經表現出很好的學習能力,在 Java、操做系統、數據結構方面都有明顯的進步過程。另外還有一個同窗參加微軟的創業大賽作了一個 App,比通常同窗練手作的 App 完成度高不少。另外,若是有興趣,本身鑽研一些開源系統也是很好的加分項,好比有些同窗精讀 Linux 源碼,面試官問不出極限,確定會給很高的評價。

在面試的時候,由於要考察候選人的學習能力和自我驅動力,因此不免對計算機專業的同窗的要求更高,對研究生的標準比本科生更高。同理,工做以後再考研的同窗,咱們也會有更高的要求,若是研究生期間只是沿着工做時的老路作些相似的系統,連技術棧都沒有換,那工做經歷對候選人確定是減分項。一樣在社招時,咱們對候選人蔘加工做的時間也會有一些考慮,對於工做八九年還在作初級工做的工程師,也會考慮他是否學習能力不足。

這篇文章寫了這麼多知識點,可是大部分都是在校園裏會學到的內容,我也不以爲應屆畢業生拿到一份年薪 20 萬的 offer 是多麼難的事情,至少相比其餘行業 8-10k 的 offer 來講難度沒有高不少。對於非計算機專業的同窗,要想拿到 offer 通常都提早兩三年開始準備,而且付出了不少的努力。參加三四個月的培訓拿到 offer 的例子,不是沒有,可是真的不多。互聯網公司的面試通常超過兩個小時,我不認爲培訓的時候教的那些技巧可以騙過面試官,因此想去一線公司的同窗,最好仍是早點準備,把基礎學紮實了,再實實在在的作幾個項目。

感謝閱讀到這裏的同窗,祝你們都能拿到滿意的 offer~

做者: 貝頁書
原文地址:http://ju.outofmemory.cn/entry/345963

若是你以爲個人文章對你有幫助話,歡迎關注個人微信公衆號:」Java面試通關手冊「(一個有溫度的微信公衆號,無廣告,單純技術分享,期待與你共同進步~~~堅持原創,分享美文,分享各類Java學習資源。你想關注便關注,公衆號只是我記錄文字和生活的地方,無所謂利益。)

個人公衆號