准備
敲定了方向和目標后就開始系統准備,主要分為以下幾個方面來准備。
算法題
事先已經看過別人的社招面經知道頭條每輪技術面都有算法題,而這一塊平時練習的比較少,校招時刷的題也忘記了很多。因此系統復習的時候算法題還是花了比較多時間的。先是快速刷完了劍指 offer,這個校招時已經刷過兩邊了,因此現在刷起來會相對快一些。然后就是啃 LeetCode 的題了,LeetCode 的題比較多,想在短短幾周內刷完基本是不可能的,因此我主要按照類型去刷,每個類型刷幾道就會比較有感覺了。比如鏈表的題優先考慮遞歸和雙指針來解決,棧和隊列的題優先考慮用兩個棧或隊列來解決,樹的題基本都是遞歸等。不過數組和字符串的題一般比較靈活,這種題只能盡量多刷了。平時要上班刷題也不方便,我采用的方法就是看題,用手機打開 LeetCode 的網站,看完題目后直接想解決方案,腦子里大概捋一下代碼怎么寫,能想到的就過,想不出的就看看別人的解法,用這個方法刷起來就很快。用這種方法你可能會擔心面試時題寫不完整,其實不用太擔心,因為面試的時候面試官看你寫的核心思路是正確的,邊界處理是對的基本就過了,面試時間比較有限。
理論基礎
基礎這一塊主要以快速復習為主,主要是語言(我主要用C++,所以復習C++)、操作系統和網絡編程。校招這一塊會問題的比較多,社招這一塊問的比較少,但是如果這一塊打不上來就比較尷尬了。語言就不說了,這一塊大家應該都知道會考些什么,校招的時候畢竟都瘋狂准備過。操作系統就看內存管理、進程管理和文件系統,一般虛擬內存問的多。網絡編程這塊就包括 TCP/IP 協議,HTTP協議,網絡安全三個方面。TCP/IP主要就是三次握手,四次揮手,TIME_WAIT 的作用等這些常考的題了。HTTP 協議考察 HTTP 協議的返回碼、HTTP 的方法等。需要特別指出的是 HTTPS 加密的詳細過程要非常透徹,不然容易產生一種感覺好像都清楚了,但是一問就有點說不清楚。最后就是網絡安全,主要考察也是 WEB 安全,包括XSS,CSRF,SQL注入等。
后端技術
這里的后端技術主要指工作中要用到的一些基礎組件,一些常見的后端架構設計。主要准備了MySQL、Redis、消息隊列、zookeeper、分布式系統架構設計和docker。MySQL 主要看了極客時間的 《MySQL 45講》,關於事務、索引、鎖以及 binlog 和 redolog 都講的非常好,也是面試最愛考的,除此之外對數據庫的讀寫分離、分庫分表也要掌握。沒有任何利益相關,決不是打廣告。Redis 主要看了《Redis 的設計與實現》,然后自己再總結了一下 Redis 的使用場景,以及 Redis 實現分布式鎖基本 Redis 就沒有問題了。消息隊列的開源軟件比較多,我主要選擇 Kafka 來學習,主要看官網文檔,極客時間的《Kafka 核心技術與實戰》,和一些技術文章等。不過極客時間的《Kafka 核心技術與實戰》,我覺得講的比較一般,不是很建議。分布式系統的就准備CAP理論、BASE理論、限流、熔斷、一致性***算法、主從架構、集群架構、異地多活、負載均衡、分層架構、微服務等。
深挖項目
沒有參與開源項目的經驗,工作中做的項目也很一般,項目這塊我實在沒什么太多拿的出手的,不過還是要挖掘一下,畢竟這一塊是逃不掉。我說幾個我思考的點吧:
- 找項目中相對而言具有亮點的地方。比如我用 redis 實現了一個延時隊列,然后對這個延時隊列我通過分片來解決瓶頸,通過分發來加快處理速度。
- 找項目中復雜的地方。如果你做的項目中有復雜的地方,即使不是你做的,也可以拿來說,前提是你要搞得非常清楚來。
- 量化指標。一個接口原來有性能問題,比如你做了一個小的優化,將其 TP99 的耗時從原來的 500ms 優化至多少 200ms。
- 賦能整個團隊。在開發業務的過程中肯定會遇到一些重復的工作,或者可以復用的服務。你可以開發了某個工具或者服務化了某個功能推廣到了全組使用,給公司創造了價值。
Shopee
一面
- mysql 有那些存儲引擎,有哪些區別
- mysql 索引在什么情況下會失效
- innodb 與myisam 的區別?
- mysql 的索引模型
- mysql 主從同步怎么搞的?分哪幾個過程?如果有一台新機器要加到從機里,怎么個過程。
- 樂觀鎖與悲觀鎖的區別?
- binlog 日志是 master 推的還是 salve 來拉的?
- redis 持久化有哪幾種方式,怎么選?
- redis 主從同步是怎樣的過程?
- redis 的 zset 怎么實現的?
- redis key 的過期策略
- hashmap 是怎樣實現的?
- tcp 的握手與揮手
- select 和 epoll的區別
- http與https的區別,加密怎么加的?
- raft算法和zk選主算法
- Kafka 選主怎么做的?
- kafka 與 rabbitmq區別
- kafka 分區怎么同步的
- kafka 怎么保證不丟消息的
- kafka 為什么可以扛住這么高的qps
- http各種返回碼,401和406啥區別?
- redis 哨兵和集群
- kafka partition broker consumer consumer group topic 等都是啥關系?
- 兩個單向鏈表,返回求和后的鏈表結構,例如2->3->1->5,和3->6,結果返回2->3->5->1
二面
二面沒什么好說的,和面試聊人生去了,我以為是要涼的節奏,但是卻拿到了offer。
三面
HR 面
騰訊
騰訊面試提前1天和提前一個小時都會發短信提示。去的騰訊濱海大廈面試,大樓的現代化程度很高,不過需要提醒一下的是,騰訊的濱海大廈分為南塔和北塔。我去的時候就上錯樓了,需要下到4樓重新換成電梯。
一面
筆試
- 微服務的特點,如何實現服務發現和負載均衡
- c++內存管理
- time_wait在哪一端產生,作用是什么
- 程序crash如何定位
- 服務性能問題如何定位
- 兩個排序數組找中位數
- 就數字n的平方根
- 設計一個算法,抽獎次數越多中獎概率就越高
- MySQL 如何分析一條語句的執行過程。delete from t1 limit 3和delete from t1的區別?
面試
- 問項目
- 跳台階
- 數組中奇數個元素
- 一棟樓有n層,不知道雞蛋從第幾層扔下去會碎,用最少的次數找出剛好會碎的樓層
- 動態規划與貪心有什么區別
- redis數據結構的底層實現
- redis如何實現高可用
- 負載均衡算法有哪些
- 服務發現是怎么實現的
- 熔斷是怎么實現的
- id生成器怎么實現的,如何實現全局遞增
- 協程和線程的區別
- 進程間通訊方法
- 平時逛哪些論壇,研究哪些算法
- paxos算法,這個算法我說不清楚,然后說了raft算法
- gdb怎么切換線程
- 如何判斷一個圖是否有環
- 介紹一下緩存
- 查看 CPU 的命令和磁盤 IO 的命令
二面
- 項目的系統架構畫一下
- 如果用戶量上漲怎么優化
- 負載均衡的加權輪詢算法怎么實現
- 背包問題
- 貝葉斯的概率學原理
- 分詞算法
- 連續整數求和(leetcode 第 829 題),要求時間復雜度小於O(N)
總結
騰訊二面面完我就知道涼了。動態規划非要寫出遞推公式,因為我一直都是用動態規划表的思路來解題,所以這個地方沒有答好。后面又問貝葉斯和分詞算法,一點都不會(我的內心:我是來面后台的,又不是面算法的)。最后一道算法題只能想出 O(N) 復雜度的,面試官一定要小於 O(N) 的,答不上來。這道題是 leetcode hard 級別的難度,所以沒有刷。不過后面去看可能也沒有那么難,只是這種通過數學公式的特點來解題往往容易被忽略了。總之,騰訊的一面算是中規中矩,二面確實讓我有點手足無措。之前看網上的說法是騰訊算法題考的比較少,可能還是要分部門吧,我這次面試的是騰訊視頻,二面基本上全是考算法。還有大部分面經都說,算法題很少考 leetcode hard 級別,這個我也要表示懷疑了,因為騰訊和后面的頭條都考了 hard 級別的。所以刷題時不能完全跳過 hard 級別的題。那有什么題不會考呢?我認為是描述起來很復雜的題面試時不會考,因為面試時間比較緊,如果光時把題看懂都要解釋半天的,這種是不太會考的,比如那個 LeetCode 上買股票的題。
字節跳動
一面
- 問項目
- 任務系統怎么保證任務完成后發獎一定成功
- zset 延時隊列怎么實現的
- redis 數據結構有哪些?分別怎么實現的?
- redis 的持久化
- mysql 的索引
- 一個無序數組找其子序列構成的和最大,要求子序列中的元素在原數組中兩兩都不相鄰
二面
- Redis 的 ZSET 怎么實現的? 盡量介紹的全一點,跳躍表加哈希表以及壓縮鏈表
- Redis 的 ZSET 做排行榜時,如果要實現分數相同時按時間順序排序怎么實現? 說了一個將 score 拆成高 32 位和低 32 位,高 32 位存分數,低 32 位存時間的方法。問還有沒有其他方法,想不出了
- MySQL 事務的四個隔離級別? 先說了四個級別的區別,然后說了每個級別可能產生的問題
- binlog 日志和 redolog 日志清楚嗎? 說了兩個日志的作用以及兩階段提交
- C++ 的動態多態怎么實現的?
- C++ 的構造函數可以是虛函數嗎?
- 缺失的第一個正數(leetcode第41題)
- linux 系統里,一個被打開的文件可以被另一個進程刪除嗎?
- 一個 10M 大小的 buffer 里存滿了數據,現在要把這個 buffer 里的數據盡量發出去,可以允許部分丟包,問是用TCP好還是UDP好?為什么?
- 一個完整的 HTTP 請求會涉及到哪些協議?
三面
- 問項目
- redis 的 ZSET 是怎么實現的?
- 讓你設計一個限流的系統怎么做? 令牌桶
- 讓你設計一個延時任務系統怎么做 說了兩個方案,一個是使用 redis 的 ZSET 來實現,考慮分片來抗高並發,使用 redis 的持久化來實現落地,使用 redis 的哨兵實現故障轉移。 一個是使用時間輪的方法。
- 現有一個隨機數生成器可以生成0到4的數,現在要讓你用這個隨機數生成器生成0到6的隨機數,要保證生成的數概率均勻。
- 有 N 枚棋子,每個人一次可以拿1到 M 個,誰拿完后棋子的數量為0誰就獲勝。現在有1000顆棋子,每次最多拿8個,A 先拿,那么 A 有必勝的拿法嗎?第一個人拿完后剩余棋子的數量是8的倍數就必勝,否則就必輸。
- 給出一棵二叉樹的根節點,現在有這個二叉樹的部分節點,要求這些節點最近的公共祖先。
四面
HR 面
總結
頭條4輪面試都是視頻面的,視頻面試體驗其實還是挺好的,坐在家里面試我會更加放松一些,這樣腦子也靈活一些。人一緊張腦子就轉不動了。頭條的3輪技術面都問了zset的實現,ZSET的實現可以好好看看源碼怎么實現,這樣說的時候有更多東西可以說,不是說一個跳躍表就完事了。還有一點就是遇到不會的邏輯題或者算法題不要放棄,問問面試官可不可以提示一下。如果能在面試官的慢慢提示下能完成這道題,也是會被認可的。