:從筆試到面試的完整復(fù)盤)
浩鯨科技2020屆算法C類。這幾個詞組合在一起對當(dāng)年跑秋招的人來說既是一個具體的招聘崗位也是一段挺特殊的備戰(zhàn)經(jīng)歷。浩鯨科技在業(yè)內(nèi)大多知道是搞電信軟件、運營商支撐系統(tǒng)的前身和“中興軟創(chuàng)”有淵源后來被阿里方面投資后品牌升級整體風(fēng)格帶著通信行業(yè)的扎實底子又混進(jìn)了互聯(lián)網(wǎng)的節(jié)奏感。算法C類這個標(biāo)簽不算大廠那種“算法工程師”人人擠破頭的架勢但要求一點都不虛筆試面試覆蓋的東西很雜從經(jīng)典數(shù)據(jù)結(jié)構(gòu)到機器學(xué)習(xí)基礎(chǔ)再到工程落地思維都會碰到。這篇文章不是簡單把招聘信息抄一遍而是把這些年很多求職者包括我身邊朋友的經(jīng)歷在浩鯨算法崗備戰(zhàn)過程中的核心內(nèi)容做個系統(tǒng)復(fù)盤這是個什么定位的崗位、筆試面試考什么、該怎么準(zhǔn)備、有哪些坑是只有真正跑過流程的人才總結(jié)得出來的。不管你是準(zhǔn)備投遞通信行業(yè)、數(shù)字化服務(wù)企業(yè)還是想找一個業(yè)務(wù)穩(wěn)、技術(shù)面廣的算法方向這份內(nèi)容都應(yīng)該能給你省不少力氣。1. 浩鯨科技2020屆算法C類先把這個崗位想清楚1.1 企業(yè)底色與崗位定位要備戰(zhàn)一個崗位第一件事不是刷題而是弄明白這家公司、這個崗位在實際業(yè)務(wù)里到底做什么。浩鯨科技長期深耕電信運營商的信息化系統(tǒng)比如BSS/OSS這類計費、客戶關(guān)系管理、經(jīng)營分析系統(tǒng)近些年也在政企數(shù)字化、智慧城市、產(chǎn)業(yè)互聯(lián)網(wǎng)方向上鋪了很多業(yè)務(wù)。這種公司的算法崗和互聯(lián)網(wǎng)大廠做推薦、做搜索的算法崗有本質(zhì)區(qū)別它不追求“全球首創(chuàng)的模型結(jié)構(gòu)”更看重“在復(fù)雜業(yè)務(wù)場景里把算法穩(wěn)定用起來”。為什么叫“算法C類”不同公司對算法序列的劃分方式不一樣常見的是按方向分A/B/C類比如A類偏AI研究、B類偏數(shù)據(jù)挖掘或機器學(xué)習(xí)平臺、C類可能偏業(yè)務(wù)算法或工程類算法。結(jié)合2020屆校招的公開信息和崗位描述來看算法C類大概率更偏向“業(yè)務(wù)算法工程師”而非純研究崗做的事情會涵蓋數(shù)據(jù)處理、特征工程、模型的選型與調(diào)優(yōu)、線上效果評估甚至要自己寫數(shù)據(jù)管道。這類崗位的一個特點是“廣而不深卻不等于淺”。它要求你既懂機器學(xué)習(xí)、深度學(xué)習(xí)的基礎(chǔ)理論又得具備扎實的編程和數(shù)據(jù)結(jié)構(gòu)功底還要能理解業(yè)務(wù)指標(biāo)知道模型結(jié)果怎么落到生產(chǎn)環(huán)境里。很多同學(xué)栽就栽在只準(zhǔn)備了一條腿——要么一味刷題不去看業(yè)務(wù)場景要么死磕論文卻連歸并排序都寫不順。1.2 這類崗位適合誰投如果你符合下面任意一條浩鯨這種“業(yè)務(wù)算法”方向是很值得認(rèn)真考慮的對電信、政企數(shù)字化行業(yè)感興趣希望算法能力落地到真實業(yè)務(wù)而不是一直停留在Kaggle比賽和開源數(shù)據(jù)集上技術(shù)棧比較均衡數(shù)理基礎(chǔ)不差編程能力中等偏上不想在大廠推薦算法賽道里擠破頭看重職業(yè)穩(wěn)定性希望進(jìn)一個業(yè)務(wù)盤子大、項目周期長的企業(yè)或者你只是想用一份扎實的offer作為秋招保底那這個崗位的性價比也非常高。我在準(zhǔn)備時最大的體會是投這類崗位心態(tài)上一定要從“我要證明自己算法很牛”切換到“我要證明自己能用算法解決實際問題”。這個認(rèn)知轉(zhuǎn)換直接影響你后續(xù)的簡歷怎么寫、面試怎么答甚至筆試時的策略選擇。2. 算法筆試準(zhǔn)備把高頻考點拆成可執(zhí)行的清單2.1 數(shù)據(jù)結(jié)構(gòu)與基礎(chǔ)算法不是光刷題而是按“題型家族”來準(zhǔn)備浩鯨算法崗的筆試常用的在線評測系統(tǒng)和企業(yè)自研平臺都遇到過。題量不算大一般2到4道編程題外加一部分選擇題或簡答題。選擇題覆蓋范圍很雜數(shù)據(jù)結(jié)構(gòu)、排序、圖論、概率統(tǒng)計、機器學(xué)習(xí)概念都可能出現(xiàn)所以準(zhǔn)備時不能只看編程題。先把基礎(chǔ)算法這部分說透。針對這類崗位最??嫉膸最愇艺砹艘粋€“題型家族”清單題型家族代表算法備考重點字符串處理KMP算法、next數(shù)組構(gòu)造、字符串哈希理解next數(shù)組的含義和構(gòu)造過程不要只會背模板排序與查找快速排序、堆排序、歸并排序、冒泡排序變種能分析時間復(fù)雜度和穩(wěn)定性能手寫快排和堆排圖論基礎(chǔ)Dijkstra、二分圖、Kahn拓?fù)渑判?、并查集掌握鄰接表和鄰接矩陣的適用場景會手寫優(yōu)先隊列優(yōu)化版Dijkstra動態(tài)規(guī)劃與貪心背包問題、最長上升子序列、區(qū)間DP能識別狀態(tài)轉(zhuǎn)移別把貪心當(dāng)萬能鑰匙經(jīng)典工程算法快速冪、二分答案、前綴和差分這些看似簡單但筆試題里很愛包裝場景來考這里特別說一下KMP和快速冪這兩個考點它們在熱搜詞里出現(xiàn)頻率很高也是筆試題里的??汀MP的難點不在“理解匹配邏輯”而在next數(shù)組的推導(dǎo)。我建議準(zhǔn)備時不要背代碼而是自己手工推一遍“abacaba”的next數(shù)組過程搞清楚“最長相等前后綴”這個定義在代碼里怎么一步步體現(xiàn)。面試官如果看到你回答KMP時能拿筆現(xiàn)場畫狀態(tài)轉(zhuǎn)移基本這一項就過了??焖賰鐒t是典型的“看起來簡單、實際暗藏優(yōu)化思維”的題。它的核心思路是把指數(shù)拆成二進(jìn)制通過不斷平方來減少乘法次數(shù)。你不僅要寫得出遞歸和迭代兩種版本還要能說明為什么時間復(fù)雜度能從O(b)降到O(log b)以及取模運算在中間過程里怎么處理。這類經(jīng)典算法沒有太高門檻但很能區(qū)分“背過答案”和“真懂原理”。2.2 機器學(xué)習(xí)與深度學(xué)習(xí)不考論文細(xì)節(jié)但概念必須能講透2020屆的算法崗筆試機器學(xué)習(xí)概念題幾乎是標(biāo)配。根據(jù)當(dāng)時多個渠道的反饋浩鯨筆試涉及到的知識點包括KNN的原理和k值選擇、聚類算法K-Means的優(yōu)缺點和初始化方式、樸素貝葉斯假設(shè)、決策樹分裂準(zhǔn)則、SVM的核函數(shù)思想、過擬合與正則化、交叉驗證、評估指標(biāo)精確率/召回率/F1/AUC等。這些都是教科書級別的概念但很多人復(fù)習(xí)時容易踩一個坑只記住名詞解釋卻沒準(zhǔn)備“怎么給一個不懂算法的人講明白”。筆試選擇題還能蒙但到了面試環(huán)節(jié)面試官追問“K-Means的k怎么選”“AUC和準(zhǔn)確率的區(qū)別到底是什么”時光說“K-Means要指定k”這種一句話答案就太單薄了。深度學(xué)習(xí)方向重點應(yīng)該放在CNN的基本結(jié)構(gòu)卷積、池化、全連接、激活函數(shù)對比ReLU為什么比sigmoid好、損失函數(shù)交叉熵和均方誤差的適用場景、過擬合的常見手段dropout、BN、數(shù)據(jù)增強、RNN/LSTM的直觀理解。據(jù)我了解這一部分在筆試?yán)锒嘁愿拍钸x擇題出現(xiàn)不會要求推導(dǎo)復(fù)雜的反向傳播公式但如果你能在面試?yán)镏鲃又v清楚“為什么序列模型用LSTM能緩解梯度消失”會是很大的加分項。這里我要特別強調(diào)一個容易被忽略的點經(jīng)典算法和優(yōu)化方法的邊界擴展。翻熱搜詞里那些“粒子群算法原理”“模擬退火算法”“卡爾曼濾波算法”“PID算法”“BM25算法”它們?yōu)槭裁磿鸵粓鏊惴◢徝嬖嚠a(chǎn)生關(guān)聯(lián)因為浩鯨這類公司面對的業(yè)務(wù)場景太雜了——智能調(diào)度、故障預(yù)測、參數(shù)優(yōu)化、文本檢索不一定都用深度學(xué)習(xí)解決很多場景下經(jīng)典算法更可靠、更容易解釋。面試官很可能拿這些來考察你的知識廣度就算筆試不考面試也有很大概率被問到。2.3 突擊策略用“三遍法”把知識點過成體系第一遍快速拉網(wǎng)。把上面提到的數(shù)據(jù)結(jié)構(gòu)、機器學(xué)習(xí)、深度學(xué)習(xí)知識點全部過一遍不用深究只求知道“這個東西是干什么的”。這一步的目標(biāo)是建立地圖避免面試時出現(xiàn)“這個名詞我完全沒聽過”的尷尬。第二遍逐點擊穿。每個知識點問自己三個問題它解決什么問題它的核心步驟或原理是什么它有什么局限性或使用注意點如果你能對80%的知識點給出兩三句話的完整回答筆試選擇題基本沒問題了。第三遍手寫鞏固。所有經(jīng)典算法都要能手寫出來不是只在編輯器里跑通而是拿一張白紙直接寫。面試手撕代碼和筆試環(huán)境是不一樣的沒有自動補全、沒有編譯提示白紙寫代碼才是真實力。3. 面試環(huán)節(jié)從簡歷篩選到業(yè)務(wù)場景深挖3.1 簡歷上要突出什么浩鯨算法崗的簡歷篩選我體感更看重“項目經(jīng)歷”和“技術(shù)匹配度”而不是單純看學(xué)校出身。寫項目經(jīng)歷的時候有幾點建議可以直接抄不要只寫“使用了XGBoost/神經(jīng)網(wǎng)絡(luò)”要把問題背景寫出來讓面試官知道你在什么條件下選擇了什么方案一定要有量化結(jié)果。比如“通過特征篩選和參數(shù)調(diào)優(yōu)將預(yù)測準(zhǔn)確率從87%提升到91%”比“效果提升明顯”有用得多數(shù)據(jù)量級和業(yè)務(wù)場景要寫清楚。比如“處理了1000萬條用戶行為日志”“針對運營商投訴工單做文本分類”。這類描述能讓面試官快速想象你的工作場景如果你有工程化經(jīng)歷比如自己寫過數(shù)據(jù)爬蟲、搭建過模型服務(wù)接口、用過Docker部署務(wù)必寫出來。算法C類非??粗亍澳P湍懿荒苡闷饋怼庇泄こ谈惺秋@著加分項。3.2 面試官愛問的深挖點業(yè)務(wù)理解是隱藏主線浩鯨算法崗的面試通常兩到三輪技術(shù)面加一輪HR面。技術(shù)面的問題可以分成三大類基礎(chǔ)算法與數(shù)據(jù)結(jié)構(gòu)、機器學(xué)習(xí)理論、業(yè)務(wù)場景題?;A(chǔ)算法和機器學(xué)習(xí)理論的部分筆試怎么準(zhǔn)備面試就怎么準(zhǔn)備但要注意“表述方式”。筆試題是寫代碼面試題是講思路。比如讓你講堆排序你不能只背“建堆、調(diào)整、排序”三個詞而是要說清楚堆是什么結(jié)構(gòu)、建堆的時間復(fù)雜度為什么是O(n)、調(diào)整過程是怎么保證父節(jié)點大于子節(jié)點的、堆排序為什么不穩(wěn)定。一個知識點能連續(xù)講三分鐘才算真正準(zhǔn)備到位。業(yè)務(wù)場景題是這個崗位最需要重視的部分。面試官很可能會拋出一個類似這樣的問題假設(shè)我們有運營商的投訴工單數(shù)據(jù)需要做一個自動分類系統(tǒng)把工單分到不同的責(zé)任部門你會怎么設(shè)計這類題沒有標(biāo)準(zhǔn)答案但考察的是完整的算法思維鏈路。一個比較穩(wěn)妥的回答結(jié)構(gòu)是先問清楚業(yè)務(wù)目標(biāo)分幾類錯誤容忍度如何實時性要求然后說數(shù)據(jù)來源和預(yù)處理文本清洗、分詞、標(biāo)注數(shù)據(jù)量再選模型傳統(tǒng)機器學(xué)習(xí)還是深度學(xué)習(xí)為什么最后聊評估方式準(zhǔn)確率還是F1要考慮類別不平衡和上線方案離線訓(xùn)練還是在線學(xué)習(xí)。這個回答鏈條走下來面試官基本能判斷你是有實戰(zhàn)思維的人而不是只會調(diào)包。3.3 手撕代碼的典型場景與溝通技巧手撕代碼環(huán)節(jié)題目難度一般在中檔偏下很少出現(xiàn)壓軸題級別的算法競賽題。常見的是反轉(zhuǎn)鏈表、二叉樹遍歷、判斷回文串、最長公共子序列、二分查找變種、單例模式手寫這類。但有一個很多人忽略的點手撕代碼不只是考察對錯還考察你的溝通和調(diào)試習(xí)慣。我的建議是拿到題目先別急著寫開口說思路。比如“這道題我打算先用哈希表記錄出現(xiàn)次數(shù)再遍歷一遍找第一個不重復(fù)的字符時間復(fù)雜度O(n)空間復(fù)雜度O(n)面試官您看這個方向可以嗎”這就比悶頭寫代碼顯得專業(yè)得多。寫完之后如果時間允許用一兩個簡單例子手動走一遍順便檢查邊界情況空數(shù)組、只有一個元素、全是重復(fù)元素等。即使最后有小bug這種嚴(yán)謹(jǐn)習(xí)慣也能給面試官留下好印象。還有個小技巧如果面試官給了提示不要只悶頭改先在口頭上重復(fù)一遍“您的意思是這樣優(yōu)化對不對”。這既確認(rèn)了理解也展示了溝通能力——在實際工作中這種能力往往比代碼本身還重要。4. 我在實際備戰(zhàn)中踩過的坑與排查技巧4.1 筆試環(huán)節(jié)環(huán)境差異和題目理解先說筆試環(huán)境?,F(xiàn)在很多企業(yè)用的是第三方在線評測平臺有些平臺支持本地IDE調(diào)試有些不支持有些平臺對Python版本、可導(dǎo)入庫有限制有些則完全開放。我建議在正式筆試前一定要提前半小時進(jìn)入系統(tǒng)先做一道示例題測試環(huán)境。遇到過最坑的情況是本機Python 3.8跑得好好的代碼平臺用的是3.6f-string倒是支持但dataclass這種庫就沒法用了。提前測試能避免這類無謂的失誤。題目理解是個更大的坑。算法筆試題的文字描述通常不長但有時會包含一些隱含條件比如“數(shù)據(jù)量不超過10^5”意味著你可能需要用O(n log n)的解法“數(shù)組元素范圍是1到100”可能暗示可以用計數(shù)排序。第一遍讀題不要急著動手花30秒劃出關(guān)鍵條件確認(rèn)輸入輸出的格式再設(shè)計算法。如果題目有示例一定手算一遍確保理解無誤。另外時間分配上我的策略是先做有把握的題再做看起來有思路的題最后啃難題。如果一道題卡了20分鐘還沒頭緒果斷標(biāo)記跳過。很多在線評測平臺會按通過的測試用例比例給分所以即使只是暴力解法也值得寫上——哪怕只能過30%的用例也比交白卷強很多。4.2 面試表達(dá)空有名詞沒有邏輯這是我最想展開說的一條。很多同學(xué)基礎(chǔ)不差項目也實打?qū)嵶隽说嬖嚨臅r候習(xí)慣“蹦名詞”。比如面試官問“講講你的項目”回答是“我用了隨機森林和XGBoost做了特征重要性排序然后調(diào)參優(yōu)化了結(jié)果”。這個回答最大的問題是全是結(jié)論沒有過程。更好的講法是“這個項目的目標(biāo)是預(yù)測用戶流失概率。我們最初用邏輯回歸作為基線準(zhǔn)確率大概82%。然后我發(fā)現(xiàn)很多特征是高度相關(guān)的所以先用隨機森林做了特征重要性篩選把特征從40維降到15維。接著在XGBoost上做交叉驗證調(diào)參同時用SMOTE處理了正負(fù)樣本不平衡的問題最終在測試集上AUC達(dá)到0.89相比基線提升了5個百分點?!边@種表達(dá)有起點、有過程、有對比、有結(jié)果面試官才能據(jù)此追問和評價。我還發(fā)現(xiàn)一個高頻問題被問到“為什么選這個模型”時很多人只會說“因為它效果好”。這不夠。哪怕你只是“因為這模型在類似比賽里常用”也要補一句“它處理非線性關(guān)系能力強而且對缺失值比較魯棒適合我們這個數(shù)據(jù)質(zhì)量一般的場景”。理由不一定要有多么高深但一定要體現(xiàn)出你做過選擇而不是隨機拍腦袋。4.3 崗位認(rèn)知誤解以為是純算法研究其實是業(yè)務(wù)工程這個坑我見到的概率非常高。很多同學(xué)把“算法崗”等同于“Google DeepMind的研究員”準(zhǔn)備了一堆最新論文結(jié)果面試被問“你會用SQL嗎”“對Linux熟悉嗎”“有沒有用過調(diào)度平臺”時直接懵了。浩鯨算法C類這樣的崗位在實際工作中更多是“算法工程師數(shù)據(jù)工程師業(yè)務(wù)分析師的復(fù)合角色”。你需要自己拉數(shù)、自己清洗、自己建模、自己評估甚至要自己寫接口把模型部署出去。如果你在準(zhǔn)備過程中發(fā)現(xiàn)自己的SQL和Linux基礎(chǔ)薄弱一定要花時間補上。這不只是在面試中能加分更是入職后能不能快速上手的關(guān)鍵。另外對“C類”這個標(biāo)簽不必恐慌也不必輕視。它不是鄙視鏈底端更不是“隨便就能進(jìn)”。它意味著公司對這個崗位的期望是“能干活、能落地、能閉環(huán)”。如果你能在面試中展示出這種閉環(huán)思維大概率會比那些背景更強但只會念論文的競爭者更受青睞。5. 一些掏心窩的體會準(zhǔn)備過程比offer本身更值錢回頭看我整個備戰(zhàn)浩鯨算法C類的過程最值得的不是最后拿到offer的那個瞬間而是為了應(yīng)付那些“天知道會不會考”的經(jīng)典算法和業(yè)務(wù)場景題我把過去三年學(xué)的東西真正串了起來。以前學(xué)機器學(xué)習(xí)是學(xué)一個忘一個為了準(zhǔn)備面試我把K-Means的EM推導(dǎo)、決策樹的剪枝策略、SVM的核函數(shù)映射關(guān)系全部重新過了一遍這才發(fā)現(xiàn)這些模型之間其實是連貫的。有一件事想特別提醒后來者不要迷信面經(jīng)里的“題庫”也不要只刷那些互聯(lián)網(wǎng)大廠的真題。像浩鯨這類企業(yè)的算法崗筆試題目可能中規(guī)中矩但面試問題的發(fā)散性很強會結(jié)合你簡歷上的項目不斷追問“如果數(shù)據(jù)不均衡怎么辦”“如果特征有缺失怎么辦”“如果線上效果不如離線怎么辦”。這些問題的答案不是靠背出來的而是靠你真的做過、想過、踩過坑才能答得自然。最后分享一個我在實際面試中用得很順的小技巧在反問環(huán)節(jié)不要只問“薪資多少”“加班多不多”可以試著問“這個崗位目前在做的項目主要解決什么業(yè)務(wù)問題”“團隊的技術(shù)棧偏向傳統(tǒng)機器學(xué)習(xí)還是深度學(xué)習(xí)”。這既能幫你判斷崗位是否適合自己也能讓面試官感受到你對這份工作有真正的興趣和研究。一次好的面試本來就是雙向選擇。