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