前言
由于個人發(fā)展的原因和工作上的變動,產(chǎn)生了想出來看看機(jī)會的想法。經(jīng)過了一段時間的準(zhǔn)備,5 月下旬開始出來面試,面到了 7 月上旬,如愿拿到了自己心儀公司的 offer。按照自己的習(xí)慣,將這次面試過程中的一些經(jīng)驗總結(jié)、心得體會記錄下來,自己留個記錄,也希望可以幫助到一些同學(xué)。
另外,在兩年前第一次跳槽的時候也將當(dāng)時的心得體會記錄了下來,這邊放個傳送門:兩年Java開發(fā)工作經(jīng)驗面試總結(jié)
個人情況
坐標(biāo)魔都,15 年本科畢業(yè)于普通一本,畢業(yè)后就職于一家傳統(tǒng)電信公司,17 年后就職于美團(tuán)點評。
面試情況
相比于 17 年,由于有了美團(tuán)的背景,今年在簡歷這關(guān)順利了很多,不得不感嘆大廠背景真香。
本著盡量少請假的原因,所以面試的公司比較少,只面了 3 家:阿里、網(wǎng)易考拉、拼多多。
3 家公司都走完了面試流程,最后拿到了阿里和拼多多的 offer,自己還是比較滿意的。
至于網(wǎng)易,面試發(fā)揮的還行,BOSS 面的時候可以看出對我還是比較滿意,但最終由于一些特殊的原因沒有發(fā) offer。
如果對于這三家公司的面試流程有問題的,可以在公眾號上留言,能解答的我會第一時間解答。
4 年經(jīng)驗應(yīng)該具備哪些技能
首先,簡單的聊一下我認(rèn)為的 4 年經(jīng)驗左右、優(yōu)秀的 Java 程序員應(yīng)該具備的技能有哪些,按“專業(yè)技能”和“項目”兩塊,包括但不限于以下內(nèi)容。
專業(yè)技能方面
基礎(chǔ):JDK 常用類的原理、源碼、使用場景。
設(shè)計模式:常用幾種的原理、使用場景,單例、動態(tài)代理、模板、責(zé)任鏈等。
數(shù)據(jù)結(jié)構(gòu):數(shù)組、鏈表、棧、隊列、樹。
網(wǎng)絡(luò):TCP、HTTP、HTTPS、負(fù)載均衡算法。
框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的擴(kuò)展點、MyBatis 的核心流程。
中間件:常用中間件的核心原理與最佳實踐,并對其中的 1 到 2 個有深入的學(xué)習(xí),Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。
數(shù)據(jù)庫(MySQL):索引原理、隔離級別、鎖機(jī)制、分庫分表、慢 SQL 定位及優(yōu)化、線上問題解決。
Netty:NIO 原理、核心組件、I/O 多路復(fù)用(epoll)、零拷貝。
JVM:運行時數(shù)據(jù)區(qū)、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置參數(shù)、線上問題定位及解決。
穩(wěn)定性保障:隔離、限流、熔斷、降級等。
Linux:基本命令的使用、快速定位和排查問題。
分布式理論:CAP、BASE、2PC、3PC、TCC。
項目方面
能獨立完成一個復(fù)雜模塊的需求分析、方案設(shè)計和最終落地實現(xiàn)。
能不斷思考,尋找更優(yōu)的設(shè)計和解決方案,積極優(yōu)化慢 SQL、慢服務(wù)。
具備排查問題的能力,遇到線上問題能及時定位和修復(fù)上線,例如:數(shù)據(jù)庫死鎖、服務(wù)器宕機(jī)、服務(wù)器 Full GC 頻繁等。
具備難題攻關(guān)的能力,能不斷解決項目遇到的挑戰(zhàn),能給予初級工程師技術(shù)上的指導(dǎo)。
初步具備帶領(lǐng)團(tuán)隊(1-3人左右)的能力,能合理分配需求,做好進(jìn)度把控、風(fēng)險評估、Code Review。
嚴(yán)格來說,要完全做到上面這些有點難,我自己也并不具備,但是,我們可以將其視為目標(biāo),不斷去努力。
面試常見形式
大廠面試通常是“連環(huán)炮”的形式,舉個栗子:
面試官:用過哪些 Map
我:LinkedHashMap、ConcurrentHashMap、HashMap、TreeMap
面試官:這四種 Map 的區(qū)別
我:ConcurrentHashMap 線程安全,LinkedHashMap 可以記錄插入順序和訪問順序,TreeMap 可以自定義排序,除了這幾個場景,其他場景基本都可以使用 HashMap
面試官:ConcurrentHashMap 怎么保證線程安全
我:JDK 1.8 以前通過分段鎖,JDK 1.8 以后通過 CAS + Synchronized
面試官:ConcurrentHashMap 在 JDK 1.8 前后的鎖有什么區(qū)別
我:JDK 1.8 以前鎖分段,JDK 1.8 以后鎖單個節(jié)點,鎖粒度降低,并發(fā)度變高
面試官:#%¥%……#%¥
我:喵喵喵~
這種模式的問法,其實就是想了解候選人對一個知識點的理解是僅僅停留在表面,還是真的去深入研究過。
面試內(nèi)容
下面介紹下一些常見的面試內(nèi)容,其中的面試題不一定是我真實遇到的,有可能是從別人的面試題中收集的,也有可能是我自己覺得重要的知識點,僅供參考。
1、項目
項目對于一個 3 - 5 年經(jīng)驗的開發(fā)來說是非常重要的,面試官也非常看重這一塊。這個經(jīng)驗的開發(fā)基本是各大公司的編碼主力,因此面試這個年限的候選人,通常項目是很重要的一塊。面試官通常會讓你先自己介紹下自己參與度最高(或者最牛逼)的項目,然后從中進(jìn)行提問。常見的如以下:
介紹下你參與度最高的項目
畫下項目的架構(gòu)圖
如果核心流程處理到一半,服務(wù)器崩潰了,會怎么處理
項目中遇到過哪些挑戰(zhàn)或問題,怎么解決的
項目的穩(wěn)定性和可用性怎么保障
數(shù)據(jù)安全這塊怎么設(shè)計
項目的技術(shù)選型,為什么選這些
...
2、場景題
越到后面的面試官,越喜歡問場景題,場景題比較考驗候選人平時的積累和解決問題能力。這個環(huán)節(jié)很容易掛掉一批人,特別是容易緊張的同學(xué),很容易腦子會一片空白。場景題的核心一般是處理大數(shù)據(jù)量的問題、解決性能方面的問題。
場景題本質(zhì)上是比較開放的,沒有什么標(biāo)準(zhǔn)答案,只要自己的方案能夠解決問題,能夠“自圓其說”就行。
這個環(huán)節(jié)面試官可能會將線上真實的場景拿出來提問,我自己就遇到過。
3、專業(yè)技能
集合
經(jīng)常用到哪些 Map
這幾種 Map 的區(qū)別
CocurrentHashMap 怎么保證線程安全
CocurrentHashMap 在 JDK 1.8 前后的鎖有什么區(qū)別
聊下 HashMap 的原理
HashMap 在 Put 時,新鏈表節(jié)點是放在頭部還是尾部
HashMap 擴(kuò)容時的流程
HashMap 在 JDK 1.8 有什么改變
CocurrentHashMap 在 JDK 1.8 有什么改變
TreeMap 的原理
Map、List、Set 分別說下你知道的線程安全類和線程不安全的類
多線程、鎖
線程池使用的是哪種
線程池參數(shù)怎么配置
線程池各個參數(shù)的作用
線程池的參數(shù)配置要注意什么
線程池的工作流程
JDK 中的并發(fā)類知道哪些
AQS 的底層原理
介紹下悲觀鎖和樂觀鎖
使用過哪些鎖
synchronized 和 Lock 的區(qū)別、使用場景
synchronized 原理
synchronized 作用于靜態(tài)方法、普通方法、this、Lock.class 的區(qū)別
為什么引入偏向鎖、輕量級鎖,介紹下升級流程
死鎖的必要條件,如何預(yù)防死鎖
介紹下 CountDownLatch 和 CyclicBarrier
介紹下 CAS,存在什么問題
介紹下 ThreadLocal,存在什么問題
網(wǎng)絡(luò)
HTTPS 是怎么加密的
普通 Hash 和一致性 Hash 原理
一致性 Hash 的缺點
TCP 三次握手過程,為什么需要三次握手
為什么 TIME_WAIT 狀態(tài)需要經(jīng)過 2MSL 才能返回到 CLOSE 狀態(tài)
TCP 的擁塞控制
TCP 如何解決流控、亂序、丟包問題
為什么會出現(xiàn)粘包和拆包,如何解決
Spring、Mybatis
Mybatis 中 # 和 $ 的區(qū)別
怎么防止 SQL 注入
使用 Mybatis 時,調(diào)用 DAO(Mapper)接口時是怎么調(diào)用到 SQL 的
介紹下 Spring IoC 的流程
BeanFactory 和 FactoryBean 的區(qū)別
Spring 的 AOP 是怎么實現(xiàn)的
Spring 的事務(wù)傳播行為有哪些,講下嵌套事務(wù)
什么情況下對象不能被代理
Spring 怎么解決循環(huán)依賴的問題
要在 Spring IoC 容器構(gòu)建完畢之后執(zhí)行一些邏輯,怎么實現(xiàn)
@Resource 和 @Autowire 的區(qū)別
@Autowire 怎么使用名稱來注入
bean 的 init-method 屬性指定的方法里用到了其他 bean 實例,會有問題嗎
@PostConstruct 修飾的方法里用到了其他 bean 實例,會有問題嗎
Spring 中,有兩個 id 相同的 bean,會報錯嗎,如果會報錯,在哪個階段報錯
Spring 中,bean 的 class 屬性指定了一個不存在的 class,會報錯嗎,如果會報錯,在哪個階段
Spring 中的常見擴(kuò)展點有哪些
MySQL
MySQL 索引的數(shù)據(jù)結(jié)構(gòu)
為什么使用 B+ 樹,與其他索引相比有什么優(yōu)點
各種索引之間的區(qū)別
B+ 樹在進(jìn)行范圍查找時怎么處理
MySQL 索引葉子節(jié)點存放的是什么
聯(lián)合索引(復(fù)合索引)的底層實現(xiàn)
MySQL 如何鎖住一行數(shù)據(jù)
SELECT 語句能加互斥鎖嗎
多個事務(wù)同時對一行數(shù)據(jù)進(jìn)行 SELECT FOR UPDATE 會阻塞還是異常
MySQL 使用的版本和執(zhí)行引擎
MySQL 不同執(zhí)行引擎的區(qū)別
MySQL 的事務(wù)隔離級別
MySQL 的可重復(fù)讀是怎么實現(xiàn)的
MySQL 是否會出現(xiàn)幻讀
MySQL 的 gap 鎖
MySQL 的主從同步原理
分庫分表的實現(xiàn)方案
分布式唯一 ID 方案
如何優(yōu)化慢查詢
explain 中每個字段的意思
explain 中的 type 字段有哪些常見的值
explain 中你通常關(guān)注哪些字段,為什么
JVM
運行時數(shù)據(jù)區(qū)
服務(wù)器使用的什么垃圾收集器
CMS 垃圾收集的原理
G1 垃圾收集的特點,為什么低延遲
有哪些垃圾回收算法,優(yōu)缺點
哪些對象可以作為 GC Roots
有哪些類加載器
雙親委派模式,哪些場景是打破雙親委派模式
線上服務(wù)器出現(xiàn)頻繁 Full GC,怎么排查
定位問題常用哪些命令
介紹下 JVM 調(diào)優(yōu)的過程
Kafka
為什么使用 Kafka
介紹下 Kafka 的各個組件
如何保證寫入 Kafka 的數(shù)據(jù)不丟失
如何保證從 Kafka 消費的數(shù)據(jù)不丟失
Kafka 為什么性能這么高
零拷貝技術(shù)使用哪個方法實現(xiàn)
Java 中也有類似的零拷貝技術(shù),是哪個方法
Kafka 怎么保證消息的順序消費
Kafka 怎么避免重復(fù)消費
什么是 HighWatermark 和 LEO
什么是 ISR,為什么需要引入 ISR
Redis
項目中使用的 Redis 版本
Redis 在項目中的使用場景
Redis 怎么保證高可用
Redis 的選舉流程
Redis 和 Memcache 的區(qū)別
Redis 的集群模式
Redis 集群要增加分片,槽的遷移怎么保證無損
Redis 分布式鎖的實現(xiàn)
Redis 刪除過期鍵的策略
Redis 的內(nèi)存淘汰策略
Redis 的 Hash 對象底層結(jié)構(gòu)
Redis 中 Hash 對象的擴(kuò)容流程
Redis 的 Hash 對象的擴(kuò)容流程在數(shù)據(jù)量大的時候會有什么問題嗎
Redis 的持久化機(jī)制有哪幾種
RDB 和 AOF 的實現(xiàn)原理、優(yōu)缺點
AOF 重寫的過程
哨兵模式的原理
使用緩存時,先操作數(shù)據(jù)庫還是先操作緩存
為什么是讓緩存失效,而不是更新緩存
緩存穿透、緩存擊穿、緩存雪崩
更新緩存的幾種設(shè)計模式
Zookeeper
Zookeeper 的使用場景
Zookeeper 怎么實現(xiàn)分布式鎖
Zookeeper 怎么保證數(shù)據(jù)的一致性
ZAB 協(xié)議的原理
Zookeeper 遵循 CAP 中的哪些
Zookeeper 和 Eureka 的區(qū)別
Zookeeper 的 Leader 選舉
Observer 的作用
Leader 發(fā)送了 commit 消息,但是所有的 follower 都沒有收到這條消息,Leader 就掛了,后續(xù)會怎么處理
分布式
CAP 理論
BASE 理論
分布式事務(wù) 2PC 和 TCC 的原理
TCC 在 cancel 階段如果出現(xiàn)失敗怎么處理
Paxos 算法、Raft 算法
4、Hr 面
如果你一路過五關(guān)斬六將,最終來到了 Hr 面,那么恭喜你,你已經(jīng)離 offer 非常非常近了。可以開始暢想自己升職加薪,當(dāng)上總經(jīng)理,出任 CEO,迎娶白富美,走上人生巔峰的場景了。
Hr 面主要是了解候選人的一些通用素質(zhì),經(jīng)常會問的問題如下:
介紹下自己投入最多的項目(當(dāng)時我就驚了,Hr 也開始問項目了 )
離職的原因
當(dāng)前的薪資、績效
當(dāng)前在面試的其他公司的情況
平時有沒有學(xué)習(xí)的習(xí)慣,怎么學(xué)習(xí)的,現(xiàn)在在學(xué)習(xí)什么
未來的規(guī)劃
關(guān)于這些問題,沒有什么標(biāo)準(zhǔn)答案,但是很重要的原則是,在整個過程中要保持積極向上的態(tài)度,不能有負(fù)面的情緒。
關(guān)于當(dāng)前薪資的問題,由于諸多的原因,可能有些人會想著稍微多報一點,對于這種做法我持中立態(tài)度,但是要把握好度,畢竟大廠基本都有背景調(diào)查。大廠對于誠信問題一般是零容忍,而且可能會拉黑名單,進(jìn)黑名單意味著你再也無緣這家公司了。
一些經(jīng)驗心得
1、先挑幾個小公司找下面試感覺,太久沒面,需要找找面試的感覺,我自己一開始就面的不太好,就很慌張。
2、面試時緊張是正常的,但是不要過于緊張,如果面試官問完你大腦瞬間一片空白,你可以跟面試官說自己要思考下,然后回答的時候語速可以慢點,但是要條理清晰。
3、在面試的過程中回答面試官問題是一方面;另一方面,你要在回答的過程中讓面試官感受到你身上一些優(yōu)秀的特質(zhì),例如:有潛力、很靈活、熱愛學(xué)習(xí)、學(xué)習(xí)能力強(qiáng)、解決問題能力強(qiáng)、基礎(chǔ)扎實等等。這些特質(zhì)都會影響面試官對你的評價。
4、平時項目中遇到難題要積極去解決,解決問題的過程能讓人快速成長,并且解決的問題可能會成為你面試時的亮點,特別是對于那些項目沒什么亮點的。
5、準(zhǔn)備項目時,挑幾個自己做過最牛逼的功能、或者解決過最有挑戰(zhàn)的問題,并且要對這些內(nèi)容理解的非常透徹,不能在給面試官介紹的時候“支支吾吾”。
6、框架也好、中間件也好,必須要有幾個特別深入研究過的,也就是說你除了“廣度”之外,還必須在某些方面有足夠的“深度”。面試時經(jīng)常碰到的問題是:你對哪個框架或中間件理解的最深。然后面試官會在這個方向上一直問下去,如果你很多東西只是看了個大概,在這邊就很有可能會被問倒。
7、自己講出來的每個功能點、知識點,都要做好“被挑戰(zhàn)”的心里準(zhǔn)備,因此對于每個功能點、知識點都要多思考。
8、如果問的問題是線上實際的場景,有時候面試官會給出他們當(dāng)前線上的解決方案,如果你能在這個時候給出一些自己的思考和觀點,可能會給面試官留下不錯的印象。
9、判斷自己是否已經(jīng)準(zhǔn)備好的一個比較簡單粗暴的方法:自己是否能將看到的面試題回答個 9 成左右,例如本文上面 “專業(yè)技能” 列舉的這些題目。
10、如果你是真想跳槽,或者說你已經(jīng)裸辭了,那么在收到電子 offer 前都不要停止面試,即使收到口頭 offer 也不穩(wěn),特別是在這個寒冬。
11、在平時工作中多思考,無論是寫代碼還是方案設(shè)計,多思考更優(yōu)的解決方案。特別是工作年限越久之后,思考對于我們的職業(yè)發(fā)展越重要。
12、面試前的準(zhǔn)備非常重要,但更重要的是平時工作的積累,4 年經(jīng)驗問的問題很多是無法通過臨時準(zhǔn)備的,很多都是需要你不斷去積累,才能有好的方案。
13、專注于自身的成長,不要輕易受到別人的影響,只要你不斷的積累,總有一天你也能成為你眼中的那些大神。
14、學(xué)如逆水行舟,不進(jìn)則退。不要停下學(xué)習(xí)的腳步,特別是趁著自己還年輕,趁著自己還是個單身狗的時候,逼自己一把,將來的你一定會感激現(xiàn)在拼命的自己。
15、程序員是一份很單純的工作,不需要搞什么花里胡哨的,只要你付出努力了,你通常就能收獲回報。
16、對于沒有大廠背景,并且處于傳統(tǒng)行業(yè)(就如 2 年前的我),想直接進(jìn)入大廠比較難,除非你像我一樣踩了狗屎運,但是這種幾率不大,我覺得比較現(xiàn)實的途徑是先找一個互聯(lián)網(wǎng)獨角獸沉淀一段時間。
17、大公司的部門非常多,各部門的招聘通常都是獨立的,如果想進(jìn)大公司可以多投,每個部門的需求緊張度不同,如果碰到急需招人的,可能就是一個非常好的機(jī)會。
18、大公司的面試通常會有存檔,面試官可能會看到你之前的面試評價。如果你經(jīng)常一輪游,肯定會給面試官不好的印象。因此請做好準(zhǔn)備再去面試,不要輕易浪費機(jī)會。
19、2019 年互聯(lián)網(wǎng)行業(yè)的行情不太好,也有可能接下去會一直這樣,特別是對于沒有大廠背景的同學(xué)來說,所以請記住一個很重要的原則:不要裸辭。
20、Last but not least,如果你覺得本文對你有幫助,歡迎關(guān)注我的微信公眾號、右下角“在看”、分享到朋友圈,幫助更多的小伙伴。
相關(guān)文章
兩年Java開發(fā)工作經(jīng)驗面試總結(jié)
?