在上週,我密集面試了若干位Java後端的候選人,工做經驗在3到5年間。個人標準其實不復雜:第一能幹活,第二Java基礎要好,第三最好熟悉些分佈式框架,我相信其它公司招初級開發時,應該也照着這個標準來面的。前端
我也知道,很多候選人能力其實不差,但面試時沒準備或不會說,這樣的人可能在進團隊幹活後確實能達到指望,但可能就沒法經過面試,但面試官老是隻根據面試狀況來判斷。linux
但現實狀況是,大多數人可能面試前沒準備,或準備方法不得當。要知道,咱們平時幹活更偏重於業務,不可能大量接觸到算法,數據結構,底層代碼這類面試必問的問題點,換句話說,面試準備點和平時工做要點匹配度很小。nginx
做爲面試官,我只能根據候選人的回答來決定面試結果。不過,與人方便本身方便,因此我在本文裏,將經過一些經常使用的問題來介紹面試的準備技巧。程序員
你們在看後必定會感嘆:只要方法得當,準備面試第一不難,第二用的時間也不會太多。面試
1 框架是重點,但別讓人感受你只會山寨別人的代碼算法
在面試前,我會閱讀簡歷以查看候選人在框架方面的項目經驗,在候選人的項目介紹的環節,我也會着重關注候選人最近的框架經驗,目前比較熱門的是SSM。數據庫
不過,通常工做在5年內的候選人,大多僅僅是能「山寨」別人的代碼,也就是說能在現有框架的基礎上,照着別人寫的流程,擴展出新的功能模塊。後端
好比要寫個股票掛單的功能模塊,是會模仿現有的下單流程,而後從前端到後端再到數據庫,依樣畫葫蘆寫一遍,最多把功能相關的代碼點改掉。設計模式
其實咱們每一個人都這樣過來的,但在面試時,若是你僅僅表現出這樣的能力,就和大多數人的水平差很少了,在這點就無法體現出你的優點了。數組
咱們知道,若是單純使用SSM框架,大多數項目都會有痛點。好比數據庫性能差,或者業務模塊比較複雜,併發量比較高,用Spring MVC裏的Controller沒法知足跳轉的需求。
因此我通常還會主動問:你除了依照現有框架寫業務代碼時,還作了哪些改動?
我聽到的回答有:
對於這個問題,我不在意聽到什麼回答,我只關心回答符不符邏輯。
通常只要答對,我就會給出「在框架層面有本身的體會,有必定的瞭解」,不然,我就只會給出「只能在項目經理帶領下編寫框架代碼,對框架自己瞭解很少」。
其實,在準備面試時,概括框架裏的要點並不難,我就不信全部人在作項目時一點積累也沒,只要你說出來,能夠說,這方面你就碾壓了將近7成的競爭者。
2 別單純看單機版的框架,適當瞭解些分佈式
此外,在描述項目裏框架技術時,最好你再帶些分佈式的技術。下面我列些你們能夠準備的分佈式技術。
以上僅僅是用3個組件舉例,你們還能夠看下Redis緩存,日誌框架,MyCAT分庫分表等。
準備的方式有兩大類:
若是能在面試中侃侃而談分佈式組件的底層,那麼獲得的評價就會比較好了,好比「深刻了解框架底層」,或「框架經驗豐富」,這樣就算去面試架構師也行了,更況且是高級開發。
3 數據庫方面,別就知道增刪改查,得了解性能優化
在實際項目裏,大多數程序員用到的可能僅僅是增刪改查,當咱們用Mybatis時,這個狀況更廣泛。
不過若是你面試時也這樣表現,估計你的能力就和其它競爭者差很少了。
這方面,你能夠準備以下的技能。
哪怕你在前三點表現通常,那麼至少也能超越將近通常的候選人,尤爲當你在SQL優化方面表現很是好,那麼你在面試高級開發時,數據庫層面必定是達標的
若是你連第四點也回答很是好,那麼恭喜你,你在數據庫方面的能力甚至達到了初級架構的級別。
4 Java核心方面,圍繞數據結構和性能優化準備面試題
Java核心這塊,網上的面試題不少,不過在此以外,你們還應當着重關注集合(即數據結構)和多線程併發這兩塊
在此基礎上,你們能夠準備些設計模式和虛擬機的說辭。
下面列些我通常會問的部分問題:
經過上述的問題點,我其實不只僅停留在「會用」級別,好比我不會問如何在ArrayList裏放元素。
你們能夠看到,上述問題包含了「多線程併發」,「JVM優化」,「數據結構對象底層代碼」等細節
你們也能夠觸類旁通,經過看一些高級知識,多準備些其它相似面試題。
咱們知道,目前Java開發是以Web框架爲主,那麼爲何還要問Java核心知識點呢?我這個是有切身體會的。
以前在我團隊裏,我見過兩我的,一個是就會幹活,具體表現是會用Java核心基本的API,並且也沒有深刻了解的意願,另外一位平時專門會看些Java併發,虛擬機等的高級知識。
過了半年之後,後者的能力快速升級到高級開發,因爲對JAVA核心知識點了解很透徹,因此看一些分佈式組件的底層實現沒什麼大問題。
而前者,一直在重複勞動,能力也只一直停留在「會幹活」的層面。
而在現實的面試中,若是不熟悉Java核心知識點,估計升高級開發都難,更別說是面試架構師級別的崗位了。
5 Linux方面,至少了解如何看日誌排查問題
若是候選人能證實本身有「排查問題」和「解決問題」的能力,這絕對是個加分項,但怎麼證實?
目前大多數的互聯網項目,都是部署在Linux上,也就是說,日誌都是在Linux,下面概括些實際的Linux操做。
固然,還有更多更實用的Linux命令,但在實際面試過程當中,很多候選人連一條linux命令也不知道。仍是這句話,你哪怕知道些很基本的,也比通常人強了。
6 通讀一段底層代碼,做爲加分項
如何證實本身對一個知識點很是瞭解?莫過於能經過底層代碼來講明。我在和很多工做經驗在5年以內的程序員溝通時,很多人認爲這很難。
確實,若是要經過閱讀底層代碼瞭解分佈式組件,那難度不小,但若是是以下部分的底層代碼,並不難懂。
其實準備的底層代碼未必要多,並且也不限於在哪一個方面,好比集合裏基於紅黑樹的TreeSet,基於NIO的開源框架,甚至分佈式組件的Dubbo,均可以準備。
並且準備時未必要背出全部的底層(事實上很難作到),你只要能結合一些重要的類和方法,講清楚思路便可(好比講清楚HashMap如何經過hashCode快速定位)。
那麼在面試時,如何找到個好機會說出你準備好的上述底層代碼?
在面試時,總會被問到集合,Spring MVC框架等相關知識點,你在回答時,順便說一句,「我還了解這塊的底層實現」,那麼面試官必定會追問,那麼你就能夠說出來了。
不要小看這個對候選人的幫助,一旦你講了,只要意思到位,那麼最少能獲得個「肯積極專業「的評價
若是描述很清楚,那麼評價就會升級到「熟悉Java核心技能(或Spring MVC),且基本功紮實」。
要知道,面試中,不多有人能講清楚底層代碼,因此你拋出了這個話題,哪怕最後沒達到預期效果,面試官也不會由此對你下降評價。
因此說,準備這塊絕對是「有百利而無一害」的掙錢買賣。
7 一切的一切,把上述技能嵌入到你作過的項目裏
在面試過程當中,我常常會聽到一些比較遺憾的回答,好比候選人對SQL優化技能講得頭頭是道,但最後得知,這是他平時自學時掌握的,並沒用在實際項目裏。
固然這總比不說要好,因此我會寫下「在平時自學過SQL優化技能」,但若是在項目裏實踐過,那麼我就會寫下「有實際數據庫SQL優化的技能」。
你們能夠對比下二者的差異,一個是偏重理論,一個是直接能幹活了。其實,不少場景裏,我就不信在實際項目裏必定沒有實踐過SQL優化技能。
從這個案例中,我想告訴你們的是,你以前費了千辛萬苦(其實方法方向獲得,也不用費太大精力)準備的不少技能和說辭,最後應該落實到你的實際項目裏。
好比你有過在Linux日誌裏查詢關鍵字排查問題的經驗,在描述時你能夠帶一句,在以前的項目裏我就這樣乾的。
又如,你經過看底層代碼,瞭解了TreeSet和HashSet的差異以及它們的適用範圍,那麼你就能夠回想下你以前作的項目,是否有個場景僅僅適用於TreeSet?
若是有,那麼你就能夠適當描述下項目的需求,而後說,經過讀底層代碼,我瞭解了二者的差異,並且在這個實際需求裏,我就用了TreeSet,並且我還專門作了對比性試驗,發現用TreeSet比HashSet要高xx個百分點。
請記得,「實踐經驗」必定比「理論經驗」值錢,並且大多數你知道的理論上的經驗,必定在你的項目裏用過。
因此,若是你僅僅讓面試官感受你只有「理論經驗」,那就太虧了。
8 小結:本文更多講述的準備面試的方法
本文給出的面試題並很少,但本文並無打算給出太多的面試題。從本文裏,你們更多看到的是面試官發現的諸多候選人的痛點。
本文的用意是讓你們別再重蹈別人的覆轍,這還不算,本文還給出了很多準備面試的方法。
你的能力或許比別人出衆,但若是你準備面試的方式和別人差很少,或者就拿你在項目裏乾的活來講事,而沒有概括出你在項目中的亮點,那麼面試官還真的會看扁你。
分享一份面試寶典《Java核心知識點整理.pdf》「,覆蓋了JVM、鎖、高併發、反射、Spring原理、微服務、Zookeeper、數據庫、數據結構等等」,還有Java208道面試題(含答案)加入羣(Java填坑之路)659655594 便可免費獲取到!