在BAT這種大廠裏,只要肯吃苦,技術和工資進步的速度會超出你想象,我在上海,按當前價格算,通常在大廠裏幹個三四年,好歹房子的首付應該能有,並且這種房子還不是太偏遠過小的。html
進大廠確實須要必定的實力,但若是單單技術好,沒有其它的技巧,估計確實也有些難度。不過話說來,哪怕是二本出身,哪怕技術通常,只要肯上心加方法得當,工做後3年進大廠應該不是難事。在本文裏,就將針對起點通常技術通常的同窗,給出具體的進大廠操做指南。java
大廠裏也有隻有2,3年開發經驗的初級開發,並且其中有些同窗的學校可能也就是個二本,或許他們進大廠前,資歷技術和你也差很少。甚至能夠這樣說,只要找到渠道去面試,外加適當的準備技巧,進大廠其實比進一些面試要求比較苛刻的小公司更容易。linux
就拿一些步驟來講吧,簡歷方面,只要有適當的分佈式組件經驗就至少能獲得面試機會,面試時,固然若是光會增刪改查固然不行,不過面試問到的題目以及提問的方式,網上多了去了,本文也會涉及,關鍵第一要適當看分佈式技術,第二要結合項目說,這對初級開發而言,也不難。甚至當有些項目比較缺人時,面試的標準更會下降。面試
我給你們量化一下進大廠的須要花費的努力和時間吧。第一大概天天用1個小時看資料運行代碼準備說辭,每週大概累計用10個小時,通過2個月其實該看得就差很少了,而後再用2個月用幾個小公司面試練手,就能夠去大廠投簡歷了。若是一切順利什麼都好說,萬一不成,換個項目組,或者多面幾家大廠,面個3,4次,應該也能行了。用時間努力應該不是問題,努力的方向可能未必你們都知道,具體的後文將詳細展開redis
首先要讓你的簡歷過篩選,不然沒面試機會。能過篩選的簡歷通常長什麼樣?算法
1 碩士,一本大學,1,2年經驗,並且最近項目裏包含分佈式組件等值錢技術。spring
2 若是大學通常, 本科學歷,估計要運氣,看不一樣的項目組,可能會須要再多1年左右的項目經驗,若是項目組着急要,或公司招聘需求高時,其實不看學校。sql
3 這點很重要,別太頻繁跳槽,最好最近1年沒跳槽經歷,並且最近在職,不是長時間處於離職狀態。數據庫
簡歷上項目經驗這塊能夠本身挖掘,但若是有不利的因素,儘可能用時間沖淡。數組
1 學校通常,找個有高併發背景的項目,體如今簡歷上,最多兩年就夠了。
2 最近跳槽太頻繁,找個公司窩個一年左右,最好是最近一年半沒跳槽經歷。若是有超過1個月的離職狀態,也能夠經過連續上班個1,2年來淡化。
3 剛從培訓班裏出來,也去找個小公司幹一年半載的,但要積累分佈式項目經驗。
你們注意沒,這部分一直在強調分佈式組件的技術,具體而言是netty,redis,mycat,kakfa等高併發的技術,工做年限是一方面,另外你簡歷最近的項目裏,這些分佈式組件的實踐技能必定要體現出來,若是你讓大廠的面試官感受你第一相關技術年限不足,第二隻會增刪改查,那麼對不起,你沒面試機會。還有,若是你實際能力很強,但簡歷上看不出,面試官直接認爲你不行。
數據結構是大廠面試必問的點,網上這些題目太多了,並且答案均可以準備。不過若是要進大廠,最好能舉一反三。
先用紅黑樹舉例,除了要能講基本數據結構,插入刪除節點能操做外,能夠再引到ConcurrentHashmap底層數據結構上,用該對象的底層代碼來講明,其實這和你的項目能力無關,事先準備下就好了,但若是你回答紅黑樹問題時順帶引出底層代碼,甚至還能夠從ConcurrentHash引到併發方面的問題,這樣面試官就不會認爲你光會理論。
再說比較經常使用的鏈表數組等,這些第一能夠和Java裏的ArrayList等對象一塊兒講,第二能夠順帶引出快速失效和遍歷等底層代碼,這樣也能讓面試官感受你基礎紮實。
至於HashMap,這方面都被問爛了,網上的解析文太多了,但你們在回答好理論問題和底層代碼後,也能夠進一步展現鎖和併發的話題。
總之,數據結構的問題是必問了,在這個環節,不少初級開發候選人甚至連底層代碼層次的問題都回答很差,而你通過準備,不只能觸類旁通地展現你對底層代碼的理解,更能借機展現鎖和併發等技術點,首先就能給面試官留下個好印象。至於筆試寫算法,這種網上題目更多了, 事先更能夠準備。
先給些提問的方式,好比netty,先問重要組件和工做流程,再問序列化,服務暴露等事先細節,再問讀寫索引半包粘包等問題,其實對初級開發而言,問到這裏就差很少了,若是要找個高級開發,可能再會結合底層代碼問。分佈式組件有不少,其它組件,好比mycat,也是先問用法,好比如何設置分庫規則,再問底層細節,好比底層代碼如何把sql定位到具體的庫上。再如redis,能夠先會問些數據結構以及基本用法,再問些諸如集羣等方面的細節。
哪怕去面大廠的高級開發,準備分佈式併發這塊其實也不是問題,由於不少人在以前其實基本沒相關項目經驗,其實都是在背題,你只要在面試時,讓面試官感受略微比別人多些項目經驗便可,下面給些準備的方法。
1 先看幾套面試題,這些面試題其實都大同小異,都會比較深地涉及到底層源碼和實踐要點,先把理論題背熟。這些點雖然很多,但其實都是體力活,背書麼,這種事應該沒難度。該背哪些素材呢?我以前看到的吊打面試官系列就不錯。其實當你們看了幾套題之後,會發現分佈式組件的值錢技術,也就這麼多。
2 其實不少候選人僅僅停留在這個地步,若是你作了後繼步驟,就比大多人強了。在背熟之後,再給一些技術找些項目的背景,這些技術未必要深,但必定要結合項目的業務。好比就說最基本的redis,你說你以前的項目是某數據處理模塊(項目能夠按實際說),併發量大概每秒1k,若是都把請求壓到數據庫,數據庫受不了,因此就用redis集羣,而後準備些集羣的大體配置方式。在用的時候,結合業務,用到了裏面string等數據結構,用的時候會設置超時時間,以防緩存一直在內存,同時爲了防止穿透,會把null也緩存起來。同時量力而行,就別再說redis事務了。
請注意結合業務說技術的時候,未必要涉及過於細節的點,好比不用涉及到redis的線程模型沒,但首先得說些配置值(好比集羣配置值和超時配置的方式),讓面試官感受你確實在項目裏用過,其次要講些項目裏用到的經驗,好比redis要用集羣,防止單點失效,設置的超時時間最好後面帶個隨機秒,以防一個時間點裏大批量緩存失效,一會兒去拿數據庫從而致使壓力過大。
這裏僅僅給出了redis,另外,mycat,kafka,netty, zookeeper,dubbo等,也照此辦理,這樣哪怕你平時用得很少,但也能讓面試官感受這方面你有實際的項目經驗。
3 確實分佈式組件這塊要說好不容易,爲了讓面試官感受你有這方面的經驗,或者做爲沒說好問題時的補救措施,你最好再整理些實際解決過的問題。
準備問題時先講問題是如何發現的,好比日誌裏頻繁報oom異常,或者乾脆系統登不上,再說你是什麼查的,無非是經過linux命令看日誌,或者用dump看內存鏡像,再說問題緣由,好比dubbo超時時間過長致使請求卡住,或者redis沒設超時時間致使內存oom,這些點網上一搜也是一大堆。
並且你分析問題緣由時,更能夠藉機讓面試官感受你熟悉分佈式組件的底層源碼,好比你準備些netty底層讀寫索引(或零拷貝)的源碼,面試時當你說你解決過因netty半包等緣由而致使的問題時,能夠藉機拋出。
4 再準備些畫龍點睛的說辭,當你結合項目以及你解決過的問題說出分佈式組件技術時,再說出這些點,當即能讓面試官高看你,這些點能夠是基於kafka的防冪等機制,也能夠是zk整合dubbo的源碼,這種值錢技術和源碼太多了。因爲找這些點是體力活,因此本人在這裏就懶得再列了。
再囉嗦下,準備分佈式技術說辭時,必定要結合項目,哪怕你平時用得不多,但能夠找網上的資料,但找到後必定要融入到項目裏。這裏給個例子,某初級開發候選人也很用心,背了不少分佈式題,基本有問必能回,但當面試官讓結合以前項目經驗說用到的技術時,他說不上,另外一位其實分佈式底層細節瞭解不深,但就能結合項目說些redis超時以及防穿透的實現細節,其實這些技術並不深,但對初級開發的要求並不高,正是由於後者具有分佈式組件的項目經驗,因此雖然兩位都錄用了,但後者的工資要高於前者。
調試和部署項目的能力對初級和高級開發來講絕對是亮點,並且哪怕是大廠的候選人,也不是每一個人都會。這塊你若是說了,面試官未必會細問,只要聽你講的沒大問題便可,並且這塊不在於用到技術的深淺,而在於你知道這方面的實踐要點。
在我以前的博文裏,如何準備Java面試?如何把面試官的提問引導到本身準備好的範圍內?,給出了準備壓測的實踐要點,從而你們能夠看到,面試官不在意你壓測方面解決過的問題,也不在意涉及到的技術,只關心你有這方面分析和解決問題的經驗。
一樣你能夠在面試前準備些分析和解決問題的步驟,這以前也已經提到過,這裏再給個例子。好比cat等監控系統上頻繁報內存用量高,這時你看日誌或dump,而後發現了問題,問題根源太多了,除了剛纔提到的redis緩存沒釋放,更能夠是netty堆外內存沒處理好。好吧這些涉及到的技術太深,那麼給些簡單的,好比由於HashMap用好沒clear,或者數據庫對象沒關,或線程池建立時用無限隊列緩存任務,而後你搜oom緣由,再去找其它緣由,你項目裏遇到的就能夠看成你亮點的說辭。
再說部署方法,你能夠看些zk加dubbo部署的配置文件,也能夠看些redis各類集羣的部署配置,若是你感受有餘力,再看些灰度發佈切流量的配置,其實看會了也就是一兩句代碼的問題,但你結合部署這個大題目說出來,立意就不一樣了,由於高級開發(以及架構師)不只要會寫代碼,更要會部署組件。
面試官:介紹下你的經歷和項目經驗?
候選人,介紹教育背景(二本三本都沒關係),有1到2年相關經驗(挖掘課程設計畢業設計和工做後的經驗,應該能夠達到)。略微介紹項目的業務,好比我以前在xx公司作了支付系統,用到spring boot, netty, mycat等技術(準備過的亮點均可以說,分佈式組件多多益善),在項目裏,我不只寫代碼,還參與過壓測和數據庫和jvm調優(拋出誘餌等來問),還解決過線上報出的redis緩存穿透,kafka消息重發致使不冪等和dubbo超時致使線上鏈接數打滿的問題(這裏多準備些分佈式的問題,也坐等面試官來問)。再介紹些超出編碼技能的能力,好比說,在項目裏,我還用過sonar來管理項目質量,參與過jenkins發佈部署腳本的編寫等。(這種技術每一個項目都有,你關注下,無非是寫配置,但你說了就不同了)
聽你講完項目介紹後,面試官會問分佈式等問題,好比會問,你說你解決過redis緩存穿透問題,你說下如何解決的?
候選人:(回答的時候必定要結合項目),在個人支付管理系統了,支付模塊會向風控模塊請求公司的風控數據,但相同請求的參數會發屢次,因此就用redis來緩存(大體介紹業務背景),但實際應用中,發出的請求未必全存在風控的庫裏,因此就穿透了。後來解決的方法是,把null值也緩存,把一些常常請求的但不存在風控表裏的參數也緩存。注意這裏面試官不會關注具體業務和解決方案,你只要大體說得沒問題就行,好比這裏你別說就用單機版的redis就好了。一樣的問題解決方案多準備幾套,這樣你說了,面試官就會認爲你在實際項目裏用過。
當你講完redis,mycat,kafka,netty等解決過的問題後,面試官會開始問些底層的細節,好比會問,你說下netty的線程模型,netty的讀寫索引,dubbo反序列化的協議等等,這些就屬於考理論知識了,因爲你事先背過,因此應該不會有太大的問題。這裏面試官的用意是想擺脫你事先的準備,因此會隨機發問,但你要想辦法把問題點拉回來,並且爭取多耗時間,這怎麼作呢?
(好比問netty的線程模型),候選人:先邊畫邊說,講好模型後,而後當即帶一句,在咱們項目裏,是用線程池來管理work進程(拉回到業務裏),在管理進程時,還遇到過因緩存隊列設成無界隊列而致使的oom問題。(再次拋出誘餌坐等問),而後藉機展開,以此成功耗費面試時間。並且若是按上文給出的準備步驟,你能夠準備好每一個組件解決過的問題,而後逐一展開。
當問好分佈式組件後,面試官可能會問些數據庫和java基礎,這些更簡單了。
面試官:大家項目的數據庫是什麼?
候選人:咱們用到的是oracle,在項目裏用到了mycat分庫分表(以前說過就算了,沒說過就拋出),在項目裏,我還處理過長sql問題(由此引出調優亮點)。
面試官:你是什麼調優的?(情不自禁地被引導)
候選人:咱們用到的監控方式是cat,當監控系統上發現長sql時,咱們就用執行計劃來分析,而後對應地建索引,或者建redis緩存,或者用with語句優化sql。而後找個準備過的sql講下就結了。
而後面試官會問些索引之類的問題,這些你事先背些答案,講些底層結構便可。問好數據庫,面試官會問java核心,好比hashmap,線程安全不安全,或者jvm問題。這種你背好答案,一樣再引伸下。
候選人:對於hashmap,除了剛纔我講的底層代碼外,用好之後,咱們還須要當即clear,以防內存泄漏(引到內存話題)。或回答好jvm問題後,你當即說,在實際項目裏,咱們會監控jvm的用量,當超出70%時,就用dump文件看鏡像,以前項目裏我遇到的jvm問題有,netty堆外內存管理不善,ThreadLocal用好沒remove,形成oom的緣由太多了,你們自行準備,我不展開了。
經過上述方式,你回答好問題後,當即結合業務拋出下個誘餌,而後想辦法把問題引到jvm調優,數據庫調優,線程底層代碼,(hashmap等)底層源碼之類的問題,這樣可能你自己的技術未必行,並且資歷也未必夠,但面試官給你的評價可能就是,第一基礎紮實,第二有調優經驗,第三有分佈式組件的使用經驗,若是面高級開發,上述三點就足夠了,更況且去面初級開發,指不定還有以下的評價,好比掌握項目代碼質量的提高技能,熟悉線上調試和發佈的基本技能,熟悉分佈式底層細節等。若是再獲得這些評價,估計面架構師都夠了。
這還不算完,當面試官提好問題,但你準備的亮點沒機會拋出時,別不甘心,有機會拋出。
面試官:我問題問好了,你有什麼要問個人?
候選人:(先套上話),若是我有幸面試成功,會進哪一個項目組?而後無論面試官怎麼回答,哪怕回答「這要看狀況分配」也沒關係,而後繼續問,(好比dubbo亮點沒拋夠)在大家項目裏,怎麼作遠程調用的(揣着明白裝糊塗)?面試官通常就會說dubbo了,而後交流,交流過程當中不經意說句話,咱們以前項目也用dubbo,因此我還看過dubbo源碼,並解決過服務暴露的問題,而後很大概率能有機會說出。
或者你沒機會說出壓測技能,就能夠假惺惺地問,大家項目裏會不會作壓測?壓測時怎麼發請求?怎麼監控?而後能夠在交流過程當中說你的亮點。其它的亮點也照此準備。
理想狀況下,你面試的結果和技能無關,和項目經驗的長短也無關,只和你簡歷上的項目和技術介紹有關,和你事先的準備亮點說辭有關。
但若是單純準備不去實踐,任何面試官都能摸清你的底細,這點別有任何幻想。由於一方面你準備的點未必全,第二你準備的項目說辭未必很好地打過草稿,中間可能會有漏洞,這時你就須要找些小公司來嘗試了。
這怎麼作:準備按大廠面試的標準準備,而後處處去投小公司的簡歷,記住先彆着急找大公司,儘可能別在大公司裏留下面試不成的記錄,最好一週面個兩家。
剛開始面試的時候,你會發現你的說辭漏洞百出,甚至會被看穿你的底細,但別灰心,第一收集面試官的問法,第二不斷練習亮點技能結合項目的說法,第三再不斷挖掘你的亮點技能,這個時間段裏,小公司的面試官會盡職地彌補你面試中的弱點。
何時能出師?第一面試官確實能問分佈式組件的實踐經驗,而不是單純問理論,第二此類面試你經過三家,第三並且你是大優點經過,而不是可上可下地經過。
這個時候你就能信心十足地去挑戰大廠了,這個時候如何找進大廠的渠道呢?
1 在招聘網上等渠道,多接觸幾個獵頭,明和他們說你要進大廠,好比bat或者公司名稱。不是每一個時間段大廠都有招聘名額,沒關係就等,並且等的時間不會太長,最多2個月。
2 找內推,好比你們在網上看到有面試成功的文章,就聯繫下。
這裏推薦是找獵頭,由於獵頭方便打探你面試結果,並且面試成了更能幫你最大程度爭取工資,同時萬一沒面成,你能夠和獵頭說,你想面這家公司的其它項目崗位。若是你本身投簡歷,未必能獲得這樣的遍歷。
當你充分準備,並準備好的說辭通過小公司的檢驗後,通常問題就不大了,萬一再失敗,或者找該公司其它崗位,或者找其它大廠,最多面個3次應該也就成了。
仍是這句話,其實進大廠,獲得的也就是個能經過加班從而快速提高技能和收入的機會,並且大廠每一年的招聘名額都很多,進大廠不難。網上我就見過很多畢業3年內的同窗進大廠,我身邊的,我見過碩士就1年經驗進拼多多,本科2年經驗進阿里,至於3到5年經驗進大廠的人,我都記不過來了。
進大廠除了能提高技能外,收益也比較可觀,好比工做3年,能有20k*16個月的收入,找個其它行業,這些資歷能有對應收入的,並很少沒,並且進大廠後,作個3,4年進能夠繼續升級到架構師,達到年入五六十萬的收益(這還算平均水平),退能夠像我這樣進個外企,工資外加平時出書出視頻,在上海也不至於餓死。
可能很多同窗如今看大廠須要仰視,但其實作的準備也就這麼回事,時間用夠,多看視頻教程,少幹無益的消遣,估計頂了天了,2年努力真的足夠了,1年洗白簡歷,1年準備,這還算多了。但若是固步自封,或者雖然努力但始終不敢邁出面試的步驟,那麼可能真只能在小公司裏隨遇而安了。
感謝你們看完長文,本文寫了有3個半小時,並且篇幅足夠,若是你們感受能夠,請多多點贊,有問題也能夠多寫評論。
版權說明:
若是要轉載本文,請先徵得本人贊成。