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