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

作者 | 胡書敏
責編 | 劉靜
出品 | CSDN(ID:CSDNnews)
本人目前在一家知名外企擔任架構師,而且最近八年來,在多家外企和互聯網公司擔任Java技術面試官,前後累計面試了有兩三百位候選人。在本文裏,就將結合本人的面試經驗,針對Java初學者、Java初級開發和Java開發,給出若干準備簡歷和準備面試的建議。
 

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. 一定請記住,公司只能通過簡歷認識到你,簡歷上沒寫清楚等同於你不行。
其實這就是我們寫簡歷的方向,而且,在針對具體公司投遞簡歷時,還可以以此爲目標,微調簡歷。
 

面試時該如何講解技術項目贏得面試官好感
 
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. 此時還在項目介紹階段,別過多展開技能,你拋出技能關鍵字後,面試官自然會問的。而一旦你過多展開技術,那麼面試官就有可能感覺到你思路不清晰。
 

Java面試者該準備哪些加分項技能
 
3.1框架是重點,但別讓人感覺你只會山寨別人的代碼
一般工作在3年內的候選人,大多僅僅是能“山寨”別人的代碼,也就是說能在現有框架的基礎上,照着別人寫的流程,擴展出新的功能模塊。比如要寫個股票掛單的功能模塊,是會模仿現有的下單流程,然後從前端到後端再到數據庫,依樣畫葫蘆寫一遍,最多把功能相關的代碼點改掉。
如果單純使用SSM框架,大多數項目都會有痛點。比如數據庫性能差,或者業務模塊比較複雜,併發量比較高,用Spring MVC裏的Controller無法滿足跳轉的需求。所以我一般還會主動問:你除了依照現有框架寫業務代碼時,還做了哪些改動?
我聽到的回答有:增加了Redis緩存,以避免頻繁調用一些不變的數據。或者,在MyBitas的xml裏,select語句where條件有isnull,即這個值有就增加一個where條件,對此,會對任何一個where增加一個不帶isnull的查詢條件,以免該語句當傳入參數都是null時,做全表掃描。或者,乾脆說,後端異步返回的數據量很大,時間很長,我在項目裏就調大了異步返回的最大時間,或者對返回信息做了壓縮處理,以增加網絡傳輸性能。
對於這個問題,我不在乎聽到什麼回答,我只關心回答符不符邏輯。一般只要答對,我就會給出“在框架層面有自己的體會,有一定的瞭解”,否則,我就只會給出“只能在項目經理帶領下編寫框架代碼,對框架本身瞭解不多”。
其實,在準備面試時,歸納框架裏的要點並不難,我就不信所有人在做項目時一點積累也沒,只要你說出來,可以說,這方面你就碾壓了將近7成的競爭者。
3.2 別單純看單機版的框架,適當瞭解些分佈式
在描述項目裏框架技術時,最好你再帶些分佈式的技術。下面我列些大家可以準備的分佈式技術。
反向代理方面,nginx的基本配置,比如如何通過lua語言設置規則,如何設置session粘滯。如果可以,再看些nginx的底層,比如協議,集羣設置,失效轉移等;

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

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

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

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

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

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

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

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

能通過vi來編輯文件;

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

 
 
 
 
當然,還有更多更實用的Linux命令,但在實際面試過程中,不少候選人連一條linux命令也不知道。還是這句話,你哪怕知道些很基本的,也比一般人強了。 
3.6 通讀一段底層代碼,作爲加分項
如何證明自己對一個知識點非常瞭解?莫過於能通過底層代碼來說明。我在和不少工作經驗在5年之內的程序員溝通時,不少人認爲這很難?確實,如果要通過閱讀底層代碼瞭解分佈式組件,那難度不小,但如果如下部分的底層代碼,並不難懂。
ArrayList,LinkedList的底層代碼裏,包含着基於數組和鏈表的實現方式,如果大家能以此講清楚擴容,“通過枚舉器遍歷“等方式,絕對能證明自己;

HashMap直接對應着Hash表這個數據結構,在HashMap的底層代碼裏,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap裏,還包含着Lock的邏輯。我相信,如果大家在面試中,看看而言ConcurrentHashMap,再結合在紙上邊說邊畫,那一定能征服面試官;

可以看下靜態代理和動態代理的實現方式,再深入一下,可以看下Spring AOP裏的實現代碼;

或許Spirng IOC和MVC的底層實現代碼比較難看懂,但大家可以說些關鍵的類,根據關鍵流程說下它們的實現方式。 

 
 
 
 
其實準備的底層代碼未必要多,而且也不限於在哪個方面,比如集合裏基於紅黑樹的TreeSet,基於NIO的開源框架,甚至分佈式組件的Dubbo,都可以準備。而且準備時未必要背出所有的底層(事實上很難做到),你只要能結合一些重要的類和方法,講清楚思路即可(比如講清楚HashMap如何通過hashCode快速定位)。
那麼在面試時,如何找到個好機會說出你準備好的上述底層代碼?在面試時,總會被問到集合,Spring MVC框架等相關知識點,你在回答時,順便說一句,“我還了解這塊的底層實現”,那麼面試官一定會追問,那麼你就可以說出來了。
 

預估面試題,準備對應的回答
 
4.1 哪些問題面試中大概率會被問到
在面試裏,不管如何引導面試官,其實如下方面的問題很大可能會被問到,所以在面試前可以提前準備。
職位介紹裏提到的技能要點,比如職位介紹裏有提到Mybatis,那麼面試官一定會問相關問題;

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

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

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

 
 
 
 
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,甚至是虛擬機優化等。哪怕是初級開發,也能多少抓住一兩個點,按上述思路說明。
 

面試時如何不被面試官牽着鼻子,自我把控面試的走向?
 
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 出了問題,如何發出警告
由此大家能看到,其實很多事先可以準備的點,其實是你沒有想到,但你項目裏一定用過。你據此準備,在通過上述技巧在面試中合理地找機會說出來,你面試成功的可能性一定會大大增加。

 

總結,面試準備後,結果可能就大不同
 
先從面試官的角度看下,哪些人能面試成功?
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】
————————————————
版權聲明:本文爲CSDN博主「CSDN資訊」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/csdnnews/article/details/103154693

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