恭喜該同窗成功轉型java
毅然轉型,沒頭蒼蠅mysql
制定目標,系統學習android
面試經歷面試
首先,介紹一下個人背景。本人座標廣州,2016年畢業於一個普通二本大學,曾經在某機構培訓過Android。redis
2018年初的時候已經在兩家小公司工做幹了兩年的android開發,而後會一些Tomcat、Servlet之類的技術,當時的年薪大概也就15萬這樣子。算法
因爲我的發展規劃,在當時就已經決定了轉型幹Java後端開發了,可是因爲以前沒有相關經驗,當時好像一個沒頭蒼蠅同樣,胡亂買了幾本書籍,準備學習Spring MVC,MyBatis的XML配置方式。sql
可是當時有個同事給我提了一句,如今都流行Spring Boot了,而後我就轉學Spring Boot,百度網上看了幾篇文章,寫了幾個Demo就覺得本身很吊了。docker
接着又從同事的那裏得知,還有個Spring Cloud的東西,如今很流行。而後又轉戰Spring Cloud,一樣看了幾篇博客寫了幾個demo以後以爲本身叼的不行~(汗顏)數據庫
接下來,仍是熟悉的套路,同事說jenkins很吊,docker很吊、k8s很吊呀,還有什麼領域驅動模型,DDD啊,被牽着鼻子走。後端
反正聽到別人說那個牛逼就學習那個,可是每一個技術都是demo入門級別的掌握水平。我當時甚至連Controller/Service/DAO/Mapper、DO/DTO/VO之類的基本常識都不會。
這一切的轉折點在2018年5月,當時以爲這又搞一下,那又搞一下,不行啊。沒有系統的學習,各類東西都掌握的很差。
因而沉下心來開始進行系統的專題性學習,而且本身定下對每一個技術的學習目標。官網文檔開始,先掌握其基本用法,而後跑通最基礎的demo以後,基於這個demo,一步步調試,讀懂其底層源碼,邊讀邊寫筆記,這個過程及其漫長和煎熬。
在這個過程當中,我瘋狂的搜索了各類視頻教程,博客,公衆號,各類途徑都用上了。
給個人感受是,確實有視頻、博客講的挺好,可是極少。不少講的仍是比較淺,點到爲止。此時須要咱們本身進一步深刻到源碼層面研究,一點點啃,一點點摸索,邊啃邊記筆記。
在這一段時間,利用了不少業餘時間學習,基本上能夠保證工做日天天學習2~3個小時,週末天天平均12小時。
(可能這塊你們不是很相信,你們都是上班,爲何我就有時間學習呢。我要說的是,時間是本身控制的,能夠利用坐地鐵時間或者午休時間)
就這樣準備了大半年,截止2019年3月,由於對於當前公司的業務場景和薪資不太滿意,因此忍不住想出去跳槽了。
在這個過程當中,尤爲前期,我經歷了至暗時刻,摸索學習源碼幾近崩潰,如同黑暗森林通常。有的源碼我反覆讀了不小5遍,畫圖、記筆記,一遍遍的強化總結。
然而,正是這段時間,個人整個知識棧飛速擴張,而且由於我學完一個東西,都會本身畫圖,一步步給本身講解。這種學習方式讓我對新東西的掌握及其紮實,效果比那種泛泛而學好不少。
在這大半年的時間裏,學到了包括如下內容:
Java基礎
JDK集合、併發包內容,這些基本上都是研究到底層源碼了。好比volatile,AQS之類的,已經到了熟練於心,隨時能夠手工畫圖的地步。同時專門去學習了設計模式,而且能夠初步嘗試在公司項目中使用。
微服務架構
如今比較流行的微服務架構,這一塊選擇了學習比較熱門的Spring Cloud。將Spring Cloud的Eureka/Ribbon/Feign/Hystrix/Zuul這些套件深刻理解其源碼實現,對其底層源碼熟爛於心。
分佈式技術
好比一些分佈式事務,分佈式鎖,分佈式接口冪等性,分佈式基礎理論CAP之類的東西,這些也要掌握它們的場景以及對應的解決方案。
這裏說一下,其實本人就任的公司並無這些挑戰,甚至是單機系統,可是這一塊的技術方案實際上是能夠平時用本身公司項目來設想一下,設想作成分佈式以後,會面臨什麼問題,應該怎麼解決。
ps:順便提一下,這塊本人是受了石杉老師的文章:【offer收割機必備】我簡歷上的Java項目都好low,怎麼辦?的啓發,也推薦你們看一下,在公司沒有高大上的高併發項目時,應該怎麼應對?
IO、網絡基礎
這一塊我的以爲仍是很重要的,好比一些網絡基礎,Linux IO模型,Java裏面的BIO、NIO、AIO、這些內容其實仍是頗有必要掌握的。
ElasticSearch
這個是分佈式搜索引擎,目前大熱,通常互聯網公司都或多或少用到了es,這一塊是須要對其分佈式架構原理,搜索原理都搞的門兒清才行。
緩存、MQ
由於面對高併發場景,緩存MQ這兩塊也是必問的,因此專門看了一些緩存架構實戰的視頻教程。對於MQ的話,專門對RabbitMQ、Kafka這兩種深刻研究。
項目經驗
項目經驗這一塊是硬傷,確實來講這一塊在原來公司裏面不是很大的場景。
高併發這一塊平時確實積累不到不少知識,只能經過想象,當系統遇到的併發量提高10倍、100倍的時候,系統應該如何設計?
當遭遇到高併發流量時,用一些什麼樣的方案能夠支撐?採用緩存仍是MQ,採用了以後又什麼坑,又如何解決,這一塊須要本身深度思考一些細節問題。
數據結構、算法
這一塊沒啥好說的,就是靠平時積累以及leetcode刷題。我刷了幾十題這樣,加上平時積累的一些數據結構也是比較夠用的。
除此以外,在面試前還突擊了一下那些場景的面試題,包括MQ、Mysql、分庫分表、之類的常見互聯網面試題。
這一塊主要是看了石杉老師的《Java面試突擊第一季》教程,若是你要短時間突擊,我的真的很是推薦,由於能夠迅速幫你補充面試的各類技術點。
ps:我的很是感謝中華石杉老師的幾套課程:《億級流量系統架構》、《elasticSearch從零開始到頂尖高手》、《Java面試突擊第一季》,若是你能從頭至尾吃透這裏面的東西,正常的面試根本攔不倒你!
除此以外,石杉的架構筆記公衆號不少精品文章也讓我受益良多,好比公衆號的併發系列、分佈式系列、微服務系列。
文章分析了不少面試高頻熱門考點,我在面試時,不少問題都直接命中。
所以,我將本身的面經投稿到平臺,但願分享給更多朋友。同時也是對石杉老師表示感謝,但願公衆號越作越好!
看到這裏,可能部分同窗以爲不可能,在不到一年的時間裏從一個啥都不懂的小白,作到能熟練掌握這麼多東西的?
我想說的是,每一個人的狀況不同,我這邊學習一個東西起碼是通過5遍以後才能熟練記住,有的甚至看了不下10遍,反覆的畫圖操練,本身對本身講解。
因此,最重要的是肯花時間去學習。甚至我能夠透露一下,我除了學了這些以外,我還學習了一些大數據的技術,好比Hadoop的HDFS、Kafka源碼、Spark開發、Storm之類的
接下來講下個人面試經歷,在面試以前,本人基於職業發展的考慮,投簡歷基本上都是瞄準比較有點知名度的互聯網公司。
面試策略一開始也是想先找幾個小公司面面看,試試水。可是,好像今年行情確實不怎麼樣,每每投了好久沒啥反應。
後面一咬牙,乾脆直接投心儀的公司,後面經過投簡歷和內推的一些手段,拿到了5家公司的面試邀請。
我這邊面試的僅有5家公司,這些公司的面試套路基本上都是差很少。
1面問基礎,二面問項目,3面hr
某汽車服務平臺(拿到offer)
首先面試題是有一些算法的,好比讓你寫一個遞歸算法,還有一些二分查找之類的題目,整體來講還算比較簡單的算法題了。
1面的時候基本上就是自我介紹,而後問問比較熟悉那一塊,而後講了一些AQS原理。當時是手工在紙上畫圖的。
給面試官講完AQS以後,又讓我把話題扯到了volatile這一塊,我就從CPU內存模型、Java內存模型,而後結合CPU高速緩存的數據結構講解一下可見性問題是如何出現的。
以後又問了一些分庫分表的事情,HashMap的原理。
2面的時候是總監面,主要是上來就問了本身有沒有遇到到線上full gc,還有一些JVM內存劃分,GC收集算法,垃圾回收器之類的知識。
而後講一下本身看過啥源碼,而後圍繞着項目問了一些問題,好比說你遇到過最大的挑戰是什麼?
3面就是hr了,這一塊主要就是問一問離職緣由(錢太少咯),而後其餘就是問一下職業規劃,這塊按照本身想的說就好了。
最終的結果是拿到了25萬的offer。整體來講,這家公司的面試過程相對比較簡單一些。
某跨境電商公司(掛掉)
第二家公司主要作跨境電商,是經過內推拿到面試機會的。這裏面了2輪。
技術面試:
面試官問的算是比較全面了,首先自我介紹,而後就開始技術問題:
接着是問MQ:
而後到了Redis這一塊:
而後又問Mysql了:
接下來還討論到分佈式,好比說分佈式鎖啊,zk和eureka有什麼不一樣,CAP理論這一塊,還有畫出項目架構圖。Zuul線上怎麼配置。
2面hr面,這一塊也聊了挺久,主要也是問一些職業規劃啊,還有工做意願之列的,介紹一下原來工做狀況這樣。最終是讓回去等通知。
當晚經過內推的人知道被淘汰,其實在面試完本人也是以爲有機會的,不過最終倒是淘汰了,也沒什麼好說的,我以爲問的問題80%都答得挺好的。
總的來講,此次面試仍是能夠的,問的算是比較全面的,本身也知道本身哪一方面不足。查漏補缺!
某少兒在線教育公司 (拿到offer)
這家公司技術整體來講仍是很是能夠的,3面都是技術,老闆也是技術出身,兼了hr的工做。
1面主要讓你畫出線上的項目架構圖,而後針對分佈式事務,緩存架構,併發之類的都問了。
好比說分佈式事務,還有一些Spring Cloud的底層原理,Hystrix原理,CAS底層如何實現的?HashMap的原理,AOP如何使用的?事務有幾種實現方式,RabbitMQ如何控制消費速度?。
2面的也面的比較全面,也是問了一些AQS原理,volatile原理,synchronized底層原理,HashMap原理,針對Redis和ZK兩種分佈式鎖的一些問題
還有一些Mysql優化,索引底層數據結構,還有就是公司部署的時候是服務部署多少機器,是如何考量應該用多少機器?
而後使用到Redis,爲何上來就用Redis cluster架構而不考慮Master-slave模式呢?還有redis cluster爲何是分爲16384個slot?
紅黑樹和徹底二叉樹有啥區別?B+樹原理、爲何不用紅黑樹實現索引?
線上如何擴容集羣?Mysql執行計劃,snowflake算法,如何解決分庫分表後的跨表join問題?那些場景使用了tcc事務?哪些場景使用了可靠消息方案?
而後讓畫一下Hystrix的架構原理圖,分佈式接口冪等性如何保證?如何設計一個1000萬併發的系統,要求只能用有限的資源?還有就是一些項目管理的問題。
3面問了一些ArrayList的問題,而後問了Spring IOC有什麼做用?還有就是mysql在表數據量很是大而且數據單一的狀況下如何優化查詢性能?
總結:這家公司最終給了25萬的offer。總的來講面試官也算很nice了,問的問題比較全面,基本上項目,java基礎、mysql、事務、mq、緩存都有涉及到,也算是測出了個人水平。公司屬於比較技術性,多是由於老闆也是技術出身的緣由吧。
某職業教育公司(拿到offer)
這家公司純粹就是混混經驗的,面試過程也是1輪技術,1輪hr
技術面試: 基本上就是圍繞Spring源碼,MyBatis設計思想,還有一些分佈式事務的問題。。。而後還問了一些大數據類的問題,HDFS、HIVE之類的問題。而後就是問了一些項目的問題。總的來講問的比較少東西。
hr面:2輪直接hr,而後hr多是獲得1面面試官的反饋吧,當場給我offer。
可是說我這個工做年限(2016年畢業)正常來講是15萬年薪的,由於我技術好給到25萬,可是30萬是不可能了(我當時寫指望是30萬的)
某智能汽車平臺 (掛掉)
1面:2個面試官一塊兒面,主要是圍繞項目來問,首先畫一下本身的項目架構圖,而後問一下你以爲項目裏面那一塊比較有挑戰性。
我就分析了一下Spring CLoud的源碼、還有分佈式接口冪等性方案,分佈式鎖,分佈式事務的一些方案都講解了。
而後還問了一些好比說,新舊系統的數據庫如何遷移啊?而後怎麼作的灰度發佈啊?主要都是圍繞者項目來問,這一塊其實沒有問的多深刻。
2面也是技術面,主要是問了一些項目的問題,問我作商品服務的,電商詳情部分是否是我搞的?
我說了一些緩存架構的東西,三級緩存,數據庫緩存雙寫一致性方案,Cache Aside Pattern,分析了數據庫緩存的數據不一致的問題,而後給出瞭解決方案!
還有若是多個實例如何確保正確,這樣又扯到了分佈式鎖,分別講了一下Redis的分佈式鎖和zookeeper的分佈式鎖,對redisson、curator的底層原理分析了一波。
最後,等了十幾分鍾,二輪面試官說負責人出差北京了,讓回去等通知。最終等了2天也沒啥通知,暫且認爲是失敗了吧。
總的來講,面試了5家公司,拿到了3家公司的offer,戰績還算能夠。另外的話,還有一些面試的技巧。我以爲最重要的是本身要有信心,面試失敗了不免會氣餒,可是這個時候不要灰心,趕忙回去查漏補缺,而後把知識補起來。
另外,面試的時候,若是面試官問道一個問題,要主動帶節奏。
舉個例子,好比問到了AQS的實現原理,你就能夠首先畫個圖,說明一下AQS底層是如何實現的?而後扯到底層的state變量是volatile的,而後對於volatile又能夠扯出可見性,有序性,原子性,而後扯到了Java內存模型,CPU內存模型,還有高速緩存的一些硬件實現啊,MESI協議。以及它是如何經過指令、內存屏障來保證可見性的。
我舉這個例子的意思就是說面試官問到一個問題,若是瞭解其底層原理,就主動說,你看過xx的原理,跟他說一下。這樣可讓面試官對你的印象更加深入。
固然了,這一切都是須要本身有很紮實的計算機基礎,還有對某些技術研究的比較深刻才能達到的。
最後我仍是選擇了上文中第一家汽車服務平臺,由於幾家公司給的年薪都是25w,而後我選擇的是最有挑戰場景的電商類公司,對於技術成長會比較有好處。
最後,我想說的是,其實我算是半路出家作Java開發的了,付出了不少時間和努力,走過很多彎路,但也收穫了很多東西。
我這裏不想給各位拼命打雞血灌雞湯,我的認爲技術積累的過程註定孤獨,甚至黑暗,且週期漫長,須要你有足夠強的毅力和想改變本身的內驅力。
但願我們均可以經過不懈的努力,實現本身的夢想。我行你也行的,一塊兒加油!
END
我的公衆號:石杉的架構筆記(ID:shishan100)
歡迎長按下圖關注公衆號:石杉的架構筆記!
公衆號後臺回覆資料,獲取做者獨家祕製學習資料
石杉的架構筆記,BAT架構經驗傾囊相授