框架是重點,但別讓人感受你只會山寨別人的代碼html
別隻看單機版的框架,分佈式也須要了解前端
對於數據庫,別隻知道增刪改查,得了解性能優化linux
Java核心,圍繞數據結構和性能優化準備面試題nginx
Linux方面,至少了解如何看日誌排查問題程序員
通讀一段底層代碼,做爲加分項面試
切記切記,把上述技能嵌入到你的項目裏算法
小結:本文更多講述的準備面試的方法數據庫
在上週,我密集面試了若干位Java後端的候選人,工做經驗在3到5年間。後端
個人標準其實不復雜:設計模式
第一能幹活
第二Java基礎要好
第三最好熟悉些分佈式框架
相信其它公司招初級開發時,應該也照着這個標準來面的。
我也知道,很多候選人能力其實不差,但面試時沒準備或不會說,這樣的人可能進團隊幹活後確實能達到指望,但可能沒法經過面試,面試官只根據面試狀況來判斷。
要知道,咱們平時幹活更偏重於業務,不可能大量接觸到算法,數據結構,底層代碼這類面試必問的問題點。
換句話說,面試準備點和平時工做要點匹配度很小。
做爲面試官,我只能根據候選人的回答來決定面試結果。不過,與人方便本身方便。
因此我在本文裏,將經過一些經常使用的問題來介紹面試的準備技巧。
你們在看後必定會感嘆:只要方法得當,準備面試第一不難,第二用的時間也不會太多。
在面試前,我會閱讀簡歷以查看候選人在框架方面的項目經驗,在候選人的項目介紹的環節,我也會着重關注候選人最近的框架經驗,目前比較熱門的是SSM。
不過,通常工做在5年內的候選人,大多僅僅是能「山寨」別人的代碼,也就是說能在現有框架的基礎上,照着別人寫的流程,擴展出新的功能模塊。
好比要寫個股票掛單的功能模塊,是會模仿現有的下單流程,而後從前端到後端再到數據庫,依樣畫葫蘆寫一遍,最多把功能相關的代碼點改掉。
其實咱們每一個人都這樣過來的,但在面試時,若是你僅僅表現出這樣的能力,就和大多數人的水平差很少了,在這點就無法體現出你的優點了。
咱們知道,若是單純使用SSM框架,大多數項目都會有痛點。好比數據庫性能差,或者業務模塊比較複雜,併發量比較高,用Spring MVC裏的Controller沒法知足跳轉的需求。
因此我通常還會主動問:你除了依照現有框架寫業務代碼時,還作了哪些改動?
我聽到的回答有:
增長了Redis緩存,以免頻繁調用一些不變的數據。
或者,在MyBitas的xml裏,select語句where條件有isnull,即這個值有就增長一個where條件,對此,會對任何一個where增長一個不帶isnull的查詢條件,以避免該語句當傳入參數都是null時,作全表掃描。
或者乾脆說,後端異步返回的數據量很大,時間很長,我在項目裏就調大了異步返回的最大時間,或者對返回信息作了壓縮處理,以增長網絡傳輸性能。
對於這個問題,我不在意聽到什麼回答,我只關心回答符不符邏輯。通常只要答對,我就會給出「在框架層面有本身的體會,有必定的瞭解」的面試評價。
不然,我就只會給出「只能在項目經理帶領下編寫框架代碼,對框架自己瞭解很少」。
其實,在準備面試時,概括框架裏的要點並不難,我就不信全部人在作項目時一點積累也沒,只要你說出來,能夠說,這方面你就碾壓了將近7成的競爭者。
此外,在描述項目裏框架技術時,最好你再帶些分佈式的技術。下面我列些你們能夠準備的分佈式技術。
反向代理方面,nginx的基本配置,好比如何經過lua語言設置規則,如何設置session粘滯。若是能夠,再看些nginx的底層,好比協議,集羣設置,失效轉移等。
遠程調用dubbo方面,能夠看下dubbo和zookeeper整合的知識點,再深一步,瞭解下dubbo底層的傳輸協議和序列化方式。
消息隊列方面,能夠看下kafka或任意一種組件的使用方式,簡單點能夠看下配置,工做組的設置,再深刻點,能夠看下Kafka集羣,持久化的方式,以及發送消息是用長鏈接仍是短攔截。在此我向你們推薦一個架構學習交流羣。交流學習圈:948368769裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
以上僅僅是用3個組件舉例,你們還能夠看下Redis緩存,日誌框架,MyCAT分庫分表等。
準備的方式有兩大類:
第一是要會說怎麼用,這比較簡單,能經過配置文件搭建成一個功能模塊便可
第二是能夠適當讀些底層代碼,以此瞭解下協議,集羣和失效轉移之類的高級知識點。
若是能在面試中侃侃而談分佈式組件的底層,那麼獲得的評價就會比較好了,好比「深刻了解框架底層」,或「框架經驗豐富」,這樣就算去面試架構師也行了,更況且是高級開發。
在實際項目裏,大多數程序員用到的可能僅僅是增刪改查,當咱們用Mybatis時,這個狀況更廣泛。
不過若是你面試時也這樣表現,估計你的能力就和其它競爭者差很少了。
這方面,你能夠準備以下的技能。
SQL高級方面,好比group by, having,左鏈接,子查詢(帶in),行轉列等高級用法。
建表方面,你能夠考慮下,你項目是用三範式仍是反範式,理由是什麼?
尤爲是優化,你能夠準備下如何經過執行計劃查看SQL語句改進點的方式,或者其它能改善SQL性能的方式(好比建索引等)。
若是你感受有能力,還能夠準備些MySQL集羣,MyCAT分庫分表的技能。好比經過LVS+Keepalived實現MySQL負載均衡,MyCAT的配置方式。一樣,若是能夠,也看些相關的底層代碼。
哪怕你在前三點表現通常,那麼至少也能超越將近一半的候選人,尤爲當你在SQL優化方面表現很是好,那麼你在面試高級開發時,數據庫層面必定是達標的。
若是你連第四點也回答很是好,那麼恭喜你,你在數據庫方面的能力甚至達到了初級架構的級別。
Java核心這塊,網上的面試題不少,不過在此以外,你們還應當着重關注集合(即數據結構)和多線程併發這兩塊
在此基礎上,你們能夠準備些設計模式和虛擬機的說辭。
下面列些我通常會問的部分問題:
String a = "123"; String b = "123"; a==b的結果是什麼? 這包含了內存,String存儲方式等諸多知識點
HashMap裏的hashcode方法和equal方法何時須要重寫?若是不重寫會有什麼後果?對此你們能夠進一步瞭解HashMap(甚至ConcurrentHashMap)的底層實現
ArrayList和LinkedList底層實現有什麼差異?它們各自適用於哪些場合?對此你們也能夠了解下相關底層代碼。
volatile關鍵字有什麼做用?由此展開,你們能夠了解下線程內存和堆內存的差異。
CompletableFuture,這個是JDK1.8裏的新特性,經過它怎麼實現多線程併發控制?
JVM裏,new出來的對象是在哪一個區?再深刻一下,問下如何查看和優化JVM虛擬機內存。
Java的靜態代理和動態代理有什麼差異?最好結合底層代碼來講。
經過上述的問題點,我其實不只僅停留在「會用」級別,好比我不會問如何在ArrayList裏放元素。
你們能夠看到,上述問題包含了「多線程併發」,「JVM優化」,「數據結構對象底層代碼」等細節,你們也能夠觸類旁通,經過看一些高級知識,多準備些其它相似面試題。
咱們知道,目前Java開發是以Web框架爲主,那麼爲何還要問Java核心知識點呢?我這個是有切身體會的。
以前在我團隊裏,我見過兩我的,一個是就會幹活,具體表現是會用Java核心基本的API,並且也沒有深刻了解的意願(估計不知道該怎麼深刻了解),另外一位平時專門會看些Java併發,虛擬機等的高級知識。
過了半年之後,後者的能力快速升級到高級開發,因爲對JAVA核心知識點了解很透徹,因此看一些分佈式組件的底層實現沒什麼大問題。 而前者,一直在重複勞動,能力也只一直停留在「會幹活」的層面。
而在現實的面試中,若是不熟悉Java核心知識點,估計升高級開發都難,更別說是面試架構師級別的崗位了。
若是候選人能證實本身有「排查問題」和「解決問題」的能力,這絕對是個加分項,但怎麼證實?
目前大多數的互聯網項目,都是部署在Linux上,也就是說,日誌都是在Linux,下面概括些實際的Linux操做。
能經過less命令打開文件,經過Shift+G到達文件底部,再經過?+關鍵字的方式來根據關鍵來搜索信息
能經過grep的方式查關鍵字,具體用法是, grep 關鍵字 文件名,若是要兩次在結果裏查找的話,就用grep 關鍵字1 文件名 | 關鍵字2 --color。最後--color是高亮關鍵字
能經過vi來編輯文件
能經過chmod來設置文件的權限
固然,還有更多更實用的Linux命令,但在實際面試過程當中,很多候選人連一條linux命令也不知道。仍是這句話,你哪怕知道些很基本的,也比通常人強了。
如何證實本身對一個知識點很是瞭解?莫過於能經過底層代碼來講明。
我在和很多工做經驗在5年以內的程序員溝通時,很多人認爲這很難?確實,若是要經過閱讀底層代碼瞭解分佈式組件,那難度不小,但若是以下部分的底層代碼,並不難懂。
ArrayList,LinkedList的底層代碼裏,包含着基於數組和鏈表的實現方式,若是你們能以此講清楚擴容,「經過枚舉器遍歷「等方式,絕對能證實本身。
HashMap直接對應着Hash表這個數據結構,在HashMap的底層代碼裏,包含着hashcode的put,get等的操做,甚至在ConcurrentHashMap裏,還包含着Lock的邏輯。若是你們在面試中,看看而言ConcurrentHashMap,再結合在紙上邊說邊畫,那必定能征服面試官。
能夠看下靜態代理和動態代理的實現方式,再深刻一下,能夠看下Spring AOP裏的實現代碼。
或許Spirng IOC和MVC的底層實現代碼比較難看懂,但你們能夠說些關鍵的類,根據關鍵流程說下它們的實現方式。在此我向你們推薦一個架構學習交流羣。交流學習圈:948368769裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
其實準備的底層代碼未必要多,並且也不限於在哪一個方面,好比集合裏基於紅黑樹的TreeSet,基於NIO的開源框架,甚至分佈式組件的Dubbo,均可以準備。
並且準備時未必要背出全部的底層(事實上很難作到),你只要能結合一些重要的類和方法,講清楚思路便可(好比講清楚HashMap如何經過hashCode快速定位)。
那麼在面試時,如何找到個好機會說出你準備好的上述底層代碼?
在面試時,總會被問到集合,Spring MVC框架等相關知識點,你在回答時,順便說一句,「我還了解這塊的底層實現」,那麼面試官必定會追問,那麼你就能夠說出來了。
不要小看這個對候選人的幫助,一旦你講了,只要意思到位,那麼最少能獲得個「積極專業「的評價,若是描述很清楚,那麼評價就會升級到「熟悉Java核心技能(或Spring MVC),且基本功紮實」。
要知道,面試中,不多有人能講清楚底層代碼,因此你拋出了這個話題,哪怕最後沒達到預期效果,面試官也不會由此對你下降評價。
因此說,準備這塊絕對是「有百利而無一害」的掙錢買賣。
在面試過程當中,我常常會聽到一些比較遺憾的回答,好比候選人對SQL優化技能講得頭頭是道,但最後得知,這是他平時自學時掌握的,並沒用在實際項目裏。
固然這總比不說要好,因此我會寫下「在平時自學過SQL優化技能」,但若是在項目裏實踐過,那麼我就會寫下「有實際數據庫SQL優化的技能」。
你們能夠對比下二者的差異,一個是偏重理論,一個是直接能幹活了。
其實,不少場景裏,我就不信在實際項目裏必定沒有實踐過SQL優化技能。
從這個案例中,我想告訴你們的是,你以前費了千辛萬苦(其實方法方向獲得,也不用費太大精力)準備的不少技能和說辭,最後應該落實到你的實際項目裏。
好比你有過在Linux日誌裏查詢關鍵字排查問題的經驗,在描述時你能夠帶一句,在以前的項目裏我就這樣乾的。
又如,你經過看底層代碼,瞭解了TreeSet和HashSet的差異以及它們的適用範圍,那麼你能夠回想你以前作的項目,是否有個場景僅僅適用於TreeSet?
若是有,那麼你就能夠適當描述下項目的需求,而後說,經過讀底層代碼,我瞭解了二者的差異,並且在這個實際需求裏,我就用了TreeSet,並且我還專門作了對比性試驗,發現用TreeSet比HashSet要高xx個百分點。
請記得,「實踐經驗」必定比「理論經驗」值錢,並且大多數你知道的理論上的經驗,必定在你的項目裏用過。
因此,若是你僅僅讓面試官感受你只有「理論經驗」,那就太虧了。
本文給出的面試題並很少,但本文並無打算給出太多的面試題。從本文裏,你們更多看到的是面試官發現的諸多候選人的痛點。
本文的用意是讓你們別再重蹈別人的覆轍,所以給出了很多準備面試的方法。
你的能力或許比別人出衆,但若是你準備面試的方式和別人差很少,或者就拿你在項目裏乾的活來講事,而沒有概括出你在項目中的亮點,那麼面試官還真的會看扁你。
End
做者:hsm_computer
來源:https://www.cnblogs.com/JavaArchitect/p/10011253.html
本文版權歸做者全部