兩萬字長文總結,梳理 Java 入門進階那些事

你們好,我是程序員小躍,一名在職場已經寫了6年程序的老程序員,從一開始的菊廠 Android 開發到如今某遊戲公司的Java後端架構,對Java仍是相對了解的挺多。html

大概是半年前吧,在知乎上有個知友私信給我,問我關於零基礎如何學習Java,以及在學習過程當中會存在必定的迷茫,如何應對等等。
我想着何不把之前的內容從新整合下分享出來給你們呢,因而就有了今天的此次分享。前端

在過去的一年多時間裏,躍哥經過這份清晰的路線圖,已經幫助 20+同窗作好定位,快速認清了本身當前的現狀,並作好相應的應對措施,甚至有同窗經過調整,已經拿到了心儀的 offer。java

那麼立刻進入主題,該篇內容主要涉及到如下主題,其中第一部分學習路線,在總結完每一個路線的時候,躍哥還會有完成路線的成就感是什麼,以及一些實用的書籍推薦噢。mysql

先給你們看下完整的思惟導圖,也是這篇文章的主要脈絡。android

  • Java從入門到進階學習路線
  • 主導三個項目,讓我獨當一面
  • 能力提高你要怎麼學
  • 全篇總結

Java 如今主要是做爲後端應用在發展,尤爲是他的微服務領域。根據編程語言排行來看,Java 常年佔據榜單的 Top 3,學習和使用 Java 的夥伴實在是太多了。甚至有大V認爲,在微服務領域 Java 目前是王者。程序員

全球有 1200 萬以上 Java 程序員以及海量的設備,還有無所不能的 Java 生態圈。諸如阿里巴巴、京東、百度、騰訊、美團、去哪兒等互聯網公司,基本都是以 Java 爲首選編程語言的。即便在最新的雲計算領域,Java 仍然是 AWS、Google App Engine 等平臺上,使用最多的編程語言。web

因此,咱們學習 Java 的更進一步目標就是把本身培養成微服務高手,找工做的目標要麼就是去大廠寫 Java,要麼在小廠成爲獨當一面的主程。固然目前 Android 開發雖說使用了Kotlin,使用 Java 的仍是大有人在,躍哥就是從Android開發內部轉到Java開發,也算是沒有付出很高的代價。面試

Java從入門到進階學習路線

瞭解 Java 語言
  • Java 的前世此生
  • Java 如何編譯
  • Java 環境配置
  • Java 編譯器

不少同窗很喜歡一上來就想着寫代碼,巴不得一拿到書本的第一頁就是教你如何如何寫代碼,其實不是這樣的。redis

咱們瞭解一門語言,一開始仍是須要了解Java 的前世此生,Java 是怎麼來的,如何發展,以及如何規劃的。知道 Java 怎麼來,應用在哪,咱們才能去挖掘更多屬於 Java 的價值,對不對?因此請問下你們,目前你們在用哪一個版本呢?最新的版本是多少?最新的長更新版本又是多少?算法

因此不少教科書第一部分基本會聊一聊 Java 的歷史,以及如何編譯 Java,而不是一上來就讓你們用編譯器開始玩轉。

躍哥一開始寫 Java 仍是敲的命令行,用記事本寫過 Java 代碼,語法錯誤都是靠編譯一步步調整過來的,雖然很累,可是很受用。

不過咱們最終是須要創造生產力的,並且來咱們這裏學習的同窗確定都是有功底的,因此其實這個第一部分是個人廢話。好比 Java 如何編譯,環如何安裝,選擇合適的編譯器(目前基本就是 IDEA 和 Eclipse 兩強割據時代)

Java 是一門純粹的面向對象的編程語言,因此必須得弄懂它的 OOP 特性:封裝、繼承、多態。

關於基本知識學習

基礎知識包括(這部分主要參考《Java核心技術卷》):

  1. 基本程序結構:基本變量類型、運算符、字符串、流程控制、數組
  2. 類與對象:類的定義和使用、靜態屬性和方法、繼承、包管理、枚舉、反射
  3. 接口和抽象類:接口的定義及實現、抽象類的定義及實現
  4. 泛型:泛型類、泛型方法
  5. 集合:Set、List、Map、樹、排序和查找
  6. 異常與調試:內置異常、聲明異常、自定義異常、捕獲異常、日誌
  7. 多線程:多線程概念、使用線程、同步
  8. Java 8 以後的新特性:Lambda表達式、Stream(map、filter、reduce、集合)
  9. Java 網絡編程:TCP、UDP
  10. Java I/O、NIO(WebSocket)
  11. 算法與數據結構

學習基本知識,就是讓你對Java語言有一個初步的瞭解。話又說回來,基礎知識是學習一門編程語言的必備條件,並且大部分語言的基礎知識都是大同小異,包含基本的數據類型、程序結構等等。若是是Java這類面向對象的,那麼還得掌握面向對象的知識,面向對象是重中之重,面向對象是重中之重,面向對象是重中之重,重要的事情說三遍。只有掌握面向對象的知識,在後續的開發中纔會有更好的成長。

這部分我加了算法和數據結構,其實我也在猶豫到底要把他分在哪一個模塊裏,由於學校裏學的時候,會教你基本的算法;可是工做,面試的時候,考的算法會綜合起來,並非生掰硬套就能夠的。

如今校招算法是必備的模塊了,因此我仍是歸結在基本知識裏。好比我之前面試候選人的時候,冒泡這種是經常出現的。

成就感:學習了 Java 的前世此生,以及基本知識,就表示你能夠愉快開始愉快的玩耍了。

學習完上面的 1-6 條那就能夠在編譯器上新建一個工程,開始初步掌握 Java 的基本操做,學完 7-11 能夠嘗試完成一個簡單的聊天系統,寫一個服務端,一個客戶端,就能夠進行聊天通訊,那時候你的成就感會很足的噢。

推薦書單

  • 學習過程躍哥是按照《Java 核心技術卷 1》、《Java 核心技術卷 2》來的
  • 躍哥剛開始學習的時候,是看了李剛老師的《瘋狂 Java 講義》,在實驗室潛心學習半個多月啃出來的書
  • 併發方面,能夠看看《Java 併發編程實戰》
  • Java 新特性,能夠查閱《Java 實戰》,躍哥最近也在回憶鞏固,內容很乾
  • 算法的話,入門就推薦下去年很火的程序員小灰的《漫畫算法》,以及最近很火的東哥寫的 《labuladong的算法小抄》
關於 Spring 學習(Web 框架)

下面是掌握 Spring 相關,須要掌握的知識(可能不止,也可能有遺漏,後續能夠再補充)

  1. Maven:Maven與包管理、POM文件、生命週期等
  2. 單元測試:單元測試的概念,Junit
  3. Spring Core:依賴注入與控制反轉、Spring概述、xml 裝配 bean、Spring容器與生命週期、自動裝配、註解裝配、切面編程(AOP)
  4. HTTP協議:基本概念、方法(GET/POST)、HttpClist 庫
  5. JSON知識:JSON 概念、JSON 與 HTTP、JSON封裝的庫(FastJson、jaskson 庫)
  6. Servlet概念:Servlet 概念、Servlet 生命週期、Filter 和 Listener、Tomcat 與 Servlet 容器
  7. Spring MVC概念:配置Spring MVC、路徑映射、參數傳遞、實現REST、權限控制等
  8. RPC框架(遠程過程調用)

有了第一部分的基本知識,那咱們第二步就是直奔主題。在領域裏,Spring就是須要學習的利器。我大學是學習客戶端的,因此那時候對後端的認知就是 Spring、Struts二、Hibernate三駕馬車,結果後等本身寫後端的時候,發現時代已經變了,如今更多的是掌握 Spring、Spring MVC、Mybatis,尤爲是 Spring 框架。

這部分涉及的點也比較多,可是學習起來,基本都是連貫的。從你新建一個Spring項目開始,就一步步按部就班,只要你開始寫代碼,這些知識都會涉及到,不用懼怕本身沒接觸,學不會。

這裏的書單推薦在後面,請稍等。

關於應用服務的學習

主要包括但不限於

  1. MySQL:關係型數據庫概念,數據庫的CRUD操做、JDBC API、數據庫特性,數據庫鏈接池
  2. MyBatis:OR映射概念,配置,映射,基本Java庫,和Spring集成
  3. 緩存:緩存概念、Redis的使用、緩存雪崩、緩存穿透、緩存擊穿
  4. NoSQL:NoSQL概念,Mongodb的使用
  5. 隊列:隊列概念,RabbitMQ、Kafka
  6. 搜索引擎:Elasticsearch
  7. 反向代理:反向代理概念,Nginx的配置和使用

應用服務這一塊,涵蓋了不少領域,包括持久化、緩存、隊列、反向代理等,這些是完善一個程序的重中之重。前面的那幾個知識屬於基礎框架,那麼中間件就是給框架裏填充一些加強的部分,讓程序健壯穩定。想必你們平時練手之類的遇到頻率很高的項目就是電商類的項目,好比電商類中的秒殺就用了redis緩存知識。

這部份內容我以爲頗有意思,一個功能完成了,僅僅是第一步,要完善他還須要多種配合。好比咱們的數據存儲,用到了SQL相關的知識,那就去掌握起來,如今互聯網上基本都用MySQL再使用;而後你須要支持秒殺這類,就得用到Redis相關;庫存更新是門技術活,你可能須要用到消息隊列;歷史訂單查詢,能夠選擇用mongodb,Elasticsearch;訪問壓力太大,你可能須要流量分發,甚至是熔斷,那就須要Nginx的使用。

你看,這些應用就這樣無形之中被應用起來,來提高應用的健壯性。我剛提到的這些,若是僅僅是小的項目使用或者是本身練手,存儲上SQL就足夠了,不須要用緩存等其餘的,可是應用大了,就不得不考慮各類狀況,那麼這些神器就慢慢的使用上了。

你看,編程其實就是這麼神奇,都是按部就班的過程。

書單推薦:這裏提到的不少,已經有不少優秀的書籍,躍哥就簡單推薦幾本,供你們參考。

  • 《高性能 MySQL》(豆瓣評分 9.3,0.4K+人評價):mysql 領域的經典之做,擁有普遍的影響力。不但適合數據庫管理員(dba)閱讀,也適合開發人員參考學習。無論是數據庫新手仍是專家,相信都能從本書有所收穫。
  • 《Redis 實戰》:若是你想了解 Redis 的一些概念性知識的話,這本書真的很是不錯。
  • 《Redis 設計與實現》(豆瓣評分 8.5):躍哥學習 Redis 的時候,除了看官網,捧在手裏的就是這本書啦。
  • 《RabbitMQ實戰 : 高效部署分佈式消息隊列》也是 《RabbitMQ in Action : Distributed Messaging for Everyone》的中文版。最近在學習的時候,也看到老師推薦書單,有位老師就說,《xx in Action》這種書籍是經典書籍,很適合你們看,哈哈,這個不假,後面我還要推薦幾本 xx in Action。
  • 《Kafka權威指南》
  • 《深刻理解Nginx(第2版) : 模塊開發與架構解析》
Web 框架進階

  1. SpringBoot
  2. SpringCloud
    • 服務發現(Eureka)
    • 服務網關(Zuul)
    • 負載均衡(Ribbon)
    • 斷路器(Hystrix)
    • 配置管理(Config)
  3. 阿里的 Dubbo

到這裏,不少同窗應該都瞭解了 SSM 框架,而後你會以爲框架也不過這麼回事,這裏躍哥簡單描述下一個輕量級 Web 框架主要具有如下功能:

  • 可讀取用戶自定義配置文件,並以此來初始化框架;
  • 具有 Bean 容器,管理項目的類的對象生命週期;
  • 具有依賴注入,下降類之間的耦合性;
  • 具有 AOP 功能,使項目可進行橫向編程,可不改變原有代碼的狀況增長業務邏輯;
  • 具有 MVC 框架模式。

SSM 是我認識的第一個Web框架,其實Web框架百花齊放,Spring 全家桶又是這些中的明星,尤爲是他們家族中的 SpringBoot 和 SpringCloud 框架。

SpringBoot 彌補了Spring 配置上的缺點,不再用爲繁雜的 xml 耗費更多的精力,一接觸SpringBoot的時候,彷彿打開了個人世界,顛覆了我以前的認知。若是你的項目剛開始,還在積累用戶的階段,那麼SpringBoot 是一個好的選擇,包括本身練手學習的項目,從SpringBoot 着手再合適不過了。

SpringCloud 是一個微服務架構,可以將項目按照業務分紅一個個微服務,每一個微服務均可獨立部署,服務之間互相協調。當一個項目愈來愈大時,隨之而來的是愈來愈難以維護,此時將項目拆分紅若干個微服務、單獨維護、單獨部署,也能夠下降項目不一樣業務間的耦合度。

這裏還得提一個阿里的Dubbo,開源分佈式服務框架,並被普遍應用於中國各互聯網公司;只須要經過 Spring 配置的方式便可完成服務化,對於應用無入侵,設計的目的仍是服務於自身的業務爲主。Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。

雖然中間Dubbo一度中止更新,可是阿里在2017年從新開始維護,他和Spring Cloud 都是實現微服務有效的工具。不過二者也有側重點,這個你們能夠搜索下,用一部分小夥伴經過臺式電腦的比喻來講就是:Dubbo 是品牌機,Spring Cloud 是組裝機。

我提供一個描述區別和聯繫的資料:http://www.javashuo.com/article/p-hwknyepv-de.html

Spring、SpringBoot、SpringCloud

估計這時候,一些小夥伴開始懵逼了,Spring、SpringBoot、SpringCloud 這三個究竟是啥關係,什麼和什麼呢?

躍哥這裏參考了廖雪峯官網上的簡單描述:

Spring 是 JavaEE 的一個輕量級開發框架,主營 IoC 和 AOP,集成JDBC、ORM、MVC等功能便於開發。

Spring Boot是基於Spring,提供開箱即用的積木式組件,目的是提高開發效率。

那麼Spring Cloud是啥?

Spring Cloud顧名思義是跟雲相關的,雲程序實際上就是指分佈式應用程序,因此Spring Cloud就是爲了讓分佈式應用程序編寫更方便,更容易而提供的一組基礎設施,它的核心是Spring框架,利用Spring Boot的自動配置,力圖實現最簡化的分佈式應用程序開發。

Spring Cloud包含了一大堆技術組件,既有開源社區開發的組件,也有商業公司開發的組件,既有持續更新迭代的組件,也有即將退役再也不維護的組件。

成就感:從基本知識的路上,越走越遠,完成了web 框架的學習,以及應用服務類的學習,那麼恭喜你,這時候已經掌握了一個應用的基本構成。

你已經會很好地構建項目了,也會經過多線程併發實現提高效率的工做;還能經過緩存來完成必定的壓力緩解,甚至是秒殺這類功能;還有消息中間件的使用,也是提高程序響應性能、提升用戶體驗的方式;若是你有機會接觸微服務領域,那就能瞭解限流,分發,負載均衡等等,通常的應用功能確定就難不到你啦。

你能夠嘗試本身去構建一個電商類項目,或者一個 OA 類的項目,去鞏固本身的知識。

書單推薦:講完了這幾個聯繫和區別,我這裏就隆重推出一套寫給Java開發者的經典教程。

圖書源自Manning公司經典「小人書」系列,被稱爲「Spring開發三劍客」,是Java開發者全面掌握Spring框架以及微服務開發的經典書籍。

  • 《Spring實戰 第5版》介紹了Spring 5的核心特性。書很厚,躍哥前段時間剛送了一本給讀者。這裏咱們逐步構建出一個安全的、以數據庫做爲支撐的Web應用。在這個過程當中,你還將會探索反應式編程、微服務、服務發現、RESTful API、部署並掌握專家級的較佳實踐,真的是 666 了。

  • 《Spring boot實戰》以自動配置、起步依賴、命令行界面和Actuator這四個核心特性爲基礎,深刻介紹Spring Boot的用法,能夠構建出知足你生產須要的工程。

  • 《Spring微服務實戰》顧名思義就是教讀者如何使用Java和Spring平臺構建基於微服務的應用程序。在構建和部署第一個Spring Cloud應用程序時,將學習如何進行微服務設計。並且這本書裏還精心挑選了幾個真實案例展現了基於微服務的各類模式,很贊。

  • 《深刻理解Apache Dubbo與實戰》關於 Dubbo,就推薦一本豆瓣評分7.0 的書給你們,這也是目前躍哥項目裏在用的技術,很歡迎和你們一塊兒交流哦。

優化進階類

  • 深刻理解JVM虛擬機
  • Java 併發
  • Java 性能優化
  • 設計模式:建立型(工廠、抽象工廠、生成器、原型、單例),結構型(適配器、橋接、組合、裝飾器、外觀、享元、代理),行爲型(責任鏈、命令、解釋器、迭代器、中介、備忘錄、觀察者、狀態、策略、模板方法、訪問者)
  • 設計原則:SOLID
  • 源碼分析

前面描述的這麼多,都是讓你成爲合格的Java程序員須要成長的地方,學會了那些,此時就能夠獨立完成一個Demo,獨立完成項目組分配給你的開發任務。對的,這僅僅是完成開發任務,不過在咱們程序員裏,有一個和寫做差很少的道理就是:先完成後完善。

一個需求扔給你,通過你的一番分析,你要作的就是寫出來,完成功能。有時候僅僅完成是遠遠不夠的,舉個簡單的例子,咱們學習多線程的時候,都會以銀行存取錢的例子來舉例,確保在多線程的狀況下,銀行系統能穩定。那麼問題來了,多線程換一個角度,融合到你的需求裏,你是否是能很好的掌握運用起來呢?這就涉及到Java併發的掌握。

還有,若是你的項目使用的人多了,突然發現用戶量使用的高峯期,CPU 過載了;或者是一條請求很慢才返回,甚至出現了請求超時;又或者是你的Java運用看起來運行正常,可是GC日誌裏發現一堆GC在裏面,日誌愈來愈大,有一天程序掛了。。。

當出現這些問題的時候,僅僅是完成代碼就不能解決你的困惑了,須要作的就是提高本身進階方面的知識。好比多線程的合理運用,同步問題,CAP問題;若是出現頻繁的讀寫數據庫,甚至是查詢慢的狀況,還得掌握適當的數據庫進階,好比索引的配置,緩存的使用;針對一些代碼上的優化,看看是否是能夠合理的運用設計模式參與,每天CRUD,也能玩出花來。

總結起來就是,做爲一名有追求的工程師,要學會用白盒的視角看待技術,平時在工做中也要多問幾個爲何。正所謂,「知其然知其因此然」。你要努力逐步成爲團隊的核心成員,核心成員意味着能扛事。團隊核心每每要可以 Hold 住不一樣技術領域、切換不一樣角色,好比架構設計、核心代碼開發、緊急線上問題攻關等(這段話引用自極客時間)。

我在極客時間學習了不少Java相關的課程,不少老師都說強調一句話:源碼之下無祕密。因此,當咱們技術能力成長到必定程度的時候,就須要去學習下源碼,非必須,但你想更進一步,這就是要多死磕了。

成就感:都已經到這部分了,以前的那些成就感對你來講都是毛毛雨啦。以前的那些,咱們能很好地完成領導分配的需求任務,不拖項目的後腿。

這部分學完,那就厲害了。會性能優化,表示你能夠解決項目組遇到的難題(前段時間躍哥就幫助一名小夥伴完成雙休日CPU 負載 100%降到50%的過程,本身經歷過了,成就感可能不只僅是翻倍,真的)。

會閱讀源碼,那你能作的事情就更多,能解決的問題也更多,舉個簡單的例子,List個種類不少,有 ArrayList、LinkList、Vector何時使用哪一個,你確定能分析出來。

設計模式就更不用說了,不少人說學了也用不上,一直在 CURD、你要是能靈活使用設計模式,代碼重構不是挺簡單的事情?對吧。

這時候,你能夠挑戰本身,去慢慢地重構本身以前寫的項目,或者是參與項目組更高端的任務中去,讓本身的價值更大的發揮出來。

書單推薦:到了這部分,推薦的書單其實範圍就很少了,估計你們都耳熟能詳。

  • 《Java 併發編程實戰》,是一本完美的 Java 併發參考手冊。這樣解釋簡單明瞭吧,哈哈
  • 《Java 性能權威指南》瞭解如何編寫出併發的程序,你還須要瞭解一下如何優化 Java 的性能,這本書比較合適。經過學習,你能夠比較大程度地提高性能測試的效果。其中包括:使用 JDK 中自帶的工具收集 Java 應用的性能數據,理解 JIT 編譯器的優缺點,調優 JVM 垃圾收集器以減小對程序的影響,學習管理堆內存和 JVM 原生內存的方法,瞭解如何最大程度地優化 Java 線程及同步的性能,等等(這段摘抄耗子叔的《左耳聽風》專欄)。
  • 看完上面那本書,若是還有餘力,那麼繼續深刻,《深刻理解Java虛擬機(第3版) : JVM高級特性與最佳實踐》這本書是周志明老師寫的,已經到第三版了,躍哥學習過第二版,學完就飄了,看懂的話,得翻閱好幾回。
  • 設計模式就不解釋了,學 Java 你必定要學面向對象的設計模式,經典中的經典天然就是《設計模式》。若是你以爲有點兒難度了,那麼能夠看一下《Head First 設計模式》。
  • 若是你想學好 Java,再去啃一啃《Java 編程思想》也無妨。真是一本透着編程思想的書。上面的書讓你從微觀角度瞭解 Java,而這本書則可讓你從一個宏觀角度瞭解 Java。
架構技能

  • 架構基礎:高性能、高可用、可擴展性、低成本、安全、規模
  • 高性能架構模式:數據庫集羣(讀寫分離、分庫分表);高性能 NoSQL、緩存架構;單服務器高性能模式(RPC);高性能負載均衡
  • 高可用架構:CAP 理論、細節;集羣和分期;異地多活保障
  • 可擴展架構:目前主要是微服務架構
  • 針對領域深究(好比音視頻領域、即時通訊領域)
  • 如何作詳細設計

到了架構技能這裏,其實就是逐步的讓本身從成爲被直接餵養功能的一方,變成接收需求並分析,甚至是分配功能的一方。 這時候要對軟件工程的執行結果負責,這包括:按時按質進行軟件的迭代和發佈、敏捷地響應需求變動、防範軟件質量風險、下降迭代維護成本。若是咱們機遇好,那能夠涉及到一個新系統的誕生;也許咱們沒有機遇從0到1設計一個新系統,可是咱們也能夠是將架構從1.0重構到2.0。

初級架構師就是作這類事情的,基於完善的架構設計方法論的指導來進行架構設計,技術專家更多的是基於經驗進行架構設計。這兩類均可以,參與的點不同,可是實現的目標就是如此。

要完成複雜系統的架構設計,包含高性能、高可用、可擴展、海量存儲等複雜系統,例如躍哥等會兒說到的第二個項目,就是和老大從零開始基於Netty從新開發了公司應用的聊天服務器系統,從能用到好用,蛻變成長超級快。

成長爲高級架構師須要 10 年以上時間,其典型特徵是「創造新的架構模式」,例如: 高級架構師與中級架構師相比,典型區別在於「創造性」,高級架構師可以創造新的架構模式,開創新的技術潮流。(這部分躍哥目前還在努力中)

書單推薦:這部分躍哥也還在探索中,若是推薦的很差,你們多多見諒

  • 《從零開始學架構 : 照着作,你也能成爲架構師》這本書是我看的第一本架構書,針對業務系統的架構設計,貼近平常工做,有本身的一套方法論,仍是比較實用的
  • 《企業IT架構轉型之道:阿里巴巴中臺戰略思想與架構實戰 : 阿里巴巴中臺戰略思想與架構實戰》
  • 《軟件架構設計 : 大型網站技術架構與業務架構融合之道》
  • 《架構整潔之道》
其餘補充

  1. 開發工具:IDEA、Eclipse、VS Code
  2. 版本控制工具:Git、SVN
  3. Docker、K8s
  4. 命令行工具:iterm2(MacOS)
  5. 網絡測試工具: PostMan、PostWoman
  6. 網絡抓包工具
  7. 持續集成:Jenkins
  8. Linux:遠程鏈接Linux,Linux的經常使用命令(非必備)

這部分和非技術相關,可是在日後的項目使用中,是確定須要用到的,屬於神兵利器吧。好比一開頭躍哥說的,初學者不要一開始就是用編譯器,可是工做須要,確定是要選擇適合本身的編譯器。在我剛開始學習Android的時候,用的仍是Eclipse,搭建環境簡直了,繁瑣的很,後來Google 推出了 Android Studio,大大減小了環境安裝的繁瑣,讓初學者一上來就能夠快速使用,提高了效率。

Android Studio 就是基於IDEA 搞出來的,而後我才瞭解到 IDEA,如今在個人工做中也是離不開了,IDEA 主要有幾個方面深深地吸引了我,讓個人效率提高很大。不少同窗可能仍是適應Eclipse,這個就看本身的選擇和習慣啦,反正對於寫代碼來講,是差很少的。

編譯器只是一方面,版本控制是團隊協做的利器,除非你的工做是一我的單打獨鬥,否則這塊仍是必需要掌握的。做爲一名後端,躍哥的習慣就是本身先測試完,再提供給前端調試,那須要必定程度上保證本身代碼的健壯性,必要的單元測試,甚至是流程測試都是必須的。

若是你的公司有運維部,去服務器上操做這種事情確定不須要你插手了,這有利有弊吧。其實,在測試環境裏本身能夠本身上手,爲何呢?由於能夠快速的去Linux上抓日誌,查看問題,解決完以後,還能快速更新版本,省去和運維溝通的成本。運維有空的時候還好,若是他很忙,那你剩下的就是等待,這就得不償失了。出包發版本,還能夠利用自動化工具,好比Jenkins,效率槓槓滴,用過都說香。

書單推薦:這裏推薦這些工具實用類,使用好了,開發效率提高好幾個臺階呢。

  • 《Git學習指南》 Git 如今是開發的必備技能,不管你是單兵做戰仍是團隊協做,都須要版本控制來協助,否則就會有最後一版,最最最後一版這種相似於畢業設計的效果出來,哈哈。
  • 《鳥哥的Linux私房菜 基礎學習篇》鳥哥屬於 Linux 的神人,談到 Linux,沒人不知道鳥哥的吧?
  • 《DevOps實踐指南》要提高本身運維和持續集成的能力,就看着吧
  • 《第一本Docker書》
  • 《Kubernetes權威指南 : 從Docker到Kubernetes實踐全接觸(第2版)》Docker 和 K8S 如今是愈來愈普遍了,很好地利用起來,運維的工做也能輕鬆不少

其餘書單推薦:內容裏我沒有涉及到面試個的部分,學好了上面這些,鞏固了知識,面試基本是 OK 的,可是有時候爲了能快速掌握,還得突擊一下,這裏就加點面試相關的吧。

還有軟件編程其餘方面的提高,好比代碼規範,重構等等。

  • 《劍指Offer:名企面試官精講典型編程題(第2版)》躍哥周圍不少小夥伴,就是看了這本書的知識鞏固,成了 offer 收割機
  • 《代碼整潔之道:程序員的職業素養》這本書在我大學的時候老師就不停地開始推薦,工做以後也是一直被推薦,不得不看
  • 《重構 : 改善既有代碼的設計》舊版新版都很 OK,重構是門技術活噢
  • 《阿里巴巴Java開發手冊(第2版)》一出來的時候就風靡了,還順帶出了編譯器的插件,你安裝了嗎?
  • 《碼出高效:Java開發手冊》這本書源於影響了全球250萬名開發工程師的《阿里巴巴Java開發手冊》,做者靜心沉澱,對Java規約的前因後果進行了全面而完全的內容梳理,配合着看妥妥的
軟技能

  • 溝通能力

軟技能這裏,我單獨拎出來講。

主要是平時程序員在不少人心中就是沉悶,不善於溝通,甚至還被調侃成沒有女友。可是,咱們不能被這些影響,甚至須要努力去打破這種怪圈。

躍哥確實也見過一些小夥伴沉默寡言,除了默默地寫代碼,平時不多和別人溝通,除了本身部門的人,其餘部門的小夥伴認識的很少,也不會打成一片,這樣對本身成長仍是會有侷限性。

躍哥是個活潑開朗的人,也算是部門裏和別的部門溝通最頻繁的那我的了,不管是工做仍是閒聊。這麼作的好處是什麼?若是你是大公司,一整套系統下來須要涉及到多個部門,你不瞭解你隔壁部門是作什麼的,就會很被動,甚至不停地讓領導去協調,領導也很忙的;若是是小公司,和其餘部門的人溝通無非就是走幾步的事情,再說了程序員羣體裏女生很少,其餘部門女孩子多,萬一就成了呢(這個躍哥這裏但是見過例子的);甚至你和別的部門打通了,能夠了解他們是作什麼的,他們的優點在哪,他們的困難在哪,有沒有你須要借鑑或者引覺得戒的事,等等。

躍哥經歷了幾家公司,一直都是設備管理員,這個小小的職位,讓我打通了不少邊界,基本上和公司的人都能打成一片,至於有什麼收穫?除了老婆是已經找好了,其餘的不少東西本身仍是能夠去接觸,去學習,去獲取的。好比個人數據庫能力,除了平時寫代碼,就是煩着咱們的DBA,我把他掏空。

適當的前端學習

  • Html、CSS、JavaScript
  • 前端框架:Vue、React

這部分其實沒啥好聊的,咱們這裏主要是Java後段路線的學習,前端就是稍稍帶過一下。

學好前端的好處,就是前面說的,你用工具去測試你的代碼;那麼有了前端,本身寫一個測試的Demo,前端請求下,比你用postman這類工具效率來的高,能夠走一整套流程;躍哥會Android,一開始先後端寫做,都是我本身寫Android Demo完成的,提高了本身的效率不說,也讓App開發省了很多事,不少代碼,我都幫他們搭好框架了。

SpringBoot + Vue 的組合學習起來,平時本身練練手,寫一個網站玩玩,技術人的開心,莫過於此吧。

推薦書單:這部分的書單推薦就有點超綱啦,哈哈。

  • 《JavaScript高級程序設計(第3版)》要學好前端,JavaScript 是必須的
  • 《瘋狂HTML 5+CSS 3+JavaScript講義(第2版)》躍哥學習的就是和本書,學會了基礎才能走的更遠嘛,對吧
  • 《Spring Boot+Vue全棧開發實戰》這本書是王鬆老哥寫的,我向他取了好幾回經,Vue 框架也是如今前端很流行的框架了,做者仍是咱們國人尤雨溪,驕傲吧
  • React.js 也是經典的框架,這裏屬於個人盲區,就不推薦書單了

主導三個項目,讓我獨當一面

這一個模塊是在 1024 程序員節的時候,我有感而發,仔細回憶了我這麼多年經歷的最重要的三個項目,經過項目的方式和你們聊聊我是如何成長起來的!

在極客時間的《設計模式之美》課程裏,做者小爭哥說過一句話:對人一輩子有很大影響的四樣東西:機遇、方向、能力、努力,我以爲它們一塊兒決定了你是否能「成事」。我把個人經歷總結起來,很應景,就是我趕上了機遇,繼而有了能力上的提高,方向上的把控,以及持續努力的行動。

回憶目前爲止我主要經歷了三個項目,仔細歸類的話,這三個居然還都有所不一樣。

我參與的第一個項目(Android 客戶端開發)

第一個項目,是我剛畢業半年以後進到項目組的一個Android App 項目。以前 App 項目的主要業務邏輯是經過 JavaScript 編寫的,Android 端調用 WebView 展示便可,因此不少流程都是依賴於 JavaScript 的同窗去完成。

第一個技術就來了,當時的領導們以爲有必要所有原生化,就讓我遇上了重構的時代,說是重構,其實就是對以前在 JavaScript 上的業務遷移到 Android 原生上。

慶幸的是,原有項目一開始作的就比較好,文檔之類的相對來講也齊全,作主流業務的同事一直在項目組裏,哪怕文檔裏沒有的業務,本身把問題總結起來抽時間麻煩他,也能獲得想要的答案,基於業務文檔的編碼仍是相對輕鬆。

也許老天是註定須要給我一次鍛鍊的機會,在重構伊始,個人師傅當時的 Android 端負責人由於身體緣由休息了一個多月,就讓我這個徒弟去接手了當時複雜的,核心的業務,獲得了一次快速成長的機會。

抓住第一波機會的我,就這樣坑次坑次完成了人生中第一個商業化項目的重構。由於項目很龐大,經歷了幾個月的加班加點,上架的時候狂鬆了一口氣。幾個月的努力終於看到了回報,由於前期準備的材料都很充分,對於業務上的阻礙輕鬆掃除,此次重構對初入職場的我是很大的能力提高。

試想一下,一個只在學校裏自學 Android 的科班生,第一次接手項目,不是反覆的修改Bug,而是參與重大的版本改革,是多麼的幸運;鍛鍊的成長不言而喻,你能相信一開始入行的時候,我連面向對象都只知其一;不知其二嗎?項目的洗禮,可比學校裏參考書籍寫Demo挑戰大多了。

隨之而來的第二個項目(獨立完成聊天服務器系統)

第二個項目,是我去新公司以後的項目,作一個即時通訊的項目。

我來公司以前,有一個即時通訊的在用,是基於 Flash 編寫的,從響應速度和穩定性來講都沒有讓領導和用戶滿意,當時項目組裏沒有 Java 的同事(新招一個畢業生以前也沒怎麼接觸過 Java),領導想內部發掘 Java 的員工。我作了一個方向上的選擇,因此,個人第二次機遇就在這個時候蹦出來。

我到公司的時候是 Android 開發,由於當時項目組有3個 Android,沒有 Java,領導在徵求你們的建議,問有沒有想轉的,我分析了本身的狀況以後,主動要求轉 Java,和老大一塊兒去作這個即時通訊框架。

咱們選擇 Netty 框架來進行,用 WebSocket 通訊,又一次加班加點的拼命時刻。(加班並不可怕,有意義的加班都不會考慮下班這件事,只會考慮能給本身帶來多少收益,多少收穫。)此次沒有文檔,只有代碼,也仍是有幸運的部分,以前框架的負責人一直在項目組裏。

難點就是,我須要看懂 Flash 的代碼,而後一步步遷移過去。這次從零開始,也有一點遺憾,整個框架是老大搭建好的,個人核心任務是在計劃時間以內,徹底遷移即時通訊的功能,儘快把項目跑通,調試上線完成。

完美的人生老是不存在的,因此儘管那麼點遺憾,搭建框架的時候我沒參與,但不妨礙我對 Netty 的理解,爲此我還在掘金上付費購買了 Netty 學習的一個專欄,加深我對 Netty 的理解。

從客戶端轉到後端,給我最大的感觸就是我看項目看的範圍更大了,以前客戶端只是很片面的看到本身所負責的功能,後端能把整個項目都看透,尤爲是業務方面的知識點。

固然,由於初次參與後端,第一次上線,給我當頭一棒,現實着實把我教育了一番。後端編碼和客戶端仍是存在不一樣,由於個人不熟練,在項目上線的第一個晚上,由於扛不住峯值的壓力,把網站給癱瘓了,業務宕機了一個小時,幸好老大幫我解決。

這麼嚴重的線上事故,給我當頭一棒,後端完成代碼只是第一步,線上安全運行纔剛剛開始挑戰。這也是讓我堅決,在作業務的同時,須要持續的精進本身的技術,好比數據庫的頻繁讀寫,緩存的使用,緩存雪崩、擊穿的處理等等。

正在進行中的項目

第三個項目,經歷了第一個版本的迭代開發,以及第二個版本的重構(正在進行中)。從別的團隊手裏接收過來,沒有文檔,純靠本身熟悉。此次的挑戰更大,沒有任何資料,只有App接口,參考接口一個個去熟悉項目,重構項目。

這就是個人1.0項目,我花了兩週的時間寫了35+的接口,從開發到測試,加班加點完成,把我累的。我以前也說了,每天CRUD 也能玩出花來,此次這麼緊急的狀況下,我先完成了第一個版本,從必定程度上沒有拖項目的後腿,並且從寫代碼的時候,記錄了一些須要優化的點,以及須要改善的點。由於是別人手裏接手的,也是一個純外包的項目,和後期的規劃差了不少,就這樣,陰差陽錯,咱們開始搞了第二個版本的迭代,也就是最近在作的 1.0 到 2.0 的升級。

此次升級,把一個先後端結合在一塊兒的臃腫的程序,拆分紅了輕量級的架構;把一些冗餘的數據庫進行了改進,刪除優化了不少表結構信息,作了一些查詢的索引;最最最大的改變就是使用了微服務來完成重構。

這一整個過程,除了業務代碼是現成的,人都是從零開始,又是一次重大的機遇擺在我面前,不抓住那是傻子。不少羣裏的同窗,想參與項目還沒機會呢,我老是時不時地能碰到好的機會,來提高個人能力,或者這就是個人運氣吧。

經歷過此次,我就不怕那種丟給你一堆代碼,甚至需求文檔都沒有的狀況下,如何在保證項目正常運轉的狀況下,更好的作持續重構。在項目重構中熟悉業務,在重構中鞏固Java編程技能,那麼在艱難的外部環境下,至少你是項目組那位不可或缺的人,想裁你的時候,還得考慮考慮呢,是吧。

項目經歷結語

正如我開頭說的,總結我簡短的幾個項目經歷(其實還有幾個瑣碎的項目,這裏就省略了),就是我趕上了機遇。當每次機會來臨的時候,放到你的面前,就看你怎麼抓住了。一開始我是霸王硬上弓,可是到了後面就是不斷地經過本身的學習,本身的努力,把能力提高上來;而後等待下一波機會的到來,或者是根據你的選擇,去創造另外一個機會。

這三次的經歷,從我抓住機遇開始,後面又作了一次選擇,固然加上本身平時的努力(平時多看書、多學習、多實踐仍是必要的)。不過躍哥的性格上目前有點剛,甚至有時候以爲本身作得很好,同事都沒我強,我有天下無敵的感受,致使我矇蔽了雙眼,還在努力嘗試改進中。

能力提高你要怎麼學

還沒開始實踐就有一堆煩惱

Java開發也好,C語言也罷,仍是其餘的語言學習,都是須要實踐的;這個你就把本身當成一名技術工人,泥瓦工也是通過千錘百煉才能造房子;包裝工也是經歷過千萬次的包裝才能作到駕輕就熟;語言組織也是如此,做文就是一字一句積累起來的。

編程是一門技術活,不是靠單純的體力活動能勝任的,因此想提高能力方面這個無他,惟有熟能生巧。寫代碼這個要求過低了,還遠遠不夠,咱們仍是想讓本身更加優秀,那就須要作更多的努力

我常常和羣友說,編程到最後並非寫代碼,寫代碼是最最容易的事情。在寫代碼以前,還有需求分析,技術選型(選數據庫,選中間件等),架構設計,流程設計,算法選擇,這些都完成了,那你把這些轉換成代碼就是水到渠成。

這裏只是給出一個最終的目標,針對初學者,一開始不能好高騖遠,也不能被困難所嚇倒。我上面給了學習路線,你看明白了嗎?因此,你如今內心有數,有沒有被嚇到,若是沒有,那麼請你仔細閱讀《Java核心技術卷1》,把上面的基礎知識都先掌握,出現的代碼都在編譯器上實踐,一行一行編寫,理解他。若是已經被打倒,那後面就沒有什麼事了,好好選擇一個更好的出路便可。

等基礎知識都慢慢地學會,而後再去找一些小Demo,好比說實現一個計算器,就能檢驗你的學習成果。寫代碼是一個按部就班的過程,基礎先學會,逐漸就有成就感,那後面的困難就迎刃而解,不然等到後面學習算法,項目時間,困難重重。


主動學習和被動學習

-- 如下部分參考極客時間《左耳聽風》專欄

人的學習分爲「被動學習」和「主動學習」兩個層次

  • 被動學習:如聽講、閱讀、視聽、演示,學習內容的平均留存率爲 5%、10%、20% 和 30%。
  • 主動學習:如經過討論、實踐、教授給他人,會將原來被動學習的內容留存率從 5% 提高到 50%、75% 和 90%。

這裏能夠理解出來,你聽別人講,或是本身看書,或是讓別人演示給你,這些都不能讓你真正得到學習能力,由於你是在被別人灌輸,在聽別人說,在看別人的成果。

只有你開始本身思考,開始本身總結和概括,開始找人交流討論,開始踐行,並開始對外輸出,你纔會掌握到真正的學習能力。

學習不只僅是爲了知道,而更是爲了思考和理解。在學習的過程當中,咱們不是爲了知道某個事的表面是什麼,而是要經過表象去探索其內在的本質和原理。真正的學習,歷來都不是很輕鬆的,而是那種你知道得越多,你的問題就會越多,你的問題越多,你就會思考得越多,你思考得越多,你就會越以爲本身知道得少,因而你就會想要了解更多。如此循環,是這麼一種螺旋上升上下求索的狀態。

在學習的過程當中,咱們要不斷地問本身,這個技術出現的初衷是什麼?是要解決什麼樣的問題?爲何那個問題要用這種方法解?爲何不能用別的方法解?爲何不能簡單一些?……

這些問題都會驅使你像一個偵探同樣去探索背後的事實和真相,並在不斷的思考中一點一點地理解整個事情的內在本質、邏輯和原理。一旦理解和掌握了這些本質的東西,你就會發現,整個複雜多變的世界在變得愈來愈簡單。你就好像找到了全部問題的最終答案似的,一通百通了。

學習是爲了改變本身的思考方式,改變本身的思惟方式,改變本身與生俱來的那些垃圾和低效的算法。總之,學習讓咱們改變本身,行動和踐行,反思和改善,從而得到成長。

全篇總結

總算和你們分享完了,這裏我簡單的總結一下。

首先,就是都關心的問題,我選擇了Java,那麼我之後能作什麼。其實Java能作的不少,只是在現階段,咱們經過編程語言排行榜也能看到,Java是穩居前三,說明他有龐大的用戶羣體,那麼就表明着網絡上有海量的 Java 學習資料,良好的社區環境,優秀的解決方案,以及超級多的框架學習,你絲絕不用擔憂本身找不到問題的解決方案,找不到學習的路徑,是在找不到,我們還有星球呢。

其次就是如何學習,我列舉的 Java 學習路線也是根據後端的學習路線來,後面通過補充,進階部分也寫了。

第三,就是學習方法,怎麼學。說實話,編碼一直都是取決於我的的學習狀況以及自律能力。不少人在學校裏努力,在校招的時候就能有一個好的offer,有些在學校裏沒能堅持下來,可能畢業以後就放棄這條路了;還有些是一開始以爲很感興趣,後來發現本身不適合,要麼學校裏選擇轉專業,要麼出來以後轉產品,轉實施等也算是改行。那麼,就是兩個結果,用籃球季後賽的術語就是 Win or Go Home

判斷本身是否有毅力學習下來,能夠參考下我在上面的建議,固然,若是小夥伴們有更好的建議,給我留言,讓你們一塊兒交流交流。

千萬不要什麼都沒去實踐,可是一直在擔憂擔憂,擔憂本身不能寫代碼。若是你不開始實踐,怎麼知道本身是否是適合,是否是喜歡,是否是會走這條路呢,對吧。其實我剛讀大一,接觸 C 語言的時候,尤爲是到了指針,鏈表,想過放棄,可是最後我斷了這個念頭,我要是不寫代碼,我大學不是白考了,轉專業?現實點,能轉專業的,都是班裏的女生,死磕學習成績,名額都搶光了。那麼你還能怎麼辦,硬着頭皮繼續吧。

就這樣,一直到畢業,我在實驗室裏看着書,敲着代碼,你們的暑假有兩個月,個人暑假就只給本身一個月,另一個月都在學校裏渡過,就是爲了讓本身能不辜負父母的付出。後來,反正就是不斷的努力,成長,以及必定的機遇抓住就好。


參考內容:

  1. 極客時間左耳聽風、設計模式、Java專題、架構專題等專欄
  2. 廖雪峯 Java 教程:https://www.liaoxuefeng.com/wiki/1252599548343744/1305158055100449
  3. 知乎關於Java的部分資料
相關文章
相關標籤/搜索