數(shù)據(jù)庫面試的幾個常見誤區(qū)
由于業(yè)務(wù)的需要,最近面試了很多數(shù)據(jù)庫候選人。發(fā)現(xiàn)很多候選人在面試準(zhǔn)備時會有一些普遍的誤區(qū),借此機(jī)會展開聊聊我作為面試官的一些建議。這次主要講四個誤區(qū):代碼基礎(chǔ)差、工程素養(yǎng)弱、溝通思維無、知識框架碎。
誤區(qū)一:代碼基礎(chǔ)差
數(shù)據(jù)庫是一個工程性極強(qiáng)的領(lǐng)域,因此代碼是面試考察中非常重要的一個環(huán)節(jié),可以說代碼寫得好,即使背景稍弱,也可能會通過面試;但反之則不然,遇到過一些候選人,分布式事務(wù)的一些細(xì)節(jié)可以說的頭頭是道,但卻連鏈表等基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)都寫不太明白,這個情況就是想給過也有心無力。
說到代碼,我們并不期望候選人要能做出多么難的算法題。反而,會更針對偏基礎(chǔ)、偏工程的方向考察。
基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)?;A(chǔ)數(shù)據(jù)結(jié)構(gòu)包括鏈表、哈希表、樹等常見的數(shù)據(jù)結(jié)構(gòu)和相關(guān)算法,最好都能快速地自己實(shí)現(xiàn),并了解每種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)。圖偶爾會考察,但比較少,而且考察點(diǎn)很固定,通常就是最基本的遍歷(BFS、DFS)、最短路、最小生成樹和拓?fù)渑判?/strong>等三四個固定的算法。
常見算法。最基本的就是幾種常見的排序算法[1],弄清楚其時間復(fù)雜度和空間復(fù)雜度以及基本的優(yōu)缺點(diǎn)。另外一個初學(xué)者比較難理解的就是基于樹的回溯算法,這個本質(zhì)上是對遞歸思想了解的不透徹。當(dāng)然,我當(dāng)年也是花了很久才理解這種思想,但一般不會考很難的回溯。另外就是二分算法和分治算法,其核心思想是拆解問題域,去解決子問題:二分就是不斷縮小問題規(guī)模,分治則是在縮小規(guī)模的基礎(chǔ)上,還要將子問題的解進(jìn)行組合,進(jìn)而求解原問題。動態(tài)規(guī)劃算法會比較難,通常不會考,即使考也只會考非常簡單的,比如最基礎(chǔ)版本的 01 背包問題。
工程題目。我之前去面試其他公司,偏工程題目被考到最多的就是?LRU,因?yàn)樗Y(jié)合了哈希表、鏈表等多個數(shù)據(jù)結(jié)構(gòu),Corner case 也比較多,是很看代碼功底的題,但是后來背的人多了,區(qū)分度也就不太高了。另外就是前綴樹,也就是?Trie 樹,這個相對少一些,代碼寫起來也會細(xì)節(jié)很多。我自己多會問一些基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),比如實(shí)現(xiàn)一個哈希表,這個題可以有很多 follow up,比如擴(kuò)縮容、線程安全等等;此外一些涉及文件讀寫、字節(jié)操作、多線程的題目偶爾也會問,由于這些 API 通常都很難記,這時候我通常讓候選人可以隨便查閱互聯(lián)網(wǎng),只需要讓我看著就行。其實(shí)看候選人如何解決問題、如何搜索的過程本身也是一種考察。
誤區(qū)二:工程素養(yǎng)弱
現(xiàn)代的數(shù)據(jù)庫代碼,動輒數(shù)十萬行,如果沒有良好的代碼規(guī)范,會在項(xiàng)目演進(jìn)過程中很快變得不可維護(hù)。因此如果候選人在寫代碼時能夠比較注意代碼風(fēng)格、體現(xiàn)出工程素養(yǎng),會非常加分;反之如果胡亂命名、沒有基本的抽象和復(fù)用,則會很減分。
另一個很能夠體現(xiàn)工程素養(yǎng)的點(diǎn)是:解決實(shí)際問題的思路。比如當(dāng)面試官考察一些工程代碼時,題目可能比較模糊、宏大。這時候候選人如果能:
用一些計(jì)算機(jī)常識,將模糊地帶進(jìn)行確定化。比如題目不要求基于內(nèi)存還是文件,我們都先假設(shè)都在內(nèi)存中,然后跟面試官說下利用 WAL 和 SnapShot 等方法應(yīng)對宕機(jī)即可。
做一些簡單假設(shè),將問題域進(jìn)行收束。比如數(shù)據(jù)類型不確定時,我們可以假設(shè)是最簡單的整形;又如文件數(shù)據(jù)格式不確定時,我們可以假設(shè)一行一個數(shù)據(jù)。
抽象出基本模塊,先走通宏觀思路。也就是做項(xiàng)目時常用的最小可用原型思想,將每個子問題(比如讀寫文件、排序等)模塊化,使用最簡單實(shí)現(xiàn)、甚至?xí)簳r留白,從而專注主干邏輯搭建,迅速實(shí)現(xiàn)一個可用的原型,爾后再跟面試官討論,對需要的模塊進(jìn)行優(yōu)化。
其中,最后一點(diǎn)非常重要,因?yàn)槊嬖嚂r間通常都很有限,如果你很快陷入某一塊的工程細(xì)節(jié)中,比如如何讀寫文件、如何取舍 buffer 大小、如何處理 offset ,輕則時間到了還寫不完、重則由于緊張陷進(jìn)去根本出不來。這時候一定要注意使用最小可用模型、自頂向下逐步求精等思想,因?yàn)檫@也是我們在實(shí)際工作中完成任務(wù)常見的思想,是非常能夠體現(xiàn)工程素養(yǎng)的一個側(cè)面。
誤區(qū)三:溝通思維無
本篇文章出自我的持續(xù)更新的小報(bào)童技術(shù)專欄:《系統(tǒng)日知錄》,還剩下兩小段,歡迎前往??專欄:https://xiaobot.net/p/system-thinking 訂閱查看。
專欄每周兩更,專注分布式系統(tǒng)、存儲、數(shù)據(jù)庫方向,現(xiàn)有文章列表如下,歡迎訂閱支持。


參考資料
[1]
排序算法: https://www.zhihu.com/question/51337272/answer/125385355
題圖故事
