網(wǎng)軟件工程師筆試復(fù)盤:基礎(chǔ)能力與場(chǎng)景結(jié)合)
前兩天整理移動(dòng)硬盤翻到了當(dāng)年參加小鵬汽車2019春招車聯(lián)網(wǎng)軟件工程師筆試時(shí)留下的復(fù)盤文檔。那會(huì)兒正值春招補(bǔ)錄崗位掛靠在互聯(lián)網(wǎng)中心名字叫“車聯(lián)網(wǎng)軟件工程師”但看了筆試內(nèi)容就會(huì)發(fā)現(xiàn)它既沒(méi)有去考CAN總線解析也沒(méi)有考高精地圖和SLAM更多還是集中在軟件工程師的基本盤上。今天把這份筆試題的考察邏輯重新捋一遍也是給正在準(zhǔn)備車企軟件崗面試的朋友一個(gè)參考車聯(lián)網(wǎng)方向筆試題并不是什么“玄學(xué)”所有題目都指向同一個(gè)問(wèn)題——你能不能在一個(gè)資源不算寬裕的車載環(huán)境里寫出穩(wěn)定、可維護(hù)、能上線的軟件。這份筆試如果落在今天來(lái)看題型其實(shí)不算特別新穎C/C、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、算法編程一圈下來(lái)看起來(lái)和互聯(lián)網(wǎng)后端校招差別不大。但仔細(xì)做進(jìn)去會(huì)發(fā)現(xiàn)它選的知識(shí)點(diǎn)非??酥破蚯度胧綀?chǎng)景和通信場(chǎng)景的交叉地帶。這也提醒我們準(zhǔn)備車聯(lián)網(wǎng)軟件工程師不只是刷LeetCode還要把Linux、網(wǎng)絡(luò)協(xié)議、系統(tǒng)資源這些“傳統(tǒng)地盤”撿起來(lái)。文章后面我會(huì)按當(dāng)年筆試涉及的知識(shí)塊逐一展開也會(huì)把我重做了一遍后想明白的細(xì)節(jié)寫出來(lái)。1. 互聯(lián)網(wǎng)中心招的“車聯(lián)網(wǎng)軟件工程師”和嵌入式開發(fā)有什么不同1.1 同一個(gè)“車聯(lián)網(wǎng)”標(biāo)簽不同崗位的權(quán)重差別很大很多人在投“車聯(lián)網(wǎng)軟件工程師”時(shí)會(huì)下意識(shí)把它等同于嵌入式軟件開發(fā)。實(shí)際上車企的軟件崗位分得很細(xì)車聯(lián)網(wǎng)方向也存在明顯的業(yè)務(wù)邊界。以當(dāng)年小鵬汽車互聯(lián)網(wǎng)中心掛出的崗位來(lái)說(shuō)它要解決的更多是“車端如何和云端互通”“用戶如何通過(guò)手機(jī)與車輛交互”“車輛運(yùn)行數(shù)據(jù)如何穩(wěn)定上報(bào)”這些問(wèn)題。換句話說(shuō)這個(gè)崗位處在傳統(tǒng)汽車電子和移動(dòng)互聯(lián)網(wǎng)的交叉點(diǎn)上。這種定位直接影響了筆試選題。純嵌入式崗位大概率會(huì)考寄存器配置、中斷處理、I2C/SPI時(shí)序甚至讓你分析某塊SoC的啟動(dòng)流程而互聯(lián)網(wǎng)中心的車聯(lián)網(wǎng)軟件工程師崗位更關(guān)心你能不能寫對(duì)網(wǎng)絡(luò)通信模塊、能不能處理并發(fā)上報(bào)、能不能在Linux環(huán)境下定位一個(gè)崩潰問(wèn)題。所以筆試?yán)锍霈F(xiàn)大量C/C和Linux基礎(chǔ)但很少出現(xiàn)芯片級(jí)驅(qū)動(dòng)題目也就不奇怪了。1.2 從崗位能力畫像反推筆試的底層邏輯如果仔細(xì)拆解崗位要承擔(dān)的工作會(huì)得到下面這張能力畫像能力維度為什么要考在筆試?yán)锏膶?duì)應(yīng)題型C/C語(yǔ)言車機(jī)端應(yīng)用、T-Box通信模塊大量使用C/C指針、內(nèi)存、類相關(guān)選擇題和改錯(cuò)題數(shù)據(jù)結(jié)構(gòu)與算法軟件工程的基本功決定代碼質(zhì)量鏈表、二叉樹、棧隊(duì)列的手寫與復(fù)雜度分析操作系統(tǒng)車機(jī)系統(tǒng)需要應(yīng)對(duì)多任務(wù)調(diào)度、資源緊張進(jìn)程線程、死鎖、信號(hào)量、內(nèi)存管理計(jì)算機(jī)網(wǎng)絡(luò)車聯(lián)網(wǎng)的本質(zhì)是車與云端、手機(jī)之間的通信TCP/UDP、HTTP、MQTT概念題Linux操作車機(jī)系統(tǒng)普遍基于Linux/Android常用命令、簡(jiǎn)單腳本編寫這個(gè)畫像并不要求每一塊都達(dá)到專家水平但要求每一塊都不能有明顯短板。筆試的篩選邏輯也很有意思它不通過(guò)偏題怪題來(lái)制造門檻而是通過(guò)“基礎(chǔ)題密度”來(lái)淘汰訓(xùn)練不足的人。很多人覺(jué)得車聯(lián)網(wǎng)工程師崗位很酷考前拼命去補(bǔ)自動(dòng)駕駛、激光雷達(dá)、高精地圖結(jié)果一上筆試發(fā)現(xiàn)連struct內(nèi)存對(duì)齊都能做錯(cuò)這就很可惜。1.3 “互聯(lián)網(wǎng)中心”這五個(gè)字透露出的關(guān)鍵信號(hào)崗位名稱里帶“互聯(lián)網(wǎng)中心”意味著這個(gè)團(tuán)隊(duì)的工作模式更接近互聯(lián)網(wǎng)團(tuán)隊(duì)有較快的迭代節(jié)奏講究代碼評(píng)審和工程質(zhì)量也會(huì)關(guān)注數(shù)據(jù)上報(bào)、服務(wù)端接口、App聯(lián)動(dòng)這類偏上層的事情。筆試?yán)锍霈F(xiàn)“車輛狀態(tài)上報(bào)”“遠(yuǎn)程控制指令怎么設(shè)計(jì)”這類題目其實(shí)就是在考察你有沒(méi)有互聯(lián)網(wǎng)軟件的思維習(xí)慣。我當(dāng)時(shí)還注意到一個(gè)細(xì)節(jié)題目里對(duì)內(nèi)存和性能的關(guān)注明顯比純互聯(lián)網(wǎng)后端崗位要高。原因是車機(jī)的硬件資源遠(yuǎn)不如服務(wù)器那么充裕一行不規(guī)范的字符串處理代碼就可能在某個(gè)低配車機(jī)上引發(fā)卡頓甚至崩潰。所以筆試考內(nèi)存對(duì)齊、考動(dòng)態(tài)內(nèi)存管理不是故意刁難而是這個(gè)崗位每天都會(huì)遇到這些事。2. 從崗位描述反推筆試范圍基礎(chǔ)能力與車聯(lián)網(wǎng)場(chǎng)景的權(quán)重2.1 崗位描述里那些關(guān)鍵字的優(yōu)先級(jí)當(dāng)年招聘信息里的關(guān)鍵字我現(xiàn)在還記得大概車聯(lián)網(wǎng)、軟件工程師、嵌入式、Linux、通信。把這些詞展開就是筆試考察范圍。校招筆試不會(huì)考你上一份實(shí)習(xí)做了什么它更傾向考察“你這個(gè)人有沒(méi)有獨(dú)立成長(zhǎng)的基礎(chǔ)”。所以從崗位描述能直接推出好幾個(gè)可能考到的模塊如果寫了Linux大概率會(huì)考常用命令、進(jìn)程概念、文件系統(tǒng)如果寫了通信大概率會(huì)考TCP/IP協(xié)議棧運(yùn)氣好會(huì)碰到MQTT這類物聯(lián)網(wǎng)協(xié)議如果寫了嵌入式C語(yǔ)言的優(yōu)先級(jí)會(huì)直接拉到最高指針、內(nèi)存、結(jié)構(gòu)體這些跑不掉如果寫了軟件工程師數(shù)據(jù)結(jié)構(gòu)與算法基本是必考題。注意這里的權(quán)重分配基礎(chǔ)能力是主體車聯(lián)網(wǎng)場(chǎng)景是包裝。就像互聯(lián)網(wǎng)后端筆試會(huì)把題目包裝成“訂單系統(tǒng)”一樣車聯(lián)網(wǎng)筆試也喜歡把題目包裝成“車輛狀態(tài)上報(bào)”“遠(yuǎn)程升級(jí)任務(wù)”。你看穿這點(diǎn)之后復(fù)習(xí)就不會(huì)跑偏。2.2 必考、???、加分考點(diǎn)的優(yōu)先級(jí)表結(jié)合當(dāng)年實(shí)際筆試的體感如果把考點(diǎn)排個(gè)優(yōu)先級(jí)大概是這樣的優(yōu)先級(jí)考點(diǎn)常見(jiàn)出題方式必考C語(yǔ)言基礎(chǔ)、指針、內(nèi)存選擇題、代碼找錯(cuò)必考數(shù)據(jù)結(jié)構(gòu)鏈表、棧、隊(duì)列、樹手寫代碼或復(fù)雜度分析必考操作系統(tǒng)進(jìn)程線程、同步、死鎖概念選擇題、問(wèn)答??糒inux命令、shell腳本命令填空、場(chǎng)景腳本??季W(wǎng)絡(luò)協(xié)議TCP/UDP、HTTP問(wèn)答、流程描述??妓惴}字符串、數(shù)組、簡(jiǎn)單動(dòng)態(tài)規(guī)劃在線編程題加分MQTT、JSON/Protobuf、OTA流程場(chǎng)景問(wèn)答你可以發(fā)現(xiàn)車聯(lián)網(wǎng)特有的知識(shí)點(diǎn)通常不會(huì)單獨(dú)出一道大題而是作為背景嵌入到網(wǎng)絡(luò)或操作系統(tǒng)題目里。例如“車輛在弱網(wǎng)環(huán)境下上報(bào)位置應(yīng)該選TCP還是UDP”表面考網(wǎng)絡(luò)實(shí)際考的是你對(duì)可靠性和實(shí)時(shí)性的權(quán)衡。這種題目如果只背概念而不理解場(chǎng)景很容易答偏。2.3 為什么2019年春招的筆試會(huì)更偏重基礎(chǔ)那一年春招的節(jié)奏比秋招快留給筆試的時(shí)間窗口短面試官也需要通過(guò)一場(chǎng)筆試快速篩選出值得進(jìn)入后續(xù)流程的人。所以筆試題目不會(huì)出得太難更不會(huì)為了一個(gè)冷門知識(shí)點(diǎn)讓大多數(shù)人交白卷。它的目的是把“基礎(chǔ)扎實(shí)、具備計(jì)算機(jī)系統(tǒng)觀”的人挑出來(lái)而不是找“百科全書式”的人。這也意味著備考重點(diǎn)應(yīng)放在高頻考點(diǎn)上。如果你花大量時(shí)間去背車聯(lián)網(wǎng)行業(yè)分析、研究每一個(gè)OEM的遠(yuǎn)程升級(jí)方案反而可能錯(cuò)過(guò)最核心的得分點(diǎn)。把基礎(chǔ)題練到肌肉記憶再去拓展車聯(lián)網(wǎng)場(chǎng)景題才是穩(wěn)妥的路。3. 基本盤拆解C/C、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)在筆試中的考法3.1 C/C的送分題與爭(zhēng)奪題C/C是當(dāng)年筆試?yán)锓至孔钪氐囊粔K。它考察的難點(diǎn)不在語(yǔ)法本身而在你是否真正理解內(nèi)存布局和對(duì)象生命周期。隨便舉幾個(gè)高頻點(diǎn)指針和引用的區(qū)別、const在C和C中的不同含義、static變量和全局變量的區(qū)別、結(jié)構(gòu)體內(nèi)存對(duì)齊、虛函數(shù)底層實(shí)現(xiàn)。這些知識(shí)點(diǎn)非?;A(chǔ)但能全答對(duì)的人并沒(méi)有想象中那么多。以結(jié)構(gòu)體內(nèi)存對(duì)齊為例題目往往問(wèn)一個(gè)結(jié)構(gòu)體占多少字節(jié)struct Node { char a; int b; char c; };如果在32位系統(tǒng)上默認(rèn)4字節(jié)對(duì)齊答案是12字節(jié)而不是6字節(jié)。很多人只算字段寬度忘了對(duì)齊填充。這個(gè)考點(diǎn)幾乎年年出現(xiàn)因?yàn)樗谇度胧酵ㄐ胖蟹浅jP(guān)鍵結(jié)構(gòu)體經(jīng)常用來(lái)解析CAN報(bào)文或者網(wǎng)絡(luò)幀如果對(duì)齊規(guī)則不清楚很容易踩到協(xié)議解析的坑。另一個(gè)值得寫的是淺拷貝和深拷貝。車聯(lián)網(wǎng)代碼里經(jīng)常會(huì)出現(xiàn)車輛信息結(jié)構(gòu)體的賦值如果只做淺拷貝動(dòng)態(tài)分配的字符串就會(huì)被兩個(gè)對(duì)象同時(shí)持有析構(gòu)時(shí)就會(huì)double free。筆試?yán)锟赡懿粫?huì)讓你寫完整代碼但會(huì)給出一個(gè)類讓你指出拷貝構(gòu)造和賦值運(yùn)算符有什么問(wèn)題。這類題邏輯不復(fù)雜前提是你平時(shí)真寫過(guò)、真崩過(guò)。C里還有個(gè)容易考的細(xì)節(jié)為什么構(gòu)造函數(shù)不能是虛函數(shù)而析構(gòu)函數(shù)推薦寫成虛函數(shù)。在車輛通信模塊中上層往往定義抽象接口下層有多種協(xié)議實(shí)現(xiàn)比如4G、Wi-Fi、藍(lán)牙。如果基類析構(gòu)函數(shù)不是虛函數(shù)delete基類指針時(shí)子類資源就無(wú)法釋放。這個(gè)點(diǎn)既考語(yǔ)言機(jī)制也考工程意識(shí)答到“資源釋放”層面通常就能拿高分。3.2 數(shù)據(jù)結(jié)構(gòu)題不只考手寫代碼數(shù)據(jù)結(jié)構(gòu)的選擇題通常是送分題比如棧和隊(duì)列的異同、哈希沖突的幾種解決方式、二叉搜索樹的查找復(fù)雜度、快排最壞時(shí)間復(fù)雜度。這部分只要刷過(guò)一遍基礎(chǔ)題基本不會(huì)丟分。容易拉開差距的還是手寫代碼題。鏈表反轉(zhuǎn)出鏡率很高。它看起來(lái)簡(jiǎn)單但要在五分鐘內(nèi)寫對(duì)手不能生。參考答案思路如下struct ListNode* reverseList(struct ListNode* head) { struct ListNode *prev NULL, *curr head; while (curr) { struct ListNode *next curr-next; curr-next prev; prev curr; curr next; } return prev; }除了鏈表二叉樹層序遍歷、用兩個(gè)棧實(shí)現(xiàn)隊(duì)列也稱得上高頻。這些題不考技巧純粹考你平時(shí)有沒(méi)有動(dòng)手寫過(guò)。如果沒(méi)有在筆試現(xiàn)場(chǎng)邊想邊寫非常容易卡殼。另一個(gè)值得注意的考點(diǎn)是復(fù)雜度分析。有些題目不要求你寫完整代碼但會(huì)問(wèn)你“將哈希表改為紅黑樹后查找復(fù)雜度從O(1)變成多少”這需要你對(duì)數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)有基本感知。3.3 操作系統(tǒng)與Linux嵌入式環(huán)境下的實(shí)操感操作系統(tǒng)題很少考特別抽象的理論更多是問(wèn)進(jìn)程和線程的區(qū)別、死鎖的四個(gè)必要條件、信號(hào)量和互斥鎖的使用場(chǎng)景。如果你有過(guò)多線程編程經(jīng)驗(yàn)答起來(lái)會(huì)輕松很多。車機(jī)場(chǎng)景里多個(gè)應(yīng)用要同時(shí)訪問(wèn)定位模塊、網(wǎng)絡(luò)模塊這里就是典型的同步與資源管理問(wèn)題。當(dāng)年的題目里我最深的一道是“多個(gè)線程同時(shí)往一個(gè)日志緩沖區(qū)寫數(shù)據(jù)如何保證不互相覆蓋”。這個(gè)問(wèn)題表面考線程安全實(shí)際考你對(duì)鎖的理解。正確的回答是先想到互斥鎖或自旋鎖然后再補(bǔ)充一句“鎖的粒度盡量小避免日志寫入過(guò)程中長(zhǎng)時(shí)間持有鎖導(dǎo)致其他線程卡頓”。如果還能想到用無(wú)鎖環(huán)形緩沖區(qū)那就是加分中的加分了。Linux方面命令題是性價(jià)比最高的部分。下面這幾條建議你考前閉眼都能寫出來(lái)用top或free查看系統(tǒng)負(fù)載和內(nèi)存占用用ps -ef | grep 進(jìn)程名查找進(jìn)程PID用netstat -tunlp查看端口和網(wǎng)絡(luò)連接用find /var/log -name *.log | xargs grep xxx在日志目錄里查關(guān)鍵詞用tail -f實(shí)時(shí)跟蹤日志用kill -9 PID強(qiáng)制結(jié)束進(jìn)程。筆試?yán)锟赡軙?huì)讓你寫一個(gè)簡(jiǎn)單腳本比如“刪除一周前的日志文件”。很簡(jiǎn)單#!/bin/bash find /var/log/vehicle -name *.log -mtime 7 -exec rm -f {} \;這其實(shí)也考察了find條件的組合能力。如果你只會(huì)ls和cd到這就露餡了。Linux不是一天練成的但常用命令突擊一兩天就能覆蓋大部分考點(diǎn)投入產(chǎn)出比很高。另一個(gè)常見(jiàn)問(wèn)法是“如何查看某個(gè)進(jìn)程的CPU和內(nèi)存占用”很多人會(huì)答ps但top -p PID才是更有針對(duì)性的答案面試官會(huì)更認(rèn)可這種精確操作。4. 提分項(xiàng)拆解網(wǎng)絡(luò)通信與算法編程題怎么準(zhǔn)備4.1 TCP/UDP和車聯(lián)網(wǎng)場(chǎng)景的結(jié)合網(wǎng)絡(luò)題是車聯(lián)網(wǎng)軟件工程師筆試?yán)镒罹邖徫惶厣牟糠忠驗(yàn)樗苷嬲齾^(qū)分“背過(guò)八股文”和“理解場(chǎng)景”?;A(chǔ)題大家都準(zhǔn)備過(guò)三次握手為什么不是兩次、四次揮手為什么需要TIME_WAIT、UDP和TCP各自適合什么場(chǎng)景。但真正有區(qū)分度的是把它放到車聯(lián)網(wǎng)語(yǔ)境里問(wèn)。舉個(gè)例子題目可能會(huì)說(shuō)車輛在行駛過(guò)程中需要每10秒上報(bào)一次GPS位置請(qǐng)問(wèn)選用TCP、UDP還是MQTT更合適很多人一看到“上報(bào)”就寫UDP理由是實(shí)時(shí)性好。但如果你了解實(shí)際工程會(huì)發(fā)現(xiàn)位置上報(bào)也需要考慮數(shù)據(jù)完整性因?yàn)榉?wù)器端要用這些位置繪制軌跡、分析駕駛行為。完全丟包會(huì)導(dǎo)致軌跡斷裂。所以工程上常用MQTT QoS1既保證至少一次到達(dá)又比裸TCP連接重建的開銷小。再比如遠(yuǎn)程控車指令這種操作要求可靠性和安全性。車門解鎖指令一旦丟失用戶可能被鎖在車外。所以它必須走加密的可靠通道HTTP/HTTPS或MQTT QoS2都可行。筆試答題時(shí)如果能寫出“可靠指令用TCP/HTTPS高頻低價(jià)值數(shù)據(jù)用UDP或MQTT QoS0”這種層次感閱卷人一眼就能看出你不只是背了協(xié)議區(qū)別。還包括HTTP和HTTPS的區(qū)別這個(gè)常規(guī)考點(diǎn)在車聯(lián)網(wǎng)里也有延伸車機(jī)請(qǐng)求云端接口證書校驗(yàn)失敗應(yīng)該怎么辦如果直接忽略證書繼續(xù)請(qǐng)求就可能被中間人攻擊。好的回答應(yīng)該是“先判斷失敗原因再?zèng)Q定是否走安全策略涉及車輛控制類接口必須嚴(yán)格校驗(yàn)”。這種安全意識(shí)在車聯(lián)網(wǎng)崗位里非??粗?。4.2 算法題的難度和取舍算法編程題通常是整個(gè)筆試?yán)镒詈臅r(shí)間的。當(dāng)年的題目難度基本在LeetCode中等偏下不太會(huì)出現(xiàn)競(jìng)賽題。常見(jiàn)方向包括字符串處理、數(shù)組操作、鏈表、二分查找、簡(jiǎn)單動(dòng)態(tài)規(guī)劃。例如“合并兩個(gè)有序鏈表”“最長(zhǎng)無(wú)重復(fù)子串”“兩數(shù)之和”這類。寫題時(shí)有個(gè)很重要的取舍拿到題目先不要急著寫代碼先跟出題人給的例子過(guò)一遍流程確認(rèn)輸入范圍和邊界。比如合并兩個(gè)有序鏈表它考察的不只是邏輯還包括“有沒(méi)有處理空鏈表”“有沒(méi)有理清dummy節(jié)點(diǎn)”這些小節(jié)。代碼可以寫得樸素但一定要完整struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode dummy; struct ListNode* tail dummy; dummy.next NULL; while (l1 l2) { if (l1-val l2-val) { tail-next l1; l1 l1-next; } else { tail-next l2; l2 l2-next; } tail tail-next; } tail-next l1 ? l1 : l2; return dummy.next; }如果運(yùn)氣好碰到“最長(zhǎng)無(wú)重復(fù)子串”可以用滑動(dòng)窗口解決。關(guān)鍵是想清楚窗口什么時(shí)候收縮什么時(shí)候更新答案。這類題只要保持刷題手感臨時(shí)上手不會(huì)太難。還有一個(gè)方向也值得留意排序類題目。比如給一組車輛狀態(tài)記錄按時(shí)間戳排序你會(huì)優(yōu)先寫快速排序還是直接調(diào)用系統(tǒng)庫(kù)工程上當(dāng)然是調(diào)用系統(tǒng)庫(kù)更穩(wěn)妥但筆試?yán)锶绻鞔_要求“手寫排序”就必須能在紙上寫對(duì)partition過(guò)程。4.3 答題規(guī)范與調(diào)試技巧在線筆試平臺(tái)通常沒(méi)有代碼提示也不提供完整編譯調(diào)試環(huán)境。很多人寫完代碼后沒(méi)有測(cè)試用例的意識(shí)丟分常常不是思路不對(duì)而是“沒(méi)考慮到空輸入”。我的建議是寫完之后至少在腦子里跑三組用例——正常輸入、空輸入、單元素輸入。如果平臺(tái)支持本地編譯就先把代碼在本地跑一遍再貼上去穩(wěn)得多。另外注意輸入輸出的格式。??秃唾惔a這類平臺(tái)經(jīng)常要求你處理多行輸入如果scanf或cin用錯(cuò)代碼邏輯再正確也可能超時(shí)或者讀不到數(shù)據(jù)。這些都是細(xì)節(jié)但細(xì)節(jié)決定筆試能不能進(jìn)面。還有一個(gè)很實(shí)用的習(xí)慣在代碼開頭寫清楚思路注釋哪怕只有兩三行。如果線上判題沒(méi)給滿分后續(xù)人工復(fù)核時(shí)看到你在注釋里寫了“用快慢指針找中點(diǎn)再用歸并排序”也能給出印象分。5. 90分鐘作答的節(jié)奏控制與真實(shí)踩坑復(fù)盤5.1 我當(dāng)年的時(shí)間分配方案當(dāng)年筆試時(shí)長(zhǎng)是90分鐘題目類型包括選擇題、填空題、簡(jiǎn)答題、編程題。很多人到最后沒(méi)有做完不是題目量太大而是沒(méi)有控制節(jié)奏。我自己的時(shí)間分配習(xí)慣是這樣的先快速瀏覽整張?jiān)嚲砼袛囝}量比例接著用10到15分鐘解決所有選擇題和填空題給編程題留出40分鐘再用剩余20分鐘處理簡(jiǎn)答題和檢查。選擇題和填空題是最容易拿分但最容易被拖時(shí)間的部分。有些C語(yǔ)言題很刁鉆比如“有符號(hào)和無(wú)符號(hào)比較”“整型提升”如果你不確定不要戀戰(zhàn)先做一個(gè)標(biāo)記回頭再來(lái)看。編程題必須留足時(shí)間因?yàn)橐坏懖煌陰缀跄貌坏椒謹(jǐn)?shù)。簡(jiǎn)答題不要寫太長(zhǎng)按照“定義、原因、場(chǎng)景、做法”四段式組織每條控制在三四行既清楚又不浪費(fèi)時(shí)間。5.2 那些看著會(huì)做卻丟分的瞬間復(fù)盤當(dāng)時(shí)答題卡我發(fā)現(xiàn)最可惜的丟分點(diǎn)不是不會(huì)做而是“會(huì)做但沒(méi)寫全”。比如某道簡(jiǎn)答題問(wèn)“為什么車機(jī)遠(yuǎn)程升級(jí)要設(shè)計(jì)多個(gè)版本回退機(jī)制”我光寫了OTA升級(jí)失敗會(huì)導(dǎo)致設(shè)備變磚但沒(méi)有展開說(shuō)明版本校驗(yàn)、A/B分區(qū)、升級(jí)包簽名這些工程細(xì)節(jié)。閱卷人想看的不是一句口號(hào)而是你真的了解一個(gè)軟件系統(tǒng)在真實(shí)設(shè)備上會(huì)遇到的邊界情況。編程題也踩過(guò)類似坑。我記得有一道題要求“輸出合并后的鏈表節(jié)點(diǎn)值”我寫完合并邏輯后忘記逐節(jié)點(diǎn)輸出直接輸出了頭節(jié)點(diǎn)指針平臺(tái)判題必然報(bào)錯(cuò)。這種錯(cuò)誤不是能力問(wèn)題而是考場(chǎng)狀態(tài)下習(xí)慣性忽視“輸出格式”這四個(gè)字。還有一次是寫代碼之前沒(méi)初始化指針本地編譯器開啟了嚴(yán)格警告所以能發(fā)現(xiàn)但線上平臺(tái)可能直接編譯失敗。5.3 重新復(fù)盤后的心得整理完這份復(fù)盤我最大的感受是車聯(lián)網(wǎng)軟件工程師筆試的核心不是“卷難度”而是“考穩(wěn)定”。它希望篩出來(lái)的是能在有限時(shí)間內(nèi)把基礎(chǔ)題做對(duì)、把關(guān)鍵場(chǎng)景想清楚、把代碼寫得不出邊界問(wèn)題的人。如果讓我重新準(zhǔn)備一次我會(huì)把復(fù)習(xí)順序調(diào)整為先快速刷一遍C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)題確保不犯低級(jí)錯(cuò)誤再花兩三天把Linux命令和shell腳本練熟接著把TCP/UDP、MQTT、HTTP這些協(xié)議在車聯(lián)網(wǎng)場(chǎng)景里的應(yīng)用想透最后才是刷算法題。這個(gè)順序不是按分?jǐn)?shù)占比排的而是按“投入產(chǎn)出比”排的——基礎(chǔ)題和命令題背了就有分算法題則依賴長(zhǎng)期積累沖刺階段性價(jià)比相對(duì)低。我還想特別提一點(diǎn)面試官很看重“排查問(wèn)題”的思維方式。筆試?yán)锶绻霈F(xiàn)“車輛偶發(fā)不上報(bào)數(shù)據(jù)如何排查”這樣的場(chǎng)景題不要一上來(lái)就寫“我是后端工程師不擅長(zhǎng)”。把鏈路拆成車端采集、網(wǎng)絡(luò)傳輸、云端接收三段每段列出可能的故障點(diǎn)和排查命令比如車端看進(jìn)程是否存活、網(wǎng)絡(luò)層看TCP連接狀態(tài)、云端看日志和數(shù)據(jù)庫(kù)寫入。這種結(jié)構(gòu)化表達(dá)即使不是標(biāo)準(zhǔn)答案也能展現(xiàn)出你的系統(tǒng)思維。最后再分享一個(gè)簡(jiǎn)單但有用的技巧筆試前把常見(jiàn)的結(jié)構(gòu)體對(duì)齊、三次握手、進(jìn)程切換、鏈表反轉(zhuǎn)、滑動(dòng)窗口這五類題各默寫一遍。字不用多關(guān)鍵是手要熟。很多時(shí)候你感覺(jué)自己“會(huì)”但真正動(dòng)筆才發(fā)現(xiàn)缺了一個(gè)dummy節(jié)點(diǎn)。這份2019春招的筆試題已經(jīng)過(guò)去好幾年了但這類崗位要的東西其實(shí)一直沒(méi)變基礎(chǔ)扎實(shí)、懂場(chǎng)景、能落地。如果你正在準(zhǔn)備類似的車聯(lián)網(wǎng)軟件工程師崗位不妨把這份復(fù)盤當(dāng)作一份最小檢查清單逐項(xiàng)確認(rèn)一下自己是否真的準(zhǔn)備好了。