如何準備Java面試?如何把面試官的提問引導到本身準備好的範圍內?

    Java能力和麪試能力,這是兩個方面的技能,能夠這樣說,若是不許備,一些大神或許也能經過面試,但能力和工資有可能被低估。再仔細分析下緣由,面試中問的問題,雖然在職位介紹裏已經給出了範圍,但針對每一個點,面試官的問題是隨機想的,甚至同一個面試官在兩場類似的面試裏,提的問題也未必同樣。html

    也就是說,若是讓面試官自由提問,那麼一旦問到你不熟悉的點,你可能就答不上,若是運氣很差,再外加上不知道面試引導技巧等因素,真有可能面試官的提問全落在你不熟悉的範圍內,這樣就很是惋惜了。與其這樣,還不如事先準備外帶面試引導,這樣或許你的能力未必行,但你能夠儘量地經過引導展現你的亮點,從而提高面試經過的可能性。在本文裏,就將講述事先準備java亮點和麪試中引導面試官提問的技巧。java

1 根據職位介紹微調簡歷,這關係到可否有面試機會

    雖然這點和本文的主題無關,但若是沒有面試機會,那甚至沒法展現引導技能,因此仍是來囉嗦一下。篩選簡歷的人,除了會看學歷專業等硬條件外,更會看相關經驗的商業項目經驗,這在職位介紹上必定能體現出來,好比初級開發,通常須要SSM等框架的1年經驗,高級開發通常須要3年,再外帶些諸如Netty,數據庫調優等方面的技能。linux

    若是看到一份簡歷上,沒有明顯的相關商業項目經驗(學習項目不算),那麼這份簡歷甚至沒面試機會,這就是爲何不少初級開發簡歷大多石沉大海的緣由。其實職位介紹上提到的技能,甚至不少初級開發應該也有項目經驗,但這些人就不寫清楚,這可能只能怪本身了。這塊給出的經驗以下。程序員

    1 簡歷上多積累商業項目經驗,並且裏面用到的技術儘量是Java的,若是你能夠湊出半年商業項目經驗,那絕別寫5個月。若是是畢業生缺少商業項目經驗,也得多找些學習項目寫到簡歷上,至於幫老師乾的項目以及實習項目,那當商業項目寫。面試

    2 通常職位介紹裏,大多提到SSM,Oracle等技術,這些技術在你的項目裏,至少應該用過其它相似吧,那麼別客氣,這些技術關鍵字儘量地出如今你簡歷中的項目介紹裏,好比人家要有Oracle經驗,你哪怕是有MySQL,也寫上,不寫就說明你沒數據庫開發經驗,寫了就算有相關經驗,相似技術點也照此辦理。redis

    3 每份工做的技術要求必定不一樣,那麼你在投簡歷前,必定得微調,在你項目裏作過的前提下,儘量在你這份簡歷中,體現出相關技術。sql

    通常對出初級開發,若是沒至少半年Java(可能再具體下是SSM等框架)商業項目經驗,並且簡歷裏看不到職位介紹裏出現的數據庫,框架等技能關鍵字,這份簡歷基本沒機會,高級開發通常是要3年相關經驗。數據庫

    這裏不提倡編項目,也不提倡編技術,即你項目裏沒用到的技術你寫到簡歷中,但話說回來,通常公司要求的技術都很普通,你在項目裏哪怕沒作過,好歹同事有人作過,你能夠看下相關代碼,或者你參與過調試此類問題。因此哪怕是初級開發,你的技能應該能對上大多數職位介紹,若是對不上就學,也應該很快能對上,只要你的簡歷上有足夠的java商業項目經驗,並且出現大多數技術關鍵字,至少能有面試機會。 緩存

2 結合項目和線上問題,優先準備分佈式組件的亮點

    面試通常從介紹項目開始,在個人如何在面試中介紹本身的項目經驗這篇博文裏,給出了相關內容,但本文的主題是事先準備外帶面試時引導,那麼在面試前,該如何準備亮點呢?先從最值錢的分佈式組件亮點準備起。數據結構

    好比能夠準備經過看日誌,解決過redis,dubbo等方面的線上問題。這塊其實連初級開發也有機會接觸,好比Dubbo方面,超時時間沒設好,好比設了10秒,平時沒事,但一旦訂單模塊調風控模塊出錯,過了10秒再返回出錯,這樣致使整條(基於http的)鏈路長時間保持,累計起來就致使資源耗盡最終系統崩潰,或者redis超時時間沒設或設置很長(1個星期),致使redis的內容在內存中緩存過多,致使OOM問題。這些問題,哪怕是初級開發,應該也有機會接觸。

    這方面該怎麼準備? 1 簡歷上寫上在項目裏用過Redis或Dubbo組件,並排查過相似問題 2 看些基本的redis和dubbo接口方法 3 尤爲看些可能致使問題點的配置,好比超時時間怎麼設 4 複習下linux命令,瞭解如何經過linux命令看日誌排查問題。

    上述是最基本的,若是有MyCAT,Netty,Kafka方面的經驗,好比Mycat分庫字段怎麼設,解決過Netty半包和粘包問題,Kakfa解決過因消息重發而致使的不冪等問題,你均可以寫到簡歷上做爲亮點。但本文給出的保本技能亮點,好比redis和dubbo超時而致使的問題排查,應該你們都有機會接觸。

3 別光背題,要結合項目講,最好結合你解決過的線上問題講

    網上有很多分佈式(以及其它方面)的面試題,好比netty或dubbo底層細節問題,這些有用,但若是你背熟了,面試裏最多獲得的評價是「瞭解分佈式組件理論」,聊勝於無,若是對於要有分佈式組件經驗的工做,你就懸了。對於分佈式組件,你們實現該如何準備呢?(其實後文提到的亮點也同樣)

    1 必定要應用在項目裏,由於面試官只關心對應的商業項目經驗,好比你的dubbo是用在訂單系統調會員系統方法裏,你的mycat,netty等是用在什麼場景,這點簡歷上未必能體現出,但面試時必定要說,這樣能證實你用過。

    2 分析問題的能力優於開發能力,因此你最好再結合一個場景說明,好比在項目介紹時,你外帶一句,dubbo方面我解決過因超時而致使的問題,而後等面試官來問,問的時候,你大體說下,而後面試官看你對linux看日誌的命令,以及dubbo關於超時時間的配置以及問題上下文說得沒毛病,那麼應該也就信了。

    3 這時能夠再結合一些面試題準備下細節,好比看netty堆外內存,線程模型,redis數據結構。有些面試官聽你說出解決問題的說辭,可能就不問了,有些可能會再問些底層問題,那麼你這時候再說下。

    這裏你們能夠對比下兩種表現方式,一種是什麼也不許備,或者只准備背網上的題目局,等面試官問,那麼面試官必定不客氣,想到哪問哪,好比netty會問很細,你平時的項目經驗未必涵蓋到,若是你再沒法結合應用講清楚,那面試官可能認爲你只有理論經驗。另外一種是項目介紹時拋出,並且找機會經過解決過的實際問題拋出,外帶稍微瞭解下細節,這樣不只能很容易讓面試官感受你有實際項目經驗,更能展現「看日誌解決實際問題」的能力。二者差異一看就知道,更況且其實只要方法獲得,準備其實也不難。

4 準備數據庫調優和虛擬機調優及排查oom問題的說辭

    按值錢的技能排序,對於通常的初級和高級開發而言,除了分佈式組件,下面就是調優方面的能力了,具體能夠是分佈式調優,這以前講過, 還有數據庫調優和虛擬機調優。一樣除了在簡歷上明寫以外,還該作哪些準備呢?

    數據庫跳調優方面。

   1 熟悉索引,包括索引結構,複合索引和回表,這塊應該你們都會說,一樣要結合項目案例說。

   2 單機版,經過看執行計劃,調優SQL語句,這塊怎麼準備?項目中,會在linux上設置,若是有超過10秒的SQL就打印出來,而後經過執行計劃看耗時點,好比大可能是走全表掃描,或者有了索引沒用到,或者子sql運行了屢次,再往深講就是Oracle裏鏈接方式不對。你經過執行計劃看到問題所在後,就對應修改,好比建複合索引,或者經過with語句把子查詢提取出來。

    總之這裏你得體現出經過日誌看長sql,以及經過執行計劃看耗時點。至於如何修改,大多數候選人都能說,但你更知道前兩點, 就比別人強了。

  3 若是你感受還有能力,能夠再講些MyCAT分庫分表和redis方面的調優能力,畢竟這塊涉及到分佈式組件。這方面能夠準備的項目說辭是:好比業務請求裏,會常常用公司ID向風控模塊看風險狀況,那麼就能夠用ID作鍵,風控字段作值,另外再把null放到鍵裏,以放緩存擊穿。另外對於一個千萬級別的大表,你能夠用ID做爲分表字段,分10個表,根據最後一位的值定位到具體的表。同時排查全部的SQL語句,把一些可能全表關聯的SQL語句,好比帶group by和多表關聯,或者用Java業務寫,或者優化。同時再網上看些面試題準備些相關MyCAT和Redis的語法說辭。這樣你會額外增長「分佈式性能調優」方面的經驗。 

    在虛擬機方面,我另外有篇博文:在面試中如何展現虛擬機和內存調優技能,你們能夠照着準備,總之也是先結合項目展開,而後圍繞虛擬機結構展開調優技能,再能夠照這篇文章內部類、final與垃圾回收,面試時你一說,面試官就知道,進一步展現你的能力,同時再能照以下的範例,說出你解決過的OOM問題。

    第一步,發現系統很卡,或者日誌裏頻繁出現OOM異常。第二步,用dump文件看OOM時的內存鏡像,看的工具能夠是JMAT。這兩個步驟是通用的。

    第三,經過dump文件,再結合日誌上下文,發現了OOM的緣由,比較簡單的緣由是Redis緩存超時時間過長,或者是ThreadLocal裏的對象用好沒remove(這塊還涉及到弱引用,你們能夠本身去查,本文不展開),或者建立線程池時,等待隊列設置成了無界,或者你在mybatis裏,where條件都是帶if的,即若是傳入id和name再拼裝where id = xxx之類的語句,在一種場景裏,都沒傳條件,因此where後面不帶條件,把數據庫裏記錄全撈出來了,致使OOM。

    若是你再經歷過,甚至能夠說到Netty堆外內存管理不善而致使的問題,若是能說到這個程度,甚至面試架構師都行。

    第四是解決,發現問題後,對症下藥解決就很容易,好比下降Redis超時時間,或者修改好對應的代碼。但既然你說是根據線上問題排查出來的,那麼就得說如何解決,有始有終。總之這裏是結合線上問題發現的,因此就別說些因Connection對象沒關閉,大的HashMap用好沒clear之類的問題了,倒不是這些緣由不會引起OOM問題,而是這些問題大多會在上線前測試階段解決掉了,你再把它們說成線上問題,可能會暴露大家項目組能力不行。

5 java核心方面,準備集合,線程和異常處理等方面的亮點

    經過上述分佈式組件和調優方面的說辭,你展現的能力已經比別人強不少了,雖然相比之下,java核心方面的能力屬於單機版的技能,但畢竟屬於基礎技能,你除了基本問題以外,也得適當準備亮點。以下給出些一樣適用於初級開發的亮點。

    1 集合方面,能夠準備下HashMap和hashcode的底層代碼,一樣能夠準備下ArrayList和快速失效(fast fail)的底層代碼,而後再進一步看下ConcurrentHashMap的讀寫併發管理部分的代碼,由於其中包含volatile,散列表數據結構和線程併發部分的技能,並且jdk1.7和1.8 ConcurrentHashMap的底層代碼實現起來還不一樣,你若是找到機會經過這個對象展現多線程併發和數據結構的能力,或許Java核心方面,面試官就不問別的問題了。

    2 線程方面,準備下鎖,volatile,線程池和ThreadLocal的說辭,具體經過ConcurrentHashMap瞭解下鎖(1.7)版本和synchronized+volatile(1.8版本)的用法,以及ThreadLocal裏可能引起內存泄漏的問題,這些點網上都有,本文就不展開了,其實也未必多,能講清楚就好了。

    3 異常方面,準備下你在項目裏的異常處理方法實踐說辭,好比儘可能縮小try...catch的範圍,finally從句裏放釋放資源的代碼,catch裏應儘可能處理異常,先用IOException等專業異常處理,再用Exception兜底,以及儘可能縮小異常的影響範圍,別讓程序一遇異常就崩。

    Java核心方面,其實還有不少能夠挖掘的點,好比String, final關鍵字等,並且Java核心方面,網上面試題太多了,這裏就再也不展開了。一樣這裏要結合項目案例,好比在測試階段發現了由於遍歷集合而致使的問題,同時展開快速失效,或者在壓測階段發現因HashMap在高併發場景下丟數據因此用ConcurrentHashMap,同時展現其中的volatile和併發等細節。

    其實上述技能不復雜,初級開發照樣能說,但涉及到了底層代碼,尤爲ThreadLocal還涉及到弱引用和OOM問題,更能體現實力,哪怕你經驗未必比人家多,但你面試時能結合底層代碼展現,想都不用想,面試官必定看好你。 

6 介紹項目時,拋出準備過的亮點,別展開

    上文裏給出的是面試準備的技巧,按值錢角度分析,講了分佈式組件、數據庫和JVM調優以及Java核心方面的技能,更重要的是,你是結合實際項目準備的。

    臺上一分鐘臺下一年功,若是準備得當,面試時你就能夠發揮了。先是在自我介紹環節,你除了介紹基本狀況學校學歷外,還能夠綜合說明,好比用過Redis組件,有過數據庫和JVM調優經驗,有過壓測經驗(下文會講),有過排查OOM方面問題的經驗等,總之別客氣,準備了就說。

    而後進入到項目介紹環節,除了介紹項目背景,開發狀況之外,你再結合業務說,這裏給出若干說辭範例。

   1 這個項目裏,咱們用到了Dubbo做爲模塊間的調用,我除了寫代碼外,還解決過因dubbo超時也引起的問題(別展開)

    2 在數據庫方面,我除了實現技能外,還作了數據庫調優,具體用過索引,執行計劃,redis緩存和MyCAT分庫分表,最後兩點本身斟酌。

    3 在項目裏,每一個請求咱們會用一個線程處理,其中用到了ThreadLocal對象(結合業務引出ThreadLocal),對此我還解決過因ThreadLocal和線程池設置不當而引起的OOM問題。同時這裏能夠拋出準備過的其它OOM問題說辭。

    4 在這個項目裏,我參與過壓測,並在壓測過程當中解決過 OOM問題,並經過看日誌優化代碼,從而改善了系統的響應時間。 

    5 在這個項目裏,我會結合Cat系統監控長SQL問題,一旦出現,我會經過看Linux日誌排查問題。(展現看日誌排查問題的能力,同時能夠進一步展現你準備過的技能)。 

    你們能夠看到,上述結合項目拋出的亮點時沒有展開,由於這時屬於項目介紹階段,若是展開的話可能會讓面試官感受你條理不清晰,並且拋出的亮點都是屬於分佈式和調優等高級技能。對一些Java核心方面的單機版技能,別人或許當成寶,你可能都掌握的值錢技能太多,都不算什麼了。固然,後面有機會,你仍是要展現Java核心部分的亮點,只是優先講更值錢的。

7 回答技術問題後,能夠引導到你準備過的亮點上

    你介紹項目時,因爲已經拋出了足夠多的亮點,因此後面面試官天然而然就會往這方面提問,這樣就達到了引導效果。好比聽你講到Redis緩存,天然就會問了, 問題無非是怎麼用?這你能夠結合你的項目實際說,底層細節,這塊網上資料太多。也就是說,經過項目介紹,你能夠把面試官引導你準備好的話題上,這還不算,在回答問題的時候,你照樣還能引導,以下給出些引導的技巧。

    1 好比你在回答redis相關問題時,若是以前你沒機會講「排查因超時時間過長而引起的OOM問題」,那麼還能夠展開說,對redis,我還解決過xx問題,面試官天然會問了,而後再展開。 

     2 當你回答好redis問題後,能夠再「順口」說句,在咱們項目裏,除了redis外,還用過dubbo組件,結果過因dubbo超時時間過長而致使的問題。而後面試官天然就會問到這塊了,你一樣能夠準備些dubbo底層細節的問題,這方面也不少資料。

    3 在回答好任何數據庫相關的問題,好比索引,JDBC等,你順口說句,我在項目裏,還經過執行計劃(或Mycat)優化過SQL技能,而後然開。

    4 在回答好任何集合(如ArrayList)方面問題時,你能夠說,在遍歷集合的時候,咱們項目裏會很是當心快速失效問題,而後展開。

    5 在回答好任何線程內存模型,或被問到volatile相關問題時,你就說,我知道ConcurrentHashMap裏用到volatile,我能具體說下嗎?再結合這個對象,擴展到 線程併發話題,並且這仍是結合底層代碼講的。

    6 被問到任何異常處理問題,好比運行期異常,如何自定義異常,那麼再引導到異常處理最佳實踐。

    7 從ThreadLocal,引出底層的Weak引用話題,再引出JVM結構以及OOM調優方面的話題。

    寫到這裏我都懶得再寫了,在上文裏,我已經列出了不少亮點,它們兩兩橫向關聯,你說好一個再關聯另一個,足以能全方面展現技能。但在擴展時你須要注意,萬一面試官沒接嘴問,你就要當即中止,或者另外找機會再引導,這時若是再說下去,就屬於自說自話了。並且儘可能不露痕跡地引導,好比上文給出的範例中,引導的話術大可能是,除了xx技術,咱們項目裏還用到了xx(關聯性很強)技術,而後坐等面試官來問。  

    也就是說,遇到一些不大自主思考的面試官,你甚至能夠經過事先準備外帶面試引導,控制面試全程節奏,哪怕是遇到一些大廠的面試官,你一樣能夠據此把問題引導你熟悉的範圍,最多就再根據網上面試題再準備些(dubbo,線程模型等的)細節問題,畢竟人的思惟方式的很類似的,聽到你「隨口」這樣一說,頗有可能就「接茬」向下提問了。

8 更能夠引導到壓測和排查線上問題經驗等的值錢話題

    比起分佈式實踐技能,更值錢的是壓測和排查線上問題和項目上線方面的經驗,這在面試時很是容易引導,也就是一兩句話的事,好比你隨口一說:「在這個項目裏我作過壓測,並且有過根據壓測結果調優系統的經驗 」,或者說,在dubbo等方面,我排查過線上問題。天然前提是你要作過,等到面試官提問時,壓測方面你能夠給出以下的說辭。

    1 你參與全鏈路壓測,即相應的同窗坐一塊兒,用jmeter發請求,用zabbix監控cpu內存指標,同時看日誌監控問題。

    2 壓測是用測試環境,固然你也能夠說是線上環境,若是是線上環境的話,更要監控,一旦出現CPU等負載太高,當即終止。

    3 好比用Jmeter發500個線程,每一個線程起5個交易,這些交易用2秒作完,那麼每秒的壓力是1250。

    4 最關鍵的是,你要根據壓測結果改善性能,好比經過壓測,發現了線程池設置參數時,把等待隊列設成了無界,或者有模塊IO對象沒關,或者ArrayList沒clear,從而致使了OOM,或者發現高併發場景數據庫方面出現了長SQL,而後用執行計劃分析,再解決,或者發現了系統日誌原本是同步輸出的,從而致使性能瓶頸,最後改爲異步日誌。或者發現數據庫是瓶頸,因此再引入MyCAT和Redis

    總之,壓測說辭方面,面試官更關注你分析問題和解決問題的經驗,至於發現和解決的問題,只要能說得過去就好了,何況你還能借此展現分佈式和調優方面的技能。而排查線上問題方面的經驗,你能夠用以下的步驟給出說辭。

    1 如何發現?無非是經過CAT監控發現長SQL,或者經過Kibana等工具發現。或者能夠說是先期業務埋點,發現交易異常時拋提示。

    2 發現問題後你的態度,經過手機發現問題後,你第一時間看,哪怕不在你的範圍內,你第一時間上報。

    3 如何排查問題:經過linux命令看日誌,或者經過dump看OOM的鏡像。

    4 分析緣由,藉此你能夠展現上文給出的亮點技能,以及對應解決。 

    話說回來,哪怕是初級開發,也有資格參與壓測,平時也必定會遇到線上問題,你若是面試時不說,面試官天然不知道,但這塊你絕對是大有可爲的。

9 總結:老是先找實踐機會再提高技能,程序員總該挑戰更高級的職位

    總結下,本文的主題包括兩個,第一結合自身實際,面試前挖掘亮點,第二面試時經過引導,儘可能把問題引向本身熟悉的範圍。實踐起來,技術要結合項目,並且最好再結合你排查和解決過的線上問題,同時回答好一個問題後,再把問題引向同類以及調優方面的話題。

    好比Redis,當你結合項目,壓測和線上問題,講述基本用法和解決過的問題後,面試官可能再會問數據結構,高可用集羣和事務方面的問題,這些問題就能夠事先準備了,並且話說出來,對於初級開發,你說好第一部分的說辭,哪怕細節問題沒回答上,面試官雖然沒法給出「深刻了解Redis細節」的評價,但至少能給出「在項目裏用過Redis和排查過Redis相關問題」的評價,若是你再結合項目,如本文所示,全面展現調優,Java核心等方面的技能,那麼你面試資深高級開發也夠了,面試初級開發真就綽綽有餘了,若是經驗再豐富些,再去面試小公司的職位,更有些委屈了。

    當你按本文所述,準備好相應技能,而後再經過一些面試實踐變成麪霸後,頗有可能你面臨的不是要面試什麼公司的問題,而是「面試經過後能不能適應更高級職位」的問題。不過老是先有實踐機會再提高,好比當你是初級開發時,從事第一份高級開發工做時必定很吃力,甚至還會看人臉色,但若是你不追求更高級的崗位,一直陷入低級職位的溫馨區不可自拔時,你的競爭力也會逐月降低。

    因此到了必要的時候,你總得根據本文給出到的建議,不斷挑戰更高級的職位。何況,本文在開篇時就提到,技術能力和麪試能力是兩個方面,而本文給出面試技巧,都是靠平時技能積累,本文給出的面試建議,能幫助你們更好地在面試中展現亮點。

    但願本文不只能幫到你們更好地挖掘本身項目經驗,更能幫到你們高效地找到本身心儀的工做,最後感謝你們看完長文,本文寫了有5個小時,若是你們感受能夠,請多多點贊,有問題也能夠多寫評論。

 

版權說明:

    若是要轉載本文,請先徵得本人贊成。

相關文章
相關標籤/搜索