前言
最近半年內前前后后也面試了幾家公司,有成功的,也有失敗的,不過大部分以失敗結束;打算把最近面試的一些經驗寫成一篇文章(當然最近也一直有這個打算),希望能以此文章為轉折點,給自己一個警醒,也是給大家一些面試方法的經驗吧,當然最希望的,是希望大家從我的面試過程中學到一些東西,能避免我犯過的錯誤,走過的彎路。大片即將開始,請各位備好瓜子花生和衛生紙(不要想歪了,我是怕你們中途萬一想去WC),那么廢話不多說,開始吧。在開始之前,為了保護公司和我個人的的隱私,我會把公司的具體名稱省略掉,換做某個行業的某個規模的企業,敬請諒解。
面試整體總結
既然前面已經跟大家廢話那么多了,那我現在還是給我最近的面試來做一個整體的總結吧,我們寫記敘文也要有一個點睛之筆,所以我也希望為我的最近的面試打一個分,當然評分的標准可能每個人都會不同,所以我覺得以A,B,C,D來給自己評分,這點比較適合,也希望各位看官看完這篇文章以后,能給我打一個客觀的分數(當然不一定要和我給我自己打的分數一樣,哈哈),然后希望各位看官在看完這篇文章以后,給自己打一個分,看看自己位於什么位置,需要哪些要提高的地方。
- A:完美
- B:優秀
- C:及格
- D:不及格
以一個整體的表現來說,首先我給我自己的標准是:不及格。那么問題來了,評價一個面試者是否及格,優秀,除了面試官對你的主觀評價以外(個人傾向),還有一些客觀的東西,一般大家都會有一個想法,那就是:面試官實際上他怎么想,我不關心,因為每個人的想法都不同,你不能夠改變別人,但是你可以改變你自己。稍后我會提到這點,其實想着改變你自己的客觀的一些東西,並沒有錯,但是實際上,面試是一個“”溝通“”的過程,你不是商品,你也不是在談一場買賣,而是面試官去了解你,以及對你的能力有一個正確判斷的一種方式。
那么,評判一個面試者是否優秀,是否是面試官想要的人,其實可以從2個大的方面去評判。第一個方面是從面試者本身來看面試官,另一個是從面試官來看面試者。首先要明白前面說的兩點,就是要學會換位思考。也就是我前面所說的那句話:你不能改變別人,但是你可以改變自己;但是,如果你改變了自己,你也不一定能改變別人,如果你想改變別人,那就必須要改變自己。大家是不是覺得有點點繞?尤其是最后一句,其實這句話總結起來,就只有一句話:要想改變別人,必須換位思考;因為你是在和人溝通,而不是解決一些程序代碼上的BUG。
大家不要小看面試,有些人可能會有這樣的觀點:我平常在公司里面,在小組里面,都是特別6的人,所以我會以同樣的觀點來看外面人的,廢話不多說,先放一張圖,讓你們見識見識;順便也給這2家公司打個廣告,我一般用App找工作,因為這樣隨時隨地可以查閱公司和面試的一些情況,而且不容易被現在的公司發現。我推薦給大家2個App:一個是近年來比較火爆的BOSS直聘,另一個是獵聘。這2種找工作的方式各有優缺點,稍后我會詳細給大家介紹,先放兩張圖:
好了,這是我隨便找的一個職位信息,僅僅以Java為例(因為Java的從業者人數,是國內最多的,所以我覺得比較有代表性),大家能否感到一絲寒意呢?如果你在看完我上面發的這張圖之后,還能對自己保持信心,那可能有2種情況:第一種情況你本身就很6,之前的工作經歷和學習經歷的話,能夠輕松在競爭當中脫穎而出,這種人我沒啥好說的,右上角,因為這篇文章是給迷茫的人看的,你已經很厲害了,從我這里學不到東西。另一種人,就是我說的那種:不知天高地厚,一定要實現自己夢想的人,或者換句話說就是:無知者無畏,甚至找工作的時候抱着僥幸心理,以為自己內瞞天過海。好了,如果你是一個對自己的能力有一個清醒認識的人,那么恭喜你,這篇文章繼續看下去吧,希望我能幫到你。、
我們再回到之前所說的:A,B,C,D四個等級。其實我想說的是,你處於哪一個等級,其實和這幾個維度有關系,我畫一張圖你就知道了,下面的雷達圖你可以在這里去生成它,給自己一個客觀的評價,要知道,你並不是發揮出你自己的能力就行了,你可是在跟其他人競爭,那么,其實我們可以這么理解,一個人能不能面試成功,不僅僅是他能100%發揮出自己的水平,而且還和他所處的環境有關系,這個環境可不是你面試的時候面對面試官的環境,大家面試聽得最多的一句話應該就是:你回去等通知吧,有消息會通知你。其實這句話有2層含義:第一個意思就是,你不適合我們,第二個意思就是,你部分適合我們,但是我們要等等,看看有沒有比你更合適的候選人。那么這句話的含義,其實就包括了我下面雷達圖中所說的一個重點,你不是在一個人面對面試官,而是面對着千千萬萬的競爭者。
面試需要注意的地方
上面的說得差不多了(至少我是這么認為的,如果大家覺得有要補充的地方,我可以加上去,謝謝) ,那么開始本節的重點:面試需要注意哪些地方呢?我個人認為面試應該注意這大塊,也許一些小的細節,就可以暴露出你的缺點;在這里我還要說一點,是個人都會有缺點,但是面試的時候一定要揚長避短,這不僅僅是考驗你“”撒謊“”的能力,更是體現一個人情商綜合能力的一個表現,如果你能把你的缺點讓面試官聽成你的優點,那么我認為,不說100%過,至少你在面試官當中的印象會好很多,大家都知道公司其實不僅僅是寫代碼,我們還要面對各種各樣的人情世故,撕逼都是常有的事情,所以面試官看一個人,不僅僅是他的技術,還有他的為人何處理各種應急事件的能力。
面試要注意的地方主要分為三塊:
- 面試前
- 面試中
- 面試后
那么我按順序來描述一下吧,首先是面試前;面試前需要我們做哪些工作呢?首先第一,就是“”海選公司“”,既然公司可以從浩如煙海的人群當中篩選簡歷,那作為求職者來說,我認為也要選擇自己合適的公司,首先不說成功率了信心會得到提升,最重要的一點是:起碼你是一個對自己未來負責的人。這點非常重要,如果一個人連自己想進什么公司都不知道,那么他必然在下家公司也不會很長久。這里又開始打廣告了,開始提到的2個找工作的App,一個是BOSS直聘,一個是獵聘。工欲善其事,必先利其器。我們選擇一款適合自己的App和找工作的方式,對自己在找工作的路上的發展,是有着莫大的好處的。那么這2種APP應該如何選擇呢?什么樣的人適合什么樣的APP呢?我個人的看法是:如果說你是一個對未來模糊不清的人,而且技術很一般的候選人,我建議用獵聘。如果你是一個技術很過硬的人,不需要別人指引你前進方向的人,我建議用BOSS直聘。如果你用的是BOSS直聘,那么我這一段內容你可以直接跳過,因為此內容僅適合迷茫中的人。那么用獵聘,是不是說,我開放簡歷就行了呢?我直接告訴你,開放簡歷之后,會讓你的電話唄打爆,而且很多的獵頭都是推薦的同一個職位,根本沒有利用價值;我曾經開放過2天的簡歷,后來又關掉了,知道什么原因嗎?因為至少有10個獵頭給我推薦一家公司,並且在我面過之后,還有獵頭找到我,給我推薦這家公司。所以這個問題並不是一個找工作的問題,而是你去海選獵頭(你的經紀人,合作伙伴)的問題,其實抽象起來就是:你不需要很多的朋友,但是你至少要有一個知心朋友。獵頭的作用,並不是給你推薦工作,而是幫你找到工作,如果說只是推薦工作,那我完全可以省去獵頭這個環節直接去BOSS直聘上面找。
跟獵頭的合作,其實也是一個雙向的;很多的求職者,覺得獵頭找上門來,就是為自己服務的,表現得像一個大爺一樣,好像你給人家給錢了,必須要人家給你最優質的服務一樣。不管是對誰,你對別人的態度,決定了別人對你的態度。我就拿我來說,我只要找到一個靠譜的獵頭,一般說話都會比較有禮貌,如果說我對面試流程,或者公司不太了解的,我都會去問獵頭要一份公司的資料;並且如果有需要的話,我還會主動問獵頭要一份這家公司的面試輔導,畢竟獵頭不是對你一個人服務,也許他推過的這家公司,其他有候選人也進過這家公司,說不定那些面試題之前有人踩過坑。
既然獵頭這邊說完了,那么回到之前的問題:海選公司。那么什么樣的公司才是適合你自己的呢?我這里分為幾種。
- 本身比較厲害的那種,謀求高薪發展。
- 自己不太厲害,想出去見識,但是又怕自己能力不夠。
- 自己比較迷茫,不知道以自己的水平能達到什么程度,想去外面試試,觀望一下,有合適的就跳。
個人的說完了,現在說一說公司需要什么樣的人,我暫且把公司分為以下類型。
- 是個人都要了,能寫代碼就行,這種公司一般有2種情況,第一種是外包,另一種是本身招的是初級程序員,如果是外包,那我就不說了,相信踩過坑的人深有體會;如果說是初級程序員,現在公司這種人越招越少了,為什么呢,招一個畢業生就行了,如果你做了幾年,還是一個初級的水平,那估計誰也不願意要。
- 需要和行業知識或者軟件的一些業務相吻合的人,比如螞蟻金服會看一些和互聯網金融相關的,拼多多會注重電商相關的,如果是數據處理部門的話,會招一些大數據相關的人才,你的過往的工作經歷的契合度,決定了公司最終能不能看上你的一個重要指標。
那么,回到上面的問題,對於一個求職者來說,海選公司,什么樣的公司才是契合度高的呢?我個人覺得有這么幾點:你是否做過類似的東西,如果你沒有做過類似的東西,你是否接觸過相關的東西,如果你沒有接觸過相關的東西,你是否能夠快速上手,把自己之前未做過的東西,快速變成你自己知識體系的一部分。這句話還有一個層面上的意思,就是你是否有沒有快速學習的能力和適應變化的能力,我個人認為好的面試官,不僅僅是看你之前做過了什么,還會看你將來能做什么。
這里又發掘出了一個問題:什么東西是你的核心競爭力?什么是你比別人更加厲害的地方?拋開面試准備不說,把你的心扉敞開,自己問一下你自己,是不是真的有比別人強得多的地方。我相信每個人都有自己的答案,我這里分享一個小小的故事給大家聽,希望能給大家啟發:就來說一個學英語的故事吧,如果你英語好,這段也可以跳過,因為這其實是我的真實故事。記得上初一的時候,我的英語成績在全班是名列前茅的,很多的沒有我英語成績好的,經常來向我請教問題,他們請教什么什么呢?你猜?我告訴你,沒有一個是請教我具體問題的,他們只是在請教我同一個問題:“為什么我的英語不好,而你的英語那么好,為什么我費盡了九牛二虎之力,也記不住一個單詞,考試的時候總是不及格?“。我其實當時就跟他們說,基礎很重要,如果你學英語,連基本的音標都讀不好,那何談基礎好呢,如果你基礎不好,怎么才能學得更好呢?他們不相信,總是覺得我有什么與眾不同的秘密法寶。有一次上英語課,老師讓我朗讀一篇課文,我於是流利得讀了出來,然后讀完了之后,全班都開始笑了起來,我心想,難道是我讀得好?正當我美滋滋的時候,其中一位同學發話了:你有個單詞讀錯了,然后我堅持自己的意見,說就是這么讀的,班上的人又是一陣哄笑。然后老師只說了一句話:贊同我的讀法的請舉手,沒有一個人舉手,不贊頭我讀法的請舉手,然后班上除了我之外都舉手了;老師沉默了片刻,只說了一句話:真理,永遠掌握在只少數人的手中。我分享的這個故事,希望大家深思,不管是做事,學習,做人,都要深思;我比別人究竟差在哪里?我和別人比,核心競爭力在哪里?自己去思考,希望你看完這篇文章之后,能給我一個答案。
好了,回到正題;面試前除了進行公司的海選以外,在海選公司當中,我們還要了解到這個公司是做什么的;比如我看中了A,B公司,那么這2家公司的一些基本的對外展示的一些情況,我覺得還是很有必要去了解一下的,不管你最終是不是在這家公司工作,這起碼可以體現你這個人在做事情當中的態度。要記住這么一句話:這個世界上只有父母為你的過去負責,除了你之外,沒有人為你的未來負責,所以現在就要努力,努力再努力。了解公司是做什么的,可以通過一些具體的途徑,比如去一些招聘點評網站上去尋找關於這家公司的一些客觀的評價,也可以去了解一下公司的業務流程,去主動跑一下整個業務,甚至可以下載APP去體驗一下公司的整個業務的運作流程,這些東西都會在的與面試官的交流當中,起到意想不到的作用。其實這里還要跟大家提一點,海選公司,不僅僅是自己主動去選擇他們公司,如果你身邊有一個靠譜的獵頭,也可以讓他幫你推薦一下,有時候如果你自己不清楚自己的方向的話。因為獵頭接觸過的面試者,絕對比你接觸的面試官要多,這點是毋庸置疑的。
如果當你選擇好了一家公司做為自己的獵物的話,那么久可以進入我們下一個環節了,就是可以開始准備面試了。套用孫子兵法36計,你可以選擇適合你自己的方式。說到這里,大家會不會想:36計,走位上計!我知道大家想笑,其實這沒什么好笑的,走為上計也是面試技巧之一,稍后我會和大家說道具體的一些技巧。首先第一點:知己知彼,百戰百勝。說到這里,我們可以回到前面的議題,你可以去了解他們公司的情況,這叫知彼,知道你自己的情況,這叫知己,有些面試者可能會笑,我還不知道我自己嗎?我每天工作都很順利,領導分配給我的問題,我都能及時快速解決,我還不知道我自己水平啊,肯定66666.。好吧,如果你是這種心態的話,我給你一個建議,你可以找個沒人的地方,從網上隨便下載一套面試題,然后打開手機的錄音功能,把這些題目在沒人打擾的情況下說完。然后給你一個最親近的朋友(不是同事,這里我可要提醒下你),讓他告訴你聽完之后的真實感受,我敢打賭,能聽完了,絕對是真愛,你可以托付終生給他了。當然托付終身肯定是一句玩笑話,其實這里可以隱身出另一層意思,引用蘇軾寫過的一首詩就是:橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。其實真正了解你的不是你自己,而是你周圍的人。所以知道自己所處的一個位置是很重要的,又回到了我文章開頭說的一句話:無知者無畏,希望大家不要成為這種人;水平差,能力差,不可怕,可怕的是自己還不知道自己水平差,能力差,如果自以為是,那么最終的結果肯定是不會去奮斗,覺得自己“還可以”,最終淪為信息時代的一個被拋棄的犧牲品。那么問題回到了,我怎么才能知道自己處於一個什么水平呢?其實告訴大家一個很簡單的檢驗方式,就是可以測一下自己對知識的一個掌握的深度,這個比程度更高一個基本,之前在某個群里面和一位大牛聊天,他說的一句話我覺得很對,跟大家來分享一下:用到的JDK類,是不是都能理解清楚,使用細節點是否能理解,簡單的就是HashMap算法實現等等,1.8又做了哪些改進,這些都是平時用的多,但是很少有人去深究這些細節,連最常用的JDK的API接口都不能說清楚,估計寫代碼也理解不夠深入。其實說簡單一點,如果你想知道自己處在一個什么水平,可以用一些有深度的東西去測試自己的能力,如果僅僅是像工作一樣,每天就寫一些CURD的東西,那也很難測出一個人的真實水平,為什么面試問原理?就是原理的一個深入程度能看出你對代碼的一個理解能力。
另外要提到的一個就是“走為上計”,有些人可能不太理解,他們認為逃避就意味着失敗,實際真的是這樣的嗎?先來看看一段對話吧,下面的對話就是我和某公司的內推員之間的對話,我之前其實是很想去的,也就是我們所說的“無知者無畏”,大家可以看到了后面的對話可能不太明白,我為什么要逃避,其實我開始也說到了,一個人不懂,能力不達到,真的不可怕,可怕的是,你對自己沒有一個正確的認識,對自己的水平沒有一個正確的評估。走為上計,並不是為了放棄,而是為了今后更好的去面試這樣有挑戰性的大公司。永遠記住這么一句話:你的機會是有限的,不要拿你自己當實驗品,你也不是小白鼠,你不可能在短時間內連續面試同一家公司2次,至少,半年是一個周期。
下面我們再來看看下面一段對話,這是我和某位HR之間的對話,公司名稱我省略了,大家請看下面的圖,第一次別人已經告知了我面試失敗的原因,從這個時間段開始,其實就應該努力的准備一下自己比較欠缺的的部分,畢竟人家已經指出了你的不足之處。
下面的一些對話,就有點點兒不自量力了,其實面試就像談戀愛,不是你一廂情願就可以成功的。大家今后面試的話,多對自己的客觀能力有一個估計,少對公司抱有一些自己主觀性的看法,這樣說話才能少出漏洞,下面這張圖我自己到最后也放棄了,其實想要提醒大家的就是,你面試過的記錄,在人家的系統里面都有留存的,對於你會什么,不會什么,系統里都有一個客觀的評價,如果你想再次面試人家公司,至少你上次不會的東西一定要搞懂,否則就是浪費雙方的時間了。所以,走為上計,是正確評估自己的能力后采取的對自己的一種保護的方式,而並不是所謂的懦弱和無能的一種體現。
面試准備
需要注意的地方還有很多東西沒有寫,不過我覺得大體上也差不多了。現在進入下一個環節:面試准備。我這里分兩個方面去說你應該怎么准備。着兩個方面分別是你的口才方面和你的基礎知識方面,這2方面缺一不可,相輔相成。很多面試者不理解,我基礎知識掌握得確實可以,有句話不是說得好嗎,有真本事,我還怕找不到好工作?這種想法是要不得的,稍后我會結合一些具體的例子來跟大家詳細解釋一下,為什么口才和你掌握的基礎知識同樣重要。我面試的職位是Java高級(資深)工程師一職,那么對於一個合格的Java工程師來說,需要掌握哪些技能呢?我前面在面試之前自己畫了一份思維導圖,目的就是為了復習知識點用,希望能給大家帶來一些幫助吧,項目經驗這塊我刪掉了,因為每個人的項目經驗會不同,而且考慮到了隱私的問題。下面的思維導圖建議大家也可以自己按照自己的理解來畫,不一定要按照我的方式去理解。
看了上面的思維導圖,你是不是有種書到用時方恨少感覺呢?你面試還會保持100%的信心嗎?我想你會給出你自己的答案,畢竟每個人情況不同。下面我就面試來跟大家詳細講解一下上面說到的知識點,究竟該怎么准備面試。我會按照從上到下的順序來跟大家講解一下,講解完知識點以后,會跟大家聊一下做過的項目,該怎么復習。因為面試題實在的太多,而且這家公司問到的面試題,可能下家公司不一定能問到,所以我會取其精華來說。
我面試的職位是Java高級(資深)工程師一職,所以面試經驗都會圍繞Java來說。首先在准備面試的知識點之前,你可以先在腦海里把所有的自己會的知識點大致的框框過一下,分為:精通,熟悉,略懂,不懂這四個等級,這樣有助於你閱讀我后面的文章內容。首先是Java基礎,這應該不用我多說了.
第一個需要你掌握的就是面向對象的三大特性:封裝,繼承,多態。如果面試官問到你這個問題(這個問題一般高級程序員不會問到,因為太基礎了),你能夠把這3個特性回答出來,也只能證明你掌握了50%的面向對象的基本特性。因為面向對象還有五大基本原則,你剛剛所答到的是特性,而非原則,原則是面向設計的,而特性是面向細節的。這5大原則分別是:單一職責原則,開放封閉原則,替換原則,依賴原則,接口分離原則。具體的解釋請移步這篇文章。有些人說,這些知識點平常都知道,就是沒總結過,也沒必要去把這些東西了解,我想提醒你的是,面試只有1個小時,它的難度絕對比你工作要搞N個百分比,所以必須要認真准備,如果這個人對自己的未來都不負責,他怎么會對公司,會對自己的未來的工作負責?
第二個知識點是Java當中的反射,被問到的頻率會比較高,至少是30%幾率會被問到。JAVA反射3大塊地方會問得比較多:一個是反射這個包當中的一些常用的類,以及方法。第二個是這些方法怎么使用(牽扯到了項目當中的具體使用場景),第三個就是反射的原理。首先第一個問題是JAVA當中反射的常用類到底有哪些。首先我推薦一點學習方法,很多人碰到這個問題之后,首先想到的是百度,但是這樣學習的話,往往是缺少實踐的,導致的結果就是記憶不深刻。我推薦的方法是從反射的作用來入手去准備這個問題,也就是:什么時候用反射?這個問題我相信就算你沒有深入研究過原理,只有照葫蘆畫瓢都可以解釋出來;我來說下我的想法,首先我們用到的比較多的是把Object類型(所有對象類的超類)里面的真實類型的內容取出來,這些內容包括:字段,方法以及他們的具體值,反射其實可以這么理解:我不知道你長什么樣子,但是我只知道你爸爸長什么樣子,這樣層層遞歸,直到你的沒有你的爸爸(即上帝視角),而反射恰恰是一個相反的一個遞推過程,通過上帝(Object超類)來獲取到目前的你的一個基本的信息,前面的話是我對反射的一個大致的解釋,大家當做參考就好。那么通過反射,可以從Object類推導出當前真正實例的一些基本可用信息,比如Field,Method,Annotation。於是我們會想這么一個問題:既然我是想拿到相關的信息,那么這些工具類,對於當前被反射的對象來說,肯定有getter方法和setter方法。但是因為有些方法或者字段是private的,所以有當我去想這個問題的時候,肯定要做一層區分。所以我可以得到如下有用的信息:如果這個方法或者字段是非私有的,那么我可以直接獲得它,否則我需要把它設置為“可訪問的”。具體的一些細節不在本文的討論范圍之內,感興趣的可以自己去百度。反射當中還有一個比較重點的方法就是method.Invoke方法,如果你不僅僅是想拿到當前對象的一些屬性;首先如果是復習的話,你必須要了解invoke方法的各個參數的作用,並且要了解到什么樣的方法才內被invoke調用,具體的可以移步這篇文章。如果問到反射的原理的話,那么這個invoke方法肯定會是重頭戲,比如你能回答出靜態方法和非靜態方法在使用invoke的時候的區別,比如說invoke方法的底層實現,當然,如果你能結合JVM的原理來回答一下這個問題,我相信面試官一定會有一種眼前一亮的感覺,因為面試是作文題,而不是選擇題,出的題目很簡單,能給到多少分,全靠你自己的對代碼的嗅覺。
在開始第三點以前,請你回到剛才的思維導圖,再給自己對每個知識點評分,哪些是精通的,哪些是熟悉的,哪些是沒接觸過的。如果有一些知識點沒有接觸過的話,那如果面試問到了,你該如何作答呢?有些人可能想臨時突擊一下,畢竟這些知識點可能是作為職業要求必須掌握的一些技能,比如Dubbo,Zookeeper.等分布式框架。我的建議就是,如果你之前從來沒在工作中接觸過這些東西,那我的建議就是:可以直接跳過,面試的時候如果問到了,你就說不會,任何面試官都可以接受你不會,但是如果你說你會,那就一定要拿出個會的樣子,我記得有一次面試某家互聯網金融公司的時候,我說到了解決並發的問題,然后說解決並發可以用zookeeper的分布式鎖,但是我從來都沒用過zookeeper,也就不可能知道分布式鎖的一些原理,他總共圍繞這個問題問了我2,3個小問題,其中有些問題我還是隨便作答的,我想說,這樣肯定是負分的,不能為了一次面試通過,抱有僥幸心理,也不能為了通過面試,不擇手段。會就是會,不會就是不會,如果實在達不到人家的要求,那就再繼續努力,這不是能力的問題,而是態度的問題。
因為上面的知識點有很多,我再列舉一個常見的知識點,一般搞Java開發,Spring那套東西,你肯定是100%要懂的,那么圍繞Spring可以提出很多問題,比如有幾個比較經典的大問題我跟大家分享一下,也是我面試當中碰到的最常見的問題,希望能給大家一點啟發。第一個,問到得最多的問題,不是其他的,而是Spring事物相關的問題,我面試了3,4家公司,其中只有一家公司沒有問到這個問題,而且有2家公司第一個面試題就是問到了Spring相關的問題,首先這里我需要做一個自我檢討,我都沒有回答出來,給出的理由就是自己沒在實際的工作當中用過,其實這不是理由,因為已經3次問到了同一個問題,我三次在同一個地方跌倒,所以這不是借口,也不是我的能力有問題,而是我的態度有問題,所以之前面試過的一些題目,經驗,大家要及時總結。Spring的事物主要會問到這么幾個地方:一個是Spring事物的隔離級別,默認隔離級別,或者是事物的一些原理,實現方式,回滾原理底層實現,還有spring事物的傳播機制等問題,這個問題是高頻問題,大家一定要掌握。另外一個唄問到過的問題,就是spring 的生命周期,以及bean的加載的方式和整個流程,或者是spring mvc的加載流程。具體的一些細節大家可以去網上搜,我覺得這種問題的一個復習方式就是你一定要首先把整個架構給理清楚,然后最好是在紙上畫一幅圖,把它們之間的結構關系理清楚,最后再來根據結構與結構之間的關系來深入細節,而且面試也不會問到太多細節的東西,面試官一般只看思路。
有句話說得好:台上一分鍾,台下十年功。這句話說的意思,可不是你真的要為面試准備很久,這句話的意思是只要功夫深鐵杵磨成針。意思就是除了一些基本的東西要明白,你還要准備一些有深度的東西,這樣你才能真正在面試的時候占據主動。我曾經寫過這么一篇博客,沒想到大家反映很熱烈,不過大多都是給我點反對的,這里我接受大家的反對。不過我覺得這篇文章雖然有毒,不適合所有的人,不過我還是想說一句,你的深度決定了你的高度,你的高度,決定了你的基礎的深度。很多人對算法,數據結構,數學這些基礎課程不屑一顧,這里每個人都有每個人的理解,不過我覺得算法好的人,一定在對架構的宏觀把控方面強於那些僅僅依靠踩坑和直覺來做事的,在編程的世界里,沒有一個組件是可以獨立的,所有的組件和它的關聯的組件其實都是有着直接或者間接的聯系的。程序的實際的意義並不僅僅是“碼農”寫出來的代碼,它更像是一堆可以組合成各種不同形狀的積木,我覺得可以把程序和《我的世界》進行一個類比。那問題來了,深度怎么提高呢?就是我前面說到的方法,如果你是一個不滿足僅僅寫CRUD或者是在別人的框架上做研發的程序員,那就要嘗試學好算法,打好數學基礎。最重要的是,你要形成一個良好的邏輯習慣,這和吃東西一樣,為什么有些人是胖子?難道是他不運動,我見過的胖子很多都很熱愛運動,但是只是他們的飲食習慣不好而已,我相信,只要你能把你的思維習慣訓練好,一樣可以成為有深度,可以擔當重任的程序員,而且這並不是靠你1,2天突擊就能提高的,這是一個長期的過程,慢慢來不要急,這也是一個從量變到質變的過程。
既然知識方面已經准備就緒,那是不是可以去面試了呢?此言差矣!為什么這么說,因為你還不會表達你學過的東西。不信?你可以找一個朋友,最好是做過IT的,技術還過得去的。你叫他准備一些你認為簡單的面試題,然后給你做一個線下面試,我相信,很多人都不一定能答得很好,就像我開頭說的:面試實際上要比你的工作難很多,因為面試不僅僅是你要懂,還有要別人能聽懂,聽得舒服,這樣你的成功幾率才會大大增加。那么怎么才能把一個東西說出來,甚至說得比較好呢?這需要很強的歸納總結的能力,一場面試頂多頂多就1個小時,不會再長了,一場面試能問到你的問題,頂多10幾個,你算一下,一個小時60分鍾,除去自我介紹和介紹項目的時間,也就45分鍾左右,也就是說,在你和面試官交流的時間,其實每個問題不超過5分鍾。如果我現在叫你把spring的生命周期用5分鍾來介紹一下,並且流暢,邏輯清楚,你能否很好的辦到呢?我相信至少80%的人心里都會有答案,具體的我就不多說了。我建議在面試前,一定要訓練,訓練自己的口才,有些人說話說的少,這不是貶低俺們程序員,做程序員的,一般都跟電腦打交道,跟人說話的幾率自然就少,所以就需要不斷錘煉自己的口才,我的建議是,如果你暫時說不清楚,你可以先在紙上畫一下,然后慢慢跟着紙上的思路走,也許你第一次能完全說清楚spring的生命周期,用了30分鍾,第二次呢,第三次呢,總有一天,你會達到面試的要求,這是一個訓練的過程,如果旁邊實在沒人,可以對着鏡子訓練(我就這么訓練過,效果還不錯),而且重要的是要錄音,然后反復推敲自己說過的話是否正確,只有你做好了准備,你才能有更大的成功把握。面試官不會管你是否准備過,他只知道一件事情:你會,還是不會。如果你不會,那么就可以結束了。
面試開始
現在是正題才剛剛開始,大家備好瓜子花生拉~~~不過在面試開始以前,就是面試開始前的幾個小時,我建議你最好用思維導圖再把自己會的知識點過一遍,這樣會讓你的思路更加清晰。那么面試之前幾個小時要准備什么呢?大家不要笑,以我的經驗會給你這些建議:首先是鬧鍾,其次是一個百度地圖或者高德地圖,第三點事你要准備一瓶礦泉水。有些人可能會問了,我准備礦泉水做什么?如果你是個程序員,你一定會懂程序員其實是一個沉默寡言的群體,沒事的話不會主動跟同事說太多話,所以如果你過了第一輪面試的話,到達第二輪的時候,你已經說了一個小時了,有些面試官不會 給你准備水,所以如果到達第二輪面試的時候,你的聲帶必然處於一個疲勞狀態,這會嚴重影響面試的效果;所以,不管你能否進到第二輪,我都建議你帶一瓶水,這真的是起到意想不到的作用。還是那句話,如果你自己都不對自己負責,別人怎么會放心把工作交給你?
滴滴滴,面試開始了!首先我還是對面試的整個流程做一個簡單的歸納,面試的流程主要分為以下方面,這些步驟對於任何一個面試官來說,都是一樣的,也就是說,這是一個通用的流程。
- 自我介紹
- 介紹你的過往的項目經驗
- Java的一些基礎知識點和高級知識點
- 你對面試官提問
那么我就分別來跟大家說一下各個步驟需要注意什么,以及應對各種突發事件的情況,一般來說,面試官第一輪面試你的時候,實際上是第二輪,第一輪是篩選簡歷,如果當你坐在面試官的面前,那恭喜你,你已經到了第二輪。一般來說,自我介紹最好是簡單,突出重點,還有一個比較重要的地方,就是為你之后的一些話,埋下伏筆。有些面試官會很輕松的告訴你,我們做一個溝通,而不是面試。其實我認為面試就是面試,不存在溝通之說,如果你有地方說漏了,那也意味着你基本上沒戲了。那自我介紹應該怎么介紹你自己呢?這其實是一道短作文題,其實網上都可以搜索到相對應的一些范文,我這里主要還是圍繞重點來說,其實面試官從你的自我介紹當中,要聽出亮點,當然這個亮點一定不能誇大,亮點可以裝飾,但是不能誇大,因為面試官可能會在后面對你的提問中問到自我介紹當中他比較感興趣的地方,如果你不能很好的給出一個解釋的話,那估計你就被PASS掉了。那么什么東西才是你的亮點呢?我個人認為:亮點,就是你解決的一個最難的問題的一種思路,或者說面試官其實最想知道的是,你的上限在哪里?這個不是你臨時想的,而是你之前就應該准備好的。比如一個號的亮點可以是:研究過一些底層的源碼實現,比如Hashmap或者是重構過spring的一些東西,不過有一點要注意,這些東西你一定都要會,才能說。否則你開始在自我介紹里面說過了,如果面試官是正好對這塊比較熟悉,那他就會認為你是一個不誠實的人,那你基本上就會被PASS掉了。
第二點就是介紹你過往的一些項目,因為我已經畢業很久了,對於校招的一些東西,不是很了解,所以本文還是以社招為主,如果是社招的話,首先就是你的項目經驗,尤其是最近半年做過的項目,這里我不得不跟大家啰嗦一句,很多人項目做完了,就擺到一邊去了,從來不回頭看一下,哪怕是面試之前都不去看一下,對自己還是信心滿滿,如果你真的是這樣的人,那我覺得你還是回家吧,沒必要再面了。為什么說,對自己的項目熟悉,至少,你要對你做過的,尤其是最近做過的東西熟悉。有些人可能會說,我很熟悉啊,你看我天天忙死了,會不熟悉?好,很好,拿出你的項目,之前3個月,4個月做的項目,如果你這幾個月沒看過的話,如果你沒有在方法上有加注釋的習慣,如果你的命名平常不規范,我保證你想不起來這些類是做什么用的!為什么面試需要准備,就是因為人有遺忘性,正所謂猴子摘包谷,撿了芝麻丟了西瓜,這也是很多面試者的一個通病。那么回到項目經驗的介紹,這個步驟會比前面的步驟時間長一些,但是也不會太長,很多面試者在介紹的時候,長篇大論。把里面的業務邏輯都講得一清二楚,其實這樣有2點不好:第一突出不了重點,第二會壓縮后面面試的時間,這對面試者來說是非常不利的。所以語言必須簡練,而且要突出重點,項目的一些業務邏輯可以抽象一下,如果這個業務是一些web項目的 通用業務,那可以一筆帶過,並解釋一下架構的重點,比如我做過了3個項目,這3個項目肯定不是3份架構,架構有重用性,那么這個時候,可能在架構方面,你就只要介紹一個就行了;最重要的是,你要把你在架構中應用到的一些你比較擅長的知識點,去跟面試官說一下,那樣好為面試管問Java基礎的問題做好准備。
第三點,也就是最重要的一個環節:面試官問你的一些相關的技術知識,這里有2種情況:第一種情況是面試官他自己會准備一些面試題,然后會把這些面試題按照優先級來問,由淺入深。如果你在中間一個點斷裂的話,那么后面的它也不會再問了。這些面試題往往都是環環相扣的,大家復習的時候也可以按照這個思路來進行面試前的復習。還有一點,就是我剛才說的,根據你的項目方面的經驗,來具體問一些知識點,比如我再和面試官的交流當中,提到了Spring Aop,那么面試官可能會問一些Aop相關的知識點。面試介紹知識點,一定要切合面試官的問題來說,不要長篇大論,把自己復習到的東西都說一遍,抓住重點就好。還有一個就是面試的時候,如果面試官反問你一些問題的話,你要有充分的准備,比如面試官問到我一個問題,就是synchronized和可重入鎖的區別在哪?這個問題是怎么提出的?首先我再介紹的時候說了一句,這2者完全一樣(實際上不一樣,但是只是相似),所以如果面試官知道這個問題的結果,那么它就會問你這個問題,讓你騎虎難下,所以說話的時候,前后邏輯必須保持一致,如果你對這個知識點模棱兩可,那么還是管住嘴比較好一點。面試官也許會在一個問題上不停追問你,比如我之前有一個問題,就被問倒了,就是叫我設計一個QPS高的接口(因為我對這塊不熟悉,所以隨便作答的,結果被面試官問倒了),並且這個接口是不考慮服務器因素的,我回答:可以用鎖,那么面試官可能會說,鎖就是一種等待機制,只有等待舊的釋放了以后,新的才能進去;我又回答,可以用HashMap,面試官覺得這個回答不靠譜,我又說可以用分段鎖,那就是ConcurrentHashMap,那么這個問題就被繞回去了,分段鎖其實也還是用的悲觀鎖,和我之前說的答案是一樣 的,從一個問題的回答當中,不僅僅可以看出面試者的知識掌握程度,也可以看出一個面試者對一個問題邏輯分析並且解決問題的思路;切記,別給自己埋地雷。
其實在第三步走完之后,面試官對你的能力就會有一個客觀的認識了,你是否通過,我相信每位面試官心里已有答案了;最后一個問題是,你有什么可以問我的?如果面試效果太差,那這個部分不管你怎么努力,都是徒勞的了,問完這個問題后,面試官一般有兩種答案,如果是電話面試的話,他會告訴你面試結束,這種情況是100%PASS掉了,還有一種情況是等通知,這種情況被PASS的幾率我認為是70%,具體的和文章開頭提到的幾個因素有關系,比如面試者的整體情況等。如果他叫你等一下,有很大的幾率是你進入下一輪面試了,因為如果是2輪面試分開的話,HR也會主動去約下一輪面試。這個環節其實是展現你自己的時候,一些爛大街的問題,我覺得還是不要問了,比如交不交五險一金,周六加班不?加班有工資不?沒工資有調休不?其實這些問題更應該和HR溝通,而且一般的正規公司這些東西肯定少不了。那么什么樣的問題,才是一個好問題呢?首先我覺得,你可以結合你所了解的他們公司的一些具體的業務場景去問一些問題,如果是第二輪面試而且你覺得通過的把握比較大,我認為還可以打探一下他們部門是做什么的,有什么具體業務,其實面試本身也是一個雙向的選擇,只是他們先選擇你,然后才輪到你選擇他們的一個過程。比如你可以反問面試官,那你覺得設計一個高QPS的接口,需要做哪些工作呢?我覺得這就是一好問題,如果你沒能通過面試,那么學習點東西,絕對對你未來有好處。
面試結束
好了,到這個時候面試就結束了;現在有兩種情況擺在你的面前:第一種是面試失敗,第二種就是面試成功;我會分情況來跟大家詳細講解一下碰到這2種情況后你究竟該做什么?不管你是否面試成功,我個人認為都必須有一個平常心,不以物喜,不以己悲。雖然說這句話說得容易,但是實際上做起來非常難。如果你面試的公司是一家你比較心儀的公司,但是最終的結果還是失敗了,這種落差會造成很大的打擊。還有一種情況是你面了很多次,但是一次也沒有成功,你就會懷疑是不是全世界都把你拋棄了,再也找不到工作了,其實這種心態是要不得的,面試永遠只是人生的一個選擇題而已,這道選擇題沒有對錯之分。每個答案都可以活出不一樣的人生。還有一點就是,要加強抗壓能力,在這個世界上,不是事事都順利的,都依着你的。我之前在長沙工作的時候,我們開發部門的老大,做管理的,然后有件事情沒辦好,被炒魷魚了。后來大家猜他做什么去了?后來我才從其他同事當中聽到,他去做了電話客服,一個月只能拿幾千塊的工資,而它以前在我們部門是老大,工資都是一萬多,而且還有年底分紅。人生大起大落是正常現象,我們不能改變其他的,只能把自己的內心練就強大,不僅僅要調整好心態,還需要總結面試的差距,哪些地方不懂,要搞懂。哪些地方要學習,就要給自己制定一個計划,計划的目的並不是空頭支票,而是讓自己更好的在未來的變化當中不迷失方向;只有做好了上面說的2點,你的面試的失敗的教訓,才是有價值的。
如果你收到了公司的offer,那么首先恭喜你面試成功了,這個時候就開始要挑選公司了。這里也分為2種不同的情況:第一種是你剛剛收到第一家offer,還有一種情況是你收到了多家offer然后再這些offer中進行挑選。我也會分情況來跟大家描述一下。首先如果你不是一個能力特別突出的人的話,經過了很多次失敗,然后才拿到了offer,這種情況下的話,如果你是處於一個在職狀態中的話,我建議你可以先答應HR,只要價格是在你接受的區間內的話,因為這次的offer不一定要接受,它可以成為你下一次面試的一個參考和提價的一個依據。然后就是問一下具體是做什么的,分配到哪一個項目小組,有些HR或者面試官會給你打圓場,說他不能決定是在哪一個組,如果哪個組缺人,就去哪個組,這個時候你就要小心了,因為這種情況下的話,你不一定去做你想做的事情。還有一種可能性,就是有可能還有一輪面試,這種情況下,不要急着提離職,說不定人家還在研究你適不適合呢!如果你收到了多個offer,那怎么處理比較好呢?實話說,我這半年一共收到過2個offer,但是都不是連續的,所以我覺得這個問題留給其他大牛會更加合適,不過如果是我來選擇的話,我會根據以下幾點去考慮。
- 這家公司是做什么的,我在這些部門里面的職責是什么
- 這家公司是否適合我的職業發展
- 錢是否給夠了
- 加班是否嚴重
這些綜合指標進行對比,我相信你一定有你自己的答案,上面的排序是我按重要到不重要進行排序,就我個人來說,更看重發展,為什么?因為程序員是一個吃青春飯的職業,如果你想長久干下去,那么求發展一定是你的首要目標,相信我,錢永遠掙不完的。
各大公司面經
那么我面試了幾家公司,我會把面試題都給大家介紹一遍,詳細的解答大家去網上搜比看我這篇文章更好,我這篇文章主要的還是介紹面試的方法而並非知識點本身。下面開始介紹吧吧。題目大多數都很簡單,基本上都是那種能說多少就說多少的題目,全看自己的發揮,有些題目也記得不太清楚了,可能不能面面俱到,請諒解。另外面經僅僅限於技術,不包括問到的業務。其中問到的題目不分先后順序,因為有些問題時間隔得比較久,所以我也記不太清了,有想起來的會隨時補充。
某教育公司A
- 介紹一下SpringMvc和SpringBoot的區別。
- spring boot 加載原理
- 數據庫范式有哪些,具體原理和概念。
- redis為什么是單線程的?請說出底層原理。
- 請說出HashMap的原理及其底層實現。
- ArrayList和 LinkedList的區別。
- 什么是IOC?Spring IOC原理及其具體實現。
- 如果有一個非常長的數組,其中有一個左括號,在數組的右邊有一個右括號進行匹配,如果匹配成功,那么繼續。如果匹配不成功,就記錄下來。求第一次匹配不成功的數組的下標,如果匹配不成功,也繼續,直到整個數組遍歷完畢,求:有多少對括號不匹配。
- 什么是工廠模式,工廠模式的具體應用場景是什么?
某互聯網金融公司A
- Java反射相關的內容(問了個底朝天)
- jvm相關(內存模型,GC,分代算法)
- hashmap底層原理
- hashmap和ConcurrentHahmap區別(分段鎖具體實現原理)
- 怎么才能設計一個高QPS的接口(這個問題比較經典,希望大家多花時間去想想,可以體現一個人的深度)。
- 秒殺怎么設計。
- spring加載原理。
- volatile原理,鎖原理。
- ArrayList和LinkedList區別
- spring 事物相關問題(總之復習就好,不要別人問到什么就總結什么,全面點好,這個問題頻率高)
- redis緩存實時更新問題。
- 分布式鎖
- 隊列相關問題。
- 線程池相關問題(主要是問到了ThreadPoolExecutor)。
某O2O公司
- RPC相關概念及其原理
- RPC HTTP,Socket區別
- HTTP三次握手。
- Spring事物相關問題(爛大街了,自己去百度吧)
- 聚集索引和非聚集索引
- 多列索引和單列索引的問題。
- 數據庫ACID相關問題
- JVM調優(不僅僅是原理,還有一些具體的參數,命令,要回答出怎么用)
- 鎖,樂觀鎖,悲觀鎖,synchronized原理,鎖方法和鎖對象的區別,鎖靜態和鎖非靜態的區別。
- mysql樂觀鎖,悲觀鎖的實現機制。
- mybatis怎么實現樂觀鎖,悲觀鎖
- redis sortedSet底層實現及其原理。
- 數據庫設計相關問題:如果有兩張表的是多對多的關系,怎么處理比較合適?
某互聯網金融公司B
- spring事物相關問題。
- redis數據結構有哪些,介紹一下,以及他們的用法。
- synchronzied和可重入鎖的區別。
- 線程池相關問題,主要圍繞threadPollExecutor幾個參數的用法及其實際應用場景來提問。
- mysql默認隔離級別repeated read,介紹一下這個隔離級別相關的一些知識點。
- 樂觀鎖,悲觀鎖等。
后記
寫到這里,我相信大家已經對面試不陌生了,其實一些小的技巧,我覺得大家應該也要學會;至少,你必須要懂一點,程序不是人生,它只是人生的一部分。所以要多學會與人溝通,還有一點比較重要的就是,不要寄希望某一次面試能改變自己,還是那句話,有多大能力,發多大光,做多少事情,那樣自己拿錢才心安理得,如果大家覺得我還有地方需要補充的,可以留言,謝謝各位,希望各位過一個快樂的聖誕節!Merry Christmas!
PS:因為自己寫這篇文章也花費了很多的心血,可以說是自己出道以來寫得最好的一篇文章,所以自然希望別人的肯定,我把我的文章發到某個QQ群里面,希望大家能給我一些中肯的建議,於是有個人說:這個是你寫的嗎?是的。你工作幾年。4年。最后又去了哪里呢?我沉默了...別人不會因為你的弱小而去幫助你,也不會因為你的強大而去鼓勵你,因為你是在個給自己找工作,就像我的偶像保利尼奧說過的一句話:“人們總是會評價你的。有些人會說,保利尼奧現在踢得好是沾巴薩體系的光。有些人會說,他在中國踢得好只是因為中國水平太差。但我不需要證明什么。我不是為了黑子們踢球,我是為了我的隊友們踢球”。同樣,我們也不是為了別人而去找工作,也不是為了證明自己比別人強,我們每個人都是在為了自己的未來而努力,加油!