工程師筆試題解析:從計算機基礎(chǔ)到工程能力)
360公司2016研發(fā)工程師筆試題一能教會現(xiàn)在的你什么2016年秋招那陣子我在一個求職群里看到有人貼出剛考完的360研發(fā)工程師筆試題一評論區(qū)瞬間炸鍋有人喊“選擇題太多了根本做不完”有人抱怨“好幾道C的題每個選項看著都對”還有人直接說“第三道大題我連題意都沒讀懂”。那段時間幾乎每家公司都在校招筆試題五花八門但360這套題給很多人的印象格外深——它不像有些公司只考幾道LeetCode讓你碰運氣而是用大篇幅的客觀題把計算機網(wǎng)絡(luò)、操作系統(tǒng)、C/C內(nèi)存機制、數(shù)據(jù)結(jié)構(gòu)和基礎(chǔ)算法全部掃了一遍然后在最后留幾道需要寫代碼或推理的問題。說白了這套題不是考你會不會刷題而是考你大學(xué)四年有沒有真的搞懂計算機這門學(xué)科。這篇文章想把當(dāng)年這套題背后的考點邏輯、做題策略和對今天求職者的參考價值拆開講清楚。不管你是準(zhǔn)備校招的在校生還是想跳槽的工程師這篇內(nèi)容都會對你有用。我會從卷面結(jié)構(gòu)、模塊考點、答題節(jié)奏、題目風(fēng)格變遷、以及筆試與工程能力的映射關(guān)系幾個角度展開盡量把我自己當(dāng)時備考和后來參與技術(shù)招聘時的經(jīng)驗都放進(jìn)去用最直白的話講清楚這些筆試背后的門道。1. 還原一下當(dāng)年的卷子為什么這套筆試被叫“知識廣度壓力測試”1.1 卷面結(jié)構(gòu)給人的第一印象題量大、模塊雜、沒有廢話360研發(fā)工程師筆試題一不是那種上來就甩兩道編程題的卷子。它更大的比重放在選擇題上覆蓋面特別廣基本是按照“計算機專業(yè)核心課程大綱”出的。很多人拿到卷子后會先翻一遍然后發(fā)現(xiàn)C語言指針、C對象模型、操作系統(tǒng)進(jìn)程調(diào)度、死鎖、TCP三次握手、HTTP狀態(tài)碼、數(shù)據(jù)庫索引、Linux常用命令、概率題、邏輯推理、智力題——全都有。這種結(jié)構(gòu)的潛臺詞是公司不想只招到一個會寫代碼的人它希望候選人有完整的計算機知識體系。2016年這個時間節(jié)點比較特殊。移動互聯(lián)網(wǎng)還在高速增長Android/iOS開發(fā)崗位特別多安全方向又是360的看家本領(lǐng)所以這套筆試題一在研發(fā)崗里其實帶著很強的“基礎(chǔ)能力篩選”屬性。它不以“能不能寫出驚艷的算法”為核心而以“基礎(chǔ)知識是不是扎實”為核心。這種出題思路和當(dāng)時許多大廠類似先用客觀題快速篩掉一批基礎(chǔ)不牢的人再進(jìn)入下一輪技術(shù)面試。從這個角度看那張卷子本質(zhì)上不是難度測試而是廣度測試加細(xì)心測試。另外題目的表述普遍比較干練沒有太多場景包裝。比如一道題就是直接問“以下哪種方式可以避免死鎖”選項給出銀行家算法、資源有序分配法、搶占式調(diào)度等。這種風(fēng)格對基礎(chǔ)扎實的人友好對靠背題突擊的人不友好因為選項里經(jīng)常只有細(xì)微差別背不準(zhǔn)確就會選錯。1.2 安全基因滲透到題目的各個角落360當(dāng)時以安全業(yè)務(wù)聞名這個背景在筆試題一里也有體現(xiàn)。最明顯的地方是網(wǎng)絡(luò)和Linux相關(guān)題目占比不低而且有些題目會往緩沖區(qū)溢出、常見Web漏洞原理、權(quán)限管理等方向靠近。不是所有研發(fā)崗位都做安全產(chǎn)品但公司希望研發(fā)團(tuán)隊對安全有基本敏感度這個思路在筆試中體現(xiàn)得很直接。舉個例子這類卷子中經(jīng)常出現(xiàn)關(guān)于“棧溢出”“堆溢出”的選擇題或者給你一段有問題的字符串處理代碼問它存在什么風(fēng)險。這其實是安全方向的基礎(chǔ)題但用來考研發(fā)工程師也合理——如果一個寫C/C的人不了解內(nèi)存越界會引發(fā)什么后果那上線后很容易埋雷。甚至有些題目會直接考“為什么不能把用戶輸入拼進(jìn)SQL語句”這對所有后端研發(fā)崗位都是底線認(rèn)知。所以說如果你現(xiàn)在要準(zhǔn)備類似的筆試別只埋頭刷LeetCode把網(wǎng)絡(luò)原理、操作系統(tǒng)、數(shù)據(jù)庫基礎(chǔ)、安全常識這些“硬核八股”也認(rèn)真過一遍否則遇到360這種風(fēng)格的卷子會很吃虧。1.3 2016年的技術(shù)語境和今天有什么不同把時間拉回2016年你會發(fā)現(xiàn)幾個背景Stack Overflow年度調(diào)查顯示最流行的語言還是JavaScript、Java、C/CPython在Web開發(fā)和數(shù)據(jù)分析領(lǐng)域已經(jīng)起來了但在很多公司筆試?yán)镞€沒成為默認(rèn)選項云原生和Kubernetes還是新鮮詞容器化遠(yuǎn)沒有今天這么普及移動端原生開發(fā)是香餑餑跨端方案還在萌芽期。因此當(dāng)時的筆試題很少考Docker、K8s、云服務(wù)這些內(nèi)容更不會讓你設(shè)計微服務(wù)架構(gòu)。這道題換成現(xiàn)在的校招標(biāo)準(zhǔn)來看有些考點會顯得“古典”。比如現(xiàn)在很多公司筆試題直接放在在線OJ上純客觀題比例下降而2016年還是線下紙質(zhì)筆試或簡單在線答題的時代選擇題占比高試卷上甚至還要手寫代碼。這種形式上的差異決定了當(dāng)時的復(fù)習(xí)思路更偏向“知識體系完整度”而不是“編程題熟練度”。如果你現(xiàn)在拿這套題練手可能會覺得有些知識沒學(xué)過——這很正常但反過來也說明計算機基礎(chǔ)的核心內(nèi)容十年間變化沒那么大。2. 核心考點模塊拆解每一類題目到底在考什么能力2.1 C/C與內(nèi)存機制不是考語法是考你懂不懂計算機怎么執(zhí)行你的代碼如果在2016年參加360研發(fā)工程師筆試C/C相關(guān)題目基本是跑不掉的。它們會集中在指針、數(shù)組、內(nèi)存布局、構(gòu)造析構(gòu)順序、虛函數(shù)機制、類型轉(zhuǎn)換這些點上。單純背語法過不了這類題因為出題人真正想測的是你對“代碼在內(nèi)存里如何運行”的理解。舉一類典型問題給你一段包含結(jié)構(gòu)體定義、指針運算和強制類型轉(zhuǎn)換的代碼問輸出什么。這種題在紙上推演得先把結(jié)構(gòu)體字段偏移算清楚再考慮系統(tǒng)字節(jié)序最后看printf的格式化參數(shù)是否匹配。如果只是大概知道指針是“存地址的變量”碰到這類題就會卡住。我當(dāng)時復(fù)習(xí)時的經(jīng)驗是把《C專家編程》里關(guān)于數(shù)組和指針的部分反復(fù)讀理解“數(shù)組名在表達(dá)式里會退化為指針”到底意味著什么然后拿編譯器動手驗證每一個不確定的細(xì)節(jié)。C部分則更愛考構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝控制、繼承和虛函數(shù)。有一類經(jīng)典陷阱題是一個基類指針指向派生類對象delete這個指針時如果基類析構(gòu)函數(shù)不是虛函數(shù)會發(fā)生什么答案不是“內(nèi)存泄漏”這么簡單而是未定義行為實際運行可能只調(diào)用基類析構(gòu)函數(shù)派生類資源沒被釋放。筆試?yán)镉龅竭@種題正確率直接反映你有沒有真正理解“運行時多態(tài)”的邊界。還有一個容易被忽略的點位運算和整型提升。這類題在選擇題里出現(xiàn)頻率極高比如問“~0xa5”的值是多少或者判斷一個有符號數(shù)右移的語義。很多非科班同學(xué)或者平時只寫腳本語言的候選人在這些題上會丟很多分。解決方法是刷一遍“位運算面試題合集”把補碼表示、溢出行為、整型提升規(guī)則徹底弄明白這些知識在工作中排查線上問題也經(jīng)常用到。2.2 數(shù)據(jù)結(jié)構(gòu)與經(jīng)典算法準(zhǔn)備重點應(yīng)該是“考得廣”而不是“考得深”2016年的研發(fā)筆試數(shù)據(jù)結(jié)構(gòu)題目的覆蓋面大于深度。選擇題會涉及數(shù)組、鏈表、棧、隊列、二叉樹、圖、哈希表、堆的查找/插入/刪除復(fù)雜度還會考排序算法的穩(wěn)定性、時間/空間復(fù)雜度、何時適用以及一些經(jīng)典算法思想比如動態(tài)規(guī)劃、貪心、分治的適用場景。給我印象最深的是“堆排序建堆時間復(fù)雜度”這道題目它經(jīng)常以選擇題形式出現(xiàn)答案是O(n)而不是O(nlogn)但很多人上來就選錯——因為大家只記得排序過程是O(nlogn)忘了建堆有更緊的界。這說明出題人不是想把大家考倒而是想測你有沒有真正理解數(shù)據(jù)結(jié)構(gòu)背后的性質(zhì)。再比如問“ hash表解決沖突有哪些方法”選項里可能同時出現(xiàn)鏈地址法、開放定址法、再哈希法看起來都對但題干如果強調(diào)“在Java的HashMap中”那么鏈地址法才是正解。這種題要求的不只是背概念還得把概念放到具體工程語境里判斷。編程大題方面這套題一通常不會直接放一道超難算法題更多是考察“能否把問題轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)操作”的能力。2016年那會兒沒有現(xiàn)在這么多在線OJ答題經(jīng)常是手寫偽代碼或者C/Java代碼。手寫代碼有個特點閱卷人看重整體思路和關(guān)鍵邏輯語法小錯誤往往可容忍。如果你在卷面上寫“用遞歸把二叉樹中序遍歷的結(jié)果存進(jìn)數(shù)組”這類題只要遞歸邊界正確、訪問順序?qū)懨靼谆揪湍苣梅?。但如果你連函數(shù)簽名都寫不清楚那閱卷人很難相信你能交付代碼。我的建議是準(zhǔn)備這類筆試時先保證每種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)都能手寫實現(xiàn)一遍鏈表反轉(zhuǎn)、棧的數(shù)組實現(xiàn)、二叉樹的三種遍歷、堆的上浮下沉、哈希表開鏈法然后針對筆試常考算法做歸納排序比較、二分邊界、DFS/BFS、簡單DP不要一上來就刷困難題。這套考試考察的是知識覆蓋率你能覆蓋得越全面分?jǐn)?shù)越穩(wěn)。2.3 操作系統(tǒng)與Linux筆試?yán)锏摹跋到y(tǒng)感”決定了你的上限操作系統(tǒng)在研發(fā)筆試?yán)锏牡匚环浅8?016年尤其如此。選擇題高頻考點包括進(jìn)程和線程的區(qū)別、進(jìn)程狀態(tài)轉(zhuǎn)換、調(diào)度算法、死鎖的四個必要條件與處理方法、虛擬內(nèi)存與分頁、頁面置換算法、中斷與系統(tǒng)調(diào)用、用戶態(tài)與內(nèi)核態(tài)切換等。這些概念看起來繁雜但有一條主線——操作系統(tǒng)是在管理資源所有題目都在問“資源如何分配、如何調(diào)度、如何保護(hù)”。舉個例子關(guān)于“死鎖”的題目選項里經(jīng)常出現(xiàn)“破壞互斥條件”“破壞請求與保持條件”“破壞不可剝奪條件”“破壞循環(huán)等待條件”。這種題不難但你可以進(jìn)一步問自己在實際工程里哪種方式最常用答案是破壞循環(huán)等待比如給資源編號再按序申請。如果筆試?yán)锍隽艘坏馈叭绾伪苊馑梨i”的代碼設(shè)計題你答“按固定順序加鎖”就會比單純背概念的人高一個檔次因為你有工程意識。Linux命令和Shell相關(guān)知識在2016年的研發(fā)筆試?yán)镆舱加幸欢ǚ蓊~。題目會問如何查看進(jìn)程的CPU和內(nèi)存占用如何查看端口被哪個進(jìn)程占用如何統(tǒng)計一個文件的行數(shù)如何查找日志中關(guān)鍵字并去重統(tǒng)計這些題對應(yīng)的是top、ps、netstat、ss、wc、grep、sort、uniq、awk、sed等基礎(chǔ)命令。說實話如果平時開發(fā)不用Linux這些題確實只能靠背。但它們背后的意圖很明確公司希望招進(jìn)來的人能直接連服務(wù)器看日志、查問題而不是連基本的排查命令還要現(xiàn)學(xué)。操作系統(tǒng)和Linux這塊我給一個可執(zhí)行的復(fù)習(xí)方案一邊看《深入理解計算機系統(tǒng)》的虛擬內(nèi)存和異常控制流章節(jié)一邊在虛擬機或云服務(wù)器上把文件、進(jìn)程、網(wǎng)絡(luò)相關(guān)的命令都過一遍。不要只看書因為筆試?yán)镪P(guān)于命令的題目選項會非常具體比如“哪個命令可以實時刷新進(jìn)程狀態(tài)”你沒用過top就很容易混淆成ps。2.4 計算機網(wǎng)絡(luò)背會了圖還得會講“數(shù)據(jù)包的一生”計算機網(wǎng)絡(luò)是另一大塊重點而且360這邊的卷子對網(wǎng)絡(luò)的重視程度更高。選擇題基本涵蓋OSI七層模型和TCP/IP分層、TCP與UDP的區(qū)別、TCP三次握手與四次揮手、TCP擁塞控制慢啟動、擁塞避免、快重傳、快恢復(fù)、HTTP協(xié)議報文結(jié)構(gòu)與狀態(tài)碼含義、DNS解析過程、IP地址與子網(wǎng)劃分、NAT等。這些內(nèi)容沒有太多需要“智商”的地方重點在于記憶的準(zhǔn)確性和理解的深度。很多同學(xué)容易在TCP三次握手上翻車不是不知道有“三次”而是不理解為什么是“三次”。如果題目問“為什么TCP建立連接需要三次握手而不是兩次”你需要回答為了防止已失效的連接請求報文突然又傳到服務(wù)器端從而產(chǎn)生錯誤連接。這個回答必須基于“網(wǎng)絡(luò)報文可能延遲重放”的事實而不是背一句“三次更安全”。筆試題如果以簡答題形式出現(xiàn)閱卷人一眼就能看出你是真懂還是背的。比起純理論我建議你在準(zhǔn)備網(wǎng)絡(luò)筆試時多嘗試用自己的話講一遍“一個數(shù)據(jù)包從瀏覽器輸入URL到頁面渲染完成之間的完整旅程”。這個過程需要你把DNS、HTTP、TCP、IP、ARP、路由、服務(wù)端處理、響應(yīng)返回全部串起來。能把這個流程講清楚的人在這類筆試?yán)飵缀醪粫Х侄颐嬖嚂r也很加分。反過來如果只是零散地記名詞碰到“連接建立后第一次發(fā)送數(shù)據(jù)會被延遲多久”這種結(jié)合TCP_NODELAY的題目——雖然2016年未必考這么細(xì)——你會明顯感覺吃力。2.5 數(shù)據(jù)庫與SQL不寫代碼的筆試怎么考“數(shù)據(jù)能力”數(shù)據(jù)庫題目在研發(fā)工程師筆試?yán)锿ǔ刂圃谝粋€合理的比例但很少缺席。選擇題高頻集中在數(shù)據(jù)庫范式1NF、2NF、3NF、BCNF、事務(wù)的ACID特性、隔離級別、索引類型與B樹、SQL語句優(yōu)化、表連接的區(qū)別INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN等。有些公司會放一道手寫SQL的編程題但360這套筆試題一更多還是客觀題為主。關(guān)于索引有一個高頻選擇題是“為什么數(shù)據(jù)庫索引使用B樹而不是紅黑樹”。答案需要從磁盤IO次數(shù)和范圍查詢兩個角度分析B樹非葉子節(jié)點不存數(shù)據(jù)單節(jié)點能存儲更多索引項樹高更矮磁盤IO更少B樹葉子節(jié)點用鏈表串聯(lián)適合范圍掃描。這道題如果你在筆試?yán)镏淮稹耙驗锽樹更矮”得分不會高如果能在此基礎(chǔ)上說“葉子節(jié)點鏈表對范圍查詢友好而紅黑樹在中序遍歷上表現(xiàn)不如B樹”就有區(qū)分度。SQL練習(xí)題我的建議是把牛客或LeetCode上的SQL簡單/中等題刷一遍。雖然筆試?yán)颯QL題目占比不高但它是少數(shù)可以穩(wěn)定拿分的部分——因為規(guī)則清晰、答案確定。如果你的目標(biāo)崗位是后端研發(fā)SQL能力是必須的如果你做客戶端至少也得懂基本查詢和事務(wù)概念。2016年的題目可能不會考窗口函數(shù)那會兒窗口函數(shù)還不像現(xiàn)在這樣普及但今天準(zhǔn)備筆試的人窗口函數(shù)也值得花時間學(xué)會。3. 做題節(jié)奏與答題策略這套卷子拼的不只是知識還有取舍能力3.1 “三遍做題法”應(yīng)對題量大的試卷面對題量大、覆蓋面廣的筆試試卷絕對不要想著一口氣從頭做到尾。我自己總結(jié)了一個“三遍做題法”在應(yīng)對2016年這種風(fēng)格的筆試時非常有效第一遍快速掃一遍全卷把一眼就能確定答案的題直接做掉。這類題通常是概念型、計算型不需要反復(fù)推敲。做的時候順手在草稿紙上記錄題號和答案避免后面涂卡出錯。這一遍的目標(biāo)是把基本盤穩(wěn)住確保不是因粗心丟分。第二遍集中精力做那些“有思路但需要計算或推理”的題。比如C/C代碼輸出題、網(wǎng)絡(luò)報文分析題、邏輯推理題。這些題花費時間較多但屬于你能力范圍之內(nèi)的是區(qū)分度的來源。第三遍回頭啃那些完全沒思路的題。這時候要運用排除法和選項對比盡量提高猜中概率。千萬不要在第三遍之前就把時間耗在一道不會做的題上。我當(dāng)年吃過虧在一道指針和強制類型轉(zhuǎn)換結(jié)合的選擇題上較勁了十幾分鐘結(jié)果后面有幾道會做的網(wǎng)絡(luò)題沒有時間做。后來我給自己定了一個鐵律——選擇題思考時間超過3分鐘直接跳過最后統(tǒng)一蒙一個概率最高的選項。這個策略不能保證滿分但能保證你拿到所有“應(yīng)得”的分?jǐn)?shù)。3.2 選擇題的排除法不是瞎猜每一個錯誤選項都值得分析高質(zhì)量的筆試題錯誤選項往往比正確選項更值得看。它們要么是常見誤解做出來就是為了“坑”你要么是相近概念用來考驗?zāi)愕谋嫖瞿芰?。比如在C語言題目里選項可能同時出現(xiàn)“在棧上分配”“在堆上分配”“在靜態(tài)存儲區(qū)分配”這三個而代碼里定義了一個全局?jǐn)?shù)組——正確答案顯然是靜態(tài)存儲區(qū)但如果你把“全局”和“堆”搞混就會掉坑。所以我的建議是選擇題不要只滿足于選對平時刷題時要把每個錯誤選項為什么不選寫出來。這個習(xí)慣在考試時能幫你快速識別出題人的“陷阱模式”。舉幾個當(dāng)年常見的陷阱類型概念被加修飾詞變味比如“TCP是可靠的傳輸層協(xié)議”是對的但“TCP保證數(shù)據(jù)包不丟失”也是對的嗎不對TCP可以提供可靠傳輸?shù)坏扔谖锢砩喜粊G包而是通過重傳保證數(shù)據(jù)的最終可靠性。這種修飾詞變化是選擇題最愛考的點。邊界條件被忽略比如排序算法穩(wěn)定性判斷題“選擇排序是不穩(wěn)定的”但有人可能會被“元素相同不交換”誤導(dǎo)。邊界條件沒有分析清楚就選錯了。選項之間互斥有時候兩個選項互為矛盾那么正確選項必為其中之一。比如“進(jìn)程切換一定會發(fā)生用戶態(tài)到內(nèi)核態(tài)的切換”和“進(jìn)程切換不會發(fā)生用戶態(tài)到內(nèi)核態(tài)的切換”這兩個選項前者是對的。利用選項互斥關(guān)系能快速縮小范圍。3.3 編程題的答題姿勢先給思路再寫代碼閱卷體驗很重要2016年的研發(fā)工程師筆試題一通常不會只有選擇題還會帶上手寫編程或算法設(shè)計的大題。這是整張卷子里最考驗輸出能力的地方也是很多平時只做題不看寫法的人容易失分的區(qū)域。核心經(jīng)驗是即使題目只要寫代碼也要先在試卷空白處用一兩句話寫清你的思路再寫代碼。這樣做有幾個好處第一能夠倒逼自己理清邏輯避免邊寫邊想導(dǎo)致代碼混亂第二如果代碼有小錯誤閱卷人看到思路是對的會酌情給分第三在時間緊張的時候?qū)懴滤悸分辽僮C明你掌握了解題方向比留白強太多。寫手寫代碼時字跡工整、變量命名有意義、縮進(jìn)層次清晰這些“看起來不重要”的點其實會影響閱卷人的判斷。我之前參與過幫忙閱卷的活動說實話面對大量試卷結(jié)構(gòu)清晰、注釋得當(dāng)?shù)拇鸢柑烊粫@得更多好感而一團(tuán)亂麻的代碼即使思路對也可能因為讀不懂而被扣分。另外特別注意用熟悉的語言作答。這套筆試題一的時代背景是C/Java為主流如果你平時寫Python而題目要求用C實現(xiàn)鏈表操作還是盡量不要臨時切換。筆試不是為了炫技用最熟練的語言把問題解決才是上策。3.4 草稿紙和狀態(tài)管理這些“軟實力”經(jīng)常被低估線下筆試會發(fā)草稿紙線上筆試也有在線記事本。很多人不重視草稿紙的使用直接在試卷上畫來畫去最后搞得一片混亂。我當(dāng)時的習(xí)慣是把草稿紙分成幾個區(qū)域一個區(qū)域?qū)iT做指針/地址/內(nèi)存布局的計算一個區(qū)域做網(wǎng)絡(luò)報文流的推演一個區(qū)域做大題的思路草稿。這樣檢查的時候我能快速找到當(dāng)初的計算過程重點復(fù)核可能的失誤點。狀態(tài)管理方面筆試時間一般在90到120分鐘之間題量又不小如果連續(xù)做30分鐘高強度的選擇題腦力消耗很快。我的經(jīng)驗是做完一遍選擇題后稍微閉眼休息10秒鐘深呼吸一下再進(jìn)入第二遍。這個簡單的動作對維持判斷力很有幫助。還有做題順序也可以調(diào)整如果你網(wǎng)絡(luò)知識比C好可以考慮先做網(wǎng)絡(luò)部分的題保證優(yōu)勢模塊的分?jǐn)?shù)全部拿到。4. 同一套題放在今天哪些考點“過時”了哪些依然鋒利4.1 被時代淘汰的題目類型從“重語言細(xì)節(jié)”到“重工程素養(yǎng)”如果把2016年的這套題原封不動放到今天的校招里會有些“錯位感”。最具代表性的是C/C細(xì)節(jié)點考查。如今很多研發(fā)崗位默認(rèn)使用Java、Go、Python甚至TypeScript對于C/C內(nèi)存細(xì)節(jié)的要求不像當(dāng)年那么普適即使是C崗位面試也更傾向于通過一個具體場景讓你設(shè)計類或排查問題而不是做一堆“指針類型轉(zhuǎn)換”的選擇題。因此像“指定結(jié)構(gòu)體在32位機器上占用多少字節(jié)”這類計算題在今天的大廠筆試中占比顯著下降。另一個“過時”的點是Linux命令背誦題。不是說Linux不再重要而是現(xiàn)在的技術(shù)棧更復(fù)雜了。今天更常見的考法可能是給你一段Dockerfile或者K8s YAML配置讓你指出問題或者直接考你排查線上問題的思路。這種變化反映的是整個行業(yè)從單體應(yīng)用到云原生的演進(jìn)——基礎(chǔ)命令依然是底層能力但它不再是考核的終點。數(shù)據(jù)庫方面當(dāng)年筆試還停留在“B樹、事務(wù)ACID、SQL基本查詢”的層面而今天后端筆試題已經(jīng)逐漸加入分庫分表、Redis緩存一致性、消息隊列可靠性等分布式系統(tǒng)相關(guān)考點。這種變化不是2016年出題人沒水平而是當(dāng)時分布式技術(shù)還沒大規(guī)模滲透到校招筆試的范疇。4.2 不變的是“計算機系統(tǒng)”的底層心智模型盡管題型和考點在變化但2016年這套題背后想測的底層能力并沒有變甚至更加重要。什么是底層能力就是你對計算機系統(tǒng)的整體理解能力一個程序從源碼到進(jìn)程從內(nèi)存到磁盤從單機到網(wǎng)絡(luò)它的數(shù)據(jù)是怎么流轉(zhuǎn)的資源是怎么被管理的故障是怎么發(fā)生的。這套筆試題一中關(guān)于指針、內(nèi)存、進(jìn)程、TCP、文件系統(tǒng)的題目本質(zhì)上都在考察這個心智模型。今天面試中常見的“設(shè)計一個短鏈系統(tǒng)”“如果線上接口突然超時你怎么排查”“Redis為什么快”等問題表面上是新八股但底層的支撐依然是計算機系統(tǒng)知識。比如接口超時排查你至少需要理解網(wǎng)絡(luò)超時重傳、線程池排隊、數(shù)據(jù)庫連接池耗盡、CPU爭搶、GC停頓等因素這些恰恰是2016年筆試?yán)锬切┎僮飨到y(tǒng)和網(wǎng)絡(luò)選擇題背后的知識。所以說那套題經(jīng)典就經(jīng)典在它搭建了一個基本框架用十年的維度來看框架沒有塌。4.3 現(xiàn)在的刷題方式反而可能丟失了“筆試能力”在LeetCode和各類在線OJ普及的今天很多人的備考方式變成“刷題看題解”。這確實提高了算法題的解題能力但也帶來一個新的問題知識面嚴(yán)重收窄。有些候選人數(shù)據(jù)庫、操作系統(tǒng)、網(wǎng)絡(luò)的知識停留在面試前兩天的背誦狀態(tài)題目稍微變個說法就反映不過來。2016年那種大范圍客觀題的筆試模式雖然看起來“古老”但它逼迫你必須全面復(fù)習(xí)這種廣度訓(xùn)練其實是一種非常有效的系統(tǒng)學(xué)習(xí)方式。所以我的觀點是你現(xiàn)在不該只為了應(yīng)付某種題型去刷題而應(yīng)該把“系統(tǒng)學(xué)習(xí)”放在“應(yīng)試技巧”之前。即使你遇到的筆試全是純編程題掌握了操作系統(tǒng)和網(wǎng)絡(luò)知識也能讓你寫出更健壯的代碼——比如你會知道為什么多線程下需要加鎖為什么網(wǎng)絡(luò)請求要設(shè)置超時為什么數(shù)據(jù)庫查詢要避免全表掃描。這些東西筆試不一定直接考但面試和工作中隨時會遇到。5. 從筆試題到工程能力這套卷子篩出來的人在工作中什么樣5.1 筆試考點與真實工作場景的映射關(guān)系我后來參與過技術(shù)招聘的簡歷篩選和面試再回頭看2016年這套筆試題的考點發(fā)現(xiàn)它跟真實工作有很強的映射關(guān)系。下面列幾個我印象深刻的對應(yīng)關(guān)系選擇題里的“內(nèi)存布局與指針”對應(yīng)的是工作中排查線上崩潰問題。服務(wù)進(jìn)程突然coredump你需要用gdb查看堆棧判斷是空指針解引用、數(shù)組越界還是內(nèi)存碎片問題。大學(xué)期間有沒有學(xué)過內(nèi)存布局決定了你遇到這種問題時是被動重啟服務(wù)還是能快速定位根因?!癟CP三次握手和四次揮手”對應(yīng)的是排查連接異常問題。線上服務(wù)出現(xiàn)大量TIME_WAIT或CLOSE_WAIT連接你需要理解TCP狀態(tài)轉(zhuǎn)換圖才能判斷是客戶端沒關(guān)連接、服務(wù)端沒接收完數(shù)據(jù)還是負(fù)載均衡配置有問題。這個能力不是面試時臨時背的而是對網(wǎng)絡(luò)協(xié)議本質(zhì)的理解?!斑M(jìn)程調(diào)度與死鎖”對應(yīng)的是并發(fā)編程和鎖設(shè)計。研發(fā)工程師寫多線程代碼時如果對死鎖的四個必要條件有本能反應(yīng)寫加鎖代碼時就會自然注意加鎖順序如果只知道“要加鎖”很容易在復(fù)雜業(yè)務(wù)邏輯下留下死鎖隱患?!癇樹索引與事務(wù)隔離級別”對應(yīng)的是數(shù)據(jù)庫線上調(diào)優(yōu)。慢SQL出現(xiàn)時你知道建什么索引、怎么避免鎖沖突、如何調(diào)整隔離級別這些都是筆試知識在工作里的直接延伸。所以如果你現(xiàn)在覺得某些筆試題目“學(xué)了又用不上”不妨換個角度它們不是知識點的終點而是工程判斷力的起點。2016年那個時間點沒有現(xiàn)在這么多中間件和云服務(wù)但計算機體系的底層邏輯到現(xiàn)在依然發(fā)揮著作用。5.2 一道筆試難題對應(yīng)的真實排查案例說一個我記憶里比較有畫面感的例子。某次在業(yè)務(wù)開發(fā)中服務(wù)在高峰期偶爾出現(xiàn)接口超時但不是每一次都失敗。我和同事一開始懷疑是網(wǎng)絡(luò)問題后來發(fā)現(xiàn)每次超時的間隔很有規(guī)律懷疑是否與JVM老年代GC有關(guān)。查看監(jiān)控后發(fā)現(xiàn)GC日志確實顯示老年代回收頻繁。當(dāng)時我們在現(xiàn)場用命令看了堆內(nèi)存、GC線程、對象分布最終定位的是某個全局緩存對象在熱點數(shù)據(jù)訪問時被頻繁更新導(dǎo)致大量對象晉升到老年代。修復(fù)方式很簡單改為局部緩存加異步更新。這個故事和2016年的筆試題有什么聯(lián)系回想那張卷子有道選擇題是“關(guān)于JVM垃圾回收以下哪種說法是正確的”選項涉及新生代、老年代、Minor GC和Full GC。如果當(dāng)初只是把選項背下來可能無法遷移到真實問題中但如果理解了“對象生命周期和內(nèi)存分區(qū)的關(guān)系”你看到GC頻繁時就會本能地想到“是不是有大對象或緩存對象頻繁創(chuàng)建”。筆試考的不是那道題本身而是通過那道題把你引導(dǎo)到正確的思考維度上去。5.3 從“應(yīng)試者”到“出題人視角”反哺自己的知識體系如果你已經(jīng)過了筆試那一關(guān)進(jìn)入日常工程開發(fā)階段我強烈推薦你做一件事時不時站在“出題人”的角度審視自己掌握的知識。比如你可以試著給自己出幾道關(guān)于自己業(yè)務(wù)的筆試題如果一個新同學(xué)來做這個項目我最希望他掌握哪些前置知識用哪些選擇題能快速判斷他有沒有掌握這個習(xí)慣價值很大。它逼著你把隱性經(jīng)驗變成顯性知識把“會做”升級為“會教”。你會開始注意自己每天敲的那些命令為什么有效自己寫的那些SQL為什么走了索引自己部署的服務(wù)為什么能穩(wěn)定運行。2016年那套筆試題所考核的“知識廣度”其實不應(yīng)該在校招結(jié)束就被拋棄而應(yīng)該成為你職業(yè)成長中不斷回望的基礎(chǔ)路線圖。6. 備考這套題的實用路線以“知識體系”而非“題庫數(shù)量”為目標(biāo)6.1 第一步建立知識地圖不要盲目刷題如果你現(xiàn)在想用2016年360研發(fā)工程師筆試題一來訓(xùn)練自己我建議第一步不是立刻做題而是先畫一張知識地圖。把筆試題可能涉及的模塊列出來C/C語言、數(shù)據(jù)結(jié)構(gòu)和算法、操作系統(tǒng)、Linux、計算機網(wǎng)絡(luò)、數(shù)據(jù)庫、安全基礎(chǔ)、邏輯推理。然后針對每個模塊用幾個問題來自測我能不能用簡單的語言講清楚這個概念能不能舉出實際例子能不能說出常見的坑這個自測的過程會直接暴露你的薄弱點。比如你可能數(shù)據(jù)結(jié)構(gòu)掌握得不錯但子網(wǎng)掩碼計算不熟練或者算法題刷得多但一看到http狀態(tài)碼403和404的區(qū)別含糊不清。這時候不要急著補齊所有東西先集中精力突破最薄弱的兩個模塊因為筆試的分?jǐn)?shù)結(jié)構(gòu)是“短板決定下限”只有補上短板你的總分才能穩(wěn)定提升。6.2 第二步高質(zhì)量刷題與復(fù)盤的具體方法刷題不是越多越好質(zhì)量遠(yuǎn)比數(shù)量重要。我建議把兩類題目作為重點一類是歷年校招真題尤其是跟你目標(biāo)公司同城的、同領(lǐng)域的公司筆試題另一類是經(jīng)典教材課后題和考研題中的選擇題部分2016年那套卷子的風(fēng)格和考研408統(tǒng)考有不少重疊這一點很多過來人都深有體會。具體做法是每一道題做完后不要只看正確答案一定要看解析并追問“出題人為什么用這個選項做干擾項”。把每道題涉及的考點和不熟悉的知識點記錄到一個錯題本里每周復(fù)盤一次。這個錯題本不是簡單粘貼題目而是寫下自己的理解比如“我以為A對其實A錯在把無狀態(tài)和不可靠混為一談”。這種“自我對話式”的復(fù)盤效果遠(yuǎn)好于反復(fù)刷題。6.3 第三步考前模擬關(guān)鍵是模擬“時間壓力”筆試和平時刷題最大的區(qū)別是時間壓力和心理壓力。建議在考前一周做幾次完整的模擬找一套真題按正式考試時間來做關(guān)閉手機嚴(yán)格限制答題時間做完后給自己打分。第一次模擬可能會讓你意識到時間不夠用這非常正?!M的意義正是為了讓你在真正考試前體驗這種緊張感并有意識地調(diào)整做題順序和時間分配。我當(dāng)時模擬時發(fā)現(xiàn)自己在指針計算題上花費過多時間導(dǎo)致后面的數(shù)據(jù)庫題沒時間細(xì)想。后來我調(diào)整策略把指針計算題統(tǒng)一留到第二輪再做先保證網(wǎng)絡(luò)、數(shù)據(jù)庫這些相對熟悉的知識點拿分。這個策略在正式考試中幫了我大忙。6.4 筆試只是起點拿到面試機會后要做什么筆試通過后緊接著就是技術(shù)面試。很多人在準(zhǔn)備筆試時只盯著“怎么過筆試”忘了筆試刷題時的知識積累可以直接變成面試素材。比如你說“我了解TCP的擁塞控制”面試官讓你詳細(xì)講講慢啟動和擁塞避免的區(qū)別如果你只是在筆試?yán)镞x了正確的選項沒有真正理解很可能回答得支支吾吾。我的建議是筆試備考期間每復(fù)習(xí)一個知識點順手給自己列一個“如果面試被問到我該怎樣展開講講”的提綱。比如復(fù)習(xí)到B樹索引提綱可以是B樹結(jié)構(gòu)特點、為什么適合磁盤存儲、與紅黑樹的對比、聯(lián)合索引和最左前綴原則、覆蓋索引和回表。當(dāng)你能夠自然地把這些內(nèi)容講成一段有邏輯的話筆試和面試就形成了一個完整的閉環(huán)。寫在最后當(dāng)年那套卷子最珍貴的產(chǎn)出不是分?jǐn)?shù)2016年那場360研發(fā)工程師筆試題一如今或許已經(jīng)變成網(wǎng)盤里的一份舊PDF但對每一個認(rèn)真準(zhǔn)備過、認(rèn)真做完、認(rèn)真復(fù)盤過的人來說它的價值遠(yuǎn)超過一張成績單。它像一次計算機基礎(chǔ)知識的“全面體檢”幫你看到自己在龐大的知識體系里哪些地方有優(yōu)勢、哪些地方有漏洞。我到現(xiàn)在還記得考完那套題后我花了一整個星期把C對象模型和TCP狀態(tài)圖重新啃了一遍那種“查漏補缺”的充實感比接到面試通知還讓人踏實。如果你現(xiàn)在正在準(zhǔn)備筆試不管是不是360的題我都建議你別太迷信“押題”和“題庫”而是回到知識的源頭把每一個基礎(chǔ)概念落到實處。筆試題會變出題風(fēng)格會變但計算機科學(xué)的核心邏輯一直是穩(wěn)定的。把底層框架打牢無論考什么、做什么你都不會慌。