后端校招第四批復盤:核心考點與備戰(zhàn)指南)
2018年秋招那陣字節(jié)跳動后端崗的筆試和面試被不少同學當成國內大廠后端考題的風向標。我當時幫學弟系統(tǒng)整理過一套后端校招的復盤筆記恰好覆蓋到第四批。四年多以后回看這批題仍然覺得很有代表性算法題不算難到離譜但基礎題覆蓋面極廣技術面試又特別喜歡沿著一條問題鏈層層追問。這篇文章就把我當時整理的考點、踩坑點、答題思路以及如果放到現(xiàn)在重新準備一次我會怎么學一并寫出來希望對正在準備后端校招的同學有實際幫助。1. 2018年第四批后端校招為什么這一輪值得拿出來復盤1.1 招聘節(jié)奏與批次背后隱藏的信息字節(jié)跳動的校招后端方向在2018年分了多批進行第四批大致處在秋招中后期。很多人以為批次越靠后崗位越少、難度越低實際情況恰恰相反第四批和后面的批次反而容易出難題和偏題因為前期已經(jīng)篩掉了一大批人出題團隊有更大空間去做“區(qū)分度測試”。這批筆試投遞鏈路大概是官網(wǎng)投遞簡歷、在線筆試、三輪技術面試加一輪HR面試。我身邊的樣本里筆試環(huán)節(jié)會刷掉六七成候選人能進入面試的基本都是算法基礎比較扎實、計算機基礎沒有明顯短板的同學。也正因為如此第四批的面試官普遍默認你已經(jīng)具備了基本的編程能力不會在簡單題上放水而是直接把問題往底層原理和工程場景兩個方向深挖。1.2 這一批筆試面試的整體風格復盤下來第四批后端方向的筆試題有非常明顯的三個特征。第一重基礎、輕框架。筆試里不會直接考Spring Boot怎么用、MyBatis的XML怎么寫而是考Java基礎、操作系統(tǒng)、網(wǎng)絡、數(shù)據(jù)庫原理這些“八股”背后的理解深度??蚣芸梢酝粨舻A原理短期補不上來這是面試官最想篩掉的一類人。第二算法題以經(jīng)典題型為主但邊界條件摳得很細。筆試兩道編程題難度大約對標LeetCode Medium偏簡單但如果你平時只刷題、不care代碼規(guī)范很容易在空指針、數(shù)組越界、大數(shù)溢出這類細節(jié)上翻車。第三技術面試喜歡“連環(huán)追問”。一個問題不會止步于“你知不知道”而是會順著你的回答一直往下問直到問到你不會為止。比如你說知道HashMap那面試官就會追問JDK 7和JDK 8的底層結構差異、擴容時鏈表插入順序、為什么線程不安全、ConcurrentHashMap是怎么優(yōu)化的。這種問法考察的是你知識的深度和邊界感。2. 筆試環(huán)節(jié)的兩個大坑編程題思路和基礎選擇題的邊界2.1 編程題的高頻類型與應對策略第四批筆試的算法題從當時參與過的同學復盤來看主要集中在四個方向字符串處理、數(shù)組與鏈表操作、DFS/BFS搜索、簡單動態(tài)規(guī)劃。沒有特別偏門的計算幾何、數(shù)論或復雜圖論這也就意味著只要你有針對性地刷過劍指Offer和LeetCode Hot 100筆試編程題是能拿到不錯分數(shù)的。拿一類出現(xiàn)頻率很高的題型舉例最長無重復字符子串。這類題在LeetCode上是Medium難度暴力的做法是兩層循環(huán)枚舉所有子串再判斷每個子串內部是否有重復字符時間復雜度是O(n^3)在筆試環(huán)境下非常容易超時。比較標準的做法是用滑動窗口加哈希表右指針不斷右移擴張窗口左指針在發(fā)現(xiàn)重復字符時跳到上一次出現(xiàn)位置的下一個位置這樣整體復雜度只有O(n)。我建議你在筆試前把這類“看似是字符串題實際上是雙指針題”的題目整理成一份清單重點練滑動窗口、雙指針、前綴和三種思路。因為字節(jié)筆試的判題環(huán)境比較嚴格不會給部分分如果暴力寫法超時整道題就是零分。平時練習時每道題做完之后至少再想一遍“最壞情況是什么、有沒有更優(yōu)解法”這會比單純刷題量大要有效得多。2.2 基礎選擇題里最容易翻車的四個知識模塊筆試不光有算法題還有一批基礎選擇/填空題。這些題單看每個知識點都不算難但它們經(jīng)常組合起來考一不留神就掉坑。我根據(jù)當時的復盤把翻車率最高的四個模塊列在下面。Java基礎值傳遞與引用傳遞、String不可變性、equals和hashCode的契約關系、ArrayList和LinkedList的適用場景。操作系統(tǒng)進程與線程的區(qū)別、死鎖的四個必要條件、虛擬內存與分頁、上下文切換開銷。網(wǎng)絡TCP三次握手與四次揮手、TIME_WAIT狀態(tài)的作用、TCP與UDP的區(qū)別、HTTP與HTTPS的握手過程。數(shù)據(jù)庫MySQL索引底層為什么用B樹、事務的ACID特性、四種隔離級別分別解決什么問題。很多同學會忽略操作系統(tǒng)這個模塊覺得后端開發(fā)用不上。但實際上字節(jié)這類重視基礎的公司校招筆試里操作系統(tǒng)題目占比不低。你至少要能解釋清楚為什么線程切換比進程切換開銷小死鎖產(chǎn)生的必要條件是哪四個虛擬內存解決了什么問題如果你現(xiàn)在時間緊迫我建議優(yōu)先把網(wǎng)絡和數(shù)據(jù)庫兩塊吃透這兩部分在筆試和面試中出現(xiàn)的頻率最高而且它們和生活直覺比較接近容易快速上手。操作系統(tǒng)可以放到第二優(yōu)先級Java基礎則是必須達到“張口就能說清楚”的程度。提示筆試時遇到不會的選擇題不要慌。大多數(shù)基礎選擇題的選項之間有明顯層級關系比如“進程是資源分配的基本單位線程是CPU調度的基本單位”如果你記住這些關鍵定義很多題都可以排除兩個以上錯誤選項。3. 技術面試的三種追問鏈并發(fā)、緩存、系統(tǒng)設計都是連環(huán)炮3.1 從HashMap到ConcurrentHashMap并發(fā)基礎怎么準備才不會被追問打穿第四批后端方向的面試第一輪技術面往往從一個非?!叭粘!钡膯栴}開始HashMap的實現(xiàn)原理是什么如果只聽你回答“底層是數(shù)組加鏈表”面試官會繼續(xù)追問直到把你問到墻角為止。我梳理了一條當時出現(xiàn)頻率很高的問題鏈。HashMap底層數(shù)據(jù)結構是什么JDK 7和JDK 8分別是什么結構為什么JDK 8要把鏈表轉成紅黑樹閾值為什么是8HashMap的擴容機制是怎么樣的擴容時元素的索引如何重新計算HashMap為什么線程不安全put操作并發(fā)時會出什么問題ConcurrentHashMap是怎么解決線程安全問題的JDK 8里的實現(xiàn)和JDK 7有什么不同分段鎖和CAS加synchronized各自適合什么場景如果你只是背了結論沒理解設計動機很可能會在“閾值為什么是8”這個問題上卡住。其實這個數(shù)字來自泊松分布的統(tǒng)計結果在隨機哈希碼的情況下鏈表節(jié)點數(shù)達到8的概率已經(jīng)非常低約為一千萬分之六所以用8作為鏈表和紅黑樹的轉換閾值是為了在時間和空間上取得平衡。準備這類問題時我的方法是畫一張“問題鏈地圖”把每個核心知識點寫成節(jié)點用箭頭連接“為什么會問到下一個問題”。比如HashMap為什么線程不安全自然引出ConcurrentHashMap而ConcurrentHashMap的實現(xiàn)又引出了鎖粒度和CAS的概念。面試前按著地圖自己給自己講一遍錄音回聽你會發(fā)現(xiàn)很多地方其實講不清楚這些講不清楚的地方就是查漏補缺的重點。3.2 Redis緩存穿透、擊穿、雪崩區(qū)分概念只是第一步第二三輪面試中緩存幾乎是必考話題。面試官通常會拋出一個業(yè)務場景讓你設計緩存方案然后順勢考察你對Redis的理解深度。2018年第四批后端面試中Redis相關問題出現(xiàn)得尤其多可能是當時的業(yè)務量增長對緩存依賴越來越重的映射。絕大多數(shù)同學都能說出緩存穿透、緩存擊穿、緩存雪崩的定義但面試官真正想聽的是你如何應對以及為什么這樣應對。緩存穿透查詢一個不存在的key請求直接打到數(shù)據(jù)庫。應對方案是緩存空值或者用布隆過濾器在緩存層前置判斷。需要注意緩存空值的過期時間不能太長不然大量不存在的key會占滿內存。緩存擊穿一個熱點key在緩存過期瞬間大量請求同時打到數(shù)據(jù)庫。應對方案是互斥鎖或者把熱點key的過期時間設置得更長甚至設置為永不過期由后臺任務主動更新。緩存雪崩大量key同時過期或者Redis實例宕機導致請求全部打到數(shù)據(jù)庫。應對方案是給過期時間加隨機因子做集群部署還可以在應用層做熔斷限流保護數(shù)據(jù)庫。我見過不少候選人能背出這幾個概念但當面試官追問“布隆過濾器誤判怎么辦”或者“互斥鎖加在哪個層面”時就開始支支吾吾。所以準備時不要只背名詞要默認自己是一個架構師正在設計一個線上系統(tǒng)??梢宰约簡栕约喝绻悸∵^濾器判斷key不存在但實際存在會發(fā)生什么如果互斥鎖等待時間過長如何降級3.3 系統(tǒng)設計題從秒殺場景看面試官真正想考察什么第四批面試中系統(tǒng)設計題通常是壓軸的。常見題目有設計一個短鏈系統(tǒng)、設計一個排行榜、設計一個秒殺系統(tǒng)。這些題目沒有標準答案面試官考察的是三個能力需求拆解能力、技術選型能力和邊界權衡能力。以秒殺系統(tǒng)為例一個典型的回答思路是首先明確核心訴求瞬時流量巨大但真正成功下單的請求占比很低。因此系統(tǒng)設計的目標是“擋住大部分流量而不是讓所有請求都走到最后一步”。然后拆解技術方案前端層通過按鈕置灰、答題驗證碼等方式攔截人工重復提交。網(wǎng)關層基于令牌桶算法做限流超出的請求直接返回“已搶完”。緩存層把商品庫存提前加載到Redis用Lua腳本保證扣庫存的原子性。消息隊列下單請求先寫入MQ由消費者異步處理訂單削峰填谷。數(shù)據(jù)庫層最終一致性保證庫存扣減和訂單生成可以不在同一事務里。這個方案的每一步都會引出追問。比如面試官可能會問Redis扣庫存時如果服務宕機了怎么辦MQ消費失敗如何保證訂單不丟這時候你要能說出持久化策略、ACK機制和重試冪等這些概念。整體來看系統(tǒng)設計題不需要你有真實的大廠高并發(fā)經(jīng)驗但需要你具備“分層設計”的思維知道每一層該干什么、會出什么錯、怎么兜底。4. 簡歷里的技能棧取舍前后端分離、框架和“數(shù)字后端”的迷惑項4.1 項目經(jīng)驗怎么寫框架會寫和能講清楚是兩回事從當年的簡歷來看很多同學都會寫“熟悉Spring Boot”“了解Vue前后端分離開發(fā)”這些技能在熱詞里也頻繁出現(xiàn)。但面試官對這類表述其實已經(jīng)免疫了。他們真正關心的是你在項目里實際做了什么解決了什么問題有沒有遇到過難點。我當時幫學弟改簡歷時最常給的建議是不要寫流水賬而要寫“動詞加結果”。比如“使用Spring Boot開發(fā)RESTful API實現(xiàn)了用戶登錄和權限校驗功能”就太普通了可以改成“基于Spring Security實現(xiàn)JWT無狀態(tài)鑒權解決分布式場景下Session共享問題接口平均響應時間降低約XX%”。哪怕數(shù)據(jù)是自己壓測出來的也比空泛的“熟悉”要有說服力。如果你簡歷里寫了前后端分離項目面試官很大概率會問前后端如何交互跨域問題是怎么解決的登錄狀態(tài)是怎么保持的這些問題的答案其實并不復雜無非是HTTP協(xié)議、JSON格式、CORS、Token這些概念。你只要做過真實項目并且復盤過代碼基本都能答上來。怕就怕只用了框架生成器自己沒有梳理過請求從前端到后端的完整鏈路。4.2 容易被名字誤導的方向軟件后端 vs 數(shù)字后端熱詞里出現(xiàn)了不少“數(shù)字后端”“芯片后端”“Innovus數(shù)字后端”這樣的詞這里專門提醒一下這類崗位在芯片設計流程里指的是布局布線、時序收斂、物理驗證這些環(huán)節(jié)和互聯(lián)網(wǎng)公司的后端開發(fā)服務端開發(fā)完全是兩個方向使用的工具鏈也完全不同。每年都有同學因為沒仔細區(qū)分投錯了崗位等到面試時才發(fā)現(xiàn)面試官問的問題自己完全沒準備過。所以投遞簡歷前一定要仔細看崗位描述里的技術棧關鍵詞如果出現(xiàn)Spring、Redis、MySQL、分布式這些就是軟件后端如果出現(xiàn)Verilog、布局布線、時序約束、Innovus、Virtuoso這些就是芯片后端。求職方向不要跑偏準備也要跟著崗位走。4.3 工程化技能點到為止Jenkins、Maven和Node.js的正確打開方式2018年的校招候選人普遍在工程化工具上比較薄弱。大多數(shù)人只會在IDE里點擊運行沒有命令行打包、部署的經(jīng)驗。我當時在簡歷里看到“熟悉Maven”的人不少但被問到“Maven的生命周期有哪些階段”就答不上來。其實這個問題不難哪怕沒有系統(tǒng)學過只要用Maven打包過幾次項目就能說出validate、compile、test、package、install、deploy這幾個主要階段。對于Jenkins這類CI/CD工具我的建議是不需要精通但至少要有一個“會搭一條最簡單的流水線”的經(jīng)驗。你用Maven構建一個Spring Boot項目然后通過Jenkins拉取代碼、執(zhí)行構建、部署到服務器這一套流程跑通就足夠在簡歷里寫“了解持續(xù)集成基本流程”。Node.js的情況也類似如果你在后端項目里用過npm管理依賴寫過簡單的Node.js服務完全可以寫進簡歷但要誠實地標明“了解”而不是“精通”。5. 如果讓我重新準備一次基于第四批考點整理的學習路線5.1 按模塊拆解的時間規(guī)劃表如果你現(xiàn)在距離校招還有3到4個月可以參考我整理的這條路線。它并不復雜但每一步都需要產(chǎn)出“可展示的成果”。時間段核心內容復習目標與產(chǎn)出第1-2周Java基礎理解String、集合、異常、IO、反射能畫出ArrayList和HashMap的底層結構圖第3-4周并發(fā)編程掌握synchronized、volatile、Lock、AQS、并發(fā)容器能畫出線程狀態(tài)轉換圖第5-6周計算機網(wǎng)絡與OS默寫TCP三次握手四次揮手能解釋TIME_WAIT掌握進程線程、死鎖、虛擬內存第7-8周MySQL與Redis能解釋索引為什么用B樹掌握事務隔離級別能描述緩存穿透/擊穿/雪崩解決方案第9-10周框架與項目完成一個高質量后端項目使用Spring Boot、RESTful API、JWT鑒權、Redis緩存第11-12周模擬面試與刷題LeetCode專題刷題數(shù)組、鏈表、字符串、樹、DP每天對著鏡子/錄音復述原理這個表格不是死規(guī)定但整體邏輯遵循“先語言、后系統(tǒng)、再數(shù)據(jù)庫、最后項目”的順序。有一個常見錯誤是很多同學一開始就撲在Spring Boot上結果問到底層原理時暴露得很快。框架可以讓你簡歷好看但真正讓你通過面試的是計算機基礎。5.2 刷題到底刷多少、刷什么關于算法刷題第四批筆試給我們的啟示是與其追求刷題量不如追求“每道題都能講清楚思路”。我當時給學弟的標準是劍指Offer的五十多道題每道至少二刷LeetCode Hot 100至少一刷熱門專題數(shù)組、鏈表、字符串、二叉樹、動態(tài)規(guī)劃的正確率要穩(wěn)定在七成以上。刷題時養(yǎng)成一個習慣每道題做完用幾句話總結它的核心思路。比如“這道題用了雙指針因為數(shù)組有序”“這道題用了動態(tài)規(guī)劃狀態(tài)轉移方程是XXXX”??偨Y得清楚說明你真的理解了。面試官手寫算法題時其實更看重你的解題流程先確認題意、再討論思路、最后寫代碼。很多人一上來就悶頭寫寫到最后發(fā)現(xiàn)思路不對反而印象更差。5.3 表達訓練原理講得清楚比背得熟更重要我見過不少簡歷很漂亮的候選人卻被一場面試打回原形原因只有一個會做不會說。比如你問他進程和線程的區(qū)別他說“進程是資源分配的基本單位線程是CPU調度的基本單位”然后就沒了。這其實只能算“知道”不算“理解”。更好的表達方式是加入類比和場景。我會這樣講進程就像一家餐廳有自己的廚房、餐桌和倉庫線程就像餐廳里的服務員他們共享這些資源但各自負責不同的客人。如果兩個服務員同時改一張訂單就可能產(chǎn)生數(shù)據(jù)不一致的問題所以需要加鎖。這種表達方式更容易讓面試官相信你真正理解了概念而不只是背了定義。練習方法是每周挑3個知識點用“是什么、為什么、怎么做”三段式給自己講一遍有條件的話找個一起準備秋招的同學互相提問。當你發(fā)現(xiàn)自己已經(jīng)能把并發(fā)、緩存、事務這些話題講得順暢而不打磕巴時面試的把握就會大很多。6. 最后聊點實在的這批面試題給我的三點啟發(fā)面試結束后的復盤比面試本身更重要。我當年見過不少同學面完就覺得自己“掛了”不愿意去回想題目和答案這其實非常可惜。第四批這批題目給我最大的啟發(fā)是后端面試并不會追問所有細枝末節(jié)它只會在幾個核心知識樹上不斷加深所以與其追求知識的廣度不如在關鍵知識點上挖得足夠深。第一點啟發(fā)是原理永遠比API重要。你會用Redis的set命令不算本事能解釋清楚Redis為什么快、單線程模型解決了什么問題、持久化怎么保證不丟數(shù)據(jù)才是面試官真正想聽的。第二點啟發(fā)是項目經(jīng)驗的關鍵是“真實”。哪怕你只是做了一個課程設計級別的項目只要你把每一步都吃透了面試官其實能感受到。最怕的是簡歷上寫了五六個項目面試官稍一追問就露餡。第三點啟發(fā)是面試中的溝通能力是可以練習的。面試不僅是考試也是交流你講得清楚、問得主動面試官對你的印象分就會高很多。如果你正在準備后端校招把這篇文章里的考點清單當成一面鏡子對著查漏補缺。不用焦慮自己還有多少沒看按著知識模塊一個一個啃每天能講清楚一個核心知識點三個月后的你會比現(xiàn)在強非常多。祝順利。