文中的我欢搜,不是 chenssy 封豪,而是作者本人。很多我都想進(jìn)大廠炒瘟,也都知道進(jìn)大廠很難很難吹埠,而且面試周期也長(筆試、初試疮装、復(fù)試缘琅、終試)。今天給大家?guī)碜髡叩娜纟Z廠的經(jīng)歷廓推,希望對(duì)大家有所幫助刷袍,有所借鑒!樊展!
經(jīng)過半年的沉淀呻纹,加上對(duì)MySQL,redis和分布式這塊的補(bǔ)齊专缠,終于重拾面試信心雷酪,再次出征。
鵝廠
面試職位:go后端開發(fā)工程師涝婉,接受從Java轉(zhuǎn)語言
都知道鵝廠是cpp的主戰(zhàn)場哥力,而以cpp為背景的工程師大都對(duì)os,network這塊要求特別高墩弯,不像是Java這種偏重業(yè)務(wù)層的語言.
之前面試Java的公司側(cè)重還是在數(shù)據(jù)結(jié)構(gòu)吩跋、網(wǎng)絡(luò)、框架渔工、數(shù)據(jù)庫和分布式钞澳。所以O(shè)S這塊吃的虧比較大
一面:基礎(chǔ)技術(shù)面
電話面試,隨便問了些技術(shù)問題涨缚,最后還問了個(gè)LeetCode里面medium級(jí)別的算法題轧粟,偏簡單。大概整理回憶了一下:
redis有沒有用過脓魏,常用的數(shù)據(jù)結(jié)構(gòu)以及在業(yè)務(wù)中使用的場景兰吟。
redis的hash怎么實(shí)現(xiàn)的?
rehash過程講一下和JavaHashMap的rehash有什么區(qū)別茂翔?
redis cluster有沒有了解過混蔼,怎么做到高可用的?
說說redis的持久化機(jī)制珊燎,為啥不能用redis做專門的持久化數(shù)據(jù)庫存儲(chǔ)惭嚣?
了不了解tcp/udp遵湖,說下兩者的定義,tcp為什么要三次握手和四次揮手晚吞?
tcp怎么保證有序傳輸?shù)难泳桑v下tcp的快速重傳和擁塞機(jī)制
知不知道time_wait狀態(tài),這個(gè)狀態(tài)出現(xiàn)在什么地方槽地,有什么用迁沫?
udp是不可靠的傳輸,如果你來設(shè)計(jì)一個(gè)基于udp差不多可靠的算法捌蚊,怎么設(shè)計(jì)集畅?
http與https有啥區(qū)別?說下https解決了什么問題缅糟,怎么解決的挺智?說下https的握手過程。
看你項(xiàng)目里面用了etcd窗宦,講解下etcd干什么用的赦颇,怎么保證高可用和一致性?
既然你提到了raft算法迫摔,講下raft算法的基本流程?raft算法里面如果出現(xiàn)腦裂怎么處理泥从?
有沒有了解過paxos和zookeeper的zab算法句占,他們之前有啥區(qū)別?
你們后端用什么數(shù)據(jù)庫做持久化的躯嫉?有沒有用到分庫分表纱烘,怎么做的?
索引的常見實(shí)現(xiàn)方式有哪些祈餐,有哪些區(qū)別?
MySQL的存儲(chǔ)引擎有哪些擂啥,有哪些區(qū)別?
InnoDB使用的是什么方式實(shí)現(xiàn)索引帆阳,怎么實(shí)現(xiàn)的哺壶?說下聚簇索引和非聚簇索引的區(qū)別?
有沒有了解過協(xié)程?說下協(xié)程和線程的區(qū)別蜒谤?
算法題一個(gè)山宾,劍指offer第51題,數(shù)組中的重復(fù)數(shù)字鳍徽?
從上面的情況來看资锰,面試大廠redis/MySQL都是比較重要的,大概說下我自己的回答情況阶祭,redis這塊沒啥問題绷杜,具體rehash有印象是漸進(jìn)式的直秆,但是具體原理可能答的有點(diǎn)出入。
tcp的 time_wait 這塊答的不是很好鞭盟,之前沒有了解過quic機(jī)制的實(shí)現(xiàn)圾结,所以問可靠性u(píng)dp的時(shí)候,基本上腦子里就照著tcp的實(shí)現(xiàn)在說懊缺。
https這塊沒啥說的疫稿,之前項(xiàng)目里面有用到類似的東西,研究的比較清楚了鹃两。
raft算法這個(gè)因?yàn)閯偤迷谒?.824(才刷到lab2遗座。。俊扳。)途蒋,答的也湊合,不過paxos和zab算法確實(shí)不熟悉馋记,直接說不會(huì)号坡。
MySQL這塊很熟了,包括索引梯醒,鎖宽堆,事務(wù)機(jī)制以及mvcc等等,沒啥說的茸习,都已經(jīng)補(bǔ)齊了畜隶。
協(xié)程和線程,主要說了go程和Java線程的區(qū)別以及go程的調(diào)度模型号胚。面試官提示沒有提到線程的有內(nèi)核態(tài)的切換籽慢,go程只在用戶態(tài)調(diào)度。
最后一個(gè)算法題猫胁,首先說使用HashMap來做箱亿,說空間復(fù)雜度能不能降到O(1),后面想了大概5min才想出來原地置換的思路弃秆。
總得來說届惋,答的還行,一面就這么過了菠赚。
二面:項(xiàng)目技術(shù)面
二面從基礎(chǔ)技術(shù)考察轉(zhuǎn)移到了項(xiàng)目盼樟,主要問了我下面一些問題:
針對(duì)自己最熟悉的項(xiàng)目,畫出項(xiàng)目的架構(gòu)圖锈至,項(xiàng)目主要的數(shù)據(jù)表結(jié)構(gòu)晨缴。
說說項(xiàng)目中使用到的技術(shù)點(diǎn),項(xiàng)目的總峰值qps峡捡,時(shí)延击碗。
有沒有分析過時(shí)延出現(xiàn)的耗時(shí)分別出現(xiàn)在什么地方筑悴,項(xiàng)目有啥改進(jìn)的地方?jīng)]有?
如果請求出現(xiàn)問題沒有響應(yīng)稍途,如何定位問題阁吝,說下思路?
tcp 粘包問題怎么處理械拍?
然后還問了下緩存更新的模式突勇,以及會(huì)出現(xiàn)的問題和應(yīng)對(duì)思路?
除了公司項(xiàng)目之外坷虑,業(yè)余時(shí)間有沒有研究過知名項(xiàng)目或做出過貢獻(xiàn)甲馋?
這一面答的也比較順利,因?yàn)槎际菄@項(xiàng)目迄损,自己很熟悉定躏,基本都沒有啥問題,除了面試官說項(xiàng)目經(jīng)驗(yàn)稍弱之外芹敌,其余還不錯(cuò)痊远。
三面:綜合技術(shù)面
這面面的是陣腳大亂,面試官采用刨根問底的方式提問氏捞,終究是面試經(jīng)驗(yàn)不夠碧聪,導(dǎo)致面試的節(jié)奏有點(diǎn)亂。舉個(gè)例子:
其中有個(gè)題:go程和線程有什么區(qū)別液茎?
答:起一個(gè)go程大概只需要4kb的內(nèi)存逞姿,起一個(gè)Java線程需要1.5MB的內(nèi)存;go程的調(diào)度在用戶態(tài)非常輕量豁护,Java線程的切換成本比較高哼凯。
接著問為啥成本比較高欲间?因?yàn)镴ava線程的調(diào)度需要在用戶態(tài)和內(nèi)核態(tài)切換所以成本高楚里?為啥在用戶態(tài)和內(nèi)核態(tài)之間切換調(diào)度成本比較高?我簡單說了下內(nèi)核態(tài)和用戶態(tài)的定義猎贴。
接著問班缎,還是沒有明白為啥成本高?心里瞬間崩潰她渴,沒完沒了了呀达址,OS這塊依舊是痛呀,支支吾吾半天放棄了趁耗。
后面所有的提問都是這種模式沉唠,結(jié)果回答的節(jié)奏全無,感覺被套路了苛败。大多度都能回答個(gè)一二甚至是一二三满葛,但是再往后或者再深入的OS層面就GG了径簿。
后面問了下項(xiàng)目過程中遇到的最大的挑戰(zhàn),以及怎么解決的嘀韧?
還問了一個(gè)問題定位的問題篇亭,服務(wù)器CPU 100%怎么定位?
可能是由于平時(shí)定位業(yè)務(wù)問題的思維定勢锄贷,加之處于蒙蔽狀態(tài)译蒂,隨口就是:
先查看監(jiān)控面板看有無突發(fā)流量異常
接著查看業(yè)務(wù)日志是否有異常,針對(duì)CPU100%那個(gè)時(shí)間段谊却,取一個(gè)典型業(yè)務(wù)流程的日志查看
最后才提到使用top命令來監(jiān)控看是哪個(gè)進(jìn)程占用到100%
果然陣腳大亂柔昼,張口就來,捂臉因惭。岳锁。。?
對(duì)這個(gè)問題蹦魔,本來正確的思路應(yīng)該是先用top定位出問題的進(jìn)程激率,再用top定位到出問題的線程,再打印線程堆棧查看運(yùn)行情況
這個(gè)流程換平時(shí)肯定能答出來勿决,但是乒躺,但是沒有但是。還是得好好總結(jié)低缩。
最后問了一個(gè)系統(tǒng)設(shè)計(jì)題目(朋友圈的設(shè)計(jì))嘉冒,白板上面畫出系統(tǒng)的架構(gòu)圖,主要的表結(jié)構(gòu)和講解主要的業(yè)務(wù)流程咆繁,如果用戶變多流量變大讳推,架構(gòu)將怎么擴(kuò)展,怎樣應(yīng)對(duì)玩般?
這個(gè)答的也有點(diǎn)亂银觅,直接上來自顧自的用了一個(gè)通用的架構(gòu),感覺毫無亮點(diǎn)坏为。
后面反思應(yīng)該先定位業(yè)務(wù)的特點(diǎn)究驴,這個(gè)業(yè)務(wù)明顯是讀多寫少。然后和面試官溝通一期剛開始的方案的用戶量匀伏,性能要求洒忧,單機(jī)目標(biāo)qps是什么等等?
在明確系統(tǒng)的特點(diǎn)和約束之后再來設(shè)計(jì)够颠,而不是一開始就是用典型互聯(lián)網(wǎng)的那種通用架構(gòu)自顧自己搞自己的方案熙侍。
面試結(jié)果:3天后收到短信,被拒
總結(jié):
tcp/udp,http和https還有網(wǎng)絡(luò)這塊(各種網(wǎng)絡(luò)模型蛉抓,已經(jīng)select牢硅,poll和epoll)一定要非常熟悉「大廠對(duì)基礎(chǔ)的要求還是非常高的,所以基礎(chǔ)很重要」芝雪。
一定要有拿的出手的項(xiàng)目經(jīng)驗(yàn)减余,而且要能夠講清楚,講清楚項(xiàng)目中取舍惩系,設(shè)計(jì)模型和數(shù)據(jù)表「說明項(xiàng)目經(jīng)驗(yàn)很重要」位岔。
分布式要非常熟悉「進(jìn)大廠必備的技能啊」。
常見問題定位一定要有思路「思路決定一切」堡牡。
操作系統(tǒng)抒抬,還是操作系統(tǒng),重要的事情說三遍「底層的重要性」晤柄。
系統(tǒng)設(shè)計(jì)擦剑,思路,思路芥颈,思路惠勒,一定要思路清晰,一定要總結(jié)下系統(tǒng)設(shè)計(jì)的流程「說明一定要有自己的獨(dú)特的見解與想法」爬坑。
一點(diǎn)心得纠屋,平時(shí)blog和專欄看的再多,如果沒有自己的思考不過是過眼云煙盾计,根本不會(huì)成為自己的東西售担,就像內(nèi)核態(tài)和用戶態(tài),平常也看過署辉,但是沒細(xì)想族铆,突然要自己說,還真說不出來哭尝,這就很尷尬了哥攘。勿以浮沙筑高臺(tái),基礎(chǔ)這種東西還是需要時(shí)間去慢慢打牢刚夺,多去思考和總結(jié)「知識(shí)源于自已的思考與總結(jié)」献丑。
作者:codegoose
https://segmentfault.com/a/1190000017864721