1. 程式人生 > >兩萬字長文總結,梳理 Java 入門進階那些事

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

大家好,我是程式設計師小躍,一名在職場已經寫了6年程式的老程式設計師,從一開始的菊廠 Android 開發到現在某遊戲公司的Java後端架構,對Java還是相對了解的挺多。 大概是半年前吧,在知乎上有個知友私信給我,問我關於零基礎如何學習Java,以及在學習過程中會存在一定的迷茫,如何應對等等。 我想著何不把以前的內容重新整合下分享出來給大家呢,於是就有了今天的這次分享。 在過去的一年多時間裡,躍哥通過這份清晰的路線圖,已經幫助 20+同學做好定位,快速認清了自己當前的現狀,並做好相應的應對措施,甚至有同學通過調整,已經拿到了心儀的 offer。 那麼馬上進入主題,該篇內容主要涉及到以下主題,其中第一部分學習路線,在總結完每個路線的時候,躍哥還會有完成路線的成就感是什麼,以及一些實用的書籍推薦噢。 先給大家看下完整的思維導圖,也是這篇文章的主要脈絡。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/Java%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.jpg) - **Java從入門到進階學習路線** - **主導三個專案,讓我獨當一面** - **能力提升你要怎麼學** - **全篇總結** *** Java 現在主要是作為後端應用在發展,尤其是他的微服務領域。根據程式語言排行來看,Java 常年佔據榜單的 Top 3,學習和使用 Java 的夥伴實在是太多了。甚至有大V認為,在微服務領域 Java 目前是王者。 全球有 1200 萬以上 Java 程式設計師以及海量的裝置,還有無所不能的 Java 生態圈。諸如阿里巴巴、京東、百度、騰訊、美團、去哪兒等網際網路公司,基本都是以 Java 為首選程式語言的。即使在最新的雲端計算領域,Java 仍然是 AWS、Google App Engine 等平臺上,使用最多的程式語言。 所以,我們學習 Java 的更進一步目標就是把自己培養成微服務高手,找工作的目標要麼就是去大廠寫 Java,要麼在小廠成為獨當一面的主程。當然目前 Android 開發雖然說使用了Kotlin,使用 Java 的還是大有人在,躍哥就是從Android開發內部轉到Java開發,也算是沒有付出很高的代價。 #### Java從入門到進階學習路線 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131614966.png) ##### 瞭解 Java 語言 - Java 的前世今生 - Java 如何編譯 - Java 環境配置 - Java 編譯器 很多同學很喜歡一上來就想著寫程式碼,恨不得一拿到書本的第一頁就是教你如何如何寫程式碼,其實不是這樣的。 我們瞭解一門語言,一開始還是需要了解Java 的前世今生,Java 是怎麼來的,如何發展,以及如何規劃的。知道 Java 怎麼來,應用在哪,我們才能去挖掘更多屬於 Java 的價值,對不對?所以請問下大家,目前大家在用哪個版本呢?最新的版本是多少?最新的長更新版本又是多少? 所以很多教科書第一部分基本會聊一聊 Java 的歷史,以及如何編譯 Java,而不是一上來就讓大家用編譯器開始玩轉。 躍哥一開始寫 Java 還是敲的命令列,用記事本寫過 Java 程式碼,語法錯誤都是靠編譯一步步調整過來的,雖然很累,但是很受用。 不過我們最終是需要創造生產力的,而且來我們這裡學習的同學肯定都是有功底的,所以其實這個第一部分是我的廢話。比如 Java 如何編譯,環如何安裝,選擇合適的編譯器(目前基本就是 IDEA 和 Eclipse 兩強割據時代) Java 是一門純粹的面向物件的程式語言,所以必須得弄懂它的 OOP 特性:封裝、繼承、多型。 ##### 關於基本知識學習 基礎知識包括(這部分主要參考《Java核心技術卷》): ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131739724.png) ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131806394.png) ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131834142.png) 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 可以嘗試完成一個簡單的聊天系統,寫一個服務端,一個客戶端,就可以進行聊天通訊,那時候你的成就感會很足的噢。 **推薦書單**: ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131945877.png) ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110131955833.png) - 學習過程躍哥是按照《Java 核心技術卷 1》、《Java 核心技術卷 2》來的 - 躍哥剛開始學習的時候,是看了李剛老師的《瘋狂 Java 講義》,在實驗室潛心學習半個多月啃出來的書 - 併發方面,可以看看《Java 併發程式設計實戰》 - Java 新特性,可以查閱《Java 實戰》,躍哥最近也在回憶鞏固,內容很乾 - 演算法的話,入門就推薦下去年很火的程式設計師小灰的《漫畫演算法》,以及最近很火的東哥寫的 《labuladong的演算法小抄》 ##### 關於 Spring 學習(Web 框架) ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132108398.png) ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132126316.png) 下面是掌握 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、Struts2、Hibernate三駕馬車,結果後等自己寫後端的時候,發現時代已經變了,現在更多的是掌握 Spring、Spring MVC、Mybatis,尤其是 Spring 框架。 這部分涉及的點也比較多,但是學習起來,基本都是連貫的。從你新建一個Spring專案開始,就一步步循序漸進,只要你開始寫程式碼,這些知識都會涉及到,不用害怕自己沒接觸,學不會。 這裡的書單推薦在後面,請稍等。 ##### 關於應用服務的學習 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132206044.png) 主要包括但不限於 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就足夠了,不需要用快取等其他的,但是應用大了,就不得不考慮各種情況,那麼這些神器就慢慢的使用上了。 你看,程式設計其實就是這麼神奇,都是循序漸進的過程。 **書單推薦**:這裡提到的很多,已經有很多優秀的書籍,躍哥就簡單推薦幾本,供大家參考。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132226991.png) - 《高效能 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 框架進階 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132249540.png) 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 是組裝機。 我提供一個描述區別和聯絡的資料:https://www.cnblogs.com/aspirant/p/9089146.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開發者的經典教程。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132321073.png) 圖書源自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 的書給大家,這也是目前躍哥專案裡在用的技術,很歡迎和大家一起交流哦。 ##### 優化進階類 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132341269.png) - 深入理解JVM虛擬機器 - Java 併發 - Java 效能優化 - 設計模式:建立型(工廠、抽象工廠、生成器、原型、單例),結構型(介面卡、橋接、組合、裝飾器、外觀、享元、代理),行為型(責任鏈、命令、直譯器、迭代器、中介、備忘錄、觀察者、狀態、策略、模板方法、訪問者) - 設計原則:SOLID - 原始碼分析 前面描述的這麼多,都是讓你成為合格的Java程式設計師需要成長的地方,學會了那些,此時就可以獨立完成一個Demo,獨立完成專案組分配給你的開發任務。對的,這僅僅是完成開發任務,不過在我們程式設計師裡,有一個和寫作差不多的道理就是:先完成後完善。 一個需求扔給你,經過你的一番分析,你要做的就是寫出來,完成功能。有時候僅僅完成是遠遠不夠的,舉個簡單的例子,我們學習多執行緒的時候,都會以銀行存取錢的例子來舉例,確保在多執行緒的情況下,銀行系統能穩定。那麼問題來了,多執行緒換一個角度,融合到你的需求裡,你是不是能很好的掌握運用起來呢?這就涉及到Java併發的掌握。 還有,如果你的專案使用的人多了,忽然發現使用者量使用的高峰期,CPU 過載了;或者是一條請求很慢才返回,甚至出現了請求超時;又或者是你的Java運用看起來執行正常,但是GC日誌裡發現一堆GC在裡面,日誌越來越大,有一天程式掛了。。。 當出現這些問題的時候,僅僅是完成程式碼就不能解決你的困惑了,需要做的就是提升自己進階方面的知識。比如多執行緒的合理運用,同步問題,CAP問題;如果出現頻繁的讀寫資料庫,甚至是查詢慢的情況,還得掌握適當的資料庫進階,比如索引的配置,快取的使用;針對一些程式碼上的優化,看看是不是可以合理的運用設計模式參與,天天CRUD,也能玩出花來。 總結起來就是,作為一名有追求的工程師,要學會用白盒的視角看待技術,平時在工作中也要多問幾個為什麼。正所謂,“知其然知其所以然”。你要努力逐步成為團隊的核心成員,核心成員意味著能扛事。團隊核心往往要能夠 Hold 住不同技術領域、切換不同角色,比如架構設計、核心程式碼開發、緊急線上問題攻關等(**這段話引用自極客時間**)。 我在極客時間學習了很多Java相關的課程,很多老師都說強調一句話:**原始碼之下無祕密**。所以,當我們技術能力成長到一定程度的時候,就需要去學習下原始碼,非必須,但你想更進一步,這就是要多死磕了。 **成就感**:都已經到這部分了,之前的那些成就感對你來說都是毛毛雨啦。之前的那些,我們能很好地完成領導分配的需求任務,不拖專案的後腿。 這部分學完,那就厲害了。會效能優化,表示你可以解決專案組遇到的難題(前段時間躍哥就幫助一名小夥伴完成雙休日CPU 負載 100%降到50%的過程,自己經歷過了,成就感可能不僅僅是翻倍,真的)。 會閱讀原始碼,那你能做的事情就更多,能解決的問題也更多,舉個簡單的例子,List個種類很多,有 ArrayList、LinkList、Vector什麼時候使用哪個,你肯定能分析出來。 設計模式就更不用說了,很多人說學了也用不上,一直在 CURD、你要是能靈活使用設計模式,程式碼重構不是挺簡單的事情?對吧。 這時候,你可以挑戰自己,去慢慢地重構自己之前寫的專案,或者是參與專案組更高階的任務中去,讓自己的價值更大的發揮出來。 **書單推薦**:到了這部分,推薦的書單其實範圍就不多了,估計大家都耳熟能詳。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132400449.png) - 《Java 併發程式設計實戰》,是一本完美的 Java 併發參考手冊。這樣解釋簡單明瞭吧,哈哈 - 《Java 效能權威指南》瞭解如何編寫出併發的程式,你還需要了解一下如何優化 Java 的效能,這本書比較合適。通過學習,你可以比較大程度地提升效能測試的效果。其中包括:使用 JDK 中自帶的工具收集 Java 應用的效能資料,理解 JIT 編譯器的優缺點,調優 JVM 垃圾收集器以減少對程式的影響,學習管理堆記憶體和 JVM 原生記憶體的方法,瞭解如何最大程度地優化 Java 執行緒及同步的效能,等等(這段摘抄耗子叔的《左耳聽風》專欄)。 - 看完上面那本書,如果還有餘力,那麼繼續深入,《深入理解Java虛擬機器(第3版) : JVM高階特性與最佳實踐》這本書是周志明老師寫的,已經到第三版了,躍哥學習過第二版,學完就飄了,看懂的話,得翻閱好幾次。 - 設計模式就不解釋了,學 Java 你一定要學面向物件的設計模式,經典中的經典自然就是《設計模式》。如果你覺得有點兒難度了,那麼可以看一下《Head First 設計模式》。 - 如果你想學好 Java,再去啃一啃《Java 程式設計思想》也無妨。真是一本透著程式設計思想的書。上面的書讓你從微觀角度瞭解 Java,而這本書則可以讓你從一個巨集觀角度瞭解 Java。 ##### 架構技能 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132419459.png) - 架構基礎:高效能、高可用、可擴充套件性、低成本、安全、規模 - 高效能架構模式:資料庫叢集(讀寫分離、分庫分表);高效能 NoSQL、快取架構;單伺服器高效能模式(RPC);高效能負載均衡 - 高可用架構:CAP 理論、細節;叢集和分期;異地多活保障 - 可擴充套件架構:目前主要是微服務架構 - 針對領域深究(比如音視訊領域、即時通訊領域) - 如何做詳細設計 到了架構技能這裡,其實就是逐步的讓自己從成為被直接餵養功能的一方,變成接收需求並分析,甚至是分配功能的一方。 這時候要對軟體工程的執行結果負責,這包括:按時按質進行軟體的迭代和釋出、敏捷地響應需求變更、防範軟體質量風險、降低迭代維護成本。如果我們機遇好,那可以涉及到一個新系統的誕生;也許我們沒有機遇從0到1設計一個新系統,但是我們也可以是將架構從1.0重構到2.0。 初級架構師就是做這類事情的,基於完善的架構設計方法論的指導來進行架構設計,技術專家更多的是基於經驗進行架構設計。這兩類都可以,參與的點不一樣,但是實現的目標就是如此。 要完成複雜系統的架構設計,包含高效能、高可用、可擴充套件、海量儲存等複雜系統,例如躍哥等會兒說到的第二個專案,就是和老大從零開始基於Netty重新開發了公司應用的聊天伺服器系統,從能用到好用,蛻變成長超級快。 成長為高階架構師需要 10 年以上時間,其典型特徵是“創造新的架構模式”,例如: 高階架構師與中級架構師相比,典型區別在於“創造性”,高階架構師能夠創造新的架構模式,開創新的技術潮流。(這部分躍哥目前還在努力中) **書單推薦**:這部分躍哥也還在探索中,如果推薦的不好,大家多多見諒 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132439449.png) - 《從零開始學架構 : 照著做,你也能成為架構師》這本書是我看的第一本架構書,針對業務系統的架構設計,貼近日常工作,有自己的一套方法論,還是比較實用的 - 《企業IT架構轉型之道:阿里巴巴中臺戰略思想與架構實戰 : 阿里巴巴中臺戰略思想與架構實戰》 - 《軟體架構設計 : 大型網站技術架構與業務架構融合之道》 - 《架構整潔之道》 ##### 其他補充 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132529697.png) 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,效率槓槓滴,用過都說香。 **書單推薦**:這裡推薦這些工具實用類,使用好了,開發效率提升好幾個臺階呢。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132550861.png) - 《Git學習指南》 Git 現在是開發的必備技能,無論你是單兵作戰還是團隊協作,都需要版本控制來協助,不然就會有最後一版,最最最後一版這種類似於畢業設計的效果出來,哈哈。 - 《鳥哥的Linux私房菜 基礎學習篇》鳥哥屬於 Linux 的神人,談到 Linux,沒人不知道鳥哥的吧? - 《DevOps實踐指南》要提升自己運維和持續整合的能力,就看著吧 - 《第一本Docker書》 - 《Kubernetes權威指南 : 從Docker到Kubernetes實踐全接觸(第2版)》Docker 和 K8S 現在是越來越廣泛了,很好地利用起來,運維的工作也能輕鬆很多 **其他書單推薦**:內容裡我沒有涉及到面試個的部分,學好了上面這些,鞏固了知識,面試基本是 OK 的,但是有時候為了能快速掌握,還得突擊一下,這裡就加點面試相關的吧。 還有軟體程式設計其他方面的提升,比如程式碼規範,重構等等。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132603950.png) - 《劍指Offer:名企面試官精講典型程式設計題(第2版)》躍哥周圍很多小夥伴,就是看了這本書的知識鞏固,成了 offer 收割機 - 《程式碼整潔之道:程式設計師的職業素養》這本書在我大學的時候老師就不停地開始推薦,工作之後也是一直被推薦,不得不看 - 《重構 : 改善既有程式碼的設計》舊版新版都很 OK,重構是門技術活噢 - 《阿里巴巴Java開發手冊(第2版)》一出來的時候就風靡了,還順帶出了編譯器的外掛,你安裝了嗎? - 《碼出高效:Java開發手冊》這本書源於影響了全球250萬名開發工程師的《阿里巴巴Java開發手冊》,作者靜心沉澱,對Java規約的來龍去脈進行了全面而徹底的內容梳理,配合著看妥妥的 ##### 軟技能 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132632924.png) - 溝通能力 軟技能這裡,我單獨拎出來說。 主要是平時程式設計師在很多人心中就是沉悶,不善於溝通,甚至還被調侃成沒有女朋友。但是,我們不能被這些影響,甚至需要努力去打破這種怪圈。 躍哥確實也見過一些小夥伴沉默寡言,除了默默地寫程式碼,平時很少和別人溝通,除了自己部門的人,其他部門的小夥伴認識的不多,也不會打成一片,這樣對自己成長還是會有侷限性。 躍哥是個活潑開朗的人,也算是部門裡和別的部門溝通最頻繁的那個人了,無論是工作還是閒聊。這麼做的好處是什麼?如果你是大公司,一整套系統下來需要涉及到多個部門,你不瞭解你隔壁部門是做什麼的,就會很被動,甚至不停地讓領導去協調,領導也很忙的;如果是小公司,和其他部門的人溝通無非就是走幾步的事情,再說了程式設計師群體裡女生不多,其他部門女孩子多,萬一就成了呢(這個躍哥這裡可是見過例子的);甚至你和別的部門打通了,可以瞭解他們是做什麼的,他們的優勢在哪,他們的困難在哪,有沒有你需要借鑑或者引以為戒的事,等等。 躍哥經歷了幾家公司,一直都是裝置管理員,這個小小的職位,讓我打通了很多邊界,基本上和公司的人都能打成一片,至於有什麼收穫?除了老婆是已經找好了,其他的很多東西自己還是可以去接觸,去學習,去獲取的。比如我的資料庫能力,除了平時寫程式碼,就是煩著我們的DBA,我把他掏空。 ##### 適當的前端學習 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132642605.png) - Html、CSS、JavaScript - 前端框架:Vue、React 這部分其實沒啥好聊的,我們這裡主要是Java後段路線的學習,前端就是稍稍帶過一下。 學好前端的好處,就是前面說的,你用工具去測試你的程式碼;那麼有了前端,自己寫一個測試的Demo,前端請求下,比你用postman這類工具效率來的高,可以走一整套流程;躍哥會Android,一開始前後端寫作,都是我自己寫Android Demo完成的,提升了自己的效率不說,也讓App開發省了不少事,很多程式碼,我都幫他們搭好框架了。 SpringBoot + Vue 的組合學習起來,平時自己練練手,寫一個網站玩玩,技術人的開心,莫過於此吧。 **推薦書單**:這部分的書單推薦就有點超綱啦,哈哈。 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132658080.png) - 《JavaScript高階程式設計(第3版)》要學好前端,JavaScript 是必須的 - 《瘋狂HTML 5+CSS 3+JavaScript講義(第2版)》躍哥學習的就是和本書,學會了基礎才能走的更遠嘛,對吧 - 《Spring Boot+Vue全棧開發實戰》這本書是王鬆老哥寫的,我向他取了好幾次經,Vue 框架也是現在前端很流行的框架了,作者還是我們國人尤雨溪,驕傲吧 - React.js 也是經典的框架,這裡屬於我的盲區,就不推薦書單了 *** #### 主導三個專案,讓我獨當一面 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132711224.png) 這一個模組是在 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程式設計技能,那麼在艱難的外部環境下,至少你是專案組那位不可或缺的人,想裁你的時候,還得考慮考慮呢,是吧。 ##### 專案經歷結語 正如我開頭說的,總結我簡短的幾個專案經歷(其實還有幾個瑣碎的專案,這裡就省略了),就是我遇上了機遇。當每次機會來臨的時候,放到你的面前,就看你怎麼抓住了。一開始我是霸王硬上弓,但是到了後面就是不斷地通過自己的學習,自己的努力,把能力提升上來;然後等待下一波機會的到來,或者是根據你的選擇,去創造另一個機會。 這三次的經歷,從我抓住機遇開始,後面又做了一次選擇,當然加上自己平時的努力(平時多看書、多學習、多實踐還是必要的)。不過躍哥的性格上目前有點剛,甚至有時候覺得自己做得很好,同事都沒我強,我有天下無敵的感覺,導致我矇蔽了雙眼,還在努力嘗試改進中。 #### 能力提升你要怎麼學 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110132826877.png) ##### 還沒開始實踐就有一堆煩惱 Java開發也好,C語言也罷,還是其他的語言學習,都是需要實踐的;這個你就把自己當成一名技術工人,泥瓦工也是經過千錘百煉才能造房子;包裝工也是經歷過千萬次的包裝才能做到得心應手;語言組織也是如此,作文就是一字一句積累起來的。 程式設計是一門技術活,不是靠單純的體力活動能勝任的,所以想提升能力方面這個無他,唯有熟能生巧。寫程式碼這個要求太低了,還遠遠不夠,我們還是想讓自己更加優秀,那就需要做更多的努力 我經常和群友說,程式設計到最後並不是寫程式碼,寫程式碼是最最容易的事情。在寫程式碼之前,還有需求分析,技術選型(選資料庫,選中介軟體等),架構設計,流程設計,演算法選擇,這些都完成了,那你把這些轉換成程式碼就是水到渠成。 這裡只是給出一個最終的目標,針對初學者,一開始不能好高騖遠,也不能被困難所嚇倒。我上面給了學習路線,你看明白了嗎?所以,你現在心裡有數,有沒有被嚇到,如果沒有,那麼請你仔細閱讀《Java核心技術卷1》,把上面的基礎知識都先掌握,出現的程式碼都在編譯器上實踐,一行一行編寫,理解他。如果已經被打倒,那後面就沒有什麼事了,好好選擇一個更好的出路即可。 等基礎知識都慢慢地學會,然後再去找一些小Demo,比如說實現一個計算器,就能檢驗你的學習成果。寫程式碼是一個循序漸進的過程,基礎先學會,逐漸就有成就感,那後面的困難就迎刃而解,否則等到後面學習演算法,專案時間,困難重重。 *** ##### 主動學習和被動學習 ![](https://xiaojiuwodimple.oss-cn-hangzhou.aliyuncs.com/2021/01/image-20210110133025735.png) -- 以下部分參考極客時間《左耳聽風》專欄 人的學習分為「被動學習」和「主動學習」兩個層次 - 被動學習:如聽講、閱讀、視聽、演示,學習內容的平均留存率為 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的部分資料