【轉載】最近面了不少java開發,據此來說下我的感受:哪怕事先只准備1小時,成功概率也能大大提升
原文連結:https://www.cnblogs.com/JavaArchitect/p/9032323.html
本人最近幾年一直在做java後端方面的技術面試官,而在最近兩週,又密集了面試了一些java初級和高階開發的候選人,在面試過程中,我自認為比較慎重,遇到問題回答不好的候選人,我總會再三從不同方面提問,只有當反覆確認能力不行才會下結論,相反,如果候選人給我的印象不錯,我也會從多個角度來衡量,以免招進會說但不會幹活的“大忽悠”。
其實倒也不是我故意要為難候選人,畢竟入職後就是同事,但面試官的職責使然,而且,如果資深的面試官一般也這樣。
寫到這裡,恐怕會嚇到一些想要面試的朋友,能力強和能力弱都會被多問,那怎麼辦?
這就是本文將要講到的主題:如何準備Java初級和高階的技術面試。
1、換位思考下,如果你是面試官,你會怎麼做
- 1、只能通過簡歷和麵試來衡量,別無他法。如果某位大牛確認能力很行,但面試時無法充分地自證能力,那對不起了,過不了,現實就這樣。
- 2、如果面試官由於能力不行,招進來一個大忽悠,那估計會被領導罵。而且再也不會被讓面試了,給領導的印象就不好了。所以不能評主觀印象,而是會有些客觀標準,具體而言,就是從多個方面問些題目,答好答壞就看候選人的。
其實一些題目都差不多,但不同能力的面試官問問題的切入點和漸程序度會不同,而且有經驗的面試官會挖掘候選人的優勢,並能從候選人的說辭中判斷候選人是真懂還是忽悠。
2、總體上說下準備面試的幾個方面點
- 記得之前考政治,某個大題10分,分5個點,每個點的標準答案不多,也就一兩句話。比較取巧的做法是,涵蓋點要全,每個點無需多說,但要說到點子上。相反,如果在某個點做得再多,其它點沒覆蓋到,只能拿這個點的分。
- 同理,在面試時,應當綜合準備
java Core
,資料庫
,框架
,分散式
等方面的題目。根據我面試的結果,我發現不少候選人走了彎路,他們或者乾脆不準備,準備時可能方法不到位,單準備一個方面。比如只准備了演算法題,在這方面回答很好,但其它方面就一無所知了。 - 所以說,沒有所謂的一定能成功的面試祕籍,但有可以幫助提升成功率的準備方法。
- 切記,面試前一定得準備,否則成功的可能性很低,準備時,得綜合看各方面的點。至於每個點要到什麼程度,後文會講到。
3、架構方面需要準備的點
初級開發而言,需要讓面試官感覺出如下的要點:
- 1、熟悉SSM架構,至少在專案裡做過。這個的說法是,介紹專案時,
用一個業務流程來說明spring mvc如何做的
- 2、知道Spring MVC中的細節,比如
@Autowired的用法
,如何把url對映到Controller上
,ModelAndView物件返回的方式
等。 - 3、最好結合專案的用法,說下你是怎麼用
AOP
,攔截器
的,比如說可以通過攔截器攔截非法請求,怎麼用 AOP輸出日誌等。 - 4、關於ORM方面,不限用過哪種,但得知道一對一,一多多,多對多等的用法,以及
cascade和inverse的用法
。 - 5、最好知道
宣告式事務
的做法。
如果你要應聘高階開發,那在上述基礎上,最好了解如下的知識點:
- 1、
Spring Bean的週期
。 - 2、最好能通過閱讀
原始碼
,說下IOC
、AOP以及Spring MVC的工作流程
。 - 3、最好能結合
反射
,說下IOC等的實現原理
。 - 4、
Spring Boot
和Spring Cloud
的一些知識點。
4、資料庫方面需要準備的點
不少候選人會看很多SQL的技巧,比如select該怎麼寫,insert又該怎麼寫,但僅限於此,不會再準備其它的。這樣就很吃虧,因為面試官會認為,哪怕是初級開發,SQL語句也該會寫,所以這塊不會多問,而會問如下方面的問題:
- 1、
索引
怎麼建的,怎麼用的?比如我建好了一個索引,在where 語句裡寫name like '123%'
會不會走索引,什麼情況下不該建索引,哪些語句不會走索引。 - 2、除了索引之外,你有過哪些SQL優化方面的經驗,比如
分庫分表
,或通過執行計劃檢視SQL的優化點。這最好是能結合你做的專案實際來講。
這裡,我面試下來,大概有70%的候選人只知道基本SQL的寫法,所以哪怕你是隻有理論經驗,會說一些優化點,也是非常有利的。
這塊對於高階開發而言,更得了解優化方面的技能。
5、Java Core方面需要準備的點
這塊是基礎,其實很多問的問題,候選人一定會在專案裡用到,但很少能說好說全。
這塊主要會從集合
,多執行緒
,異常處理流程
以及JVM虛擬機器
這些方面來問:
集合方面:
- 1、
hashcode
有沒有重寫過?在什麼場景下需要重寫。如果可以,結合hash表的演算法
,說下hashmap
的實現原理。
對於高階開發而言,最好通過ConcurrentHashMap
來說明下併發
方面的底層實現程式碼
。 - 2
ArrayList
,LinkedList
的差別,比如一個基於陣列
,一個基於連結串列
,它們均是執行緒不安全
的,ArrayList的擴容做法
等。
對於高階而言,最好看下底層的程式碼。 - 3、
Set
如何實現防重的,比如TreeSet
和HashSet
等。 - 4、
Collection
的一些方法
,比如比較方法
,包裝成執行緒安全的方法
等。 - 5、可能有些面試官會問,如何
通過ArrayList實現佇列或堆疊
,這個可以準備下。
多執行緒方面,其實在專案裡不怎麼會用到,但會問如下的問題:
- 1、
synchronized
和可重入鎖
的差別,然後可能會順便問下訊號量等防併發的機制
。 - 2、線上程裡該如何返回值,其實就是
callable
和runnable
區別。 - 3、一定得通過
ThreadLocal
或volatile關鍵字
,來說明執行緒的記憶體模型
。 - 4、
執行緒池
方面,會用,瞭解些常用引數。(池化技術,用空間換時間的策略)
執行緒方面:
- 可能問得比較多的就是
併發機制
,如果是高階開發,可能會問得深些。
虛擬機器方面:
- 1、
結構圖
和流程
可以大致說下。 - 2、一定得了解
針對堆的垃圾回收機制
,具體而言,可以畫個圖,說下年輕代年老代
等。 - 3、說下
垃圾回收的流程
,然後針對性地說下如何在程式碼中優化記憶體效能
。 - 4、最好說下如果出現了
OOM異常
,該怎麼排查?如何看Dump檔案
。 - 5、GC的一些概念,比如
強弱軟引用
,finalize方法
等,這些可以準備下。
6、演算法,設計模式等,其實是虛的
這塊好準備,不過話說哪怕這些沒回答好,但能證明有相關技能的專案經驗,一般也會讓過。
不過在這塊,不少候選人就本末倒置了,比如就準備演算法,設計模式,剛才提到的框架,資料庫和Java Core方面就不準備了。這樣很吃虧,就好比考政治只複習了一個點,其它一點也不準備。
7、我面試的感受和聽到哪類回答就能證明候選人比較資深
- 1、大多數的候選人(大概7成)直接就來了,不做任何準備。要知道,面試和專案其實有些脫節,哪怕專案做得再好,不做準備照樣通不過,只要我確認過這類人確實無法達標,我拒掉他們沒任何心理負擔,誰讓他們不準備?
- 2、還有些候選人態度很好,明顯準備過,但沒準備到位,比如像剛才所說,只准備了演算法,或者在Java Core方面,只看了集合方面的面試題。對於這些同學,哪怕是過了,我也會感到惋惜,畢竟如果面試好些的話,工資也能更高些,至於哪些過不了的,我敢說,如果他們準備過,估計就不是這個結果了。
- 其實我也知道,人無完人,哪怕我自己去面試,也不可能面面俱到,所以,我不會要求候選人什麼問題都能回答出,甚至大多答錯也沒關係,只要能證明自己的能力即可通過面試。
- 我也和不少面試官交流過,根據我們的經驗,如果候選人能說出如下的知識點,即能證明他在這個領域比較資深了,在這塊,我可能就不會過多地問問題了。
架構方面:
- 1、能證明自己可以幹活(這不難),同時能
結合底層程式碼說出IOC,AOP或Spring MVC的流程
,只要能說出一個即可。或者能說出攔截器
,Controller等的高階用法
。 - 2、能證明自己有
Spring Boot或Spring Cloud的經驗
,比如能說出些Spring Cloud元件
的用法。 - 3、如果能證明自己有
分散式開發的經驗
,那最好了,其實這不難證明,比如能說出服務的包是放在多臺機器上
(大多數公司其實都這樣),而且能說出如何部署,如何通過nginx等做到負載均衡
。
資料庫方面:
- 其實講清楚一個問題即可:如何進行
SQL調優
,比如通過索引
,看執行計劃
即可,如果有其它的優化點,說清楚即可。
Java Core方面:
這裡給出些訣竅:
- 1、能結合
ConcurrentHashMap的原始碼
,說出final,volatile,transient
的用法,以及在其中如何用Lock物件防止寫併發
。 - 2、結合一個專案實際,說下
設計模式的實踐
。 - 3、多執行緒方面,能說出
Lock或volatile等高階知識點
的用法。 - 4、這塊最取巧:說下
GC的流程
,以及如何通過日誌和Dump檔案排查OOM異常
,如果再高階些的話,說下如何在程式碼中優化記憶體程式碼
。
訣竅點歸結成一個:能結合原始碼或專案實際,說出些比較資深的問題。
8、本文的側重點和後文預告
平心而論,在我的部落格裡,寫了不少關於面試技巧
的文章,以至於有朋友說我的文章都是套路,賣書的套路。
所以在本文裡,不介紹我寫的書。
本人承認,本文中的一些內容在我的其它文章裡出現過(不是文字上的複製貼上,而是
意思上的重構
),但如果大家讀下我的文章,就會發現其它的文章都有側重點,比如有的側重於資料庫方面面試技巧的準備,有些介紹如何在簡歷中介紹專案。
本文的側重點是:1、面試一定得準備 (重要的話說三遍,這裡已經超過3遍了)。2、如何全面充分地準備。
至於為什麼要寫這個文章?我得不停地總結我作為面試官的技巧,這樣我在面試中也能更高效更準確地招到合適的人才。
另外,我也在策劃下本面試的書,這也算積累素材吧(說漏嘴了)。
不過話說回來,這篇文章應該對大家多少有些幫助,因為不是每個面試官都肯
洩漏面試內幕
的。
在後篇博文裡,我將在之前博文的基礎上講述如何準備簡歷,從而提升簡歷通過初選的概率,之前我寫過類似的文章。
如果可以,請大家看在我週末還在辛苦碼字的基礎上,推薦一下這篇文章,如果大家感覺有任何問題,可以問我。