天天看點

3年Java,鏖戰騰訊

3年Java,鏖戰騰訊

作者:codegoose

https://segmentfault.com/a/1190000017864721

經過半年的沉澱,加上對MySQL,redis和分布式這塊的補齊,終于重拾面試信心,再次出征。

鵝廠

面試職位:go後端開發工程師,接受從Java轉語言

都知道鵝廠是cpp的主戰場,而以cpp為背景的工程師大都對os,network這塊要求特别高,不像是Java這種偏重業務層的語言.

之前面試Java的公司側重還是在資料結構、網絡、架構、資料庫和分布式。是以OS這塊吃的虧比較大

一面:**基礎技術面**

電話面試,随便問了些技術問題,最後還問了個LeetCode裡面medium級别的算法題,偏簡單。大概整理回憶了一下:

redis有沒有用過,常用的資料結構以及在業務中使用的場景。

redis的hash怎麼實作的?

rehash過程講一下和JavaHashMap的rehash有什麼差別?

redis cluster有沒有了解過,怎麼做到高可用的?

說說redis的持久化機制,為啥不能用redis做專門的持久化資料庫存儲?

了不了解tcp/udp,說下兩者的定義,tcp為什麼要三次握手和四次揮手?

tcp怎麼保證有序傳輸的,講下tcp的快速重傳和擁塞機制

知不知道time_wait狀态,這個狀态出現在什麼地方,有什麼用?

udp是不可靠的傳輸,如果你來設計一個基于udp差不多可靠的算法,怎麼設計?

http與https有啥差別?說下https解決了什麼問題,怎麼解決的?說下https的握手過程。

看你項目裡面用了etcd,講解下etcd幹什麼用的,怎麼保證高可用和一緻性?

既然你提到了raft算法,講下raft算法的基本流程?raft算法裡面如果出現腦裂怎麼處理?

有沒有了解過paxos和zookeeper的zab算法,他們之前有啥差別?

你們後端用什麼資料庫做持久化的?有沒有用到分庫分表,怎麼做的?

索引的常見實作方式有哪些,有哪些差別?

MySQL的存儲引擎有哪些,有哪些差別?

InnoDB使用的是什麼方式實作索引,怎麼實作的?說下聚簇索引和非聚簇索引的差別?

有沒有了解過協程?說下協程和線程的差別?

算法題一個,劍指offer第51題,數組中的重複數字?

大概說下我自己的回答情況,redis這塊沒啥問題,具體rehash有印象是漸進式的,但是具體原理可能答的有點出入。

tcp的 time_wait 這塊答的不是很好,之前沒有了解過quic機制的實作,是以問可靠性udp的時候,基本上腦子裡就照着tcp的實作在說。

https這塊沒啥說的,之前項目裡面有用到類似的東西,研究的比較清楚了。

raft算法這個因為剛好在刷6.824(才刷到lab2。。。),答的也湊合,不過paxos和zab算法确實不熟悉,直接說不會。

MySQL這塊很熟了,包括索引,鎖,事務機制以及mvcc等等,沒啥說的,都已經補齊了。

協程和線程,主要說了go程和Java線程的差別以及go程的排程模型。面試官提示沒有提到線程的有核心态的切換,go程隻在使用者态排程。

最後一個算法題,首先說使用HashMap來做,說空間複雜度能不能降到O(1),後面想了大概5min才想出來原地置換的思路。

總得來說,答的還行,一面就這麼過了。

二面:**項目技術面**

二面從基礎技術考察轉移到了項目,主要問了我下面一些問題:

針對自己最熟悉的項目,畫出項目的架構圖,項目主要的資料表結構。

說說項目中使用到的技術點,項目的總峰值qps,時延。

有沒有分析過時延出現的耗時分别出現在什麼地方,項目有啥改進的地方沒有?

如果請求出現問題沒有響應,如何定位問題,說下思路?

tcp 粘包問題怎麼處理?

然後還問了下緩存更新的模式,以及會出現的問題和應對思路?

除了公司項目之外,業餘時間有沒有研究過知名項目或做出過貢獻?

這一面答的也比較順利,因為都是圍繞項目,自己很熟悉,基本都沒有啥問題,除了面試官說項目經驗稍弱之外,其餘還不錯。

三面:**綜合技術面**

這面面的是陣腳大亂,面試官采用刨根問底的方式提問,終究是面試經驗不夠,導緻面試的節奏有點亂。舉個例子:

其中有個題:go程和線程有什麼差別?

答:起一個go程大概隻需要4kb的記憶體,起一個Java線程需要1.5MB的記憶體;go程的排程在使用者态非常輕量,Java線程的切換成本比較高。

接着問為啥成本比較高?因為Java線程的排程需要在使用者态和核心态切換是以成本高?為啥在使用者态和核心态之間切換排程成本比較高?我簡單說了下核心态和使用者态的定義。

接着問,還是沒有明白為啥成本高?心裡瞬間崩潰,沒完沒了了呀,OS這塊依舊是痛呀,支支吾吾半天放棄了。

後面所有的提問都是這種模式,結果回答的節奏全無,感覺被套路了。大多度都能回答個一二甚至是一二三,但是再往後或者再深入的OS層面就GG了。

後面問了下項目過程中遇到的最大的挑戰,以及怎麼解決的?

還問了一個問題定位的問題,伺服器CPU 100%怎麼定位?

可能是由于平時定位業務問題的思維定勢,加之處于蒙蔽狀态,随口就是:

先檢視監控面闆看有無突發流量異常

接着檢視業務日志是否有異常,針對CPU100%那個時間段,取一個典型業務流程的日志檢視

最後才提到使用top指令來監控看是哪個程序占用到100%

果然陣腳大亂,張口就來,捂臉。。。

對這個問題,本來正确的思路應該是先用top定位出問題的程序,再用top定位到出問題的線程,再列印線程堆棧檢視運作情況

這個流程換平時肯定能答出來,但是,但是沒有但是。還是得好好總結。

最後問了一個系統設計題目(朋友圈的設計),白闆上面畫出系統的架構圖,主要的表結構和講解主要的業務流程,如果使用者變多流量變大,架構将怎麼擴充,怎樣應對?

這個答的也有點亂,直接上來自顧自的用了一個通用的架構,感覺毫無亮點。

後面反思應該先定位業務的特點,這個業務明顯是讀多寫少。然後和面試官溝通一期剛開始的方案的使用者量,性能要求,單機目标qps是什麼等等?

在明确系統的特點和限制之後再來設計,而不是一開始就是用典型網際網路的那種通用架構自顧自己搞自己的方案。

面試結果:**3天後收到短信,被拒**

總結:

tcp/udp,http和https還有網絡這塊(各種網絡模型,已經select,poll和epoll)一定要非常熟悉

一定要有拿的出手的項目經驗,而且要能夠講清楚,講清楚項目中取舍,設計模型和資料表

分布式要非常熟悉

常見問題定位一定要有思路

作業系統,還是作業系統,重要的事情說三遍

系統設計,思路,思路,思路,一定要思路清晰,一定要總結下系統設計的流程

一點心得,平時blog和專欄看的再多,如果沒有自己的思考不過是過眼雲煙,根本不會成為自己的東西,就像核心态和使用者态,平常也看過,但是沒細想,突然要自己說,還真說不出來,這就很尴尬了。勿以浮沙築高台,基礎這種東西還是需要時間去慢慢打牢,多去思考和總結。

關注Java技術棧微信公衆号,在背景回複關鍵字:面試,可以擷取一份棧長整理的 Java 面試幹貨。

推薦去我的部落格閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿裡巴巴等大廠最新面試題

生活很美好,明天見~