互聯網大廠是如何360°無死角考察技術候選人的?
最近收到不少讀者反饋,說自己在應聘一些中大型互聯網公司的 Java 工程師崗位時遇到了不少困惑。
這些同學說自己也做了精心準備,網上搜集了不少 Java 面試題,然而實際去互聯網公司面試才發現,人家問的,和你準備的對不上號,這就很尷尬了......
因此,從這篇文章開始,筆者準備寫一個長期連載的系列文章:《Java 進階面試系列》。主要跟大家聊聊中大型互聯網公司 Java 面試中的一些熱門、高頻的技術問題。
希望這個系列的文章,能在年后金三銀四的跳槽季中,助各位小伙伴一臂之力。
中大型互聯網公司面試官是如何發問的?
先來體驗一個真實的面試連環炮,現在一些中大型互聯網公司的面試官,在面試候選人時,一般都會采取連環炮的策略來深挖一個候選人的技術水平。
舉個例子,比如說看你簡歷上寫了熟悉消息中間件(MQ 技術)。那么可能我們就會有一個類似下面這樣的連環炮式發問:
- 說說你們公司線上生產環境用的是什么消息中間件?
- 那你們線上系統有哪些技術挑戰,為什么必須要在系統里引入消息中間件?
- 你們的消息中間件技術選型為什么是 RabbitMQ?
- 為什么不用 RocketMQ 或者是 Kafka?技術選型的依據是什么?
- 你們怎么保證消息中間件的高可用性?避免消息中間件故障后引發系統整體故障?
- 使用消息中間件技術的時候,你們怎么保證投遞出去的消息一定不會丟失?
- 你們怎么保證投遞出去的消息只有一條且僅僅一條,不會出現重復的數據?
- 如果消費了重復的消息怎么保證數據的準確性?
- 你們線上業務用消息中間件的時候,是否需要保證消息的順序性?
- 如果不需要保證消息順序,為什么不需要?假如我有一個場景要保證消息的順序,你們應該如何保證?
- 下游消費系統如果宕機了,導致幾百萬條消息在消息中間件里積壓,此時怎么處理?
- 你們線上是否遇到過消息積壓的生產故障?如果沒遇到過,你考慮一下如何應對?
- 你們用的是 RabbitMQ?那你說說 RabbitMQ 的底層架構原理,邏輯架構、物理架構以及數據持久化機制?
- 你們 RabbitMQ 的最高峰 QPS 每秒是多少?線上如何部署的,部署了多少臺機器,機器的配置如何?
- 你們用的是 Kafka?那你說說 Kafka 的底層架構原理,磁盤上數據如何存儲的,整體分布式架構是如何實現的?
- 再說說 Kafka 是如何保證數據的高容錯性的?零拷貝等技術是如何運用的?高吞吐量下如何優化生產者和消費者的性能?
- 看過 Kafka 的源碼沒有。如果看過,說說你對 Kafka 源碼的理解?
- 你們用的是 RocketMQ?RocketMQ 很大的一個特點是對分布式事務的支持,你說說它在分布式事務支持這塊機制的底層原理?
- RocketMQ 的源碼看過么,聊聊你對 RocketMQ 源碼的理解?
- 如果讓你來動手實現一個分布式消息中間件,整體架構你會如何設計實現?
上面僅僅是 MQ 相關技術問題的一部分,實際上,一個比較好的面試官的問題,就是從技術面、技術點、項目實踐幾塊來抽絲剝繭的發問。
技術廣度的考察
首先考察候選人技術面的完整性,因為工作中是需要具備一定的技術視野的,不能說光知道消息中間件,但是分布式緩存卻一無所知。
類似于以前高考的時候,你語文特別好,結果物理特別差,那也是不太合適的。
所以工程師首先要避免自己的技術短板,尤其是三到五年經驗的同學,已經徹底度過了自己人生的職場生涯的初期小白入門菜鳥階段。
所以,務必在工作三到五年的時候,保證自己的技術絕對沒有任何短板,整體技術棧要或多或少都知道一些,不能出現盲區。
比如,我現在問你,你們公司有沒有什么業務場景是可以用 NoSQL 的?現在國內各個公司用 NoSQL 的技術都有哪些選型?具體 NoSQL 可以解決什么問題?
如果你一問三不知,這就是典型的技術短板,你至少需要大概知道,每個技術一般在什么情況下用,怎么來用,解決的是什么問題。
因此,上面說的消息中間件、分布式緩存、海量數據、分布式搜索、NoSQL、分布式架構、高并發、高可用、高性能這些技術。并不是說真的要求工作幾年的同學都要精通到源碼層面。
而是說你工作幾年以后,應該有一定的技術廣度,開闊的技術視野。
底層技術的考察
現在很多互聯網大廠都會有基本功的考察,舉個例子,Java 虛擬機的核心原理、內存模型、垃圾回收、線上 FullGC 卡頓性能優化、線上 OOM 內存溢出問題。
Java并發中的 volatile、鎖優化、AQS 源碼;Netty 背后的 IO、網絡相關的知識。
其實這種底層技術,是線上高負載大型系統的架構設計和開發,必須要具備的。
因為底層技術不扎實,很多中間件或其他高階的技術,都無法深入理解其原理。
而且很多時候,解決線上系統的生產故障,都需要這些技術。因此,底層技術的掌握是一個優秀工程師必須具備的素養。
技術深度的考察
此外,我們一定會深入考察候選人平時工作中熟悉的以及常用的一些技術。
舉個例子,比如你項目里用了 Redis 或者是 Elasticsearch。只要你用過了,而且是你某個項目里的核心技術,那么一定會用連環炮式的發問,深入各種細節、底層、生產環境可能遇到的技術挑戰。
總之,就是要用壓力測試出來你在這塊技術水平掌握的到底有多深,實踐經驗有多強。
一個好的面試官,自己本身技術功底扎實,是可以對一個技術問出一連串的連環炮的,就比如上面的那個消息中間件的連環炮發問。
而且只要面試官在一個技術上的深度超過候選人,那么通過不斷加深的發問,是可以考察出來一個候選人在自己最熟悉的技術領域的技術深度的。
舉個例子,比如說你對一個技術的掌握是否達到了源碼級別:
- 是否對某個框架,或者是中間件深入的理解底層的源碼實現,從源碼級別說清楚它的架構原理?
- 是否對這個技術有過線上的高可用部署,承載過高并發流量的訪問?
- 是否對這個技術在線上生產環境解決過各種各樣的復雜技術挑戰?
- 是否基于這個技術落地到你的業務系統中,設計出各種復雜的系統架構?
通過這種連環炮,可以非常好的考察出某個候選人對技術深度的掌握。技術深度的考察是中大型互聯網公司面試官對一個高級/資深的候選人必須考察的。
因為如果一個人工作五年以上,來應聘高級職位的話,那我們絕對是要求他對至少一個技術領域有著較為深入的研究的。
比如說起碼你得深入閱讀過某個熱門技術的核心源碼,有一定的技術功底,可以解決一些復雜的線上故障。
技術廣度決定了你可以利用各種技術來做項目,但是技術深度決定了你的技術功底。
你未來學新東西有多快,線上系統出了故障你能否快速定位和解決,你能否基于對技術的深刻理解為公司的項目設計和開發出復雜而且優秀的架構出來,這都取決于技術深度。
小結一下:上面我們用一個面試連環炮,引出了平時中大型互聯網公司面試官是如何發問的。
然后從技術廣度、底層技術、技術深度幾個角度說了一下,我們一般如何考察候選人的技術。
接下來將會從項目經驗的考察、系統設計的考察、候選人與崗位的匹配、多輪面試官的協作考察出發告訴大家互聯網公司是如何全方位、無死角的考察候選人的。
知己知彼、百戰不殆,面試也是如此。你只有真正了解了面試官的選拔標準,考察范圍,才能更好的進行針對性的準備,成為行走的“offer 收割機”。
上面咱們用一個面試連環炮引出了平時中大型互聯網公司的面試官是如何發問的。
緊接著從技術廣度、底層技術、技術深度幾個角度說一下,我們一般是如何來考察候選人的技術。
中大型互聯網公司如何來考察候選人的技術?
下面我將會從項目經驗、系統設計、履歷/學歷/素質、候選人與崗位的匹配、多輪面試官的協作這些方面,繼續告訴大家,互聯網公司是如何全方位、無死角來考察候選人的。
項目經驗的考察
項目經驗,絕對是面試官必須考察的,很可能上來就是讓你先畫一下項目整體架構圖,說一下你們項目用了哪些技術以及核心的業務思路。
然后從項目入手,考察你項目里各個技術掌握的如何,通過連環炮對你掌握最好的技術進行深入考察,對一些高階技術的考察,直接下探到底層。
舉個例子,如果你說你們公司里用了 dubbo 作為服務框架:
- 那么會問問你 Dubbo 底層的通信框架是什么?Netty?Mina?
- 然后再問問你底層的 NIO 是啥?網絡通信里的長連接和短連接是啥?
- 你是否看過 Dubbo 的源碼?Dubbo 源碼中你印象深刻的對并發技術的運用是什么?
一些面試官喜歡從項目展開問各種技術,也有一些面試官上來直接從你簡歷上的技術開始發問,從技術深入到項目。這就看個人喜好了。
當然無論如何,最后總會聊到項目的一些業務細節,好的面試官會掌握一個原則:死扣細節。
提問時,必須要深入到你把某個業務細節講清楚,以及結合這個業務細節到底是如何落地和設計技術方案的,如何使用各種技術在業務中的。
比如你說你用了 Redis:
- 那就會進一步問你,你哪個業務用了 Redis?那個業務的流程請你敘述一下?
- 在 Redis 里你們具體是選用了哪種數據結構存放什么數據?數據的過期時間是什么?如果緩存過期了,你的數據兜底方案是什么,到哪兒去回查?
- 你的 key 如何設計的,為什么要這么設計?你的這個業務把數據放在了 Redis 里,是其他哪個業務來查 Redis?為什么要這樣子做?如果不用 Redis 會怎么樣?
這只是一個例子,實際上各種技術都可以在項目里深扣細節。這就能考察出,你對這個技術的實踐到底有多深,經歷過多么復雜的線上業務的實踐,能 hold 住一個技術解決線上系統中的哪些問題。
總之,從項目里,我們可以看出你是否負責過復雜業務架構下的分布式系統的設計和開發?
你們的系統是否面對線上高并發大流量高負載場景的挑戰,你是否經歷過這種技術挑戰?
你們的系統是否承載過億級別海量數據的存儲以及高性能讀寫的挑戰,你是否解決過這些問題?
此外,從項目考察中,還可以直接看出你的整體能力技術定位。你是僅僅負責過一個模塊呢?還是負責過一個子系統?
或者是作為架構師負責過一個完整的項目群,帶過幾十人的團隊,設計過大規模復雜的系統架構?
所以說,你到底把控過什么樣的項目,具備什么樣的能力,從你負責過的項目里,直接可以看出來。
如果你來面試的是中級的崗位,那么可能我們覺得你技術整體 ok,獨立負責過核心模塊的開發,同時對各種技術都有一定的實踐經驗,就 ok 了。
如果你面試的是高級/資深的崗位,那么我們會看看你是否帶領一個小團隊獨立負責過一個有一定復雜度和難度的完整系統的架構設計和開發。
如果你面試的是架構師的崗位,那我們肯定是要求你在一個公司里主導過很多人協作完成的大型而且復雜的項目群。
并且我們要求你對一個大型系統架構有深度的思考和整體的把控,而且這個項目要有足夠的技術挑戰,大用戶量、高并發、海量數據,等等。
因此,項目考察,是重中之重。很多同學平時積累了不少的技術學習,但是有一個很大的問題是,項目經驗和實踐太少。
這些同學可能確實沒經歷過復雜系統的架構設計的歷練,所以非常容易在項目經驗考察這塊出現問題,被面試官判定為技術不錯,但是經驗缺乏。
系統設計的考察
這個也是很多互聯網大廠的面試官,在考察一些高級工程師及以上的同學,喜歡發問的。
一般會把自己公司或者團隊里的一些業務場景拿出來,或者是普遍性的一些業務場景,然后來問你如何針對這個業務場景設計系統架構?
舉幾個例子:
- 如何設計一個電商秒殺系統架構?
- 如何設計一個消息推送系統架構?
- 雙 11 大促的時候如何設計系統的動態擴容/縮容的機制?
類似諸如此類的一些場景式的系統設計考察。其實這個主要是用一些你可能沒接觸過的場景,來現場考察一下你的架構設計思維。
尤其是針對上面說的高級/資深、架構類的崗位,我們尤其會注重現場考察你沒接觸過的業務場景的架構設計。
因為畢竟你來了以后,肯定要讓你接觸全新的業務,然后立馬給出合理而且靠譜的架構設計方案,在新的公司來落地你的經驗。
很多同學平時不太注意積累系統設計的能力,導致出去面試的時候,人家一問場景系統設計問題,直接發蒙了。
所以,平時應該對公司里各種業務場景多思考,自己設定一些挑戰,比如假設你公司的請求量暴增 100 倍,數據量暴增 100 倍,你的系統架構應該如何設計?
多給自己設立挑戰,然后去嘗試著思考設計,才能積累出系統設計的思維和能力來。
基本功的考察
很多大廠都會考察候選人的基本功,尤其是數據結構和算法。比如現場手寫一些常見的算法題。
很多同學很容易倒在基本功這塊,一些基礎的數據結構和算法題都不會寫,那就是有點問題了。
這里強調一下,這個東西并不是應屆生專用的,其實也代表了一個工程師,甚至一個架構師的基本技術素養問題。
因此建議大家平時還是要注重基本功的保持,平時寫寫算法題,熟悉一下數據結構,能保持自己的技術素養不會掉落。
否則數據結構和算法都不熟悉,對復雜系統的技術細節把控基本也就沒法做到,因為很多復雜分布式系統的源碼里,到處是自己寫的數據結構和復雜算法。
整體背景考察
最后一定會綜合看一下一個候選人整體的背景,如履歷背景/學歷背景/過往經驗/綜合素質。
例如考察履歷背景:
- 你過去是外包公司出身?還是傳統 IT 公司出身?或者是一些小型互聯網公司?或者是一二線大互聯網公司出身?
- 另外你的學歷如何?是大專?普通本科?211 / 985 本科?普通碩士?211/985 大學的碩士 or 博士?
- 你過去做的都是一些內部系統,比如 OA 系統,財務系統?或者都是 C 端系統,有上千萬用戶量的系統?或者你過去做的都是某種偏門的項目,比如爬蟲之類的?
- 你的溝通表達能力如何?性格是否踏實和 nice,不浮躁?你是否有團隊協作精神?
這些綜合性的東西,其實都會在我們的整體考察范圍之內,都會納入考慮范圍內,最后決定要不要發 offer。
候選人與崗位需求的匹配
按照上述流程考察下來以后,會經歷多輪面試,基本一次好的面試就可以綜合考察出一個候選人的完整情況了。這個候選人的技術面是否完整,是否有幾個技術領域有足夠的深度?
候選人做過什么樣的項目,項目的實踐經驗如何,把控過多大的團隊和多大的項目,對全新業務場景的系統設計能力如何,基本功如何,綜合背景和素質如何。這些東西,基本上都可以很好的考察出來了。
此時就會將一個候選人跟崗位的需求進行匹配,比如說你要招聘的是一個資深 Java 的崗位,需要他過來開發的是公司里較為核心的子系統。
然后呢,你公司的技術棧是 Dubbo、ZK、Kafka、Redis,等等。
你們公司每秒有上萬的并發訪問壓力,數據量一億以上,線上系統偶爾故障,比如高并發下 ZK 突然報錯異常,導致系統業務中斷,然后需要帶 4 個初級和中級的兄弟一起開發。
這時,你考察完一個候選人,就知道他的技術能力是否匹配這個崗位,技術深度能否 cover 住線上系統常見的一些故障。
能否在線上故障的時候,立馬有足夠的源碼功底分析、定位和解決問題。是否有過類似足夠的高并發和海量數據的項目經驗。
是否帶過幾個人獨立把控過一個核心系統的架構設計和開發,過去的公司背景咋樣,學歷咋樣,綜合素質咋樣。這個候選人和崗位需求是否匹配,基本上就出來了。
多輪面試官的分工協作
上面列舉了大量的技術考察的內容,實際上很難說是一輪面試官直接完成的。
因此,一般我們都是分成多輪面試官協作考察。但是根據不同的公司,不同輪的面試官的職責會稍微有一些不一樣。
比如說一面面試官可能主要就是考察一下技術內容,包括技術面以及連環炮發問考察技術深度,以及算法功底,不太涉及項目。
二面面試官可能會著重考察項目經驗,系統設計,同時對技術深度也會繼續考察。
三面面試官可能會從你把控過的項目規模、帶的團隊規模、團隊管理能力、規范和流程設計能力、整體工作履歷背景和經驗、軟素質(溝通表達、團隊協作、價值觀,等等)來考察你。
上面說的只是一種分法,一個公司內的不同團隊的分工可能是不一樣的。
也有的可能是一二面都是考察技術面和技術深度,不涉及項目,三面來考察你的項目經驗,四面來考察你的一些綜合素質。
或者可能你面的職位很高,比如是總架構師之類的職位,也許還有 CTO 或者技術 VP 出來面試你第五輪。
但是不管如何分,整體考察的內容都是上面的那套東西以及那個流程和過程。
中華石杉:十余年 BAT 架構經驗,一線互聯網公司技術總監。帶領上百人團隊開發過多個億級流量高并發系統。現將多年工作中積累下的研究手稿、經驗總結整理成文,傾囊相授。微信公眾號:石杉的架構筆記(ID:shishan100)。