8年經驗面試官詳解 Java 面試祕訣

CSDN資訊發表於2020-01-11
 
640?wx_fmt=gif

640?wx_fmt=jpeg

 

作者 | 胡書敏
責編 | 劉靜
出品 | CSDN(ID:CSDNnews)
本人目前在一家知名外企擔任架構師,而且最近八年來,在多家外企和網際網路公司擔任Java技術面試官,前後累計面試了有兩三百位候選人。在本文裡,就將結合本人的面試經驗,針對Java初學者、Java初級開發和Java開發,給出若干準備簡歷和準備面試的建議。
 
640?wx_fmt=png
Java程式設計師準備和投遞簡歷的實戰技巧
 
1.1 簡歷中應包含的要素,一個都別落下
為了讓簡歷更吸引技術面試官或其它相關篩選簡歷的人,大家在準備簡歷應當注意“直接”兩字:能讓篩選人能直接地看出本人的教育背景、工作經歷和專案經理,並讓他們“直接”感到這份簡歷能納入考慮範圍。
根據這個原則,大家可以按次序在簡歷中列出如下表所給出的要素。
簡歷中應包含的要素
目的
基本資訊,比如姓名,性別,年齡,目前所在城市,是否在職,手機和電郵等。
1 讓招聘方瞭解候選人的基本資訊。
2 以便招聘方通過手機等方式能聯絡到候選人。
按時間倒敘寫教育背景,一般只需要包含高中以上,初中高中等不必寫,但需包含專業和學歷學位資訊。
用專業和學歷學位等資訊向招聘方證明自己的技術背景。
總結性地列出自己所掌握的技能。比如:
1 有3年Java經驗,有2年Spring MVC經驗。
2有3年Oracle經驗,有2年Oracle調優經驗。
等等
一般這些總結點是和職務需求是一致的,這樣能讓招聘方直接地感受到該候選人的匹配度。
在這基礎上,可以適當列些能成功幫到自己的總結點。
按倒敘列出工作過的公司,並列出在這些公司裡的專案經驗,這部分的技能下文會詳細描述。
在專案經驗描述裡,能通過專案用到的技術經驗等,具體地給出自己“匹配”該崗位的證明。
可以列出和應聘崗位相關的培訓經歷和得到過的獎勵
這些屬於加分項,同等情況下能優先錄用
用少量篇幅列出自己的興趣和自我總結
讓招聘公司進一步瞭解候選人
1.2 該如何描述公司的工作情況
這部分一般是按時間倒敘描述,比如可以按如下的格式寫:
2015年11月到2017年10月,在xx公司,職務是Java高階開發。離職理由是想進一步發展。
2012年2月到2015年11月,在xx公司,職務是Java初級開發。離職理由是想進一步發展。
按此格式寫之前的公司情況
這部分的內容應當儘量靠前,在羅列公司情況時,請大家注意如下的四個要點。
第一,工作情況可以和專案經驗分開寫,一般會在後繼的專案經驗裡寫具體用到的技術框架以及所做過專案的細節,在這裡的工作情況描述裡,可以不用過於複雜,讓招聘方看到你之前的公司情況即可。
第二,儘量別出現長時間的“空白期”,比如上份工作是2月份結束的,而下份工作是6月開始的。如果出現持續三個月以上的“不在職狀態”,需要在簡歷中說明情況,比如這段時間你是換城市發展了,或辭職複習考研或複習考公務員,總之得找個能說得過去的理由。
第三,在簡歷上,儘量別讓人感覺你每份工作都做不長,但不能以此作假。比如我見過有候選人會合並公司,比如2016年11月到2017年3月在A公司,2017年4月到10月在B公司,他為了不讓招聘方感覺他換工作太頻繁,在簡歷上就寫2016年11月到2017年10月在B公司工作,而故意合併了A公司的經歷。這樣的話,如果遇到背景調查,會露餡,即使有些公司不做調查,在勞動手冊等材料上也能反應出真實的工作情況,所以這種做法有一定的風險性。
這裡推薦的做法是,不要合併公司,但可以寫明理由,比如當時小王是被外派公司A以人力派遣的形式外派到B公司,但沒過多久A公司因某種原因不再具備人力派遣的資質了,這時小王就不得不終止與A公司的合同轉而和B公司簽約,這樣雖然看上去小王是換了公司,但實際上沒有。通過類似的合理解釋,招聘方就不再會質疑小王的工作能力和穩定性了。
第四,可以寫上合適的離職理由,尤其當你短時間裡換工作比較多,可能引起招聘方的質疑的情況裡,更該考慮些合適的理由。
合理的離職理由可以是,想為自己提供一個更大的發展空間,或想通過升級來獨當一面,以此進一步提升自己的能力,或公司因資金等方面的原因倒閉了。總之,這不是我主觀上不穩定,而是由於客觀原因導致我不得不換工作。
而可能會導致沒面試機會的離職原因是,待遇問題(雖然大家心知肚明,但不能這樣寫),或無法承受大壓力,或同事領導排擠。這類理由往往會暴露出候選人的缺點,所以不建議大家採用。從這意義上來講,“合同期滿”也不是一個好的離職原因,因為如果候選人能力強,那麼為什麼原公司不和你續約呢?
總之,在描述公司情況時,一旦出現會讓招聘方感覺你能力不強或不穩定時,一定得醒目地寫上足以信服的理由,這樣你的簡歷才會有機會被繼續被讀下去,進而你才會有技術面試的機會。
1.3 儘量把學習培訓專案和畢業設計專案往商業專案上靠
商業專案是指能掙錢的專案,和它對應的就是些不以掙錢為目的的學習專案或畢業設計專案。正因為客戶付了錢,所以商業專案的要求要遠遠高於學習或畢業設計專案,這也是為什麼招聘公司會看重商業專案而會主動過濾學習專案的原因。
比如小張在大三時幫計算機系的王老師所在的ABC軟體公司幹了半年的活,如果小張在簡歷上寫:“在校期間,從x年x月到x年x月完成了xx系統,用到了xx技術”,那麼這多半會被當成類似於課程設計的學習經驗,但如果再加上如下關鍵性的描述:“這個系統是屬於xx公司的xx商業專案裡的一部分,我和另外三位開發人員做了半年,最終這個系統成功上線並在客戶xx公司的環境裡投入運營”,那這樣小張的商業專案總年限裡就能加上這半年時間了。
又如小李在做畢業設計時,花了7個月的時間參與了導師的一個電商商業專案,他主要的工作是設計一個排程演算法,但也參與了一些諸如訂單管理模組的工作。如果他就平淡地寫一句,畢業設計是xx,畢業論文是xx,那麼招聘方看過就算了,也不會認為小李在做畢業設計時還有過商業專案經驗,這樣小李未免有些吃虧。
但如果這樣寫:“在x年x月到x年x月的7個月裡,在畢業設計中,我參與了xx公司的xx電商專案,客戶方是x,我參與了訂單管理和xx模組,並設計了其中的排程演算法,在我的畢業論文裡,詳細介紹了這種做法”。文字沒修改太多,但足以讓小李增加7個月的商業專案經驗。
我們發現大多數初級程式設計師的水平其實也差不多,這時就得看誰的商業專案經驗豐富了。比如有次我們無法從兩位候選人中權衡,因為他們的綜合條件和麵試情況都差不多,但其中有一位在大三階段有段為期6個月的商業專案實習經驗,另一位沒有(也有可能他也有但沒當成商業專案來寫),這種情況下我們就錄用了有實習經驗的候選人了。
1.4 描述專案的技巧
我們可以根據職位需求,從如下幾個方面來描述專案經驗。
第一,簡要描述專案的背景,比如時間範圍,客戶是誰,專案規模有多大。如下是範例。
從x年x月到現在(這個時間範圍至少是最近半年),我參與某外匯交易系統,客戶是xx銀行,這個專案組的構成是,1位專案經理外加10位開發,總共的規模大概在80個人月左右。
第二,大致描述專案的需求和包含哪些模組,然後簡要說下你做了哪些模組,同時說下在這個專案用到的開發工具和主要技術點,這部分的描述如下所述。
這個外匯交易系統包括掛盤撮合成交、實盤成交、反洗錢和資料批處理等模組,我主要負責了掛盤撮合成交模組,其中用到了Spring MVC架構,資料庫是Oracle,用Mybatis實現的ORM,該系統是執行釋出在Weblogic伺服器上,我們還用了Nginx來實現負載均衡,用Redis來快取資料。在這個專案裡,我還用到了JS實現了一些前臺頁面。
第三,這裡可以結合職位的需求,描述JD裡要求的技術在專案裡是如何用的。同樣這裡也應圍繞技術,而別多寫業務細節
1.5 在簡歷中描述專案時可以新增的亮點
我們見過不少簡歷,在描述專案時,也能像上文一樣,能根據招聘職位的具體要求展示出自己的匹配點,這種簡歷屬於“達標”,即可以納入考慮範圍。在這個基礎上,如果大家在專案裡有下表列出的亮點,一定請寫上,這就是大家優於別人的地方。
1. 資料庫和JVM調優;
2. 你理解的框架底層程式碼;
3. 專案裡用到的設計模式;
4. 專案管理和部署工具;
5. 結合若干案例,講述你分析和解決bug的技能;
6. 其它能幫助到你的加分項,比如工期緊,用到新技術等。
1.6 哪些簡歷可以通過篩選
從面試官角度來看,除了學歷等硬體條件外,如果簡歷滿足如下的4點要求,就一般能有面試機會了。
1. 商業專案足量,且其中包含的技能和職位介紹很匹配;
2. 最近用到的技能和職位介紹很匹配;
3. 沒有過長職業空白期或不穩定等情況;
4. 一定請記住,公司只能通過簡歷認識到你,簡歷上沒寫清楚等同於你不行。
其實這就是我們寫簡歷的方向,而且,在針對具體公司投遞簡歷時,還可以以此為目標,微調簡歷。
 
640?wx_fmt=png
面試時該如何講解技術專案贏得面試官好感
 
2.1 別害怕,因為面試官什麼都不知道
面試官是人,不是神,拿到你的簡歷的時候,是沒法核實你的專案細節的(一般公司會到錄用後,用背景調查的方式來核實)。更何況,你做的專案是以月為單位算的,而面試官最多用30分鐘來從你的簡歷上了解你的專案經驗,所以你對專案的熟悉程度要遠遠超過面試官,所以你一點也不用緊張。如果你的工作經驗比面試官還豐富的話,甚至還可以控制整個面試流程(筆者在面試方面成精後也經常幹這種事情,大家一定也能行)。
 
面試官
對你以前的專案和技能
很瞭解
只能聽你說,只能根據你說的內容做出判斷
在面試過程中的職責
在很短的時間內防守成功即可
如果找不出漏洞,就只能算你以前做過
準備時間
面試前你有充足的時間準備
一般在面試前用30分鐘閱讀你的簡歷
溝通過程
你可以出錯,但別出關鍵性的錯誤
不會太為難你,除非你太差
技巧
你有足夠的技巧,也可以從網上找到足夠多的面試題
其實就問些通用的有規律的問題
既然面試官無法瞭解你的底細,那麼他們怎麼來驗證你的專案經驗和技術?下面總結了一些常用的提問方式。
提問方式
目的
讓你描述工作經驗和專案(極有可能是最近的),看看你說的是否和簡歷上一致
看你是否真的做過這些專案
看你簡歷上專案裡用到的技術,比如框架、資料庫,然後針對這些技術提些基本問題
還是驗證你是否做過專案,同時看你是否瞭解這些技術,為進一步提問做準備
針對某個專案,不斷深入地問一些技術上的問題,或者從不同側面問一些技術實現,看你前後回答裡面是否有矛盾
深入核實你的專案細節
針對某技術,問些專案裡一定會遇到的問題,比如候選人說做過資料庫,那麼就會問索引方面的問題
通過這類問題,核實候選人是否真的有過專案經驗(或者還僅僅是學習經驗)
2.2 面試時的錯誤表現
在面試過程中,如果候選人出現如下的表現,那麼很有可能過不了面試,請大家注意。
1. 面試時介紹的專案時間等情況簡歷上寫的不一致,這就有簡歷造假的嫌疑;
2. 介紹專案時只介紹業務,忽略技術。因為面試官只關心技術,不關心業務;
3. 對於提到的技術,連最基本的問題也回答不上,這就說明候選人這項技術沒掌握;
4. 說得太流利或太磕磕巴巴,這就說明在背詞或者是表達有問題。
2.3 面試中介紹專案的範例
第一步,介紹專案基本情況
可以這樣說,這個專案是xx產品的xx模組的,有xx和xx模組,我做了xx模組,用了半年,我的組裡一共有5個人。這裡可以談下業務,但別深入,因為面試官不熟悉,也不想熟悉候選人的業務,這塊時間控制在1分鐘之內。
第二步,介紹專案裡關鍵技術和管理方式
可以這樣說,這個專案裡,我用到了Spring框架,用到nginx等元件,專案管理用Maven,部署用jenkins,靜態掃描用Sonar,任務管理和bug管理用jira,平時採用敏捷的專案迭代方式,每天有站會,大約1月一個迭代版本。這塊可以根據自己的情況來介紹,時間也別太長,估計用1分鐘也就夠了。
第三步,結合業務講用到的技術,但別展開
比如有個職位介紹,裡面寫到需要有資料庫優化的經驗,那麼可以說,專案裡xx模組,我用到MyCat作為分庫分表,(不展開技術),上線後,資料庫能承受住每秒2000個併發請求(說下用好的結果)。
又如一個JD裡說要用到微服務技術,那麼就可以說,專案裡用到了Spring Cloud框架,用到了Ribbon,Eureka等元件,容器是Docker。用好以後,在釋出時會發現,各模組之間的呼叫耦合性大大降低。
2.4 介紹專案時的要點歸納
從上述介紹專案的範例中,可以歸納出相關要點如下。
1. 面試前,需要閱讀職位介紹,挖掘用過的技能要點,然後儘可能地在介紹專案裡提到這些技能關鍵字;
2. 在介紹專案裡,結合業務,提到職位介紹裡的技術,因為一旦技術結業業務,就說明你有過相關技術的實踐經驗,而不是僅僅只會理論;
3. 別過多介紹業務,多丟擲職位介紹裡的關鍵字。還是這句話,面試官不關心業務,你提到業務只是以此證明你在實踐中用過相關技術而已;
4. 此時還在專案介紹階段,別過多展開技能,你丟擲技能關鍵字後,面試官自然會問的。而一旦你過多展開技術,那麼面試官就有可能感覺到你思路不清晰。
 
640?wx_fmt=png
Java面試者該準備哪些加分項技能
 
3.1框架是重點,但別讓人感覺你只會山寨別人的程式碼
一般工作在3年內的候選人,大多僅僅是能“山寨”別人的程式碼,也就是說能在現有框架的基礎上,照著別人寫的流程,擴充套件出新的功能模組。比如要寫個股票掛單的功能模組,是會模仿現有的下單流程,然後從前端到後端再到資料庫,依樣畫葫蘆寫一遍,最多把功能相關的程式碼點改掉。
如果單純使用SSM框架,大多數專案都會有痛點。比如資料庫效能差,或者業務模組比較複雜,併發量比較高,用Spring MVC裡的Controller無法滿足跳轉的需求。所以我一般還會主動問:你除了依照現有框架寫業務程式碼時,還做了哪些改動?
我聽到的回答有:增加了Redis快取,以避免頻繁呼叫一些不變的資料。或者,在MyBitas的xml裡,select語句where條件有isnull,即這個值有就增加一個where條件,對此,會對任何一個where增加一個不帶isnull的查詢條件,以免該語句當傳入引數都是null時,做全表掃描。或者,乾脆說,後端非同步返回的資料量很大,時間很長,我在專案裡就調大了非同步返回的最大時間,或者對返回資訊做了壓縮處理,以增加網路傳輸效能。
對於這個問題,我不在乎聽到什麼回答,我只關心回答符不符邏輯。一般只要答對,我就會給出“在框架層面有自己的體會,有一定的瞭解”,否則,我就只會給出“只能在專案經理帶領下編寫框架程式碼,對框架本身瞭解不多”。
其實,在準備面試時,歸納框架裡的要點並不難,我就不信所有人在做專案時一點積累也沒,只要你說出來,可以說,這方面你就碾壓了將近7成的競爭者。
3.2 別單純看單機版的框架,適當瞭解些分散式
在描述專案裡框架技術時,最好你再帶些分散式的技術。下面我列些大家可以準備的分散式技術。
  1. 反向代理方面,nginx的基本配置,比如如何通過lua語言設定規則,如何設定session粘滯。如果可以,再看些nginx的底層,比如協議,叢集設定,失效轉移等;

  2. 遠端呼叫dubbo方面,可以看下dubbo和zookeeper整合的知識點,再深一步,瞭解下dubbo底層的傳輸協議和序列化方式;

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

 
 
 
以上僅僅是用3個元件舉例,大家還可以看下Redis快取,日誌框架,MyCAT分庫分表等。準備的方式有兩大類,第一是要會說怎麼用,這比較簡單,能通過配置檔案搭建成一個功能模組即可,第二是可以適當讀些底層程式碼,以此瞭解下協議,叢集和失效轉移之類的高階知識點。 
3.3 資料庫方面,別就知道增刪改查,得了解效能優化
在實際專案裡,大多數程式設計師用到的可能僅僅是增刪改查,當我們用Mybatis時,這個情況更普遍。不過如果你面試時也這樣表現,估計你的能力就和其它競爭者差不多了。
這方面,你可以準備如下的技能:
  1. SQL高階方面,比如group by, having,左連線,子查詢(帶in),行轉列等高階用法;

  2. 建表方面,你可以考慮下,你專案是用三正規化還是反正規化,理由是什麼?

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

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

 
 
 
 
哪怕你在前三點表現一般,那麼至少也能超越將近一般的候選人,尤其當你在SQL優化方面表現非常好,那麼你在面試高階開發時,資料庫層面一定是達標的,如果你連第四點也回答非常好,那麼恭喜你,你在資料庫方面的能力甚至達到了初級架構的級別。
3.4 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優化”,“資料結構物件底層程式碼”等細節,大家也可以舉一反三,通過看一些高階知識,多準備些其它類似面試題。
3.5 Linux方面,至少了解如何看日誌排查問題
如果候選人能證明自己有“排查問題”和“解決問題”的能力,這絕對是個加分項,但怎麼證明?目前大多數的網際網路專案,都是部署在Linux上,也就是說,日誌都是在Linux,下面歸納些實際的Linux操作。
  1. 能通過less命令開啟檔案,通過Shift+G到達檔案底部,再通過?+關鍵字的方式來根據關鍵來搜尋資訊;

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

  3. 能通過vi來編輯檔案;

  4. 能通過chmod來設定檔案的許可權。

 
 
 
 
當然,還有更多更實用的Linux命令,但在實際面試過程中,不少候選人連一條linux命令也不知道。還是這句話,你哪怕知道些很基本的,也比一般人強了。 
3.6 通讀一段底層程式碼,作為加分項
如何證明自己對一個知識點非常瞭解?莫過於能通過底層程式碼來說明。我在和不少工作經驗在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框架等相關知識點,你在回答時,順便說一句,“我還了解這塊的底層實現”,那麼面試官一定會追問,那麼你就可以說出來了。
 
640?wx_fmt=png
預估面試題,準備對應的回答
 
4.1 哪些問題面試中大概率會被問到
在面試裡,不管如何引導面試官,其實如下方面的問題很大可能會被問到,所以在面試前可以提前準備。
  1. 職位介紹裡提到的技能要點,比如職位介紹裡有提到Mybatis,那麼面試官一定會問相關問題;

  2. 你在專案介紹時丟擲的技術關鍵字,比如你在面試過程中介紹專案時提到了Redis,那麼在介紹完專案後,面試官就會問,“你專案裡是如何使用Redis的?”,類似的,簡歷中你寫的技術,也有可能會被問到;

  3. Java核心,資料庫,Spring框架,專案管理等基礎問題,這些就不用說了,不過如果你引導得當的話,面試官會花費很多時間問你提到的技術,這塊會問得比較少;

  4. 必要的演算法題,比如排序等,其實面試官感覺你技術可以的話,這塊就不怎麼會問了,但準備的時候需要看這個,有備無患。

 
 
 
 
4.2 面試官提問的方式
以上介紹了常見問題的種類,這裡介紹下面試官常用的提問方式。
  • 問用法,比如直接提問,專案裡你netty怎麼用的?這塊大家可以結合專案準備說辭;

  • 問流程,比如結合業務,講下nginx負載均衡的用法?這也可以結合專案和網上搜到的資料準備說辭;

  • 問原因,比如為什麼要用netty?這塊就要結合專案說明了;

  • 問技術點, 比如netty裡零拷貝怎麼回事?對此,需要對簡歷上提到的每個技術點,以及面試過程中將要提到的每個技術點,搜相關面試問題,並結合業務說明;

  • 問基礎知識,比如finally從句的用途,這就可以通過刷題來獲取了。

 
 
 
 
 
4.3 舉例說明該如何準備面試問題
下面給出準備問題的技巧。
  • 斟酌面試時丟擲的技能,逐一準備說辭;

  • 針對技術,網上搜尋問題,比如搜Spring IOC面試題,結合網上的參考答案准備說辭;

  • 準備技術的實施要點,比如做了哪些配置檔案,你在專案裡踩過哪些坑?

  • 最好結合底層程式碼說明。

 
 
 
 
如下給出兩個例子,先以MyCat分庫分表為例,給出介紹說辭的技巧。
  • 準備業務背景,為什麼要用?比如我們專案資料庫併發壓力大,需要用MyCat作為分庫分表;

  • 如何使用,無非是設定分庫規則,改寫SQL語句等;

  • 準備下踩到的坑,比如自增長主鍵在每臺機器上都要保證唯一;

  • 然後再結合些底層程式碼,準備下一條SQL語句是如何分發到對應的分庫上的,然後執行好以後又如何返回的;

  • 再可以準備些只有做過才知道的細節,比如釋出上線和清洗資料的流程;

  • 網上找些MyCAT的面試題,準備相關說辭。

 
 
 
 
 
 
一般說到了這裡,面試官就不怎麼問了,哪怕你後面再被問倒,面試官也會感覺你MyCat很熟悉。
下面以Netty為例,給出相關技巧。
  • 結合業務需求點,說下為什麼要用這個技術,怎麼用的,以及用了有什麼好處? 比如為了優化網路通訊協議,所以用基於TCP協議的Netty,業務模組裡的xxx功能是用到netty;
  • 準備下踩到的坑,比如在某業務場景裡,我遇到了半包粘包問題,我是通過除錯底層程式碼解決的;
  • 用了Netty對專案的幫助。比如Netty是基於TCP協議的,它要比Http協議要輕,所以通訊效能高,且Netty內部的Reactor執行緒模型對系統的IO幫助很大;
  • 基於零拷貝、讀寫索引和非同步處理機制,準備些底層程式碼,在面試裡說明;
  • 順帶再準備下Netty的元件,工作流程等問題,這能搜到問題和相關說辭。
 
 
 
 
 
在講的時候,大家甚至可以邊畫Netty流程圖,再結合底層程式碼說明,這樣面試官一定會對大家刮目相看。
其實這裡僅僅是拋磚引玉,或者提到的技術比較高深 ,但可以講述的技術還可以是執行緒池,MyBatis元件,Redis,甚至是虛擬機器優化等。哪怕是初級開發,也能多少抓住一兩個點,按上述思路說明。
 
640?wx_fmt=png
面試時如何不被面試官牽著鼻子,自我把控面試的走向?
 
5.1 在介紹專案時,引導話題的技巧以及案例
在做專案介紹的時候,你可以穿插說出一些你的亮點,但請記得,不論在介紹專案還是在回答問題,你當前的職責不是說明亮點而是介紹專案,一旦你詳細說,可能會讓面試官感覺你跑題了。
所以這時你可以一筆帶過,比如你可以說,“我們的專案對資料要求比較大,忙的時候平均每小時要處理幾十萬條資料”,這樣就可以把面試官引入“大資料”的方向。
你在面試前可以根據職位的需求,準備好這種“一筆帶過”的話。比如這個職位的需求點是Spring MVC框架,大資料高併發,要有資料庫調優經驗,那麼介紹以往專案時,你就最好突出這些方面你的實際技能。
再給大家舉個例子,比如Java虛擬機器記憶體管理和資料庫優化是絕大多數專案都要遇到的兩大問題,大家都可以在敘述專案經驗時說,在這個專案裡,我們需要考慮記憶體因素,因為我們的程式碼只允許在2G記憶體環境中執行,而且對資料庫效能要求比較高,所以我們經常要監控優化記憶體和資料庫裡的SQL語句。這樣當面試官深入提問時,就能丟擲自己準備好的虛擬機器記憶體優化和資料庫優化方面的說辭。
或者說,在專案介紹時提到,在xx模組裡,我們使用了nginx做負載均衡,達到了承受百萬級併發的效果,從而引出nginx的話題。
實在不行,你也可以說“我除了做開發,也做了瞭解需求,測試和部署的工作,因為這個專案人手比較少,壓力比較大”,這樣你也能展示你有過獨擋一面的經歷。
5.2 以Netty為例,講述引出值錢話題的技巧
比如在介紹專案時,我提到了Netty技術,如果面試官沒打斷,我就問,能否介紹其中的Netty細節?得到允許後再說。
或者把技術關聯到面試官可能會問的問題上,比如問及網路通訊時介紹Netty,這個事先整理一個問題列表,遇到此類問題,順帶丟擲Netty說辭。
問題列表可以是,專案裡你用到哪些元件?用到哪些通訊協議?如何進行模組間的互動等等,然後先回答問題本身,再擴充套件到Netty。但請記住,別自說自話,因為過猶不及,其它技術照此辦理
5.3 以案例說明,在回答問題時引出準備過話題的技巧
比如面試官問你Spring相關問題,假設問到,你對Spring依賴注入瞭解多少,在說好Spring相關問題後再提一句,我們同時用Spring,以低耦合的方式整合了MyCAT元件,從而達到了分庫分表的效果,這樣就引出了分庫分表的話題 。
或者在介紹Netty流程後,再說一句,在實際專案裡,我們還遇到了因Netty底層程式碼而導致的OOM問題,對此,我們組負責排查和解決問題,這樣就自然而然地引出了OOM記憶體溢位的問題。
或者在介紹完執行緒相關問題時,再提一句,在專案裡,我們用到了執行緒池來管理執行緒,這樣就引出了高併發的話題。
但在引導的時候,請注意如下的三點。
第一,面試官不介面的,應當立即停止,再說下去就屬於自說自話了。
第二,還是要準備必要的基礎問題,還是要刷題,還是要準備各種說辭,因為面試前的全面準備,是引導的基礎。
第三,應當引導面試官問些“框架”和“效能調優”等值錢方面的技能,這樣才能最大程度地展示你的能力,同樣,此類問題需要面試前準備。
5.4 你可以引導的加分項
在如下的一些表格裡,歸納的加分項甚至初級開發多少也能準備,其中涵蓋了諸多方面。
表 Java Core方面可以準備的亮點
技術方面
可以說的亮點
Java集合物件
1 能根據專案的需求選用合適的集合物件,比如知道ArrayList和LinkedList的差異,並能合理選用。
2 能在合適的場合選用WeakHashMap。
3 可以適當講一些集合的JDK底層實現程式碼。
異常處理方面
能在finally從句裡寫釋放資源的程式碼
JDBC方面
1 能通過PreparedStatement的預處理方法來防止SQL隱碼攻擊。
2 能通過批處理來提升操作效能。
3 能通過例項講述事務隔離級別的含義
多執行緒方面
1 會結合專案使用執行緒池
2 能通過鎖或訊號量等手段正確地處理多執行緒併發時的資料一致性。
3 熟悉各種併發元件

表 資料庫方面可以準備的亮點

技術方面
可以說的亮點
建表
建表時需要根據專案的資料情況,考慮是採用三正規化或是反正規化。
SQL調優
1 可以通過檢視日誌等方式看哪些SQL需要調優。
2 可以通過執行計劃檢視SQL的所消耗的代價,並據此調優。
3 可以通過建索引,建分割槽等手段來優化SQL效能。
事務
1 可以說下JDBC或Spring裡是如何管理事務的。
2 可以說下Spring裡的宣告式事務的做法和優點。
3 可以舉例說明事務隔離級別和事務傳播機制的用法。
分散式資料庫
1 可以通過MyCAT進行分庫分表,從而減輕對單表訪問所需要的代價。
2 可以通過叢集等方式來承擔對資料庫的過量的訪問請求。
NoSQL和Hadoop
這兩個本身就是個亮點,如果大家用過,可以結合專案來說明。

表Java Web框架方面可以準備的亮點

技術方面
可以說的亮點
Spring MVC/Boot架構
1 可以說下Spring的IOC和AOP是如何優化專案結構的。
2 可以說下攔截器等Spring元件對專案的幫助。
3 可以說下Spring Boot對專案的幫助
ORM,比如Mybatis
使用這種ORM技術時,如何優化訪問和運算元據庫的效能。
Spring和Mybatis等的整合
可以講下整合框架的細節,並可以舉例說明整合後的框架能很好地適應需求的變更。

表 分散式元件方面可以準備的亮點

技術方面
可以說的亮點
元件應用
1 結合配置檔案等,說明怎麼用的
2 結合業務,說下具體的效果,比如限流後有什麼好處。
如何應對高併發的場景
1 如何達到負載均衡
2 如何進行失效轉移
定位排查和解決問題
1 如何通過分析log定位問題
2 問題的根源和解決方法
健康檢查和線上監控
1 如何通過健康檢查確定系統正常執行
2 出了問題,如何發出警告

由此大家能看到,其實很多事先可以準備的點,其實是你沒有想到,但你專案裡一定用過。你據此準備,在通過上述技巧在面試中合理地找機會說出來,你面試成功的可能性一定會大大增加。

 
640?wx_fmt=png
總結,面試準備後,結果可能就大不同
 
先從面試官的角度看下,哪些人能面試成功?
1. 最近半年的專案經歷和JD匹配度很高;
2. 通過面試,JD上的技能候選人大多能掌握;
3. 候選人在Java核心,資料庫和框架方面的基礎技能達標;
4. 不是刺頭,團隊合作沒問題,沒有其它大問題。
但如果大家面試前不準備,或者準備不到位,那麼就會面臨如下的後果了:
1. 簡歷未必能過篩選,甚至沒有面試機會;
2. 無法證明專案裡用到的技術和JD高度契合;
3. 介紹專案經驗時沒問題,把提問的主動權交給面試官;
4. 不知道將會問哪些問題,所有問題都現場想;
5. 在面試現場,沒法讓面試官全面瞭解你的技術亮點。
但如果按照上述方法準備,大家很大程度上能得到如下的收穫。
1. 能通過微調簡歷,得到更多的面試機會;
2. 能通過挖掘專案經驗,證明自己的技能和JD契合;
3. 能知道哪些屬於值錢技能,並能結合業務準值錢技能和調優技能的說辭,而且能不露痕跡地展示;
4. 不僅限於coding,更能展示專案管理(sonar等),linux,專案部署(nginx)等方面的技能;
5. 知道面試大致會問哪些問題,並由此能事先準備;
6. 能事先儘可能多地挖掘亮點,並在面試時展示。
這就是大家閱讀本文後的收穫,最後感謝大家看完本文。
作者簡介:胡書敏,知名外企資深架構師,8年內面試過數以百計的Java工程師,5年的Java培訓講師經驗,幫助眾多初學者成功拿到心儀的Offer。著有《Java核心技術及面試指南》。CSDN部落格專家:https://blog.csdn.net/sxeric
宣告:本文為作者原創投稿,未經允許請勿轉載。

【End】

0基礎學習python,每天5分鐘,進步一點點

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

640?wx_fmt=jpeg

熱 文 推 薦 

 

相關文章