社招兩年半 10 個公司 28 輪面試面經(jīng)
個人情況
學歷:二本 工作年限:2 年半
面試準備
復習
你信我,真學習還得看書,看書能讓你的知識體系更加健全。
當然,平時也可以看一些大佬的文章擴充一下知識庫。
我看過的 Java 相關的書單如下:
Java:《Java 并發(fā)編程的藝術(shù)》、《Java 并發(fā)編程實戰(zhàn)》
JVM:《深入理解 Java 虛擬機》第三版、《深入 Java 虛擬機:JVM G1GC 的算法與實現(xiàn)》、《新一代垃圾回收器 ZGC 設計與實現(xiàn)》、美團技術(shù)團隊相關 JVM 的文章、R 大相關 JVM 文章
MySQL:《MySQL 技術(shù)內(nèi)幕:InnoDB 存儲引擎》、《高性能 MySQL》、《MySQL 實戰(zhàn) 45 講》、《從根兒上理解 MySQL》、《從零開始帶你成為 MySQL 實戰(zhàn)優(yōu)化高手》
Redis:《Redis 設計與實現(xiàn)》、《Redis 開發(fā)與運維》、水滴與銀彈Redis 系列文章
Kafka:半獸人博客、《Apache Kafka 實戰(zhàn)》
Zookeeper:《從 Paxos 到 Zookeeper:分布式一致性原理與實踐》
架構(gòu):《鳳凰架構(gòu)》、《領域驅(qū)動設計:軟件核心復雜性應對之道》
還有一個點是,看書的時候可以嘗試記一下筆記,這樣效率會高一些,不至于看完就忘記了。


沒有開源的書籍,我建議可以支持一下原創(chuàng),去買一下實體書或者對應的課程。
算法
算法的話,沒有那么多高超的技巧,LeetCode 前 200 道反復刷就行了,應付社招綽綽有余。
我只刷了 170 道題,面了十幾個大公司,大多的算法題都是原題。

剛開始刷的時候會很痛苦,堅持幾天,沒有思路的就看答案,看完答案繼續(xù)寫代碼,寫不出代碼繼續(xù)看答案,反反復復堅持下來算法就搞定了。
簡歷
簡歷的話,從大學畢業(yè)到現(xiàn)在,我一直用的是超級簡歷:https://www.wondercv.com/ ,我感覺挺好用的。
至于怎么寫簡歷,我也不是專家,不說些花里花哨的,直接給一個我的簡歷模板吧,僅供參考。
提一個點,你寫的簡歷就是劃了一個知識范圍,然后讓面試官從題庫里面選題,如果你自己劃的知識點你都不清楚,那你面試肯定沒有把握的。所以,一定要對你簡歷上面的每一字負責,要對你在簡歷上寫的每一個技術(shù)點都熟悉。
面試過程
自我介紹
自我介紹是簡歷的精簡,不需要說一些沒意義的事情,面試官也不關注你喜不喜歡打籃球,愛不愛唱歌,你只需要把你做過的最牛逼的事情,解決過的最復雜的問題講出來就行了。
舉個例子:
面試官你好,我叫 CoderW,19 年畢業(yè)于哈佛大學。
從畢業(yè)到現(xiàn)在一直從事后臺研發(fā)相關工作。
19 年-22 年在谷歌中間件團隊,主要負責 xx 中間件的設計與開發(fā),在這期間,完成了對 xxx 進行改造和優(yōu)化,整體性能提升了 80%;
22 年去了微軟電商團隊,負責微軟電商體系的設計,兩年的時間,完成了微軟電商從 0 到 1 的搭建過程。上線至今,日活量達到了 10 億,系統(tǒng)平均 QPS 達到 1W。
這一次應聘的是貴公司中間件團隊的資深專家崗位,在業(yè)務方向和技術(shù)棧方面,我個人認為我的匹配度還是比較高的,非常希望能夠加入貴公司,一起打造 xx 系統(tǒng)。謝謝!
技術(shù)討論
自我介紹完之后,一般就是技術(shù)討論環(huán)節(jié),這個環(huán)節(jié)一般 30 到 50 分鐘,是整個面試最重要的一個環(huán)節(jié)。
1. 不卑不亢
記住,這個環(huán)節(jié)是技術(shù)討論環(huán)節(jié),不是問答環(huán)節(jié)。一場好的技術(shù)討論一定是有來有回,而不是單方面的你問我答。
在尊重面試官的前提上,可以對面試官的一些結(jié)論提出質(zhì)疑和探討,在我看來,敢于提出自己的不同看法是一個加分項。
如果遇到不尊重你,甚至侮辱你的面試官,我建議你直接把簡歷要回來,大家都是打工人,有什么好裝的?
2. 真誠以待
有些面試官喜歡問一些比較冷門的知識來驗證候選人的技術(shù)深度,這是一個很正常的事情,你也不需要太過于緊張,真誠一點,會就是會,不會就是不會,沒什么關系。
千萬不要自作聰明強行去編造,真誠永遠是第一要義!
3. 深入發(fā)散
如果聊到你熟悉的一個知識點,你一定要好好把握,可以嘗試著深入和發(fā)散,讓面試官慢慢的進入你的節(jié)奏。
舉個例子,聊到 Kafka 零拷貝的時候。
深入:你可以繼續(xù)深入,聊一下 sendfile+DMA Scatter/Gather。 發(fā)散:深入后再發(fā)散,聊一下為什么 RocketMQ 寫日志用到了零拷貝,但是 Kafka 寫日志的時候不用零拷貝。
深入是展現(xiàn)你對技術(shù)的了解程度,發(fā)散是展示你的視野寬度。
回答完一個問題之后,可以小小的總結(jié)一下,這樣不至于你一個人在那里講的云里霧里,讓面試官都找不到你想要表達的重點了。
編程環(huán)節(jié)
如果你的工作年限不是太長,技術(shù)討論環(huán)節(jié)過后一般會有一個編程環(huán)節(jié)(這個環(huán)節(jié)也有可能會放到技術(shù)討論之前)。
編程題分為兩種,一種是算法題,一種是語言技巧題。
算法題可能大家都能理解,像什么“兩個線程交叉打印 A 和 B”、“手寫單例模式”、“手寫一個簡單工廠設計模式”就屬于語言技巧題。
算法題上面提過了,狂刷就行;語言技巧題也就那幾個,背一下就好。
反問環(huán)節(jié)
個人認為,反問環(huán)節(jié)沒啥用,根本就不能改變整個面試結(jié)果。
所以我一般就固定兩個問題:
我面試的這個崗位需要用到哪些技術(shù)棧? 我面試的這個崗位的最大挑戰(zhàn)是什么
面經(jīng)
面經(jīng)奉上,不是很全,希望有幫忙。
順豐
HashMap,擴容過程,怎么解決哈希沖突? 聊了一篇之前寫過的 MySQL 的一篇博客,講講 MySQL 慢 SQL 優(yōu)化思路?解決流程,應該從哪些方面考慮? APM,怎么監(jiān)控,原理是什么?Java Agent 了解過嗎? G1,最大的特點,標記位圖,卡表卡頁,SATB。 介紹 TiDB,什么是分布式數(shù)據(jù)庫?和 MySQL 比優(yōu)缺點是什么? 怎么做數(shù)據(jù)冷熱分離?怎么做分庫分表?為什么要用 ES? 分布式事務幾種實現(xiàn)方式,講講本地消息表、盡最大努力通知、TCC。你們選用的是什么?AT 有什么問題? 報表 DSL 優(yōu)化,享元模式優(yōu)化過程,優(yōu)化效果怎么樣? 單機和微服務的區(qū)別,微服務有什么問題?數(shù)據(jù)一致性問題怎么解決?冪等問題怎么解決? 現(xiàn)在負責的系統(tǒng)分為幾個模塊?如何劃分?怎么治理? MQ 使用場景有哪些?在項目中具體哪些地方用到了? MQ 消息發(fā)送不在 MySQL 事務中如何保證一致性? Kafka 四個選舉,Controller 選舉、Partition leader 選舉、GroupCoordinator 選舉、消費組協(xié)調(diào)器選舉。整體設計問題,使用場景,流量規(guī)劃怎么做的? 緩存使用的具體場景,一致性問題,緩存使用常見問題有哪些? 熔斷和降級的區(qū)別,具體使用場景有哪些? QPS 和 TPS 的區(qū)別是什么?你們系統(tǒng)的最大 QPS 是多少?QPS 大了會有什么問題,怎么解決? 如何設計一個 RPC 框架?需要考慮哪些點? 有沒有關注新技術(shù)?log4j2 問題關注沒有?能簡單介紹一下嗎?
總結(jié):面試難度偏低,總監(jiān)面基本是聊一下場景設計問題,面試體驗很好,總監(jiān)特別尊重人,強烈好評。待遇還行。
拼多多
介紹自己做過的最滿意的一個項目 介紹 TiDB、RocksDb、levelDB、LSM 樹、SSTable。 XXL-Job 二次分片怎么做的?有些什么問題?怎么去優(yōu)化的? HashMap 的位操作,HashSet 的 contains 方法復雜度是多少,紅黑樹簡單講一下? byte[] a = new byte[10 * 1024]內(nèi)存分配過程?多大的對象直接進入老年代?通過什么參數(shù)配置? 介紹 TLAB,PLAB,CAS 分配。 為什么要指針壓縮,為什么能指針壓縮?原理是什么? 類加載過程?類隔離了解過嗎? 多態(tài)和重載的底層實現(xiàn)原理,字節(jié)碼層面的了解過嗎? Springboot 自動裝配,SPI 原理講一下? 攔截器和過濾器的區(qū)別?使用場景? Spring 事務實現(xiàn)原理,Spring 的 ACID 如何實現(xiàn)的?如果讓你用 JDBC 實現(xiàn)事務怎么實現(xiàn)? MySQL 的鎖,表級鎖是哪一層的鎖?行鎖是哪一層的鎖? MySQL 索引?B+樹?主鍵索引每一個節(jié)點的大小?一個 page 多大?如果一條數(shù)據(jù)大于 16KB 怎么存?text 最多存多少數(shù)據(jù)?行溢出問題?數(shù)據(jù)存儲格式有哪些?溢出頁如何管理? Redis ssd,Redis 內(nèi)存空間優(yōu)化的點,embstr 和 row、intset、ziplist。 Kafka 的服務端的物理存儲架構(gòu)是什么?零拷貝,mmap,sendfile、DMA gather。 你做的方案怎么讓別人信服?要考慮哪些點?你是怎么做的?有哪些你覺得可以改進的地方? 如果系統(tǒng)流量突然上升 10 倍,怎么處理?100 倍呢? 白板編程:單例模式,為什么要加 volatile 白板編程:用棧實現(xiàn)一個線程安全、高效的隊列 白板編程:二叉樹兩個節(jié)點的距離
總結(jié):一面難度較高,會一直追問問到你不會為止,后幾輪的面試偏業(yè)務和設計,比較輕松。待遇拉滿。
美團
多少個服務,多少臺機器?K8S,怎么做到隔離? 服務之間的數(shù)據(jù)一致性怎么做?業(yè)務上怎么保證? TCC?二階段提交,三階段提交? Synchronized,偏向鎖聊了很久聊到了源碼,升級過程,Synchronized 的 JVM 源碼?(面試官對 JVM 很感興趣) 安全點,安全點的作用?一些 JVM 源碼(之前的文章寫過,面試官和感興趣) 垃圾回收算法;PS+PO,CMS 為什么要用標記清除算法?CMS 的前身,R 大的文章。 ZGC,聊到了彭寒成的《新一代垃圾回收器 ZGC 設計與實現(xiàn)》和美團技術(shù)團隊的文章。 G1,聊到了中村成洋的《深入 Java 虛擬機:JVM G1GC 的算法與實現(xiàn)》。 寫屏障和讀屏障的區(qū)別是什么? JMV 優(yōu)化過程,效果。為什么要升級垃圾收集器? 介紹一下 Spring IOC,注解和 XML 兩種方式有什么區(qū)別?后置處理器,擴展點有什么用?在項目中有用到過嗎? MySQL 的 binlog、redo log、undo log 寫入過程?刷盤機制和參數(shù)設置。MVCC 機制了解嗎? 遇到的死鎖問題?唯一鍵沖突導致的死鎖問題,MySQL 為什么要這么設計?隱式鎖是什么了解嗎? 還了解 MySQL 的哪些鎖?間隙鎖、臨檢鎖..... ZK 的選舉過程是怎么樣的?如果選舉過程中網(wǎng)絡故障怎么辦?ZAB 和 RAFT 的最大區(qū)別是什么? Redis 用的 Gossip 協(xié)議有哪些具體消息?謠言傳播,為什么要去中心化?有哪些優(yōu)缺點? Redis 分布式鎖和 ZK 分布式鎖的比較。AP 和 CP,CAP 理論講一下? Kafka 的優(yōu)勢是什么?RocketMQ 延遲隊列怎么做的?如果讓你優(yōu)化你會怎么做?Kafka 能實現(xiàn)延遲隊列嗎? Kafka 能保證數(shù)據(jù)一條都不丟失嗎?為什么?業(yè)務上丟數(shù)據(jù)了怎么辦? 白板編程:順時針打印矩陣
總結(jié):美團的面試官很喜歡問并發(fā)編程和 JVM,一面一直在聊這些東西,后幾輪的面試偏業(yè)務和場景問題,比較輕松。
面試官很尊重人,還加了面試官的微信,后來面試官還給我打電話要我去美團,因為有其他選擇了就拒掉了,祝好!
字節(jié)
略
總結(jié):算法難度拉滿,一輪一道算法,因為面的是 GO 崗位,對基礎要求比較高,沒有問太多 Java 的知識點。待遇不錯。
58 集團
MySQL 遷移到 TiDB 做了哪些工作,自增主鍵,數(shù)據(jù)量多大? TiDB 的性能問題,做了哪些調(diào)研?TP90、TP95 是多少。 TiDB 上線步驟是怎么樣?怎么做到數(shù)據(jù)不丟失?怎么保證可靠性? XXL-Job 怎么封裝的?任務跑失敗了怎么辦? DAG 是如何實現(xiàn)的?二次分片怎么做的? Redis 使用場景、緩存什么數(shù)據(jù)?怎么保證數(shù)據(jù)一致性? 還了解 Redis 哪些知識、Redis 的優(yōu)勢、CP 還是 AP?CAP 理論。 Redis 存儲數(shù)據(jù)需要注意哪些問題?熱 key 問題、大 key 問題怎么處理? Redis 分布式鎖、紅鎖。紅鎖有什么問題? 介紹 SpringBean 創(chuàng)建過程、AOP 實現(xiàn)原理? BeanFactory 和 FactoryBean 的區(qū)別? Spring 是怎么解決循環(huán)依賴的?Spring 解決構(gòu)造方法注入的循環(huán)依賴了嗎?解決多例下的循環(huán)依賴了嗎? 動態(tài)代理,JDK 動態(tài)代理和 CGlib 動態(tài)代理的區(qū)別?Spring 是如何選用的?怎么配置? 如何做降級的?如何做限流? 負載均衡算法有哪些?自適應負載均衡怎么做的?有什么問題?怎么優(yōu)化的? Java 的集合都有哪些,都有什么特點? HashMap、ConcurrentHashMap 的區(qū)別?擴容過程是怎么樣的? 介紹 AQS、CountDownLatch、Semaphore、volatile、synchronized 線程池、自定義線程池、自定義拒絕策略有了解過嗎?什么場景用?
總結(jié):面的是風控部門,老牌公司了,面試難度較低,錢也給的少。
滴滴
進程和線程的區(qū)別是什么?進程之間怎么通信的?線程之間呢? HTTPS 和 HTTP 對比;CA 數(shù)字證書;對稱加密非對稱加密過程? 常見的加密算法有哪些? MySQL 測試,TiDB 測試,如何做到平滑遷移?如何保證數(shù)據(jù)不丟失? 任務調(diào)用中心怎么做的?負載均衡?怎么收集執(zhí)行器的 CPU 和內(nèi)存使用情況?任務分片是怎么做的? 任務冪等性改造?ZK 怎么部署的,幾臺機器,掛了一臺怎么辦? ZAB 協(xié)議,ZK 選舉過程,ZXID 的結(jié)構(gòu)是怎么樣的?ZXID 有什么用? Redis 的 String 底層結(jié)構(gòu),hash 底層結(jié)構(gòu),rehash 過程是怎么樣的? Redis 的 AOF 和 RDB 區(qū)別,能配合使用嗎?熱 key 問題和大 key 問題怎么解決? Kafka 的 log,index,稀疏索引。零拷貝,mmap,sendfile、DMA gather Kafka rebalance 策略,具體過程。GroupCoordinator 選舉、消費組協(xié)調(diào)器選舉過程?kafka 默認 topic 干什么用的? Spring 的循環(huán)依賴怎么解決的,為什么需要加個三級緩存,二級不行么? Springboot 有什么特點,了解 springboot 的自動裝配原理么? 寫了一道 LeetCode 原題,交換鏈表節(jié)點。
總結(jié):面的是網(wǎng)約車部門,主要語言是 GO,面試體驗不錯,面試官比較尊重人,錢給的還行。
歐科云鏈
QUIC/HTTP3 了解嗎? 用筆畫 MySQL 一條記錄的入庫過程,寫日志過程,日志兩階段提交? JVM 調(diào)優(yōu)過程?怎么發(fā)現(xiàn) JVM 的問題的?怎么做預警處理? Minor GC 與 Full GC 的觸發(fā)機制是什么? Eden 和 Survivor 比例可以調(diào)整么,參數(shù)是什么?還用到了哪些參數(shù)? 介紹 TiDB 和 MySQL 的遷移過程?遇到了些什么問題?怎么解決的? 了解 RocksDb 嗎?levelDB、LSM 樹、SSTable? Paxos 算法了解嗎?介紹 RAFT 和 ZAB,以及它們之間的區(qū)別?會有腦裂問題嗎?為什么? Kafka 消息的寫入過程簡單介紹一下,Kafka 為什么這么快? Kafka 幾種選舉過程簡單介紹一下? Kafka 高水位了解過嗎?為什么 Kafka 需要 Leader Epoch? Netty 用到過嗎?講講 reactor。Netty 的空輪詢 bug 有了解嗎? 講講 BIO、NIO、AIO 的區(qū)別? Dubbo 的服務發(fā)現(xiàn)是怎么做的? Redis 的幾種數(shù)據(jù)結(jié)構(gòu),底層分別是怎么做的?用 Redis 緩存什么數(shù)據(jù)?怎么更新數(shù)據(jù)?怎么淘汰數(shù)據(jù)? 緩存和數(shù)據(jù)庫一致性問題怎么解決?為什么要刪緩存而不是更新緩存?刪緩存刪失敗了怎么辦? 有一個包含 100 億個 URL 的大文件,假設每個 URL 占用 64B,請找出其中所有重復的 URL。 給了一張紙,上面有一段并發(fā)的代碼,問執(zhí)行結(jié)果是什么,考的是 volatile。
總結(jié):面的是數(shù)字貨幣交易系統(tǒng),去現(xiàn)場面的試,畫了很多架構(gòu)圖。面試體驗很好,還加了面試官的微信。待遇不錯,而且可以居家辦公。
京東
介紹一下你做的項目?
總結(jié):這個面試官放了我兩次鴿子,后面突然打電話過來,我匆匆忙忙接電話,介紹完項目之后,他隨便問了幾個問題就結(jié)束了,整個過程不超過 10 分鐘。可能是因為我不是東哥的兄弟?
結(jié)果
說一下結(jié)果吧,除了京東,其余的都拿到了口頭 offer。
至于為什么沒有面阿里和騰訊,因為那個時候阿里和騰訊在進行財年清算,鎖 HC 了,也就沒有面了。
至于為什么字節(jié)的面試題沒寫,懂得都懂,可以私下交流。
最后,祝大家都能成為 offer 收割機!
