跳至主要內容
SHAO MEDIA

三十分鐘被追問,二十分鐘反過來提問:開心消消樂後端的一面,是一場被排好節奏的對話

從牛客網一則樂元素開心消消樂後端一面的面經看起,觀察一場偏項目深挖的技術面試如何在追問順序、知識盲區與雙向提問之間被寫成一份可流傳的敘事。

科技 設計評論 約 6 分鐘
本章章節
  1. 一個「學員下課預警」,被翻了十幾層
  2. ZSet、List 與 BRPOP:一條延遲隊列的三段分工
  3. ES 那一題,輸在了「快」這個字上
  4. WatchDog 與排行榜:面試官也在給答案
  5. 面經作為一種介面,誠實是它的排版

先把畫面拉近一點。牛客網上流傳的一則面經,標題寫得像一份規格說明:樂元素、開心消消樂、後端一面、27 屆、約 50 分鐘。發帖人自己補了一句註腳,「面試官面了我 30 分鐘,我面了他 20 分鐘(開玩笑的,但我確實問了面試官很多)」。一場技術面試的時間被切成兩個數字,而這兩個數字的比例,幾乎決定了整篇面經讀起來的口吻:放鬆、具體、帶一點自嘲。

這種被寫成清單的面經,我們看過不少。得物的後端一面被排成十二道問號的清單,攜程支付的前端一面把 React 題組排出了深挖的節奏。這一份的不同之處在於,它幾乎沒有清單感。追問是一條線,從簡歷上的一個點一路往下走,走到哪裡斷了,讀者就看見哪裡是發帖人的知識邊界。面試在這裡被寫成了一種有地形的地圖,而非一份扁平的題單。

一個「學員下課預警」,被翻了十幾層

整場面試的入口很小。發帖人做了智慧駕培中控系統的後端,負責學員、課程、車機與預警。面試官從簡歷裡挑出「學員下課預警」這一個功能,然後開始剝洋蔥:業務場景是什麼,為什麼要同步課程預約數據,數據從哪裡到哪裡,是數據庫直接同步還是走接口,定時任務怎麼做,一天大概多少數據。這還只是第一層。

再往下,問題變得更碎也更誠實:取消預約怎麼處理,怎麼判斷是不是最後一節連續課程,跨天課程怎麼辦,Redis 快照是什麼意思,前端怎麼拿到預警,是服務端推送還是輪詢,輪詢間隔多久,會不會有高併發問題。發帖人自己下了判語:面試官重視的是「你是不是真的做過」。

這句話是整份面經的核心。判斷一個人是否真的做過某件事,靠的往往不是他答出了什麼標準答案,而是他能不能接住那些沒有標準答案的細節。跨天課程、取消預約、輪詢頻率,這些問題沒有任何一條出現在哪本八股合集裡,它們只存在於真實系統的真實麻煩裡。追問的設計本身,就是一種篩選機制。

ZSet、List 與 BRPOP:一條延遲隊列的三段分工

第二個被深挖的點是發帖人自研的延遲任務隊列。架構被他自己寫成了一條箭頭鏈:MySQL 持久化任務,Redis ZSet 按時間戳排序,到期任務遷移到 Redis List,再由消費者消費。這條鏈每一節都被面試官敲過:為什麼不用 ZSet 直接做完整的延遲隊列,為什麼還要加 List,MySQL 在這裡做什麼,Redis 重啟後任務怎麼辦。

最鋒利的一問落在消費端:用 RPOP 還是 BRPOP,List 沒數據時是不斷輪詢還是阻塞等待,兩種方式的區別是什麼。發帖人坦白,BRPOP 是他的明顯知識盲區。這個坦白在面經裡很珍貴,因為它標出了設計與理解之間的縫隙:一個人可以畫出一條漂亮的架構鏈,卻在鏈條最末端的消費指令上停住。延遲隊列的設計他不缺,缺的是阻塞式消費這個具體到指令級的知識點。

還有一個更實際的反問:「既然項目都已經用了 Kafka,為什麼延遲隊列還要自己用 Redis List 做?」發帖人的回答是為了實踐一套自己的設計,且 MySQL 才是最終持久化來源,Redis 並非唯一數據源。這個回答不一定滿分,但它展示了一種值得注意的答題姿態:不迴避動機,也不假裝技術決策沒有私心。

ES 那一題,輸在了「快」這個字上

Elasticsearch 的段落是整份面經裡最明顯的失分點。發帖人回答文章查詢直接查 MySQL 成本高,所以同步到 ES。面試官追了一句:MySQL 查詢也不一定比 ES 慢,ES 到底用了什麼 MySQL 沒有的能力?

他當場沒答好,事後復盤才寫出正確方向:倒排索引、全文檢索、分詞、相關性評分、多字段文本搜尋。這個復盤動作本身就值得一提。面經在這裡從「記錄被問了什麼」變成了「重新回答一次」,同一個問題在文章裡出現了兩個版本的答案,一個是現場的、含糊的,一個是事後的、清楚的。兩個版本之間的落差,就是這份面經最誠實的部分。

這一題的結構也值得拆。面試官沒有問「ES 是什麼」,而是先接受了一個常見的錯誤前提(ES 等於快),再把這個前提拆掉。好的追問常常是這樣運作的:不否定你的答案,而是把你的答案推到它撐不住的地方。

WatchDog 與排行榜:面試官也在給答案

後段的兩個題組顯示了這場面試的另一個特徵:面試官會給出自己的觀點。分布式鎖的段落裡,發帖人提了 SETNX 和 Redisson WatchDog,被問到續期機制、TTL 設置,以及「成千上萬個任務都用 WatchDog 是否合理」。面試官隨後給出了一個立場:高併發大量任務下,未必所有場景都適合持續 WatchDog 檢測,可以依業務耗時預估合理 TTL,執行過程中再主動判斷是否續期。發帖人寫道,這個角度以前沒考慮過。

這段交換打破了「面試官提問、候選人作答」的單向介面。當面試官開始輸出觀點,面試就從考試變成了技術討論,而發帖人在開頭說的那句「我面了他 20 分鐘」,也就有了著落。開頭那個 30 比 20 的時間分配,原來在正文裡處處有回聲:Redis 段落的追問、Kafka 順序消費的追問(同業務 key 進同一 Partition、Consumer Group 內一個 Partition 同一時刻只分配給一個 Consumer,這部分他答得不錯)、到 WatchDog 段落的雙向討論,對話的比重是逐步移動的。

最後的 ZSet 排行榜題組被截斷在「兩個 member 的 sco…」,原文到此為止。這個未完成的句子,恰好是這份面經的最後一個畫面。

面經作為一種介面,誠實是它的排版

把這份面經當成一件被寫出來的物件看,它的排版邏輯其實很清楚:按面試時間順序推進,每個題組先給架構、再給追問、最後標注自己的盲區與失分點。它沒有把面試整理成「高頻考點彙總」,而是保留了一次對話的行進感,包括哪裡答得好、哪裡沒答上、哪裡是事後才想明白的。

這種寫法的前提,是發帖人願意把弱點也寫進去。BRPOP 不熟、ES 沒答好、WatchDog 的角度沒想過,三個盲區被明明白白留在文中,配上「下來好好補一下」的結語。相比那些只羅列題目、隱去成敗的面經,這一份提供了更完整的資訊:它告訴讀者一場好面試的追問長什麼樣子,也告訴讀者一個 27 屆候選人的知識邊界落在哪裡。

一家做休閒遊戲的公司,用一場偏項目深挖的後端面試來篩人,這件事本身沒有戲劇性。有看頭的是那條追問的路徑:從一個預警功能出發,穿過同步、隊列、消息、搜尋、鎖與排行榜,最後停在半個被截斷的問題上。五十分鐘的對話被寫成一篇可流傳的文章,靠的不是題目的完整性,而是追問的連續性。這大概是所有好面經共通的設計原則:清單會過期,追問的路徑不會。

主題 介面與互動設計、視覺敘事

標籤 #樂元素面經、#牛客網、#介面與互動設計

相關報導