拿到這份 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 本電腦電子書,回復「學習路線」獲取超詳細後端技術學習路線思維導圖,文章每周持續更新,我們下期見!

公眾號圖