寫在開頭的閒言碎語
2020年過去了,對很多人來說,這一年經歷了太多太多,可能是十年來記憶裏比較濃墨重彩的一筆。過去的一年裏,“熬”算是這個階段我的關鍵字,確實太多時候就要放棄,好在自己“熬”過去了,在新的2021年裏,也有個一個非常好的開端,我收穫了心儀的offer。
簡單來說,就如標題一樣,我今天也想要凡爾賽一次,原來大廠的面試也沒有想象中的那麼難,字節跳動3面+騰訊6面,就這麼一次性過了,下面就細細聊聊我的大廠面經吧,希望能夠給金三銀四要面試的朋友提供一些經驗。
PART1:字節跳動3輪面試場景重現
——字節跳動第一面:
第一面相對來說肯定要簡單一些的,所以整個過程中心態是放得比較平穩的,沒有太多緊張感,這一輪主要是考察基礎,然後會問一些項目相關的問題。
①TCP相關的基礎知識
- 問題一:請詳細描述三次握手和四次揮手的過程(要求熟悉三次握手和四次揮手的機制,並畫出狀態圖)
- 問題二:四次揮手中TIME_WAIT狀態存在的目的是什麼?(要求畫出四次揮手的狀態圖,接着會引申問題,問到爲什麼四次揮手是四次不是二次?)
- 問題三:TCP是通過什麼機制保障可靠性的?(這個問題簡單,但要回答得比較全面。需要從四個方面作答,包括ACK確認機制、超時重傳、滑動窗口以及流量控制,甚至詳細講出流量控制的機制。)
②語言相關的基礎知識
- 字節跳動以Go爲主,所以儘管是後端崗位,也會問你對Go瞭解多少,對其他語言掌握多少?
- Java語法基礎
③網絡編程相關基礎
- 問題一:網絡IO模型有哪些?(5種網絡I/O模型,阻塞、非阻塞、I/O多路複用、信號驅動IO、異步I/O。從數據從I/O設備到內核態,內核態到進程用戶態分別描述這5種的區別。)
- 問題二:I/O多路複用中select/poll/epoll的區別?(從select的機制,以及select的三個缺點,講解epoll機制,以及epoll是如何解決select的三個缺點的。還會講到epoll中水平觸發和邊沿觸發的區別。)
④HTTP相關基礎
- 問題一:客戶端訪問url到服務器,整個過程會經歷哪些?(從七層網絡模型,HTTP->TCP->IP->鏈路整個過程講解報文的產生以及傳遞的過程)
- 問題二:描述HTTPS和HTTP的區別(從端口的區別,以及HTTPS是在SSL的基礎上以及加密等方面說明)
- 問題三:HTTP協議的請求報文和響應報文格式(要非常清楚請求報文和響應報文的組成部分,要求在寫具體案例。)
- 問題四:HTTP的狀態碼有哪些?(從2xx,3xx,4xx,5xx分別舉例出常見的code,面試官會問301和302的區別,以及500/503/504分別在哪些場景出現。)
⑤緩存和數據庫的基礎知識
- 問題一:描述一下redis有哪些數據結構?(基礎的數據結構有5種,高級數據結構4種。面試官還問了BloomFilter的原理以及Zset的實現原理,主要講解跳躍表。)
- 問題二:MySQL場景題目(面試官提供場景,要求寫出查詢SQL,考察聯合語句,如何分頁以及複雜語句的優化。)
⑥裸寫算法
- 樹的非遞歸先序遍歷。
——字節跳動第二面:
①項目經驗
二面的問題基本上都是以個人的項目經驗爲主,根據項目來提出一系列的問題。流程跟平時面試其他公司沒有什麼太多差別,面試官會要你先自己介紹自己公司的項目,在介紹的過程中就會根據你說的一些細節進行提問,一般會引申到項目的難度和架構方面,比如要你說出項目中遇到的難度,以及解決方案,再往深問就是有沒有更好的解決方案。
- 分佈式項目,考點:分佈式事務、分佈式一致性;
- API業務,考點:(1)負載均衡、CDN、DNS等問題;(2)HTTP相關問題,如描述HTTP版本的區別等;
②裸寫算法
- 回行矩陣遍歷
——字節跳動第三面:
①項目經驗
- 同樣是考察項目經驗,但與二面不同的是,三面更注重系統設計這一方面。大致情況就是,要你描述與二面不同的項目經驗,問具體詳細到問你的項目方案,缺點,改進的地方等。
- 要求模塊化:目前系統如果要做微服務架構,如何進行服務的拆分?拆分的規則是什麼?
- 考察微服務微服務架構相關知識:服務治理(限流、降級、熔斷)
②裸寫算法
- 二叉樹多個節點的最近公共祖先
PART2:騰訊6面場景重現
——騰訊一面:
①針對微服務進行提問:
- 微服務架構
- 框架的實現
- 服務治理
- 分佈式一致性
②日誌監控系統:
- 考察架構、ELK相關知識,重點要描述ELK的一些架構原理,如倒排索引的原理等;
③消息隊列:
- Kafka中消息可以被多個消費者消費嗎?
- 選舉機制
- HW機制
④數據庫和Redis相關:
- 索引的原理
- 幾種事務的區別
- 數據結構
- 延時隊列如何實現
- 分佈式鎖原理
⑤其他開放問題:
- 開放問題,不過多描述,如項目中遇到的問題,如何解決的?描述生產過程中運行的問題,並描述排查問題。
——騰訊二面(筆試):
考察具體崗位的技術棧語言的基礎知識,題目不難,要求基礎紮實和廣度,文中不過多贅述,大致題目整理到pdf文檔裏。
——騰訊三面+四面(技術組長面):
騰訊的三面和四面都是技術組長來面的,這個階段相對來說還是比較緊張的,面試內容則主要是聊解題的思路以及項目經驗,考察個人對於技術掌握的一個廣度,涉及到比較多的架構設計。
- 項目
- 開放性題:解題思路、同事之間的協作問題。
- 負載均衡
- 算法
- ngnix如何做限流?
- 四層LVS和七層Ngnix的區別
- 微服務架構的設計思路
——騰訊五面+六面(技術總監面):
這兩面的面試官應該是技術總監,面試難度應該是這一套流程裏最大的,主要考察面試者的兩個方面,包括系統設計和架構設計,需要面試者對於技術知識有比較深度的理解和認識。
①針對系統設計提問:
- 秒殺系統如何設計?分接入層、接口層、消息隊列層、邏輯層四個方面講解,接入層可以做服務治理相關事情,接口層做搶購開關、黑白名單、隨機拒絕等處理,邏輯層具體搶購邏輯實現,涉及到redis分佈式鎖以及DB和Redis的一致性問題。
- 分佈式事務的幾種實現。重點討論了這幾種實現的區別,面試官要求我畫出基於可靠消息服務的消息隊列實現分佈式事務架構圖,然後對上游服務和下游服務如何保證消息可靠性和一致性。
②針對微服務架構進行提問:
- 服務拆分的原則
- RPC框架原理
- 配置管理(etcd)的一致性協議raft選舉原理
③其他:
- 服務治理
- 服務限流算法
- 服務降級的指標和恢復指標
- 服務熔斷
④開放性問題:
- 在項目中,你印象中遇到的印象最深的一個難題,如何解決的?
- 在面試過程中,你覺得面試官問的哪個問題讓你印象最深,爲什麼?
- 生活中有遇到過什麼困難嗎?
PART3:我是如何準備面試的?
①準備簡歷(敲門磚,不會包裝簡歷的程序員只能去外包)
程序員的簡歷一定要多下一些功夫,尤其是對一些字眼要再三斟酌,如“精通、熟悉、瞭解”這三者的區別一定要區分清楚,否則就是在給自己挖坑了。當然不會包裝,我可以將我的簡歷給你參考參考,如果還不夠,那下面這些簡歷模板任你挑選:
②瞭解面試公司,做好功課,知道問什麼
對一線互聯網大廠的面試點,我也做了以下總結:
- 阿里巴巴、百度、騰訊
- 字節跳動、美團、京東
③梳理知識體系,學會舉一反三
實際上,梳理知識體系是最簡單的事,但很多開發小白總是一頭霧水,實際上從第二點的大廠面試點就可以總結梳理出來我們應該要學什麼,要掌握什麼,通常我的方法是“大廠面試點”+“工作年限”來梳理自己接下來的學習及發展路線圖。
之後,就需要根據路線圖上的重點去進行有針對性的學習,在學習過程中,學會舉一反三,學會寫筆記,做總結。
這裏我分享我個人的一些筆記內容吧:
- Java開發核心筆記
- Redis學習筆記
- SpringBoot核心技術筆記
④刷面試題
刷題的重要性,我想不用多說。對於應屆生或工作年限不長的人來說,刷面試題一方面能夠儘可能地快速自己對某個技術點的理解,另一方面在面試時,有一定機率被問到相同或相似題,另外或多或少也能夠爲自己面試增加一些自信心,可見適當的刷題是很有必要的。
以上面試學習資料已經打包好了,有需要的朋友可以點擊傳送門即可獲取到了(手速快的已經上車了).
寫在最後的總結
最後想說的是,2021年的金三銀四一眨眼也要到了,對於很多人來說是跳槽的好機會,大廠面試遠沒有我們想的那麼困難,擺好心態,做好準備,你也可以的。
另外,面試中遇到不會的問題不妨嘗試講講自己的思路,因爲有些問題不是考察我們的編程能力,而是邏輯思維表達能力;最後平時要進行自我分析與評價,做好職業規劃,不斷摸索,提高自己的編程能力和抽象思維能力。