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