炸裂!前浪老狗工作這5年遇到的面試題們,建議老鐵們收藏&研讀
掃描二維碼
隨時隨地手機看文章
攝于:19年9月廣州飛北京
0.先嘮嘮嗑
Paxos文章跳票了。
最近總是鴿,寫作也鴿,跑步也鴿,更別提擺地攤了,倒是最近標題黨的感覺越來越重了,主要是怕各位老鐵錯過這篇干貨...
所以就得反思一下為什么最近總鴿?說到底時間都被我浪費了。
根據(jù)以往的經(jīng)驗,工作時找個隔音非常好的耳機,然后把手機扔得遠一點,睡前也把手機扔遠點,是可以提高時間利用效率的。
想起幾年前準備考研的時候,就用只能打電話發(fā)短信的手機,充一次電用好幾天,自己對時間的把控力也就好很多,現(xiàn)在看還是各種壞習慣太多了,時間也都給浪費掉了。
但是不要走極端,閉門造成更可怕,所以合理利用時間是很重要的,好像聞到了雞湯的味道。
每次長假回到老家,早上6點多就起來,然后忙很久看時間才10點,瞬間覺得時間被拉長了很多,感覺賺到了,但是一回北京就繼續(xù)晚睡晚起,但是我還是十分渴望一種健康的田園式作息的。
扯了這么多,只是想當個反面教材,和盆友們共勉一下:早睡早起 遠離手機 提高技能 努力賺錢。
所以今天和老鐵們聊聊面試的一些問題和觀點,為提高收入做點準備,題目基本上都是工作這些年自己遇到的或者身邊好友遇到的,所以整理了一下。
先看一張非常有名的圖片暗淡藍點(維基百科):
暗淡藍點是旅行者1號拍下的有史以來第一張?zhí)栂导易逭盏囊徊糠帧?/p>
從距離地球40億英里,黃道上方32°的地方,拍攝了60幅畫面,最后拼接成太陽系照片。
在遙遠的旅行者1號眼里,地球只是一個光點,即使在窄角鏡頭里,也小于1個像素,新月形的地球只有0.12個像素那么大。
很巧的是,地球正好就在靠近太陽的一道散射光線中間。
1.面試心法
1.1 不打無準備之仗
知己知彼百戰(zhàn)不殆,面試之前需要在拉勾、BOSS直聘上大致了解一下招聘崗位的工作描述,不排除一些公司虛張聲勢寫些個根本用不著的玩意,所以如果覺得崗位對口卻匹配度低,也不必緊張試試再說。
內(nèi)推是了解崗位要求的重要渠道,不過從經(jīng)驗看如果不是內(nèi)推人本組的招聘崗位,很難做到深入細致的了解,總起來說這樣的內(nèi)推和在線投遞差別并不太大,不要以為內(nèi)推就穩(wěn)了,否則筆者內(nèi)推獎金早拿到手軟了。
另外相同崗位不同級別考察的側(cè)重點也有很大區(qū)別,因此要根據(jù)意向崗位級別在深度和廣度上進行差異化準備。
1.2 面試官什么路子
一百場面試就有一百種側(cè)重點,但并不能都算得上高質(zhì)量的面試,知乎上有關(guān)于高質(zhì)量面試的話題,感興趣可以看看。
https://www.zhihu.com/question/60911582
作為主導者的面試官,個人認為最重要的原則是:明確在招崗位的職責內(nèi)容,并以此為出發(fā)點對候選人進行考察,一般來說候選人過往經(jīng)歷和在招崗位很相似的情況比較少,在此情況下就要從候選人的基礎(chǔ)是否扎實、學習能力如何等方面來衡量候選人快速適應(yīng)新崗位內(nèi)容的能力。
舉個例子:"并不一定要把1TB的硬盤裝滿才能證明這個硬盤是1TB的"
因此很多時候面試就像是一場證明500GB硬盤具備1TB空間的過程,至于測試手段是否科學就是面試官需要拿捏的了。
如果面試官都不清楚自己問這個問題究竟是為了考察什么,那么這就是一場低質(zhì)量的面試,所以對于候選人來說成敗與否都不用在意,畢竟這種糊涂面試官如果以后作為同事也是件很糟糕的事情。
1.3 做個合格的面試者
-
珍惜機會切忌裸面
-
理清思路清晰表達
-
拓展思維勇敢作答
-
相信自己信心滿滿
我對此深有體會,筆者本碩都非CS專業(yè)且有一定跨度,遙想當年校招隔壁實驗室一起打球的CS碩們收割大廠offer,我這邊就算小公司也會被鄙視一通,所以無論現(xiàn)境如何, 堅定信念、找準方向、持續(xù)發(fā)力、總會有所斬獲。
2.實戰(zhàn)題目
2.1 題目分類
-
數(shù)據(jù)結(jié)構(gòu)和算法 -
數(shù)據(jù)庫存儲 -
Linux系統(tǒng) -
開源組件 -
工程設(shè)計
2.2 題目匯總
2.2.1 編程語言
-
闡述如何設(shè)計一個C++類?實現(xiàn)String類。 -
談?wù)剬++虛函數(shù)機制的理解。 -
STL的Vector原理及迭代器失效的理解。 -
設(shè)計一個C++HashMap類。 -
使用C++實現(xiàn)一個堆的模板類。 -
寫一個宏定義比較函數(shù)并解釋宏展開過程。 -
談?wù)剆td::move的理解和使用。 -
malloc的內(nèi)存可以用delete釋放嗎?原因? -
簡述C++11的新特性以及解決了什么問題。 -
STL的Map原理、插入和刪除復雜度分析。 -
STL的Map基于紅黑樹實現(xiàn)的原因,為什么不選擇哈希表? -
為什么需要虛析構(gòu)?虛析構(gòu)和普通析構(gòu)函數(shù)的區(qū)別是什么? -
說明C++對象的內(nèi)存布局模型。 -
聊聊C++臨時對象和右值引用,寫個例子。 -
使用C++寫一個高效的多維矩陣乘法。 -
談?wù)剬χ悄苤羔樀恼J識并實現(xiàn)一個智能指針類。 -
STL中Map的查找時[]和find區(qū)別是什么?哪個更快? -
實現(xiàn)memcpy函數(shù)效率盡可能高。 -
嘗試實現(xiàn)C/C++中常用字符串庫函數(shù)。 -
談?wù)凜++中強制類型轉(zhuǎn)換的原理和使用,寫個例子。 -
談?wù)凜++的設(shè)計模式,重點介紹下單例模式、工程模式等。
2.2.2 數(shù)據(jù)結(jié)構(gòu)和算法
-
求二叉樹節(jié)點和為N的所有路徑。 -
實現(xiàn)二叉樹的鏡像。 -
實現(xiàn)兩棵二叉樹相加生成一棵新的二叉樹。 -
實現(xiàn)單鏈表的遞歸逆置和非遞歸逆置。 -
二分查找變種問題。 -
二叉樹的后序非遞歸遍歷。 -
兩個無序整型數(shù)組交換元素使得兩數(shù)組和差距最小。 -
給定整型數(shù)組和目標數(shù)輸出數(shù)組所有兩數(shù)之和為目標數(shù)的組合。 -
找到帶權(quán)重二叉樹中從根到葉子的最大和路徑。 -
最長公共子序列LCS問題。 -
二叉樹中找到指定兩個節(jié)點最近公共祖先。 -
實現(xiàn)堆排序求Top10數(shù)據(jù)。 -
實現(xiàn)最小棧。 -
簡述并嘗試設(shè)計一個布隆過濾器。 -
外排序的基本實現(xiàn)過程。 -
常見排序算法的性能對比。 -
快速排序的非遞歸實現(xiàn)
2.2.3 數(shù)據(jù)庫存儲
-
談?wù)剬τ赗edis的底層數(shù)據(jù)結(jié)構(gòu)的理解。 -
跳表了解嗎?Redis的zset實現(xiàn)原理以及為什么不用紅黑樹。 -
Redis哨兵原理以及集群版故障轉(zhuǎn)移過程。 -
基于Redis實現(xiàn)分布式鎖。 -
Redis漸進式Rehash的實現(xiàn)原理。 -
Redis和LevelDB的區(qū)別以及LevelDB的LSM樹和WAL原理。 -
Redis主從同步的實現(xiàn)原理和過程、產(chǎn)生數(shù)據(jù)丟失的原因。 -
MyISAM和InnoDB的區(qū)別。 -
MySQL索引原理和優(yōu)化。 -
Redis集群版如何實現(xiàn)一致性Hash算法的。 -
Redis的單線程網(wǎng)絡(luò)框架原理和混合持久化機制。 -
類Redis數(shù)據(jù)庫Pika了解嗎?基本設(shè)計架構(gòu)是什么? -
如何設(shè)計一個緩存系統(tǒng)以及緩存擊穿的解決方案? -
一致性協(xié)議raft/paxos/2pc/3pc基本原理。 -
Redis的Gossip協(xié)議原理。 -
Redis4.0+版本的BIO線程原理和使用。 -
簡述如何自己實現(xiàn)一個NoSQL,需要考慮什么。
2.2.4 Linux系統(tǒng)
-
LVS實現(xiàn)負載均衡的原理。 -
簡述Linux內(nèi)存管理原理以及伙伴算法和Slab算法。 -
select和epoll的對比以及epoll實現(xiàn)的底層原理和數(shù)據(jù)結(jié)構(gòu)。 -
epoll的LT模式和ET模式下讀寫操作,實現(xiàn)一下ET模式的read/write。 -
使用C++簡單實現(xiàn)一個生產(chǎn)者消費者模型。 -
Linux虛擬內(nèi)存和物理內(nèi)存的區(qū)別與聯(lián)系 -
如何使用gdb調(diào)試多進程、多線程程序。 -
談?wù)凜10K和C10M問題及大致實現(xiàn)思路。 -
Linux地址復用和端口復用的使用。 -
談?wù)凴eactor和Proactor模式區(qū)別與聯(lián)系。 -
嘗試基于epoll實現(xiàn)一個高并發(fā)網(wǎng)絡(luò)框架。 -
Nginx的基本原理以及負載均衡實現(xiàn)方法。 -
談?wù)凩inux服務(wù)器內(nèi)存/cpu/磁盤/網(wǎng)絡(luò)帶寬的監(jiān)控命令和問題排查。 -
談?wù)凜AP理論以及分布式一致性算法。 -
了解CpuCache嗎,如何據(jù)此來優(yōu)化代碼。 -
讀寫鎖、RCU鎖、自旋鎖的對比以及設(shè)計讀優(yōu)先/寫優(yōu)先的讀寫鎖。 -
自己設(shè)計實現(xiàn)一個簡單的讀寫鎖。 -
談?wù)刧rpc的使用以及brpc的對比。 -
對比協(xié)程和進線程,重點說明系統(tǒng)開銷差異和各自優(yōu)缺點。 -
談?wù)剬€程同步和多線程安全的理解。 -
Https的C/S交互過程、http1.0/2.0/3.0的對比。 -
多進程通信的方法和對比。 -
多線程同步的實現(xiàn)和線程安全。 -
實現(xiàn)一個基于LRU的本地緩存。 -
TCP/IP的擁塞控制原理和缺陷、BBR算法對比。 -
使用Python實現(xiàn)多進程和多線程以及談?wù)剬IL的理解。 -
網(wǎng)絡(luò)攻擊有哪些?簡述DDos、CC攻擊。 -
對比內(nèi)存分配malloc/tcmalloc/ptmalloc。 -
Protobuf協(xié)議的簡單原理和使用。 -
Coredump的常見原因。 -
死鎖的原理以及寫一個死鎖。 -
MapReduce的基本原理、寫個簡單的map和reduce的程序。 -
同步異步阻塞非阻塞IO的理解。 -
git的基本原理以及常用命令。 -
局部性hash算法simhash的原理。 -
服務(wù)端長短連接的區(qū)別、優(yōu)勢和場景。 -
如何避免多線程的虛假喚醒問題。 -
實現(xiàn)簡單的線程池和連接池。 -
實現(xiàn)一個可以完成C10K+的TCP網(wǎng)絡(luò)框架。 -
嘗試多種方法實現(xiàn)一個守護進程,2 magic fork了解嗎? -
驚群問題知道嗎?Nginx是如何解決的? -
談?wù)剬Ψ?wù)治理和服務(wù)發(fā)現(xiàn)的理解。 -
微服務(wù)接觸過嗎?談?wù)剬ξ⒎?wù)的理解。 -
服務(wù)異步化編程了解過嗎?
2.2.5 開源組件
-
常用的MQ有哪些以及各自的對比和場景 -
Kafka的基本原理和實現(xiàn)要點 -
libevent/libuv的基本原理和使用 -
Boost.Asio的原理和使用 -
微信協(xié)程庫libco原理和使用 -
DPDK的基本原理和用戶態(tài)協(xié)議棧的概念 -
Redis和Memcached對比 -
RPC框架對比:brpc/grpc/thrift -
STL源碼的理解和閱讀分析 -
Nginx的架構(gòu)、原理、使用
注:開源組件的問題一般都比較寬泛,因此沒有列舉太多具體問題。
2.2.6 工程設(shè)計
-
詞庫每個詞都有根據(jù)點擊率來計算的熱度,實現(xiàn)一個系統(tǒng),支持前綴匹配并且返回Top10的熱詞。 -
簡述如何設(shè)計一個支持千萬級文章相似度去重的程序,來實現(xiàn)抄襲、洗稿文章的識別,時間ms級,準確率不低于90%。 -
小內(nèi)存機器有兩個文件A和B,分別存放5億條均長64字節(jié)的url,試著找到A和B中所有重復的url。 -
嘗試實現(xiàn)一個簡單的音樂推薦系統(tǒng),可以不涉及具體算法,主要說明工程部分即可。 -
設(shè)計一個黑詞服務(wù)實現(xiàn)黃反、指令詞、敏感詞等過濾功能,耗時ms級。 -
設(shè)計一個類似于微信運動的功能,包含占領(lǐng)封面/七日排行榜等。
工程設(shè)計題目一般會是面試官日常遇到的典型問題,類型很多,但是系統(tǒng)設(shè)計類問題經(jīng)常和海量數(shù)據(jù)問題、堆排序等一起出現(xiàn)。
對于此類問題,重要的是明確功能點、找準解題方向、拆解子問題、分步驟合并、各個擊破、先實現(xiàn)再提優(yōu)化方案,以此原則來解決工程設(shè)計問題,基本上就很接近答案了。
這類題目其實還是很考驗架構(gòu)能力的,所以平時要多思考產(chǎn)品模式和技術(shù)點,算是個好習慣吧。
3.小結(jié)和感慨
特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點個在看,誠摯感謝
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!