Java工程師:非科班自學Java是如何獲得校招offer的

b10l07發表於2018-01-24

背景介紹

樓主某末流985渣碩一枚,磕鹽不會,偶然接觸了下程式設計,然後又稍微學了學Java,後面就走上了程式猿的道路,今年四月僥倖去菊廠實習了一波(雖然沒學到東西)。

秋招拿了幾個一般的offer(大佬們別見笑):去哪兒、海康威視、招銀網路科技,最後簽約招銀(四川人,想每天下班吃火鍋)。

去年的時候比較迷茫,不知道自學到底需要準備什麼,在牛客上看了很多面經,非常受益,今天也分享一下供參考。本篇文章主要講講自學的歷程即找工作需要注意的地方。

自學經歷

樓主去年4、5月開始決定學習Java,最開始主要看《Head First Java》(該書配有大量插圖及段子,入門佳選,入門切忌《Java程式設計思想》),然後看了大量的培訓班視訊學習了Java基礎知識,資料庫,Java常用框架(很多人看不起培訓班,培訓班的質量確實參差不齊,但是由於針對基礎薄弱的童鞋,所以老師講的特別清楚,以我校學子來看學著肯定非常輕鬆,我一般開1.6倍到1.8倍的速度聽)。在8月份的時候開始接觸演算法和資料結構,剛開始一頭霧水,這演算法和資料結構到底學習誰先誰後啊,做題看不懂,看書不太好理解。這裡推薦《演算法第四版》,配有大量的圖,讓你詳細理解資料結構設計的過程(入門切忌《演算法導論》)。

搞完這些之後,有幸加入了一個工作室,(工作室由於剛成立事情不多後面也解散了,東西沒有學到太多但是認識了幾個朋友)在工作室期間,看了《程式設計師面試金典》、《劍指offer》,在牛客網上刷了劍指offer上的題(剛開始做題基本上做不了,先想然後看別人的解答仔細思考,再自己慢慢敲,做多了可能就有感覺了)。

後續又看了《高效能MySQL》(大部頭,有時間必看,時間少選看)、《深入理解Java虛擬機器》(必看,忘了就看,主要是垃圾回收演算法、類載入那一塊,其它章節可以選看)、《併發程式設計的藝術》(必看,主要了解一下鎖的原理)、《圖解HTTP》、《圖解TCP/IP》(日本人寫的書,結合大量插圖,看著很淺顯易懂)、《Java程式設計師面試寶典》(完全的面試知識點羅列的書,評分較低,但是對於梳理知識點是非常適合的)、《資料結構與演算法分析 Java語言描述》(覺得演算法第四版少了點什麼的話可以看這個補充)。這些書再結合大量的部落格可以基本覆蓋校招的知識點。

在今年三月份時各大公司開始招聘實習生,樓主水平有限去了華為實習,方向也是Java軟開。由於所在小組全棧式開發,在裡面耗費了大量時間學習了前端知識(前端依然菜的摳腳),所以整體感覺上實習提升不大。實習了四個月之後,在八月底結束實習,由於部門原因通知沒法轉正。當時心裡很氣然並卵,覺得自己在裡面提升不大又耽誤了很多準備的時間,不如在圖書館看書(這也是個教訓,實習不一定有優勢,如果實習打雜轉正機率小的話不如在學校夯實基礎準備校招)。所幸樓主在華為實習的時候每晚回去繼續看書,同時在實習時有幸認識北研所一位實習老哥,每天用內部聊天工具跟他交流Java基礎,基礎尚不算太差。(這裡想說一點的是,8月初很多公司就開始了內推招聘,現在內推特別氾濫,基本都要求筆試,筆試難度高於校招,沒有準備的話基本gg,但最好都投一下試試水,樓主當時由於在實習演算法沒練好就網易過了筆試。。。)

ps:這裡說點個人感悟,當初在準備實習時,以為刷完劍指offer、程式設計師面試金典,實習的題應該沒啥問題了。實際情況是:實習題型基本全是動態規劃(尤其是揹包問題)、圖搜尋,如果早做準備,那完全沒問題。而等到正式校招時你才會動態規劃基本題型,這時候的題的難度又上升了,所以演算法題得早做準備。

校招經歷

校招在九月初的時候各大公司就開始集中網申了,需要提前做好簡歷。樓主大概投了40多家公司(樓主覺得一定要多投多練,不一定只投自己想去的公司,在面試初期可以拿幾家公司先練練手,如果運氣好有幸拿了offer更佳。多投能讓你有更多的選擇,如果你只投了幾家公司,然後都掛了,那麼你後面基本只能投小公司了),整個九月上半月每天基本都在考試、投簡歷、做測評,印象最深的是有一天考了四個筆試,當晚投了一個公司簡歷,又做了倆小時新華三的測評,當時大概凌晨一點,整個人都噁心了。

在面試初期好幾家面試都沒過,加上被菊廠拒了,心裡還是很不爽的,直到九月中旬去哪兒三面直接發了offer,當時有點柳暗花明的感覺。後面又面了招銀、海康之內的好幾家公司,在拿到這幾家之後基本就沒找了(期間經常每天四五個面試邀請衝突,拒絕的感覺還是挺爽的,覺得自己之前做這麼多筆試還是有效果的)


下面講講幾個公司的面試問題:


酷家樂

一家創業做裝潢的創業公司,面試體驗非常好,但二面約的時間和一個現場面試衝突了沒面

電面:

說說你印象最深的專案(非同步佇列)       

在專案中遇到了什麼問題(資料庫的設計、非同步佇列如何將事件傳入)       

說說對redis的理解(基於記憶體、I/O多路複用、單執行緒)       

redis為什麼要使用單執行緒(面試官補充主要是為了原子性操作)       

redis有哪些常用的資料結構,專案中你使用了什麼資料結構       

說一下spring的瞭解,有幾種注入方式,你們專案一般使用什麼進行注入       

專案的web.xml配置中dispatcherServlet和ContextListener是幹什麼的       

mybatis使用情況,瞭解哪些,用了哪些標籤       

專案中用到了什麼設計模式       

專案使用了什麼版本管理軟體,在github學習什麼開源專案沒有       

一道演算法,有序陣列裡面數字可重複,給定一個數,找出該數的範圍(第一次就想到了遍歷,後面想二分查詢改進)       

漢諾塔問題


遠景能源

新能源的土豪公司,招偏執狂,感覺面試官是有那麼點特色的,抓著一個點死問

電面:

類載入瞭解嗎?類載入步驟,雙親委派模型。如果我寫了一個java.lang.String類,怎麼進行載入的,怎麼跟原來的類進行區分的?       

垃圾回收機制瞭解嗎?哪些時間我們需要對垃圾進行回收,如果我有一臺雙核4g的機器,我該如何分配新生代和老年代的大小?       

異常捕獲瞭解嗎?說說常用的,你在專案中用到了哪些型別的異常捕獲?如果碰到了空指標那些異常你會怎麼處理呢?       

多執行緒怎麼樣?說說你專案中用到的併發       

說說你最拿手的專案?說了redis非同步佇列,就問同步和非同步的概念,非同步需要怎麼實現,需要回撥函式嗎       

既然redis用到了快取,那如果叫你自己實現一個快取,你該如何實現?怎麼考慮快取過期這些問題?


電信IT研發

電信的網際網路公司,有編制,待遇也不錯,前面二十分鐘基礎感覺答的基本倒背如流的,問到架構不太會了

單點登入怎麼做的,session共享,session和cookie的區別   

Bootstrap啥型別的,jQuery瞭解情況   

JVM垃圾回收,新生代和老年代的垃圾回收,可達性分析   

HashMap和Hashtable區別,HashMap新增的物件為什麼要重寫equals和hashcode   

資料庫瞭解多少,事務acid,事務操作,怎麼加鎖,分散式系統鎖,選舉   

微服務瞭解什麼,微服務治理,微服務之間通訊


58同城

面試最差的體驗,酒店超級差,悶的要命,安排還噁心,過去等了三小時,一面面的還不錯,二面沒問多少就掛了,好像都是c++崗,面試官不用Java

一面:

手寫快排   

資料庫引擎的區別,說說btree,手寫聯合查詢sql   

HashMap瞭解多少說多少   

wait()和sleep()   

事務舉例   

用過什麼nosql,說說redis,topk用什麼資料結構

資料庫分表   

情景題,高併發訪問一個介面,如何檢測傳入字串的相似度很高的?答了個布隆過濾器,說沾了邊


二面:

演算法題給一個陣列,如何把偶數放到左邊,奇數放到右邊?寫完後說當兩邊順序已經一致了,交換是否會出現問題,加個判斷   

說說資料庫,聚合函式了解嗎?   

網路程式設計瞭解嗎,http請求如何區分請求頭和請求體?說了解一點nio的知識,nio指什麼,同步和非阻塞的概念是什麼?   

說下注冊的時候的檢測,多使用者怎麼判定是否被註冊


去哪兒網

面試最好的體驗,第一天上午機試,下午就接到通知明天去面試。在一個去哪兒合作的小清新酒店面試的,所有面試官都特別好,遇到答不上來的會給你解答,三面完直接現場發offer,只要在十月三十一號之前把三方寄給他們就行,簡直不要太良心。當時一面完的時候我說我計算機網路和作業系統方面不是特別好,一面面試官笑著說:沒事,路還長呢,你去等二面吧。待遇呢給的確實偏低,不過還是由衷粉一波去哪兒

一面:(30來分鐘)

說一個自己比較深的專案 ,redis多消費者一起取的時候如果佇列為空你怎麼處理(答了CAS進行嘗試,超過失敗次數之後就進入睡眠,面試官說可以不用這麼複雜~~為空時直接進行睡眠就行)   

紙上手寫Springmvc DispatcherServlet的大致實現(大概10分鐘的樣子)   

資料庫瞭解嗎?聚集索引和非聚集索引的區別,儲存引擎的區別?主鍵使用不重複的字串會出現什麼問題(插入的時候由於字串不能像自增長的id一樣連續,所以在磁碟上的位置不同)?   

說說HashMap吧,然後講了HashMap、ConcurrentHashMap 1.7、1.8的實現(講的很詳細,面試官覺得資料結構還不錯)   

然後問計算機網路咋樣,我說很一般作業系統咋樣,我說很一般   

執行緒有哪些狀態,怎麼進行切換的。


二面:(40來分鐘)

說一個比較深的專案,還是說的非同步佇列,問你這為啥要用redis做非同步佇列啊,我用執行緒池直接自己開一個佇列跟這有啥區別。扯了一堆,扯了redis I/O多路複用模型,最後不太滿意~~   

然後又手擼了一遍Springmvc   

然後問HashMap   

最後說你用了這麼多redis,叫你設計一個快取,你該怎麼設計,get和set的時間複雜度怎麼算的(答了用LinkedHashMap實現,分析了一下LinkedHashMap但是也沒怎麼說清)


三面:(20來分鐘)

談下人生,當場發了offer


順豐科技

最懵逼的一次面試,在品學樓一個教室面的,感覺極不正規。一個估計三十來歲但是看著可能四十多歲的大叔面的,完全get不到他的點

一面:

進去跟hr面一樣,談人生(你最喜歡看哪本書,你覺得在華為學到了什麼),全程基本沒問技術,吹牛20分鐘說可以走了


招銀網路科技

招商銀行下面的子公司,以前叫融博,負面新聞較多,今年在成都剛成立分部,由於是銀行,筆試和麵試都比較強調sql,面試偏重於資料庫和專案。現場面在軟體園那邊的招商銀行面的,當天直接三面,基本每個人都有三面。面試的感覺只有一個:不愧是銀行,太壕了。在七樓面試,層高居然有5、6米高

一面(電面15分鐘)

說說對JVM的理解   

Java程式初始化順序   

執行緒的建立   

mysql主鍵和唯一索引的區別   

說說最近的專案   

如何實現session共享,用redis如何實現   

說說微服務,微服務之間如何管理


二面(現場面30多分鐘)

看專案中有前端的,先問了下前端的css的選擇優先順序   

手寫了一個查詢sql   

手寫了一個雙重檢查單例,問spring是怎麼實現單例的   

springmvc的大致實現過程   

專案裡重要的地方   

說說微服務   

如果你不用redis來做佇列,自己寫你需要注意哪些方法   

資料庫儲存引擎的區別   

資料庫優化會嗎,說說常用的優化


三面(現場面30多分鐘)

面試官看了簡歷覺得專案時間都不長,沒有太多興趣,全程帶笑,叫講專案的興趣點。講redis非同步佇列,吹吹原理。說這沒啥用,你這單機redis還不如自己實現一個佇列速度還快些呢,你用Java寫一個類似的redis才厲害(當時有點懵逼,感覺這面試官可能不太懂技術)。然後笑著聽我吹完了springmvc一套,最後問我微服務治理知道不,我就扯了點服務註冊和發現的知識。


四面(現場面40多分鐘)

女hr全程含沙射影帶笑的問,別人好像都只面了20來分鐘。。。由於是轉行,問了我轉行原因,學習、生活、教研室那些情況。


OPPO

廣告部的工程師面的,面試官自我介紹時有個非常騷氣的花名,整體問的比較開放,二面聊著聊著就掛,筆試題比較簡單

一面(現場面20來分鐘):

面試官首先自我介紹,然後我自我介紹。叫先看成績單,問我最喜歡哪一門課,這門課有什麼特點(我嗅到了hr面的氣息)   

然後說先看下筆試題吧,你覺得筆試難不(我回答說不難就看到面試官在紙上寫了個簡單,感覺想教育我了),就問了http和https的區別,https加密的過程   

Spring是什麼啊,為什麼用Spring啊?Hibernate是什麼啊?Mybatis是什麼啊?假如我現在要分庫分表,我選哪個框架?(這沒接觸過啊。。)你為啥用Redis啊,Redis有哪些方法,Redis事務,Redis哪些方法有原子性,Redis和Kafka用什麼區別啊?   

Java虛擬機器垃圾回收方面的知識,生存區為什麼要有兩個,空間擔保機制是啥   

一個32核,64g的linux伺服器,硬碟是5TB,怎麼統計一個1TB的檔案中一個限定中文名和英文名出現的次數(我簡單說了下使用流水線),問大概需要多久時間,估計一下,一分鐘兩分鐘還是十分鐘。(總而言之面試的問題全部都相當的開放,讓你自己說)


二面(現場面20分鐘):

簡單問了下專案,各個知識點都問了一點點。


海康威視

今年擴招特別多,面試相對偏水,面試官感覺技術很不錯,問的問題完全不按套路來

一面(現場面20分鐘)

面試官特別扯,進來就問後面還有幾個,我們稍微快一點吧。然後看了我的簡歷,就問前端的類選擇器。   

然後問Spring Boot啥概念,有啥優勢。接著問Spring Data JPA是啥,咋用(面試這麼久第一次問我這個)。我解釋了一些JPA是個規範,面試官問你這JPA用的啥版本啊(懵逼,倆月沒用了。。記不住了),然後又問JPA是哪個組織規定的啊(懵逼的說了sun、spring、apache。。實際是EJB3.0小組)   

看你用了Redis,你這Redis咋用的,用過lua指令碼沒有(這個真沒用過)   

面試官繼續問:你這Java虛擬機器什麼掌握的咋樣啊(感覺可以開始表演了),結果我回答還不錯的之後,面試官問:說說一個class檔案的具體組成結構啊,要細(懵逼,這部分沒怎麼看,就說裡面有魔數)。繼續問:虛擬機器是起解釋作用嗎,有編譯作用嗎(一堆不是常規套路的問題問的很懵)。   

然後我說我模擬實現過Spring MVC,請讓我表演一哈。面試官看完簡歷之後說,那你就說說用了哪些設計模式(???這怎麼表演),回答了下之後又問我一個http的請求的組成結構,然後叫我說http的狀態碼,有多少說多少。(感覺這個面試官就在觀察表情,看著你很會的那種就馬上換話題,完全不按套路出牌。最後毆打完我之後說了句你基礎還可以) 


二面(現場面5分鐘)

hr小姐姐直接問想去哪,想要啥待遇


京東

投的成都崗結果北京的面試官面的,一面面試官覺得我還不錯,結果二面面試官在某天晚上深夜11點打電話來說面試一下,說自己還在公司裡面。我和他都很意外我投的成都崗,但卻是他們部門面試,估計特別缺人,問我能實習不,我說要做畢設不能實習就涼了。有點可惜,留成都京東還是很不錯的

一面(50多分鐘)

  Struts2和SpringMVC區別,SpringMVC有啥好處。SpringMVC的執行流程。一個網頁從輸入網址到顯示經歷什麼過程?Cookie和Session的概念。Mybatis和Hibernate的區別。異常處理知道不?詳細介紹了一下異常的分類並舉例   

  Redis有哪些資料結構。支援事務嗎?Redis分散式鎖知道不?Redis能持久化嗎,持久化有哪些方式,有什麼特點?斷電會丟失資料嗎?誰更嚴重?   

  資料庫熟悉不,資料庫引擎有哪些,InnoDB和MyIsam有啥區別,索引知道什麼,雜湊索引和b+樹索引有啥特點,說說b樹和b+樹,畫畫b+樹的結構,b+樹最下面存的是資料嗎?下面的資料有序嗎?   

  設計模式知道什麼?專案中用了什麼?回答用了策略模式,簡單說了說。寫個單例吧?寫了個雙重檢查的單例。   

  資料結構學的咋樣?說說HashMap吧,對比說了HashMap和Hashtable,詳細說了HashMap,最後引到解決執行緒安全用ConcurrentHashMap.詳細說了ConcurrentHashMap1.7、1.8的put和size方法的區別和實現。其中問了synchronized底層實現知道不,就回答了個monitor,其它不太清楚。然後CAS是啥,解釋一下。   

  有併發經驗沒有?回答說沒有,但是知道基本知識,看過併發程式設計的藝術。說說開啟執行緒的幾種方式吧?說說volatile?說說Happens-before原則?CountDownLatch知道不,解釋下,什麼情況下使用?   

  寫個二分查詢吧,遞迴的   

  做個智力題:8個球7個一樣重的,有一個偏重,一個天平,如何兩次找出偏重的小球   

  給了一張紙,寫寫專案中如何保證程式碼的魯棒性和可擴充套件性?   

  你有哪些offer?然後介紹了下自己的部門.


二面(10來分鐘)

簡單問了下簡歷上的專案,問能不能現在過來實習

總的來說。面到後面才發現了很多套路,但是好的公司已經基本結束了。所以建議提早準備,即使不能實習,也去投幾個公司練一練,每次把面試問題總結一下,發現裡面的套路,然後自己準備一套吹點。


總結

關於轉行,以前評論宣稱學了幾個月Java隨便找好工作,在現在的面試難度來看,基本不太可能,軟體也不是想象中那麼好找工作,一個崗位要的人多但是競爭的人也特別的多。

如果覺得本專業不太適合自己或者自己以後不太想去工廠那些地方上班,轉行請趁早,也不一定非的學計算機,可以選自己方向相近的方向來自學。如果想轉學計算機,也請早點明確自己的方向,然後在這個方向上深耕一下。

很多概念性、全域性性的知識,在短期內可能自己是無法理解的,需要一段時間、一個過程來理解(個人感覺這是科班和非科班主要的差距),很多基礎性的知識可能會在你以後運用某個知識點時才察覺到原來是這樣。在自學了一段時間後,可以開始接觸資料結構和演算法及計算機的一些基礎知識,刷題要趁早,平時多看一些技術部落格(CSDN、簡書、部落格園),有機會的話儘量找個工作室或者實習,如果實習不太靠譜,建議在校招前夯實自己的基礎。

關於校招,找工作運氣和實力是46開的,面試掛了不一定是自己不行,也很有可能是和麵試官不太聊的來。並不太過沮喪,面完一個反思總結面好下一個。簡歷上的東西力爭全都會,摸索一套屬於自己的吹點。面試官大部分情況下不會問框架的基本使用,都喜歡問點底層的東西(面試造火箭,工作擰螺絲),所以會點基本的CRUD是沒有太多作用的,建議深挖底層,比如樓主比較擅長吹Spring MVC、HashMap和ConcurrentHashMap1.7和1.8的原始碼,面試的時候引導面試官,在一張紙上給他詳細畫自己的思路。比如專案中經常用的Redis,那最好知道Redis的底層的單執行緒模型和持久化的方式,再深入一點自己模擬實現一個簡單的Redis可以嗎(LRU演算法,再自己想想時間複雜度)。使用Mybatis,可以自己運用JDBC模擬一下Mybatis的實現。這些好多都是樓主校招後期才慢慢體會到的(然鵝工作都找完了)。

終於寫完了,排版亂見諒了,祝各位找到心儀的工作,希望自己順利畢業(求善良的導師放過)。


作者:WISING

本文來源於牛客網

————————————

牛客網(www.nowcoder.com)

- 最大的IT筆試面試題庫;

- IT學習平臺;

- 網際網路公司筆試真題模擬;

- 程式設計師學習交流聖地;

相關文章