背景
前段時間家里出了點事,辭職回家待了一段時間,處理完老家的事情后就回到廣州這邊繼續找作業,大概是國慶前幾天我去面試了一家叫做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(n2),然后提醒了我往排序這方面想,我靈機一動,可以先對陣列做排序,然后首元素與第二個元素做絕對值差,記為num,然后首元素回圈和后面的元素做計算,直到絕對值差不等于num位置,這樣效率比起O(n2)快多了,)
面試完后,技術官就問我有什么要問他的,我就針對這個崗位的職責和專案所用的技術堆疊做了詢問,然后就讓我先等下,等他去通知三面的技術官,說實話,二面給我的感覺是最舒服的,因為面試官很親切,面試的程序一直積極的引導我,而且在職業規劃方面給了我很多的建議,讓我受益匪淺,雖然面試時間有一個半小時,但卻絲毫不覺得長,整個面試程序聊得挺舒服的,不過因為時間比較久了,很多問題我也記不清了,
三面
二面結束后半個小時,三面的技術面試官就開始進來了,從他的額頭發量分布情況就能猜想是個大牛,人狠話不多,坐下后也沒讓我做自我介紹,直接開問,整個程序我答的也不好,而且面試官的問題表述有些不太清晰,經常需要跟他重復確認清楚,
-
對事務了解嗎?說一下事務的隔離級別有哪些(我以比較了解的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還是識訓頗豐的,雖然有點遺憾,但也沒什么后悔的,畢竟自己面試之前也是準備的很充分了,有些題目答得不好說明我還有很多技術盲區,不懂就是不懂,再這么吹也吹不出來,這也算是給我提了個醒,你還嫩著呢,好好修煉內功吧,畢竟菜可是原罪啊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57080.html
標籤:其他
