話不多說,直接上剛畫完的「后端技術學習路線」思維導圖框架:
圖中的每一個節(jié)點都可以點開,我都做了細分,在后面章節(jié)逐個展開介紹。
計算機基礎
不管是后端開發(fā)還是前端開發(fā),說到底我們所有的軟件開發(fā)都是在計算上編寫程序,雖然對于大部分人來說,真正開始寫代碼的時候很少會讓你去解決計算機底層的問題,不接觸不代表不重要,計算機基礎是最重要的。
后端開發(fā)工作中經常用到 Java、C++、Python、Golang 這些語言稱為高級編程語言,稱為高級是它們接近我們日常交流的自然語言,離計算機底層遠,但所有的高級語言最終都會轉化成匯編->計算機指令->控制流操控計算機硬件,所以學習計算機構成和工作原理、操作系統(tǒng)這些基礎知識,能夠加深我們隊高級語言的理解。
那我們一直說的計算機基礎到時是什么?計算機科學技術 CS(Computer Science)作為一門專業(yè)課程,就和其他工科課程一樣有自己的理論體系,如果你是計算機專業(yè)的同學不用我來教該學什么,計算機專業(yè)大學四年學校教的那些就是基礎,別小看你在學校學的那些看起來沒啥用的課程。我這有一份中中科大的計算機技術本科主要課程結構安排。
一流大學的計算機專業(yè)要學什么可以對照著看下,從學科數學理論基礎、計算機體系結構、軟件工程方法等等維度展開。
那如果你不是計算機相關專業(yè)的想轉行,也不要被嚇到了,畢竟這是人家四年時間的學習內容,本科的培養(yǎng)目標不僅僅是培養(yǎng)出一個軟件工程師,本科學習還是面向碩士博士的基礎培養(yǎng),注意是計算機科學專業(yè),名字里有個詞叫「科學」,我這篇文章要說的 BAT 公司后臺軟件開發(fā),可以認為是「工學」方向,更多的是服務于工程開發(fā)。
如果只是面向后臺開發(fā)和工作面試,或者你是非計算機專業(yè)想轉行,社畜沒有太多時間去學習大學那些理論課程,那幫我把計算機基礎的范圍縮小到下面這 4 門專業(yè)課:計算機組成原理、計算機網路、操作系統(tǒng)、數據結構。
計算機組成原理
這門課程讓你了解計算機的組成和工作原理,要學習的內容包括:
數據在計算機中的表示和運算(計算機不識數,只認得高低電平,所以數據在計算機內部都用二進制的0和1表示)
存儲系統(tǒng)(數據和程序指令都要存儲下來,學習計算機的存儲層次,內存、外存、高速緩存、虛擬存儲技術)
指令系統(tǒng)(寫的代碼最終都要被翻譯成計算機指令,指令格式和尋址方式有多種,控制器來控制指令執(zhí)行)
中央處理器(也就是 CPU 計算機的大腦,主要構成是運算器和控制器)
總線(計算機的血管動脈,連接計算機各功能組件,用來傳輸數據、地址信號、控制信號)
輸入輸出系統(tǒng)(Input/Output 也叫 IO 系統(tǒng),連接和管理各種外部設備比如鍵盤、顯示器等等)
計算機網絡
世界上第一臺通用計算機「ENIAC」于 1946 被發(fā)明出來,如其名字一樣僅僅是用于計算,在后來計算機越來越多,如果沒有網絡每臺計算機都將成為一個孤島,也不會有現在互聯(lián)網的繁榮,「計算機網絡」這門課程的學習路線非常清晰,就是圍繞著如何讓地理位置上不同的計算機連接起來,并高效可靠的交換數據信息,實現人在家中做,天下事盡知。
計算機網絡有分層次,根據各層屬性和特點,分為:
物理層
數據鏈路層
網絡層
傳輸層
應用層
這個層次劃分從上到下就是一個網絡數據包的接收路徑,反之就是發(fā)送路徑。既然要交換信息肯定得商量一套通用的協(xié)議,就像我們和老外交流,要么他們學中文要么我們學英文,反正得統(tǒng)一出一個標準語言出來,這在計算機網絡中稱之為「通信協(xié)議」。如上述的網絡分層,每層都有各自適配的協(xié)議,所以計算機網絡的學習基本就是圍繞著分層協(xié)議的學習。
操作系統(tǒng)
操作系統(tǒng)也是一種軟件。你熟悉的微軟 Windos 操作系統(tǒng),后臺開發(fā)熟悉的各種發(fā)行版的 Linux 系統(tǒng),都是通過軟件的形式安裝在計算機上。
只不過這個軟件和我們平常接觸的應用程序軟件不同,它比較特殊,因為它向下和計算機硬件(就是我們在計算機組成原理中學習的那些硬件)打交道,向上給其他應用程序和用戶提供通用的交互的接口,說白了操作系統(tǒng)就是個中介和管家的角色。它幫我們做了下面這些事情:
進程管理(你寫的程序運行起來才能干活,運行起來的程序稱為進程,進程是資源的最小單位)
內存管理(計算機內存又貴又少,動不動又要來個高并發(fā),內存管理大有學問)
文件管理(計算機中的資料和信息需要通過文件系統(tǒng)來保存、管理)
輸入輸出管理(各種外部設備如何接入計算機和接入之后又如何管理)
數據結構
數據結構大家最熟悉,即使毫無計算機基礎或是想轉行計算機,第一個遇到的就是數據結構,因為面試刷的算法題本質上就是對各種數據結構的運用。所以單純對面試功利的角度來說,數據結構也是必須要掌握的計算機基礎,數據結構要學到:
線性表(鏈表、數組、循環(huán)鏈表)
棧和隊列
樹和各種二叉樹(二叉排序樹、平衡二叉樹、哈夫曼樹、B樹、B+樹、Trie樹)
圖(圖的存儲結構、BFS、DFS、最短路徑、最小生成樹、拓撲排序、關鍵路徑)
查找算法(二分查找、B樹查找、HASH表、KMP字符串模式匹配)
排序算法(插入排序、冒泡排序、歸并排序、基數排序、堆排序)
貪心算法
位運算
分治算法
動態(tài)規(guī)劃
好了,計算機基礎四大專業(yè)課已經大概過了一遍,當然這是我給沒有計算機基礎同學的實用主義建議,等你學完這四門課程也只能夠說入門計算機了,不過這已經比很多人厲害了。如果想真正的了解計算機這門學科,可以等學完了這 4 門基礎課程之后,再花寫時間挑一些上面培養(yǎng)方案中的課程去學習,做一個知識體系完備的計算機軟件后端開發(fā)工程師。
Linux
在后臺開發(fā)領域,你所能接觸到的后端服務不敢說 100%,至少也有 90% 以上是運行在 Linux 系統(tǒng)之上,因為它開源、便利、功能強大,需要學習以下技術點:?
Linux系統(tǒng)使用
所以如果你想走后端開發(fā)這條路線,我建議你趁早使用 Linux ,越早越好??梢允窃趥€人 PC 上裝 Linux 虛擬機,或者裝個雙系統(tǒng),我在大學就是這么玩的,那時候云服務器還沒現在這么普及,現在我覺得買個 Linux 云服務器最方便,如果是學生還有教育優(yōu)惠也不貴。
有了Linux系統(tǒng)之后干嘛呢?把它作為你的常用系統(tǒng),經常登錄進去對照著「鳥哥的 Linux 私房菜」從頭到尾操作一遍,ok,Linux的基礎操作你就掌握了。
Linux 高級編程
Linux「高級編程」的意思是比上面的 Linux 基礎操作更深入一個層次。
學會了 Linux 的使用還不算是一個真正的開發(fā)人員,使用系統(tǒng)是成為開發(fā)者最基本要求,會操作Linux 就像使用 Windows 系統(tǒng)一樣,只不過是學習成本的問題,如果這個世界沒有 Window 系統(tǒng),你女朋友花點時間也能掌握 Linux 系統(tǒng)基本操作。
要想進階成為后端開發(fā)人員,就要懂得如何使用 Linux 系統(tǒng)提供的各種系統(tǒng)API(系統(tǒng)調用接口)進行編程開發(fā),程序員用你寫的代碼來控制系統(tǒng),普通用戶只會用鼠標操縱。這個階段需要學習:
Unix 系統(tǒng)實現 Linux、基本系統(tǒng)數據類型
文件操作函數:?
open
?、read
?close
?write
?dup
?fcntl
?ioctl
?stat
?chmod
access
?chdir
?…系統(tǒng)編程接口的基本特性和高級特性
Linux進程環(huán)境、如何創(chuàng)建進程、線程,程序的存儲空間分配、環(huán)境變量
進程組、會話以及任務控制、進程優(yōu)先級和調度
動態(tài)庫和靜態(tài)庫
進程間通信:管道和FIFO、消息隊列、信號量、共享內存、內存映射
套接字和網絡編程
總之,這一階段需要學習的是在 Linux 環(huán)境下的高級編程技巧,通過對這些內容的學習也能讓你更深入的理解 Linux 系統(tǒng)是如何工作和運行的,并且真正的踏入 Linux 系統(tǒng)編程大門。
網絡編程
網絡編程是通過網絡套接字 socket 方式實現的通信,所以也屬于進程間通信 IPC(Inter-Process Communication)。
由于現在的后臺服務基于服務端/客戶端模型,兩者之間基于網絡通信,你在家用手機點個外賣的服務請求,也是通過網絡通信發(fā)給某團的后臺服務器,所以后臺服務開發(fā),說到底還是網絡編程,以及建立在網絡編程數據之上的應用層開發(fā)。
網絡編程學什么:
什么是socket套接字
套接字選項
TCP/UDP 套接字編程
Unix domain 協(xié)議和編程
原始套接字編程
IO多路復用:select 、poll、epoll、kqueue
序列化技術
零拷貝技術
開源網絡庫:muduo、libevent
學完以上內容你大概可以寫一個類似QQ一樣的網絡聊天小工具。
不在在工作中,都有成熟的網絡框架或網絡通信庫,大公司比如鵝廠大部分是自研網絡通信框架,小公司用開源項目,這讓很多后臺開發(fā)人員不必關心底層的網絡通信細節(jié),除了部分基礎架構的開發(fā)同學,大部分后臺開發(fā)同學工作都是在做業(yè)務系統(tǒng)的開發(fā)。
但了解底層網絡編程原理,是后臺開發(fā)人員的核心能力,這點對于 C/C++ 后臺開發(fā)程序員尤為重要。它能拔高你看問題的高度,不了解底層原理,就像是在黑盒編程一樣,出了問題無從下手排查。
學完了以上內容,基本是具備了從事后臺開發(fā)的基礎能力,也能開發(fā)出一個簡單的后臺服務器了。
數據庫
除非是單純的轉發(fā)路由類后臺服務,一般來說后臺開發(fā)的web服務器后臺程序,后臺服務程序說白了就是個死循環(huán):
接收客戶端數據包 -> 處理數據包 -> 業(yè)務邏輯處理 -> 保存必要的數據 -> 回復響應數據給客戶端
這其中會伴隨對各種數據的處理,比如電商系統(tǒng)會處理訂單數據、用戶數據,游戲后臺會處理角色數據和裝備數據等等,有數據就會涉及到存儲系統(tǒng),數據一般都存儲到數據庫。
主要學習 2 大類數據庫:
關系型數據庫是指采用了關系模型來組織數據的數據庫,簡單理解就是二維表格模型。
非關系型數據庫一般指的是?key-value
?形式存儲數據的 NoSQL 數據庫,數據和鍵值是簡單的映射關系。
關系型數據庫
MySQL 數據庫架構
MySQL索引使用和優(yōu)化
innoDB存儲引擎
查詢性能優(yōu)化
聚集索引、非聚集索引
事務隔離,ACID,MVCC
鎖機制,樂觀鎖、悲觀鎖、讀鎖、寫鎖、意向鎖
日志
數據備份與恢復
非關系型數據庫
redis 基本操作和使用
redis 設計與實現原理
MongoDB
levelDB
memcache
HBase
CKV+ 騰訊自研
后臺開發(fā)服務還需要學會解決三高問題:高并發(fā)、高可用、高性能。
高并發(fā)
利用到目前為止學習的內容,我們的開發(fā)的后臺服務器應付一些小并發(fā)場景綽綽有余,但是隨著互聯(lián)網應用業(yè)務量的上漲,對后臺服務端的請求數劇增,高并發(fā)需求隨之而來,高并發(fā)指的就是高 TPS 和高 QPS
TPS (Transactions Per Second)每秒事務數
QPS(Query Per Second)每秒查詢數等。
對于高并發(fā)服務必須改變傳統(tǒng)的單進程模型,才能處理的過來如此海量的請求。
多進程
對于高并發(fā)的服務請求,由于后臺服務一般都是 IO 密集型應用,IO 密集型應用就是大部分 CPU 時間用在網絡 IO 上,相對的是 CPU 密集型應用大部分時間花在數據計算上。
大多數的后臺服務程序都是 IO 密集型的應用,網絡 IO 的時候 CPU 等待白白浪費時間, 這就告訴我們 CPU 的潛力還沒有完全發(fā)揮,所以當一個進程的處理能力達到上限,我們可以多創(chuàng)建幾個進程,這就是多進程模型。
多線程
多線程與多進程類似,實際在Linux系統(tǒng)中線程是由輕量級的進程 LWP(Light-weight process)實現,多線程方式實現的后臺服務相對于多進程更加輕量,因為多線程是在同一個進程內部實現。
不過多線程也會帶來新的問題,比如全局數據競爭和同步問題,引入線程鎖還要防止死鎖的發(fā)生。
協(xié)程
那什么是協(xié)程呢?協(xié)程?Coroutines
?是一種比線程更加輕量級的微線程。類比一個進程可以擁有多個線程,一個線程也可以擁有多個協(xié)程,因此協(xié)程又稱微線程和纖程??梢源致缘陌褏f(xié)程理解成子程序調用,每個子程序都可以在一個單獨的協(xié)程內執(zhí)行。
異步回調
所謂異步回調就是,服務端發(fā)起 IO 請求的線程不等網絡 IO 線程操作完成,就繼續(xù)執(zhí)行隨后的代碼,一般請求線程需要先注冊一個回調函數,當IO 完成之后網絡IO線程通過調用之前注冊的回調函數來通知發(fā)起 IO 請求的線程,這樣發(fā)起請求的線程就不會阻塞住等待結果,提高了服務處理性能。
高性能
按以上服務模型可以提高服務本身處理能力,高性能后臺服務往往還會利用多種技術、從多個維度優(yōu)化提高性能。比如采用CDN(Content Delivery Network)內容分發(fā)網絡,存儲和分發(fā)使用戶就近獲取內容,縮短響應時間;采用池化技術,避免頻繁的資源分配與回收;采用服務集群,橫向擴展服務能力;采用緩存技術,熱點數據加入緩存,減少數據庫訪問。
CND 內容分發(fā)技術
池化技術:數據庫連接池,線程池
集群化
緩存技術
高可用
高可用即保證服務的穩(wěn)定性,不出現重大問題或宕機,常見的解決高可用思路是冗余和負載均衡。冗余的意思就是多部署幾臺服務器,當其中一臺掛掉另外一臺能頂上。通過負載均衡技術實現對流量的動態(tài)調配,不至于出現大量流量沖擊某臺機器出現請求不均勻,軟件負載均衡技術可以通過DNS、Nginx、LVS等技術實現。這里主要學習的技術有:
負載均衡技術,軟硬件負載均衡
限流隔離降級技術
應用層容災,資源隔離熔斷
異地多活
設計模式
設計模式代表著軟件開發(fā)的一種最佳實踐。已經經歷了很長一段時間的發(fā)展,它們提供了軟件開發(fā)過程中面臨的一般問題的最佳解決方案。學習這些模式有助于經驗不足的開發(fā)人員通過一種簡單快捷的方式來學習軟件設計,當設計大規(guī)模軟件時遵循必要的設計模式能讓寫出的代碼更加健壯和可擴展。
設計模式 6 大原則:
開閉原則:對擴展開放,對修改關閉,多使用抽象類和接口。
里氏替換原則:基類可以被子類替換,使用抽象類繼承,不使用具體類繼承。
依賴倒轉原則:要依賴于抽象,不要依賴于具體,針對接口編程,不針對實現編程。
接口隔離原則:使用多個隔離的接口,比使用單個接口好,建立最小的接口。
迪米特法則:一個軟件實體應當盡可能少地與其他實體發(fā)生相互作用,通過中間類建立聯(lián)系。
合成復用原則:盡量使用合成/聚合,而不是使用繼承。
常見設計模式分類
工廠模式
單例模式
建造者模式
適配器模式
橋接模式
過濾器模式
裝飾器模式
外觀模式
享元模式
代理模式
責任鏈模式
解釋器模式
迭代器模式
觀察者模式
…
分布式
為什么會出現分布式?隨著業(yè)務的體量不斷增長,單個節(jié)點的處理能力無法滿足日益增長的計算、存儲任務的時候,且硬件的提升(加內存、加磁盤、使用更好的CPU)高昂到得不償失的時候,應用程序也不能進一步優(yōu)化的時候,我們才需要考慮分布式系統(tǒng)。
分布式系統(tǒng)是由一組通過網絡進行通信、為了完成共同的任務而協(xié)調工作的計算機節(jié)點組成的系統(tǒng)。分布式系統(tǒng)的出現是為了用廉價的、普通的機器完成單個計算機無法完成的計算、存儲任務。其目的是利用更多的機器,處理更多的數據。
分布式系統(tǒng)要解決的問題本身就是和單機系統(tǒng)一樣的,而由于分布式系統(tǒng)多節(jié)點、通過網絡通信的拓撲結構,會引入很多單機系統(tǒng)沒有的問題,為了解決這些問題又會引入更多的機制、協(xié)議。這里需要學習的內容包括:
分布式一致性算法:PAXOS、Raft、Zab
分布式事務:2PC、3PC、TCC
分布式唯一 ID 生成:雪花算法、UUID、淘寶 TDDL SEQUENCE方案、美團 Leaf
一致性HASH算法
擴展性設計,設計可擴展的軟件架構
分布式文件系統(tǒng):HDFS、FastDFS
微服務架構設計,服務注冊、服務發(fā)現、服務路由
安全
本質上后臺服務在網絡上運行,需要和各種網絡環(huán)境交互,在正常情況下能夠工作,但互聯(lián)網中有很多針對后臺服務的惡意攻擊,因此網絡安全也是后臺開發(fā)工程師需要學習的內容。這里主要包括:
web安全:CSRF、SQL注入、XSS
DDos防范
加解密算法:對稱加密、哈希算法、非對稱加密
網絡隔離:內外網分離、跳板機
授權認證算法:OAuth2.0、OIDC、2FA、單點登錄SSO
監(jiān)控與統(tǒng)計
后臺服務運行我們如何了解其運行狀態(tài)和健康度?如果只是開發(fā)小玩具監(jiān)控和統(tǒng)計大可不必,只需記錄本地日志即可,對于成熟的大型后臺服務系統(tǒng),監(jiān)控、統(tǒng)計、追蹤必不可少,無監(jiān)控,不運營。
開源的監(jiān)控軟件有:Prometheus、Zabbix、Open-Falcon。
追蹤系統(tǒng)也非常重要,特別是目前微服務化,一次服務請求需要經歷多個不同的微服務處理,給分布式追蹤帶來新的挑戰(zhàn),主要包含以下三個方面:
通過收集日志(Logging),記錄程序的調試信息或錯誤信息,對系統(tǒng)和各個服務的運行狀態(tài)進行監(jiān)控
通過收集量度(Metrics),比如累加量,對系統(tǒng)和各個服務的性能進行監(jiān)控
通過分布式追蹤(Tracing ),追蹤服務請求是如何在各個分布的組件中進行處理的細節(jié)
業(yè)界也有一些成熟的開源軟件用于監(jiān)控與追蹤:SkyWalking、Pinpoint、Zipkin、CAT大眾點評開源。不過大公司一般都有自研的一套監(jiān)控與追蹤系統(tǒng),比如騰訊內部就有多套自研監(jiān)控與調用鏈追蹤系統(tǒng)。
搜索引擎
我們討論的是全文搜索引擎,什么是全文搜索引擎?
全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,并將查找的結果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。
數據分為結構化數據與非結構化數據
像數據庫表這種的數據是結構化數據;而對于像HTML、XML、文檔這樣不定長度且無固定格式的數據我們稱之為非結構化數據。非結構化數據也稱為全文數據,對非結構化數據的搜索可以用全文檢索的方式,
目前兩大主流的全文搜索引擎「Solr」和「Elasticsearch」都是基于 Lucene 建立。搜索引擎需要學習的內容:
搜索引擎原理,搜索引擎利用倒排索引技術來實現對全文數據的高效檢索。
Lucene,Apache Lucene 是一個開源的全文搜索引擎工具包。
Elasticsearch 原理與使用
Solr 原理與使用
大數據
大數據,又稱為巨量資料,指的是在傳統(tǒng)數據處理應用軟件不足以處理的大或復雜的數據集的術語。隨著后臺服務用戶數增加和數據的積累,產生海量有待挖掘價值的數據,分析利用這些數據可以反饋線上決策,優(yōu)化運營策略,產生數據價值。
海量數據也可以定義為來自各種來源的大量非結構化或結構化數據。
在軟件開發(fā)領域的大數據概念自 20 世紀 90 年代的數據倉庫開始,對于大數據的處理也導致各種海量數據的統(tǒng)計和處理技術發(fā)展。
主要包含以下的技術點需要學習:數據存儲、離線分析、流式計算。
大數據存儲:Hadoop 框架,HDFS、HBase、YARN 架構、Apache Kudu
離線分析:Hive、MapReduce、Spark
流式計算:Flink、Storm、Kafka Stream、Spark Streaming
虛擬化
虛擬化,是指通過虛擬化技術將一臺計算機虛擬為多臺邏輯計算機。
虛擬化的好處
靈活性:在同一硬件上同時運行多個操作系統(tǒng)
敏捷性:移動操作系統(tǒng)的方式與將文件或圖片從一臺物理服務器移動到另一臺物理服務器的方式相同。
容錯:當物理服務器出現故障時,管理軟件會自動將實例遷移到可用服務器,甚至無感知物理硬件故障。
降低成本:您不再需要過多的物理服務器,操作和維護所需的費用也隨之減少。
常見的虛擬化技術:KVM、Xen、OpenVZ、Docker
雖然對于大多數后臺服務程序來說, 很多服務都是部署在 Docker 容器里,但 Docker 共用了底層系統(tǒng)的 kernel,所有容器共用一部分的運行庫,因此隔離性相比 KVM 之類的虛擬化技術差一點,KVM 與 Docker 有各自的使用場景,未來很長一段時間是共存狀態(tài)。
OpenStack 管理 VM(Virtual Machine)虛擬機的工具;Kubernetes 簡稱 K8s ,是管理 container 容器的工具。
中間件
在后端開發(fā)中你可能經常聽說到「中間件」這個詞,那什么是中間件?看下Wiki上的定義:
中間件技術創(chuàng)建在對應用軟件部分常用功能的抽象上,將常用且重要的過程調用、分布式組件、消息隊列、事務、安全、鏈接器、商業(yè)流程、網絡并發(fā)、HTTP 服務器、Web Service?等功能集于一身或者分別在不同品牌的不同產品中分別完成。
中國科學院軟件所研究員仲萃豪把中間件定義為「平臺+通信」。這個定義限定了只有用于分布式系統(tǒng)中的此類軟件才能被稱為中間件,同時此定義也把中間件與實際應用的應用軟件區(qū)分開來。
大白話來說,中間件就是把分布式系統(tǒng)中一些通用功能的抽象出來提供服務的一類軟件統(tǒng)稱。它屏蔽掉了底層操作系統(tǒng)的復雜性,向上提供一個統(tǒng)一的開發(fā)環(huán)境,降低了軟件系統(tǒng)開發(fā)的復雜度,由于中間件是介于操作系統(tǒng)和應用軟件之間,為應用軟件提供服務功能的軟件,由于介于兩種軟件之間,所以稱為中間件。
常見的的開源中間件有下面幾種,組合起來就能搭建一個完整的分布式后臺服務系統(tǒng):
web server 中間件,Nginx、OpenResty、Tomcat…
緩存中間件,服務端緩存包括 Redis、Memcached…
消息隊列中間件,Kafka、RabbitMQ、ActiveMQ…
RPC框架,Tars、Dubbo、gRPC、Thrift
數據庫中間件,Sharding jdbc
日志系統(tǒng)中間件,ELK B指的是一套解決方案,是 Elasticsearch、Logstash 、 Kibana、Beats 是這 4 種軟件產品的首字母縮寫。
配置中心中間件,Apollo、zookeeper統(tǒng)一配置管理
API網關,開源項目有 Tyk、kong、zuul、orange…
版本控制
大型軟件項目的代碼量巨大,如何有效組織和管理源碼和版本,于是產生了版本控制系統(tǒng)。版本控制系統(tǒng)就是我們常說的SVN 或 Git,用來追蹤、維護源碼、文件以及配置文件等等的改動,并且提供控制這些改動控制權的程序。
常見的版本控制系統(tǒng)分為兩大類:集中式版本控制和分布式版本控制。作為后端開發(fā)工程師,版本控制系統(tǒng)的使用也是必須掌握的基礎技能,不過這些系統(tǒng)一般都是邊使用邊熟悉,剛開始熟悉一些常用操作就好。
常見的有集中式版本控制系統(tǒng),代表是SVN;
分布式版本控制系統(tǒng),代表是Git
工具
一些和后端開發(fā)或者說軟件開發(fā)相關的工具推薦,主要是編輯器和 IDE。
編輯器
在 Linux 下開發(fā)肯定離不開 Vim 或者 Emacs,這兩個都是常用的編輯器,已經形成了兩大愛好者陣營。特別是 Vim 編輯器,學習成本有點高,配合上各種插件和配置,有些 Vim 愛好者已經把它當成 IDE 來用了,一旦掌握可以大幅提升工作效率,值得你去學習。
當然除了 Vim 如果是文字編輯工作,比如寫 README 文檔或者寫技術博客,那么強烈推薦學習下 Markdown 語法,這是一種種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,注重內容本身不用過多的調整排版。Markdown 編輯器推薦 Typora 、有道云筆記 Markdown 編輯器、VSCode Markdown插件。
IDE
編輯器作為小工程還可以勝任,不過后端開發(fā)工作中,一般都是大型的軟件工程項目,所以不大可能用編輯器來管理,這時候就需要學習使用專業(yè)的集成開發(fā)工具。
集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應用程序,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。
磨刀不誤砍柴工,挑一把趁手的兵器再去編程世界遨游。各語言 IDE 五花八門,推薦 JetBrains 系列和 VS Code ,JetBrains 產品包括各語言開發(fā)的一系列的 IDE,特別是Java 的Intellij IDEA 口碑非常不錯,部分對應的產品系列如下。
CLion - 跨平臺的C/C++ IDE 開發(fā)工具,支持C++11 、C++14、libc++以及Boost。
GoLand - Go語言的集成開發(fā)環(huán)境。
IntelliJ IDEA - 2001年發(fā)布。一套智能的 Java 集成開發(fā)環(huán)境,特別專注與強調程序師的開發(fā)撰寫效率提升。
PhpStorm - PHP IDE開發(fā)工具。
PyCharm - 一款結合了Django框架的Python IDE開發(fā)工具。
AppCode - Swift 和 Objective-C IDE開發(fā)工具。
Visual Studio Code(簡稱VS Code)是一個由微軟開發(fā),同時支持Windows 、 Linux和macOS等操作系統(tǒng)的免費代碼編輯器,它支持測試,并內置了Git 版本控制功能,同時也具有開發(fā)環(huán)境功能,例如代碼補全(類似于 IntelliSense)、代碼片段和代碼重構等。該編輯器支持用戶個性化配置,例如改變主題顏色、鍵盤快捷方式等各種屬性和參數,同時還在編輯器中內置了擴展程序管理的功能。
在2019年的 Stack Overflow 組織的開發(fā)者調研中,VS Code被認為是最受開發(fā)者歡迎的開發(fā)環(huán)境。
測試
軟件工程師不僅要寫代碼,還要做測試,軟件測試和軟件開發(fā)是相伴相生,測試能讓保證我們寫出代碼更加健壯和可維護。
TDD是測試驅動開發(fā)(Test-Driven Development)的英文簡稱,是敏捷開發(fā)中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,根據測試代碼確定需要編寫什么產品代碼。需要掌握和了解以下測試技術和方法。
單元測試
壓力測試
全鏈路測試
A/B 測試,灰度發(fā)布,藍綠部署
學習順序
總結下,后端技術學習的內容還是很多的,不可能一蹴而就。
這篇文章能看到這里的同學,如果是初學者,可能就想問直接問我從哪里開始學習?那我就不賣關子,如果你不知道從哪開始學,對于學習路線各個節(jié)點,我就按個人的學習經驗并結合認識的大廠高 P 給的建議,給你把以上技術路線學習優(yōu)先級做個排序,你照著學就行,排序規(guī)則:
星級越高,排名越靠前,重要程度越高,優(yōu)先安排時間學習。
計算機基礎 5星
Linux 5 星
數據庫 5 星
設計模式 5 星
工具 5 星
中間件 4 星
分布式 4 星
高并發(fā)、高可用、高性能 4 星
搜索引擎 4 星
測試 3 星
監(jiān)控與統(tǒng)計 3 星
虛擬化 3 星
安全 3 星
大數據 3 星
語言的困惑
細心的讀者應該發(fā)現了,到目前為止本文討論的后端技術學習路線內容,并沒有提及特定編程語言,不提及并不是說不重要,語言是很多技術的前置知識。打個比方來說,編程語言是磚瓦,高大上的項目都是一磚一瓦堆砌而成。
其實你在學習上述技術點的過程中,會自然而然的接觸到各種編程語言的中間件或是開源項目,不管用什么語言做后端服務開發(fā),都是沒有問題的,并且都不有很多優(yōu)秀的開源框架可以借鑒學習,關鍵是要有清晰的學習路線,主流的后端開發(fā)語言包括 Java、C++、PHP、Python、Go ,那學哪個呢?
如果你是在校的學生,時間充足,我建議可以都可以嘗試下,不試過怎么知道不合適?然后結合自己偏愛和未來打算從事的崗位方向選擇一門語言深入學習;
如果你是職場社畜,那就要適應團隊,產品業(yè)務需要用什么語言開發(fā)那就學哪個。萬變不離其宗,后端技術的知識都是相通的,不要被特定語言所束縛,這些通用的后端技術掌握后,剩下的就只是編程語言學習,很快啊,很快的。
結語
這篇文章我從月初開始整理內容、繪制思維導圖,真真是肝了半個月之久。創(chuàng)作過程中,我把自己從初級開發(fā)人員到現在高級工程師,這些年學習的技術都在腦子里過了一遍。
說來慚愧有些我畫在導圖上的技術我也只是懂點皮毛,但整個后端技術棧的學習路線和方向是沒問題的,我都畫出來了,大家參考著學習和查漏補缺,在技術上我也需要繼續(xù)精進學習,咱們共勉。
高清路線大圖
小林已經放到公眾號里了
后臺回復「后端」即可獲取
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!