大廠面試:一個四年多經驗程式設計師的BAT面經(位元組、阿里、騰訊)

鄙人薛某發表於2022-01-26

上次寫了篇歡聚時代的面經,公眾號後臺有些讀者反饋說看的意猶未盡,希望我儘快更新其他大廠的面經,這裡先說聲抱歉,不是我太懶,而是專案組剛好有個活動要趕在春節前上線,所以這幾天經常加班,只能工作之餘斷斷續續的編寫,如果各位看管覺得本文排版看著有些凌亂的話,還望見諒!

背景

先說一下個人情況,我是17年畢業的,去年年末開始面試,算起來是四年半的工作經驗,面試的公司大部分是廣州這邊的,有歡聚時代,位元組,阿里的Lazada,騰訊,網易等公司,最後拿到了歡聚時代和網易的offer,除了歡聚時代還算順利之外,面試其他的公司都有點磕絆,而且面了不止一次,最後的結果不算很理想吧,但我個人還是挺滿意的,畢竟比起之前的自己,這一次的跳槽也算是一次職業生涯的躍遷。

這個過程我也學到了不少經驗,面試之後我都會把記得的問題做記錄和覆盤,事後複習彌補自己的不足之處,也使得自己在後面的面試表現中越來越得心應手。所以,別的段位我不敢說,但如果是社招五年內經驗的同學,我相信我的面經對你還是會有幫助的。

說明

下面給大家分享我面試幾間大廠的面經,我打算用真題+經驗之談的結合方式來給大家介紹,這裡說明一下,因為社招很多題目都跟專案有關,而且幾面的面試題難免有重複,所以我下面的真實面試題不會寫的那麼全,也不建議大家去背這些題的答案,畢竟每個人遇到的題目都不一樣,我們需要做的是瞭解面試考察的大概方向,然後看看那些地方不足,儘早彌補自己的知識盲區,只有自身夠硬才不怕鋼鐵的錘鍊(這話有點中二,但我沒詞了)

位元組面經

位元組算是我面試最多的公司了,前前後後面了不下四次,實話說,位元組的hr小姐姐還是很熱心的,一般面完兩天內就會微信通知你,諮詢問題也是很熱情的解答。

這幾次面試中有兩次我是在技術終面被刷的(吐了呀),一次到了hr面,問的知識範圍也都差不多,全部寫出來沒必要,給大家分享內容有些代表性的面經吧,這是我投遞位元組國際化電商部門後端崗位的面試題目

面試題

自我介紹

Redis你比較熟吧,說說它機制為什麼快

有幾種資料結構,底層分別是怎麼儲存的

Redis有幾種持久化方式

多執行緒情況下如何保證執行緒安全?

用過volatile嗎?它是如何保證可見性的,原理是什麼

MySQL的索引結構,聚簇索引和非聚簇索引的區別

MySQL有幾種高可用方案,你們用的是哪一種

說說你做過最有挑戰性的專案

你具體負責哪部分的東西,哪些最有挑戰性,說說你做了哪些優化

秒殺採用什麼方案,分表怎麼做的,redis掛了怎麼辦,

分表為什麼要停服這種操作,如果不停服可以怎麼做

你怎麼防止優惠券有人重複刷?

redis資料冪等性是怎麼保證的(類似於分散式鎖那種,有個key就行了)

設計題:

1、如果讓你設計mysql高可用方案的話,你會優先考慮哪些方面

2、抖音評論系統怎麼設計,如果加入好友關係呢?(考慮到資料讀取的效能,可以採用寫擴散的方式)

3、怎麼設計一個短鏈地址,要考慮跨機房部署問題

你說要雜湊演算法生成短鏈,會存在什麼問題(雜湊衝突),該怎麼解決?(可以用布隆過濾器,但是不好控制,而且仍存在hash衝突)

有沒有更好的方案?(自增序列演算法,每次接收一個長鏈,就分配一個ID,轉成62進位制再拼到短域後面)

存在的問題?(自增id方案如果用雪花演算法,可能存在機器時鐘回撥的問題,導致id重複,說到這裡,我終於明白那傢伙為什麼說要考慮跨機房部署問題)

該怎麼解決?(用Redis做自增id生成器,效能高,但要考慮永續性的問題;或者改造雪花演算法,通過改造workId解決時鐘回撥的問題)

演算法題:

1、有一個陣列,裡面元素非重複,先升序再降序,找出裡面最大的值(二分法,要考慮只有一個元素和兩個元素的邊界情況)

2、連結串列深拷貝

3、統計使用者線上最大峰值和人數,要精確到秒(額滴神啊,秒級這個誰受得了,我的思路只能精確到小時,面試官說沒問題,後面成功寫出來跑過測試用例)

軟實力:

1、你怎麼評價你自己

2、你怎麼看電商這塊領域,為什麼要選擇電商

3、有沒有要問我的

總結:很看重演算法和場景設計,而且可能是因為投遞電商部門,對我之前做過的電商專案考察非常細

騰訊面經

我面試騰訊有兩次,兩次都是二面掛掉的,除了第二次的二面(有道很刁鑽的場景題,有空我會單獨寫篇文章分享),其他面試的問題都不算難,實話實說我自認為答得還不錯,第二面就被刷我也是有點納悶,算了,不發牢騷了,大家自己看看吧。

面試題

一面:

說說你做這個電商專案負責了哪些東西

基於什麼維度分表,如果搜尋商品名稱怎麼辦,

為什麼不用分割槽,分割槽有哪些優缺點

Rocket叢集有哪些方案?

如果多主無從的情況下,a,b,c同時可寫入,但c掛了,那c的還能訂閱嗎

Mysql高可用有幾種方案,分別有什麼特點

redis分散式鎖你們是怎麼用的(redission),原理知道嗎

redis的熱key知道嗎?一個熱key導致單臺機訪問流量過高,該怎麼辦?

分佈多臺redis的話,如果某一臺快取過期了,流量過大該怎麼辦?

如果有10臺機同時失效,那該怎麼一次性回源

限流是怎麼做的,用阿里雲的sentinel,有幾種策略(qps,時間)

有幾種限流演算法,各有什麼優缺點

二面:

介紹你在專案中的職責和負責模組

專案的日活量,QPS,壓測結果

專案是基於Http還是rpc訪問,怎麼做容災的

用到mq怎麼做一致性處理的

怎麼防止薅羊毛之類的

現有團隊人數,你在團隊的地位,拋開業務經驗來說,你覺得為什麼要找你做這個專案的技術負責人

你目前在研究哪些技術,哪些業務方向

未來兩三年的職業規劃

對go有什麼理解,你是基於什麼目的去了解go的

總結:問的大多是基於專案和場景,二面的軟實力問題有點多

阿里Lazada

Lazada社招的技術一共就兩輪,這裡不是吹牛,是我跟內推人以及面試官確認過的,當時讓朋友內推完隔了半個多月才開始面試,而且是leader先面試第一輪,然後一面的面試官再面試第二輪,過程有點漫長,個人感覺問的還是有點難度的(不過我自認為答得還可以,被刷後鬱悶了好一陣,大廠真的不好進啊)

面試題

一面:

說說你做過的專案

有哪些亮點,或者解決過什麼問題

你說引入mq對領取優惠券介面做了解耦,我理解領取優惠券介面比較簡單,為什麼還需要做解耦這麼麻煩,而且非同步還會影響使用者體驗?

(優惠券流程挺長的,而且一次性領取多張,判斷邏輯較多,訪問壓力大,為了減少rt和訪問壓力,引入mq做非同步入庫,並且對使用者體驗不會有影響)

分表為什麼要停服?

你們的服務最高多少qps,每臺機器,資料庫能支撐多大訪問量,怎麼測出來的?(很麻煩的一個問題)

你說說java執行緒池吧,怎麼運作的,放在佇列裡的任務是什麼時機執行的

你們專案執行緒池怎麼配置的, 為什麼這麼配

spring bean得生命週期

redis為什麼快?你說到支援多種資料結構,為什麼這個能提高速度(方便呼叫原生底層的資料結構)

你還在職嗎?(在職,但已申請離職)有其他offer嗎?最快什麼時候去入職

有什麼問我的嗎?

二面:

自我介紹

說說你最近做的專案,具體業務是怎樣的

你說的那個商城業務是怎樣的,你負責哪塊

有沒有遇到線上問題,怎麼解決

你們用springboot是吧,怎麼呼叫微服務的

Feign底層原理看過嗎

怎麼改負載均衡引數

如果讓你設計負載均衡,你會怎麼設計

CPU飈高有哪些原因

hotkey有檢測過嗎?怎麼優化的

做一道演算法題吧,兩個非負整數想加,結果以字串輸出

個人評價:Lazada問專案方面比較多,而且很看重效能優化,包括引數配置,架構設計之類的,八股文的話沒什麼大問題,總體來說這次面試還是很能考察經驗的。

經驗之談

以上就是我面試這幾家公司的大概題目,怎麼說呢,不算很難吧,網易問的其實也差不多,就不具體列出來了,而且都算是常規的面經題,我就不一一列出答案了,大家如果有疑問的上網搜一下,或者加我微信諮詢都行。

從我面試這麼多輪的情況來看,這幾家公司社招面試考察的範圍重點在於對求職者過往專案和技術場景方面的考察,八股文的話沒有像校招那麼全面,只不過每家公司問的知識側重點有會有所不同。

像位元組除了專案場景,還很看重演算法,以及求職者在系統設計方面的思考;

阿里Lazada比較看重專案方面的架構設計,以及線上故障的排查過程

騰訊的話問的比較多的是場景方面的思考,比如什麼Redis某個key訪問量飆高這種較為極端的情況,還有就是軟實力方面問的也比較多

下面說說我的心得吧,也算是給分享一下我的個人經驗

1、首要條件:準備好基礎的八股文

基礎,這點不用多說了,所有的面試都會問到的知識體系,雖然社招方面對基礎的考究沒有那麼全面,但基本的八股文還是要儘可能掌握的,這部分八股文包括但不限於:

  • Java基礎語言特性(物件導向、抽象、繼承、多型、反射等)
  • Java集合(HashMap必問、常見如陣列轉連結串列過程、1.7和1.8擴容機制區別、為什麼執行緒不安全、hash索引計算這些都必須掌握,還有ConcurrentHashMap的底層結構,跟HashTable的區別類似的也都要熟悉)
  • 併發程式設計,不用多說,基本也是必問,畢竟執行緒安全是所有語言開發都會遇到的難題,也是實際專案開發中非常重視的一點(Synchronized升級鎖過程,和AQS的區別、Volatile關鍵字的原理和特性、如何保證執行緒安全,多執行緒實現生產者消費者之類的)
  • JVM(不用多說,社招必問,垃圾回收演算法,JVM調優,CMS和G1區別都是要了解的)

除了Java語言外,基本的計算機網路基礎是必須要去重視的領域,務必要掌握這幾塊內容,如

  • 計算機網路協議及作用
  • TCP和UDP的區別
  • 三次握手和四次揮手過程,順便了解下像為什麼不能兩次握手那種稀奇古怪的問題
  • TCP如何保證可靠性,哪幾種機制,以及原理都要清楚
  • HTTPS原理(三次握手,驗籤,加密解密那些)
  • 瀏覽器輸入一個網址執行的全部過程

網路的話掌握這幾塊也就差不多了,然後作業系統相關的也有必要準備下,不用太複雜,就常見的那些面試題就可以,基本上只要按照上面所說的幾點準備,基礎八股文這塊也就差不多了,當然,不排除有些面試官會問一些刁鑽又冷門的問題,對此我也只能說四個字了,

祝你好運!

2、常用的中介軟體一定要多做準備

像常用的中介軟體如Redis、MySQL、MQ這些是基本必問的,我們不僅要會用,對其原理還要有一定的瞭解,更重要的是,我們面試前要儘可能準備這些中介軟體異常場景的解決方案,

比如Redis某個key訪問飆高了,快取出現穿透了怎麼做,Redis掛了怎麼保證跟MySQL的一致性;

MySQL索引失效怎麼排查解決,怎麼做好sql調優;

MQ出現消費異常怎麼辦,如何保證從生產者到消費者三端的高可用,訊息堆積了怎麼辦等等;

這些異常基本都是面試中經常問的,網上很多大佬也都有分享過對應的解決方案,在我眼裡,這些知識點都算是八股文,只要事先準備充足,拿個中介軟體熟練分基本沒什麼問題。

3、簡歷上的專案是最需要花精力準備的

專案這方面我就可以吹下牛13了,畢竟被問了這麼多次,都快成機械記憶了。

從我個人的經驗上看,面試官對簡歷的考察大概分這麼幾個維度,

  • 專案的整體架構,包含分多少個服務,多少個節點,呼叫鏈是怎樣的
  • 你做過的最有挑戰性的某個模組功能
  • 這些功能的業務設計,包含資料表有哪些,用了哪些中介軟體,怎麼跟其他服務做資料聯動的
  • 你在專案中做了哪些優化,有沒有什麼效果,比如RT減少200ms,壓測資料增加了5倍之類的,有資料支撐的話更有說服力
  • 你遇到過哪些線上問題,怎麼排查故障的
  • 專案的QPS相關指標,你覺得還能怎麼優化,假設有多加10倍的流量過來,你覺得怎麼設計才能支撐得了這麼高的訪問量

大概這幾點吧,大家從我上面寫的具體面試題目也可以對應的上,基本上問的東西都包含在這幾個維度裡,從專案的全域性到某個具體模組,一些重要的資料指標,以及整個架構的擴充套件性,還有異常情況的處理等等,這些東西如果你沒有事先做好準備,我敢說不可能在身經百戰的大廠面試官面前胡混過關。

除此之外,專案中很多時候會有場景異常方面的考察,比如什麼Redis掛了怎麼辦;微服務呼叫前面的服務呼叫成功,中間的服務呼叫失敗,怎麼做資料回滾;某臺服務當機了怎麼處理等等,這些類似異常場景也是經常在專案中被問到的,看官們如果有意向面試的話,在這方面可以需要多做點準備,只要結合專案的實際業務做好應急和預防措施,這些異常情況的出現概率是可以有效降低的。

(順便說一句,上次寫的歡聚時代面經裡也涉及到異常場景的內容,然後有讀者留言希望我介紹下有哪些解決方案,很樸實的請求,但很可惜,限於篇幅和主題我沒法在這裡詳細介紹了,日後針對這些場景方案我會整理出來在其他文章分享的,這裡先說聲抱歉)

繼續專案的話題吧,總的來說,專案這塊是最值得大家去花精力準備的,而且從我個人的經歷來看,社招面試專案方面的考核時間比例至少在一半以上,很多的八股文知識點最後都會落實專案中的實際使用場景,比如Lazada的一面面試中,面試官一開始也是從八股文出發,問了一大堆Java執行緒池的東西,包含基本引數和執行原理那些,但最後目的還是要考察我實際專案中對執行緒池引數是如何配置的,又是如何考慮拒絕策略的,這些都是需要跟實際業務結合起來才能設計的更加周全,沒有銀彈的方案,畢竟總不可能一個百萬日活的系統和一個一千日活的系統都配置一樣的引數吧。

因此我也很建議大家在美化專案的時候,要儘可能結合業務體量去思考具體的優化點,如果你把體量吹大了10倍,那麼也要考慮好支援當前體量的技術方案,從引數配置到伺服器節點都需要去預先思考,而且最好要思考與體量相配的一些重要指標如QPS、RT這些,這也是面試官很看重的一些點。沒有完善的技術方案支撐,吹出來的高併發,大體量也只不過是皇帝的新衣罷了。

4、演算法和系統設計題也許是你增強競爭力的關鍵點

演算法這玩意怎麼說呢,很多人談之色變,因為掌握的門檻很高,而且需要持久的刷題,不過也沒辦法,為了進大廠,這玩意我們還真要去下點功夫準備,但也不用太擔心,把常見的題型刷多幾道題就行,我遇到的演算法題無非都集中在幾種資料結構,像什麼連結串列、二叉樹、陣列,其他的暫時沒碰到過,大家把這幾種結構相關的熱門演算法題多刷刷就差不多了,如果能針對將要面試的公司去準備會更好,這種面試真題也不難找,牛客網和LeetCode上一大堆,關鍵是要持久多刷,別做二天題放三天假這種操作,沒點時間和毅力演算法這玩意是積累不了的。

還有系統設計方面平時大家也可以多積累一下,像什麼常見的設計秒殺系統、設計大流量熱榜之類的,基本是涉及到高併發大資料量相關的常見設計題都可以瞭解一下,一般來說,這種系統設計題不會考察的很詳細,主要是看你的設計思路和對異常場景的應變方案,這兩方面臨時發揮的話很難有說服力,還是很需要平時的積累和思考,大家沒事的時候可以設想下異常場景之類的,然後多跟同行討論下可行性,茶餘飯後,也算是有趣的一種交流方式。

5、軟實力方面不難,但也需要準備

軟實力這方面其實沒什麼大難度,每個人按照自己的情況回答就差不多了,一般是終面的技術面試官會比較考究,目的上是想了解你工作中的處理能力和未來規劃之類的,至於有沒有作用我就不做評斷了,一般來說,軟實力的題型也不會太刁鑽,面試這麼多年無非都是問這麼幾個:

  • 你未來三到五年的職業規劃是什麼
  • 說說你的優缺點,你跟同齡人比優勢在哪裡
  • 你工作中遇到的最大難題是什麼,不侷限於技術方面,你是怎麼協調的
  • 如果你來我們這邊,你想得到哪些收穫

這些題目沒有固定答案,因人而異,按照自己的想法去表達就可以,但我還是建議大家在面試前可以準備下這方面的話術,不為別的,至少在面試過程能做到表達流暢清晰,能提前準備的點儘量別走到臨時發揮的那一步。

說到這我想吐槽一下,技術性的面試不是不可以問軟實力的東西,但在我看來,這玩意最多算是個輔助考察作用,畢竟沒什麼回答門檻,很多人都能答出來,如果不從技術性的問題出發,而是問一大堆這玩意東西篩選人,那對於背景較差的求職者來說,恐怕就沒什麼優勢了吧。(個人淺見,不喜勿噴)

6、心態要好

這一點也算是我對大家最樸實的忠告了,就不管遇到什麼情況,儘可能保持心態好,現在大環境不好,很多公司招人的標準其實或多或少在變得更高,有可能你費盡心思準備了很久,但面試的過程和結果還是不盡人意,這也是正常的,畢竟是大廠嘛,要是那麼好進就不會那麼多人心嚮往之了。

而且不是一次失敗就決定結果了,其實大廠的機會一直都有的,一個崗位沒有通過面試最多就鎖半年到一年的時間,過了這個時間我們還是可以去重新面試的,而且有時候也不用等待那麼長,這個部門沒過說不定可以面試其他部門的崗位,只要總結經驗,多次嘗試,最後結果再差也比啥都不爭取強。

最後

淋淋灑灑寫了這麼多,用真題結合經驗總結,前後花了一週的時間,我也算是給大家分享了很有價值的面經了,如果看官們覺得寫得還不錯的話,還望能給鄙人三連支援一下,沒有三連,舉手之勞點個贊也行啊,我都受用的,哈哈。

過幾個月就是金三銀四的求職旺季了,如果你也正在找機會,並且也是幾年工作經驗的話,我想我的文章或多或少能給你些許幫助,這裡也衷心祝願想跳槽的各位看官,希望你們都能拿到理想的offer。

作者:鄙人薛某,一個不拘於技術的網際網路人,喜歡用通俗易懂的語言來解構後端技術的知識點,想看更多精彩文章的可以關注我的公眾號,微信搜尋【鄙人薛某】即可關注

相關文章