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