本文是鄙人薛某這位老哥的投稿,雖然面試最後掛了,可是老哥自己仍是挺優秀的,並且經過此次面試學到了不少東西,我想這就足夠了!加油!不要畏懼面試失敗,好好修煉本身,多準備一下,後面必定會找到讓本身滿意的工做。前端
下面問題的不少答案在筆主開源的 github.com/Snailclimb/… (【Java學習+面試指南】 一份涵蓋大部分Java程序員所須要掌握的核心知識 )都有,強烈推薦各位小夥伴閱讀一下。nginx
前段時間家裏出了點事,辭職回家待了一段時間,處理完老家的事情後就回到廣州這邊繼續找工做,大概是國慶前幾天我去面試了一家叫作Bigo(YY的子公司),面試的職位是面向3-5年的Java開發,最終本身倒在了第三輪的技術面上。雖然有些遺憾和泄氣,但想着仍是寫篇博客來記錄一下本身的面試過程好了,也算是對廣大程序員同胞們的分享,但願對大家之後的學習和麪試能有所幫助。git
先說下LZ的我的狀況。程序員
17年畢業,二本,目前位於廣州,是一個很是普通的Java開發程序員,算起來有兩年多的開發經驗。github
其實這個階段有點尷尬,高不成低不就,比初級程序員稍微好點,但也達不到高級的程度。加上現現在IT行業接近飽和,不少崗位都是要求至少3-5年以上開發經驗,因此對於兩年左右開發經驗的需求實際上是比較小的,這點在LZ找工做的過程當中深有體會。最可悲的是,今年的大環境很差,不少公司不斷的在裁人,更別說招人了,殘酷的形勢對於求職者來講更是雪上加霜,相信不少求職的同窗也有所體會。因此,不到萬不得已的狀況下,建議不要裸辭!面試
面試崗位:Java後臺開發redis
經驗要求:3-5年算法
因爲是國慶前去面試Bigo的,到如今也有一個多月的時間了,雖然仍有印象,但也有很多面試題忘了,因此我只能儘可能按照本身的回憶來描述面試的過程,不明白之處還請見諒!spring
bigo的第一面是微信電話面試,原本是想直接電話面,但面試官說須要手寫算法題,就改爲微信電話面。數據庫
第一面問的不算難,問題也都是偏基礎之類的,雖然答得不算完美,但過程仍是比較順利的。幾天以後,Bigo的hr就邀請我去他們公司參加現場面試。
到Bigo公司後,一位hr小姐姐招待我到了一個會議室,等了大概半個小時,一位中年男子走了進來,很是的客氣,說很差意思讓我等那麼久了,而且介紹了本身是技術經理,而後就開始了咱們的交談。
面試完後,技術官就問我有什麼要問他的,我就針對這個崗位的職責和項目所用的技術棧作了詢問,而後就讓我先等下,等他去通知三面的技術官。說實話,二面給個人感受是最舒服的,由於面試官很親切,面試的過程一直積極的引導我,並且在職業規劃方面給了我不少的建議,讓我受益不淺,雖然面試時間有一個半小時,但卻絲絕不以爲長,整個面試過程聊得挺舒服的,不過由於時間比較久了,不少問題我也記不清了。
二面結束後半個小時,三面的技術面試官就開始進來了,從他的額頭髮量分佈狀況就能猜測是個大牛,人狠話很少,坐下後也沒讓我作自我介紹,直接開問,整個過程我答的也很差,並且面試官的問題表述有些不太清晰,常常須要跟他重複確認清楚。
對事務瞭解嗎?說一下事務的隔離級別有哪些(我以比較瞭解的Spring來講,把Spring的四種事務隔離級別都敘述了一遍)
你作過電商,那應該知道下單的時候須要減庫存對吧,假設如今有兩個服務A和B,分別操做訂單和庫存表,A保存訂單後,調用B減庫存的時候失敗了,這個時候A也要回滾,這個事務要怎麼設計?(B服務的減庫存方法不拋異常,由調用方也就是A服務來拋異常)
瞭解過讀寫分離嗎?(額。。。大概瞭解一點,就是寫的時候進主庫,讀的時候讀從庫)
你說讀的時候讀從庫,如今假設有一張表User作了讀寫分離,而後有個線程在一個事務範圍內對User表先作了寫的處理,而後又作了讀的處理,這時候數據還沒同步到從庫,怎麼保證讀的時候能讀到最新的數據呢?(聽完頓時有點懵圈,一時間答不上來,後來面試官說想辦法保證一個事務中讀寫都是同一個庫才行)
你的項目裏用到了rabbitmq,那你說下mq的消費端是怎麼處理的?(就是消費端接收到消息以後,會先把消息存到數據庫中,而後再從數據庫中定時跑消息)
也就是說你的mq是先保存到數據庫中,而後業務邏輯就是從mq中讀取消息而後再處理的是吧?(是的)
那你的消息是惟一的嗎?(是的,用了惟一約束)
你怎麼保證消息必定能被消費?或者說怎麼保證必定能存到數據庫中?(這裏開始慌了,由於mq接入那一塊我只是看過部分邏輯,但沒有親自參與,憑着本身對mq的瞭解就答道,應該是靠rabbitmq的ack確認機制)
好,那你整理一下你的消費端的整個處理邏輯流程,而後說說你的ack是在哪裏返回的(聽到這裏個人心涼了一截,mq接入這部分我確實沒有參與,硬着頭皮按照本身的理解畫了一下流程,但其實漏洞百出)
按照你這樣畫的話,若是數據庫忽然宕機,你的消息該怎麼確認已經接收?(額.....那發送消息的時候就存放消息能夠吧.........回答的時候內心千萬只草泥馬路過........行了吧,沒玩沒了了。)
那若是發送端的服務是多臺部署呢?你保存消息的時候數據庫就一直報惟一性的錯誤?(好吧,你贏了。。。最後硬是憋出了一句,您說的是,這樣設計確實很差。。。。)
算了,跳過吧,如今你來設計一個map,而後有兩個線程對這個map進行操做,主線程高速增長和刪除map的元素,而後有個異步線程定時去刪除map中主線程5秒內沒有刪除的數據,你會怎麼設計?
(這道題我答得並很差,作了下簡單的思考就說能夠把map的key加上時間戳的標誌,遍歷的時候發現小於當前時間戳5秒前的元素就進行刪除,面試官對這樣的回答明顯不太滿意,說這樣遍歷會影響效率,ps:對這道題,大佬們若是有什麼高見能夠在評論區說下!)
......還有其餘問題,但我只記住了這麼多,就這樣吧。
面完最後一道題後,面試官就表示此次面試過程結束了,讓我回去等消息。聽到這裏,我知道基本上算是宣告結果了。回想起來,本身這一輪面試確實表現的很通常,加上時間拖得很長,從當天的2點半一直面試到6點多,精神上也盡顯疲態。果真,幾天以後,hr微信通知了我,說我第三輪技術面試沒有經過,這一次面試以失敗了結。
以上就是面試的大概過程,不得不說,大廠的面試仍是很是有技術水平的,這個過程當中我學到了不少,這裏分享下我的的一些心得:
一、基礎!基礎!基礎!重要的事情說三遍,不管是什麼階段的程序員,基礎都是最重要的。每一個公司的面試必定會涉及到基礎知識的提問,若是你的基礎不紮實,每每第一面就可能被淘汰。
二、簡歷須要適當的包裝。老實說,個人簡歷確定是通過包裝的,這也是個人工做年限不夠,但卻能獲取Bigo面試機會的重要緣由,因此適當的包裝一下簡歷頗有必要,不過切記一點,就是不能脫離現實,好比明明只有兩年經驗,卻硬是寫到三年。小廠還可能矇混過關,但大廠基本很難,由於不少公司會在入職前作背景調查。
三、要對簡歷上的技術點很熟悉。簡歷包裝能夠,但必定要對簡歷上的技術點很熟悉,好比只是簡單寫過rabbitmq的demo的話,就不要寫「熟悉」等字眼,由於不少的面試官會針對一個技能點問的很深刻,像連環炮同樣的深耕你對這個技能點的理解程度。
四、簡歷上的項目要很是熟悉。通常咱們寫簡歷都是須要對本身的項目作必定程序的包裝和美化,項目寫得好能給簡歷加不少分。但必定要對項目很是的熟悉,不熟悉的模塊最好不要寫上去。筆者此次就吃了大虧,個人簡歷上有個電商項目就寫到了用rabbitmq處理下單,雖然稍微瞭解過那部分下單的處理邏輯,但因爲沒有親自參與就沒有作深刻的瞭解,面試時在這一塊內容上被Bigo三面的面試官逼得最後啞口無言。
五、提高本身的架構思惟。對於初中級程序員來講,平常的工做就是基本的增刪改查,把功能實現就完事了,這種思惟不能說很差,只是想更上一層樓的話,業務時間須要提高下本身的架構思惟能力,好比說若是讓你接手一個項目的話,你會怎麼考慮設計這個項目,從總體架構,到引入一些組件,再到設計具體的業務服務,這些都是設計一個項目必需要考慮的環節,對於提高咱們的架構思惟是一種很好的鍛鍊,這也是不少大廠面試高級程序員時的重要考察部分。
六、不要裸辭。這也是我最樸實的建議了,大環境很差,且行且珍惜吧,唉~~~~
總的來講,此次面試Bigo仍是收穫頗豐的,雖然有點遺憾,但也沒什麼後悔的,畢竟本身面試以前也是準備的很充分了,有些題目答得很差說明我還有不少技術盲區,不懂就是不懂,再這麼吹也吹不出來。這也算是給我提了個醒,你還嫩着呢,好好修煉內功吧,畢竟菜但是原罪啊。
做者的其餘開源項目推薦: