1. 程式人生 > >進大廠也就這回事,工作後2到3年進大廠操作指南

進大廠也就這回事,工作後2到3年進大廠操作指南

    在BAT這種大廠裡,只要肯吃苦,技術和工資進步的速度會超出你想象,我在上海,按當前價格算,一般在大廠裡幹個三四年,好歹房子的首付應該能有,而且這種房子還不是太偏遠太小的。

    進大廠確實需要一定的實力,但如果單單技術好,沒有其它的技巧,估計確實也有些難度。不過話說來,哪怕是二本出身,哪怕技術一般,只要肯上心加方法得當,工作後3年進大廠應該不是難事。在本文裡,就將針對起點一般技術一般的同學,給出具體的進大廠操作指南。

1 先從戰略上藐視,進大廠也就這回事

    大廠裡也有隻有2,3年開發經驗的初級開發,而且其中有些同學的學校可能也就是個二本,或許他們進大廠前,資歷技術和你也差不多。甚至可以這樣說,只要找到渠道去面試,外加適當的準備技巧,進大廠其實比進一些面試要求比較苛刻的小公司更容易。

    就拿一些步驟來說吧,簡歷方面,只要有適當的分散式元件經驗就至少能得到面試機會,面試時,當然如果光會增刪改查當然不行,不過面試問到的題目以及提問的方式,網上多了去了,本文也會涉及,關鍵第一要適當看分散式技術,第二要結合專案說,這對初級開發而言,也不難。甚至當有些專案比較缺人時,面試的標準更會降低。

    我給大家量化一下進大廠的需要花費的努力和時間吧。第一大概每天用1個小時看資料執行程式碼準備說辭,每週大概累計用10個小時,經過2個月其實該看得就差不多了,然後再用2個月用幾個小公司面試練手,就可以去大廠投簡歷了。如果一切順利什麼都好說,萬一不成,換個專案組,或者多面幾家大廠,面個3,4次,應該也能行了。用時間努力應該不是問題,努力的方向可能未必大家都知道,具體的後文將詳細展開

2 儘可能洗白你的不利因素

    首先要讓你的簡歷過篩選,否則沒面試機會。能過篩選的簡歷一般長什麼樣?

    1 碩士,一本大學,1,2年經驗,而且最近專案裡包含分散式元件等值錢技術。

    2 如果大學一般, 本科學歷,估計要運氣,看不同的專案組,可能會需要再多1年左右的專案經驗,如果專案組著急要,或公司招聘需求高時,其實不看學校。

    3 這點很重要,別太頻繁跳槽,最好最近1年沒跳槽經歷,而且最近在職,不是長時間處於離職狀態。

    簡歷上專案經驗這塊可以自己挖掘,但如果有不利的因素,儘量用時間沖淡。

    1 學校一般,找個有高併發背景的專案,體現在簡歷上,最多兩年就夠了。

    2 最近跳槽太頻繁,找個公司窩個一年左右,最好是最近一年半沒跳槽經歷。如果有超過1個月的離職狀態,也可以通過連續上班個1,2年來淡化。

    3 剛從培訓班裡出來,也去找個小公司幹一年半載的,但要積累分散式專案經驗。

    大家注意沒,這部分一直在強調分散式元件的技術,具體而言是netty,redis,mycat,kakfa等高併發的技術,工作年限是一方面,另外你簡歷最近的專案裡,這些分散式元件的實踐技能一定要體現出來,如果你讓大廠的面試官感覺你第一相關技術年限不足,第二隻會增刪改查,那麼對不起,你沒面試機會。還有,如果你實際能力很強,但簡歷上看不出,面試官直接認為你不行。

3 資料結構方面,最好能引導到準備好的技術亮點

    資料結構是大廠面試必問的點,網上這些題目太多了,而且答案都可以準備。不過如果要進大廠,最好能觸類旁通。

    先用紅黑樹舉例,除了要能講基本資料結構,插入刪除節點能操作外,可以再引到ConcurrentHashmap底層資料結構上,用該物件的底層程式碼來說明,其實這和你的專案能力無關,事先準備下就行了,但如果你回答紅黑樹問題時順帶引出底層程式碼,甚至還可以從ConcurrentHash引到併發方面的問題,這樣面試官就不會認為你光會理論。

    再說比較常用的連結串列陣列等,這些第一可以和Java裡的ArrayList等物件一起講,第二可以順帶引出快速失效和遍歷等底層程式碼,這樣也能讓面試官感覺你基礎紮實。

    至於HashMap,這方面都被問爛了,網上的解析文太多了,但大家在回答好理論問題和底層程式碼後,也可以進一步展示鎖和併發的話題。

    總之,資料結構的問題是必問了,在這個環節,很多初級開發候選人甚至連底層程式碼層次的問題都回答不好,而你經過準備,不僅能舉一反三地展示你對底層程式碼的理解,更能借機展示鎖和併發等技術點,首先就能給面試官留下個好印象。至於筆試寫演算法,這種網上題目更多了, 事先更可以準備。

4 大廠更多考的是併發方面的能力,同時更要結合專案說

    先給些提問的方式,比如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超時以及防穿透的實現細節,其實這些技術並不深,但對初級開發的要求並不高,正是因為後者具備分散式元件的專案經驗,所以雖然兩位都錄用了,但後者的工資要高於前者。

5 充分展示除錯和部署專案的能力

     除錯和部署專案的能力對初級和高階開發來說絕對是亮點,而且哪怕是大廠的候選人,也不是每個人都會。這塊你如果說了,面試官未必會細問,只要聽你講的沒大問題即可,而且這塊不在於用到技術的深淺,而在於你知道這方面的實踐要點。

     在我之前的博文裡,如何準備Java面試?如何把面試官的提問引導到自己準備好的範圍內?,給出了準備壓測的實踐要點,從而大家可以看到,面試官不在乎你壓測方面解決過的問題,也不在乎涉及到的技術,只關心你有這方面分析和解決問題的經驗。

    同樣你可以在面試前準備些分析和解決問題的步驟,這之前也已經提到過,這裡再給個例子。比如cat等監控系統上頻繁報記憶體用量高,這時你看日誌或dump,然後發現了問題,問題根源太多了,除了剛才提到的redis快取沒釋放,更可以是netty堆外記憶體沒處理好。好吧這些涉及到的技術太深,那麼給些簡單的,比如因為HashMap用好沒clear,或者資料庫物件沒關,或執行緒池建立時用無限佇列快取任務,然後你搜oom原因,再去找其它原因,你專案裡遇到的就可以當作你亮點的說辭。

    再說部署方法,你可以看些zk加dubbo部署的配置檔案,也可以看些redis各種叢集的部署配置,如果你感覺有餘力,再看些灰度釋出切流量的配置,其實看會了也就是一兩句程式碼的問題,但你結合部署這個大題目說出來,立意就不同了,因為高階開發(以及架構師)不僅要會寫程式碼,更要會部署元件。

6 給出若廠面試過程的提問和回答

    面試官:介紹下你的經歷和專案經驗?

    候選人,介紹教育背景(二本三本都不要緊),有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原始碼,並解決過服務暴露的問題,然後很大機率能有機會說出。

   或者你沒機會說出壓測技能,就可以假惺惺地問,你們專案裡會不會做壓測?壓測時怎麼發請求?怎麼監控?然後可以在交流過程中說你的亮點。其它的亮點也照此準備。

7 多找幾家小公司面試,其實有些小公司的面試難度還超出大公司

    理想情況下,你面試的結果和技能無關,和專案經驗的長短也無關,只和你簡歷上的專案和技術介紹有關,和你事先的準備亮點說辭有關。    

    但如果單純準備不去實踐,任何面試官都能摸清你的底細,這點別有任何幻想。因為一方面你準備的點未必全,第二你準備的專案說辭未必很好地打過草稿,中間可能會有漏洞,這時你就需要找些小公司來嘗試了。

    這怎麼做:準備按大廠面試的標準準備,然後到處去投小公司的簡歷,記住先彆著急找大公司,儘量別在大公司裡留下面試不成的記錄,最好一週面個兩家。

    剛開始面試的時候,你會發現你的說辭漏洞百出,甚至會被看穿你的底細,但別灰心,第一收集面試官的問法,第二不斷練習亮點技能結合專案的說法,第三再不斷挖掘你的亮點技能,這個時間段裡,小公司的面試官會盡職地彌補你面試中的弱點。

    什麼時候能出師?第一面試官確實能問分散式元件的實踐經驗,而不是單純問理論,第二此類面試你通過三家,第三而且你是大優勢通過,而不是可上可下地通過。

8 進大廠的渠道

    這個時候你就能信心十足地去挑戰大廠了,這個時候如何找進大廠的渠道呢?

    1 在招聘網上等渠道,多接觸幾個獵頭,明和他們說你要進大廠,比如bat或者公司名稱。不是每個時間段大廠都有招聘名額,不要緊就等,而且等的時間不會太長,最多2個月。

    2 找內推,比如大家在網上看到有面試成功的文章,就聯絡下。

    這裡推薦是找獵頭,因為獵頭方便打探你面試結果,而且面試成了更能幫你最大程度爭取工資,同時萬一沒面成,你可以和獵頭說,你想面這家公司的其它專案崗位。如果你自己投簡歷,未必能得到這樣的遍歷。

    當你充分準備,並準備好的說辭經過小公司的檢驗後,一般問題就不大了,萬一再失敗,或者找該公司其它崗位,或者找其它大廠,最多面個3次應該也就成了。 

 9 總結,任何時候開始努力都不晚,大廠離你當前的高度最多也就兩年的距離

    還是這句話,其實進大廠,得到的也就是個能通過加班從而快速提升技能和收入的機會,而且大廠每年的招聘名額都不少,進大廠不難。網上我就見過不少畢業3年內的同學進大廠,我身邊的,我見過碩士就1年經驗進拼多多,本科2年經驗進阿里,至於3到5年經驗進大廠的人,我都記不過來了。

    進大廠除了能提升技能外,收益也比較可觀,比如工作3年,能有20k*16個月的收入,找個其它行業,這些資歷能有對應收入的,並不多沒,而且進大廠後,做個3,4年進可以繼續升級到架構師,達到年入五六十萬的收益(這還算平均水平),退可以像我這樣進個外企,工資外加平時出書出視訊,在上海也不至於餓死。

    可能不少同學現在看大廠需要仰視,但其實做的準備也就這麼回事,時間用夠,多看視訊教程,少幹無益的消遣,估計頂了天了,2年努力真的足夠了,1年洗白簡歷,1年準備,這還算多了。但如果固步自封,或者雖然努力但始終不敢邁出面試的步驟,那麼可能真只能在小公司裡隨遇而安了。

 

    感謝大家看完長文,本文寫了有3個半小時,而且篇幅足夠,如果大家感覺可以,請多多點贊,有問題也可以多寫評論。

 

版權說明:

    如果要轉載本文,請先徵得本人同意。