對於各位Java程序員來講,只要能有實踐的機會,哪怕工資再低,公司狀況再通常,只要本身上心努力,就可能在短期內快速提高,甚至在工做2年後進大廠都有但願,由於項目裏真實的開發實踐環境是平時學習不能模擬的。因此不少想從事Java開發的同窗實際上是卡在了第一步:沒法積累足以找到工做的項目經驗,甚至不知道該如何積累,從而致使沒面試機會,或者面試總通不過。這樣不少有編程天賦有並且聰明上進的程序員可能就與感興趣的職業失之交臂了。前端
做爲面試官,我知道Java初級開發的最低面試標準,做爲Java培訓講師,我幫助過很多零基礎的人應聘成功初級Java開發崗,在這篇文章裏,就將結合個人相關面試和培訓經驗,針對零Java基礎零Java項目基礎的同窗,講述下如何積累項目經驗,以及成功找到開發工做的相關技巧。 java
對於零基礎的同窗來講,目標能夠是半年後(最快三個月)進公司幹Java,這裏的公司多是以下種類:1 規模比較小的公司 2 外派公司,即之外派的身份到銀行保險之類甲方公司去幹活。3 外包公司,即在公司裏幹些分包的活。mysql
固然你學歷學校比較好的話,也有可能去挑戰下大公司,但畢竟路要一步步走,並且這類公司裏,有可能工做環境和氛圍不如意,但項目裏包含的值錢技術點足以幫助你在兩三年後進大廠。更重要的是,這些公司的應聘要求相對比較低,大可能是隻要你在面試過程當中。再進一步,下面給出了這類目標公司的面試要求。linux
1 商業項目經驗越長越好,但至少作過SSM或Spring Boot的項目。程序員
2 數據庫方面,須要會增刪改查,最好知道單機版調優技巧,好比索引和執行計劃。並且在這方面,須要有Spring用Mybatis整合數據庫的經驗,知道在mybatis的配置文件裏編寫增刪改查乃至事務的技巧。web
3 Java基礎方面,掌握集合,文件操做,異常處理,面向對象,多線程等基礎知識,其實這塊很大程度上能夠經過刷面試題達到要求。面試
4 還有一些是所謂的計算機方面基礎知識,即數據結構,算法,操做系統,網絡編程等技能。其中可能也就會多問些數據結構和算法的問題,其它問題大多也能夠經過刷題來解決。ajax
以上是技術方面的,固然還有其它工做態度方面的,好比人看上去比較老實,肯加班,學習能力強,溝通沒問題等,但說實在的,在面試的這段較短期內,不多由於這些因素刷掉人的,好比我問願不肯意加班,聽到的大可能是願意加班,問遇到你不熟悉的技術怎麼辦,大多數的回答都是儘快努力學習。redis
其實說實在的,一些面試中的加分項,好比以敏捷等方式實踐項目的技巧,JVM性能調優,分佈式組件基礎,linux實踐要點和分析與排查問題的能力,雖然對於初級開發不作要求,並且要達到精通的程度確實很難,但真的要準備面試時的說辭,其實並不難,你說了就比別人強,在本文裏也會給出相關技巧。 算法
目標明確了,也就能夠對應地列出該掌握的技術點了,固然在實踐中可能會有增減,但至少不會出現「花大量時間去學無需掌握技能」這種狀況了,下面將由淺到深,給出各方面具體要學的技術點。
首先最基礎的固然是Java語法,其中包括基礎語法,集合,IO操做,異常處理,JDBC,多線程。對初級開發而言,面向對象思想和設計模式這塊太抽象,並且若是沒有必定項目的積澱很難靈活應用,因此大多數初級開發也就是「會說」而已,這塊你們只要多背些題,同時再結合項目說下你用過的設計模式應該就能夠了,這塊無需用大力氣。並且必定別去看Java界面開發的,好比Swing方面的技能,由於面試不問。對於Java虛擬機和垃圾回收流程方面,雖然抽象,但項目裏會用到,因此不只須要掌握理論,最好再結合項目準備亮點。
其次是數據庫方面,你得會結合一種數據庫,好比MySQL或SQL Server或Oracle等,會寫增刪改查,知道索引怎麼用,知道該如何建表,而且還要知道group by, having, 鏈接查詢和子查詢等的技巧。並且實際項目裏,通常是用代碼操做數據庫,因此你還得掌握用JDBC和mybatis等操做數據庫的基本操做,說白了該知道如何作增刪改查。固然了,若是你進一步知道執行計劃,Redis,Mycat等的資深調優技能,這必定是加分項,但這對初級開發而言不作過多的要求。
最重要的是框架方面,當前java比較流行的是Spring Boot和SSM框架,對初級開發而言,只須要能照着現成例子作增刪改插查的業務模塊便可,好比現有個增長訂單的方法,須要你照着這個寫業務代碼,作個刪除訂單的方法。也就是說,這塊須要你瞭解基本的Spring相關配置文件,以及SSM或Spring Boot項目的開發流程,以及和數據庫整合的方式。固然你若是進一步具有調試框架代碼分析解決實際問題的能力這更好,但這塊對初級開發而言,難度並非遙不可及。
以上給出的實際上是低配版的技能要求,也就是說只要你會增刪改查,基本也就達到了進小公司幹活的要求。在明確技術點的基礎上,下面就會給出學習的相關建議。
其實對於IT人來講,職業發展的黃金時間並很少,若是30歲還在小公司,後繼就會很吃力,並且通常來講,初級開發升高級須要2到3年,而達到高級開發後通常還須要再有1到2年再具有進大廠的資格,外加些餘量,因此零基礎到進大廠,通常須要4到5年時間。因此從零基礎到進公司幹活這個階段,能浪費的時間還真很少。一般來講,半年足矣,頂多一年,若是超過一年還沒獲得實踐機會,要麼就是態度問題,要麼就是方法問題了。爲了杜絕方法問題,以下給出些具體的學習規劃。
1 準備階段頂多一週,具體的的工做包括在本身的機器上安裝IDEA等開發環境,再包括去買若干本Java基礎書和SSM以及Spring Boot相關的書。若是不知道該買哪些,就去京東上看銷量最好的,最好買帶視頻教程的,並且最好同一題材買個2到3本,好比Java基礎買2本,SSM買2到3本,Spring Boot也買2到3本。這時候別怕花錢,第一其實錢並很少,第二比起報班,這些錢算少的。爲何要買2到3本呢,由於一本書上的知識點可能不全,買多了知識點就重複了,若是買2到3本,基本該覆蓋到的技術點也都有了。
2 等環境安裝好了,書也買好了,後面就照着書敲代碼了。 這時請注意,最好是拿現成代碼複製粘貼來運行,退一步也照着書上敲,別本身寫代碼。由於剛開始什麼都不懂,本身寫很容易出錯,每每會由於一個拼寫錯誤就卡兩三個小時,這樣時間就浪費了。把敲進去的代碼運行通之後,就能從結果裏反推關鍵代碼的含義了,再加上書上的說明,很容易就能快速上手。通常來講,對於Java基礎知識,通常兩週運行並理解好一本書,也就是說,頂多用1個月,就能掌握Java核心的大體語法。
3 JDBC數據庫和SSM框架也同樣,但這兩方面更多的是須要配置環境,好比要搭建MySQL數據庫,在其中建表,搭建SSM環境,下載pom文件,編寫配置文件並部署到web服務器上。能夠說,對於數據庫和框架,難點並非代碼,而是如何成功運行,若是你的書有視頻教程,你能夠照着作,遇到問題,就到百度去搜索,這個過程可能也須要1個月。對大多數零基礎的同窗而言,這塊確實有難度,但你們其實都這樣過來了,遇到問題如何解決?第一看視頻照着別人作,第二到網上查解決方法。
掌握基礎知識的標誌是運行通並理解2到3個SSM框架,其實運行通了,大體也就能理解其中的調用步驟以及基本配置,在下面部分裏,就會詳細給出框架項目裏該要具體掌握的點。
不一樣的SSM等框架項目業務可能不一樣,好比是商城或管理系統,但調試的步驟大體相同。
1 安裝數據庫環境,通常是MySQL,這在本地裝個服務器和Navicat客戶端便可。安裝好之後,可能還須要根據業務建表。
2 在IDEA等開發環境裏導入項目,這裏建議用書上的項目,或者網上視頻課的代碼,不建議運行來路不明的項目。若是項目通過出版社等機構承認後,運行通的機率就很高。
3 導入項目後,通常須要用pom或gradle去下載依賴包,這塊問題也不大,確保代碼裏全部的import都正確,以及沒語法問題便可。
4 比較麻煩的是集成web環境,這裏不建議本身額外配置tomcat等,而建議用IDEA環境集成tomcat,集成後須要把代碼部署到tomcat服務器裏,若是是spring boot項目,還能直接運行。
部署後就能夠在頁面上運行,運行通後,無需跑遍全部的業務點,跑通3個功能便可,由於你關注的是技術,而不是業務。就拿最基礎的登陸功能來講你們須要掌握的流程和細節。
1 前端只要關注用戶名和密碼如何傳到java代碼,這裏能夠是ajax,也能夠是query,甚至是最基本的form,至於前端頁面裏的juery等元素,瞭解便可,開始階段甚至能夠忽略。
2 通常前端請求會經過配置文件映射到業務處理層,即business層,這塊須要關注配置文件,理解如何把請求映射到具體的業務處理類,在業務類裏,通常會用spring的方式引入依賴包,好比@autowired等的方式,這種依賴方式須要結合配置文件或註解搞明白。
3 通常業務層會調用service層,而service會調用dao或repo層,而在dao或repo層會經過mybatis和數據庫交互。這種層層調用關係通常不難,但難點在於mybatis和數據庫的交互,好比如何用戶model類如何與數據庫裏的用戶表相關聯,以及mybatis如何傳入參數,如何把從數據庫裏的結果映射到業務model類裏。
總之在登陸流程裏,先從前端收集登陸信息,再層層到數據庫,再把數據庫結果層層傳遞迴前端,這個流程以及類之間的調用關係你們須要看明白,再相似地理解其它若干個流程,這樣就能基本掌握SSM框架或Spring Boot框架。
在此基礎上能夠再看些基本的配置技巧,好比Mybatis如何配置數據源,Spring如何同事務整合等,當你用一個月到兩個左右的時間運行通框架代碼並理解後,你就掌握面向框架的增刪改查流程了,就有資格出去面試了。
按剛纔的提示,通常經過2個月的時間學習後,你至少能掌握框架層面的增刪改查技巧。說實在話,若是要進一步理解框架以及其它值錢技術(好比redis,kafka等分佈式技術),靠自學就比較難了,由於雖然這些技術的理論誰都接觸到,但若是你沒作過商業項目,很難理解這些技術在項目裏的用法。因此後面你就該去找工做了。
在這個過程,若是你有足夠的面試機會,雖然剛開始會一問三不知,但至少能用面試的問題來調整本身的準備方向,這樣多面試幾回就能成。但很多同窗因爲簡歷不達標,甚至不會有面試機會。哪些簡歷得不到面試機會呢?
出現最多的緣由是,在簡歷上看不出相關技術的項目經驗,好比某公司要一個Java初級開發,那麼在職位介紹上必定會寫要求,好比框架會ssm,數據庫要用mysql等,哪怕要求再低,相關技術必定得有項目經驗來支撐,若是就在簡歷上寫會xx技術,沒項目經驗,或者你給出的項目裏,用到的技術都是人家不用的,那麼天然就連面試機會都沒了。其實哪怕你是零基礎,哪怕你就只有學習項目經驗,你簡歷上好好寫,至少能獲得小公司或外派公司的面試機會。
1 簡歷上介紹完年齡學校學歷手機聯繫方式後,當即列出你掌握的技術,好比1 熟悉SSM框架,有相關項目經驗 2 掌握MySQL等數據庫等用法 3 有n個項目經驗,實踐過xx項目,總之職位介紹上要求什麼,你儘可能開門見山地列上,這樣看簡歷的人就會感興趣,而後就向下讀了。
2 倒序列出你作的項目,若是你沒商業項目,那就寫學習項目,寫的時候淡化學習項目的因素,在寫項目時,別側重寫業務功能,側重寫用到的技術以下給個範例。
在xx到xx的時間段裏,我作了xx系統,其中用到了spring boot框架,我作了其中的訂單查詢和xx系統,這個項目有3我的作,數據庫是mysql。具體還用到了mybatis,spring事務,xml文件讀寫技術(其它jd上要求的技術,若是你用在項目裏,也寫上)。
3 這樣有幾個寫幾個。說實話,若是你就寫xx商城之類的項目,面試官大多能看出是學習項目,這樣可能只有項目比較急的公司或外派公司纔會給面試機會,因此你儘可能挖掘你的商業項目經驗。好比你在大學實習階段,在外面公司用過java,或者你畢業論文項目是公司裏的真實項目,或者你畢業後,雖然不是從事java相關開發工做,但和朋友一塊兒作過兼職項目。總之多挖掘些公司的商業項目出來,並且在挖掘時別太誇張,好比某商城項目,你說你全作了誰都不信,但你說這是個維護項目,大家公司作了其中一部分,這樣可信度就大了。或者你是兼職作了某項目裏的xx子模塊,同時外帶功能改進,這樣面試官也能理解。
可能有同窗說了,我確實沒商業項目經驗,因此找工做有困難,但這裏第一是你要從零基礎升級到初級開發,第二你沒有商業項目經驗的現狀不是我形成的,相反我都已經很是細化地給你建議了,因此你還真該第一繼續積累學習項目經驗,第二多挖掘商業項目經驗。
若是你投出去的簡歷大多石沉大海,那麼就或者多加上些項目經驗,或者多加些技術描述,同時看下你的簡歷是否真能對上對方的JD,這樣總能獲得面試機會。當你有面試機會時,首先應該刷題,畢竟不少面試題是源於項目但高於項目。
1 你到網上去搜java面試題,spring面試題,SSM框架面試題,Spring Boot面試題和數據庫面試題等等,總能看到一大堆題目,首先把它們背下來,很多地方甚至有系列題,作到這點基本沒問題。
2 對初級開發而言,更會側重Java基礎,因此你們還能夠去找些集合、異常處理、IO和多線程方面的題去背下。
3 去找些數據結構和算法題,好比排序相關,鏈表堆棧隊列等的,這塊不只要會說,更要會寫代碼,畢竟很多公司有筆試。
4 至於智力題情商題還有面試刁鑽問題,這塊也有現成的資料。
可是我能夠這樣告訴你們,若是你單純就準備這些理論方面的面試題,大多數面試你過不了,由於面試官更要結合項目經驗考覈你的技術。
1 會問些項目裏經常使用的SSM框架配置,或者問你mybaits和spring整合的方式,總之你作過項目必定知道,沒作過就很難說出。
2 讓你結合項目業務說下SSM框架或Spring Boot的流程。
何況若是你主動地結合項目展現你的技能以及加分項,更能超越你的大多數競爭者,由於以前已經說過,大多數初級開發只會增刪改查,在下文裏,就將圍繞項目介紹,告訴你們展現技能和亮點的面試技巧。
我面過很多候選人,網上有的面試題回答都很好,但讓介紹項目,並結合項目提問技術點時,就回答得很很差了,可能這也是大多數零基礎開發者的通病。 這塊你們別抱有幻想,面試時必定會結合項目提問,這裏就給出具體的技巧。
1 面試前多練習項目說辭,這裏給出一個介紹項目的範例。
我作的最近的一個項目,客戶方是xx,有5我的作了半年,是xx系統的維護項目(說出項目要素,暗示不是學習項目,是公司的實戰項目),其中用到了SSM框架,數據庫用MySQL,還用到了數據庫調優(索引),批量讀寫文件等的技術。(本次面試崗位的JD上還包含哪些技術要求,這裏儘量地都說全)。
這個項目用到了敏捷的開發模式,通常是1個月有一次發佈,項目裏用了Maven,junit,jenkins等管理軟件,用log4j來寫日誌(進一步暗示是實戰項目,同時暗示你有必定的項目經驗)。在這個項目裏,我除了作開發之外,還作了單元測試和集成測試,測試時用junit(暗示你不是隻會寫代碼)。
在項目開發過程當中,我還有數據庫調優和內存調優的經驗,還經過觀察linux日誌分析並排查過實際問題。(拋出亮點,並展現你有實際解決問題的能力)
基本說到這裏就能夠了,因爲你拋出了JD裏提到的關鍵點,以及調優等亮點說辭,就天然而然地把後繼問題引到這些方面了。
2 介紹項目裏別深刻業務細節,好比我遇到有些候選人,大談特談某個模塊裏的業務,好比第一步調會員第二步調風控第三步再怎麼地,遇到這類狀況我通常會直接打斷,由於當前崗位的業務必定和以前的不一樣,面試官必定不會關心,並且這樣的話,候選人就至關於把後面提問的主導權交到面試官手裏了。
3 介紹項目通常也就用1,2分鐘,就說到點,別涵蓋面,好比你提到用過log4j作日誌就行,別深刻說具體的配置,由於當前是介紹項目,若是深刻細節會讓面試官感受你主次不分。
4 請必定記住,介紹項目有兩個目的,第一證實你在項目裏過JD上的技術,第二拋出關鍵字引導面試官後繼提問,因此你拋出的技術你至少得知道怎麼用,第二儘量多地拋出亮點。
除了剛纔給出的數據庫調優JVM內存調優以及分析解決實際問題的亮點外,適合零基礎的同窗拋出的亮點還能夠有以下這些。
1 Java集合方面,結合底層代碼說下快速失效,hashcode,ArrayList擴容的點,這塊能展現底層代碼的能力,從而證實你很資深。
2 線程方面,瞭解violate+ThreadLocal等關鍵字,以此能證實你很熟悉多線程併發方面的內存管理細節。
3 就結合ConcurrentHashMap,展現併發能力,並展現你很熟悉底層代碼。
4 圍繞分析日誌這個問題,準備下linux讀文件和搜索文件的技巧,以此證實你解決過實際問題。
一方面,準備此類亮點,並不難,我以前有篇博文,《如何準備Java面試?如何把面試官的提問引導到本身準備好的範圍內?》,其中詳細給出了在項目介紹階段引導面試官提問的方法和說辭,你們能夠參考下。另外一方面,在介紹項目時拋出此類亮點也很簡單,好比就說一句,在項目裏咱們還遇到過因集合快速失效而致使的問題,通過debug底層代碼,我就解決了這個問題。其它問題也能夠照此方式拋出。
零基礎的同窗通過一段時間的學習和背面試題,可能能力會達到能幹活的程度,但若是被面試官發散性地提問的話,不少問題是說不上的,因此對於這批同窗,面試時更要掌握引導技巧,其實引導技巧說穿了一文不值,即回答好對應問題後再多說一句,而後面試官天然就接茬問了。以下給出些具體的範例。
1 在回答好任何數據庫相關的問題,好比索引,JDBC等,你順口說句,我在項目裏,還經過執行計劃優化過SQL技能,而後然開,這塊經過執行計劃調優,大多數也是理論方面的技巧,初級開發絕對能夠準備。
2 在回答好任何集合(如ArrayList)方面問題時,你能夠說,在遍歷集合的時候,咱們項目裏會很是當心快速失效問題,而後展開。
3 在回答好任何線程內存模型,或被問到volatile相關問題時,你就說,我知道ConcurrentHashMap裏用到volatile,我能具體說下嗎?再結合這個對象,擴展到 線程併發話題,並且這仍是結合底層代碼講的。
4 被問到任何異常處理問題,好比運行期異常,如何自定義異常,那麼再引導到異常處理最佳實踐,好比finally的用法。
5 回到好任何線程方的問題,再提下在項目裏用過ThreadLocal,由此引出底層的Weak引用話題,再引出JVM結構以及OOM調優方面的話題。具體的細節你們能夠參照我提到過的博文《如何準備Java面試?如何把面試官的提問引導到本身準備好的範圍內?》。
6 實現準備些log4j的實踐技巧,在被問到SSM等框架時,回答好問題再多說一句,在這個項目裏咱們還用到了log4j分級打印日誌,而後展開。
總之在個人其它博文裏,也給出了Java面試時的諸多亮點,你們能夠兩兩找關聯,而後自行準備引導說辭。
下面就給出三個很是實用的引導案例,哪怕你以前是零基礎,照樣能夠準備,照樣能夠在面試中發揮。第一個能夠從String一直引導到JVM性能調優。
String問題面試時必定會問到,好比String a= 「123」; String b=」123」; a==b;結果是true仍是false,這個問題大機率問到。怎麼引導呢?
先說結果是true,由於常量是存儲在JVM的常量池裏,而後說,咱們項目裏,在用String時要很是注意,由於會涉及到JVM性能優化,好比儘可能少用鏈接操做,由於會形成內存碎片。由此引導到JVM調優。當面試官頗有可能問,你還知道JVM調優方法?你就能夠順帶展開,好比說,用到集合要clear,用好IO,Connection對象要close,儘可能用StringBuilder等等。說好之後就能夠再說一句,在實際項目裏,我還排查過線上OOM問題。面試官極可能感興趣繼續問,你就能夠繼續說,好比在測試環境,看到日誌裏常常有OOM,而後你看dump文件,發現OOM的緣由是某個大對象沒clear,或者說ThreadLocal對象沒remove,或者是mybatis裏不慎把表裏全部數據都撈出來了,這些具體說辭能夠參見我其它博文,發現問題再說下解決方法,無非是集合用好後clear等。這樣一引導,雖然你實際能力也就是經過3個月運行過若干SSM項目,但和別的初級開發競爭者,差距立刻就拉開了。
第二個引導案例是從volatile等問題引導到ConcurrentHashmap底層代碼。對於初級開發而言,ConcurrentHashmap底層代碼是個萬能的法寶,你費少量功夫看明白底層源碼的流程,並看明白其中讀寫操做和併發的關係,在面試中能夠說是百試百靈的。
好比問,面試時問多線程,volatile關鍵字大機率被問到,好比問,你知道volatile是什麼含義嗎?你除了說好自己含義外,再多下,我看過ConcurrentHashmap底層源代碼,其中用到volatile,雖然volatile沒法作到原子性,但能夠提高效率。你看了底層源碼後,就必定能繼續說,在該類的put和get方法,以及Entry對象裏,大量用到這個,還有transient關鍵字。當你結合底層源碼說清楚ConcurrentHashmap的相關流程之後,一些外派公司甚至就再也不問了。
第三個引導案例更能展現你的Java基礎,就從final關鍵字引導到JVM垃圾回收流程,並能夠進一步引導到OOM問題排查。final關鍵面試時通常也會問到,你回答好final做用在類,方法上的含義後,再說下,我還知道匿名內部類只能訪問final類型的變量,這個點甚至連一些高級開發也不知道,你提出來之後面試官必定會感興趣。其中具體的細節你們能夠參考個人另外一篇博文《內部類、final與垃圾回收,面試時你一說,面試官就知道》,這裏就能引導到垃圾回收的流程。說好之後,你就能夠繼續說,平時我還專研過JVM GC流程,這個其實背些資料就能說,說好之後你再深刻下說,我除了知道GC回收外,還在項目裏排查過OOM問題,至於OOM問題的排查方法,你們能夠參照前文的說辭。
總之這裏請你們注意,引導說辭在面試以前就要準備好,好比被問到xx問題還如何拋出其它相關點,這樣引導的時候就會很天然,不然的話被面試官看出牽強附會的痕跡就很差了。
你們能夠想下,本來面試官在面試初級開發的時候,原本指望就不高,能增刪改查就好了,但你若是用上述三個引導說辭,讓面試官挖掘出你底層代碼和OOM以及JVM等方面的亮點,這樣哪怕你有些問題沒回答好,也會大機率過面試,若是你其它回答中規中矩,但若是經過引導說出上述任一亮點的話,那麼基本上面試成功就成定局了。
寫到這裏,本人自認爲,若是零基礎的同窗按本文給出技巧和經驗,雖然不敢保證必定能100%找到工做,但必定能大幅增長經過面試找到工做的機率,由於本文總結了前人的經驗。
有道是說一千道一萬不如真刀真槍地幹,你們若是真的開始敲代碼作了,必定會遇到不少問題,當你們進展到準備簡歷和麪試實戰的階段,必定會遇到更多的問題。但我相信,本文給出的介紹項目經驗和麪試引導相關技巧,必定能幫助到你們,並且當你們真的開始實踐後,天然會見招拆招,克服掉不少問題。但相反若是你們老是有各類顧慮,好比擔憂學好了工做找不到,或者積累的項目通不過篩選,那麼就會止步不前,最終讓你們失去不少機會。
最後預祝你們通過努力,都找到各自心儀的工做。