?
每日早8點半,精品技術(shù)文章準時送上
?
本文是讀者jianfeng投稿的面試經(jīng)驗
恭喜該同學成功轉(zhuǎn)型
?
目錄:
毅然轉(zhuǎn)型,沒頭蒼蠅
制定目標,系統(tǒng)學習
面試經(jīng)歷
?
毅然轉(zhuǎn)崗,沒頭蒼蠅首先,介紹一下我的背景。本人坐標廣州,2016年畢業(yè)于一個普通二本大學,曾經(jīng)在某機構(gòu)培訓過Android。
?
2018年初的時候已經(jīng)在兩家小公司工作干了兩年的android開發(fā),然后會一些Tomcat、Servlet之類的技術(shù),當時的年薪大概也就15萬這樣子。
?
由于個人發(fā)展規(guī)劃,在當時就已經(jīng)決定了轉(zhuǎn)型干Java后端開發(fā)了,但是由于之前沒有相關(guān)經(jīng)驗,當時好像一個沒頭蒼蠅一樣,胡亂買了幾本書籍,準備學習Spring MVC,MyBatis的XML配置方式。
?
但是當時有個同事給我提了一句,現(xiàn)在都流行Spring Boot了,然后我就轉(zhuǎn)學Spring Boot,百度網(wǎng)上看了幾篇文章,寫了幾個Demo就以為自己很吊了。
?
接著又從同事的那里得知,還有個Spring Cloud的東西,現(xiàn)在很流行。然后又轉(zhuǎn)戰(zhàn)Spring Cloud,同樣看了幾篇博客寫了幾個demo之后覺得自己叼的不行~(汗顏)
?
接下來,還是熟悉的套路,同事說jenkins很吊,docker很吊、k8s很吊呀,還有什么領(lǐng)域驅(qū)動模型,DDD啊,被牽著鼻子走。
?
反正聽到別人說那個牛逼就學習那個,但是每個技術(shù)都是demo入門級別的掌握水平。我當時甚至連Controller/Service/DAO/Mapper、DO/DTO/VO之類的基本常識都不會。
?
?
制定目標,系統(tǒng)學習這一切的轉(zhuǎn)折點在2018年5月,當時覺得這又搞一下,那又搞一下,不行啊。沒有系統(tǒng)的學習,各種東西都掌握的不好。
?
于是沉下心來開始進行系統(tǒng)的專題性學習,并且自己定下對每個技術(shù)的學習目標。官網(wǎng)文檔開始,先掌握其基本用法,然后跑通最基礎(chǔ)的demo之后,基于這個demo,一步步調(diào)試,讀懂其底層源碼,邊讀邊寫筆記,這個過程及其漫長和煎熬。
?
在這個過程中,我瘋狂的搜索了各種視頻教程,博客,公眾號,各種途徑都用上了。
?
給我的感覺是,確實有視頻、博客講的挺好,但是極少。很多講的還是比較淺,點到為止。此時需要我們自己進一步深入到源碼層面研究,一點點啃,一點點摸索,邊啃邊記筆記。
?
在這一段時間,利用了很多業(yè)余時間學習,基本上可以保證工作日每天學習2~3個小時,周末每天平均12小時。
?
(可能這塊大家不是很相信,大家都是上班,為什么我就有時間學習呢。我要說的是,時間是自己控制的,可以利用坐地鐵時間或者午休時間)
?
就這樣準備了大半年,截止2019年3月,因為對于當前公司的業(yè)務(wù)場景和薪資不太滿意,所以忍不住想出去跳槽了。
?
在這個過程中,尤其前期,我經(jīng)歷了至暗時刻,摸索學習源碼幾近崩潰,如同黑暗森林一般。有的源碼我反復(fù)讀了不小5遍,畫圖、記筆記,一遍遍的強化總結(jié)。
?
然而,正是這段時間,我的整個知識棧飛速擴張,并且因為我學完一個東西,都會自己畫圖,一步步給自己講解。這種學習方式讓我對新東西的掌握及其扎實,效果比那種泛泛而學好很多。
?
在這大半年的時間里,學到了包括以下內(nèi)容:
?
Java基礎(chǔ)
JDK集合、并發(fā)包內(nèi)容,這些基本上都是研究到底層源碼了。比如volatile,AQS之類的,已經(jīng)到了熟練于心,隨時可以手工畫圖的地步。同時專門去學習了設(shè)計模式,并且可以初步嘗試在公司項目中使用。
?
微服務(wù)架構(gòu)
現(xiàn)在比較流行的微服務(wù)架構(gòu),這一塊選擇了學習比較熱門的Spring Cloud。將Spring Cloud的Eureka/Ribbon/Feign/Hystrix/Zuul這些套件深入理解其源碼實現(xiàn),對其底層源碼熟爛于心。
?
分布式技術(shù)
比如一些分布式事務(wù),分布式鎖,分布式接口冪等性,分布式基礎(chǔ)理論CAP之類的東西,這些也要掌握它們的場景以及對應(yīng)的解決方案。
?
這里說一下,其實本人就職的公司并沒有這些挑戰(zhàn),甚至是單機系統(tǒng),但是這一塊的技術(shù)方案其實是可以平時用自己公司項目來設(shè)想一下,設(shè)想做成分布式之后,會面臨什么問題,應(yīng)該怎么解決。
?
ps:順便提一下,這塊本人是受了石杉老師的文章的啟發(fā),也推薦大家看一下,在公司沒有高大上的高并發(fā)項目時,應(yīng)該怎么應(yīng)對?
?
IO、網(wǎng)絡(luò)基礎(chǔ)
這一塊個人覺得還是很重要的,比如一些網(wǎng)絡(luò)基礎(chǔ),Linux IO模型,Java里面的BIO、NIO、AIO、這些內(nèi)容其實還是很有必要掌握的。
?
ElasticSearch
這個是分布式搜索引擎,目前大熱,一般互聯(lián)網(wǎng)公司都或多或少用到了es,這一塊是需要對其分布式架構(gòu)原理,搜索原理都搞的門兒清才行。
?
緩存、MQ
因為面對高并發(fā)場景,緩存MQ這兩塊也是必問的,所以專門看了一些緩存架構(gòu)實戰(zhàn)的視頻教程。對于MQ的話,專門對RabbitMQ、Kafka這兩種深入研究。
?
項目經(jīng)驗
項目經(jīng)驗這一塊是硬傷,確實來說這一塊在原來公司里面不是很大的場景。
?
高并發(fā)這一塊平時確實積累不到很多知識,只能通過想象,當系統(tǒng)遇到的并發(fā)量提升10倍、100倍的時候,系統(tǒng)應(yīng)該如何設(shè)計?
?
當遭遇到高并發(fā)流量時,用一些什么樣的方案可以支撐?采用緩存還是MQ,采用了之后又什么坑,又如何解決,這一塊需要自己深度思考一些細節(jié)問題。
?
?
數(shù)據(jù)結(jié)構(gòu)、算法
這一塊沒啥好說的,就是靠平時積累以及l(fā)eetcode刷題。我刷了幾十題這樣,加上平時積累的一些數(shù)據(jù)結(jié)構(gòu)也是比較夠用的。
?
除此之外,在面試前還突擊了一下那些場景的面試題,包括MQ、Mysql、分庫分表、之類的常見互聯(lián)網(wǎng)面試題。
?
?
同時,石杉的架構(gòu)筆記公眾號很多精品文章也讓我受益良多,比如公眾號的并發(fā)系列、分布式系列、微服務(wù)系列。
?
文章分析了很多面試高頻熱門考點,我在面試時,很多問題都直接命中。
?
因此,我將自己的面經(jīng)投稿到平臺,希望分享給更多朋友。同時也是對石杉老師表示感謝,希望公眾號越做越好!
?
有點跑題。。。喝杯水繼續(xù)!
?
看到這里,可能部分同學覺得不可能,在不到一年的時間里從一個啥都不懂的小白,做到能熟練掌握這么多東西的?
?
我想說的是,每個人的情況不一樣,我這邊學習一個東西起碼是經(jīng)過5遍之后才能熟練記住,有的甚至看了不下10遍,反復(fù)的畫圖操練,自己對自己講解。
?
所以,最重要的是肯花時間去學習。甚至我可以透露一下,我除了學了這些之外,我還學習了一些大數(shù)據(jù)的技術(shù),比如Hadoop的HDFS、Kafka源碼、Spark開發(fā)、Storm之類的
?
?
面試經(jīng)歷接下來說下我的面試經(jīng)歷,在面試之前,本人基于職業(yè)發(fā)展的考慮,投簡歷基本上都是瞄準比較有點知名度的互聯(lián)網(wǎng)公司。
?
面試策略一開始也是想先找?guī)讉€小公司面面看,試試水。但是,好像今年行情確實不怎么樣,往往投了很久沒啥反應(yīng)。
?
后面一咬牙,干脆直接投心儀的公司,后面通過投簡歷和內(nèi)推的一些手段,拿到了5家公司的面試邀請。
?
我這邊面試的僅有5家公司,這些公司的面試套路基本上都是差不多。
?
1面問基礎(chǔ),二面問項目,3面hr
?
?
某汽車服務(wù)平臺(拿到offer)
首先面試題是有一些算法的,比如讓你寫一個遞歸算法,還有一些二分查找之類的題目,總體來說還算比較簡單的算法題了。
?
1面的時候基本上就是自我介紹,然后問問比較熟悉那一塊,然后講了一些AQS原理。當時是手工在紙上畫圖的。
?
給面試官講完AQS之后,又讓我把話題扯到了volatile這一塊,我就從CPU內(nèi)存模型、Java內(nèi)存模型,然后結(jié)合CPU高速緩存的數(shù)據(jù)結(jié)構(gòu)講解一下可見性問題是如何出現(xiàn)的。
?
之后又問了一些分庫分表的事情,HashMap的原理。
?
2面的時候是總監(jiān)面,主要是上來就問了自己有沒有遇到到線上full gc,還有一些JVM內(nèi)存劃分,GC收集算法,垃圾回收器之類的知識。
?
然后講一下自己看過啥源碼,然后圍繞著項目問了一些問題,比如說你遇到過最大的挑戰(zhàn)是什么?
?
3面就是hr了,這一塊主要就是問一問離職原因(錢太少咯),然后其他就是問一下職業(yè)規(guī)劃,這塊按照自己想的說就行了。
?
最終的結(jié)果是拿到了25萬的offer??傮w來說,這家公司的面試過程相對比較簡單一些。
?
?
某跨境電商公司(掛掉)
第二家公司主要做跨境電商,是通過內(nèi)推拿到面試機會的。這里面了2輪。
?
技術(shù)面試:
面試官問的算是比較全面了,首先自我介紹,然后就開始技術(shù)問題:
-
HashMap原理?
-
synchronized和ReentrantLock有什么不同?
-
AQS原理?
-
線程池的各個參數(shù)作用?
-
Spring Boot如何實現(xiàn)AutoConfig?
-
還問了CurrentHashMap這一塊原理?
?
接著是問MQ:
-
用RabbitMQ,他們有幾種exchange?
-
消費者推拉模式有什么區(qū)別?
-
為什么用MQ?
?
然后到了Redis這一塊:
-
緩存穿透、雪崩、擊穿各種場景的問題以及解決方案?
-
redis為啥速度快?以及Redis Pipeline相關(guān)的一些問題。
?
然后又問Mysql了:
-
mysql的索引原理是啥?
-
然后mysql的執(zhí)行引擎有幾種,有啥區(qū)別?
-
事務(wù)隔離級別?
-
線上數(shù)據(jù)庫用什么級別隔離?
-
@Transactional有什么關(guān)鍵參數(shù)?
-
針對分布式場景下的事務(wù)解決方案是如何實施落地的?
-
TCC事務(wù)、還有一些可靠消息方案,針對你公司的業(yè)務(wù)場景講解清楚,然后詳細問每一個細節(jié)是如何落地的,這樣會不會出什么問題?
?
接下來還討論到分布式,比如說分布式鎖啊,zk和eureka有什么不同,CAP理論這一塊,還有畫出項目架構(gòu)圖。Zuul線上怎么配置。
?
2面hr面,這一塊也聊了挺久,主要也是問一些職業(yè)規(guī)劃啊,還有工作意愿之列的,介紹一下原來工作情況這樣。最終是讓回去等通知。
?
當晚通過內(nèi)推的人知道被淘汰,其實在面試完本人也是覺得有機會的,不過最終卻是淘汰了,也沒什么好說的,我覺得問的問題80%都答得挺好的。
?
總的來說,這次面試還是可以的,問的算是比較全面的,自己也知道自己哪一方面不足。查漏補缺!
?
?
?
某少兒在線教育公司 (拿到offer)
這家公司技術(shù)總體來說還是非常可以的,3面都是技術(shù),老板也是技術(shù)出身,兼了hr的工作。
?
1面主要讓你畫出線上的項目架構(gòu)圖,然后針對分布式事務(wù),緩存架構(gòu),并發(fā)之類的都問了。
?
比如說分布式事務(wù),還有一些Spring Cloud的底層原理,Hystrix原理,CAS底層如何實現(xiàn)的?HashMap的原理,AOP如何使用的?事務(wù)有幾種實現(xiàn)方式,RabbitMQ如何控制消費速度?。
?
2面的也面的比較全面,也是問了一些AQS原理,volatile原理,synchronized底層原理,HashMap原理,針對Redis和ZK兩種分布式鎖的一些問題
?
還有一些Mysql優(yōu)化,索引底層數(shù)據(jù)結(jié)構(gòu),還有就是公司部署的時候是服務(wù)部署多少機器,是如何考量應(yīng)該用多少機器?
?
然后使用到Redis,為什么上來就用Redis cluster架構(gòu)而不考慮Master-slave模式呢?還有redis cluster為什么是分為16384個slot?
?
紅黑樹和完全二叉樹有啥區(qū)別?B+樹原理、為什么不用紅黑樹實現(xiàn)索引?
?
線上如何擴容集群?Mysql執(zhí)行計劃,snowflake算法,如何解決分庫分表后的跨表join問題?那些場景使用了tcc事務(wù)?哪些場景使用了可靠消息方案?
?
然后讓畫一下Hystrix的架構(gòu)原理圖,分布式接口冪等性如何保證?如何設(shè)計一個1000萬并發(fā)的系統(tǒng),要求只能用有限的資源?還有就是一些項目管理的問題。
?
3面問了一些ArrayList的問題,然后問了Spring IOC有什么作用?還有就是mysql在表數(shù)據(jù)量非常大并且數(shù)據(jù)單一的情況下如何優(yōu)化查詢性能?
?
總結(jié):這家公司最終給了25萬的offer??偟膩碚f面試官也算很nice了,問的問題比較全面,基本上項目,java基礎(chǔ)、mysql、事務(wù)、mq、緩存都有涉及到,也算是測出了我的水平。公司屬于比較技術(shù)性,可能是因為老板也是技術(shù)出身的原因吧。
?
?
?
某職業(yè)教育公司(拿到offer)
這家公司純粹就是混混經(jīng)驗的,面試過程也是1輪技術(shù),1輪hr
?
技術(shù)面試: 基本上就是圍繞Spring源碼,MyBatis設(shè)計思想,還有一些分布式事務(wù)的問題。。。然后還問了一些大數(shù)據(jù)類的問題,HDFS、HIVE之類的問題。然后就是問了一些項目的問題。總的來說問的比較少東西。
?
hr面:2輪直接hr,然后hr可能是得到1面面試官的反饋吧,當場給我offer。
?
但是說我這個工作年限(2016年畢業(yè))正常來說是15萬年薪的,因為我技術(shù)好給到25萬,但是30萬是不可能了(我當時寫期望是30萬的)
?
?
某智能汽車平臺 (掛掉)
1面:2個面試官一起面,主要是圍繞項目來問,首先畫一下自己的項目架構(gòu)圖,然后問一下你覺得項目里面那一塊比較有挑戰(zhàn)性。
?
我就分析了一下Spring CLoud的源碼、還有分布式接口冪等性方案,分布式鎖,分布式事務(wù)的一些方案都講解了。
?
然后還問了一些比如說,新舊系統(tǒng)的數(shù)據(jù)庫如何遷移啊?然后怎么做的灰度發(fā)布?。恐饕际菄@者項目來問,這一塊其實沒有問的多深入。
2面也是技術(shù)面,主要是問了一些項目的問題,問我做商品服務(wù)的,電商詳情部分是不是我搞的?
?
我說了一些緩存架構(gòu)的東西,三級緩存,數(shù)據(jù)庫緩存雙寫一致性方案,Cache Aside Pattern,分析了數(shù)據(jù)庫緩存的數(shù)據(jù)不一致的問題,然后給出了解決方案!
?
還有如果多個實例如何確保正確,這樣又扯到了分布式鎖,分別講了一下Redis的分布式鎖和zookeeper的分布式鎖,對redisson、curator的底層原理分析了一波。
?
最后,等了十幾分鐘,二輪面試官說負責人出差北京了,讓回去等通知。最終等了2天也沒啥通知,暫且認為是失敗了吧。
?
總的來說,面試了5家公司,拿到了3家公司的offer,戰(zhàn)績還算可以。另外的話,還有一些面試的技巧。我覺得最重要的是自己要有信心,面試失敗了難免會氣餒,但是這個時候不要灰心,趕緊回去查漏補缺,然后把知識補起來。
?
另外,面試的時候,如果面試官問道一個問題,要主動帶節(jié)奏。
?
舉個例子,比如問到了AQS的實現(xiàn)原理,你就可以首先畫個圖,說明一下AQS底層是如何實現(xiàn)的?然后扯到底層的state變量是volatile的,然后對于volatile又可以扯出可見性,有序性,原子性,然后扯到了Java內(nèi)存模型,CPU內(nèi)存模型,還有高速緩存的一些硬件實現(xiàn)啊,MESI協(xié)議。以及它是如何通過指令、內(nèi)存屏障來保證可見性的。
?
我舉這個例子的意思就是說面試官問到一個問題,如果了解其底層原理,就主動說,你看過xx的原理,跟他說一下。這樣可以讓面試官對你的印象更加深刻。
?
當然了,這一切都是需要自己有很扎實的計算機基礎(chǔ),還有對某些技術(shù)研究的比較深入才能達到的。
??
最后我還是選擇了上文中第一家汽車服務(wù)平臺,因為幾家公司給的年薪都是25w,然后我選擇的是最有挑戰(zhàn)場景的電商類公司,對于技術(shù)成長會比較有好處。
?
最后,我想說的是,其實我算是半路出家做Java開發(fā)的了,付出了很多時間和努力,走過不少彎路,但也收獲了不少東西。
?
我這里不想給各位拼命打雞血灌雞湯,個人認為技術(shù)積累的過程注定孤獨,甚至黑暗,且周期漫長,需要你有足夠強的毅力和想改變自己的內(nèi)驅(qū)力。
?
希望咱們都可以通過不懈的努力,實現(xiàn)自己的夢想。我行你也行的,一起加油!
?
END
?
?
?
歡迎長按下圖關(guān)注公眾號石杉的架構(gòu)筆記
?
BAT架構(gòu)經(jīng)驗傾囊相授
?
本文摘自 :https://blog.51cto.com/u