作者: 石杉的架構筆記
一、寫在前面
最近收到不少讀者反饋,說自己在應聘一些中大型網際網路公司的Java工程師崗位時遇到了不少困惑。
這些同學說自己也做了精心準備,網上搜集了不少Java面試題,然而實際去網際網路公司面試才發現,人家問的,和你準備的對不上號,這就很尷尬了。
二、先來體驗一個真實的面試連環炮
好,閒話不多說,我們進入正題!
本系列文章,我們將會從訊息中介軟體、分散式快取、分散式搜尋、分散式架構、海量資料、NoSQL、高併發、高可用、高效能、資料庫、JVM虛擬機器等各方面聊一下面試中的高頻技術問題。
現在一些中大型網際網路公司的面試官,在面試候選人時,一般都會採取連環炮的策略來深挖一個候選人的技術水平。
舉個例子,比如說看你簡歷上寫了熟悉訊息中介軟體(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。
只要你用過了,而且是你某個專案裡的核心技術,那麼一定會用連環炮式的發問,深入各種細節、底層、生產環境可能遇到的技術挑戰。
總之,就是要用壓力測試出來你在這塊技術水平掌握的到底有多深,實踐經驗有多強。
一個好的面試官,自己本身技術功底紮實,是可以對一個技術問出一連串的連環炮的,就比如上面的那個訊息中介軟體的連環炮發問。
而且只要面試官在一個技術上的深度超過候選人,那麼通過不斷加深的發問,是可以考察出來一個候選人在自己最熟悉的技術領域的技術深度的。
舉個例子,比如說你對一個技術的掌握是否達到了原始碼級別?
是否對某個框架,或者是中介軟體深入的理解底層的原始碼實現,從原始碼級別說清楚他的架構原理?
是否對這個技術有過線上的高可用部署,承載過高併發流量的訪問?
是否對這個技術線上上生產環境解決過各種各樣的複雜技術挑戰?
是否基於這個技術落地到你的業務系統中,設計出各種複雜的系統架構?
通過這種連環炮,可以非常好的考察出某個候選人對技術深度的掌握。
技術深度的考察是中大型網際網路公司面試官對一個高階/資深的候選人必須考察的。
因為如果一個人工作5年以上,來應聘高階職位的話,那我們絕對是要求他對至少一個技術領域有著較為深入的研究的。
比如說起碼你得深入閱讀過某個熱門技術的核心原始碼,有一定的技術功底,可以解決一些複雜的線上故障。
技術廣度決定了你可以利用各種技術來做專案,但是技術深度決定了你的技術功底。
你未來學新東西有多快,線上系統出了故障你能否快速定位和解決,你能否基於對技術的深刻理解為公司的專案設計和開發出複雜而且優秀的架構出來,這都取決於技術深度。
六、總結 & 預告
小結一下,本文我們用一個面試連環炮,引出了平時中大型網際網路公司面試官是如何發問的。
然後從技術廣度、底層技術、技術深度幾個角度說了一下,我們一般如何考察候選人的技術。
免費Java資料領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分散式、大資料、機器學習等技術。
傳送門:mp.weixin.qq.com/s/JzddfH-7y…