正式開始以前,先說一下這位同窗的面試成果,從一個不知名的小公司出身,原先年薪不到 20 萬,經過本身的努力不斷提高技術,最終收穫多個知名互聯網公司的 Offer,年薪達到 30 多萬,幾乎翻倍!面試
本文是讀者 Les 投稿的面試經歷,在此感謝這位同窗的分享算法
回眸再看,感慨萬千數據庫
半年多的準備,1 個月的面試,從準備時的信心滿滿,到初試牛刀的當頭一棒,再到沉下心來,不斷補足短板,再度啓程,最終拿下目前的 Offer。編程
面試準備是一場持久戰,各中滋味、惟有自知。在即將入職新公司以前,特地將這一路走來的心得體會分享出來,給本身作一個總結,也跟廣大筒子共勉。後端
互聯網公司的"面試套路"設計模式
通過此次跳槽面試北京多家互聯網公司以後,樓主總結出了一個「面試套路」。通常的有必定技術氛圍的互聯網公司的面試,大體能夠分爲三面:數組
一面:基礎緩存
一面面試官通常是團隊裏比較資深的工程師,進去以後的同事。而一面通常會問的基礎內容包括:集合、網絡、IO、併發、基本數據結構和算法、JVM。
網絡
根據樓主的面試經歷,若是是面試互聯網公司,一面通常都會挑出上述所說的一個或幾個專題提問。數據結構
數據結構算法不用多說了,樓主建議從準備面試開始,一天刷一到兩道算法題。
不用選擇太難的題目,可是經典的排序、查找算法,基本的數據結構好比二叉樹、鏈表、堆棧,這種必定得會,不然寫不出來就回家。
另外,建議你們去看看 JDK 的底層源碼,好比集合包、併發包的源碼。看的時候必定要邊看邊總結邊畫圖,這樣最後記在你腦子裏的,是一幅幅的圖片。
若是光看不畫圖的話,除非你是天才,不然必定很快就忘了!樓主自身的血淚教訓。
總之,若是能作到上述幾點:掌握經典數據結構算法題目,而且能夠在面試現場,跟面試官畫圖聊聊 JDK 底層源碼的話,一面必過。
二面:項目經驗
二面面試官通常是你將來團隊 Leader,通常會結合項目來進行考察。舉個例子,下面就是一個比較典型的項目連環炮:
你說你項目用到了 XX 技術,OK,那你說下具體使用場景?
爲何你要這麼使用?
這麼使用的好處和壞處?
在用的過程當中有遇到什麼問題嗎?怎麼解決的?
解決以後是否對裏面的原理深刻了解?
通常二面就會從項目各個細節入手,考察各類技術在項目裏是如何運用的,而且技術是如何結合業務來落地的。
而後有的面試官會繼續深挖,看看你對本身項目中用到的技術,掌握的是否足夠深刻。
因此除告終合項目把某個技術說清楚外,最好對這個技術有必定的認識深度。
舉個例子,若是項目裏用到了微服務相關的東西,那麼若是你去看過 Spring Cloud 相關的源碼,好比 Eureka、Ribbon、Feign 這些組件源碼,那麼面試會很加分。
樓主在面試最後拿到 Offer 的那個互聯網公司時,就提到了本身項目中用到了微服務,而且由此去看了註冊中心 Eureka 的源碼。
而後從源碼層面,詳細畫圖闡述了其內部的心跳機制、多級緩存機制等等,甚至給面試官指出了 Eureka 中存在的一些 Bug,那一輪面試樓主印象很深入,和麪試官聊的很是開心。
三面:綜合能力
三面的話,若是是中小公司,多是 CTO 面試。若是是大公司,多是你將來進入的團隊的 Leader 的 Leader,好比說部門總監之類的級別。
總的來講,三面面的比較雜,每一個公司都不太同樣。有的會接着問你基礎,有的會再問你項目,有的直接給你聊情懷,五花八門的都有。
樓主以爲,最重要的仍是一二面,前兩面的反饋很重要。三面的話,只要正常回答,都沒啥問題。
跳槽前的技術積累
接下來,再說下跳槽以前的準備。樓主 3 年經驗,去年下半年因爲不知足於以前公司的技術氛圍和薪資,加上本人又比較能折騰,但願進那種比較知名的互聯網公司挑戰一下,所以萌生了跳槽的想法。
因此從去年下半年開始,利用業餘時間學習了大量技術。從系統的開始準備,到面試第一家公司,大概花了半年的時間。
準備期間學習的技術包括:
Redis 緩存相關技術,以及高併發下的緩存架構設計。這塊是互聯網公司必用必問的,因此樓主對 Redis 技術進行了深刻系統的學習,同時瞭解了一些常見的架構設計技巧。
Elasticsearch。如今互聯網公司通常都有全文檢索的需求,好比網站或者 App 裏的搜索框,因此 ES 技術用的愈來愈普遍。
所以對ES技術也是進行了從頭至尾的學習,對其底層算法、原理以及優化技巧都作了深刻的瞭解,面試的時候,所有可以畫圖講解。
微服務相關技術。微服務就不用說了,互聯網公司必備,如今系統都是用微服務架構來設計的。
所以樓主對 Dubbo、Spring Cloud 技術棧都進行了全面的學習,並且對這些技術都閱讀過底層源碼。
JDK 源碼、設計模式。文章最開始就說了 JDK 源碼的重要性,所以樓主將重要的 JDK 底層源碼,好比集合包、併發包的源碼都讀了一遍。此外,對各類設計模式也作了必定的研究。
分佈式事務、分佈式鎖。分佈式系統這塊,也是面試互聯網公司必問的技術。
常見面試技術問題的梳理和總結。包括數據庫、網絡、IO、分庫分表、MQ 等等。
以上技術,樓主都進行了系統的學習和研究,並且不少技術都嘗試在本身負責的項目中進行了運用和實踐。
大概花費了有半年的時間,幾乎都是夜以繼日的學習,沒有什麼娛樂的時間。由於去年就但願在 2019 年的春節後能夠換一家公司,改變本身的命運!
苦修半年,成果檢驗
在準備了大概半年後,下面就是樓主正式開始面試的經歷。
面試 Week 1:無情打擊,當頭一棒
首先就是寫簡歷投簡歷,樓主在剛過完年後就裸辭了,而後開始投簡歷。雖然大體知道主要面試的是哪些知識點,可是寫完簡歷以後,本身都不敢投,由於畢竟沒太多的面試經驗。
因此第一週僅僅面試了 2 家,當時有面試也會日後推,主要是不想浪費機會。
①新東方在線
新東方旗下的在線教育公司,據說立刻要上市了。首先是一個多線程編程的面試題,比較簡單。
而後就是開聊項目,在項目中穿插問知識點,此次面試由於有很多知識點本身有點忘了,因此不少東西沒回答太好。
好比說 SQL 執行計劃中你最關心的字段,這樣的問題,都沒有回答好。最後的結果是一面就掛了。
第一週面試就被打擊了,有點沮喪。有不少知識點我本身也知道,可是就是沒有掌握,明顯是去被吊打的節奏,浪費了新東方這個機會。
而後週末兩天,哪也沒去,在家裏不分晝夜的全力複習,補足短板。
面試 Week 2:查漏補缺,稍有轉機
①用友
首先是去了以後開始作筆試題,主要是分析哪些 SQL 使用到了索引,爲何索引失效,大概有 10 多條 SQL 分析。
面試過程當中,我主要是往本身擅長的點上面去聊,包括 JDK 底層的源碼,Spring Cloud 等方向,全程我在講。
而後二面的面試官說我不太合適,他們想找能寫先後端的人,不須要互聯網方向的那種。
因此,樓主在這裏給各位筒子提個醒,投簡歷必定慎重,若是你是打定想去互聯網公司的話,非互聯網公司就不要浪費時間了。
在面試過程當中我一共碰到三家這樣的,套路都是相似的,先是一套面試題,而後就一面,面完以後就是回去等消息。
②某中小型的互聯網金融公司
一面:直接開聊,先聊基礎,聊到 Synchronized 鎖的實現原理,CAS 實現原理,Juc 包下併發類的使用場景。
而後開始聊框架源碼,我講了講 Spring Cloud 中 Eureka 的源碼,Hystrix 框架的源碼,而後聊了一下集合相關的類,例如 HashMap、ConCurrentHashMap 等等。
聊到一半以後,面試官對個人態度友好了不少,還探討了一些讀源碼的方法。而後拿着一張筆試題,兩個算法題,二選一,隨便作一個。
樓主屬於那種算法底子通常的,平時刷題也很少,看到算法題就有點慌,最後面試官說寫個二分查找吧。
就這樣,我想因爲前面給面試官的印象稍微好一點,因此這塊就放我過關了。
二面:面試官開始抽查了一些知識,包括 MySQL 索引優化,索引結構,Redis 緩存雪崩、穿透等相關的問題,還問了一些併發相關的問題。
而後給了一個系統設計的場景:在分佈式場景下,100 萬的優惠碼,怎樣保證每一個用戶只能領取一個?領取了以後,再次點擊仍是以前領取的那個。
個人思路是使用存放在 Redis 中再結合分佈式鎖,而後給演示了執行過程,勉強說的過去,最後說有沒有更好的實現方式,想了一會,而後認慫。
接着問了 JVM 類加載流程、GC 回收算法、GC 回收器。恰好這塊沒有看,只能回答對這塊不熟。
最後面試結束,問了一下指望薪資,而後叫我等一下,準備去叫 HR。過了一下子說,這周還要再面試一些人,而後會綜合考慮,就送我出去了。
當時比較鬱悶,不過如今想一想很正常,一個有幾年經驗的工程師居然對 JVM 這些常見的知識點都不熟悉,可怕。結果固然也是掛掉了。
沒說的,樓主趕忙的揹着書包回去,惡補 JVM 相關的知識點。
③一家給銀行作系統的小公司
一面是一個號稱架構師的人面的,一上來我就開聊 Spring Cloud 源碼,恰好他們也在用這套框架,包括 Hystrix。
恰好我對這塊很熟悉,他們只是使用默認的配置,對裏面的原理就是一個黑盒。
我一通講還帶畫圖,直接將他征服。而後就是問我指望薪資,帶我見老闆,入職日期我拖了一週,算是增長了一點信心,拿到一個保底 Offer 了。
面試 Week 3:一氣呵成,拿下 Offer
①一家 A 輪融資的在線教育公司
一面:首先一面就是給你一臺電腦,有三道題目,任選一道讓你作,過了開始下一面。
三道題目以下:
用多線程統計 1 到 1000000 之間有多少素數。
用 Java 實現一個訂單號生成器。
給一個數組,歸併排序。
題目都比較常規,一面順利經過。
二面:首先基本問了一些項目,而後你提到什麼就問什麼。好比樓主提到線程池,他就問線程池的參數有哪些,分別的做用是什麼?而後問了一些基礎的知識集合,併發之類。
而後二面還問了 Spring Cloud 框架源碼,Eureka 增量拉取註冊表機制。
而後就是一些基礎:CAS、CAS 有哪些問題以及怎麼解決,Volatile、Synchronized、線程池、Redis、MySQL 索引,索引優化,索引失效,索引底層結構等。
令我印象深入的是問了我數據庫中整型除了 int,還有哪些整型(tinyInt、bigint)。面試官說好奇好多人都回答不出來,我固然也是沒回答出來。
因爲當晚面完二面比較晚了,而後約了次日下午 5 點 CTO 面試。
三面:是 CTO 面,問的很基礎,好比 HTTPS 怎麼防止被抓包?講講什麼是BIO、NIO、AIO?(當場說沒研究這塊)講講 JVM 類加載流程(第二次跪在上面了)。
而後問了些生產環境的問題,問了生產環境 MySQL 怎麼部署,我說單機部署,對分庫分表沒有深刻研究,估計這幾個問題的抽查,就被 CTO 打死了。最後問了下指望薪資,而後回去等消息。
心態:原本對這家在校教育覺得穩了,結果一直沒有電話聯繫我,此時已通過去了兩週,除了一個小公司 Offer 之外,沒有拿到其餘的 Offer。
而後稍微有點知名度的都在這周的安排表上,我在想若是這周沒搞定一個的話,北京的獨角獸都沒剩下多少了,瞬間感受壓力大了。
再加上這家複試完以後,沒有當即給答覆,通常都是涼了,此時有點心態崩了。
後續:一天以後,HR 沒有聯繫我,因爲據說他家技術氛圍不錯,我就主動打電話過去了,最後的結果是給 Offer,薪資在大概 20 多萬的樣子,常規性漲薪幅度。確實也是本身存在不少問題,好多知識都沒有答出來。
②國內最大的互聯網招聘網站
一面:從基礎到項目統統問了下,項目層面沒有深究,對併發這塊的基礎知識問了,最後是問了分佈式鎖的實現原理。
樓主講了基於 Redis 和基於 Zookeeper 的分佈式鎖實現原理以及框架的源碼,另外深刻講了 Spring Cloud 源碼。
而後就是問了 Dubbo 瞭解多少,讓你設計一個 Dubbo,你會怎樣設計,而後設計一個限流熔斷框架,你會怎麼設計。
再就是針對 Redis 問了下使用場景,怎麼使用,緩存穿透、緩存擊穿等問題。一面整體來講,還比較順利,一面過了以後開始二面。
二面:問了下項目,沒有太過於深究項目,問了項目開發過程當中遇到哪些問題,怎麼解決的?
而後問了下哪些場景使用到多線程,是怎麼使用的,知道線程池的原理嗎,生產環境數據庫怎麼部署?Redis 怎麼部署?
主從數據同步的原理了解嗎?主從架構的延時和數據丟失怎麼解決?有遇到系統 OOM 的問題嗎,怎麼解決?作過哪些 JVM 優化?爲何要這樣配置?
面完後問了指望薪資,說這週會通知,樓主知道又進入備胎模式了,通過上次的經歷,知道戲份不大了。
結果意想不到的是,最後竟然人家發 Offer 了,並且年薪達到了 30 多萬。
③一家中小型的互聯網金融公司
一面:技術官並無問太多的問題,主要是我講了 Spring Cloud 的源碼,而後他們準備轉向 Spring Cloud,最後問了下 Redis 緩存穿透、緩存雪崩,以後就是一些大而形式的問題。
二面:問了數據庫鎖有哪些,什麼狀況下形成數據庫的死鎖,怎麼避免數據庫死鎖。而後就是哪些場景下使用了設計模式。
接着問了下指望薪資,給砍了一點下來,我以爲二面面試官可能以爲我對 MySQL 這塊的鎖不是很熟悉,可是也給 Offer 了,年薪不到 30 萬的樣子。
④一家 D 輪融資的在線教育公司
一面:是結構化面試,從各個方面開始聊,聊集合、併發、網絡、IO,Linux 命令。
而後開始聊 Spring Cloud 框架源碼,最後聊的挺歡快的,固然有些問題沒回答出來,可是氣氛聊的能夠,加上面試官的提示,最後也給出了答案,特別是 Linux 命令這塊。
二面:主要是深刻項目細節,最後聽我講完項目以後。問我什麼是 CAP 理論。其實當時我已經掉入坑中,可是還很傻逼的回答了 CAP 理論和 BASE 理論。
而後問我你的項目符合 CAP 理論嗎?項目中這麼保證一致性?RabbitMQ 這塊的交換器的三種模式是什麼?最後跪了。
⑤好將來(美國上市的教育公司)
首先就是從簡歷第一條開始日後面聊,集合、併發、網絡、IO 原理等,最後問了 Spring Cloud 的源碼,將近聊了一個小時,而後說二面會二天內通知,我就知道涼了,最後果真沒讓經過。
⑥某垂直領域電商公司
一面:問基礎,ConcurrentHashMap 原理,CAS,Synchronized 底層原理,底層採用不一樣的實現方式(自旋鎖等)的不一樣。
JVM 原理,Young 區爲何要有兩塊 Survival 區,只有一塊行不行。而後問了索引結構,什麼是 B+ 樹,索引優化,什麼是聚簇索引,怎麼創建聚簇索引,所有是基礎的問題,沒有涉及任何框架源碼和項目狀況。
二面:內推放水,簡單問了 BeanFactory 和 SpringApplicationContext 是什麼關係,有什麼不一樣。而後幾個簡單問題。而後就給 Offer 了。
⑦必要商城
一面:是基礎問題,相似於上面的基礎問題通常,大同小異,沒有很大差異。
二面:開始問項目,講完項目以後,因爲二面的面試官是老鄉,並且面完以後我就知道沒戲了,就請教了老鄉,能給一些建議嗎?
老鄉說他二面就不會問基礎的知識點了,由於已通過了一面,他做爲二面主要考察的是這個項目你是否真的作過。
第二,你作的項目是否符合他團隊目前的需求。第三,項目中的技術難點是否存在,以及解決方案是否合理,還有一些分佈式的場景怎樣解決。
第四:考慮我能不能過他領導的下一關,最後也是收穫蠻多,後來也沒給 Offer。
⑧趕集網
一面下午 5 點趕過去,跑了一天已經很疲倦了,而後開聊,先講項目,項目中穿插着問一些知識點。
好比面試官問了 MySQL 索引,以及事務的隔離級別,可重複讀是怎麼實現的,MVCC 機制瞭解嗎,等等。
固然更多的是場景設計,設計一個分庫分表的場景,根據什麼來設計。疲憊的我想直接回去了,後來面到 7 點以後,說老大在開會,下次通知來複試,而後就回去了,最後也沒給 Offer。
Offer 盤點及選擇
將近一個月的面試,主要收穫了下面這些 Offer:
一家給銀行作系統的小公司
某 A 輪融資的在線教育公司
某中小型互聯網金融公司
國內最大的互聯網招聘網站
一家垂直領域電商公司
綜合下來,樓主最終選擇了知名度最高的那家獨角獸公司,並且它的年薪也給到了 30 多萬,薪資是給的最高的。
最後的總結
投簡歷策略
先在小公司跑幾家,面幾家以後,就會有感受了,知道大體的套路是啥了。
第二,若是打定主意去互聯網的話,非互聯網公司不要投。跑來跑去的時間,不如把知識複習紮實點。
簡歷中的知識準備
我感受技能點不用寫太多,我就寫了 20 條,其實 10 條核心技能點就差很少了。
面試一二線廠的話,他們按照他們的風格去考察,你寫了的也會問,沒寫也會問,因此 10 條核心知識點就夠了。
按照慣常的三面策略,每一面的側重點都不一樣,你能夠本身給本身考察,而後不會的趕忙找資料複習。
好比一面一般都是基礎知識,二面一般圍繞項目來考察,三面一般就是生產環境,解決問題的能力,系統場景設計等等。
論面試心態的重要性,千萬別崩
由於每一個面試官的喜愛不同,頗有可能跑了好幾家以後,依然沒有收到 Offer,不免會有一些氣餒。
樓主的建議是此時你應該放慢一下節奏,把這幾天沒回答出來的問題總結出來,不會的趕忙去查漏補缺,不管你以前準備的多好,你面試的過程當中都會暴露出不少問題。
而後感受差很少了,再次大規模的投遞和麪試,個人面試主要集中在第三週,第一週和第二週面試較少,主要是在複習和小公司練手。
最後就是知識點的總結,好比在 JVM 這塊我就掉坑幾回了,後來也是面試跑了一天回來,再累也堅持找資料把漏洞補上了。
這樣回答問題,能讓面試官兩眼放光
這個算是樓主這一個月面試下來,總結的一點經驗吧,樓主本身以爲仍是蠻有用的,各位筒子若是不嫌棄,也能夠本身試試啦。
舉個例子,好比面試官問你:大家分佈式事務怎麼作的?那麼,你能夠按照這樣的思路回答:
在項目中某場景使用到了分佈式事務
爲何要用分佈式事務?
怎麼使用的分佈式事務?
在使用過程當中遇到了什麼問題,而後怎麼解決的?
若是看過源碼,講講分佈式事務框架的源碼和實現思想。
若是每一個技術,都按照這樣的思路,每一個問題都這樣去回答,回答兩三個問題,面試官就不會懷疑你技術能力了。