1. 程式人生 > >Bigo的Java面試,我掛在了第三輪技術面上.........

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

背景

前段時間家裡出了點事,辭職回家待了一段時間,處理完老家的事情後就回到廣州這邊繼續找工作,大概是國慶前幾天我去面試了一家叫做Bigo(YY的子公司),面試的職位是面向3-5年的Java開發,最終自己倒在了第三輪的技術面上。雖然有些遺憾和洩氣,但想著還是寫篇部落格來記錄一下自己的面試過程好了,也算是對廣大程式設計師同胞們的分享,希望對你們以後的學習和麵試能有所幫助。

個人情況

先說下LZ的個人情況。

17年畢業,二本,目前位於廣州,是一個非常普通的Java開發程式設計師,算起來有兩年多的開發經驗。

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

Bigo面試

面試崗位:Java後臺開發

經驗要求:3-5年

由於是國慶前去面試Bigo的,到現在也有一個多月的時間了,雖然仍有印象,但也有不少面試題忘了,所以我只能儘量按照自己的回憶來描述面試的過程,不明白之處還請見諒!

一面(微信電話面)

bigo的第一面是微信電話面試,本來是想直接電話面,但面試官說需要手寫演算法題,就改成微信電話面。

  • 自我介紹
  • 先了解一下Java基礎吧,什麼是記憶體洩漏和記憶體溢位?(洩漏是指建立太多物件導致記憶體空間不足,溢位是無用物件沒有回收)

  • JVM怎麼判斷物件是無用物件?(根搜尋演算法,從GC Root出發,物件沒有引用,就判定為無用物件)
  • 根搜尋演算法中的根節點可以是哪些物件?(類物件,虛擬機器棧的物件,常量引用的物件)
  • 過載和重寫的區別?(過載發生在同個類,方法名相同,引數列表不同;重寫是父子類之間的行為,方法名好引數列表都相同,方法體內的程式不同)
  • 重寫有什麼限制沒有?
  • Java有哪些同步工具?(synchronized和Lock)
  • 這兩者有什麼區別(之前寫過比較這兩者的文章,按照上面的知識點大概講了下,文章地址:Java併發程式設計:synchronized、Lock、ReentrantLock以及ReadWriteLock的那些事兒 )
  • 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微信通知了我,說我第三輪技術面試沒有通過,這一次面試以失敗告終。

總結

以上就是面試的大概過程,不得不說,大廠的面試還是非常有技術水平的,這個過程中我學到了很多,這裡分享下個人的一些心得:

1、基礎!基礎!基礎!重要的事情說三遍,無論是什麼階段的程式設計師,基礎都是最重要的。每個公司的面試一定會涉及到基礎知識的提問,如果你的基礎不紮實,往往第一面就可能被淘汰。

2、簡歷需要適當的包裝。老實說,我的簡歷肯定是經過包裝的,這也是我的工作年限不夠,但卻能獲取Bigo面試機會的重要原因,所以適當的包裝一下簡歷很有必要,不過切記一點,就是不能脫離現實,比如明明只有兩年經驗,卻硬是寫到三年。小廠還可能矇混過關,但大廠基本很難,因為很多公司會在入職前做背景調查。

3、要對簡歷上的技術點很熟悉。簡歷包裝可以,但一定要對簡歷上的技術點很熟悉,比如只是簡單寫過rabbitmq的demo的話,就不要寫“熟悉”等字眼,因為很多的面試官會針對一個技能點問的很深入,像連環炮一樣的深耕你對這個技能點的理解程度。

4、簡歷上的專案要非常熟悉。一般我們寫簡歷都是需要對自己的專案做一定程式的包裝和美化,專案寫得好能給簡歷加很多分。但一定要對專案非常的熟悉,不熟悉的模組最好不要寫上去。筆者這次就吃了大虧,我的簡歷上有個電商專案就寫到了用rabbitmq處理下單,雖然稍微瞭解過那部分下單的處理邏輯,但由於沒有親自參與就沒有做深入的瞭解,面試時在這一塊內容上被Bigo三面的面試官逼得最後啞口無言。

5、提升自己的架構思維。對於初中級程式設計師來說,日常的工作就是基本的增刪改查,把功能實現就完事了,這種思維不能說不好,只是想更上一層樓的話,業務時間需要提升下自己的架構思維能力,比如說如果讓你接手一個專案的話,你會怎麼考慮設計這個專案,從整體架構,到引入一些元件,再到設計具體的業務服務,這些都是設計一個專案必須要考慮的環節,對於提升我們的架構思維是一種很好的鍛鍊,這也是很多大廠面試高階程式設計師時的重要考察部分。

6、不要裸辭。這也是我最樸實的建議了,大環境不好,且行且珍惜吧,唉~~~~

總的來說,這次面試Bigo還是收穫頗豐的,雖然有點遺憾,但也沒什麼後悔的,畢竟自己面試之前也是準備的很充分了,有些題目答得不好說明我還有很多技術盲區,不懂就是不懂,再這麼吹也吹不出來。這也算是給我提了個醒,你還嫩著呢,好好修煉內功吧,畢竟菜可是原罪啊。