Android工程師轉型Java后端開發之路,自己選的路,跪著也要走下去!

本文是公眾號讀者jianfeng投稿的面試經驗

恭喜該同學成功轉型


目錄:

毅然轉型,沒頭蒼蠅

制定目標,系統學習

面試經歷

毅然轉崗,沒頭蒼蠅

首先,介紹一下我的背景。本人坐標廣州,2016年畢業于一個普通二本大學,曾經在某機構培訓過Android。

2018年初的時候已經在兩家小公司工作干了兩年的android開發,然后會一些Tomcat、Servlet之類的技術,當時的年薪大概也就15萬這樣子。

由于個人發展規劃,在當時就已經決定了轉型干Java后端開發了,但是由于之前沒有相關經驗,當時好像一個沒頭蒼蠅一樣,胡亂買了幾本書籍,準備學習Spring MVC,MyBatis的XML配置方式。

但是當時有個同事給我提了一句,現在都流行Spring Boot了,然后我就轉學Spring Boot,百度網上看了幾篇文章,寫了幾個Demo就以為自己很吊了。

接著又從同事的那里得知,還有個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輪。

技術面試:

面試官問的算是比較全面了,首先自我介紹,然后就開始技術問題:

  • HashMap原理?
  • synchronized和ReentrantLock有什么不同?
  • AQS原理?
  • 線程池的各個參數作用?
  • Spring Boot如何實現AutoConfig?
  • 還問了CurrentHashMap這一塊原理?

接著是問MQ:

  • 用RabbitMQ,他們有幾種exchange?
  • 消費者推拉模式有什么區別?
  • 為什么用MQ?

然后到了Redis這一塊:

  • 緩存穿透、雪崩、擊穿各種場景的問題以及解決方案?
  • redis為啥速度快?以及Redis Pipeline相關的一些問題。

然后又問Mysql了:

  • mysql的索引原理是啥?
  • 然后mysql的執行引擎有幾種,有啥區別?
  • 事務隔離級別?
  • 線上數據庫用什么級別隔離?
  • @Transactional有什么關鍵參數?
  • 針對分布式場景下的事務解決方案是如何實施落地的?
  • TCC事務、還有一些可靠消息方案,針對你公司的業務場景講解清楚,然后詳細問每一個細節是如何落地的,這樣會不會出什么問題?

接下來還討論到分布式,比如說分布式鎖啊,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架構經驗傾囊相授


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

書呆子rico_尋找設計和類型書呆子的清道夫

書呆子ricoI studied graphic design at an art school where typography was a core focus. I took 3 levels of typography classes and nearly lost my mind! But even before I studied type, I had a soft spot for signage. It’s one of the themes I enjoy shooting mo…

Regsvr32 dll OCX時報錯,LoadLibrary(Dllname) 內存訪問失敗。

解決辦法: 把要注冊的DLL或者OCX文件COPY到C盤根目錄,運用命令提示符工具,進入C盤根目錄,再運行Regsvr32 DLLname.dll即可。 轉載于:https://www.cnblogs.com/BrianLee/archive/2011/12/04/2275425.html

WebStorm 和 VsCode 的結合體來了!

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。周末分享下簡單的文章~每…

從零開始學Node.js(八_刪查)

node.js的事件 Node.js 是單進程單線程應用程序,但是因為 V8 引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,所以性能非常高。Node.js 幾乎每一個 API 都是支持回調函數的。Node.js 基本上所有的事件機制都是用設計模式中觀察者…

設計的概念以及含義_什么是設計概念? 以及為什么您應該始終從一個開始

設計的概念以及含義We work on designs almost every day, and we use different design methods to make the design usable, aesthetically appealing, and likable. But, many times, those well-crafted designs fail to reach a level to become market differentiator or…

C# 與java區別總結 收集

節選自《C、Java/C#之比較》http://dev.firnow.com/course/3_program/c/cppsl/2008520/117228.html 使用指針,由程序員根據需要分配、訪問內存,程序運行時動作明確直接沒有額外的處理步驟,程序的執行效率就高,但若程序員忘了釋放內…

碎片化學習前端資料分享~

大前端學習,關注這幾個大佬就夠了。他們的文章提供的大前端知識非常完備,也經常推薦大前端面試、個人成長相關的文章,對于你來說,學大前端,關注這些公眾號就夠了。不多說,直接看這些大佬的介紹。&#x1f3…

1、類型和語法——類型

類型:值的內部特征,定義了值的行為,以使其區別于其他值1.1 類型事關強制類型轉換1.2 內置類型七種除對象外,其他統稱為“基本類型”函數是 Object 的一個字類型(可調用對象)數組也是一個“子類型“1.3 值和…

netflix 工作原理_Netflix如何在屏幕后面工作?

netflix 工作原理Netflix has reported to have over 182 million subscribers worldwide in the first quarter of 2020 (Of course, these numbers don’t include freeloaders like me, who’s family or friends have been generous enough to share their account and pas…

B/S開發中瀏覽器的工具利器

B/S系統的前端瀏覽器性能和標準兼容方面是開發中的一個重要問題,把IE中使用的各種工具整理一下,對于開發中標準、規范檢查等起到一個作用 主要是三個主流的瀏覽器和相關的插件 FireFox Firefox-latest.exe firebug-1.7.3-fx.xpi yslow-3.0.3-fx.xpi 安裝…

你需要的git命令大全來了

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。雖然你可能用圖形化工具…

uitest_您在Swift中的第一個UITest

uitest測試中 (TESTING) 什么是自動UITest? (What Is Automated UITest?) When we speak about testing, we usually think about unit testing. However, there is another kind of test that is extremely powerful and useful in the app world: UITests.當談到…

UltraGrid中實現下拉Grid(UltraDropDown)

昨天提到了如何在Grid的Cell中下拉列表框,今天將演示如何在Grid的Cell中實現下拉Grid,這也是UltraGrid提供的一個很好的特性。 1. 拖放一個Grid到Form中,添加一些Band Column,然后設置Team欄位為DropDown或DropDownLis…

Vue團隊核心成員開發的39行小工具 install-pkg 安裝包,值得一學!

1. 前言大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。本文倉庫 https:…

人臉識別及對比_沒有“色彩對比可及性的神話”

人臉識別及對比重點 (Top highlight)When you need to work on interfaces, color contrast is a real thing you have to take into account to make it accessible. You have the right to be afraid of losing part of the aesthetics of your beautifully well-designed in…

Entity Framework4.0 (一)概述(EF4 的Database First方法)

Entity Framework4.0(以后簡稱:EF4),是Microsoft的一款ORM(Object-Relation-Mapping)框架。同其它ORM(如,NHibernate,Hibernate)一樣,一是為了使開發人員以操作對象的方式去操作關系…

mysql 相關子查詢使用【主表得數據需要擴展(統計數據依賴與其他表,但是與主表有關聯)】...

2019獨角獸企業重金招聘Python工程師標準>>> SELECT t.building,t.unit,t.room,t.ashcan ,(SELECT COUNT(a.resident_id) from t_address_book a where a.village_id t.village_id AND a.building t.building and a.room t.unit and a.house t.room and…

竟然被尤雨溪點贊了:我給Vue生態貢獻代碼的這一年

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。這篇文章在知乎被尤雨溪…

java版電子商務spring cloud分布式微服務b2b2c社交電商(四)SpringBoot 整合JPA

b2b2c電子商務社交平臺源碼請加企鵝求求:一零三八七七四六二六。JPA全稱Java Persistence API.JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。JPA 的目標之一是制定一個可以由很多供應商實現的AP…

60款很酷的 jQuery 幻燈片演示和下載

jQuery 是一個非常優秀的 JavaScript 框架,使用簡單靈活,同時還有許多成熟的插件可供選擇,它可以幫助你在項目中加入漂亮的效果,其中之一就是幻燈片,一種在有限的網頁空間內展示系列項目時非常好的方法。今天這篇文章要…