Bigo的Java面試,我掛在了第三輪技術面上.........

本文是鄙人薛某這位老哥的投稿,雖然面試最後掛了,可是老哥自己仍是挺優秀的,並且經過此次面試學到了不少東西,我想這就足夠了!加油!不要畏懼面試失敗,好好修煉本身,多準備一下,後面必定會找到讓本身滿意的工做。前端

下面問題的不少答案在筆主開源的 github.com/Snailclimb/… (【Java學習+面試指南】 一份涵蓋大部分Java程序員所須要掌握的核心知識 )都有,強烈推薦各位小夥伴閱讀一下。nginx

背景

前段時間家裏出了點事,辭職回家待了一段時間,處理完老家的事情後就回到廣州這邊繼續找工做,大概是國慶前幾天我去面試了一家叫作Bigo(YY的子公司),面試的職位是面向3-5年的Java開發,最終本身倒在了第三輪的技術面上。雖然有些遺憾和泄氣,但想着仍是寫篇博客來記錄一下本身的面試過程好了,也算是對廣大程序員同胞們的分享,但願對大家之後的學習和麪試能有所幫助。git

我的狀況

先說下LZ的我的狀況。程序員

17年畢業,二本,目前位於廣州,是一個很是普通的Java開發程序員,算起來有兩年多的開發經驗。github

其實這個階段有點尷尬,高不成低不就,比初級程序員稍微好點,但也達不到高級的程度。加上現現在IT行業接近飽和,不少崗位都是要求至少3-5年以上開發經驗,因此對於兩年左右開發經驗的需求實際上是比較小的,這點在LZ找工做的過程當中深有體會。最可悲的是,今年的大環境很差,不少公司不斷的在裁人,更別說招人了,殘酷的形勢對於求職者來講更是雪上加霜,相信不少求職的同窗也有所體會。因此,不到萬不得已的狀況下,建議不要裸辭!面試

Bigo面試

面試崗位:Java後臺開發redis

經驗要求:3-5年算法

因爲是國慶前去面試Bigo的,到如今也有一個多月的時間了,雖然仍有印象,但也有很多面試題忘了,因此我只能儘可能按照本身的回憶來描述面試的過程,不明白之處還請見諒!spring

一面(微信電話面)

bigo的第一面是微信電話面試,原本是想直接電話面,但面試官說須要手寫算法題,就改爲微信電話面。數據庫

  • 自我介紹
  • 先了解一下Java基礎吧,什麼是內存泄漏和內存溢出?(溢出是指建立太多對象致使內存空間不足,泄漏是無用對象沒有回收)
  • JVM怎麼判斷對象是無用對象?(根搜索算法,從GC Root出發,對象沒有引用,就斷定爲無用對象)
  • 根搜索算法中的根節點能夠是哪些對象?(類對象,虛擬機棧的對象,常量引用的對象)
  • 重載和重寫的區別?(重載發生在同個類,方法名相同,參數列表不一樣;重寫是父子類之間的行爲,方法名好參數列表都相同,方法體內的程序不一樣)
  • 重寫有什麼限制沒有?
  • Java有哪些同步工具?(synchronized和Lock)
  • 這二者有什麼區別?
  • ArrayList和LinkedList的區別?(ArrayList基於數組,搜索快,增刪元素慢,LinkedList基於鏈表,增刪快,搜索由於要遍歷元素因此效率低)
  • 這兩種集合哪一個比較佔內存?(看狀況的,ArrayList若是有擴容而且元素沒佔滿數組的話,浪費的內存空間也是比較多的,但通常狀況下,LinkedList佔用的內存會相對多點,由於每一個元素都包含了指向先後節點的指針)
  • 說一下HashMap的底層結構(數組 + 鏈表,鏈表過長變成紅黑樹)
  • HashMap爲何線程不安全,1.7版本以前HashMap有什麼問題(擴容時多線程操做可能會致使鏈表成環的出現,而後調用get方法會死循環)
  • 瞭解ConcurrentHashMap嗎?說一下它爲何能線程安全(用了分段鎖)
  • 哪些方法須要鎖住整個集合的?(讀取size的時候)
  • 看你簡歷寫着你瞭解RPC啊,那你說下RPC的整個過程?(從客戶端發起請求,到socket傳輸,而後服務端處理消息,以及怎麼序列化之類的都大概講了一下)
  • 服務端獲取客戶端要調用的接口信息後,怎麼找到對應的實現類的?(反射 + 註解吧,這裏也不是很懂)
  • dubbo的負載均衡有幾種算法?(隨機,輪詢,最少活躍請求數,一致性hash)
  • 你說的最少活躍數算法是怎麼回事?(服務提供者有一個計數器,記錄當前同時請求個數,值越小說明該服務器負載越小,路由器會優先選擇該服務器)
  • 服務端怎麼知道客戶端要調用的算法的?(socket傳遞消息過來的時候會把算法策略傳遞給服務端)
  • 你用過redis作分佈式鎖是吧,大家是本身寫的工具類嗎?(不是,咱們用redission作分佈式鎖)
  • 線程拿到key後是怎麼保證不死鎖的呢?(給這個key加上一個過時時間)
  • 若是這個過時時間到了,可是業務程序還沒處理完,該怎麼辦?(額......能夠在業務邏輯上保證冪等性吧)
  • 那若是多個業務都用到分佈式鎖的話,每一個業務都要保證冪等性了,有沒有更好的方法?(額......思考了下暫時沒有頭緒,面試官就說那先跳過吧。過後我瞭解到redission自己是有個看門狗的監控線程的,若是檢測到key被持有的話就會再次重置過時時間)
  • 你那邊有紙和筆吧,寫一道算法,用兩個棧模擬一個隊列的入隊和出隊。(由於以前複習的時候對這道題有印象,寫的時候也比較快,大概是用了五分鐘,而後就拍成圖片發給了面試官,對方看完後表示沒問題就結束了面試。)

第一面問的不算難,問題也都是偏基礎之類的,雖然答得不算完美,但過程仍是比較順利的。幾天以後,Bigo的hr就邀請我去他們公司參加現場面試。

二面

到Bigo公司後,一位hr小姐姐招待我到了一個會議室,等了大概半個小時,一位中年男子走了進來,很是的客氣,說很差意思讓我等那麼久了,而且介紹了本身是技術經理,而後就開始了咱們的交談。

  • 依照慣例,讓我簡單作下自我介紹,這個過程他也在邊看個人簡歷。
  • 說下你最熟悉的項目吧。(我就拿我上家公司最近作的一個電商項目開始介紹,從簡單的項目描述,到項目的主要功能,以及我主要負責的功能模塊,吧啦吧啦..............)
  • 你對這個項目這麼熟悉,那你根據你的理解畫一下你的項目架構圖,還有說下你具體參與了哪部分。(這個題目仍是比較麻煩的,畢竟我當時離職的時間也挺長了,對這個項目的架構也是有些模糊。固然,最後仍是硬着頭皮仍是畫了個大概,從前端開始訪問,而後經過nginx網關層,最後到具體的服務等等,而且把本身參與的服務模塊也標示了出來)
  • 你的項目用到了Spring Cloud GateWay,既然你已經有nginx作網關了,爲何還要用gateWay呢?(nginx是作負載均衡,還有針對客戶端的訪問作網關用的,gateWay是接入業務層作的網關,並且還整合了熔斷器Hystrix)
  • 熔斷器Hystrix最主要的做用是什麼?(防止服務調用失敗致使的服務雪崩,能降級)
  • 你的項目用到了redis,大家的redis是怎麼部署的?(額。。。。好像是哨兵模式部署的吧。)
  • 說一下你對哨兵模式的理解?(我對哨兵模式瞭解的很少,就大概說了下Sentinel監控之類的,還有相似ping命令的心跳機制,以及怎麼判斷一個master是下線之類。。。。。)
  • 那大家爲何要用哨兵模式呢?怎麼不用集羣的方式部署呢?一開始get不到他的點,就說哨兵自己就是多實例部署的,他解釋了一下,說的是redis-cluster的部署方案。(額......redis的環境搭建有專門的運維人員部署的,應該是優先考慮高可用吧..........開始有點心慌了,由於我也不知道爲何)
  • 哦,那你是以爲集羣沒有辦法實現高可用嗎?(不....不是啊,只是以爲哨兵模式可能比較保證主從複製安全性吧........我也不知道本身在說什麼)
  • 集羣也是能保證高可用的,你知道它又是怎麼保證主從一致性的嗎?(好吧,這裏真的不知道了,只能跳過)
  • 你確定有微信吧,若是讓你來設計微信朋友圈的話,你會怎麼設計它的屬性成員呢?(嗯......須要有用戶表,朋友圈的表,好友表之類的吧)
  • 嗯,好,你也知道微信用戶有接近10億之多,那確定要涉及到分庫分表,若是是你的話,怎麼設計分庫分表呢?(這個問題考察的點比較大,我答的其實通常,並且這個過程面試官還不斷的進行連環炮發問,致使這個話題說了有將近20分鐘,限於篇幅,這裏就再也不詳述了)
  • 這邊差很少了,最後你寫一道算法吧,有一組未排序的整形數組,你設計一個算法,對數組的元素兩兩配對,而後輸出最大的絕對值差和最小的絕對值差的"對數"。(聽到這道題,我第一想法就是用HashMap來保存,key是兩個元素的絕對值差,value是配對的數量,若是有相同的就加1,沒有就賦值爲1,而後最後對map作排序,輸出最大和最小的value值,寫完後面試官說結果雖然是正確的,可是不夠效率,由於遍歷的時間複雜度成了O(n^2),而後提醒了我往排序這方面想。我靈機一動,能夠先對數組作排序,而後首元素與第二個元素作絕對值差,記爲num,而後首元素循環和後面的元素作計算,直到絕對值差不等於num位置,這樣效率比起O(n^2)快多了。)

面試完後,技術官就問我有什麼要問他的,我就針對這個崗位的職責和項目所用的技術棧作了詢問,而後就讓我先等下,等他去通知三面的技術官。說實話,二面給個人感受是最舒服的,由於面試官很親切,面試的過程一直積極的引導我,並且在職業規劃方面給了我不少的建議,讓我受益不淺,雖然面試時間有一個半小時,但卻絲絕不以爲長,整個面試過程聊得挺舒服的,不過由於時間比較久了,不少問題我也記不清了。

三面

二面結束後半個小時,三面的技術面試官就開始進來了,從他的額頭髮量分佈狀況就能猜測是個大牛,人狠話很少,坐下後也沒讓我作自我介紹,直接開問,整個過程我答的也很差,並且面試官的問題表述有些不太清晰,常常須要跟他重複確認清楚。

  • 對事務瞭解嗎?說一下事務的隔離級別有哪些(我以比較瞭解的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仍是收穫頗豐的,雖然有點遺憾,但也沒什麼後悔的,畢竟本身面試以前也是準備的很充分了,有些題目答得很差說明我還有不少技術盲區,不懂就是不懂,再這麼吹也吹不出來。這也算是給我提了個醒,你還嫩着呢,好好修煉內功吧,畢竟菜但是原罪啊。

開源項目推薦

做者的其餘開源項目推薦:

  1. JavaGuide:【Java學習+面試指南】 一份涵蓋大部分Java程序員所須要掌握的核心知識。
  2. springboot-guide : 適合新手入門以及有經驗的開發人員查閱的 Spring Boot 教程(業餘時間維護中,歡迎一塊兒維護)。
  3. programmer-advancement : 我以爲技術人員應該有的一些好習慣!
  4. spring-security-jwt-guide :從零入門 !Spring Security With JWT(含權限驗證)後端部分代碼。

公衆號

相關文章
相關標籤/搜索