除了背八股文,Java面試更該這樣準備

我可以這樣說,哪怕你背了再多java八股文的答案,過面試也能靠運氣,因爲很多java面試的答案只限於技術理論說辭。但用我本文給出的方法去準備面試,能在不提升技術的前提下,大大提升你java面試的通過率。
 
或者說,只要事先準備充分,再經過幾次面試實踐後,遇到一些不是資深的面試官,甚至可以控場,然後過面試。
 
先說下控場的實踐要點。
1自動說出自己匹配該職位的要點,比如項目時長夠,所用技術匹配,別等面試官提問。
2 面試前不僅要準備八股文,更要多準備亮點,面試中儘可能地通過拋出亮點來引導面試官提問,儘量壓縮面試官的提問空間。
3 語氣神態不亢不卑,甚至故意示弱,比如某些問題想下再回答,或故意拋出些小問題,等面試官提問後再澄清。總之別讓面試官感覺你事先準備過。
4 拋出誘餌問題後,別立即展開,等面試官提問再展開,這點很重要。如果直接展開,就相當於自說自話。
 
下面就按面試流程逐漸展開。首先是自我介紹和項目介紹階段。
 
1 拋出自己和這個職位的匹配度。
 
比如可以說,我叫xxx,(省略自我介紹性文字),我之前在java方面有3年(大於等於職位要求)開發經驗,有mysql,oracle等項目經驗,有nginx,kafka,xxx等的使用經驗。總之先亮出你和職位介紹的匹配度,職位要求上有的技術,如果你有,直接說。
 
2 介紹項目時,別過多介紹需求,大致介紹你做的模塊,介紹項目流程和使用的管理方式,尤其要說明項目管理和發佈用到的組件和技術。
 
比如你可以說,這個項目裏,我做了xx和xx模塊,項目規模是多少人,做了多久。這個項目是用敏捷開發的管理方式,我們每天都有站會。這個項目,我們用jenkins發佈,用jira管理bug和進度,用maven+github來管理項目,等等。
 
3 拋出亮點,但別展開。下面列些哪怕是初級開發也能拋出的亮點。
 
這個項目裏,我解決過了oom問題,有過用redis緩存的經驗,解決過redis內存溢出問題,解決過dubbo超時而導致的問題。在項目開發過程中,我還專研過ArrayList和HashMap的底層源碼,還看過Spring Boot相關注解的源碼。
 
大家可以對比下,大多數候選人面試java,在項目介紹階段,是大談特談項目需求和功能,這就相當於把提問的控制權交給面試官。但相反,你不僅列出了你和該職位的匹配度,還用項目管理方式證明了你項目的真實性。更重要的是,你還拋出了諸多分佈式和解決過的實際問題作爲亮點。
 
這樣一來,不少面試官,尤其是資歷比較淺的面試官,往往就可能在聽到你的說辭後順帶一問,比如順口問,你們項目是怎麼用Redis的,你是怎麼解決OOM問題的,這樣就相當於進入到你事先準備好的範圍。
 
但是請注意,你在介紹項目時,可以拋出亮點,比如說解決過oom問題,但絕不能展開說怎麼解決。原因很簡單,你還在介紹項目,如果展開,就相當於條理不清晰。不過你提到的點,如果面試官感興趣,自然會繼續提問,你都不用着急。
 
介紹好項目經驗後,一般面試官會看着你簡歷,針對你簡歷上提到的,以及你剛說的點發問。剛也說了,你完全可以在面試前準備好技術和亮點說辭,這樣的話你可以大概率把面試官的問題引導帶到你準備的範圍。
 
其實很多亮點,比如OOM調優,緩存性能優化,或者多線程使用要點等,java八股文裏都有,甚至你都不用自己多準備。但是,在這環節你回答面試官技術提問時,要注意兩個要點
第一,主動結合項目需求,說些使用要點證明這個技術你在項目裏用過。
 
第二,在回答好當前提問後多說一句,繼續引導面試官提問。
 
接上文,比如面試官問你,你項目裏是怎麼用redis的?你可以通過如下層次來說。
 
1 說需求,應爲我們項目經常會查詢會員,爲了提升性能,所以把會員信息放入緩存。
 
2 說實現,比如在redis緩存會員信息時,鍵是什麼?值是什麼,緩存時用到Jedis的什麼方法。
 
3 如果有,說遇到並解決過的問題。比如可以說,在這個過程中,我還解決過Redis穿透問題。同樣拋出點,別展開,原因剛纔也說了。
 
4 這點必須有,再給出引導性說辭。比如說,這個項目裏,除了redis緩存,我們還用到了索引來提升性能(引導到索引)。或者,這個項目裏,我們用的不是單機版Redis,而是Redis哨兵集羣(引導到集羣)。
 
如果不引導,你回答好問題後,面試官大概率會自行發問,這樣就有可能問到你不熟悉的點,但你再這樣引導一波,後面面試官大概率會繼續順着問。
 
上文是以Redis舉例,其他技術一樣準備。你這樣一說,不僅能向面試官證明這個技術你有項目經驗,而且還能通過基本的用法,進一步證明你用過。同時還能通過說明你解決過的問題進一步展示技能,最後還帶引導一波。
 
這樣的話,面試官問的範圍大概率會是你簡歷上提到的技術點,以及你引導的內容。只要你事先準備過相關技術的用法和解決過的問題(這些都能從java八股文裏找到答案)。說難聽點,你哪怕在之前項目裏沒用過,或者用得很淺,一樣能給面試官留下“項目中掌握該技術”的印象,甚至還能留下“排查解決過xx方面實際問題”的印象。
 
結合項目問技術之後,面試官一般會從java核心,數據庫,框架等方面提問。這方面你更可以通過背八股文來應對。這裏,任何一個問題,你照樣可以從“項目中的用法”、“解決過的實際問題”和“引導說辭”等方面來說。
 
比如你被問,hashcode方法爲什麼要重寫?你可以這樣回答。
 
1 解釋下原因,原因大家自行去看八股文,不展開。
2 說下你項目裏怎麼用的,無非是存放鍵值對,但要結合需求說。
3 說下你知道hashmap源碼,但別展開,等面試官繼續提問。
4 把後繼問題引導到緩存等方面,比如可以這樣說,我們項目是用hashmap做緩存,除此之外,我們還引入了redis緩存,以提升數據庫訪問性能,這樣就引導到redis甚至數據庫調優方面。或者說,Hashmap是線程不安全的,所以使用起來要小心,這樣就引導到了線程方面。
 
到這裏爲止,基本上面試官的問題就問完了,如果採用上文給出的方法來準備並實踐面試,你會比其他只會背答案的候選人強在哪裏呢?
1 人家大概率只會說理論,你能結合項目證明你用過。
2 由於事先準備過,所以能講述源碼、解決過的問題等亮點說辭。
3 由於準備過引導話術,所以雖然可能無法做到百分之一百,但能把很多面試官的問題引導到你準備好的範圍。
 
 
上文給出的是準備面試和實踐面試的方法,但實際操作起來,面試前需要準備的點還是比較多的。或者可以這樣說,如果事先不準備,這套面試方法論可以說是無源之水。
 
如果大家按上文給出的方法準備面試,並加以實踐,可以在面試中做到如下的程度。
 
1 通過自我介紹和介紹項目,全面拋出自己和該職位的匹配度,同時全面拋出自己的技術列表。
 
2 在項目介紹中,有效地證明自己的商業項目經驗,同時可以通過拋出亮點作爲誘餌,最大程度地引導面試官後繼提問。
 
但是,面試官問好這些問題後,如果你不加以引導,面試官依然可能自由發問,從而問到你不熟悉的技術點。這裏就將着重講下“引導”相關的技巧。
 
先講下Java核心方面的事先準備和引導相關技巧。在java核心方面,哪怕初級開發多少也能準備集合、線程和異常處理等方面的說辭。
 
集合方面,你可以準備下HashMap的底層代碼,尤其是和hashcode的源碼,同時也可以準備下ArrayList和快速失效(fast fail)的底層代碼,隨後可以再進一步看下ConcurrentHashMap的讀寫併發管理部分的代碼,因爲其中包含volatile,散列表數據結構和線程併發部分的技能,而且jdk1.7和1.8 ConcurrentHashMap的底層代碼實現起來還不同,而且ConcurrentHashMap源碼網上都有,還不難,所以你尤其可以通過ConcurrentHashMap來展示實力。
 
面試的時候,面試官大概率會問到ArrayList等基本集合的問題,比如如何遍歷,有什麼優勢等等。問到了,你回答好本身問題後,再多說句,在項目裏,我遇到過ArrayList快速失效問題,對此我還專研過底層源碼,然後坐等面試官提問,面試官一旦問了,你甚至可以邊寫源碼邊解釋,這樣如果你說你才1年經驗,面試估計也不信。
 
集合相關的,HashMap也是一個必考點,姑且我不管面試官怎麼提問,回答好以後,你再多說下,我知道爲什麼要重寫hashcode方法,因爲我看過HashMap底層源碼,然後再說下。甚至你說好HashMap底層源碼後,還可以繼續提下,HashMap是線程不安全的,而ConcurrentHashMap是線程安全,因爲我見過它的源碼,然後展開。
 
甚至可以這樣說,當你按上述方式準備並引導後,雖然你只展示了集合方面的技能,但Java核心方面,面試官就不問別的問題了。
 
在線程方面,準備下鎖,volatile,線程池和ThreadLocal的說辭,具體通過ConcurrentHashMap瞭解下鎖(1.7)版本和synchronized+volatile(1.8版本)的用法,以及ThreadLocal裏可能引發內存泄漏的問題,這些點網上都有,本文就不展開了,其實也未必多,能講清楚就行了。
 
這方面怎麼引導?被問及volatile,回答好以後多提一句,ConcurrentHashMap底層源碼有這個,然後可以引導到ConcurrentHashMap底層源碼。任何線程併發問題,用類似多說一句的方式,引導到volatile,甚至是ConcurrentHashMap底層源碼。任何併發問題,可以引導到線程池,線程池裏有個參數是描述等待隊列,如果設置成無界的有可能出現OOM(不知道的自己查),也就是說,面試中回答好併發後,通過引導,可以引到線程池話題,再可以找機會說出,自己解決過因線程池等待隊列設置不當而導致的OOM問題。
 
或者你可以從ThreadLocal,引出底層的Weak引用話題,再引出JVM結構以及OOM調優方面的話題。這塊不知道也自己去查,不說白不說。
 
異常方面,準備下你在項目裏的異常處理方法實踐說辭,比如儘量縮小try...catch的範圍,finally從句裏放釋放資源的代碼,catch裏應儘量處理異常,先用IOException等專業異常處理,再用Exception兜底,以及儘量縮小異常的影響範圍,別讓程序一遇異常就崩。面試時如果你說出上述異常處理的最佳實踐要點,雖然價值不大,好歹也算項目開發經驗,也就是說,任何異常方面的問題,你都可以通過上文提到的“多說一句”的方式,引導到“異常實踐”上。
 
Java核心方面,其實還有很多可以挖掘的點,比如String, final關鍵字等,而且對初級開發也適用。只要大家第一準備些(未必很深的)源碼和解決(oom)問題的說辭,再按上文給出的方法找個相關問題點。只要面試官一旦問及,你回答好後再多說句,同時拋出事先準備好的亮點說辭。
 
其實Java核心方面,虛擬機和內存調優絕對是個值錢的亮點。如何在面試前準備,面試時如何引導以及如何展示,我有專門的文章來介紹。不再重複介紹如何引出該話題,而是講下在引入虛擬機調優話題後,如何全面展示相關技能的說法。
 
第一步,發現系統很卡,或者日誌裏頻繁出現OOM異常。
 
第二步,用dump文件看OOM時的內存鏡像,看的工具可以是JMAT。這兩個步驟是通用的。
 
第三,通過dump文件,再結合日誌上下文,發現了OOM的原因,比較簡單的原因是Redis緩存超時時間過長,或者是ThreadLocal裏的對象用好沒remove(這塊還涉及到弱引用,大家可以自己去查,本文不展開),或者創建線程池時,等待隊列設置成了無界,或者你在mybatis裏,where條件都是帶if的,即如果傳入id和name再拼裝where id = xxx之類的語句,在一種場景裏,都沒傳條件,所以where後面不帶條件,把數據庫裏記錄全撈出來了,導致OOM。
 
第四是解決,發現問題後,對症下藥解決就很容易,比如降低Redis超時時間,或者修改好對應的代碼。但既然你說是根據線上問題排查出來的,那麼就得說如何解決,善始善終。
再說下,數據庫調優方面的說辭該如何準備?以及對應的引導話術。
 
1 熟悉索引,包括索引結構,複合索引和回表等技能,最好是結合源碼。
 
2 單機版調優技能怎麼說?通過看執行計劃,調優SQL語句,具體是在項目中,會在linux上設置,如果有超過10秒的SQL就打印出來,然後通過執行計劃看耗時點,比如大多是走全表掃描,或者有了索引沒用到,或者子sql運行了多次,再往深講就是Oracle裏連接方式不對。你通過執行計劃看到問題所在後,就對應修改,比如建複合索引,或者通過with語句把子查詢提取出來。
 
3 可以再進一步講些MyCAT分庫分表和redis方面的調優能力。這方面可以準備的項目說辭是:比如業務請求裏,會經常用公司ID向風控模塊看風險情況,那麼就可以用ID做鍵,風控字段做值,另外再把null放到鍵裏,以放緩存擊穿。另外對於一個千萬級別的大表,你可以用ID作爲分表字段,分10個表,根據最後一位的值定位到具體的表。同時排查所有的SQL語句,把一些可能全表關聯的SQL語句,比如帶group by和多表關聯,或者用Java業務寫,或者優化。
 
4 同時準備些數據庫調優方面解決過的問題,比如索引對應的字段重複率太高,所以索引沒用到,解決方法是建複合索引,或redis緩存信息沒設超時時間,導致內存爆掉,解決方法是設下。這種問題網上一大堆,你適當準備下。
 
 
準備好以後,可以採用對應的引導方式。
1 被問及任何數據庫問題,比如sql,jdbc,回答好了再多說下,除了直接實現數據庫方面的需求外,我還有數據庫性能調優方面的經驗。展開時,你是說到單機版調優還是分佈式組件調優,看你能力。
2 在介紹項目時,同時說下,在這個項目裏,我做過數據庫性能調優方面的事情。被繼續問及後再展開。
3 被問到索引相關問題後,回答好以後再多說句,除了索引,我還用過其他調優技術,然後展開。
4 隨便找個機會,比如談到索引,或者乾脆在介紹項目時,多說一句,我解決過線上的數據庫性能過慢的問題,然後展開。
5 當你回答好redis問題後,可以再“順口”說句,在我們項目裏,除了redis外,還用過dubbo組件,結果過因dubbo超時時間過長而導致的問題。然後面試官自然就會問到這塊了,你
 
同樣可以準備些dubbo底層細節(乃至其他分佈式組件方面)的問題,這方面也很多資料。
 
分佈式組件方面,網上資料更是鋪天蓋地,這裏就僅僅給出初級開發也能準備的點。
1 Redis,Dubbo,kafka等組件的超時問題,以及對應的OOM問題。
2 Netty堆外內存導致的OOM。
3 Netty半包粘包。Netty整合線程池,因線程池等待隊列設置不當而導致的oom。
4 kafka重發和堆積消息過多的問題。
 
上述問題不難,我讓我的初級開發學生也這樣準備的,同時還能結合源碼準備,源碼雖然難,但可以死記硬背。
準備到上述點以後,引導到話術就更多了。比如被問及數據庫性能調優問題時,引導到同爲高併發解決方案的redis和mycat,被問題內存相關問題時,說自己解決過netty,kafka等方面的內存問題等等,這類文字我都不想再多說了,只要有關聯,就可以引導。做項目無非是應對高併發,解決數據庫和內存等性能問題,這類引導話術準備起來簡直可以說一找一大堆。
 
大家可以發現,上文給出的點包含了java核心,數據庫調優和分佈式組件調優等諸多要點,而且哪怕初級開發也能在短時間內準備。準備的時候時候,大家可以按照上文的提示,自己舉一反三,另外多找些源碼和其他值錢問題,網上這種問題太多。
 
準備好諸多值錢技術點後,第一需要把這些點融入項目,比如我做訂單模塊時,用ArrayList存訂單對象,遍歷時遇到快速失效問題。其他點也照此,一一找個可以融入項目的點。結合項目說絕對要比單純說技術好,不僅可信,而且能證明在項目裏用過,第二再多準備些引導話術,別直接拋出,如果沒機會拋出千萬別自說自話地拋出。
 
準備引導話術的套路是,回答到現有問題後,再多說一句,比方說,除此之外,我還解決過其他同類xxx問題,看過相關的xxx底層源碼。或者說,在解決該性能調優問題時,我還額外用到了xxx組件。或者說,在使用這個xxx技術時,我還遇到xxx(比如oom或超時等)問題。
 
然後面試官大概率會接嘴問,你就拋出事先準備好的亮點。
 
講到這裏,再回到主題上,Java面試還真是背答案。如果不背,現場發揮,過面試得碰運氣,如果面試官問的點你知道,還可以過,否則就難說了。
 
但背答案也有背答案的方法,如果單純背網上的java八股文,那麼大概率會得到“理論性,但技術未必能結合項目”但評語。如果按本文給出了“爲每個技術找個項目落腳點”的背法,能好些,至少能得到“不僅會技術,而且在項目裏用過”的評語。
 
但是,如果再進一步,按本文給出的“結合項目準備技術,外帶引導”的方法,在面試前按java核心,數據庫和分佈式組件準備技術和亮點(準備起來不難),同時在面試中,不僅能做到背答案,而且還能讓面試官繼續問出你背過的其他(可能更值錢的)答案,這比單純地背javab八股文不知道要好多少。
 
而且大家可以發現,上文給出的技術點其實不復雜,哪怕初級開發,用較短的時間也能準備,但本文給出方法的實踐要點是“技術融入項目並引導”。用這套背java答案的方法,甚至可以在不提升自己項目開發技能的前提下高效提升java面試技能。
 
我輔導的學生用了這套技能以後,遇到的問題可能不是“不知道該如何準備面試”,而是“通過面試後,我不敢去”,或者是“去了以後我怎麼過試用期”?這些問題我也有文章,但由於和本問題無關,就不再展開了。
 

這是我的公衆號,其中包含了大量面試文章,同時我自己出了多本Python和Java方面的書籍,會定期在公衆號裏發書的電子版。請大家關注下我的公衆號,謝謝了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章