作為Java技術面試官,我如何深挖候選人的技能


作為Java資深技術面試官,首先我感覺有必要講解“面試官深挖問題”的動機,在了解動機的前提下,大家才能更好地准備面試。面試官為什么要在一個點上深挖?兩大目的。
 
1 首先是通過深挖,確認候選者是否具備該技術的項目實踐經驗。
 
這是最重要的目的,因為目前很多候選人,尤其是通過培訓班入行的候選人,確實能很好地講清楚某個技術,甚至還能講清楚該技術在項目中的實際用法。但是面試官必須要確認,候
選人在之前的項目中,是否真的用過(Spring Boot,分布式組件或其它)技術的,是否真的有過解決(OOM,數據庫性能優化等)方面的問題。
 
如果沒有,那對不起了,說得再天花亂墜,也只能給出“只懂理論,沒有在項目里用過”的評價。
 
2 在確認候選人在項目里用過該技術以后,再通過深挖,明確候選人對該技術的掌握程度。
 
比如在確認候選人在項目里用過Dubbo組件后,再通過提問源碼等細節,明確候選人對Dubbo的掌握程度。
 
但是我在面試過程中發現,不少候選人往往只會從技術本身准備面試,比如對Netty,Redis等組件,能准備到底層源碼級別,但卻不准備該技術和項目結合的說辭。這樣在面試准備過程中,就犯了方向性的錯誤。
 
就拿最常問的Spring Boot方面的問題來舉例。
 
第一層問基本概念,比如Spring Boot的常用注解,Spring Boot項目的大致結構。
 
第二層問細節,比如Spring Boot的啟動流程,關鍵注解的細節源碼等。
 
請注意,問到這層,僅僅是提問技術,還沒有問該技術在項目里的用法,所以只要是候選人在面試前背題,一般都能過。
 
有時候我甚至技術問題方面問得很淺,讓候選人能放松下來,更好地回答后面的問題。在此基礎上我會問,在你們項目里,Spring Boot框架整合了哪些組件?比如Junit,Swagger等等,請候選人大致說明下。在候選人告訴我用過的組件后,我再細節該組件與Spring Boot框架的整合方式和相關語法。
 
可以這樣說,只要是做過Spring Boot方面的商業項目,即這個項目不是自學的,也不是培訓班里得到的,一般多少都會整合組件,而且知道怎么個整合法。通過這層提問,我能明確候選人是真的在商業項目里用過Spring Boot,還是僅僅知道理論,或者只是在學習項目里用過。
 
針對其他的技術或組件,基本上也都采用這種層層遞進的問法,第一層問概念,第二層問(框架、源碼或其它細節),第三層問在項目里怎么用的,在此基礎上再順着候選人的回答,深入提問些該技術在項目里的用法。
 
但是不少候選人,頂多只准備到第二層,即深入到各框架各組件的源碼,說明該技術的細節。或者說,不少候選人只知道該准備到這一層。比方說,我見過不少候選人,在說Redis時,很全面地說了Redis的細節,比如集群,失效轉移以及選舉算法等能很好地說,但當我結合項目提問,比如問你們項目為什么要用Redis,以及根據你們項目的數據量,為什么要用redis集群等項目相關問題,就基本說不上了。這樣就無法很好地證明自己在項目里用過Redis。
 
只要面試官資深些,一定不會只停留在單問技術層面,也就是說,你認為准備過的被深挖的點,可能充其量只停留在技術層面,其實還沒達到面試官會深挖的“技術結合項目”層面。
道理一說就明白,所以在下文里,我不講如何在技術層面深挖提問的方法,因為這些問題網上太多,這些知識點大家可以自行查閱。但是我講下很容易被疏忽的深挖技術結合項目的常見問法。我發現,不少和我一樣的面試官,也會采用這種問法。
 
1 問該技術的使用必要性。比如你項目數據庫壓力是多少?在這個情況下是否該用Redis?或者你們項目為什么要用Dubbo?而不用傳統的基於Http的服務調用方式?
總之,只要你簡歷上寫的,面試時說的值錢技術,我都會問使用必要性。我不在乎這個問題聽到什么答案,但我關心候選人關於必要性的說辭是否合理。如果不合理,那對不起了,這個項目疑似學習項目或培訓班項目。
 
2 既然在項目里用到這個技術,那么就需要解決某個痛點問題,比如使用了MyCAT,拿就需要解決數據庫壓力大的問題。接下來我就問,怎么解決的?你可以從配置文件,框架,Java語法等方面來說明。
 
這里請注意,我不僅僅關心純粹的語法,比如我不僅僅關心MyCAT組件通過配置文件實現分庫分表的做法,我更關心該技術該組件和你項目整合的方式。比如你項目里用到MyCAT,那我更關心針對哪個大表實現分庫,拆分成多少個表,引入MyCAT后如果再遇到全局性的訪問表語句怎么辦?
 
在問相關問題時,如果候選人在項目里沒用過,那么往往就說不上,或者如果是現編,我多從幾個角度提問時,往往就會穿幫。但話說回來,其實我問的點是比較普通的,只要候選人用過,那一定能說得上。
 
3 再提問候選人,在使用(Redis或Dubbo或其它技術)時,遇到過哪些線上問題,是怎么發現的,怎么解決的?
其實這個問題是加分項,候選人只要通過前面的回答證明自己在項目里用過,哪怕這個問題說不上也不要緊,但如果回答出了,就能證明自己在這方面能力很資深。
 
4 再串起來問。這是什么意思呢?比如候選人說用了某個技術或組件,總是會解決一類問題。比如用了Redis是解決數據庫壓力大或高並發的問題,但解決此類問題不大可能只用一個技術或組件,往往會綜合使用若干組件,同時引入(監控告警等)各種機制。
 
那我就圍繞一個需求點,串起來問這些組件技術和機制的用法。這些問題看上去很高深,但如果候選人真用過,哪怕候選人本身只是初級開發,但多少能說出一點。
 
我在通過上述問題確認候選人是否在項目中用到某些技術時,其實對不同級別的候選人期望是不同的。對於初級開發,我只要求能說出大致的API用法或者文字性描述。對於高級開發,我要求多少知道點技術結合項目的細節。對於架構師,我就期望能說些解決過的實際問題。
 
但是不管怎么說,如果候選人在被問及上述問題時,無法很好地證明自己在項目里用過某些技術,那么我會質疑候選人項目的真實性,進而甚至會質疑候選人整體能力的真實性。一旦面試官有這些質疑后,那么后面的問題就會比較麻煩了。
 
如果大家就遇到只問技術的面試官,哪怕問得再深,都應當感到幸運,畢竟技術問題好准備,網上都有現有的答案。而且Java技術問題該准備哪些方面,比如准備JVM,安全管理等等方面,如果你不知道,多參加幾次面試后也能知道。
 
也就是說,准備面試,技術問題好准備,但做到能結合項目證明自己用過該技術,有該技術的(資深)實踐經驗,這相對來說就不容易了,甚至有些候選人在面試前還會忽略這方面的准備。下面就說下,如何結合項目說明技術的方法,因為如果這方面說好了,面試就能達到事半功倍的效果。
 
1 為你簡歷上寫的每個技術,落實個項目需求,或實際的痛點。比如要緩存會員信息,所以用Redis,因為線上出現過Redis失效,所以用Redis主從集群。其它組件其它技術一樣准備。
 
2 網上能找到大多數java值錢技術的源碼、使用經驗和常見的坑。面試前,你就參照着這些說辭,在你項目中找個例子。
 
舉個簡單的例子,比如遍歷ArrayList等集合,要考慮快速失效問題,你可以說,在你之前項目的xx業務里,出現過快速失效問題,后果是xxx,經過排查日志,后來發現並解決了,同時你再結合底層源碼說明快速失效的原因,你這樣一說,要比單純結合源碼說快速失效,不知道強多少。
 
其它的技術也一樣,比如Kafka有消息重發,或者消息堆積,你就找個項目例子,結合需求,問題,解決方式和底層源碼說,這樣你就能很好地證明相關技術的項目實踐經驗。
 
3 圍繞(高並發等)點,整合性地准備技術,同樣需要結合項目。比如高並發方面需要考慮消峰,緩存和限流等問題,你就結合你項目中的秒殺或其它高並發需求,說下這些技術是怎么用的,引入這些技術后,最后達到了什么樣的效果,解決了什么樣的問題。
 
其實你如果按照上述步驟准備,不僅能很好地證明你相關技術的項目實踐能力,其實你更能全面地准備你所掌握的技術點。
 
最后做個總結。
1 技術好准備,再被深挖也不怕,因為網上有現成資料,有現成說辭和現成答案。
2 證明在項目里用過該技術,這也不難,但事先要准備。如果不准備,甚至會被當成只會理論沒實踐經驗。
3 更可以為值錢的技術找個項目落腳點,以此來證明你掌握的(資深)技術有項目背景。
 

這是我的公眾號,其中包含了大量面試文章,同時我自己出了多本Python和Java方面的書籍,會定期在公眾號里發書的電子版。請大家關注下我的公眾號,謝謝了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM