作爲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方面的書籍,會定期在公衆號裏發書的電子版。請大家關注下我的公衆號,謝謝了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章