Java後端面試經驗:了解8大核心競爭點,讓你輕鬆通過面試!

2020-12-23 騰訊網

最近面試java後端開發的感受:如果就以平時項目經驗來面試,通過估計很難——再論面試前的準備

在上周,我密集面試了若干位Java後端的候選人,工作經驗在3到5年間。我的標準其實不複雜:第一能幹活,第二Java基礎要好,第三最好熟悉些分布式框架,我相信其它公司招初級開發時,應該也照著這個標準來面的。

我也知道,不少候選人能力其實不差,但面試時沒準備或不會說,這樣的人可能在進團隊幹活後確實能達到期望,但可能就無法通過面試,但面試官總是只根據面試情況來判斷。

但現實情況是,大多數人可能面試前沒準備,或準備方法不得當。要知道,我們平時幹活更偏重於業務,不可能大量接觸到算法,數據結構,底層代碼這類面試必問的問題點,換句話說,面試準備點和平時工作要點匹配度很小。

作為面試官,我只能根據候選人的回答來決定面試結果。不過,與人方便自己方便,所以我在本文裡,將通過一些常用的問題來介紹面試的準備技巧。大家在看後一定會感嘆:只要方法得當,準備面試第一不難,第二用的時間也不會太多。

一、框架是重點,但別讓人感覺你只會山寨別人的代碼

在面試前,我會閱讀簡歷以查看候選人在框架方面的項目經驗,在候選人的項目介紹的環節,我也會著重關注候選人最近的框架經驗,目前比較熱門的是SSM。

不過,一般工作在5年內的候選人,大多僅僅是能「山寨」別人的代碼,也就是說能在現有框架的基礎上,照著別人寫的流程,擴展出新的功能模塊。比如要寫個股票掛單的功能模塊,是會模仿現有的下單流程,然後從前端到後端再到資料庫,依樣畫葫蘆寫一遍,最多把功能相關的代碼點改掉。

其實我們每個人都這樣過來的,但在面試時,如果你僅僅表現出這樣的能力,就和大多數人的水平差不多了,在這點就沒法體現出你的優勢了。

我們知道,如果單純使用SSM框架,大多數項目都會有痛點。比如資料庫性能差,或者業務模塊比較複雜,並發量比較高,用Spring MVC裡的Controller無法滿足跳轉的需求。所以我一般還會主動問:你除了依照現有框架寫業務代碼時,還做了哪些改動?

我聽到的回答有:增加了Redis緩存,以避免頻繁調用一些不變的數據。或者,在MyBitas的xml裡,select語句where條件有isnull,即這個值有就增加一個where條件,對此,會對任何一個where增加一個不帶isnull的查詢條件,以免該語句當傳入參數都是null時,做全表掃描。或者,乾脆說,後端異步返回的數據量很大,時間很長,我在項目裡就調大了異步返回的最大時間,或者對返回信息做了壓縮處理,以增加網絡傳輸性能。

對於這個問題,我不在乎聽到什麼回答,我只關心回答符不符邏輯。一般只要答對,我就會給出「在框架層面有自己的體會,有一定的了解」,否則,我就只會給出「只能在項目經理帶領下編寫框架代碼,對框架本身了解不多」。

其實,在準備面試時,歸納框架裡的要點並不難,我就不信所有人在做項目時一點積累也沒,只要你說出來,可以說,這方面你就碾壓了將近7成的競爭者。

二、別單純看單機版的框架,適當了解些分布式

此外,在描述項目裡框架技術時,最好你再帶些分布式的技術。下面我列些大家可以準備的分布式技術。

1.反向代理方面,nginx的基本配置,比如如何通過lua語言設置規則,如何設置session粘滯。如果可以,再看些nginx的底層,比如協議,集群設置,失效轉移等。

2.遠程調用dubbo方面,可以看下dubbo和zookeeper整合的知識點,再深一步,了解下dubbo底層的傳輸協議和序列化方式。

3.消息隊列方面,可以看下kafka或任意一種組件的使用方式,簡單點可以看下配置,工作組的設置,再深入點,可以看下Kafka集群,持久化的方式,以及發送消息是用長連接還是短攔截。

以上僅僅是用3個組件舉例,大家還可以看下Redis緩存,日誌框架,MyCAT分庫分表等。準備的方式有兩大類,第一是要會說怎麼用,這比較簡單,能通過配置文件搭建成一個功能模塊即可,第二是可以適當讀些底層代碼,以此了解下協議,集群和失效轉移之類的高級知識點。

如果能在面試中侃侃而談分布式組件的底層,那麼得到的評價就會比較好了,比如「深入了解框架底層」,或「框架經驗豐富」,這樣就算去面試架構師也行了,更何況是高級開發。

三、資料庫方面,別就知道增刪改查,得了解性能優化

在實際項目裡,大多數程式設計師用到的可能僅僅是增刪改查,當我們用Mybatis時,這個情況更普遍。不過如果你面試時也這樣表現,估計你的能力就和其它競爭者差不多了。

這方面,你可以準備如下的技能。

1.SQL高級方面,比如group by, having,左連接,子查詢(帶in),行轉列等高級用法。

2.建表方面,你可以考慮下,你項目是用三範式還是反範式,理由是什麼?

3.尤其是優化,你可以準備下如何通過執行計劃查看SQL語句改進點的方式,或者其它能改善SQL性能的方式(比如建索引等)。

4.如果你感覺有能力,還可以準備些MySQL集群,MyCAT分庫分表的技能。比如通過LVS+Keepalived實現MySQL負載均衡,MyCAT的配置方式。同樣,如果可以,也看些相關的底層代碼。

哪怕你在前三點表現一般,那麼至少也能超越將近一般的候選人,尤其當你在SQL優化方面表現非常好,那麼你在面試高級開發時,資料庫層面一定是達標的,如果你連第四點也回答非常好,那麼恭喜你,你在資料庫方面的能力甚至達到了初級架構的級別。

四、Java核心方面,圍繞數據結構和性能優化準備面試題

Java核心這塊,網上的面試題很多,不過在此之外,大家還應當著重關注集合(即數據結構)和多線程並發這兩塊,在此基礎上,大家可以準備些設計模式和虛擬機的說辭。

下面列些我一般會問的部分問題:

1.String a = "123"; String b = "123"; a==b的結果是什麼? 這包含了內存,String存儲方式等諸多知識點。

2.HashMap裡的hashcode方法和equal方法什麼時候需要重寫?如果不重寫會有什麼後果?對此大家可以進一步了解HashMap(甚至ConcurrentHashMap)的底層實現。

3.ArrayList和LinkedList底層實現有什麼差別?它們各自適用於哪些場合?對此大家也可以了解下相關底層代碼。

4.volatile關鍵字有什麼作用?由此展開,大家可以了解下線程內存和堆內存的差別。

5.CompletableFuture,這個是JDK1.8裡的新特性,通過它怎麼實現多線程並發控制?

6.JVM裡,new出來的對象是在哪個區?再深入一下,問下如何查看和優化JVM虛擬機內存。

7.Java的靜態代理和動態代理有什麼差別?最好結合底層代碼來說。

通過上述的問題點,我其實不僅僅停留在「會用」級別,比如我不會問如何在ArrayList裡放元素。大家可以看到,上述問題包含了「多線程並發」,「JVM優化」,「數據結構對象底層代碼」等細節,大家也可以舉一反三,通過看一些高級知識,多準備些其它類似面試題

我們知道,目前Java開發是以Web框架為主,那麼為什麼還要問Java核心知識點呢?我這個是有切身體會的。

之前在我團隊裡,我見過兩個人,一個是就會幹活,具體表現是會用Java核心基本的API,而且也沒有深入了解的意願(估計不知道該怎麼深入了解),另一位平時專門會看些Java並發,虛擬機等的高級知識。過了半年以後,後者的能力快速升級到高級開發,由於對JAVA核心知識點了解很透徹,所以看一些分布式組件的底層實現沒什麼大問題。 而前者,一直在重複勞動,能力也只一直停留在「會幹活」的層面。

而在現實的面試中,如果不熟悉Java核心知識點,估計升高級開發都難,更別說是面試架構師級別的崗位了。

五、 Linux方面,至少了解如何看日誌排查問題

如果候選人能證明自己有「排查問題」和「解決問題」的能力,這絕對是個加分項,但怎麼證明?

目前大多數的網際網路項目,都是部署在Linux上,也就是說,日誌都是在Linux,下面歸納些實際的Linux操作。

1.能通過less命令打開文件,通過Shift+G到達文件底部,再通過?+關鍵字的方式來根據關鍵來搜索信息。

2.能通過grep的方式查關鍵字,具體用法是, grep 關鍵字 文件名,如果要兩次在結果裡查找的話,就用grep 關鍵字1 文件名 | 關鍵字2 --color。最後--color是高亮關鍵字。

3.能通過vi來編輯文件。

4.能通過chmod來設置文件的權限。

當然,還有更多更實用的Linux命令,但在實際面試過程中,不少候選人連一條linux命令也不知道。還是這句話,你哪怕知道些很基本的,也比一般人強了。

順便在這裡說一下,如果你現在也在學習Java,了解Java,渴望成為一名合格的Java開發工程師,在整個Java入門的學習過程當中,有遇見任何關於學習方法,學習路線,學習效率等方面的問題,都可以隨時申請加入我的Java新手學習裙:前面輸入是:537,中間輸入是:864,最後連起來是:(2/51)。這裡面聚集了很多正在學習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個百分點。

請記得,「實踐經驗」一定比「理論經驗」值錢,而且大多數你知道的理論上的經驗,一定在你的項目裡用過。所以,如果你僅僅讓面試官感覺你只有「理論經驗」,那就太虧了。

八、小結:本文更多講述的準備面試的方法

本文給出的面試題並不多,但本文並沒有打算給出太多的面試題。從本文裡,大家更多看到的是面試官發現的諸多候選人的痛點。

本文的用意是讓大家別再重蹈別人的覆轍,這還不算,本文還給出了不少準備面試的方法。你的能力或許比別人出眾,但如果你準備面試的方式和別人差不多,或者就拿你在項目裡幹的活來說事,而沒有歸納出你在項目中的亮點,那麼面試官還真的會看扁你。

本文裡提到的方法和技能,如果能對大家有所幫助。

相關焦點

  • 迷茫期後面試阿里奮發圖強8個月,如願拿到offer,定級阿里P7
    本人也是經歷了大半年的準備才拿到了阿里的offer個人經歷普通專科畢業,12年轉行進入軟體開發行業。在杭州工作兩年,14年來到深圳,從事java開發一晃8年。分享下這段時期面試總結的一些經驗1、面試一定要帶簡歷,這是態度問題,不然容易第一印象就不好。2、簡歷上最核心的2點,1是自己掌握的技術棧說明,讓面試官清楚知道你掌握技術棧;2是項目中使用了哪些技術棧,體現自己對這些技術棧的實際項目的運用情況。
  • 告訴你在招聘中的面試技巧,讓你輕鬆通過面試
    問題八:「你為什麼選取我們公司?」思路:1、面試官試圖從中了解你求職的動機、願望以及對此項工作的態度。2、推薦從行業、企業和崗位這三個角度來回答。15、在某次春季招聘的簡歷篩選中,以前連續看到兩份說自己堅持4年早鍛鍊的簡歷,當然如果這個信息是真實的,對你的印象分加分是很可觀的,但是如果不是真的,請你自己留意點。16、網申是門學問,看過相應公司的網申經驗再去。親身經歷來講,牛人的網申都沒有過,一個大三的非應屆生網申卻過了。
  • 作業幫後端一面、二面涼經
    8.場景題,插入一萬個元素之後會不會擴容,擴容擴多少9.JDK1.7和1.8中hashmap的區別?在1.7和1.8擴容有什麼區別,我說了1.8是先插入後擴容,又問我為啥要先插入呢,先擴容不是更好?10.hashmap擴容過程,開始問我,那你知道ConrrentHashMap的擴容過程呢?
  • 企業對Java的招聘需求越來越多,你知道原因嗎-開課吧
    JavJava算是編程界打不死的小強,一統後端技術棧,像現在的電商、社交、在線教育,大多採用Java作為基本的開發語言;同時框架也基本由Spring一統天下,入門門檻低,開發效率高,是很多大公司的首選。
  • java面試題之《Array 和ArrayList的區別》
    大家在刷java面試題時肯定有遇到過《Array 和ArrayList的區別》這個面試題。今天就來聊聊他們二者的區別。java基本數據類型的自動裝箱、自動拆箱。使用方法的區別Array數組只能通過數組下標來對指定位置的元素進行變更。而ArrayList在Array的基礎上增加了很多的方法。比如add,addAll,remove,removeAll,contains,以及iterator等等多種豐富的功能方法。
  • 大一新生參加學生會面試,遇到這些問題,這樣回答輕鬆通過面試
    加入這兩種組織,都是會經過各種考核,要看你的各種能力以及成績,在面試的時候還會提問一些關於學生會的問題,要做到隨機應變,這個對大一同學是有挑戰性的。學生會面試,遇到這些問題,這樣回答輕鬆通過面試!第一個問題:你對學生會有什麼了解?
  • 2021 必須掌握的 21個Java 核心技術
    JVM相關 對於剛剛接觸Java的人來說,JVM相關的知識不一定需要理解很深,對此裡面的概念有一些簡單的了解即可。 不過對於一個有著3年以上Java經驗的資深開發者來說,不會JVM幾乎是不可接受的。 JVM作為java運行的基礎,很難相信對於JVM一點都不了解的人可以把java語言吃得很透。
  • 工作3年,去參加大廠面試Java開發,結果被Spring問自閉了……
    前言:又到了金九銀十的日子,前幾天好朋友發來喜訊,跳槽一個月了,面試了有二十家公司,在面試官的狂轟濫炸下終於拿到了不錯的offer。但是比較可惜的是朋友內推的大廠面試失敗了,而且還是在Spring上,就令人挺無語的。
  • Java 程式設計師必須掌握的 8 道數據結構面試題你會幾道?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫40多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對數據結構的理解。幾乎所有的問題都需要面試者對數據結構有深刻的理解。
  • 面試Java程式設計師想拿 10K,面試官說你只值8K,如何應付?
    在IT行業混了很多年,也面試過很多Java程式設計師,非常了解面試者和面試官的心理,我可以很負責的告訴你:就算面試你的人說你只能拿8K,但是你完全可以通過各種方法去拿到10K以上的薪資!面試的時候面試官都是什麼樣的心理?
  • 安卓逆向工程師面試指南【乾貨】
    >安卓逆向工程師面試有哪些需要注意的?但是安卓逆向工程是專業技術要求很高的職業,外行人輕易搶不走你的飯碗,因此也有大量的人花很多金錢投資自己,學會了安卓逆向,想要入行分一杯羹。 光學會技術,並不等於就能找到一份好的工作。要找到一個很好的安卓逆向工程師崗位,我們一定不能忽視其中最為重要的環節——面試。
  • 面試技巧:自我介紹做好這四點,通過面試收穫offer
    ,這個崗位是她意向很久的,所以面試前,她把相關的技能和以往的項目經驗都進行了梳理和總結,做好充分的準備,本以為勝券在握。自我介紹作為面試中的第一個環節,也是最重要的一個環節,最大的作用就是讓面試官快速了解你,讓他看到你相對於其它面試者的優勢和價值,讓他對你產生興趣,願意花時間進一步了解你的工作能力,為進一步面試贏得機會。
  • 工作五年,一年內我靠這系列java面試寶典從13K到大廠30K
    很多人都說要慎用 ThreadLocal,談談你的理解,使用 ThreadLocal 需要注意些什麼?4. 你在多線程環境中遇到的常見的問題是什麼?你是怎麼解決它的?5. ……JVM阿里面試必問JVM!
  • 看完這份3625頁Java面試題,字節,阿里等大廠offer拿到手軟
    最近又趕上跳槽的高峰期,好多粉絲,都問我要有沒有最新面試題,索性,我就把我看過的和我面試中的真題,及答案都整理好,整理了《第2版:網際網路大廠面試題》並分類 92份PDF,累計 3625頁!、阿里巴巴等大廠面試題等、等技術棧!
  • 對啊網:帶你一眼看透教師資格證面試!
    考官可能會問你"校長答應學生讀完規定的書目就在操場上爬十圈,對於這種現象你怎麼看?"的問題,當然也可能會問你"談談你對十九大中的關鍵詞"不忘初心,方得始終"的看法。"棘手的問題,緊張的時間,想要應對自如地表述自己的看法難度是相當大的。核心問題2:10分鐘的試講如何脫穎而出?
  • 面試前太緊張,四招教你緩解緊張的情緒,輕鬆上陣
    我們在參加一場面試之前,多少都會有一些緊張的情緒。畢竟面試決定著求職的成敗,想要獲得這份工作,就要保證自己能正常發揮,在面試官面前表現出自己最好的一面。但是,如果太過緊張,反而會讓自己發揮失常,因此在面試之前,我們要學會緩解緊張的情緒,輕鬆上陣,這樣才能贏得工作機會。
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    經過這麼多年的Java開發,以及結合平時面試Java開發者的一些經驗,我覺得對於J2SE方面主要就是要掌握以下的一些內容。1. JVM相關(包括了各個版本的特性)對於剛剛接觸Java的人來說,JVM相關的知識不一定需要理解很深,對此裡面的概念有一些簡單的了解即可。不過對於一個有著3年以上Java經驗的資深開發者來說,不會JVM幾乎是不可接受的。
  • 你需要了解的面試技巧:自己人效應
    所謂自己人效應,指的是通過自己的言談舉止和人格魅力讓對方把你與他歸為同一類型的人,這樣對方就比較容易接受你的意見和建議,並且對你產生一定的信賴。面試中「自己人效應」讓你成功應聘上崗位。很多公司都會有內部推薦,內部推薦被錄取的概率也很大,特別是部門的領導的推薦。
  • 令人心動的offer:從8位求職者身上學習如何在面試中被面試官青睞
    在上海君合律師事務所,聚集著8位實習生,將在這裡競爭兩名轉正名額。這8名實習生不僅有漂亮的履歷背景,而且有過人的能力。他們在面試中的表現可以給很多職場人敲響警鐘。幫助更多即將步入職場的人知道,面試官究竟喜歡什麼樣的求職者,和面試中的一些細節和技巧。在8位實習生中。李晉曄的面試成績的第1名。
  • 面試前需要做的3個環節:建立面試標準、挖掘崗位關鍵信息、面試
    聊過之後發現他們對簡歷的判斷和最後的面試結果有時候對不上,對簡歷的判斷和對候選人的判斷到了一個小瓶頸,招聘的工作做了一段時間之後就開始茫然了。招聘是一個閉環,如果某個階段簡歷篩選精準率上不去,那不如我們還是先回到面試本身,通過對候選人面試溝通中的層層了解,精準把握後再回到簡曆本身,轉身回來,會對簡歷篩選有更多的想法和思考。