最近的一些Java面試小結(jié)
前言
前段時間陸續(xù)面試了一些大中小公司,踩了不少坑,掛了很多,同時也有不少感悟和收獲。這里想把那段經(jīng)歷記錄一下,如果能對親們有所幫助就再好不過了。
面試的過程其實也是一個自我認識和學(xué)習的過程,即便暫時沒打算跳槽,隔段時間出去面一面對自己還是有些好處的:不僅可以評估一下自己在市場的價值和競爭力,同時也能了解一些新技術(shù)、更新一下自己的技術(shù)棧。
而且在一個地方待久了,可能不自覺的就會陷入到一種「舒適區(qū)」,久而久之,就像溫水里的青蛙,萬一哪天被“優(yōu)化”了可能會不知所措。
本文主要從「項目」和「技術(shù)」兩個方面進行總結(jié),除此之外還有一些比較開放式的問題。
元旦過了,“金三銀四”還會遠嗎?春節(jié)后有想法的親們,可以嗨起來了!
項目
有人說:三年一道坎。
對于工作三年左右的伙伴們來說,「項目經(jīng)歷」可謂重中之重,可以說比具體的技術(shù)點更重要。
技術(shù)點其實大同小異,有些臨時刷刷題就能了解個大概。但項目經(jīng)歷往往難以臨時編造,如果不是自己真實做過的項目、或者沒有充分的準備,一旦面試官問得稍微深入很可能 hold 不住,面試扣分不少、甚至可能直接掛掉。
因此不少面試官喜歡從項目入手,抽絲剝繭、步步深入,通過項目把技術(shù)點串起來考察。
不同人的項目千差萬別,但還是有一些共同亮點的:比如高并發(fā)場景,復(fù)雜的架構(gòu)設(shè)計,JVM 調(diào)優(yōu)及問題排查等。
這些亮點有的話固然更好,但如果平時 CRUD 居多、沒太多的亮點,其實也不必太慌,技術(shù)亮點不多的話,可以多思考一些業(yè)務(wù)上的亮點,比如:
業(yè)務(wù)模型比較復(fù)雜 對業(yè)務(wù)整體的架構(gòu)設(shè)計很熟悉 業(yè)務(wù)模塊拆分比較合理 自己在業(yè)務(wù)中做過哪些擴展和優(yōu)化? 業(yè)務(wù)數(shù)據(jù)的上下游流轉(zhuǎn)是怎樣的? 遇到過什么問題,如何解決的? 等等
這些其實也是亮點,可以讓面試官看到你平時對業(yè)務(wù)有自己的思考和理解,而不是只關(guān)注自己的那一塊,不只是寫代碼的機器。
其實面試官對你的項目是一無所知的,他的印象僅僅停留在你簡歷上描述的那些文字(而且有些面試官可能是被臨時拉過來的,別問我為什么知道??)。面試官通常的開場白就是讓你自我介紹,其實這也是一個考察語言組織能力和口頭表達能力的地方。
技術(shù)
我們面的畢竟是技術(shù)崗,技術(shù)本身的重要性不言而喻。
技術(shù)面試中,最重要的可以說是「技術(shù)體系」。也就是你不僅要有技術(shù)的深度和廣度,更要能把它們串起來,其實有不少技術(shù)點是相通或相似的,如果面試中能夠觸類旁通、舉一反三,是一個很好的加分項。比如:
Redis 的 AOF 和 MySQL 的 bin log Spring 中的 BeanDefinition 和 JVM 中類的元信息 布隆過濾器和 HashMap 等等
技術(shù)的積累雖然主要在平時,但刷刷面試題還是很有必要的,有不少其實就是所謂的“八股文”。這里主要列出本人面試過程中真實遇到的一些面試題,僅供參考。
Java
線程池
核心參數(shù)有哪些? 任務(wù)執(zhí)行流程 任務(wù)拒絕策略
鎖
synchronized 鎖升級過程 ReentrantLock 實現(xiàn)原理(AQS) 公平鎖如何實現(xiàn)? volatile 特性
HashMap
HashMap & ConcurrentHashMap 實現(xiàn)原理 ConcurrentHashMap 如何實現(xiàn)線程安全
MySQL
索引 分類?使用場景? InnoDB 索引的結(jié)構(gòu)(B+樹),為什么不用 B 樹? 如何查看索引的使用情況?Explain 關(guān)注哪些字段? 事務(wù) 隔離級別 RC/RR 的實現(xiàn)原理
Redis
常用數(shù)據(jù)結(jié)構(gòu) zset 實現(xiàn)原理 hash 擴容過程 常見緩存問題 緩存穿透、緩存擊穿、緩存雪崩、熱點 key 如何解決上述問題? 持久化:RDB、AOF,二者區(qū)別 Redis 為什么快?線程模型是怎樣的? 內(nèi)存滿了怎么辦?淘汰策略有哪些? 使用什么集群框架?
Spring
IoC、AOP 實現(xiàn) 事務(wù)傳播特性、失效場景 JDK & CGLib 區(qū)別 Spring Boot 啟動原理
Dubbo
Dubbo 架構(gòu) 負載均衡算法、容錯策略、灰度測試 SPI 機制 RPC 調(diào)用過程 RPC & HTTP 二者區(qū)別與聯(lián)系 為什么 Spring Cloud 使用 HTTP 而非 RPC?
JVM
運行時內(nèi)存劃分 垃圾收集算法 一個對象的內(nèi)存分配過程? CMS 收集器 收集過程 哪個過程會有 STW? 如何處理內(nèi)存碎片問題? G1 收集器特點 GC Roots 有哪些? JVM 常用參數(shù)配置有哪些? 內(nèi)存占用過多,如何排查?
RocketMQ
整體架構(gòu) 如何保證消息的可靠性? 如何實現(xiàn)順序消息? 消費者接口冪等設(shè)計 事務(wù)消息實現(xiàn)
分布式
分布式鎖 Redis 如何實現(xiàn)?命令? ZooKeeper 如何實現(xiàn)? 獲取鎖失敗時如何處理? 分布式事務(wù) 2PC:缺點? 3PC:解決了 2PC 什么問題? TCC:缺點? 最終一致性:MQ 實現(xiàn)流程 實現(xiàn)框架(Seata)
其他
除了上面的「項目」和「技術(shù)」,可能還會問到一些其他問題,比如場景設(shè)計與分析、算法,還可能有一些比較開放的問題,下面介紹下我所遇到的。
場景設(shè)計&分析
秒殺場景設(shè)計
比較典型的場景設(shè)計,電商類的公司很可能會問到,網(wǎng)上有很多案例和文章分析,這里不再贅述。
分布式鎖設(shè)計
這個應(yīng)該不是熱門,本人也就遇到過一次,不過那一次被搞得有點懵,可能更多的是考察思路,大家可以多思考一下。
JVM 問題排查:線上 JVM 內(nèi)存、CPU 飆升,如何去排查?
主要涉及一些常用的 Linux 命令和 JDK 自帶工具,比如 top、jstack、jmap 等,以及阿里的開源工具 Arthas 等。
雖然在實際情況中我們可能很少有機會接觸(小小開發(fā)通常沒權(quán)限,還是要運維大佬支持),但這些工具還是要了解的,可以在本地跑個 Demo 去驗證,以免到時候答不上來。
容災(zāi)處理
假如線上所有機器(包括服務(wù)器、數(shù)據(jù)庫、緩存服務(wù)器)全部宕機,如何處理?
PS: 這些場景設(shè)計和分析的問題,通常比較綜合,一般是考察對一個場景的整體設(shè)計,或者分析和解決問題的思路。
算法
爬樓梯 二叉樹遍歷
PS: 算法問題遇到的不是很多,有些考察算法可能就是單純的面試流程。當然,字節(jié)這類的公司除外,想去的話肯定還是要刷很多算法的。
相比之下,大部分公司更注重「項目深度」和「技術(shù)體系」,或者給出一些實際的場景,考察分析和解決問題的經(jīng)驗和思路。
開放問題
這些問題比較開放,沒有固定的答案,可能就是面試官想看下你的臨場發(fā)揮吧。遇到的幾個問題如下:
有沒有帶過人?經(jīng)歷是怎樣的? 如果你作為 PM,如何從整體協(xié)調(diào)一個項目? 如果你在團隊推行 DDD,你會怎么做? 你有什么缺點?優(yōu)點? 未來三年的職業(yè)規(guī)劃? 在公司主要有哪些成長? 上級、同事對你的評價? 最近在看什么書?
末了
面試流程
我所接觸的面試大部分是「三輪技術(shù)面 + HR 面」的形式,也有一些是兩輪技術(shù)面,不同公司可能不太一樣。一面一般是電話面初篩,后面二三輪技術(shù)面和 HR 面通常在一起。這樣其實也挺好,跑一趟就行了。
心態(tài)
面試的心態(tài)也很重要。其實你跟面試官之間是平等的,面試的過程是讓他對你更加了解,而不是他對你的考核。
我剛開始面的時候,由于好久沒面試,再加上本來就不太愛說話,剛開始緊張的不行,后來面了幾次之后才逐漸有點感覺。如果較長時間沒面試,可以先面一兩家練練手、找找感覺。
當然,整個面試時間也不建議拖得太久,否則整個過程會比較累,最好還是一鼓作氣。
啰里啰嗦一堆,其實面試還是挺看運氣的,如果跟面試官聊得比較投機,對你的評分自然也不錯。
最后,預(yù)祝想跳槽的親們一路綠燈!
— 【 THE END 】— 本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取! 3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲取!!
