<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          重磅!兩萬字長文總結,梳理 Java 入門進階哪些事(推薦收藏)

          共 16993字,需瀏覽 34分鐘

           ·

          2021-01-13 20:09

          這是程序員小躍的第?162?篇原創(chuàng)分享

          作者 l 程序員小躍
          來源 l 程序員小躍(ID:runningdimple)


          大家好,我是程序員小躍,一名在職場已經(jīng)寫了6年程序的老程序員,從一開始的菊廠 Android 開發(fā)到現(xiàn)在某游戲公司的Java后端架構,對Java還是相對了解的挺多。

          大概是半年前吧,在知乎上有個知友私信給我,問我關于零基礎如何學習Java,以及在學習過程中會存在一定的迷茫,如何應對等等。

          我想著何不把以前的內(nèi)容重新整合下分享出來給大家呢,于是就有了今天的這次分享。

          再過去的一年多時間里,躍哥通過這份清晰的路線圖,已經(jīng)幫助 20+同學做好定位,快速認清了自己當前的現(xiàn)狀,并做好相應的應對措施,甚至有同學通過調(diào)整,已經(jīng)拿到了心儀的 offer。

          那么馬上進入主題,該篇內(nèi)容主要涉及到以下主題,其中第一部分學習路線,在總結完每個路線的時候,躍哥還會有完成路線的成就感是什么,以及一些實用的書籍推薦噢。(每個模塊都有思維導圖總結以及 PPT,如需獲取完整版導圖,后臺回復「學習路線」即可

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

          Java 現(xiàn)在主要是作為后端應用在發(fā)展,尤其是他的微服務領域。根據(jù)編程語言排行來看,Java 常年占據(jù)榜單的 Top 3,學習和使用 Java 的伙伴實在是太多了。甚至有大V認為,在微服務領域 Java 目前是王者。

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

          所以,我們學習 Java 的更進一步目標就是把自己培養(yǎng)成微服務高手,找工作的目標要么就是去大廠寫 Java,要么在小廠成為獨當一面的主程。當然目前 Android 開發(fā)雖然說使用了Kotlin,使用 Java 的還是大有人在,躍哥就是從Android開發(fā)內(nèi)部轉到Java開發(fā),也算是沒有付出很高的代價。


          Java從入門到進階學習路線


          了解 Java 語言



          • Java 的前世今生
          • Java 如何編譯
          • Java 環(huán)境配置
          • Java 編譯器

          很多同學很喜歡一上來就想著寫代碼,恨不得一拿到書本的第一頁就是教你如何如何寫代碼,其實不是這樣的。

          我們了解一門語言,一開始還是需要了解Java 的前世今生,Java 是怎么來的,如何發(fā)展,以及如何規(guī)劃的。知道 Java 怎么來,應用在哪,我們才能去挖掘更多屬于 Java 的價值,對不對?所以請問下大家,目前大家在用哪個版本呢?最新的版本是多少?最新的長更新版本又是多少?

          所以很多教科書第一部分基本會聊一聊 Java 的歷史,以及如何編譯 Java,而不是一上來就讓大家用編譯器開始玩轉。

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

          不過我們最終是需要創(chuàng)造生產(chǎn)力的,而且來我們這里學習的同學肯定都是有功底的,所以其實這個第一部分是我的廢話。比如 Java 如何編譯,環(huán)如何安裝,選擇合適的編譯器(目前基本就是 IDEA 和 Eclipse 兩強割據(jù)時代)

          Java 是一門純粹的面向對象的編程語言,所以必須得弄懂它的 OOP 特性:封裝、繼承、多態(tài)。


          關于基本知識學習


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




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

          學習基本知識,就是讓你對Java語言有一個初步的了解。話又說回來,基礎知識是學習一門編程語言的必備條件,而且大部分語言的基礎知識都是大同小異,包含基本的數(shù)據(jù)類型、程序結構等等。如果是Java這類面向對象的,那么還得掌握面向對象的知識,面向對象是重中之重,面向對象是重中之重,面向對象是重中之重,重要的事情說三遍。只有掌握面向對象的知識,在后續(xù)的開發(fā)中才會有更好的成長。

          這部分我加了算法和數(shù)據(jù)結構,其實我也在猶豫到底要把他分在哪個模塊里,因為學校里學的時候,會教你基本的算法;但是工作,面試的時候,考的算法會綜合起來,并不是生掰硬套就可以的。

          現(xiàn)在校招算法是必備的模塊了,所以我還是歸結在基本知識里。比如我以前面試候選人的時候,冒泡這種是常常出現(xiàn)的。

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

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

          推薦書單



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


          關于 Spring 學習(Web 框架)




          下面是掌握 Spring 相關,需要掌握的知識(可能不止,也可能有遺漏,后續(xù)可以再補充)

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

          有了第一部分的基本知識,那我們第二步就是直奔主題。在領域里,Spring就是需要學習的利器。我大學是學習客戶端的,所以那時候對后端的認知就是 Spring、Struts2、Hibernate三駕馬車,結果后等自己寫后端的時候,發(fā)現(xiàn)時代已經(jīng)變了,現(xiàn)在更多的是掌握 Spring、Spring MVC、Mybatis,尤其是 Spring 框架。

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

          這里的書單推薦在后面,請稍等。


          關于應用服務的學習



          主要包括但不限于

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

          應用服務這一塊,涵蓋了很多領域,包括持久化、緩存、隊列、反向代理等,這些是完善一個程序的重中之重。前面的那幾個知識屬于基礎框架,那么中間件就是給框架里填充一些增強的部分,讓程序健壯穩(wěn)定。想必大家平時練手之類的遇到頻率很高的項目就是電商類的項目,比如電商類中的秒殺就用了redis緩存知識。

          這部分內(nèi)容我覺得很有意思,一個功能完成了,僅僅是第一步,要完善他還需要多種配合。比如我們的數(shù)據(jù)存儲,用到了SQL相關的知識,那就去掌握起來,現(xiàn)在互聯(lián)網(wǎng)上基本都用MySQL再使用;然后你需要支持秒殺這類,就得用到Redis相關;庫存更新是門技術活,你可能需要用到消息隊列;歷史訂單查詢,可以選擇用mongodb,Elasticsearch;訪問壓力太大,你可能需要流量分發(fā),甚至是熔斷,那就需要Nginx的使用。

          你看,這些應用就這樣無形之中被應用起來,來提升應用的健壯性。我剛提到的這些,如果僅僅是小的項目使用或者是自己練手,存儲上SQL就足夠了,不需要用緩存等其他的,但是應用大了,就不得不考慮各種情況,那么這些神器就慢慢的使用上了。

          你看,編程其實就是這么神奇,都是循序漸進的過程。

          書單推薦:這里提到的很多,已經(jīng)有很多優(yōu)秀的書籍,躍哥就簡單推薦幾本,供大家參考。


          • 《高性能 MySQL》(豆瓣評分 9.3,0.4K+人評價):mysql 領域的經(jīng)典之作,擁有廣泛的影響力。不但適合數(shù)據(jù)庫管理員(dba)閱讀,也適合開發(fā)人員參考學習。不管是數(shù)據(jù)庫新手還是專家,相信都能從本書有所收獲。
          • 《Redis 實戰(zhàn)》:如果你想了解 Redis 的一些概念性知識的話,這本書真的非常不錯。
          • 《Redis 設計與實現(xiàn)》(豆瓣評分 8.5):躍哥學習 Redis 的時候,除了看官網(wǎng),捧在手里的就是這本書啦。
          • 《RabbitMQ實戰(zhàn) : 高效部署分布式消息隊列》也是 《RabbitMQ in Action : Distributed Messaging for Everyone》的中文版。最近在學習的時候,也看到老師推薦書單,有位老師就說,《xx in Action》這種書籍是經(jīng)典書籍,很適合大家看,哈哈,這個不假,后面我還要推薦幾本 xx in Action。
          • 《Kafka權威指南》
          • 《深入理解Nginx(第2版) : 模塊開發(fā)與架構解析》

          Web 框架進階




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

          到這里,很多同學應該都了解了 SSM 框架,然后你會覺得框架也不過這么回事,這里躍哥簡單描述下一個輕量級 Web 框架主要具備以下功能:

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

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

          SpringBoot 彌補了Spring 配置上的缺點,再也不用為繁雜的 xml 耗費更多的精力,一接觸SpringBoot的時候,仿佛打開了我的世界,顛覆了我之前的認知。如果你的項目剛開始,還在積累用戶的階段,那么SpringBoot 是一個好的選擇,包括自己練手學習的項目,從SpringBoot 著手再合適不過了。

          SpringCloud 是一個微服務架構,能夠將項目按照業(yè)務分成一個個微服務,每個微服務都可獨立部署,服務之間互相協(xié)調(diào)。當一個項目越來越大時,隨之而來的是越來越難以維護,此時將項目拆分成若干個微服務、單獨維護、單獨部署,也可以降低項目不同業(yè)務間的耦合度。

          這里還得提一個阿里的Dubbo,開源分布式服務框架,并被廣泛應用于中國各互聯(lián)網(wǎng)公司;只需要通過 Spring 配置的方式即可完成服務化,對于應用無入侵,設計的目的還是服務于自身的業(yè)務為主。Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調(diào)用,智能容錯和負載均衡,以及服務自動注冊和發(fā)現(xiàn)。

          雖然中間Dubbo一度停止更新,但是阿里在2017年重新開始維護,他和Spring Cloud 都是實現(xiàn)微服務有效的工具。不過兩者也有側重點,這個大家可以搜索下,用一部分小伙伴通過臺式電腦的比喻來說就是:Dubbo 是品牌機,Spring Cloud 是組裝機。

          我提供一個描述區(qū)別和聯(lián)系的資料:https://www.cnblogs.com/aspirant/p/9089146.html

          Spring、SpringBoot、SpringCloud

          估計這時候,一些小伙伴開始懵逼了,Spring、SpringBoot、SpringCloud 這三個到底是啥關系,什么和什么呢?

          躍哥這里參考了廖雪峰官網(wǎng)上的簡單描述:

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

          Spring Boot是基于Spring,提供開箱即用的積木式組件,目的是提升開發(fā)效率。

          那么Spring Cloud是啥?

          Spring Cloud顧名思義是跟云相關的,云程序實際上就是指分布式應用程序,所以Spring Cloud就是為了讓分布式應用程序編寫更方便,更容易而提供的一組基礎設施,它的核心是Spring框架,利用Spring Boot的自動配置,力圖實現(xiàn)最簡化的分布式應用程序開發(fā)。

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

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

          你已經(jīng)會很好地構建項目了,也會通過多線程并發(fā)實現(xiàn)提升效率的工作;還能通過緩存來完成一定的壓力緩解,甚至是秒殺這類功能;還有消息中間件的使用,也是提升程序響應性能、提高用戶體驗的方式;如果你有機會接觸微服務領域,那就能了解限流,分發(fā),負載均衡等等,一般的應用功能肯定就難不到你啦。

          你可以嘗試自己去構建一個電商類項目,或者一個 OA 類的項目,去鞏固自己的知識。

          書單推薦:講完了這幾個聯(lián)系和區(qū)別,我這里就隆重推出一套寫給Java開發(fā)者的經(jīng)典教程。


          圖書源自Manning公司經(jīng)典“小人書”系列,被稱為“Spring開發(fā)三劍客”,是Java開發(fā)者全面掌握Spring框架以及微服務開發(fā)的經(jīng)典書籍。

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

          • 《Spring boot實戰(zhàn)》以自動配置、起步依賴、命令行界面和Actuator這四個核心特性為基礎,深入介紹Spring Boot的用法,可以構建出滿足你生產(chǎn)需要的工程。

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

          • 《深入理解Apache Dubbo與實戰(zhàn)》關于 Dubbo,就推薦一本豆瓣評分7.0 的書給大家,這也是目前躍哥項目里在用的技術,很歡迎和大家一起交流哦。


          優(yōu)化進階類




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

          前面描述的這么多,都是讓你成為合格的Java程序員需要成長的地方,學會了那些,此時就可以獨立完成一個Demo,獨立完成項目組分配給你的開發(fā)任務。對的,這僅僅是完成開發(fā)任務,不過在我們程序員里,有一個和寫作差不多的道理就是:先完成后完善。

          一個需求扔給你,經(jīng)過你的一番分析,你要做的就是寫出來,完成功能。有時候僅僅完成是遠遠不夠的,舉個簡單的例子,我們學習多線程的時候,都會以銀行存取錢的例子來舉例,確保在多線程的情況下,銀行系統(tǒng)能穩(wěn)定。那么問題來了,多線程換一個角度,融合到你的需求里,你是不是能很好的掌握運用起來呢?這就涉及到Java并發(fā)的掌握。

          還有,如果你的項目使用的人多了,忽然發(fā)現(xiàn)用戶量使用的高峰期,CPU 過載了;或者是一條請求很慢才返回,甚至出現(xiàn)了請求超時;又或者是你的Java運用看起來運行正常,但是GC日志里發(fā)現(xiàn)一堆GC在里面,日志越來越大,有一天程序掛了。。。

          當出現(xiàn)這些問題的時候,僅僅是完成代碼就不能解決你的困惑了,需要做的就是提升自己進階方面的知識。比如多線程的合理運用,同步問題,CAP問題;如果出現(xiàn)頻繁的讀寫數(shù)據(jù)庫,甚至是查詢慢的情況,還得掌握適當?shù)臄?shù)據(jù)庫進階,比如索引的配置,緩存的使用;針對一些代碼上的優(yōu)化,看看是不是可以合理的運用設計模式參與,天天CRUD,也能玩出花來。

          總結起來就是,作為一名有追求的工程師,要學會用白盒的視角看待技術,平時在工作中也要多問幾個為什么。正所謂,“知其然知其所以然”。你要努力逐步成為團隊的核心成員,核心成員意味著能扛事。團隊核心往往要能夠 Hold 住不同技術領域、切換不同角色,比如架構設計、核心代碼開發(fā)、緊急線上問題攻關等(這段話引用自極客時間)。

          我在極客時間學習了很多Java相關的課程,很多老師都說強調(diào)一句話:源碼之下無秘密。所以,當我們技術能力成長到一定程度的時候,就需要去學習下源碼,非必須,但你想更進一步,這就是要多死磕了。

          成就感:都已經(jīng)到這部分了,之前的那些成就感對你來說都是毛毛雨啦。之前的那些,我們能很好地完成領導分配的需求任務,不拖項目的后腿。

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

          會閱讀源碼,那你能做的事情就更多,能解決的問題也更多,舉個簡單的例子,List個種類很多,有 ArrayList、LinkList、Vector什么時候使用哪個,你肯定能分析出來。

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

          這時候,你可以挑戰(zhàn)自己,去慢慢地重構自己之前寫的項目,或者是參與項目組更高端的任務中去,讓自己的價值更大的發(fā)揮出來。

          書單推薦:到了這部分,推薦的書單其實范圍就不多了,估計大家都耳熟能詳。


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

          架構技能



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

          到了架構技能這里,其實就是逐步的讓自己從成為被直接喂養(yǎng)功能的一方,變成接收需求并分析,甚至是分配功能的一方。這時候要對軟件工程的執(zhí)行結果負責,這包括:按時按質(zhì)進行軟件的迭代和發(fā)布、敏捷地響應需求變更、防范軟件質(zhì)量風險、降低迭代維護成本。如果我們機遇好,那可以涉及到一個新系統(tǒng)的誕生;也許我們沒有機遇從0到1設計一個新系統(tǒng),但是我們也可以是將架構從1.0重構到2.0。

          初級架構師就是做這類事情的,基于完善的架構設計方法論的指導來進行架構設計,技術專家更多的是基于經(jīng)驗進行架構設計。這兩類都可以,參與的點不一樣,但是實現(xiàn)的目標就是如此。

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

          成長為高級架構師需要 10 年以上時間,其典型特征是“創(chuàng)造新的架構模式”,例如:高級架構師與中級架構師相比,典型區(qū)別在于“創(chuàng)造性”,高級架構師能夠創(chuàng)造新的架構模式,開創(chuàng)新的技術潮流。(這部分躍哥目前還在努力中)

          書單推薦:這部分躍哥也還在探索中,如果推薦的不好,大家多多見諒


          • 《從零開始學架構 : 照著做,你也能成為架構師》這本書是我看的第一本架構書,針對業(yè)務系統(tǒng)的架構設計,貼近日常工作,有自己的一套方法論,還是比較實用的
          • 《企業(yè)IT架構轉型之道:阿里巴巴中臺戰(zhàn)略思想與架構實戰(zhàn) : 阿里巴巴中臺戰(zhàn)略思想與架構實戰(zhàn)》
          • 《軟件架構設計 : 大型網(wǎng)站技術架構與業(yè)務架構融合之道》
          • 《架構整潔之道》

          其他補充




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

          這部分和非技術相關,但是在往后的項目使用中,是肯定需要用到的,屬于神兵利器吧。比如一開頭躍哥說的,初學者不要一開始就是用編譯器,但是工作需要,肯定是要選擇適合自己的編譯器。在我剛開始學習Android的時候,用的還是Eclipse,搭建環(huán)境簡直了,繁瑣的很,后來Google 推出了 Android Studio,大大減少了環(huán)境安裝的繁瑣,讓初學者一上來就可以快速使用,提升了效率。

          Android Studio 就是基于IDEA 搞出來的,然后我才了解到 IDEA,現(xiàn)在在我的工作中也是離不開了,IDEA 主要有幾個方面深深地吸引了我,讓我的效率提升很大。很多同學可能還是適應Eclipse,這個就看自己的選擇和習慣啦,反正對于寫代碼來說,是差不多的。

          編譯器只是一方面,版本控制是團隊協(xié)作的利器,除非你的工作是一個人單打獨斗,不然這塊還是必須要掌握的。作為一名后端,躍哥的習慣就是自己先測試完,再提供給前端調(diào)試,那需要一定程度上保證自己代碼的健壯性,必要的單元測試,甚至是流程測試都是必須的。

          如果你的公司有運維部,去服務器上操作這種事情肯定不需要你插手了,這有利有弊吧。其實,在測試環(huán)境里自己可以自己上手,為什么呢?因為可以快速的去Linux上抓日志,查看問題,解決完之后,還能快速更新版本,省去和運維溝通的成本。運維有空的時候還好,如果他很忙,那你剩下的就是等待,這就得不償失了。出包發(fā)版本,還可以利用自動化工具,比如Jenkins,效率杠杠滴,用過都說香。

          書單推薦:這里推薦這些工具實用類,使用好了,開發(fā)效率提升好幾個臺階呢。


          • 《Git學習指南》 Git 現(xiàn)在是開發(fā)的必備技能,無論你是單兵作戰(zhàn)還是團隊協(xié)作,都需要版本控制來協(xié)助,不然就會有最后一版,最最最后一版這種類似于畢業(yè)設計的效果出來,哈哈。
          • 《鳥哥的Linux私房菜 基礎學習篇》鳥哥屬于 Linux 的神人,談到 Linux,沒人不知道鳥哥的吧?
          • 《DevOps實踐指南》要提升自己運維和持續(xù)集成的能力,就看著吧
          • 《第一本Docker書》
          • 《Kubernetes權威指南 : 從Docker到Kubernetes實踐全接觸(第2版)》Docker 和 K8S 現(xiàn)在是越來越廣泛了,很好地利用起來,運維的工作也能輕松很多

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

          還有軟件編程其他方面的提升,比如代碼規(guī)范,重構等等。

          image-20210110132603950
          • 《劍指Offer:名企面試官精講典型編程題(第2版)》躍哥周圍很多小伙伴,就是看了這本書的知識鞏固,成了 offer 收割機
          • 《代碼整潔之道:程序員的職業(yè)素養(yǎng)》這本書在我大學的時候老師就不停地開始推薦,工作之后也是一直被推薦,不得不看
          • 《重構 : 改善既有代碼的設計》舊版新版都很 OK,重構是門技術活噢
          • 《阿里巴巴Java開發(fā)手冊(第2版)》一出來的時候就風靡了,還順帶出了編譯器的插件,你安裝了嗎?
          • 《碼出高效:Java開發(fā)手冊》這本書源于影響了全球250萬名開發(fā)工程師的《阿里巴巴Java開發(fā)手冊》,作者靜心沉淀,對Java規(guī)約的來龍去脈進行了全面而徹底的內(nèi)容梳理,配合著看妥妥的

          軟技能



          • 溝通能力

          軟技能這里,我單獨拎出來說。

          主要是平時程序員在很多人心中就是沉悶,不善于溝通,甚至還被調(diào)侃成沒有女朋友。但是,我們不能被這些影響,甚至需要努力去打破這種怪圈。

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

          躍哥是個活潑開朗的人,也算是部門里和別的部門溝通最頻繁的那個人了,無論是工作還是閑聊。這么做的好處是什么?如果你是大公司,一整套系統(tǒng)下來需要涉及到多個部門,你不了解你隔壁部門是做什么的,就會很被動,甚至不停地讓領導去協(xié)調(diào),領導也很忙的;如果是小公司,和其他部門的人溝通無非就是走幾步的事情,再說了程序員群體里女生不多,其他部門女孩子多,萬一就成了呢(這個躍哥這里可是見過例子的);甚至你和別的部門打通了,可以了解他們是做什么的,他們的優(yōu)勢在哪,他們的困難在哪,有沒有你需要借鑒或者引以為戒的事,等等。

          躍哥經(jīng)歷了幾家公司,一直都是設備管理員,這個小小的職位,讓我打通了很多邊界,基本上和公司的人都能打成一片,至于有什么收獲?除了老婆是已經(jīng)找好了,其他的很多東西自己還是可以去接觸,去學習,去獲取的。比如我的數(shù)據(jù)庫能力,除了平時寫代碼,就是煩著我們的DBA,我把他掏空。


          適當?shù)那岸藢W習



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

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

          學好前端的好處,就是前面說的,你用工具去測試你的代碼;那么有了前端,自己寫一個測試的Demo,前端請求下,比你用postman這類工具效率來的高,可以走一整套流程;躍哥會Android,一開始前后端寫作,都是我自己寫Android Demo完成的,提升了自己的效率不說,也讓App開發(fā)省了不少事,很多代碼,我都幫他們搭好框架了。

          SpringBoot + Vue 的組合學習起來,平時自己練練手,寫一個網(wǎng)站玩玩,技術人的開心,莫過于此吧。

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


          • 《JavaScript高級程序設計(第3版)》要學好前端,JavaScript 是必須的
          • 《瘋狂HTML 5+CSS 3+JavaScript講義(第2版)》躍哥學習的就是和本書,學會了基礎才能走的更遠嘛,對吧
          • 《Spring Boot+Vue全棧開發(fā)實戰(zhàn)》這本書是王松老哥寫的,我向他取了好幾次經(jīng),Vue 框架也是現(xiàn)在前端很流行的框架了,作者還是我們國人尤雨溪,驕傲吧
          • React.js 也是經(jīng)典的框架,這里屬于我的盲區(qū),就不推薦書單了


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



          這一個模塊是在 1024 程序員節(jié)的時候,我有感而發(fā),仔細回憶了我這么多年經(jīng)歷的最重要的三個項目,通過項目的方式和大家聊聊我是如何成長起來的!

          在極客時間的《設計模式之美》課程里,作者小爭哥說過一句話:對人一生有很大影響的四樣東西:機遇、方向、能力、努力,我覺得它們一起決定了你是否能“成事”。我把我的經(jīng)歷總結起來,很應景,就是我遇上了機遇,繼而有了能力上的提升,方向上的把控,以及持續(xù)努力的行動。

          回憶目前為止我主要經(jīng)歷了三個項目,仔細歸類的話,這三個竟然還都有所不同。

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

          第一個項目,是我剛畢業(yè)半年之后進到項目組的一個Android App 項目。之前 App 項目的主要業(yè)務邏輯是通過 JavaScript 編寫的,Android 端調(diào)用 WebView 展現(xiàn)即可,所以很多流程都是依賴于 JavaScript 的同學去完成。

          第一個技術就來了,當時的領導們覺得有必要全部原生化,就讓我趕上了重構的時代,說是重構,其實就是對之前在 JavaScript 上的業(yè)務遷移到 Android 原生上。

          慶幸的是,原有項目一開始做的就比較好,文檔之類的相對來說也齊全,做主流業(yè)務的同事一直在項目組里,哪怕文檔里沒有的業(yè)務,自己把問題總結起來抽時間麻煩他,也能得到想要的答案,基于業(yè)務文檔的編碼還是相對輕松。

          也許老天是注定需要給我一次鍛煉的機會,在重構伊始,我的師傅當時的 Android 端負責人因為身體原因休息了一個多月,就讓我這個徒弟去接手了當時復雜的,核心的業(yè)務,得到了一次快速成長的機會。

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

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

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

          第二個項目,是我去新公司之后的項目,做一個即時通信的項目。

          我來公司之前,有一個即時通信的在用,是基于 Flash 編寫的,從響應速度和穩(wěn)定性來說都沒有讓領導和用戶滿意,當時項目組里沒有 Java 的同事(新招一個畢業(yè)生之前也沒怎么接觸過 Java),領導想內(nèi)部發(fā)掘 Java 的員工。我做了一個方向上的選擇,所以,我的第二次機遇就在這個時候蹦出來。

          我到公司的時候是 Android 開發(fā),因為當時項目組有3個 Android,沒有 Java,領導在征求大家的建議,問有沒有想轉的,我分析了自己的情況之后,主動要求轉 Java,和老大一起去做這個即時通信框架。

          我們選擇 Netty 框架來進行,用 WebSocket 通信,又一次加班加點的拼命時刻。(加班并不可怕,有意義的加班都不會考慮下班這件事,只會考慮能給自己帶來多少收益,多少收獲。)這次沒有文檔,只有代碼,也還是有幸運的部分,之前框架的負責人一直在項目組里。

          難點就是,我需要看懂 Flash 的代碼,然后一步步遷移過去。此次從零開始,也有一點遺憾,整個框架是老大搭建好的,我的核心任務是在計劃時間之內(nèi),完全遷移即時通信的功能,盡快把項目跑通,調(diào)試上線完成。

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

          從客戶端轉到后端,給我最大的感觸就是我看項目看的范圍更大了,之前客戶端只是很片面的看到自己所負責的功能,后端能把整個項目都看透,尤其是業(yè)務方面的知識點。

          當然,因為初次參與后端,第一次上線,給我當頭一棒,現(xiàn)實著實把我教育了一番。后端編碼和客戶端還是存在不同,因為我的不熟練,在項目上線的第一個晚上,因為扛不住峰值的壓力,把網(wǎng)站給癱瘓了,業(yè)務宕機了一個小時,幸虧老大幫我解決。

          這么嚴重的線上事故,給我當頭一棒,后端完成代碼只是第一步,線上安全運行才剛剛開始挑戰(zhàn)。這也是讓我堅定,在做業(yè)務的同時,需要持續(xù)的精進自己的技術,比如數(shù)據(jù)庫的頻繁讀寫,緩存的使用,緩存雪崩、擊穿的處理等等。


          正在進行中的項目


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

          這就是我的1.0項目,我花了兩周的時間寫了35+的接口,從開發(fā)到測試,加班加點完成,把我累的。我之前也說了,天天CURD 也能玩出花來,這次這么緊急的情況下,我先完成了第一個版本,從一定程度上沒有拖項目的后腿,而且從寫代碼的時候,記錄了一些需要優(yōu)化的點,以及需要改善的點。因為是別人手里接手的,也是一個純外包的項目,和后期的規(guī)劃差了很多,就這樣,陰差陽錯,我們開始搞了第二個版本的迭代,也就是最近在做的 1.0 到 2.0 的升級。

          這次升級,把一個前后端結合在一起的臃腫的程序,拆分成了輕量級的架構;把一些冗余的數(shù)據(jù)庫進行了改進,刪除優(yōu)化了很多表結構信息,做了一些查詢的索引;最最最大的改變就是使用了微服務來完成重構。

          這一整個過程,除了業(yè)務代碼是現(xiàn)成的,人都是從零開始,又是一次重大的機遇擺在我面前,不抓住那是傻子。很多群里的同學,想?yún)⑴c項目還沒機會呢,我總是時不時地能碰到好的機會,來提升我的能力,或者這就是我的運氣吧。

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

          項目經(jīng)歷結語

          正如我開頭說的,總結我簡短的幾個項目經(jīng)歷(其實還有幾個瑣碎的項目,這里就省略了),就是我遇上了機遇。當每次機會來臨的時候,放到你的面前,就看你怎么抓住了。一開始我是霸王硬上弓,但是到了后面就是不斷地通過自己的學習,自己的努力,把能力提升上來;然后等待下一波機會的到來,或者是根據(jù)你的選擇,去創(chuàng)造另一個機會。

          這三次的經(jīng)歷,從我抓住機遇開始,后面又做了一次選擇,當然加上自己平時的努力(平時多看書、多學習、多實踐還是必要的)。不過躍哥的性格上目前有點剛,甚至有時候覺得自己做得很好,同事都沒我強,我有天下無敵的感覺,導致我蒙蔽了雙眼,還在努力嘗試改進中。


          能力提升你要怎么學



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


          Java開發(fā)也好,C語言也罷,還是其他的語言學習,都是需要實踐的;這個你就把自己當成一名技術工人,泥瓦工也是經(jīng)過千錘百煉才能造房子;包裝工也是經(jīng)歷過千萬次的包裝才能做到得心應手;語言組織也是如此,作文就是一字一句積累起來的。

          編程是一門技術活,不是靠單純的體力活動能勝任的,所以想提升能力方面這個無他,唯有熟能生巧。寫代碼這個要求太低了,還遠遠不夠,我們還是想讓自己更加優(yōu)秀,那就需要做更多的努力

          我經(jīng)常和群友說,編程到最后并不是寫代碼,寫代碼是最最容易的事情。在寫代碼之前,還有需求分析,技術選型(選數(shù)據(jù)庫,選中間件等),架構設計,流程設計,算法選擇,這些都完成了,那你把這些轉換成代碼就是水到渠成。

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

          等基礎知識都慢慢地學會,然后再去找一些小Demo,比如說實現(xiàn)一個計算器,就能檢驗你的學習成果。寫代碼是一個循序漸進的過程,基礎先學會,逐漸就有成就感,那后面的困難就迎刃而解,否則等到后面學習算法,項目時間,困難重重。



          主動學習和被動學習



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

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

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

          這里可以理解出來,你聽別人講,或是自己看書,或是讓別人演示給你,這些都不能讓你真正獲得學習能力,因為你是在被別人灌輸,在聽別人說,在看別人的成果。

          只有你開始自己思考,開始自己總結和歸納,開始找人交流討論,開始踐行,并開始對外輸出,你才會掌握到真正的學習能力。

          學習不僅僅是為了知道,而更是為了思考和理解。在學習的過程中,我們不是為了知道某個事的表面是什么,而是要通過表象去探索其內(nèi)在的本質(zhì)和原理。真正的學習,從來都不是很輕松的,而是那種你知道得越多,你的問題就會越多,你的問題越多,你就會思考得越多,你思考得越多,你就會越覺得自己知道得少,于是你就會想要了解更多。如此循環(huán),是這么一種螺旋上升上下求索的狀態(tài)。

          在學習的過程中,我們要不斷地問自己,這個技術出現(xiàn)的初衷是什么?是要解決什么樣的問題?為什么那個問題要用這種方法解?為什么不能用別的方法解?為什么不能簡單一些?……

          這些問題都會驅使你像一個偵探一樣去探索背后的事實和真相,并在不斷的思考中一點一點地理解整個事情的內(nèi)在本質(zhì)、邏輯和原理。一旦理解和掌握了這些本質(zhì)的東西,你就會發(fā)現(xiàn),整個復雜多變的世界在變得越來越簡單。你就好像找到了所有問題的最終答案似的,一通百通了。

          學習是為了改變自己的思考方式,改變自己的思維方式,改變自己與生俱來的那些垃圾和低效的算法??傊?,學習讓我們改變自己,行動和踐行,反思和改善,從而獲得成長。

          全篇總結


          總算和大家分享完了,這里我簡單的總結一下。

          首先,就是都關心的問題,我選擇了Java,那么我以后能做什么。其實Java能做的很多,只是在現(xiàn)階段,我們通過編程語言排行榜也能看到,Java是穩(wěn)居前三,說明他有龐大的用戶群體,那么就代表著網(wǎng)絡上有海量的 Java 學習資料,良好的社區(qū)環(huán)境,優(yōu)秀的解決方案,以及超級多的框架學習,你絲毫不用擔心自己找不到問題的解決方案,找不到學習的路徑,是在找不到,咱們還有星球呢。

          其次就是如何學習,我列舉的 Java 學習路線也是根據(jù)后端的學習路線來,后面經(jīng)過補充,進階部分也寫了。

          第三,就是學習方法,怎么學。說實話,編碼一直都是取決于個人的學習情況以及自律能力。很多人在學校里努力,在校招的時候就能有一個好的offer,有些在學校里沒能堅持下來,可能畢業(yè)之后就放棄這條路了;還有些是一開始覺得很感興趣,后來發(fā)現(xiàn)自己不適合,要么學校里選擇轉專業(yè),要么出來之后轉產(chǎn)品,轉實施等也算是改行。那么,就是兩個結果,用籃球季后賽的術語就是 Win or Go Home

          判斷自己是否有毅力學習下來,可以參考下我在上面的建議,當然,如果小伙伴們有更好的建議,給我留言,讓大家一起交流交流。

          千萬不要什么都沒去實踐,但是一直在擔心擔心,擔心自己不能寫代碼。如果你不開始實踐,怎么知道自己是不是適合,是不是喜歡,是不是會走這條路呢,對吧。其實我剛讀大一,接觸 C 語言的時候,尤其是到了指針,鏈表,想過放棄,但是最后我斷了這個念頭,我要是不寫代碼,我大學不是白考了,轉專業(yè)?現(xiàn)實點,能轉專業(yè)的,都是班里的女生,死磕學習成績,名額都搶光了。那么你還能怎么辦,硬著頭皮繼續(xù)吧。

          就這樣,一直到畢業(yè),我在實驗室里看著書,敲著代碼,大家的暑假有兩個月,我的暑假就只給自己一個月,另外一個月都在學校里渡過,就是為了讓自己能不辜負父母的付出。后來,反正就是不斷的努力,成長,以及一定的機遇抓住就好。


          參考內(nèi)容:

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




          0、最后一天了,四個關鍵字回顧程序員小躍的2020

          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操B视频免费看 | 爱爱视频片段日韩 | 黄色片在线免费观看视频 | 天堂8AV | 国产卡一卡二卡三卡四在线观看 |