小公司出身,如何斬獲知名獨角獸公司Offer?

正式開始之前,先說一下這位同學的面試成果,從一個不知名的小公司出身,原先年薪不到 20 萬,通過自己的努力不斷提升技術,最終收穫多個知名互聯網公司的 Offer,年薪達到 30 多萬,幾乎翻倍!


小公司出身,如何斬獲知名獨角獸公司Offer?


本文是讀者 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 年的春節後可以換一家公司,改變自己的命運!


小公司出身,如何斬獲知名獨角獸公司Offer?


苦修半年,成果檢驗

在準備了大概半年後,下面就是樓主正式開始面試的經歷。

面試 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 多萬,薪資是給的最高的。


小公司出身,如何斬獲知名獨角獸公司Offer?


最後的總結

投簡歷策略

先在小公司跑幾家,面幾家之後,就會有感覺了,知道大致的套路是啥了。

第二,如果打定主意去互聯網的話,非互聯網公司不要投。跑來跑去的時間,不如把知識複習紮實點。

簡歷中的知識準備

我感覺技能點不用寫太多,我就寫了 20 條,其實 10 條核心技能點就差不多了。

面試一二線廠的話,他們按照他們的風格去考察,你寫了的也會問,沒寫也會問,所以 10 條核心知識點就夠了。

按照慣常的三面策略,每一面的側重點都不同,你可以自己給自己考察,然後不會的趕緊找資料複習。

比如一面通常都是基礎知識,二面通常圍繞項目來考察,三面通常就是生產環境,解決問題的能力,系統場景設計等等。

論面試心態的重要性,千萬別崩

因為每個面試官的喜好不一樣,很有可能跑了好幾家之後,依然沒有收到 Offer,難免會有一些氣餒。

樓主的建議是此時你應該放慢一下節奏,把這幾天沒回答出來的問題總結出來,不會的趕緊去查漏補缺,無論你之前準備的多好,你面試的過程中都會暴露出很多問題。

然後感覺差不多了,再次大規模的投遞和麵試,我的面試主要集中在第三週,第一週和第二週面試較少,主要是在複習和小公司練手。

最後就是知識點的總結,比如在 JVM 這塊我就掉坑幾次了,後來也是面試跑了一天回來,再累也堅持找資料把漏洞補上了。

這樣回答問題,能讓面試官兩眼放光

這個算是樓主這一個月面試下來,總結的一點經驗吧,樓主自己覺得還是蠻有用的,各位筒子如果不嫌棄,也可以自己試試啦。

舉個例子,比如面試官問你:你們分佈式事務怎麼做的?那麼,你可以按照這樣的思路回答:

  • 在項目中某場景使用到了分佈式事務
  • 為什麼要用分佈式事務?
  • 怎麼使用的分佈式事務?
  • 在使用過程中遇到了什麼問題,然後怎麼解決的?
  • 如果看過源碼,講講分佈式事務框架的源碼和實現思想。

如果每個技術,都按照這樣的思路,每個問題都這樣去回答,回答兩三個問題,面試官就不會懷疑你技術能力了。

中華石杉:十餘年 BAT 架構經驗,一線互聯網公司技術總監。帶領上百人團隊開發過多個億級流量高併發系統。現將多年工作中積累下的研究手稿、經驗總結整理成文,傾囊相授。微信公眾號:石杉的架構筆記(ID:shishan100)。


分享到:


相關文章: