零基礎(chǔ)編程小白如何拿 Offer?八年經(jīng)驗面試官萬字肺腑之言(編程0基礎(chǔ))
作者 | hsm_computer
責(zé)編 | 伍杏玲
出品 | CSDN(ID:CSDNnews)
對于很多程序員小白來說,只要能有實踐的機(jī)會,哪怕工資再低,公司情況再一般,只要自己上心努力,就可能在短時間內(nèi)快速提升,甚至有希望在工作2年后進(jìn)大廠,畢竟項目里真實的開發(fā)實踐環(huán)境是平時學(xué)習(xí)不能模擬的。
但很多想從事Java開發(fā)的同學(xué)被卡在了第一步:無法積累足以找到工作的項目經(jīng)驗,甚至不知道該如何積累,導(dǎo)致缺少面試機(jī)會,或者面試總通不過,導(dǎo)致很多有編程天賦、聰明上進(jìn)的程序員可能與感興趣的職業(yè)失之交臂。
作為面試官,我知道Java初級開發(fā)的最低面試標(biāo)準(zhǔn),作為Java培訓(xùn)講師,我?guī)椭^不少零基礎(chǔ)的人應(yīng)聘成功初級Java開發(fā)崗。在這篇文章里,將結(jié)合我多年來從事面試官和培訓(xùn)師的經(jīng)驗,針對零Java基礎(chǔ)、零Java項目基礎(chǔ)的同學(xué),講述下如何積累項目經(jīng)驗,以及成功找到開發(fā)工作的相關(guān)技巧。
明確目標(biāo):去哪些公司應(yīng)聘?有哪些要求?
對于零基礎(chǔ)的同學(xué)來說,目標(biāo)可以是半年后(最快三個月)進(jìn)公司做Java,這里的公司可能是:
1、規(guī)模比較小的公司;
2、外派公司:以外派的身份到銀行保險之類甲方公司去干活;
3、外包公司:在公司里干些分包的活。
如何你的學(xué)歷和學(xué)校比較好的話,可以挑戰(zhàn)下大公司,但畢竟路要一步步走。不過在上面的這些公司里,可能工作環(huán)境和氛圍不盡如意,但項目包含的值錢技術(shù)點(diǎn)足以幫助你在兩三年后進(jìn)大廠。更重要的是,這些公司的應(yīng)聘要求相對比較低,下面是這些目標(biāo)公司的面試基礎(chǔ)要求:
1、商業(yè)項目經(jīng)驗越長越好,但至少做過SSM或Spring Boot的項目。
2、數(shù)據(jù)庫會增刪改查,最好知道單機(jī)版調(diào)優(yōu)技巧,比如索引和執(zhí)行計劃。會Spring用Mybatis整合數(shù)據(jù)庫的經(jīng)驗,知道在Mybatis的配置文件編寫增刪改查乃至事務(wù)的技巧。
3、Java基礎(chǔ),掌握集合、文件操作、異常處理、面向?qū)ο蟆?span id="gg8g4gg" class="candidate-entity-word" data-gid="15755381">多線程等基礎(chǔ)知識,可通過刷面試題達(dá)到要求。
4、計算機(jī)基礎(chǔ)知識:數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)、網(wǎng)絡(luò)編程等技能。其中可能問些數(shù)據(jù)結(jié)構(gòu)和算法的問題,其它問題大多通過刷題來解決。
以上是技術(shù)方面的,當(dāng)然還有工作態(tài)度方面:比如人看上去比較老實、肯加班、學(xué)習(xí)能力強(qiáng)、溝通沒問題等。說實在的,在面試的這段較短時間內(nèi),很少因為這些因素刷掉人的,比如我問愿不愿意加班,聽到的大多是愿意加班,問遇到你不熟悉的技術(shù)怎么辦,大多數(shù)的回答都是盡快努力學(xué)習(xí)。
而面試中的加分項,比如以敏捷等方式實踐項目的技巧、JVM性能調(diào)優(yōu)、分布式組件基礎(chǔ)、Linux實踐要點(diǎn)和分析與排查問題的能力。雖然對于初級開發(fā)不做要求,但真的要準(zhǔn)備面試時的說辭,你說了就比別人強(qiáng),在本文里也會給出相關(guān)技巧。
把公司的面試要求對應(yīng)到技術(shù)點(diǎn)上
我們目標(biāo)明確后,可以對應(yīng)列出需掌握的技術(shù)點(diǎn)。在實踐中可能有增減的技術(shù)點(diǎn),但至少不會出現(xiàn)“花大量時間去學(xué)無需掌握技能”的情況。下面我將由淺到深,給出各方面具體要學(xué)的技術(shù)點(diǎn)。
首先是Java語法,包括基礎(chǔ)語法、集合、IO操作、異常處理、JDBC、多線程。
對初級開發(fā)來說,面向?qū)ο笏枷牒驮O(shè)計模式太抽象,如果沒有一定項目的積淀很難靈活應(yīng)用,所以大多數(shù)初級開發(fā)就“會說”而已。這塊大家只要多背些題,同時再結(jié)合項目說下你用過的設(shè)計模式應(yīng)該就可以了,無需花大力氣準(zhǔn)備。
別去看Java界面開發(fā)的內(nèi)容,如Swing方面的技能,因為面試不問。對于Java虛擬機(jī)和垃圾回收流程方面,雖然抽象,但項目里會用到,所以不僅需要掌握理論,最好再結(jié)合項目準(zhǔn)備亮點(diǎn)。
其次是數(shù)據(jù)庫方面,至少會一種數(shù)據(jù)庫,如Mysql或SQL Server或Oracle等。
會寫增刪改查,知道索引怎么用,如何建表,知道group by、having、連接查詢和子查詢等的技巧。
掌握用JDBC和Mybatis等操作數(shù)據(jù)庫的基本操作,說白了該知道如何做增刪改查。如果你知道執(zhí)行計劃,Redis、Mycat等資深調(diào)優(yōu)技能,是加分項,但這些對初級開發(fā)不做過多的要求。
最重要的是框架方面,當(dāng)前Java較流行的是Spring Boot和SSM框架。對初級開發(fā)來說,能照著現(xiàn)成例子做增刪改插查的業(yè)務(wù)模塊,如有增加訂單的方法,你照著它寫個刪除訂單的方法。所以你了解基本的Spring相關(guān)配置文件,SSM或Spring Boot項目的開發(fā)流程,數(shù)據(jù)庫整合的方式。你如果具備調(diào)試框架代碼分析解決實際問題的能力更好。
以上給出的其實是低配版的技能要求,只要你會增刪改查,基本也就達(dá)到了進(jìn)小公司干活的要求。在明確技術(shù)點(diǎn)的基礎(chǔ)上,下面就會給出學(xué)習(xí)的相關(guān)建議。
如何在短時間內(nèi)快速掌握基礎(chǔ)知識?
對于IT人來說,職業(yè)發(fā)展的黃金時間并不多,如果30歲還在小公司,你后面就會很吃力。一般來說,初級開發(fā)升高級需要2到3年,達(dá)到高級開發(fā)后還需1到2年才具備進(jìn)大廠的資格,外加些余量,所以零基礎(chǔ)到進(jìn)大廠,一般需要4到5年時間。
在這段時間里,我們能浪費(fèi)的時間還真不多。通常來說,半年足矣,頂多一年,如果超過一年還沒得到實踐機(jī)會,要么就是態(tài)度問題,要么就是方法問題。為了杜絕方法問題,如下給出些具體的學(xué)習(xí)規(guī)劃。
1、準(zhǔn)備階段最多是一周,準(zhǔn)備好在自己的機(jī)器上安裝IDEA等開發(fā)環(huán)境,買若干本Java基礎(chǔ)書、SSM、Spring Boot相關(guān)的書。如果不知道該買哪些,就看銷量最好的,最好買帶視頻教程,同一題材買2到3本,比如Java基礎(chǔ)買2本,SSM買兩到三本,Spring Boot買兩到三本。為什么要買兩到三本呢,因為一本書上的知識點(diǎn)可能不全,買多了知識點(diǎn)就重復(fù)了,如果買兩到三本,基本該覆蓋到的技術(shù)點(diǎn)覆蓋了。
2、環(huán)境安裝好了,書也買好了,照著書敲代碼了。我們拿現(xiàn)成代碼復(fù)制粘貼來運(yùn)行,退一步就是照著書上敲,別自己寫代碼。因為剛開始什么都不懂,自己寫很容易出錯,往往因為一個拼寫錯誤就卡兩三個小時,這樣浪費(fèi)時間。
把敲進(jìn)去的代碼運(yùn)行后,就能從結(jié)果里反推關(guān)鍵代碼的含義。再加上書上的說明,很容易就能快速上手。一般來說,對于Java基礎(chǔ)知識,一般兩周運(yùn)行并理解好一本書,頂多用1個月就能掌握J(rèn)ava核心的大致語法。
3、JDBC數(shù)據(jù)庫和SSM框架也一樣,這兩方面需要配置環(huán)境,如要搭建MySQL數(shù)據(jù)庫,在其中建表,搭建SSM環(huán)境,下載pom文件,編寫配置文件并部署到Web服務(wù)器上。對于數(shù)據(jù)庫和框架,難點(diǎn)并不是代碼,而是如何成功運(yùn)行,如果你的書有視頻教程,你可以照著做,遇到問題,就去搜索引擎搜索,這個過程可能需要1個月。對大多數(shù)零基礎(chǔ)的同學(xué)而言,這塊確實有難度,但大家都這樣過來了,遇到問題如何解決?第一看視頻照著別人做,第二到網(wǎng)上查解決方法。
掌握基礎(chǔ)知識的標(biāo)志是運(yùn)行通并理解兩到三個SSM框架,運(yùn)行通了,大致能理解其中的調(diào)用步驟以及基本配置,在下面部分里我會詳細(xì)給出框架項目里該要具體掌握的點(diǎn)。
如何學(xué)習(xí)框架項目?
不同的SSM等框架項目業(yè)務(wù)可能不同,比如是商城或管理系統(tǒng),但調(diào)試的步驟大致相同。
1、安裝數(shù)據(jù)庫環(huán)境,一般是MySQL,在本地裝服務(wù)器和Navicat客戶端。安裝好以后,還需根據(jù)業(yè)務(wù)建表。
2、在IDEA開發(fā)環(huán)境里導(dǎo)入項目,建議用書上的項目,或者網(wǎng)上視頻課的代碼,不建議運(yùn)行來路不明的項目。如果項目經(jīng)過出版社等機(jī)構(gòu)認(rèn)可后,運(yùn)行通的概率就很高。
3、導(dǎo)入項目后,用pom或gradle去下載依賴包,確保代碼里所有的import都正確,沒語法問題就行。
4、比較麻煩的是集成Web環(huán)境,不建議自己配置額外Tomcat等,用IDEA環(huán)境集成Tomcat,并把代碼部署到Tomcat服務(wù)器里,如果是Spring Boot項目,還能直接運(yùn)行。
部署后就可以在頁面上運(yùn)行,運(yùn)行通后,無需跑遍所有的業(yè)務(wù)點(diǎn),跑通3個功能即可,因為你關(guān)注的是技術(shù),不是業(yè)務(wù)。我拿最基礎(chǔ)的登錄功能來例子說明大家需要掌握的流程和細(xì)節(jié)。
1、前端只要關(guān)注用戶名和密碼如何傳到Java代碼,可以是Ajax、query、form,至于前端頁面里的juery等元素了解即可,開始階段可忽略。
2、前端請求會通過配置文件映射到業(yè)務(wù)處理層,即business層,這塊需要關(guān)注配置文件,理解如何把請求映射到具體的業(yè)務(wù)處理類,在業(yè)務(wù)類里,一般會用spring的方式引入依賴包,比如@autowired等的方式,這種依賴方式需要結(jié)合配置文件或注解搞明白。
3、業(yè)務(wù)層調(diào)用service層,service會調(diào)用dao或repo層,在dao或repo層通過Mybatis和數(shù)據(jù)庫交互。這種層層調(diào)用關(guān)系一般不難,難點(diǎn)在于Mybatis和數(shù)據(jù)庫的交互,用戶model類如何與數(shù)據(jù)庫里的用戶表相關(guān)聯(lián),Mybatis如何傳入?yún)?shù),如何把從數(shù)據(jù)庫里的結(jié)果映射到業(yè)務(wù)model類里。
在登錄流程里,先從前端收集登錄信息,層層到數(shù)據(jù)庫,數(shù)據(jù)庫結(jié)果層層傳遞回前端,這個流程以及類之間的調(diào)用關(guān)系大家需要看明白,類似地理解其它若干個流程,這樣就能基本掌握SSM框架或Spring Boot框架。
在此基礎(chǔ)上,再看些基本的配置技巧,比如Mybatis如何配置數(shù)據(jù)源,Spring如何同事務(wù)整合等,當(dāng)你用一個月到兩個左右的時間運(yùn)行通框架代碼并理解后,你就掌握面向框架的增刪改查流程了,就有資格去面試了。
在簡歷上寫全公司感興趣的要素,至少先得到面試機(jī)會
一般通過2個月的時間學(xué)習(xí)后,你至少掌握框架層面的增刪改查技巧。如果要進(jìn)一步理解框架以及其它值錢技術(shù)(如Redis,kafka等分布式技術(shù)),靠自學(xué)就比較難了。雖然這些技術(shù)的理論誰都接觸到,但如果你沒做過商業(yè)項目,很難理解這些技術(shù)在項目里的用法。所以這個階段你就該去找工作了。
如果你有足夠的面試機(jī)會,可能剛開始會一問三不知,但至少能用面試的問題來調(diào)整自己的準(zhǔn)備方向,這樣多面試幾次就能成。但不少同學(xué)由于簡歷不達(dá)標(biāo),甚至不會有面試機(jī)會。哪些簡歷得不到面試機(jī)會呢?
出現(xiàn)最多的問題是,在簡歷上看不出相關(guān)技術(shù)的項目經(jīng)驗,比如某公司要一個Java初級開發(fā),那么在職位介紹上一定會寫要求,比如框架會SSM,數(shù)據(jù)庫Mysql等。哪怕要求再低,相關(guān)技術(shù)一定得有項目經(jīng)驗來支撐,如果就在簡歷上寫會xx技術(shù),沒項目經(jīng)驗,或者你給出的項目里,用到的技術(shù)都是人家不用的,那么自然就連面試機(jī)會都沒了。哪怕你是零基礎(chǔ),哪怕你就只有學(xué)習(xí)項目經(jīng)驗,你簡歷上好好寫,至少能得到小公司或外派公司的面試機(jī)會。
1、簡歷上介紹完年齡學(xué)校學(xué)歷手機(jī)聯(lián)系方式后,立即列出你掌握的技術(shù),如:
(1)熟悉SSM框架,有相關(guān)項目經(jīng)驗
(2)掌握MySQL等數(shù)據(jù)庫等用法
(3)有n個項目經(jīng)驗,實踐過xx項目,總之職位介紹上要求什么,你盡量開門見山地列上,這樣看簡歷的人就會感興趣,然后就向下讀了。
2、倒序列出你做的項目,如果你沒商業(yè)項目,那就寫學(xué)習(xí)項目,寫的時候淡化學(xué)習(xí)項目的因素,在寫項目時,別側(cè)重寫業(yè)務(wù)功能,側(cè)重寫用到的技術(shù),如下:
在xx到xx的時間段里,我做了xx系統(tǒng),其中用到了Spring Boot框架,我做了其中的訂單查詢和xx系統(tǒng),這個項目有3個人做,數(shù)據(jù)庫是Mysql。具體還用到了Mybatis,Spring事務(wù),XML文件讀寫技術(shù)(其它JD上要求的技術(shù),如果你用在項目里,也寫上)。
3、有幾個寫幾個,如果你就寫xx商城之類的項目,面試官大多能看出是學(xué)習(xí)項目,這樣可能只有項目比較急的公司或外派公司才會給面試機(jī)會,所以你盡量挖掘你的商業(yè)項目經(jīng)驗。
比如你在大學(xué)實習(xí)階段,在外面公司用過Java,或者你畢業(yè)論文項目是公司里的真實項目,或者你畢業(yè)后,雖然不是從事Java相關(guān)開發(fā)工作,但和朋友一起做過兼職項目。
總之多挖掘些公司的商業(yè)項目出來,但別太夸張,比如某商城項目,你說你全做了誰都不信,但你說這是個維護(hù)項目,你們公司做了其中一部分,這樣可信度就大了?;蛘吣闶羌媛氉隽四稠椖坷锏膞x子模塊,同時外帶功能改進(jìn),這樣面試官也能理解。
可能有同學(xué)說了,我確實沒商業(yè)項目經(jīng)驗,所以找工作有困難,你該繼續(xù)積累學(xué)習(xí)項目經(jīng)驗,多挖掘商業(yè)項目經(jīng)驗。
準(zhǔn)備面試時,先要刷題
如果你投出去的簡歷大多石沉大海,可以多加上些項目經(jīng)驗,或者多加些技術(shù)描述,同時看下你的簡歷是否能對上對方的JD。當(dāng)你有面試機(jī)會時,首先應(yīng)該刷題,畢竟很多面試題是源于項目但高于項目。
1、網(wǎng)上搜Java、Spring、SSM框架、Spring Boot、數(shù)據(jù)庫等面試題,總能看到一大堆題目,先把它們背下來,不少地方甚至有系列題,做到這點(diǎn)基本沒問題。
2、對初級開發(fā)來說,面試官會側(cè)重Java基礎(chǔ),所以大家還可以去找些集合、異常處理、IO和多線程方面的題去背下。
3、找些數(shù)據(jù)結(jié)構(gòu)和算法題,比如排序相關(guān),鏈表堆棧隊列等的,這塊不僅要會說,更要會寫代碼,畢竟不少公司有筆試。
4、至于智力題、情商題還有面試刁鉆問題,這塊也有現(xiàn)成的資料。
但如果你單純準(zhǔn)備這些理論方面的面試題,大多數(shù)面試你過不了,因為面試官更要結(jié)合項目經(jīng)驗考核你的技術(shù):
1、問項目里常用的SSM框架配置,Mybaits和Spring整合的方式,你做過項目一定知道,沒做過就很難說出。
2、結(jié)合項目業(yè)務(wù)說下SSM框架或Spring Boot的流程。
如果你主動地結(jié)合項目展示你的技能以及加分項,能超越你的大多數(shù)競爭者,之前說過大多數(shù)初級開發(fā)只會增刪改查,在下文里,就將圍繞項目介紹,告訴大家展示技能和亮點(diǎn)的面試技巧。
如何準(zhǔn)備介紹項目的說辭?
我面過不少候選人,有人面試題回答都很好,但讓介紹項目,并結(jié)合項目提問技術(shù)點(diǎn)時,就回答得很不好了,這也是大多數(shù)零基礎(chǔ)開發(fā)者的通病。
大家別抱有幻想,面試時面試官一定會結(jié)合項目提問,下面我給出具體的應(yīng)對技巧。
1、面試前多練習(xí)項目說辭,下面給出一個范例:
我做的最近的一個項目,客戶方是xx,有5個人做了半年,是xx系統(tǒng)的維護(hù)項目(說出項目要素,暗示不是學(xué)習(xí)項目,是公司的實戰(zhàn)項目),用到了SSM框架,數(shù)據(jù)庫用MySQL,還用到了數(shù)據(jù)庫調(diào)優(yōu)(索引),批量讀寫文件等的技術(shù)。(本次面試崗位的JD上還包含哪些技術(shù)要求,這里盡可能地都說全)。
項目用到了敏捷的開發(fā)模式,一般是1個月有一次發(fā)布,項目里用了Maven,junit、Jenkins等管理軟件,用log4j來寫日志(進(jìn)一步暗示是實戰(zhàn)項目,同時暗示你有一定的項目經(jīng)驗)。在這個項目里,我除了做開發(fā)以外,還做了單元測試和集成測試,測試時用junit(暗示你不是只會寫代碼)。
在項目開發(fā)過程中,我還有數(shù)據(jù)庫調(diào)優(yōu)和內(nèi)存調(diào)優(yōu)的經(jīng)驗,通過觀察Linux日志分析并排查過實際問題。(拋出亮點(diǎn),并展示你有實際解決問題的能力)
說到這里就可以了,由于你拋出了JD里提到的關(guān)鍵點(diǎn),以及調(diào)優(yōu)等亮點(diǎn)說辭,就自然而然地把后繼問題引到這些方面了。
2、介紹項目別深入業(yè)務(wù)細(xì)節(jié)。我遇到一些候選人,大談特談某個模塊里的業(yè)務(wù),比如第一步調(diào)會員第二步調(diào)風(fēng)控第三步再怎么地,遇到這類情況我會直接打斷,因為當(dāng)前崗位的業(yè)務(wù)一定和之前的不同,面試官不關(guān)心,這樣候選人就相當(dāng)于把后面提問的主導(dǎo)權(quán)交到面試官手里了。
3、用1-2分鐘介紹項目,說到點(diǎn)、別涵蓋面。如你提到用Log4j做日志就行,別深入說具體的配置,因為當(dāng)前介紹項目,如果深入細(xì)節(jié)會讓面試官感覺你主次不分。
4、介紹項目有兩個目的,第一證明你在項目里過JD上的技術(shù),第二拋出關(guān)鍵字引導(dǎo)面試官后繼提問,所以你拋出的技術(shù)你至少得知道怎么用,第二盡可能多地拋出亮點(diǎn)。
除了數(shù)據(jù)庫調(diào)優(yōu)JVM內(nèi)存調(diào)優(yōu)及分析解決實際問題的亮點(diǎn)外,適合零基礎(chǔ)的同學(xué)拋出的亮點(diǎn)還有如下這些:
1、Java集合方面,結(jié)合底層代碼說下快速失效,HashCode,ArrayList擴(kuò)容的點(diǎn),這塊能展示底層代碼的能力,證明你的資深。
2、線程方面,了解violate ThreadLocal等關(guān)鍵字,能證明你熟悉多線程并發(fā)方面的內(nèi)存管理細(xì)節(jié)。
3、結(jié)合ConcurrentHashMap,展示并發(fā)能力,展示你熟悉底層代碼。
4、圍繞分析日志,準(zhǔn)備Linux讀文件和搜索文件的技巧,證明你解決過實際問題。
一方面,準(zhǔn)備此類亮點(diǎn)并不難,我之前寫過一篇文章《如何準(zhǔn)備Java面試?如何把面試官的提問引導(dǎo)到自己準(zhǔn)備好的范圍內(nèi)?》,詳細(xì)給出了在項目介紹階段引導(dǎo)面試官提問的方法和說辭,大家可以參考下。
另一方面,在介紹項目時拋出此類亮點(diǎn)很簡單,比如就說一句,在項目里我們還遇到過因集合快速失效而導(dǎo)致的問題,經(jīng)過Debug底層代碼,我就解決了這個問題。其它問題也可以照此方式拋出。
能力一般,更要在回答問題時引導(dǎo)面試官
零基礎(chǔ)的同學(xué)經(jīng)過一段時間的學(xué)習(xí)和背面試題,能力達(dá)到能干活的程度,但如果被面試官發(fā)散性地提問的話,很多問題是說不上的,所以同學(xué)們面試時更要掌握引導(dǎo)技巧,引導(dǎo)技巧說穿了一文不值,即回答好對應(yīng)問題后再多說一句,然后面試官自然就接茬問了。
下面給出具體的范例:
1、回答完數(shù)據(jù)庫相關(guān)的問題后,你順口說句,“我在項目里,還通過執(zhí)行計劃優(yōu)化過SQL技能”。然后展開通過執(zhí)行計劃調(diào)優(yōu),大多數(shù)是理論方面的技巧,初級開發(fā)絕對可以準(zhǔn)備。
2、在回答集合方面問題后,你說,在遍歷集合的時候,我們項目里會非常小心快速失效問題,然后展開。
3、在回答線程內(nèi)存模型,或被問到volatile相關(guān)問題時,你說,我知道ConcurrentHashMap里用到volatile,我能具體說下嗎?再結(jié)合這個對象,擴(kuò)展到線程并發(fā)話題,結(jié)合底層代碼講的。
4、被問異常處理問題,如運(yùn)行期異常,如何自定義異常,那么再引導(dǎo)到異常處理最佳實踐,比如finally的用法。
5、回答完線程方面的問題后,提下在項目里用過ThreadLocal,由此引出底層的Weak引用話題,再引出JVM結(jié)構(gòu)以及OOM調(diào)優(yōu)方面的話題。具體的細(xì)節(jié)大家可以參照我提到過的文章。
6、準(zhǔn)備好Log4j的實踐技巧,在被問到SSM等框架時,回答好問題再多說一句,在這個項目里我們還用到了Log4j分級打印日志,然后展開。
下面就給出三個非常實用的引導(dǎo)案例,哪怕你之前是零基礎(chǔ),照樣可以準(zhǔn)備,照樣可以在面試中發(fā)揮。第一個可以從String一直引導(dǎo)到JVM性能調(diào)優(yōu):
String問題面試時一定會問到,比如String a= “123”; String b=”123”; a==b;結(jié)果是true還是false,這個問題大概率問到。怎么引導(dǎo)呢?
先說結(jié)果是true,因為常量是存儲在JVM的常量池里,然后說,我們項目里,在用String時要非常注意,因為會涉及到JVM性能優(yōu)化,比如盡量少用連接操作,因為會造成內(nèi)存碎片,由此引導(dǎo)到JVM調(diào)優(yōu)。
當(dāng)面試官很有可能問,你還知道JVM調(diào)優(yōu)方法?你就可以順帶展開,如用到集合要clear、用好IO、Connection對象要close,盡量用StringBuilder等。
然后接著說,在實際項目里,我還排查過線上OOM問題。
面試官很可能繼續(xù)問,如在測試環(huán)境,看到日志里經(jīng)常有OOM,然后你看dump文件,發(fā)現(xiàn)OOM的原因是某個大對象沒clear,或者說ThreadLocal對象沒remove,或者是Mybatis里不慎把表里所有數(shù)據(jù)都撈出來了等等。這樣一引導(dǎo)后,雖然你實際能力通過3個月運(yùn)行過若干SSM項目,但和別的初級開發(fā)競爭者,差距馬上就拉開了。
第二個引導(dǎo)案例是從volatile等問題引導(dǎo)到ConcurrentHashmap底層代碼。對于初級開發(fā)而言,ConcurrentHashmap底層代碼是個萬能的法寶,你費(fèi)少許功夫看明白底層源碼的流程,并看明白其中讀寫操作和并發(fā)的關(guān)系,在面試中可以說是百試百靈的。
面試時問多線程,volatile關(guān)鍵字大概率被問到。比如你知道volatile是什么含義嗎?
你除了說好本身含義外,再說下,我看過ConcurrentHashmap底層源代碼,其中用到volatile,雖然volatile無法做到原子性,但可以提升效率。你看了底層源碼后就能繼續(xù)說,在該類的put和get方法,以及Entry對象里,大量用到這個,還有transient關(guān)鍵字。當(dāng)你結(jié)合底層源碼說清楚ConcurrentHashmap的相關(guān)流程以后,一些外派公司甚至就不再問了。
第三個引導(dǎo)案例展示你的Java基礎(chǔ),從final關(guān)鍵字引導(dǎo)到JVM垃圾回收流程,并進(jìn)一步引導(dǎo)到OOM問題排查。final關(guān)鍵字面試時一般會問,你回答好final作用在類、方法上的含義后,再說下,我還知道匿名內(nèi)部類只能訪問final類型的變量,這個點(diǎn)可能一些高級開發(fā)不知道,你提出來后面試官一定會感興趣。
說好以后,你就可以繼續(xù)說,平時我還專研過JVM GC流程,這個背資料就能說,說好以后你再深入下說,我除了知道GC回收外,還在項目里排查過OOM問題,至于OOM問題的排查方法,大家可以參照前文的說辭。
大家在引導(dǎo)說辭在面試之前就要準(zhǔn)備好相關(guān)內(nèi)容,比如被問到xx問題還如何拋出其它相關(guān)點(diǎn),這樣引導(dǎo)的時候就會很自然,否則的話被面試官看出牽強(qiáng)附會的痕跡就不好了。
原本面試官在面試初級開發(fā)的時候,本來期望就不高,能增刪改查就行了,但你如果用上述三個引導(dǎo)說辭,讓面試官挖掘出你底層代碼和OOM以及JVM等方面的亮點(diǎn),這樣哪怕你有些問題沒回答好,也會大概率過面試,如果你其它回答中規(guī)中矩,但如果通過引導(dǎo)說出上述任一亮點(diǎn)的話,那么基本上面試成功就成定局了。
總結(jié)
如果零基礎(chǔ)的同學(xué)按本文給出技巧和經(jīng)驗,雖然不敢保證一定能100%找到工作,但一定能大幅增加通過面試找到工作的概率,因為本文總結(jié)了前人的經(jīng)驗。
“說一千道一萬不如真刀真槍地干”,大家如果真開始敲代碼,一定會遇到很多問題,當(dāng)大家進(jìn)展到準(zhǔn)備簡歷和面試實戰(zhàn)的階段,會遇到更多的問題。但我相信,本文給出的介紹項目經(jīng)驗和面試引導(dǎo)相關(guān)技巧,能幫助到大家,當(dāng)大家開始實踐后,自然會見招拆招,克服掉很多問題。
如果大家總是有各種顧慮,比如擔(dān)心學(xué)好了工作找不到,或者積累的項目通不過篩選,那么就會止步不前,可能將失去機(jī)會。預(yù)祝大家經(jīng)過努力,找到心儀的工作。
作者簡介:10年大廠工作經(jīng)驗,有IBM、花旗,平安等一線外企和互聯(lián)網(wǎng)工作經(jīng)驗,8年Java面試官經(jīng)驗,了解面試java初級開發(fā)高級開發(fā)和架構(gòu)師的背后一面,更熟悉各種在面試中展示亮點(diǎn)的技巧,5年線下Java職業(yè)培訓(xùn)經(jīng)驗,幫助過上千人拿到心儀的Offer,5年架構(gòu)師經(jīng)驗,大量高并發(fā)分布式組件的開發(fā)經(jīng)驗,更能在架構(gòu)師面試官的角度給出高并發(fā)組件的面試技巧。著有《Java核心技術(shù)及面試指南》。CSDN博客專家。