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