拿到這份 Java、C++ 軟件開發完整學習路線圖,我面試再也沒掛過..

大家好,我是檸檬

檸檬哥作為一個普通大學、非計算機專業,自學後端技術進入騰訊做後端開發工作,我自己也是非科班自學計算機成功轉行軟件開發(有想聽檸檬哥轉行之路經歷的嗎,可以留言告訴我,人多就寫寫),體會過當初想學又不知從何學起的迷茫,還好最後摸索出了一條正確學習的路線。

思來想去,學習方向和路線很重要。比起具體的技術細節,可複製的經驗、清晰的學習路線,是大部分人更加需要的東西

朝着正確的方向努力否則只會離目標越來越遠,不是嗎?

只顧着寫各種技術,不告訴大家這個知識點在後端技術圖譜的什麼位置,有點盲人摸象不知全貌的感覺,很多在我看來大家都懂的內容,其實只是我以為,信息差是客觀存在的,抹平信息差是分享的價值所在。

所以這一期文章檸檬哥足足花了半個月時間,整理了一張後端技術學習路線思維導圖,來和你聊聊:

要成為一個符合 BAT、TMD 大廠要求的後端技術工程師,到底需要學哪些技術?後端技術學習路線是怎樣的?

學習路線

話不多說,直接上剛畫完的後端技術學習路線思維導圖框架:

圖中的每一個節點都可以點開,我都做了細分,在後面章節逐個展開介紹。

後端技術學堂開課半年以來,寫了 30+ 篇原創文章,內容有Linux、數據庫、算法、架構、微服務、甚至中間還寫了一個系列的Golang基礎教程,真算得上是天馬行空,這就是才華橫溢吧(狗頭)。

歷史文章都在後端知識體系範疇內,你甚至可以對照下我歷史文章分享的內容,都可以在我今天整理的這張學習路線圖中找到相應的位置,後續更新的文章我也會歸類到其中,方便大家歸納複習。

計算機基礎

不管是後端開發還是前端開發,說到底我們所有的軟件開發都是在計算上編寫程序,雖然對於大部分人來說,真正開始寫代碼的時候很少會讓你去解決計算機底層的問題,不接觸不代表不重要,計算機基礎是最重要的。

後端開發工作中經常用到 Java、C++、Python、Golang 這些語言稱為高級編程語言,稱為高級是它們接近我們日常交流的自然語言,離計算機底層遠,但所有的高級語言最終都會轉化成彙編->計算機指令->控制流操控計算機硬件,所以學習計算機構成和工作原理、操作系統這些基礎知識,能夠加深我們隊高級語言的理解。

那我們一直說的計算機基礎到時是什麼?計算機科學技術 CS(Computer Science)作為一門專業課程,就和其他工科課程一樣有自己的理論體系,如果你是計算機專業的同學不用我來教該學什麼,計算機專業大學四年學校教的那些就是基礎,別小看你在學校學的那些看起來沒啥用的課程。我這有一份中中科大的計算機技術本科主要課程結構安排

一流大學的計算機專業要學什麼可以對照着看下,從學科數學理論基礎、計算機體系結構、軟件工程方法等等維度展開。

那如果你不是計算機相關專業的想轉行,也不要被嚇到了,畢竟這是人家四年時間的學習內容,本科的培養目標不僅僅是培養出一個軟件工程師,本科學習還是面向碩士博士的基礎培養,注意是計算機科學專業,名字里有個詞叫「科學」,我這篇文章要說的 BAT 公司後台軟件開發,可以認為是「工學」方向,更多的是服務於工程開發。

如果只是面向後台開發和工作面試,或者你是非計算機專業想轉行,社畜沒有太多時間去學習大學那些理論課程,那幫我把計算機基礎的範圍縮小到下面這 4 門專業課:計算機組成原理、計算機網路、操作系統、數據結構

計算機組成原理

這門課程讓你了解計算機的組成和工作原理,要學習的內容包括:

  • 數據在計算機中的表示和運算(檸檬說:計算機不識數,只認得高低電平,所以數據在計算機內部都用二進制的0和1表示)
  • 存儲系統(檸檬說:數據和程序指令都要存儲下來,學習計算機的存儲層次,內存、外存、高速緩存、虛擬存儲技術)
  • 指令系統(檸檬說:寫的代碼最終都要被翻譯成計算機指令,指令格式和尋址方式有多種,控制器來控制指令執行)
  • 中央處理器(也就是 CPU 計算機的大腦,主要構成是運算器和控制器)
  • 總線(檸檬說:計算機的血管動脈,連接計算機各功能組件,用來傳輸數據、地址信號、控制信號)
  • 輸入輸出系統(檸檬說:Input/Output 也叫 IO 系統,連接和管理各種外部設備比如鍵盤、顯示器等等)

計算機網絡

世界上第一台通用計算機「ENIAC」於 1946 被發明出來,如其名字一樣僅僅是用於計算,在後來計算機越來越多,如果沒有網絡每台計算機都將成為一個孤島,也不會有現在互聯網的繁榮,「計算機網絡」這門課程的學習路線非常清晰,就是圍繞着如何讓地理位置上不同的計算機連接起來,並高效可靠的交換數據信息,實現人在家中做,天下事盡知。

計算機網絡有分層次,根據各層屬性和特點,分為:

  • 物理層
  • 數據鏈路層
  • 網絡層
  • 傳輸層
  • 應用層

這個層次劃分從上到下就是一個網絡數據包的接收路徑,反之就是發送路徑。既然要交換信息肯定得商量一套通用的協議,就像我們和老外交流,要麼他們學中文要麼我們學英文,反正得統一出一個標準語言出來,這在計算機網絡中稱之為「通信協議」。如上述的網絡分層,每層都有各自適配的協議,所以計算機網絡的學習基本就是圍繞着分層協議的學習。

操作系統

操作系統也是一種軟件。你熟悉的微軟Windos操作系統,後台開發熟悉的各種發行版的 Linux 系統,都是通過軟件的形式安裝在計算機上。

只不過這個軟件和我們平常接觸的應用程序軟件不同,它比較特殊,因為它向下和計算機硬件(就是我們在計算機組成原理中學習的那些硬件)打交道,向上給其他應用程序和用戶提供通用的交互的接口,說白了操作系統就是個中介和管家的角色。它幫我們做了下面這些事情:

  • 進程管理(檸檬說:你寫的程序運行起來才能幹活,運行起來的程序稱為進程,進程是資源的最小單位)
  • 內存管理(檸檬說:計算機內存又貴又少,動不動又要來個高並發,內存管理大有學問)
  • 文件管理(檸檬說:計算機中的資料和信息需要通過文件系統來保存、管理)
  • 輸入輸出管理(檸檬說:各種外部設備如何接入計算機和接入之後又如何管理)

數據結構

數據結構大家最熟悉,即使毫無計算機基礎或是想轉行計算機,第一個遇到的就是數據結構,因為面試刷的算法題本質上就是對各種數據結構的運用。所以單純對面試功利的角度來說,數據結構也是必須要掌握的計算機基礎,數據結構要學到:

  • 線性表(鏈表、數組、循環鏈表)
  • 棧和隊列
  • 樹和各種二叉樹(二叉排序樹、平衡二叉樹、哈夫曼樹、B樹、B+樹、Trie樹)
  • 圖(圖的存儲結構、BFS、DFS、最短路徑、最小生成樹、拓撲排序、關鍵路徑)
  • 查找算法(二分查找、B樹查找、HASH表、KMP字符串模式匹配)
  • 排序算法(插入排序、冒泡排序、歸併排序、基數排序、堆排序)
  • 貪心算法
  • 位運算
  • 分治算法
  • 動態規劃

好了,計算機基礎四大專業課已經大概過了一遍,當然這是我給沒有計算機基礎同學的實用主義建議,等你學完這四門課程也只能夠說入門計算機了,不過這已經比很多人厲害了。如果想真正的了解計算機這門學科,可以等學完了這 4 門基礎課程之後,再花寫時間挑一些上面培養方案中的課程去學習,做一個知識體系完備的計算機軟件後端開發工程師。

Linux

在後台開發領域,你所能接觸到的後端服務不敢說 100%,至少也有 90% 以上是運行在 Linux 系統之上,因為它開源、便利、功能強大,需要學習以下技術點:

Linux系統使用

所以如果你想走後端開發這條路線,我建議你趁早使用 Linux ,越早越好。可以是在個人 PC 上裝 Linux 虛擬機,或者裝個雙系統,我在大學就是這麼玩的,那時候雲服務器還沒現在這麼普及,現在我覺得買個 Linux 雲服務器最方便,如果是學生還有教育優惠也不貴。

有了Linux系統之後幹嘛呢?把它作為你的常用系統,經常登錄進去對照着「鳥哥的 Linux 私房菜」從頭到尾操作一遍,ok,Linux的基礎操作你就掌握了。

Linux 高級編程

Linux「高級編程」的意思是比上面的 Linux 基礎操作更深入一個層次。

學會了 Linux 的使用還不算是一個真正的開發人員,使用系統是成為開發者最基本要求,會操作Linux 就像使用 Windows 系統一樣,只不過是學習成本的問題,如果這個世界沒有 Window 系統,你女朋友花點時間也能掌握 Linux 系統基本操作。

要想進階成為後端開發人員,就要懂得如何使用 Linux 系統提供的各種系統API(系統調用接口)進行編程開發,程序員用你寫的代碼來控制系統,普通用戶只會用鼠標操縱。這個階段需要學習:

  • Unix 系統實現 Linux、基本系統數據類型

  • 文件操作函數: openread close write dup fcntl ioctl stat chmod access chdir

  • 系統編程接口的基本特性和高級特性

  • Linux進程環境、如何創建進程、線程,程序的存儲空間分配、環境變量

  • 進程組、會話以及任務控制、進程優先級和調度

  • 動態庫和靜態庫

  • 進程間通信:管道和FIFO、消息隊列、信號量、共享內存、內存映射

  • 套接字和網絡編程

總之,這一階段需要學習的是在 Linux 環境下的高級編程技巧,通過對這些內容的學習也能讓你更深入的理解 Linux 系統是如何工作和運行的,並且真正的踏入 Linux 系統編程大門。

網絡編程

網絡編程是通過網絡套接字 socket 方式實現的通信,所以也屬於進程間通信 IPC(Inter-Process Communication)。

由於現在的後台服務基於服務端/客戶端模型,兩者之間基於網絡通信,你在家用手機點個外賣的服務請求,也是通過網絡通信發給某團的後台服務器,所以後台服務開發,說到底還是網絡編程,以及建立在網絡編程數據之上的應用層開發。

網絡編程學什麼:

  • 什麼是socket套接字
  • 套接字選項
  • TCP/UDP 套接字編程
  • Unix domain 協議和編程
  • 原始套接字編程
  • IO多路復用:select 、poll、epoll、kqueue
  • 序列化技術
  • 零拷貝技術
  • 開源網絡庫:muduo、libevent

學完以上內容你大概可以寫一個類似QQ一樣的網絡聊天小工具。

不在在工作中,都有成熟的網絡框架或網絡通信庫,大公司比如鵝廠大部分是自研網絡通信框架,小公司用開源項目,這讓很多後台開發人員不必關心底層的網絡通信細節,除了部分基礎架構的開發同學,大部分後台開發同學工作都是在做業務系統的開發。

但了解底層網絡編程原理,是後台開發人員的核心能力,這點對於 C/C++ 後台開發程序員尤為重要。它能拔高你看問題的高度,不了解底層原理,就像是在黑盒編程一樣,出了問題無從下手排查。

學完了以上內容,基本是具備了從事後台開發的基礎能力,也能開發出一個簡單的後台服務器了。

數據庫

除非是單純的轉發路由類後台服務,一般來說後台開發的web服務器後台程序,後台服務程序說白了就是個死循環:

接收客戶端數據包 -> 處理數據包 -> 業務邏輯處理 -> 保存必要的數據 -> 回復響應數據給客戶端

這其中會伴隨對各種數據的處理,比如電商系統會處理訂單數據、用戶數據,遊戲後台會處理角色數據和裝備數據等等,有數據就會涉及到存儲系統,數據一般都存儲到數據庫。

主要學習 2 大類數據庫:

關係型數據庫是指採用了關係模型來組織數據的數據庫,簡單理解就是二維表格模型。

非關係型數據庫一般指的是 key-value 形式存儲數據的 NoSQL 數據庫,數據和鍵值是簡單的映射關係。

關係型數據庫

非關係型數據庫

  • redis 基本操作和使用
  • redis 設計與實現原理
  • MongoDB
  • levelDB
  • memcache
  • HBase
  • CKV+ 騰訊自研

後台開發服務還需要學會解決三高問題:高並發、高可用、高性能。

高並發

利用到目前為止學習的內容,我們的開發的後台服務器應付一些小並發場景綽綽有餘,但是隨着互聯網應用業務量的上漲,對後台服務端的請求數劇增,高並發需求隨之而來,高並髮指的就是高 TPS 和高 QPS

  • TPS (Transactions Per Second)每秒事務數
  • QPS(Query Per Second)每秒查詢數等。

對於高並發服務必須改變傳統的單進程模型,才能處理的過來如此海量的請求。

多進程

對於高並發的服務請求,由於後台服務一般都是 IO 密集型應用,IO 密集型應用就是大部分 CPU 時間用在網絡 IO 上,相對的是 CPU 密集型應用大部分時間花在數據計算上。

大多數的後台服務程序都是 IO 密集型的應用,網絡 IO 的時候 CPU 等待白白浪費時間, 這就告訴我們 CPU 的潛力還沒有完全發揮,所以當一個進程的處理能力達到上限,我們可以多創建幾個進程,這就是多進程模型。

多線程

多線程與多進程類似,實際在Linux系統中線程是由輕量級的進程 LWP(Light-weight process)實現,多線程方式實現的後台服務相對於多進程更加輕量,因為多線程是在同一個進程內部實現。

不過多線程也會帶來新的問題,比如全局數據競爭和同步問題,引入線程鎖還要防止死鎖的發生。

協程

那什麼是協程呢?協程 Coroutines 是一種比線程更加輕量級的微線程。類比一個進程可以擁有多個線程,一個線程也可以擁有多個協程,因此協程又稱微線程和纖程。可以粗略的把協程理解成子程序調用,每個子程序都可以在一個單獨的協程內執行。

異步回調

所謂異步回調就是,服務端發起 IO 請求的線程不等網絡 IO 線程操作完成,就繼續執行隨後的代碼,一般請求線程需要先註冊一個回調函數,當IO 完成之後網絡IO線程通過調用之前註冊的回調函數來通知發起 IO 請求的線程,這樣發起請求的線程就不會阻塞住等待結果,提高了服務處理性能。

關於這一小節內容可參考檸檬哥之前的文章 圖解:高並發服務框架-進程線程協程

高性能

按以上服務模型可以提高服務本身處理能力,高性能後台服務往往還會利用多種技術、從多個維度優化提高性能。比如採用CDN(Content Delivery Network)內容分髮網絡,存儲和分發使用戶就近獲取內容,縮短響應時間;採用池化技術,避免頻繁的資源分配與回收;採用服務集群,橫向擴展服務能力;採用緩存技術,熱點數據加入緩存,減少數據庫訪問。

  • CND 內容分發技術
  • 池化技術:數據庫連接池,線程池
  • 集群化
  • 緩存技術

高可用

高可用即保證服務的穩定性,不出現重大問題或宕機,常見的解決高可用思路是冗餘和負載均衡。冗餘的意思就是多部署幾台服務器,當其中一台掛掉另外一台能頂上。通過負載均衡技術實現對流量的動態調配,不至於出現大量流量衝擊某台機器出現請求不均勻,軟件負載均衡技術可以通過DNS、Nginx、LVS等技術實現。這裡主要學習的技術有:

  • 負載均衡技術,軟硬件負載均衡
  • 限流隔離降級技術
  • 應用層容災,資源隔離熔斷
  • 異地多活

設計模式

設計模式代表着軟件開發的一種最佳實踐。已經經歷了很長一段時間的發展,它們提供了軟件開發過程中面臨的一般問題的最佳解決方案。學習這些模式有助於經驗不足的開發人員通過一種簡單快捷的方式來學習軟件設計,當設計大規模軟件時遵循必要的設計模式能讓寫出的代碼更加健壯和可擴展

設計模式 6 大原則:

  • 開閉原則:對擴展開放,對修改關閉,多使用抽象類和接口。
  • 里氏替換原則:基類可以被子類替換,使用抽象類繼承,不使用具體類繼承。
  • 依賴倒轉原則:要依賴於抽象,不要依賴於具體,針對接口編程,不針對實現編程。
  • 接口隔離原則:使用多個隔離的接口,比使用單個接口好,建立最小的接口。
  • 迪米特法則:一個軟件實體應當儘可能少地與其他實體發生相互作用,通過中間類建立聯繫。
  • 合成復用原則:盡量使用合成/聚合,而不是使用繼承。

常見設計模式分類

  • 工廠模式
  • 單例模式
  • 建造者模式
  • 適配器模式
  • 橋接模式
  • 過濾器模式
  • 裝飾器模式
  • 外觀模式
  • 享元模式
  • 代理模式
  • 責任鏈模式
  • 解釋器模式
  • 迭代器模式
  • 觀察者模式

分佈式

為什麼會出現分佈式?隨着業務的體量不斷增長,單個節點的處理能力無法滿足日益增長的計算、存儲任務的時候,且硬件的提升(加內存、加磁盤、使用更好的CPU)高昂到得不償失的時候,應用程序也不能進一步優化的時候,我們才需要考慮分佈式系統。

分佈式系統是由一組通過網絡進行通信、為了完成共同的任務而協調工作的計算機節點組成的系統。分佈式系統的出現是為了用廉價的、普通的機器完成單個計算機無法完成的計算、存儲任務。其目的是利用更多的機器,處理更多的數據。

分佈式系統要解決的問題本身就是和單機系統一樣的,而由於分佈式系統多節點、通過網絡通信的拓撲結構,會引入很多單機系統沒有的問題,為了解決這些問題又會引入更多的機制、協議。這裡需要學習的內容包括:

  • 分佈式一致性算法:PAXOS、Raft、Zab
  • 分佈式事務:2PC、3PC、TCC
  • 分佈式唯一 ID 生成:雪花算法、UUID、淘寶 TDDL SEQUENCE方案、美團 Leaf
  • 一致性HASH算法
  • 擴展性設計,設計可擴展的軟件架構
  • 分佈式文件系統:HDFS、FastDFS
  • 微服務架構設計,服務註冊、服務發現、服務路由

安全

本質上後台服務在網絡上運行,需要和各種網絡環境交互,在正常情況下能夠工作,但互聯網中有很多針對後台服務的惡意攻擊,因此網絡安全也是後台開發工程師需要學習的內容。這裡主要包括:

  • web安全:CSRF、SQL注入、XSS
  • DDos防範
  • 加解密算法:對稱加密、哈希算法、非對稱加密
  • 網絡隔離:內外網分離、跳板機
  • 授權認證算法:OAuth2.0、OIDC、2FA、單點登錄SSO

監控與統計

後台服務運行我們如何了解其運行狀態和健康度?如果只是開發小玩具監控和統計大可不必,只需記錄本地日誌即可,對於成熟的大型後台服務系統,監控、統計、追蹤必不可少,無監控,不運營

開源的監控軟件有:Prometheus、Zabbix、Open-Falcon。

追蹤系統也非常重要,特別是目前微服務化,一次服務請求需要經歷多個不同的微服務處理,給分佈式追蹤帶來新的挑戰,主要包含以下三個方面:

  • 通過收集日誌(Logging),記錄程序的調試信息或錯誤信息,對系統和各個服務的運行狀態進行監控
  • 通過收集量度(Metrics),比如累加量,對系統和各個服務的性能進行監控
  • 通過分佈式追蹤(Tracing ),追蹤服務請求是如何在各個分佈的組件中進行處理的細節

業界也有一些成熟的開源軟件用於監控與追蹤:SkyWalking、Pinpoint、Zipkin、CAT大眾點評開源。不過大公司一般都有自研的一套監控與追蹤系統,比如騰訊內部就有多套自研監控與調用鏈追蹤系統。

搜索引擎

我們討論的是全文搜索引擎,什麼是全文搜索引擎?

全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,並將查找的結果反饋給用戶的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。

數據分為結構化數據與非結構化數據

像數據庫表這種的數據是結構化數據;而對於像HTML、XML、文檔這樣不定長度且無固定格式的數據我們稱之為非結構化數據。非結構化數據也稱為全文數據,對非結構化數據的搜索可以用全文檢索的方式,

目前兩大主流的全文搜索引擎「Solr」和「Elasticsearch」都是基於 Lucene 建立。搜索引擎需要學習的內容:

  • 搜索引擎原理,搜索引擎利用倒排索引技術來實現對全文數據的高效檢索。

  • Lucene,Apache Lucene 是一個開源的全文搜索引擎工具包。

  • Elasticsearch 原理與使用

  • Solr 原理與使用

大數據

大數據,又稱為巨量資料,指的是在傳統數據處理應用軟件不足以處理的大或複雜的數據集的術語。隨着後台服務用戶數增加和數據的積累,產生海量有待挖掘價值的數據,分析利用這些數據可以反饋線上決策,優化運營策略,產生數據價值。

海量數據也可以定義為來自各種來源的大量非結構化或結構化數據。

在軟件開發領域的大數據概念自 20 世紀 90 年代的數據倉庫開始,對於大數據的處理也導致各種海量數據的統計和處理技術發展。

主要包含以下的技術點需要學習:數據存儲、離線分析、流式計算。

  • 大數據存儲:Hadoop 框架,HDFS、HBase、YARN 架構、Apache Kudu
  • 離線分析:Hive、MapReduce、Spark
  • 流式計算:Flink、Storm、Kafka Stream、Spark Streaming

虛擬化

虛擬化,是指通過虛擬化技術將一台計算機虛擬為多台邏輯計算機。

虛擬化的好處

  • 靈活性:在同一硬件上同時運行多個操作系統
  • 敏捷性:移動操作系統的方式與將文件或圖片從一台物理服務器移動到另一台物理服務器的方式相同。
  • 容錯:當物理服務器出現故障時,管理軟件會自動將實例遷移到可用服務器,甚至無感知物理硬件故障。
  • 降低成本:您不再需要過多的物理服務器,操作和維護所需的費用也隨之減少。

常見的虛擬化技術:KVM、Xen、OpenVZ、Docker

雖然對於大多數後台服務程序來說, 很多服務都是部署在 Docker 容器里,但 Docker 共用了底層系統的 kernel,所有容器共用一部分的運行庫,因此隔離性相比 KVM 之類的虛擬化技術差一點,KVM 與 Docker 有各自的使用場景,未來很長一段時間是共存狀態。

OpenStack 管理 VM(Virtual Machine)虛擬機的工具;Kubernetes 簡稱 K8s ,是管理 container 容器的工具。

中間件

在後端開發中你可能經常聽說到「中間件」這個詞,那什麼是中間件?看下Wiki上的定義:

中間件技術創建在對應用軟件部分常用功能的抽象上,將常用且重要的過程調用、分佈式組件、消息隊列、事務、安全、鏈接器、商業流程、網絡並發、HTTP 服務器、Web Service 等功能集於一身或者分別在不同品牌的不同產品中分別完成。

中國科學院軟件所研究員仲萃豪把中間件定義為「平台+通信」。這個定義限定了只有用於分佈式系統中的此類軟件才能被稱為中間件,同時此定義也把中間件與實際應用的應用軟件區分開來。

大白話來說,中間件就是把分佈式系統中一些通用功能的抽象出來提供服務的一類軟件統稱。它屏蔽掉了底層操作系統的複雜性,向上提供一個統一的開發環境,降低了軟件系統開發的複雜度,由於中間件是介於操作系統和應用軟件之間,為應用軟件提供服務功能的軟件,由於介於兩種軟件之間,所以稱為中間件

常見的的開源中間件有下面幾種,組合起來就能搭建一個完整的分佈式後台服務系統:

  • web server 中間件,Nginx、OpenResty、Tomcat…
  • 緩存中間件,服務端緩存包括 Redis、Memcached…
  • 消息隊列中間件,Kafka、RabbitMQ、ActiveMQ…
  • RPC框架,Tars、Dubbo、gRPC、Thrift
  • 數據庫中間件,Sharding jdbc
  • 日誌系統中間件,ELK B指的是一套解決方案,是 Elasticsearch、Logstash 、 Kibana、Beats 是這 4 種軟件產品的首字母縮寫。
  • 配置中心中間件,Apollo、zookeeper統一配置管理
  • API網關,開源項目有 Tyk、kong、zuul、orange…

版本控制

大型軟件項目的代碼量巨大,如何有效組織和管理源碼和版本,於是產生了版本控制系統。版本控制系統就是我們常說的SVN 或 Git,用來追蹤、維護源碼、文件以及配置文件等等的改動,並且提供控制這些改動控制權的程序。

常見的版本控制系統分為兩大類:集中式版本控制和分佈式版本控制。作為後端開發工程師,版本控制系統的使用也是必須掌握的基礎技能,不過這些系統一般都是邊使用邊熟悉,剛開始熟悉一些常用操作就好

  • 常見的有集中式版本控制系統,代表是SVN;
  • 分佈式版本控制系統,代表是Git

工具

一些和後端開發或者說軟件開發相關的工具推薦,主要是編輯器和 IDE。

編輯器

在 Linux 下開發肯定離不開 Vim 或者 Emacs,這兩個都是常用的編輯器,已經形成了兩大愛好者陣營。特別是 Vim 編輯器,學習成本有點高,配合上各種插件和配置,有些 Vim 愛好者已經把它當成 IDE 來用了,一旦掌握可以大幅提升工作效率,值得你去學習。

當然除了 Vim 如果是文字編輯工作,比如寫 README 文檔或者寫技術博客,那麼強烈推薦學習下 Markdown 語法,這是一種種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,注重內容本身不用過多的調整排版。Markdown 編輯器推薦 Typora 、有道雲筆記 Markdown 編輯器、VSCode Markdown插件。

IDE

編輯器作為小工程還可以勝任,不過後端開發工作中,一般都是大型的軟件工程項目,所以不大可能用編輯器來管理,這時候就需要學習使用專業的集成開發工具。

集成開發環境(IDE,Integrated Development Environment )是用於提供程序開發環境的應用程序,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。

磨刀不誤砍柴工,挑一把趁手的兵器再去編程世界遨遊。各語言 IDE 五花八門,推薦 JetBrains 系列和 VS Code ,JetBrains 產品包括各語言開發的一系列的 IDE,特別是Java 的Intellij IDEA 口碑非常不錯,部分對應的產品系列如下。

  • CLion – 跨平台的C/C++ IDE 開發工具,支持C++11 、C++14、libc++以及Boost。
  • GoLand – Go語言的集成開發環境。
  • IntelliJ IDEA – 2001年發佈。一套智能的 Java 集成開發環境,特別專註與強調程序師的開發撰寫效率提升。
  • PhpStorm – PHP IDE開發工具。
  • PyCharm – 一款結合了Django框架的Python IDE開發工具。
  • AppCode – Swift 和 Objective-C IDE開發工具。

Visual Studio Code(簡稱VS Code)是一個由微軟開發,同時支持Windows 、 Linux和macOS等操作系統的免費代碼編輯器,它支持測試,並內置了Git 版本控制功能,同時也具有開發環境功能,例如代碼補全(類似於 IntelliSense)、代碼片段和代碼重構等。該編輯器支持用戶個性化配置,例如改變主題顏色、鍵盤快捷方式等各種屬性和參數,同時還在編輯器中內置了擴展程序管理的功能。

在2019年的 Stack Overflow 組織的開發者調研中,VS Code被認為是最受開發者歡迎的開發環境。

測試

軟件工程師不僅要寫代碼,還要做測試,軟件測試和軟件開發是相伴相生,測試能讓保證我們寫出代碼更加健壯和可維護。

TDD是測試驅動開發(Test-Driven Development)的英文簡稱,是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發功能代碼之前,先編寫單元測試用例代碼,根據測試代碼確定需要編寫什麼產品代碼。需要掌握和了解以下測試技術和方法。

  • 單元測試
  • 壓力測試
  • 全鏈路測試
  • A/B 測試,灰度發佈,藍綠部署

學習順序

總結下,後端技術學習的內容還是很多的,不可能一蹴而就。

這篇文章能看到這裡的同學,如果是初學者,可能就想問直接問我從哪裡開始學習?那我就不賣關子,如果你不知道從哪開始學,對於學習路線各個節點,我就按個人的學習經驗並結合認識的大廠高 P 給的建議,給你把以上技術路線學習優先級做個排序,你照着學就行,排序規則:

星級越高,排名越靠前,重要程度越高,優先安排時間學習。

計算機基礎 5星

Linux 5 星

數據庫 5 星

設計模式 5 星

工具 5 星

中間件 4 星

分佈式 4 星

高並發、高可用、高性能 4 星

搜索引擎 4 星

測試 3 星

監控與統計 3 星

虛擬化 3 星

安全 3 星

大數據 3 星

語言的困惑

細心的讀者應該發現了,到目前為止本文討論的後端技術學習路線內容,並沒有提及特定編程語言,不提及並不是說不重要,語言是很多技術的前置知識。打個比方來說,編程語言是磚瓦,高大上的項目都是一磚一瓦堆砌而成。

其實你在學習上述技術點的過程中,會自然而然的接觸到各種編程語言的中間件或是開源項目,不管用什麼語言做後端服務開發,都是沒有問題的,並且都不有很多優秀的開源框架可以借鑒學習,關鍵是要有清晰的學習路線,主流的後端開發語言包括 Java、C++、PHP、Python、Go ,那學哪個呢?

如果你是在校的學生,時間充足,我建議可以都可以嘗試下,不試過怎麼知道不合適?然後結合自己偏愛和未來打算從事的崗位方向選擇一門語言深入學習;

如果你是職場社畜,那就要適應團隊,產品業務需要用什麼語言開發那就學哪個。萬變不離其宗,後端技術的知識都是相通的,不要被特定語言所束縛,這些通用的後端技術掌握後,剩下的就只是編程語言學習,很快啊,很快的。

結語

這篇文章我從月初開始整理內容、繪製思維導圖,真真是肝了半個月之久。創作過程中,我把自己從初級開發人員到現在高級工程師,這些年學習的技術都在腦子裡過了一遍。

說來慚愧有些我畫在導圖上的技術我也只是懂點皮毛,但整個後端技術棧的學習路線和方向是沒問題的,我都畫出來了,大家參考着學習和查漏補缺,在技術上我也需要繼續精進學習,咱們共勉。

學習路線和高清路線大圖我會放在我的 Github 項目上,這篇文章只是個開始,也不是最終版,我會持續在 Github 更新和完善本文內容,我這個項目的地址是:

//github.com/imcoderlemon/CodeClass

點擊文末「閱讀原文」鏈接直達 Github 項目主頁,記得點個 star 這樣我更新了內容你就能收到通知。

公眾號後台回復「路線圖」獲取後端技術學習路線高清思維導圖

這篇文章沒寫之前我就預感會很長,寫到這裡已經 1 萬多字了。

對於每個技術點還可以展開聊聊我是如何學習的,那樣就太長了,檸檬哥作為一個普通大學、非計算機科班人員,通過自學後端技術,進入鵝廠做軟件開發,我的後端技術學習經驗或許能給你一點借鑒。

我可以給大家分享下細分技術領域的學習路線,比如計算機基礎學習路線、數據庫學習路線、分佈式技術學習路線、高並發技術學習路線…如果大家想看的話就點贊給我點動力吧!

可以微信搜索公眾號「 後端技術學堂 」回復「1024」獲取 500 本計算機電子書,回復「學習路線」獲取超詳細後端技術學習路線思維導圖,文章每周持續更新,我們下期見!

公眾號圖