我面試新人,都會問什么?
我的讀者里有很多 Java 新人,新人是指正在學(xué) Java 的、以及工作時間不長的年輕人,他們經(jīng)常問我一個問題:
Java 學(xué)到什么程度才能找到一份還不錯的工作?
今天我就從我自己面試新人的角度來回答一下,我會把面試的知識點進行拆解,希望大家看完文章之后,能從中找到學(xué)習(xí) Java 的重點。
學(xué)習(xí)是為了找到工作、拿到 offer,這就有一個公式:
offer = 工作需要的技術(shù)棧 + 計算機基礎(chǔ)知識 + 項目經(jīng)驗 + 加分項
分別看看公式右邊的這些方面具體是什么。
1. 工作需要的技術(shù)棧
工作需要的技術(shù)棧往往和特定語言以及配套的周邊工具相關(guān)。
對 Java 技術(shù)棧來說,又可以分為以下幾個方面:
1.1 基本語法
基本語法在面試里不是說會用 for 循環(huán)、if else 語句之類去寫代碼就行,而是利用基本語法去編寫更合理、更規(guī)范、更可讀的代碼。
比如,是不是能讓變量處于很合適的作用域?String、StringBuffer、StringBuilder 適合的應(yīng)用場景是不是非常熟悉了?
如果對于 Java 的基礎(chǔ)還很薄弱,推薦去看《Effective Java》,以便真的能夠?qū)懗鰜砗么a。
另外,為了能更加規(guī)范的寫出高質(zhì)量工程代碼,推薦研究下阿里的《Java開發(fā)手冊》。
1.2 常用數(shù)據(jù)結(jié)構(gòu)
如果要想通過面試找到工作,Java 中一些常用數(shù)據(jù)結(jié)構(gòu)一定要好好掌握。最常用的就是以下幾種:
LinkedList ArrayList Stack ArrayBlockingQueue LinkedBlockingQueue HashMap LinkedHashMap TreeMap ConcurrentHashMap HashSet TreeSet
以上列舉出來的這些數(shù)據(jù)結(jié)構(gòu),不僅要熟練使用它們,更需要理解它們的原理。
知道了原理,才能證明你能靈活且正確的使用這些數(shù)據(jù)結(jié)構(gòu)。所以,面試中經(jīng)常會問這些數(shù)據(jù)結(jié)構(gòu)的原理。
如果對這些結(jié)構(gòu)的原理還不熟悉,這里推薦一本很老但是依然很有用的書《Java Generics and Collections》,它詳細介紹了 Java 中各個集合的實現(xiàn)。
但是這本書沒有中文版,如果英文書讀的很痛苦,大家可以去網(wǎng)上搜索一些好的文章,也能達到相同的效果。
1.3 異步與多線程
現(xiàn)在只要編寫高性能的代碼,就離不開異步;只要在多核 CPU 下工作,就離不開多線程去平行執(zhí)行任務(wù)。所以,異步和多線程是一位后端工程師必須掌握的核心技能。
而要達到找工作的水平,我認為至少滿足如下幾個條件:
能準確的理解進程和線程的概念 至少弄懂什么叫 race condition 和死鎖之類的概念 需要理解 JVM 的內(nèi)存模型 了解常見的多線程編程模式
對于異步和多線程,我也不用多說了,肯定是首先推薦去讀懂《Java并發(fā)編程實戰(zhàn)》,然后還有一本《圖解Java多線程設(shè)計模式》。這兩本書讀透了,面試異步和多線程,基本你也沒什么問題了。
1.4 IO 操作
這里說的 IO 操作,主要是利用 Java 去讀寫文件。
Java 的 IO 都在 java.io 包中,大概有 40 個流類。其實不用每一個都掌握,最基本的要求就是:
理解 IO 流的概念 IO 里哪些是字節(jié)流哪些是字符流 IO 里哪些是節(jié)點流,哪些是處理流 哪些 IO 流帶緩沖可以提高性能的
了解了這些東西,才能在實際開發(fā)中做到有的放矢,從而把 IO 用對用好。
推薦看下 《Java IO》和《Java NIO》這兩本書。其中《Java NIO》有中文版,《Java IO》沒有,如果英文不好的同學(xué),可以看個千鋒教育的視頻:
Java入門基礎(chǔ)教程視頻—(IO框架),地址如下:
https://www.bilibili.com/video/BV1Tz4y1X7H7
1.5 常用框架
除了 Java 語言本身的語法和庫啊什么的,要找到工作還請務(wù)必熟悉至少一套開發(fā)框架。
Java 最常用的框架就是:
Spring Spring MVC Spring Boot Mybatis Netty
其實,Spring、Spring MVC、Spring Boot 都是 Spring 體系的。所以,要找后端工作,Spring 是必須要掌握的。有了 Spring 的基礎(chǔ),別的 Spring 體系可以即插即用的。
SSM 中的的 M——Mybatis 也最好掌握了,有數(shù)據(jù)庫基礎(chǔ)的話,Mybatis 學(xué)起來也不算難。
Netty 是一套網(wǎng)絡(luò)框架,我估計初期用到的機會不多,但奈何有些面試官會問、會考,所以,若有閑暇功夫,推薦對它看個大概。
相關(guān)推薦的書有《Spring 5 開發(fā)大全》、《MyBatis技術(shù)內(nèi)幕》、《Netty進階之路:跟著案例學(xué)Netty》。
1.6 常用數(shù)據(jù)庫
一般來說,找工作,熟悉一個數(shù)據(jù)庫就好。推薦 MySQL,這是最常見的數(shù)據(jù)庫(其次是 Oracle)。
要熟悉到什么程度呢?我認為最低水平要知道怎么用 MySQL 執(zhí)行 CRUD 操作。但是這還不夠保險,因為很多面試官為了防止新人刪庫跑路,會對面試者要求更高。
像在 CRUD 里,R 代表查詢,是后端工程師最常打交道的操作。而查詢用的又對又好是對工程師使用 MySQL 水平的重要標(biāo)準。所以,面試官就希望面試者能對 MySQL 的索引原理有一定的了解,面試的時候也會經(jīng)常問這類問題。
同樣的道理,除了查詢以外,CUD 即增、改、刪是非常危險的,既可能影響性能,還可能出現(xiàn)各種誤操作。所以,為了保證把人招進來,不會對數(shù)據(jù)庫亂操作,面試的時候大概率會考察程序員對 MySQL 中的鎖和 MVCC 的理解情況,明白怎么用才安全可靠。
如果對這些都不太熟悉,推薦看下《MySQL是怎樣運行的》,對 MySQL 講的非常透徹。
1.7 Linux 基本操作
現(xiàn)在只要想做后端工程師,就肯定避不開和 Linux 系統(tǒng)打交道。
基本的命令操作是肯定要熟悉的,比如:目錄切換、設(shè)置環(huán)境變量、文件的增刪查改等等。
除了這些基本命令,還要理解 Linux 中一切皆文件的概念。并且對于一些重要概念,比如:管道、重定向、標(biāo)準輸入輸出、標(biāo)準錯誤輸出等,也要明白他們是什么東西。
有時候,還需要開發(fā)人員直接在線上機器去編輯文件,所以還要會用 Vi/Vim 去在線編輯一些文件。
另外,如果服務(wù)器有了問題,起碼基本的查詢性能的命令,也要會用。比如用 netstat、vmstat 等命令去查看下機器狀態(tài)。
這些知識可以看下《鳥哥的Linux私房菜 基礎(chǔ)學(xué)習(xí)篇 第四版》。
2. 計算機基礎(chǔ)知識
除了技術(shù)棧以外,還需要面試者有扎實的計算機基礎(chǔ)。這個計算機基礎(chǔ)是考察面試者在學(xué)校的學(xué)習(xí)狀況的,如果你計算機基礎(chǔ)不好,那大概率說明你本身學(xué)習(xí)態(tài)度、學(xué)習(xí)能力至少有一項不太合格。
對 Java 后端工程師,咱們挑兩個很重要的基礎(chǔ)知識說說:
2.1 計算機網(wǎng)絡(luò)
后端大部分的時候就是各種接口和協(xié)議,數(shù)據(jù)傳來傳去,總是需要關(guān)注到網(wǎng)絡(luò)問題的。如果一個后端工程師,對 TCP 不熟悉,對 Http 一問三不知,那么誰能相信你是一個合格的后端工程師了呢?
對于計算機網(wǎng)絡(luò),我推薦好好看看《計算機網(wǎng)絡(luò)(原書第7版)》這本書,在自己的頭腦中,構(gòu)建出一套完整的網(wǎng)絡(luò)體系來。
2.2 操作系統(tǒng)
學(xué)完了計算機網(wǎng)絡(luò),接下來就是去好好學(xué)習(xí)下操作系統(tǒng)。學(xué)習(xí)操作系統(tǒng)就是去學(xué)習(xí)如何在復(fù)雜的情況下,去協(xié)調(diào)分配各種像 CPU、內(nèi)存、IO 等這些競爭性使用的計算機資源。
學(xué)懂了操作系統(tǒng),你心里就有了一套在復(fù)雜情況下,去管理協(xié)調(diào)資源的成熟套路和方法論。
而這些成熟的套路和方法論,最終都是你后面能成長為優(yōu)秀的工程師,以及能應(yīng)對各種復(fù)雜業(yè)務(wù)需求的核心競爭力。所以,操作系統(tǒng)學(xué)懂是很重要的。
如果對操作系統(tǒng)不熟悉,我推薦看下《操作系統(tǒng)導(dǎo)論》這本書,人民郵電出版社出版,王海鵬翻譯的。
3. 做過的項目
面試官是如何在面試中考察你是否真的做過項目呢?
其實挺簡單的,只需要問一下你做的項目中核心模塊的業(yè)務(wù)流程,然后挑出這個業(yè)務(wù)流程中的一些技術(shù)難點或者技術(shù)特點,重點問你是怎么實現(xiàn)的,就能大概判斷出你是否真的做過項目了。
至于項目,主流的項目有這么幾類:
電商 社交 垂直領(lǐng)域平臺 音視頻平臺 出行 門戶
在面試前,最好去專門熟悉下不同類項目的核心流程都有哪些。比如,電商的核心流程就有購物流程,社交的核心流程就有私聊、群發(fā)消息,出行平臺則是人們叫車的這個過程。
而在這些核心業(yè)務(wù)流程里,一定有技術(shù)難點需要克服,比如:
購物車到底放在客戶端還是服務(wù)器端? 放客戶端,排序規(guī)則,緩存的更新策略你是怎么解決的? 而放在服務(wù)器端呢,你和客戶端之間通信頻率啊,客戶商品的實時更新啊,又是怎么考量的?
這些沒有經(jīng)過實戰(zhàn),很難給面試官講清楚。
所以,在應(yīng)聘工作前,最好就是自己能去參與個項目,多學(xué)多問,多考慮為什么項目中需要這樣做的道理。
如果真的參與不了,我推薦去 github 下載個開源的項目,然后弄清楚架構(gòu)和業(yè)務(wù)流程,對于一些不懂得,可以問下開源的作者,或者去問下已經(jīng)工作的前輩,又或者去專業(yè)的論壇問。
github 的開源項目可以參考我之前寫的這篇:你們要的學(xué)Java的練手項目,來了
總之,一定要從我給的分類項目中找一個項目,去深入了解業(yè)務(wù)流程和對應(yīng)的技術(shù)實現(xiàn),以及實現(xiàn)背后的動機,只有這樣,面試官才會真的認為你有了實戰(zhàn)經(jīng)驗。
4. 加分項
說完了項目經(jīng)驗,我再說說加分項(技術(shù)博客、開源項目、競賽獎項等),加分項在去大廠應(yīng)聘的時候尤其有用。
無論你是有開源項目還是有博客文章,都說明了一件事——你是一個愛學(xué)習(xí)、樂于分享的人。
大廠里,很重視的一件事就是分享。分享經(jīng)驗、分享技術(shù)、分享心得,這些都是大廠非常提倡的事情,如果在一群候選人里,你有加分項,別人沒有,面試官會選誰不言而喻了吧。
所以,一定要經(jīng)常性的對公眾輸出一些東西,文章啊、開源項目啊、競賽分享啊,能輸出什么輸出什么。這樣才能讓面試官看到你有實力的證據(jù)以及你 open 的態(tài)度,從而在面試中占有更多的優(yōu)勢。
結(jié)尾
好了,說了這么多,其實一言以蔽之,就是知識儲備一定要足。要說達到什么水平就一定能找到工作,這完全是根據(jù)你應(yīng)聘的公司,應(yīng)聘的崗位以及你的競爭對手的優(yōu)秀程度去動態(tài)變化的。
以上知識點,可能有人會感覺多,也可能有人會覺得不夠,無論怎樣,希望這篇文章能幫新人弄清楚學(xué)習(xí)的重點,希望大家能堅持學(xué)起來。你只有拼命努力,才能看起來毫不費力。
看完有收獲,可以分享給別人,或者隨手點個在看,讓更多的人看到。
你好,我是四猿外。
一家上市公司的技術(shù)總監(jiān),管理的技術(shù)團隊一百余人。想了解我如何管理團隊——我,管理100多人團隊的二三事
我從一名非計算機專業(yè)的畢業(yè)生,轉(zhuǎn)行到程序員,一路打拼,一路成長。
我會通過公眾號,
把自己的成長故事寫成文章,
把枯燥的技術(shù)文章寫成故事。
我建了一個讀者交流群,里面大部分是程序員,一起聊技術(shù)、工作、八卦。歡迎加我微信,拉你入群。
推薦閱讀
