NLP 轉(zhuǎn)后端開(kāi)發(fā),順利拿到字節(jié)實(shí)習(xí) offer!!
分享一位學(xué)弟的面經(jīng)分享,寫(xiě)的很棒,希望能對(duì)你有參考價(jià)值!
下面是正文(文中的我并非 Guide 本人)。
簡(jiǎn)單介紹一下我的基本情況,上海雙非本 + 985 碩,目前在讀研二。本科 + 研究生大部分時(shí)間都在搞算法, NLP 相關(guān),今年終于認(rèn)識(shí)到了理想和現(xiàn)實(shí)的差距,遂在 5 月份下定決心轉(zhuǎn)后端開(kāi)發(fā)。之后處理一些事情,暑假 7 月底的時(shí)候正式開(kāi)始學(xué)習(xí) Java,歷時(shí)三個(gè)月, 9 月底開(kāi)始投日常實(shí)習(xí),10 月 17 結(jié)束。面試過(guò)的公司包括:B 站,蔚來(lái),百度以及字節(jié),B 站掛在二面,其他均拿到日常實(shí)習(xí)的 Offer,最終選擇了字節(jié)跳動(dòng)。
從以上我的基本情況大家能看出,我的戰(zhàn)線比較短。但是在這些時(shí)間里,我的作息基本上都是早 7 晚 11,很辛苦。
這篇文章首先分享我的面試經(jīng)歷,后面的部分與大家分享我的學(xué)習(xí)經(jīng)驗(yàn)。
面經(jīng)部分
下面的部分總結(jié)了面試過(guò)程中被問(wèn)到的知識(shí)點(diǎn)(還記得的部分),以及我個(gè)人的一些心得體會(huì),供大家參考。
百度
百度給我的面試體驗(yàn)還是蠻好的,是我面試的所有公司中唯一一家對(duì)八股考察非常詳細(xì)的。一面是非常詳細(xì)的八股面試,涉及到 Java 基礎(chǔ)知識(shí)、數(shù)據(jù)庫(kù)、spring、jvm、多線程、場(chǎng)景設(shè)計(jì)等等,基本上準(zhǔn)備的都被問(wèn)過(guò)了,但是整體來(lái)說(shuō)難度不高,知識(shí)面比較廣但是不會(huì)深挖。二面來(lái)說(shuō)區(qū)別就非常大了,注重實(shí)踐能力的考查,而且會(huì)深入到底層原理。
面試之前會(huì)有自我介紹的環(huán)節(jié),包括項(xiàng)目介紹。百度兩面對(duì)我的項(xiàng)目提問(wèn)都不多,可能是我介紹項(xiàng)目的時(shí)候就比較詳細(xì)的原因。
接下來(lái)的部分是知識(shí)點(diǎn)整理:
百度一面(1h+):
- 常用 GC 算法,常用的垃圾收集器, G1 了解嗎
- 場(chǎng)景題:cpu 打滿且頻繁 full GC,怎么解決?
- 有 jvm 調(diào)優(yōu)的經(jīng)驗(yàn)嗎?實(shí)際工作中遇到過(guò)內(nèi)存相關(guān)的問(wèn)題嗎?用過(guò)哪些堆棧工具調(diào)試?
- Mysql 索引,數(shù)據(jù)結(jié)構(gòu)為什么使用 B+ 樹(shù)
- 索引覆蓋了解嗎
- 索引失效的場(chǎng)景
- 簡(jiǎn)單描述一下數(shù)據(jù)庫(kù)的四種隔離級(jí)別以及對(duì)應(yīng)的三種相關(guān)問(wèn)題
- MVCC + 鎖 保證隔離性
- 造成幻讀的原因了解嗎,快照讀、當(dāng)前讀。
- 數(shù)據(jù)庫(kù)自增 ID 和 UUID 對(duì)比
- HashMap 源碼,數(shù)據(jù)結(jié)構(gòu),如何避免哈希沖突,對(duì)比 HashTable
- HashMap 源碼中,計(jì)算 hash 值為什么有一個(gè) 高 16 位 和 低 16 位異或的過(guò)程?
- 為什么重寫(xiě) equals 還要重寫(xiě) hashCode,不重寫(xiě)會(huì)有什么問(wèn)題
- ConcurrentHashMap 底層實(shí)現(xiàn),擴(kuò)容問(wèn)題。
- 如果讓你自己實(shí)現(xiàn)哈希表,你會(huì)考慮什么問(wèn)題?
- 場(chǎng)景題:億級(jí)別黑名單、短鏈接,你考慮使用什么數(shù)據(jù)結(jié)構(gòu)?布隆過(guò)濾器、前綴樹(shù)。其中布隆過(guò)濾器問(wèn)了基本的原理和實(shí)現(xiàn)方式
- Java 引用類(lèi)型,強(qiáng)軟弱虛
- Java 是引用傳遞還是值傳遞
- Object 類(lèi)你了解哪些方法
- 接口和抽象類(lèi)的區(qū)別
- 線程池核心參數(shù),以及工作原理
- ReentrantLock 對(duì)比 sync 鎖
- lockInterruptibly()、acquire()、tryAcquire() 方法
- CAS 機(jī)制了解嗎,存在什么問(wèn)題
- 對(duì)象鎖和類(lèi)鎖的區(qū)別
- 如果讓你自己實(shí)現(xiàn)阻塞隊(duì)列,如何實(shí)現(xiàn)?阻塞喚醒這一部分,如何實(shí)現(xiàn)?
- ThreadLocal ,Volatile
- 看你項(xiàng)目中用到了 Netty,簡(jiǎn)單介紹下吧。這里還有個(gè) 問(wèn)題是問(wèn)到 Netty 和 SpringBoot 整合的,但我一直都沒(méi)理解她想問(wèn)什么
- 粘包拆包問(wèn)題,Netty 解決粘包拆包的 Decoder
- Spring 事務(wù)了解嗎,Spring 事務(wù)的注解不生效,是什么原因
- 算法題:手寫(xiě)快速排序,時(shí)間復(fù)雜度,穩(wěn)定性
整理感覺(jué)不錯(cuò),基本都答上來(lái)了,按照 Guide 哥星球里的內(nèi)容,認(rèn)真準(zhǔn)備就好。
百度二面(45 min):
- 看你項(xiàng)目中用了一致性哈希做負(fù)載均衡,簡(jiǎn)單介紹一下
- 項(xiàng)目中 CompletableFuture 如何使用的
- 算法題:給定一個(gè)字符串,找到其中最長(zhǎng)回文串
- 計(jì)網(wǎng)和組成原理學(xué)過(guò)吧,你認(rèn)為哪個(gè)掌握的好?我選了計(jì)網(wǎng)。這一部分問(wèn)的很深入,我沒(méi)來(lái)得及記錄,以下部分只是一些零散片段,但是整體問(wèn)的時(shí)候是有邏輯的。
- OSI 七層模型
- TCP 三次握手,四次揮手整個(gè)過(guò)程包括狀態(tài)的轉(zhuǎn)換。為什么是三次握手、四次揮手。發(fā)送 Fin ,實(shí)際的意義代表什么?(發(fā)送方?jīng)]有數(shù)據(jù)要發(fā)送了,可以斷開(kāi)連接)
- 四次揮手,為什么等待 2 MSL
- 流量控制、擁塞控制
- 后面關(guān)于網(wǎng)絡(luò)就更深入了,TCP 底層是怎么實(shí)現(xiàn)的,如果讓你用 Java 模擬 TCP 的過(guò)程,做一個(gè)仿真,你有什么想法。大學(xué)學(xué)習(xí)計(jì)網(wǎng)的時(shí)候,協(xié)議棧之類(lèi)的了解過(guò)嗎(這部分我都不懂,認(rèn)栽了)
- 看你項(xiàng)目中用到了 Spring,自動(dòng)裝配的過(guò)程了解嗎。
- Spring 啟動(dòng)類(lèi)的注解,介紹一下
- 因?yàn)槲翼?xiàng)目中用到了,所以被提問(wèn)了 Spring 二次開(kāi)發(fā)常用的擴(kuò)展點(diǎn),還涉及到了 Bean 的生命周期。BeanPostProcessor,在你項(xiàng)目中如何使用的
- Spring 中你常用哪些注解?Autowired 實(shí)現(xiàn)原理
計(jì)網(wǎng)仿真 TCP 以及后面深入的部分我不懂, Autowired 實(shí)現(xiàn)原理 沒(méi)說(shuō)清除,其余的都答上來(lái)了。
字節(jié)跳動(dòng)
在我整個(gè)的面試過(guò)程中,字節(jié)給我的體驗(yàn)是最好的。一面二面的面試官都非常好,面試的問(wèn)題、要求都說(shuō)的很清楚,需要注意的點(diǎn)都提前告訴了我,甚至二面的面試官會(huì)提醒我,"在回答問(wèn)題的時(shí)候這邊會(huì)有敲鍵盤(pán)的聲音,是我在記錄,不要影響你回答問(wèn)題。"對(duì)于初次求職面試,體驗(yàn)感拉滿。
除此之外,字節(jié)的面試和百度思路不一樣。百度是從八股出發(fā),引出一些實(shí)際場(chǎng)景遇到的問(wèn)題。字節(jié)幾乎沒(méi)有八股,是從項(xiàng)目出發(fā),結(jié)合工程經(jīng)驗(yàn),主要考察思考的過(guò)程,關(guān)鍵點(diǎn)答出來(lái)之后,結(jié)果對(duì)錯(cuò)可能不是很重要(這里是我主觀臆斷的)。
字節(jié)一面(1h):
- 自我介紹,項(xiàng)目部分主要介紹了 rpc 項(xiàng)目,后續(xù)的問(wèn)題都是基于這個(gè)項(xiàng)目
- rpc 遠(yuǎn)程調(diào)用的整個(gè)流程
- 項(xiàng)目中的 SPI 機(jī)制,介紹一下原理以及你做了哪些改進(jìn)
- 項(xiàng)目中用到了負(fù)載均衡算法,詳細(xì)介紹一下
- 一致性哈希的原理,虛擬結(jié)點(diǎn)
- 項(xiàng)目中的序列化方案,為什么序列化,你都了解哪些常用的序列化方法。
- 你項(xiàng)目中使用了 Kyro 序列化,優(yōu)點(diǎn)你提到了,缺點(diǎn)了解嗎
- 通信協(xié)議是你自己設(shè)計(jì)的,假如后面需要變更,比如添加新的字段,你項(xiàng)目中如何處理的?
- 服務(wù)的灰度發(fā)布介紹一下,如何實(shí)現(xiàn)的?
- Zookeeper 作為注冊(cè)中心,假如崩潰了怎么辦?這里開(kāi)始連環(huán)問(wèn)了
- 你提到了 Zookeeper 的一致性,它是如何保證的?
- ZAB 協(xié)議,選舉的過(guò)程,這里問(wèn)的很詳細(xì)
- Zookeeper 是強(qiáng)一致性嗎?
- 網(wǎng)絡(luò)分區(qū)了解嗎,CAP 理論
- Zookeeper 如何應(yīng)對(duì)網(wǎng)絡(luò)分區(qū)的,腦裂問(wèn)題了解嗎,如何解決?
- 假如我同一時(shí)間有大量服務(wù)發(fā)布,你提到了 Zookeeper 只有主節(jié)點(diǎn)負(fù)責(zé)寫(xiě), 怎么解決?假如主節(jié)點(diǎn)崩潰了,新選舉出的主節(jié)點(diǎn)仍然沒(méi)辦法面對(duì)我的大流量,也崩潰了,如何解決?
- MQ 的原理,你知道哪些 MQ,各自有什么特點(diǎn),什么時(shí)候需要用 MQ
- 你剛才提到了服務(wù)端保護(hù)機(jī)制,如何實(shí)現(xiàn)的?這里我答了限制連接數(shù)以及接口限流,基于責(zé)任鏈模式。之后問(wèn)了用到的令牌桶以外的常用限流算法。
- 算法題:鏈表反轉(zhuǎn),你知道的所有實(shí)現(xiàn)方式。這里我寫(xiě)了遞歸和非遞歸兩種。
整個(gè)面試的過(guò)程中大腦都是高速思考的,甚至從面試官的問(wèn)題中得到了好多啟發(fā),是背八股掌握不到的,體驗(yàn)非常好。面試的問(wèn)題幾乎都答上來(lái)了,有一些不太熟悉的在面試官的提醒下也都回憶起來(lái)了(這點(diǎn)非常 nice,其他面試不會(huì)就直接過(guò)了,而字節(jié)會(huì)認(rèn)真引導(dǎo)你,看你究竟掌握到什么程度)。事后 hr 小姐姐還告訴我面評(píng)非常好,鼓勵(lì)我認(rèn)真準(zhǔn)備二面。
字節(jié)二面(1h):
字節(jié)二面的經(jīng)歷比較魔幻了, 面試官在倫敦有時(shí)差,因此是晚上九點(diǎn)開(kāi)始面試的,由于面試官比較忙,整個(gè)面試過(guò)程比較簡(jiǎn)單,自我介紹 + 項(xiàng)目介紹之后簡(jiǎn)單提問(wèn)了幾個(gè)問(wèn)題(沒(méi)有印象深刻的技術(shù)問(wèn)題,這里就不重復(fù)整理了),溝通了一下實(shí)習(xí)時(shí)間,直接做算法題了。
- 算法題:有一個(gè) n * n 的棋盤(pán),每個(gè)格子有 RB@ 三個(gè)狀態(tài),R 表示紅色,B 表示藍(lán)色,@ 表示此路不通。機(jī)器人從左上角走到右下角,每次只有上下左右四個(gè)方向選擇,相同顏色之間沒(méi)有代價(jià),跨越不同顏色代價(jià)為 1,求解機(jī)器人從左上角走到右下角,最少的代價(jià)。
- 這里我用回溯求解的,很快就寫(xiě)出來(lái)了,思路也沒(méi)問(wèn)題。但是復(fù)雜度計(jì)算卡住了,在面試官多次且反復(fù)的提示下,算出來(lái)了。最后提問(wèn)環(huán)節(jié)面試官跟我說(shuō)后續(xù)優(yōu)化可以加一些剪枝操作
二面沒(méi)有遇到難度比較大的問(wèn)題,大部分時(shí)間都被我卡在了算時(shí)間復(fù)雜度(很菜勿噴)....
B 站
綜合來(lái)說(shuō),B 站面試給我的體驗(yàn)是非常差的,一面的時(shí)候我感覺(jué)還沒(méi)進(jìn)行比較深入的交流,問(wèn)了一些八股,很快就結(jié)束了。二面上來(lái)之后,問(wèn)了你覺(jué)得自己項(xiàng)目有什么亮點(diǎn)嗎,然后就來(lái)了一道 Hard 算法,又結(jié)束了.......
B 站一面(30 min)
- Rpc 遠(yuǎn)程調(diào)用的流程
- 一致性哈希算法詳細(xì)介紹
- 為什么選用 Zookeeper 作為注冊(cè)中心,注冊(cè)中心作用是什么
- 動(dòng)態(tài)代理
- Redis 在你項(xiàng)目中如何使用的,穿透、雪崩、擊穿了解嗎
- 你項(xiàng)目中用的是 RabbitMQ,為什么,和其他 MQ 對(duì)比如何?
- RabbitMQ 的原理
- 你項(xiàng)目中的 灰度發(fā)布、分組管理如何實(shí)現(xiàn)的
- 無(wú)算法題
之后在我以為他準(zhǔn)備深入提問(wèn)的時(shí)候,面試官告訴我面試結(jié)束了,整個(gè)過(guò)程不到 30 min,而且沒(méi)有算法題。
B 站二面(30 min)
- 簡(jiǎn)單介紹下你的項(xiàng)目,是工程項(xiàng)目、學(xué)校項(xiàng)目還是自己學(xué)習(xí)的
- 你認(rèn)為項(xiàng)目中有什么亮點(diǎn)?
- 算法題:K 個(gè)有序數(shù)組,輸出最終排序后的數(shù)組 (K merge)。
B 站是我第一個(gè)走面試流程的公司,二面在字節(jié)一面的前一天。B 站二面是我第一次在面試過(guò)程中寫(xiě)算法題,結(jié)果就遇到個(gè)這,當(dāng)時(shí)心態(tài)是崩掉的。因?yàn)榈谝淮未_實(shí)有些緊張,思路不清晰。雖然是力扣 Hard 難度吧,但是事后覺(jué)得也沒(méi)有很難,做不出來(lái)還是大多歸因于自己。但是復(fù)盤(pán)的過(guò)程中,我發(fā)現(xiàn)在面試的過(guò)程中,雖然太緊張了沒(méi)實(shí)現(xiàn)出來(lái),我把兩種解題思路都思考到了,并且面試官提問(wèn)時(shí)間復(fù)雜度,在提示下也求解出來(lái)了(很菜勿噴),整體表現(xiàn)自我感覺(jué)也算可圈可點(diǎn)吧。
給大家的經(jīng)驗(yàn)就是,平時(shí)刷題的時(shí)候時(shí)間復(fù)雜度求解一定要重視!
備戰(zhàn)部分
下面是我從七月底寫(xiě)出第一行 Java HelloWorld 直到現(xiàn)在的大致時(shí)間表:
- 七月底,正式開(kāi)始投入時(shí)間學(xué) Java,在師兄、師姐的推薦下選擇了 JavaGuide 作為主線的學(xué)習(xí)資料,之后加入了知識(shí)星球,認(rèn)真閱讀了關(guān)于學(xué)習(xí)路線的內(nèi)容。
- 七月份用了一周多的時(shí)間熟悉 Java 語(yǔ)法。前期主要跟隨 小碼哥戀上數(shù)據(jù)結(jié)構(gòu)課程,一邊復(fù)習(xí)算法數(shù)據(jù)結(jié)構(gòu),一遍熟悉 Java 語(yǔ)法。
- 八月份開(kāi)始,選擇了 Guide 哥推薦的千峰商城項(xiàng)目作為入門(mén),大概用了兩周時(shí)間,全程跟隨視頻敲完代碼,收獲非常大。這一過(guò)程中,戀上數(shù)據(jù)結(jié)構(gòu)這門(mén)課程是同步學(xué)習(xí)的,基本就是早晚做項(xiàng)目,下午學(xué)算法。
- 多線程、Jvm 方面的知識(shí),我選擇了馬士兵的課程。這兩部分是同時(shí)學(xué)習(xí)的,理解為主。選擇馬士兵課程的原因之一,是因?yàn)轳R老師講課是以面試為導(dǎo)向的,一邊理解一邊掌握八股文了,效率比較高,總共耗時(shí)兩周左右。
- 網(wǎng)絡(luò) IO 部分的知識(shí) 以及 Zookeeper、MQ 等中間件,這三部分是一起學(xué)習(xí)的,參考的資料包括馬士兵課程、稀土掘金的 Zookeeper 課程、慕課網(wǎng)的 MQ 課程以及尚硅谷的一些資料,耗時(shí)大概一周左右吧。
- 以上打基礎(chǔ)大概花費(fèi)了一個(gè)月的時(shí)間。
- 九月份返校之后,開(kāi)始著手準(zhǔn)備簡(jiǎn)歷上的項(xiàng)目,花了一些時(shí)間在 Guide 哥的知識(shí)星球里翻看優(yōu)秀開(kāi)源項(xiàng)目介紹,選擇了 Guide 哥的手寫(xiě) Rpc 項(xiàng)目以及星球推薦的 IM 項(xiàng)目。
- 有了基礎(chǔ)之后,項(xiàng)目做起來(lái)還是比較快的,加上有源碼可以參考,各自用了一周就基本實(shí)現(xiàn)完成了。這里總共耗時(shí)兩周。
- 后面的時(shí)間里,我針對(duì)這兩個(gè)項(xiàng)目做了深入研究。在極客時(shí)間和稀土掘金里,我分別找到了 rpc 和 IM 的相關(guān)課程。由于都是文字的形式,加上自己實(shí)現(xiàn)過(guò)基本功能,讀起來(lái)非???,快速整理出了課程內(nèi)作者對(duì)于項(xiàng)目深入思考的部分,之后融合到自己的項(xiàng)目中。這里我認(rèn)為是非常關(guān)鍵的一步,在面試的時(shí)候我能夠頂住面試官的連環(huán)問(wèn),和這些課程中的相關(guān)內(nèi)容以及思考題的深度是分不開(kāi)的。在這一過(guò)程中,我還有幸加了幾個(gè)作者大大的微信,不停地和作者交流自己的思考,甚至發(fā)現(xiàn)了課程中的一些小瑕疵。非常幸運(yùn)他們都很有耐心,給予了我很多指導(dǎo),尤其是 crossoverJie 大佬,幾乎是有問(wèn)必答,甚至在我面試之前,還給予了我很大鼓勵(lì)(相當(dāng)感動(dòng))。
- 大概到九月中旬,我就開(kāi)始整理簡(jiǎn)歷并且投遞了,之后一邊復(fù)習(xí)八股,一邊完善項(xiàng)目。
- 九月底,我的項(xiàng)目已經(jīng)基本整理完成了。我花了一周的時(shí)間系統(tǒng)梳理八股文,制作了很長(zhǎng)的腦圖幫助我回憶知識(shí)點(diǎn)。
- 十月份,國(guó)慶節(jié)的假期里,我保持著每天 15+題的速度,快速找回了算法題的手感。由于時(shí)間真的太倉(cāng)促了,時(shí)間復(fù)雜度這一塊我沒(méi)有重視,后面也付出了慘痛的代價(jià)。提醒各位讀者,算法復(fù)雜度的計(jì)算一定要重視起來(lái)。
- 最終功夫不負(fù)有心人,我收獲了百度、蔚來(lái)以及字節(jié)的日常實(shí)習(xí) offer。JavaGuide 以及知識(shí)星球內(nèi)部的 《Java 面試指北》在我整個(gè)備戰(zhàn)的過(guò)程中起了很大作用,是我的指路明燈。
寫(xiě)在最后
由于從本科開(kāi)始就一直做算法 NLP 相關(guān)的工作,對(duì)后端開(kāi)發(fā)了解甚少,加上時(shí)間緊迫,我不得不采取一種囫圇吞棗的方式進(jìn)行學(xué)習(xí)。對(duì)我而言,在不到三個(gè)月的時(shí)間里,從 Java 的入門(mén)階段到通過(guò)日常實(shí)習(xí)面試實(shí)在付出了太多,每天早 7 晚 11 的作息時(shí)間對(duì)身體也產(chǎn)生了一些傷害,如果時(shí)間允許,我更希望節(jié)奏慢下來(lái),把每個(gè)知識(shí)點(diǎn)都學(xué)扎實(shí)、學(xué)透徹。
本篇面經(jīng)實(shí)際上沒(méi)有太多東西可以分享給大家,因?yàn)楣P者實(shí)際上也只是一個(gè)才學(xué)了不到三個(gè)月 Java 的新手小白。如果說(shuō)文章里有什么是值得大家參考的話,我希望是面對(duì)目標(biāo)絕對(duì)堅(jiān)持的毅力以及面對(duì)困難永不退縮的決心,是它們支撐著我逐漸越過(guò)一個(gè)又一個(gè)的“不可能”。
··········? END? ··············
?? 如果本文對(duì)你有幫助的話,歡迎?點(diǎn)贊&在看&分享?,這對(duì)我繼續(xù)分享&創(chuàng)作優(yōu)質(zhì)文章非常重要。非常感謝!
