(一). 程序員簡歷該怎么寫
1. 為什么說簡歷很重要?
一份好的簡歷可以在整個申請面試以及面試過程中起到非常好的作用。 在不夸大自己能力的情況下,寫出一份好的簡歷也是一項很棒的能力。為什么說簡歷很重要呢?
1.1 先從面試前來說
假如你是網申,你的簡歷必然會經過HR的篩選,一張簡歷HR可能也就花費10秒鐘看一下,然后HR就會決定你這一關是Fail還是Pass。
假如你是內推,如果你的簡歷沒有什么優勢的話,就算是內推你的人再用心,也無能為力。
另外,就算你通過了篩選,后面的面試中,面試官也會根據你的簡歷來判斷你究竟是否值得他花費很多時間去面試。
所以,簡歷就像是我們的一個門面一樣,它在很大程度上決定了你能否進入到下一輪的面試中。
1.2 再從面試中來說
我發現大家比較喜歡看面經 ,這點無可厚非,但是大部分面經都沒告訴你很多問題都是在特定條件下才問的。舉個簡單的例子:一般情況下你的簡歷上注明你會的東西才會被問到(Java、數據結構、網絡、算法這些基礎是每個人必問的),比如寫了你會 redis,那面試官就很大概率會問你 redis 的一些問題。
比如:redis的常見數據類型及應用場景、redis是單線程為什么還這么快、 redis 和 memcached 的區別、redis 內存淘汰機制等等。
所以,首先,你要明確的一點是:你不會的東西就不要寫在簡歷上。另外,你要考慮你該如何才能讓你的亮點在簡歷中凸顯出來,比如:你在某某項目做了什么事情解決了什么問題(只要有項目就一定有要解決的問題)、你的某一個項目里使用了什么技術后整體性能和并發量提升了很多等等。
面試和工作是兩回事,聰明的人會把面試官往自己擅長的領域領,其他人則被面試官牽著鼻子走。雖說面試和工作是兩回事,但是你要想要獲得自己滿意的 offer ,你自身的實力必須要強。
2. 下面這幾點你必須知道
- 大部分公司的HR都說我們不看重學歷(騙你的!),但是如果你的學校不出眾的話,很難在一堆
簡歷中脫穎而出,除非你的簡歷上有特別的亮點,比如:某某大廠的實習經歷、獲得了某某大賽的
獎等等。 - 大部分應屆生找工作的硬傷是沒有工作經驗或實習經歷,所以如果你是應屆生就不要錯過秋招和春
招。一旦錯過,你后面就極大可能會面臨社招,這個時候沒有工作經驗的你可能就會面臨各種碰
壁,導致找不到一個好的工作 - 寫在簡歷上的東西一定要慎重,這是面試官大量提問的地方;
- 將自己的項目經歷完美的展示出來非常重要。
3. 必須了解的兩大法則
3.1 STAR法則(Situation Task Action Result)
Situation: 事情是在什么情況下發生;
Task:: 你是如何明確你的任務的;
Action: 針對這樣的情況分析,你采用了什么行動方式;
Result: 結果怎樣,在這樣的情況下你學習到了什么。
簡而言之,STAR法則,就是一種講述自己故事的方式,或者說,是一個清晰、條理的作文模板。不管是
什么,合理熟練運用此法則,可以輕松的對面試官描述事物的邏輯方式,表現出自己分析闡述問題的清
晰性、條理性和邏輯性。
3.2 FAB 法則(Feature Advantage Benefit)
Feature: 是什么;
Advantage: 比別人好在哪些地方;
Benefit: 如果雇傭你,招聘方會得到什么好處。
簡單來說,這個法則主要是讓你的面試官知道你的優勢、招了你之后對公司有什么幫助。
4. 項目經歷怎么寫?
簡歷上有一兩個項目經歷很正常,但是真正能把項目經歷很好的展示給面試官的非常少。對于項目經歷
大家可以考慮從如下幾點來寫:
- 對項目整體設計的一個感受
- 在這個項目中你負責了什么、做了什么、擔任了什么角色
- 從這個項目中你學會了那些東西,使用到了那些技術,學會了那些新技術的使用
- 另外項目描述中,最好可以體現自己的綜合素質,比如你是如何協調項目組成員協同開發的或者在
遇到某一個棘手的問題的時候你是如何解決的又或者說你在這個項目用了什么技術實現了什么功能
比如:用redis做緩存提高訪問速度和并發量、使用消息隊列削峰和降流等等。
5. 專業技能該怎么寫?
先問一下你自己會什么,然后看看你意向的公司需要什么。一般HR可能并不太懂技術,所以他在篩選簡歷的時候可能就盯著你專業技能的關鍵詞來看。對于公司有要求而你不會的技能,你可以花幾天時間學習一下,然后在簡歷上可以寫上自己了解這個技能。比如你可以這樣寫(下面這部分內容摘自我的簡歷,大家可以根據自己的情況做一些修改和完善):
計算機網絡、數據結構、算法、操作系統等課內基礎知識:掌握
- Java 基礎知識:掌握
- JVM 虛擬機(Java內存區域、虛擬機垃圾算法、虛擬垃圾收集器、JVM內存管理):掌握
- 高并發、高可用、高性能系統開發:掌握
- Struts2、Spring、Hibernate、Ajax、Mybatis、JQuery :掌握
- SSH 整合、SSM 整合、 SOA 架構:掌握
- Dubbo: 掌握
- Zookeeper: 掌握
- 常見消息隊列: 掌握
- Linux:掌握
- MySQL常見優化手段:掌握
- Spring Boot +Spring Cloud +Docker:了解
- Hadoop 生態相關技術中的 HDFS、Storm、MapReduce、Hive、Hbase :了解
- Python 基礎、一些常見第三方庫比如OpenCV、wxpy、wordcloud、matplotlib:熟悉
6. 排版注意事項
- 盡量簡潔,不要太花里胡哨;
- 一些技術名詞不要弄錯了大小寫比如MySQL不要寫成mysql,Java不要寫成java。這個在我看來還
是比較忌諱的,所以一定要注意這個細節; - 中文和數字英文之間加上空格的話看起來會舒服一點;
7. 其他的一些小tips
- 盡量避免主觀表述,少一點語義模糊的形容詞,盡量要簡潔明了,邏輯結構清晰。
- 如果自己有博客或者個人技術棧點的話,寫上去會為你加分很多。
- 如果自己的Github比較活躍的話,寫上去也會為你加分很多。
- 注意簡歷真實性,一定不要寫自己不會的東西,或者帶有欺騙性的內容
- 項目經歷建議以時間倒序排序,另外項目經歷不在于多,而在于有亮點。
- 如果內容過多的話,不需要非把內容壓縮到一頁,保持排版干凈整潔就可以了。
- 簡歷最后最好能加上:“感謝您花時間閱讀我的簡歷,期待能有機會和您共事。”這句話,顯的你會
很有禮貌。
(二). 如何準備面試
不論是筆試還是面試都是有章可循的,但是,一定要不要想著如何去應付面試,糊弄面試官,這樣做終究是欺騙自己。這篇文章的目的也主要想讓大家知道自己應該從哪些方向去準備面試,有哪些可以提高的方向。
網上已經有很多面經了,但是我認為網上的各種面經僅僅只能作為參考,你的實際面試與之還是有一些區別的。另外如果要在網上看別人的面經的話,建議即要看別人成功的案例也要適當看看別人失敗的案例。看面經沒問題,不論是你要找工作還是平時學習,這都是一種比較好地檢驗自己水平的一種方式。
但是,一定不要過分寄希望于各種面經,試著去提高自己的綜合能力。
“ 80% 的 offer 掌握在 20% 的人手 ” 中這句話也不是不無道理的。決定你面試能否成功的因素中實力固然占有很大一部分比例,但是如果你的心態或者說運氣不好的話,依然無法拿到滿意的 offer。
運氣暫且不談,就拿心態來說,千萬不要因為面試失敗而氣餒或者說懷疑自己的能力,面試失敗之后多總結一下失敗的原因,后面你就會發現自己會越來越強大。
另外,筆主只是在這里分享一下自己對于 “ 如何備戰大廠面試 ” 的一個看法,以下大部分理論/言辭都經過過反復推敲驗證,如果有不對的地方或者和你想法不同的地方,請您敬請雅正、不舍賜教。
1. 如何獲取大廠面試機會?
在講如何獲取大廠面試機會之前,先來給大家科普/對比一下兩個校招非常常見的概念——春招和秋招。
- 招聘人數 :秋招多于春招 ;
- 招聘時間 : 秋招一般7月左右開始,大概一直持續到10月底。但是大廠(如BAT)都會早開始早結
束,所以一定要把握好時間。春招最佳時間為3月,次佳時間為4月,進入5月基本就不會再有春招
了(金三銀四)。 - 應聘難度 :秋招略大于春招;
- 招聘公司: 秋招數量多,而春招數量較少,一般為秋招的補充。
綜上,一般來說,秋招的含金量明顯是高于春招的。
下面我就說一下我自己知道的一些方法,不過應該也涵蓋了大部分獲取面試機會的方法。 - 關注大廠官網,隨時投遞簡歷(走流程的網申);
- 線下參加宣講會,直接投遞簡歷;
- 找到師兄師姐/認識的人,幫忙內推(能夠讓你避開網申簡歷篩選,筆試篩選,還是挺不錯的,不
過也還是需要你的簡歷夠棒); - 博客發文被看中/Github優秀開源項目作者,大廠內部人員邀請你面試;
- 求職類網站投遞簡歷(不是太推薦,適合海投);
除了這些方法,我也遇到過這樣的經歷:有些大公司的一些部門可能暫時沒招夠人,然后如果你的親戚
或者朋友剛好在這個公司,而你正好又在尋求offer,那么面試機會基本上是有了,而且這種面試的難度
好像一般還普遍比其他正規面試低很多。
2. 面試前的準備
2.1 準備自己的自我介紹
自我介紹一般是你和面試官的第一次面對面正式交流,換位思考一下,假如你是面試官的話,你想聽到被你面試的人如何介紹自己呢?一定不是客套地說說自己喜歡編程、平時花了很多時間來學習、自己的興趣愛好是打球吧?
我覺得一個好的自我介紹應該包含這幾點要素:
- 用簡單的話說清楚自己主要的技術棧于擅長的領域;
- 把重點放在自己在行的地方以及自己的優勢之處;
- 重點突出自己的能力比如自己的定位的bug的能力特別厲害;
從社招和校招兩個角度來舉例子吧!我下面的兩個例子僅供參考,自我介紹并不需要死記硬背,記住要說的要點,面試的時候根據公司的情況臨場發揮也是沒問題的。另外,網上一般建議的是準備好兩份自我介紹:一份對hr說的,主要講能突出自己的經歷,會的編程技術一語帶過;另一份對技術面試官說的,主要講自己會的技術細節和項目經驗。
社招:
面試官,您好!我叫獨秀兒。我目前有1年半的工作經驗,熟練使用Spring、MyBatis等框架、了
解 Java 底層原理比如JVM調優并且有著豐富的分布式開發經驗。離開上一家公司是因為我想在技
術上得到更多的鍛煉。在上一個公司我參與了一個分布式電子交易系統的開發,負責搭建了整個
項目的基礎架構并且通過分庫分表解決了原始數據庫以及一些相關表過于龐大的問題,目前這個
網站最高支持 10 萬人同時訪問。工作之余,我利用自己的業余時間寫了一個簡單的 RPC 框架,
這個框架用到了Netty進行網絡通信, 目前我已經將這個項目開源,在 Github 上收獲了 2k的
Star! 說到業余愛好的話,我比較喜歡通過博客整理分享自己所學知識,現在已經是多個博客平臺
的認證作者。 生活中我是一個比較積極樂觀的人,一般會通過運動打球的方式來放松。我一直都
非常想加入貴公司,我覺得貴公司的文化和技術氛圍我都非常喜歡,期待能與你共事!
校招:
面試官,您好!我叫秀兒。大學時間我主要利用課外時間學習了 Java 以及 Spring、MyBatis等框
架 。在校期間參與過一個考試系統的開發,這個系統的主要用了 Spring、MyBatis 和 shiro 這三
種框架。我在其中主要擔任后端開發,主要負責了權限管理功能模塊的搭建。另外,我在大學的
時候參加過一次軟件編程大賽,我和我的團隊做的在線訂餐系統成功獲得了第二名的成績。我還
利用自己的業余時間寫了一個簡單的 RPC 框架,這個框架用到了Netty進行網絡通信, 目前我已
經將這個項目開源,在 Github 上收獲了 2k的 Star! 說到業余愛好的話,我比較喜歡通過博客整
理分享自己所學知識,現在已經是多個博客平臺的認證作者。 生活中我是一個比較積極樂觀的
人,一般會通過運動打球的方式來放松。我一直都非常想加入貴公司,我覺得貴公司的文化和技
術氛圍我都非常喜歡,期待能與你共事!
2.2 搞清楚技術面可能會問哪些方向的問題
你準備面試的話首先要搞清技術面可能會被問哪些方向的問題吧!
我直接用思維導圖的形式展示出來吧!這樣更加直觀形象一點,細化到某個知識點的話這張圖沒有介紹到,留個懸念,下篇文章會詳細介紹。
上面思維導圖大概涵蓋了技術面試可能會設計的技術,但是你不需要把上面的每一個知識點都搞得很熟悉,要分清主次,對于自己不熟悉的技術不要寫在簡歷上,對于自己簡單了解的技術不要說自己熟練掌握!
2.3 休閑著裝即可
穿西裝、打領帶、小皮鞋?NO!NO!NO!這是互聯網公司面試又不是去走紅毯,所以你只需要穿的簡單大方就好,不需要太正式。
2.4 隨身帶上自己的成績單和簡歷
有的公司在面試前都會讓你交一份成績單和簡歷當做面試中的參考。
2.5 如果需要筆試就提前刷一些筆試題
平時空閑時間多的可以刷一下筆試題目(牛客網上有很多)。但是不要只刷面試題,不動手code,程序員不是為了考試而存在的。
2.6 花時間一些邏輯題
面試中發現有些公司都有邏輯題測試環節,并且都把邏輯筆試成績作為很重要的一個參考。
2.7 準備好自己的項目介紹
如果有項目的話,技術面試第一步,面試官一般都是讓你自己介紹一下你的項目。你可以從下面幾個方向來考慮:
- 對項目整體設計的一個感受(面試官可能會讓你畫系統的架構圖)
- 在這個項目中你負責了什么、做了什么、擔任了什么角色
- 從這個項目中你學會了那些東西,使用到了那些技術,學會了那些新技術的使用
- 另外項目描述中,最好可以體現自己的綜合素質,比如你是如何協調項目組成員協同開發的或者在
遇到某一個棘手的問題的時候你是如何解決的又或者說你在這個項目用了什么技術實現了什么功能
比如:用redis做緩存提高訪問速度和并發量、使用消息隊列削峰和降流等等。
2.8 提前準備技術面試
搞清楚自己面試中可能涉及哪些知識點、哪些知識點是重點。面試中哪些問題會被經常問到、自己該如何回答。(強烈不推薦背題,第一:通過背這種方式你能記住多少?能記住多久?第二:背題的方式的學習很難堅持下去!)
2.9 面試之前做好定向復習
所謂定向復習就是專門針對你要面試的公司來復習。比如你在面試之前可以在網上找找有沒有你要面試的公司的面經。
舉個栗子:在我面試 ThoughtWorks 的前幾天我就在網上找了一些關于 ThoughtWorks 的技術面的一些文章。然后知道了 ThoughtWorks 的技術面會讓我們在之前做的作業的基礎上增加一個或兩個功能,所以我提前一天就把我之前做的程序重新重構了一下。然后在技術面的時候,簡單的改了幾行代碼之后寫個測試就完事了。如果沒有提前準備,我覺得 20 分鐘我很大幾率會完不成這項任務。
3. 面試之后復盤
如果失敗,不要灰心;如果通過,切勿狂喜。面試和工作實際上是兩回事,可能很多面試未通過的人,工作能力比你強的多,反之亦然。我個人覺得面試也像是一場全新的征程,失敗和勝利都是平常之事。
所以,勸各位不要因為面試失敗而灰心、喪失斗志。也不要因為面試通過而沾沾自喜,等待你的將是更美好的未來,繼續加油!
4. 如何學習?學會各種框架有必要嗎?
4.1 我該如何學習?
最最最關鍵也是對自己最最最重要的就是學習!看看別人分享的面經,看看我寫的這篇文章估計你只需要10分鐘不到。但這些東西終究是空洞的理論,最主要的還是自己平時的學習!
如何去學呢?我覺得學習每個知識點可以考慮這樣去入手:
- 官網(大概率是英文,不推薦初學者看)。
- 書籍(知識更加系統完全,推薦)。
- 視頻(比較容易理解,推薦,特別是初學的時候。慕課網和嗶哩嗶哩上面有挺多學習視頻可以看,
只直接在上面搜索關鍵詞就可以了)。 - 網上博客(解決某一知識點的問題的時候可以看看)。
這里給各位一個建議,看視頻的過程中最好跟著一起練,要做筆記!!!
最好可以邊看視頻邊找一本書籍看,看視頻沒弄懂的知識點一定要盡快解決,如何解決?
首先百度/Google,通過搜索引擎解決不了的話就找身邊的朋友或者認識的一些人。
4.2 學會各種框架有必要嗎?
一定要學會分配自己時間,要學的東西很多,真的很多,搞清楚哪些東西是重點,哪些東西僅僅了解就夠了。一定不要把精力都花在了學各種框架上,算法、數據結構還有計算機網絡真的很重要!
(三). Java學習路線和方法推薦
下面的學習路線以及方法是筆主根據個人學習經歷總結改進后得出,我相信照著這條學習路線來你的學習效率會非常高。
另外,很重要的一點:建議使用 Intellij IDEA 進行編碼,可以單獨抽點時間學習 Intellij IDEA 的使用。
先說一個初學者很容易犯的錯誤:上來就通過項目學習。
很多初學者上來就像通過做項目學習,特別是在公司,我覺得這個是不太可取的。 如果的 Java基礎或者 Spring Boot 基礎不好的話,建議自己先提前學習一下之后再開始看視頻或者通過其他方式做項目。
還有點事,我不知道為什么大家都會說邊跟著項目邊學習做的話效果最好,我覺得這個要加一個前提是你對這門技術有基本的了解或者說你對編程有了一定的了解。
關于如何學習且聽我從一個電商系統網站的創建來說起。假如我們要創建一個基于Java的分布式/微服務電商系統的話,我們可以按照下面的學習路線來做:
首選第一步我們肯定是要從 Java 基礎來學習的(如果你沒有計算機基礎知識的話推薦看一下《計算機導論》這類入門書籍)。
1.Java 基礎
《Java 核心技術卷 1/2》 和 《Head First Java》 這兩本書在我看來都是入門 Java 的很不錯的書籍(《Java 核心技術卷 1/2》 知識點更全,我更推薦這本書),我倒是覺得 《Java 編程思想》 有點屬于新手勸退書的意思,慎看,建議有點基礎后再看。你也可以邊看視頻邊看書學習(黑馬、尚硅谷、慕課網的視頻都還行)。對于 Java8 新特性的東西,我建議你基礎學好之后可以看一下,暫時看不太明白也沒關系,后面抽時間再回過頭來看。看完之后,你可以用自己學的東西實現一個簡單的 Java 程序,也可以嘗試用 Java 解決一些編程問題,以此來將自己學到的東西付諸于實踐。
不太建議學習 Java基礎的時候通過做游戲來鞏固。為什么培訓班喜歡通過這種方式呢?說白點就是為了找到你的G點(不好意思開車了哈)。新手學習完Java基礎后做游戲一般是不太現實的,還不如找一些簡單的程序問題解決一下比如簡單的算法題。
記得多總結!打好基礎!把自己重要的東西都記錄下來。 API 文檔放在自己可以看到的地方,以備自己可以隨時查閱。為了能讓自己寫出更優秀的代碼,《Effective Java》、《重構》 這兩本書沒事也可以看看。
另外,學習完之后可以看一下下面這幾篇文章,檢查一下自己的學習情況。這幾篇文章不是我吹,可能是全網最具價值的 Java 基礎知識總結,畢竟是在我的 JavaGuide開源的,經過了各路大佬以及我的不斷完善。
2. 操作系統與計算機網絡
操作系統這方面我覺得掌握操作系統的基礎知識和 Linux 的常用命令就行以及一些重要概念就行了。
關于操作系統的話,我沒有什么操作系統方面的書籍可以推薦,因為我自己也沒認真看過幾本。因為操作系統比較枯燥的原因,我建議這部分看先看視頻學可能會比較好一點。
另外,對于 Linux 我們要掌握基本的使用就需要對一些常用命令非常熟悉比如:目錄切換命令、目錄操作命令、文件的操作命令、壓縮或者解壓文件的命令等等。
計算機網絡方面的學習,我覺得掌握基本的知識就行了,不需要太深究,一般面試對這方面要求也不高,畢竟不是專門做網絡的。推薦 《網絡是怎樣連接的》 、《圖解 HTTP》 這兩本書來看,這兩本書都屬于比較有趣易懂的類型,也適合沒有基礎的人來看。
我們寫程序的都知道一個公式叫做 “程序設計 = 算法 + 數據結構”。我們想讓我們的網站的地盤更加牢固的話,我覺得數據結構與算法還是很有必要學習的。所以第三步,我推薦可以適當花時間看一下 數據結構與算法 但是,同樣不做強求!你抽時間一定要補上就行!
3. 數據結構與算法
如果你想進入大廠的話,我推薦你在學習完 Java基礎之后,就開始每天抽出一點時間來學習算法和數據結構。為了提高自己的編程能力,你也可以堅持刷 Leetcode。就目前國內外的大廠面試來說,刷Leetcode 可以說已經成了不得不走的一條路。
對于想要入門算法和數據結構的朋友,建議看這兩本書 《算法圖解》 和 《大話數據結構》,這兩本書雖然算不上很經典的書籍,但是比較有趣,對于剛入門算法和數據結構的朋友非常友好。《算法導論》非常經典,但是對于剛入門的就不那么友好了。
另外,還有一本非常贊的算法書推薦給各位,這本書的名字就叫 《算法》,書中的代碼都是用 Java 語言編寫。這本書的優點太多太多比如它的講解基礎而全面、對閱讀者比較友好等等。我覺得這本書唯一的缺點就是太厚了 (小聲 BB,可能和作者講解某些知識點的時候有點啰嗦有關)。除了這本書之外,
《劍指 offer》 、《編程珠璣》 、《編程之美》 這三本書都被很多大佬推薦過了,對于算法面試非常有幫助。《算法之美》 這本書也非常不錯,非常適合閑暇的時候看。我們網站的頁面搭建需要前端的知識,我們前端也后端的交互也需要前端的知識。所以第四步,我推薦你可以了解一下前端知識,不過不需要學的太精通。自己對與前端知識有了基本的了解之后通過
4. 前端知識
這一步主要是學習前端基礎 (HTML、CSS、JavaScript),當然 BootStrap、Layui 等等比較簡單的前端框架你也可以了解一下。網上有很多這方面資源。
另外,沒記錯的話 Spring Boot官方推薦的是模板引擎是 thymeleaf ,這東西和HTML很像,了解了基本語法之后很容易上手。 結合layui,booystrap這些框架的話也能做成比較美觀的頁面。開發一些簡單的頁面比如一個后端項目就是為了做個簡單的前端頁面做某些操作的話直接用thymeleaf就好。
現在都是前后端分離,就目前來看大部分項目都優先選擇 React、Angular、Vue 這些厲害的框架來開發,這些框架的上手要求要高一些。如果你想往全棧方向發展的話(筆主目前的方向,我用 React 在公司做過兩個小型項目),建議先把 JS 基礎打好,然后再選擇 React、Angular、Vue 其中的一個來認真學習一下。國內使用 Vue 比較多一點,國外一般用的是 React 和 Angular。
如何和后端交互呢?一般使用在 React、Vue這些框架的時候使用Axios比較多。
我們網站的數據比如用戶信息、訂單信息都需要存儲,所以,下一步我推薦你學習 MySQl這個被廣泛運用于各大網站的數據庫。不光要學會如何寫 sql 語句,更好的是還要搞清諸如索引這類重要的概念。
5. MySQL
學習 MySQL 的基本使用,基本的增刪改查,SQL 命令,索引、存儲過程這些都學一下吧!推薦書籍《SQL 基礎教程(第 2 版)》(入門級)、《高性能 MySQL : 第 3 版》(進階)、《MySQL 必知必會》。
6. 常用工具
非常重要!非常重要!特別是 Git和 Docker。
- IDEA:熟悉基本操作以及常用快捷。
- Maven :建議學習常用框架之前可以提前花半天時間學習一下Maven的使用。(到處找 Jar 包,
下載 Jar 包是真的麻煩費事,使用 Maven 可以為你省很多事情)。 - Git :基本的 Git 技能也是必備的,試著在學習的過程中將自己的代碼托管在 Github 上。
- Docker :學著用 Docker 安裝學習中需要用到的軟件比如 MySQL ,這樣方便很多,可以為你節省
不少時間。
利用常用框架可以極大程度簡化我們的開發工作。學習完了常用工具之后,我們就可以開始常用
框架的學習啦!
7. 常用框架
學習 Struts2(可不用學)、Spring、SpringMVC、Hibernate、Mybatis、shiro 等框架的使用, (可 選) 熟悉 Spring 原理(大廠面試必備),然后很有必要學習一下 SpringBoot ,學好 SpringBoot 真的很重要。很多公司對于應屆生都是直接上手 SpringBoot,不過如果時間允許的話,我還是推薦你把Spring、SpringMVC 提前學一下。
Spring 真的很重要! 一定要搞懂 AOP 和 IOC 這兩個概念。Spring 中 bean 的作用域與生命周期、SpringMVC 工作原理詳解等等知識點都是非常重要的,一定要搞懂。
8. 多線程的簡單使用
多線程這部分內容可能會比較難以理解和上手,前期可以先簡單地了解一下基礎,到了后面有精力和能力后再回來仔細看。
學習完多線程之后可以通過下面這些問題檢測自己是否掌握。
**Java 多線程知識基礎: **
- 什么是線程和進程?
- 請簡要描述線程與進程的關系,區別及優缺點?
- 說說并發與并行的區別?
- 為什么要使用多線程呢?
- 使用多線程可能帶來什么問題?
- 說說線程的生命周期和狀態?
- 什么是上下文切換?
- 什么是線程死鎖?如何避免死鎖?
- 說說 sleep() 方法和 wait() 方法區別和共同點?
- 為什么我們調用 start() 方法時會執行 run() 方法,為什么我們不能直接調用 run() 方法?
Java 多線程知識進階:
- synchronized 關鍵字:① 說一說自己對于 synchronized 關鍵字的了解;② 說說自己是怎么使用
synchronized 關鍵字,在項目中用到了嗎;③ 講一下 synchronized 關鍵字的底層原理;④ 說說
JDK1.6 之后的 synchronized 關鍵字底層做了哪些優化,可以詳細介紹一下這些優化嗎;⑤ 談談
synchronized 和 ReentrantLock 的區別。 - volatile 關鍵字: ① 講一下 Java 內存模型;② 說說 synchronized 關鍵字和 volatile 關鍵字的區
別。 - ThreadLocal:① 簡介;② 原理;③ 內存泄露問題。
- 線程池:① 為什么要用線程池?;② 實現 Runnable 接口和 Callable 接口的區別;③ 執行
execute() 方法和 submit() 方法的區別是什么呢?;④ 如何創建線程池。 - Atomic 原子類: ① 介紹一下 Atomic 原子類;② JUC 包中的原子類是哪 4 類?;③ 講講
AtomicInteger 的使用;④ 能不能給我簡單介紹一下 AtomicInteger 類的原理。 - AQS :① 簡介;② 原理;③ AQS 常用組件。
9. 分布式
- 學習 Dubbo、Zookeeper來實現簡單的分布式服務
- 學習 Redis 來提高訪問速度,減少對 MySQL數據庫的依賴;
- 學習 Elasticsearch 的使用,來為我們的網站增加搜索功能
- 學習常見的消息隊列(比如RabbitMQ、Kafka)來解耦我們的服務(ActiveMq不要學了,已經淘
汰); - ......
到了這一步你應該是有基礎的一個 Java程序員了,我推薦你可以通過一個分布式項目來學習。覺得應該是掌握這些知識點比較好的一種方式了,另外,推薦邊看視頻邊自己做,遇到不懂的知識點要及時查閱網上博客和相關書籍,這樣學習效果更好。
一定要學會拓展知識,養成自主學習的意識。 黑馬項目對這些知識點的介紹都比較蜻蜓點水。
繼續深入學習的話,我們要了解Netty、JVM這些東西。
10. 深入學習
可以再回來看一下多線程方面的知識,還可以利用業余時間學習一下 NIO 和 Netty ,這樣簡歷上也可以多點東西。如果想去大廠,JVM 的一些知識也是必學的(Java 內存區域、虛擬機垃圾算法、虛擬垃圾收集器、JVM 內存管理)推薦《深入理解 Java 虛擬機:JVM 高級特性與最佳實踐(最新第二版》和《實戰 Java 虛擬機》,如果嫌看書麻煩的話,你也可以看我整理的文檔。
另外,現在微服務特別火,很多公司在面試也明確要求需要微服務方面的知識。如果有精力的話可以去學一下 SpringCloud 生態系統微服務方面的東西。
微服務的概念龐大,技術種類也很多,但是目前大型互聯網公司廣泛采用的,實話實話這些東西
我不在行,自己沒有真實做過微服務的項目。不過下面是我自己總結的一些關于微服務比價重要
的知識,選學。
11. 微服務
這部分太多了,選擇性學習。
相關技術:
- 網關 :kong,soul;
- 分布式調用鏈: SkyWalking、Zipkin
- 日志系統: Kibana
- ......
Spring Cloud 相關:
- Eureka:服務注冊與發現;
- Ribbon:負載均衡;
- Hytrix :熔斷;
- Zuul :網關;
- Spring Cloud Config:配置中心;
Spring Cloud Alibaba也是很值得學習的:
- Sentinel :A lightweight powerful flow control component enabling reliability andmonitoring for microservices. (輕量級的流量控制、熔斷降級 Java 庫)。
- dubbo :Apache Dubbo 是一個基于 Java 的高性能開源 RPC 框架。
- nacos :Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,
幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。Nacos 可以作為 Dubbo 的注
冊中心來使用。 - seata : Seata 是一種易于使用,高性能,基于 Java 的開源分布式事務解決方案。
- RocketMQ :阿里巴巴開源的一款高性能、高吞吐量的分布式消息中間件。
12. 總結
我上面主要概括一下每一步要學習的內容,對學習規劃有一個建議。知道要學什么之后,如何去學呢?我覺得學習每個知識點可以考慮這樣去入手:
- 官網(大概率是英文,不推薦初學者看)。
- 書籍(知識更加系統完全,推薦)。
- 視頻(比較容易理解,推薦,特別是初學的時候)。
- 網上博客(解決某一知識點的問題的時候可以看看)。
這里給各位一個建議,看視頻的過程中最好跟著一起練,要做筆記!!!
最好可以邊看視頻邊找一本書籍看,看視頻沒弄懂的知識點一定要盡快解決,如何解決?
首先百度/Google,通過搜索引擎解決不了的話就找身邊的朋友或者認識的一些人。另外,一定要進行項目實戰!很多人這時候就會問沒有實際項目讓我做怎么辦?我覺得可以通過下面這幾種方式:
- 在網上找一個符合自己能力與找工作需求的實戰項目視頻或者博客跟著老師一起做。做的過程中,
你要有自己的思考,不要淺嘗輒止,對于很多知識點,別人的講解可能只是滿足項目就夠了,你自
己想多點知識的話,對于重要的知識點就要自己學會去往深處學。 - Github 或者碼云上面有很多實戰類別項目,你可以選擇一個來研究,為了讓自己對這個項目更加
理解,在理解原有代碼的基礎上,你可以對原有項目進行改進或者增加功能。 - 自己動手去做一個自己想完成的東西,遇到不會的東西就臨時去學,現學現賣(這種方式比較難,
初學不推薦用這種方式,因為你腦海中沒有基本的概念,寫出來的代碼一般會很難或者根本就做不
出來一個像樣的東西)。 - ......
做項目不光要做,還要改進,改善。另外,如果你的老師有相關 Java 后臺項目的話,你也可以主動申請參與進來。
一定要學會分配自己時間,要學的東西很多,真的很多,搞清楚哪些東西是重點,哪些東西僅僅了解就夠了。一定不要把精力都花在了學各種框架上,算法和數據結構真的很重要!