當(dāng)前位置:首頁 > 公眾號精選 > 小林coding
[導(dǎo)讀]不管是后端開發(fā)還是前端開發(fā),說到底我們所有的軟件開發(fā)都是在計算上編寫程序,雖然對于大部分人來說,真正開始寫代碼的時候很少會讓你去解決計算機底層的問題,不接觸不代表不重要,計算機基礎(chǔ)是最重要的。

話不多說,直接上剛畫完的「后端技術(shù)學(xué)習(xí)路線」思維導(dǎo)圖框架:

圖中的每一個節(jié)點都可以點開,我都做了細(xì)分,在后面章節(jié)逐個展開介紹。


計算機基礎(chǔ)

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

后端開發(fā)工作中經(jīng)常用到 Java、C++、Python、Golang 這些語言稱為高級編程語言,稱為高級是它們接近我們?nèi)粘=涣鞯淖匀徽Z言,離計算機底層遠(yuǎn),但所有的高級語言最終都會轉(zhuǎn)化成匯編->計算機指令->控制流操控計算機硬件,所以學(xué)習(xí)計算機構(gòu)成和工作原理、操作系統(tǒng)這些基礎(chǔ)知識,能夠加深我們隊高級語言的理解。

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

一流大學(xué)的計算機專業(yè)要學(xué)什么可以對照著看下,從學(xué)科數(shù)學(xué)理論基礎(chǔ)、計算機體系結(jié)構(gòu)、軟件工程方法等等維度展開。

那如果你不是計算機相關(guān)專業(yè)的想轉(zhuǎn)行,也不要被嚇到了,畢竟這是人家四年時間的學(xué)習(xí)內(nèi)容,本科的培養(yǎng)目標(biāo)不僅僅是培養(yǎng)出一個軟件工程師,本科學(xué)習(xí)還是面向碩士博士的基礎(chǔ)培養(yǎng),注意是計算機科學(xué)專業(yè),名字里有個詞叫「科學(xué)」,我這篇文章要說的 BAT 公司后臺軟件開發(fā),可以認(rèn)為是「工學(xué)」方向,更多的是服務(wù)于工程開發(fā)。

如果只是面向后臺開發(fā)和工作面試,或者你是非計算機專業(yè)想轉(zhuǎn)行,社畜沒有太多時間去學(xué)習(xí)大學(xué)那些理論課程,那幫我把計算機基礎(chǔ)的范圍縮小到下面這 4 門專業(yè)課:計算機組成原理、計算機網(wǎng)路、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)。

計算機組成原理

這門課程讓你了解計算機的組成和工作原理,要學(xué)習(xí)的內(nèi)容包括:

  • 數(shù)據(jù)在計算機中的表示和運算(計算機不識數(shù),只認(rèn)得高低電平,所以數(shù)據(jù)在計算機內(nèi)部都用二進制的0和1表示)

  • 存儲系統(tǒng)(數(shù)據(jù)和程序指令都要存儲下來,學(xué)習(xí)計算機的存儲層次,內(nèi)存、外存、高速緩存、虛擬存儲技術(shù))

  • 指令系統(tǒng)(寫的代碼最終都要被翻譯成計算機指令,指令格式和尋址方式有多種,控制器來控制指令執(zhí)行)

  • 中央處理器(也就是 CPU 計算機的大腦,主要構(gòu)成是運算器和控制器)

  • 總線(計算機的血管動脈,連接計算機各功能組件,用來傳輸數(shù)據(jù)、地址信號、控制信號)

  • 輸入輸出系統(tǒng)(Input/Output 也叫 IO 系統(tǒng),連接和管理各種外部設(shè)備比如鍵盤、顯示器等等)

計算機網(wǎng)絡(luò)

世界上第一臺通用計算機「ENIAC」于 1946 被發(fā)明出來,如其名字一樣僅僅是用于計算,在后來計算機越來越多,如果沒有網(wǎng)絡(luò)每臺計算機都將成為一個孤島,也不會有現(xiàn)在互聯(lián)網(wǎng)的繁榮,「計算機網(wǎng)絡(luò)」這門課程的學(xué)習(xí)路線非常清晰,就是圍繞著如何讓地理位置上不同的計算機連接起來,并高效可靠的交換數(shù)據(jù)信息,實現(xiàn)人在家中做,天下事盡知。

計算機網(wǎng)絡(luò)有分層次,根據(jù)各層屬性和特點,分為:

  • 物理層

  • 數(shù)據(jù)鏈路層

  • 網(wǎng)絡(luò)層

  • 傳輸層

  • 應(yīng)用層

這個層次劃分從上到下就是一個網(wǎng)絡(luò)數(shù)據(jù)包的接收路徑,反之就是發(fā)送路徑。既然要交換信息肯定得商量一套通用的協(xié)議,就像我們和老外交流,要么他們學(xué)中文要么我們學(xué)英文,反正得統(tǒng)一出一個標(biāo)準(zhǔn)語言出來,這在計算機網(wǎng)絡(luò)中稱之為「通信協(xié)議」。如上述的網(wǎng)絡(luò)分層,每層都有各自適配的協(xié)議,所以計算機網(wǎng)絡(luò)的學(xué)習(xí)基本就是圍繞著分層協(xié)議的學(xué)習(xí)。


操作系統(tǒng)

操作系統(tǒng)也是一種軟件。你熟悉的微軟 Windos 操作系統(tǒng),后臺開發(fā)熟悉的各種發(fā)行版的 Linux 系統(tǒng),都是通過軟件的形式安裝在計算機上。

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

  • 進程管理(你寫的程序運行起來才能干活,運行起來的程序稱為進程,進程是資源的最小單位)

  • 內(nèi)存管理(計算機內(nèi)存又貴又少,動不動又要來個高并發(fā),內(nèi)存管理大有學(xué)問)

  • 文件管理(計算機中的資料和信息需要通過文件系統(tǒng)來保存、管理)

  • 輸入輸出管理(各種外部設(shè)備如何接入計算機和接入之后又如何管理)

數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)大家最熟悉,即使毫無計算機基礎(chǔ)或是想轉(zhuǎn)行計算機,第一個遇到的就是數(shù)據(jù)結(jié)構(gòu),因為面試刷的算法題本質(zhì)上就是對各種數(shù)據(jù)結(jié)構(gòu)的運用。所以單純對面試功利的角度來說,數(shù)據(jù)結(jié)構(gòu)也是必須要掌握的計算機基礎(chǔ),數(shù)據(jù)結(jié)構(gòu)要學(xué)到:

  • 線性表(鏈表、數(shù)組、循環(huán)鏈表)

  • 棧和隊列

  • 樹和各種二叉樹(二叉排序樹、平衡二叉樹、哈夫曼樹、B樹、B+樹、Trie樹)

  • 圖(圖的存儲結(jié)構(gòu)、BFS、DFS、最短路徑、最小生成樹、拓?fù)渑判颉㈥P(guān)鍵路徑)

  • 查找算法(二分查找、B樹查找、HASH表、KMP字符串模式匹配)

  • 排序算法(插入排序、冒泡排序、歸并排序、基數(shù)排序、堆排序)

  • 貪心算法

  • 位運算

  • 分治算法

  • 動態(tài)規(guī)劃

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


Linux

在后臺開發(fā)領(lǐng)域,你所能接觸到的后端服務(wù)不敢說 100%,至少也有 90% 以上是運行在 Linux 系統(tǒng)之上,因為它開源、便利、功能強大,需要學(xué)習(xí)以下技術(shù)點:?

Linux系統(tǒng)使用

所以如果你想走后端開發(fā)這條路線,我建議你趁早使用 Linux ,越早越好??梢允窃趥€人 PC 上裝 Linux 虛擬機,或者裝個雙系統(tǒng),我在大學(xué)就是這么玩的,那時候云服務(wù)器還沒現(xiàn)在這么普及,現(xiàn)在我覺得買個 Linux 云服務(wù)器最方便,如果是學(xué)生還有教育優(yōu)惠也不貴。

有了Linux系統(tǒng)之后干嘛呢?把它作為你的常用系統(tǒng),經(jīng)常登錄進去對照著「鳥哥的 Linux 私房菜」從頭到尾操作一遍,ok,Linux的基礎(chǔ)操作你就掌握了。

Linux 高級編程

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

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

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

  • Unix 系統(tǒng)實現(xiàn) Linux、基本系統(tǒng)數(shù)據(jù)類型

  • 文件操作函數(shù):?open?、read?close?write?dup?fcntl?ioctl?stat?chmodaccess?chdir?…

  • 系統(tǒng)編程接口的基本特性和高級特性

  • Linux進程環(huán)境、如何創(chuàng)建進程、線程,程序的存儲空間分配、環(huán)境變量

  • 進程組、會話以及任務(wù)控制、進程優(yōu)先級和調(diào)度

  • 動態(tài)庫和靜態(tài)庫

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

  • 套接字和網(wǎng)絡(luò)編程

總之,這一階段需要學(xué)習(xí)的是在 Linux 環(huán)境下的高級編程技巧,通過對這些內(nèi)容的學(xué)習(xí)也能讓你更深入的理解 Linux 系統(tǒng)是如何工作和運行的,并且真正的踏入 Linux 系統(tǒng)編程大門。

網(wǎng)絡(luò)編程

網(wǎng)絡(luò)編程是通過網(wǎng)絡(luò)套接字 socket 方式實現(xiàn)的通信,所以也屬于進程間通信 IPC(Inter-Process Communication)。

由于現(xiàn)在的后臺服務(wù)基于服務(wù)端/客戶端模型,兩者之間基于網(wǎng)絡(luò)通信,你在家用手機點個外賣的服務(wù)請求,也是通過網(wǎng)絡(luò)通信發(fā)給某團的后臺服務(wù)器,所以后臺服務(wù)開發(fā),說到底還是網(wǎng)絡(luò)編程,以及建立在網(wǎng)絡(luò)編程數(shù)據(jù)之上的應(yīng)用層開發(fā)。

網(wǎng)絡(luò)編程學(xué)什么:

  • 什么是socket套接字

  • 套接字選項

  • TCP/UDP 套接字編程

  • Unix domain 協(xié)議和編程

  • 原始套接字編程

  • IO多路復(fù)用:select 、poll、epoll、kqueue

  • 序列化技術(shù)

  • 零拷貝技術(shù)

  • 開源網(wǎng)絡(luò)庫:muduo、libevent

學(xué)完以上內(nèi)容你大概可以寫一個類似QQ一樣的網(wǎng)絡(luò)聊天小工具。

不在在工作中,都有成熟的網(wǎng)絡(luò)框架或網(wǎng)絡(luò)通信庫,大公司比如鵝廠大部分是自研網(wǎng)絡(luò)通信框架,小公司用開源項目,這讓很多后臺開發(fā)人員不必關(guān)心底層的網(wǎng)絡(luò)通信細(xì)節(jié),除了部分基礎(chǔ)架構(gòu)的開發(fā)同學(xué),大部分后臺開發(fā)同學(xué)工作都是在做業(yè)務(wù)系統(tǒng)的開發(fā)。

但了解底層網(wǎng)絡(luò)編程原理,是后臺開發(fā)人員的核心能力,這點對于 C/C++ 后臺開發(fā)程序員尤為重要。它能拔高你看問題的高度,不了解底層原理,就像是在黑盒編程一樣,出了問題無從下手排查。

學(xué)完了以上內(nèi)容,基本是具備了從事后臺開發(fā)的基礎(chǔ)能力,也能開發(fā)出一個簡單的后臺服務(wù)器了。


數(shù)據(jù)庫

除非是單純的轉(zhuǎn)發(fā)路由類后臺服務(wù),一般來說后臺開發(fā)的web服務(wù)器后臺程序,后臺服務(wù)程序說白了就是個死循環(huán):

接收客戶端數(shù)據(jù)包 -> 處理數(shù)據(jù)包 -> 業(yè)務(wù)邏輯處理 -> 保存必要的數(shù)據(jù) -> 回復(fù)響應(yīng)數(shù)據(jù)給客戶端

這其中會伴隨對各種數(shù)據(jù)的處理,比如電商系統(tǒng)會處理訂單數(shù)據(jù)、用戶數(shù)據(jù),游戲后臺會處理角色數(shù)據(jù)和裝備數(shù)據(jù)等等,有數(shù)據(jù)就會涉及到存儲系統(tǒng),數(shù)據(jù)一般都存儲到數(shù)據(jù)庫。

主要學(xué)習(xí) 2 大類數(shù)據(jù)庫:

關(guān)系型數(shù)據(jù)庫是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,簡單理解就是二維表格模型。

非關(guān)系型數(shù)據(jù)庫一般指的是?key-value?形式存儲數(shù)據(jù)的 NoSQL 數(shù)據(jù)庫,數(shù)據(jù)和鍵值是簡單的映射關(guān)系。

關(guān)系型數(shù)據(jù)庫

  • MySQL 數(shù)據(jù)庫架構(gòu)

  • MySQL索引使用和優(yōu)化

  • innoDB存儲引擎

  • 查詢性能優(yōu)化

  • 聚集索引、非聚集索引

  • 事務(wù)隔離,ACID,MVCC

  • 鎖機制,樂觀鎖、悲觀鎖、讀鎖、寫鎖、意向鎖

  • 日志

  • 數(shù)據(jù)備份與恢復(fù)

非關(guān)系型數(shù)據(jù)庫

  • redis 基本操作和使用

  • redis 設(shè)計與實現(xiàn)原理

  • MongoDB

  • levelDB

  • memcache

  • HBase

  • CKV+ 騰訊自研

后臺開發(fā)服務(wù)還需要學(xué)會解決三高問題:高并發(fā)、高可用、高性能。


高并發(fā)

利用到目前為止學(xué)習(xí)的內(nèi)容,我們的開發(fā)的后臺服務(wù)器應(yīng)付一些小并發(fā)場景綽綽有余,但是隨著互聯(lián)網(wǎng)應(yīng)用業(yè)務(wù)量的上漲,對后臺服務(wù)端的請求數(shù)劇增,高并發(fā)需求隨之而來,高并發(fā)指的就是高 TPS 和高 QPS

  • TPS (Transactions Per Second)每秒事務(wù)數(shù)

  • QPS(Query Per Second)每秒查詢數(shù)等。

對于高并發(fā)服務(wù)必須改變傳統(tǒng)的單進程模型,才能處理的過來如此海量的請求。

多進程

對于高并發(fā)的服務(wù)請求,由于后臺服務(wù)一般都是 IO 密集型應(yīng)用,IO 密集型應(yīng)用就是大部分 CPU 時間用在網(wǎng)絡(luò) IO 上,相對的是 CPU 密集型應(yīng)用大部分時間花在數(shù)據(jù)計算上。

大多數(shù)的后臺服務(wù)程序都是 IO 密集型的應(yīng)用,網(wǎng)絡(luò) IO 的時候 CPU 等待白白浪費時間, 這就告訴我們 CPU 的潛力還沒有完全發(fā)揮,所以當(dāng)一個進程的處理能力達到上限,我們可以多創(chuàng)建幾個進程,這就是多進程模型。

多線程

多線程與多進程類似,實際在Linux系統(tǒng)中線程是由輕量級的進程 LWP(Light-weight process)實現(xiàn),多線程方式實現(xiàn)的后臺服務(wù)相對于多進程更加輕量,因為多線程是在同一個進程內(nèi)部實現(xiàn)。

不過多線程也會帶來新的問題,比如全局?jǐn)?shù)據(jù)競爭和同步問題,引入線程鎖還要防止死鎖的發(fā)生。

協(xié)程

那什么是協(xié)程呢?協(xié)程?Coroutines?是一種比線程更加輕量級的微線程。類比一個進程可以擁有多個線程,一個線程也可以擁有多個協(xié)程,因此協(xié)程又稱微線程和纖程。可以粗略的把協(xié)程理解成子程序調(diào)用,每個子程序都可以在一個單獨的協(xié)程內(nèi)執(zhí)行。

異步回調(diào)

所謂異步回調(diào)就是,服務(wù)端發(fā)起 IO 請求的線程不等網(wǎng)絡(luò) IO 線程操作完成,就繼續(xù)執(zhí)行隨后的代碼,一般請求線程需要先注冊一個回調(diào)函數(shù),當(dāng)IO 完成之后網(wǎng)絡(luò)IO線程通過調(diào)用之前注冊的回調(diào)函數(shù)來通知發(fā)起 IO 請求的線程,這樣發(fā)起請求的線程就不會阻塞住等待結(jié)果,提高了服務(wù)處理性能。


高性能

按以上服務(wù)模型可以提高服務(wù)本身處理能力,高性能后臺服務(wù)往往還會利用多種技術(shù)、從多個維度優(yōu)化提高性能。比如采用CDN(Content Delivery Network)內(nèi)容分發(fā)網(wǎng)絡(luò),存儲和分發(fā)使用戶就近獲取內(nèi)容,縮短響應(yīng)時間;采用池化技術(shù),避免頻繁的資源分配與回收;采用服務(wù)集群,橫向擴展服務(wù)能力;采用緩存技術(shù),熱點數(shù)據(jù)加入緩存,減少數(shù)據(jù)庫訪問。

  • CND 內(nèi)容分發(fā)技術(shù)

  • 池化技術(shù):數(shù)據(jù)庫連接池,線程池

  • 集群化

  • 緩存技術(shù)


高可用

高可用即保證服務(wù)的穩(wěn)定性,不出現(xiàn)重大問題或宕機,常見的解決高可用思路是冗余和負(fù)載均衡。冗余的意思就是多部署幾臺服務(wù)器,當(dāng)其中一臺掛掉另外一臺能頂上。通過負(fù)載均衡技術(shù)實現(xiàn)對流量的動態(tài)調(diào)配,不至于出現(xiàn)大量流量沖擊某臺機器出現(xiàn)請求不均勻,軟件負(fù)載均衡技術(shù)可以通過DNS、Nginx、LVS等技術(shù)實現(xiàn)。這里主要學(xué)習(xí)的技術(shù)有:

  • 負(fù)載均衡技術(shù),軟硬件負(fù)載均衡

  • 限流隔離降級技術(shù)

  • 應(yīng)用層容災(zāi),資源隔離熔斷

  • 異地多活


設(shè)計模式

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

設(shè)計模式 6 大原則:

  • 開閉原則:對擴展開放,對修改關(guān)閉,多使用抽象類和接口。

  • 里氏替換原則:基類可以被子類替換,使用抽象類繼承,不使用具體類繼承。

  • 依賴倒轉(zhuǎn)原則:要依賴于抽象,不要依賴于具體,針對接口編程,不針對實現(xiàn)編程。

  • 接口隔離原則:使用多個隔離的接口,比使用單個接口好,建立最小的接口。

  • 迪米特法則:一個軟件實體應(yīng)當(dāng)盡可能少地與其他實體發(fā)生相互作用,通過中間類建立聯(lián)系。

  • 合成復(fù)用原則:盡量使用合成/聚合,而不是使用繼承。

常見設(shè)計模式分類

  • 工廠模式

  • 單例模式

  • 建造者模式

  • 適配器模式

  • 橋接模式

  • 過濾器模式

  • 裝飾器模式

  • 外觀模式

  • 享元模式

  • 代理模式

  • 責(zé)任鏈模式

  • 解釋器模式

  • 迭代器模式

  • 觀察者模式


分布式

為什么會出現(xiàn)分布式?隨著業(yè)務(wù)的體量不斷增長,單個節(jié)點的處理能力無法滿足日益增長的計算、存儲任務(wù)的時候,且硬件的提升(加內(nèi)存、加磁盤、使用更好的CPU)高昂到得不償失的時候,應(yīng)用程序也不能進一步優(yōu)化的時候,我們才需要考慮分布式系統(tǒng)。

分布式系統(tǒng)是由一組通過網(wǎng)絡(luò)進行通信、為了完成共同的任務(wù)而協(xié)調(diào)工作的計算機節(jié)點組成的系統(tǒng)。分布式系統(tǒng)的出現(xiàn)是為了用廉價的、普通的機器完成單個計算機無法完成的計算、存儲任務(wù)。其目的是利用更多的機器,處理更多的數(shù)據(jù)。

分布式系統(tǒng)要解決的問題本身就是和單機系統(tǒng)一樣的,而由于分布式系統(tǒng)多節(jié)點、通過網(wǎng)絡(luò)通信的拓?fù)浣Y(jié)構(gòu),會引入很多單機系統(tǒng)沒有的問題,為了解決這些問題又會引入更多的機制、協(xié)議。這里需要學(xué)習(xí)的內(nèi)容包括:

  • 分布式一致性算法:PAXOS、Raft、Zab

  • 分布式事務(wù):2PC、3PC、TCC

  • 分布式唯一 ID 生成:雪花算法、UUID、淘寶 TDDL SEQUENCE方案、美團 Leaf

  • 一致性HASH算法

  • 擴展性設(shè)計,設(shè)計可擴展的軟件架構(gòu)

  • 分布式文件系統(tǒng):HDFS、FastDFS

  • 微服務(wù)架構(gòu)設(shè)計,服務(wù)注冊、服務(wù)發(fā)現(xiàn)、服務(wù)路由


安全

本質(zhì)上后臺服務(wù)在網(wǎng)絡(luò)上運行,需要和各種網(wǎng)絡(luò)環(huán)境交互,在正常情況下能夠工作,但互聯(lián)網(wǎng)中有很多針對后臺服務(wù)的惡意攻擊,因此網(wǎng)絡(luò)安全也是后臺開發(fā)工程師需要學(xué)習(xí)的內(nèi)容。這里主要包括:

  • web安全:CSRF、SQL注入、XSS

  • DDos防范

  • 加解密算法:對稱加密、哈希算法、非對稱加密

  • 網(wǎng)絡(luò)隔離:內(nèi)外網(wǎng)分離、跳板機

  • 授權(quán)認(rèn)證算法:OAuth2.0、OIDC、2FA、單點登錄SSO


監(jiān)控與統(tǒng)計

后臺服務(wù)運行我們?nèi)绾瘟私馄溥\行狀態(tài)和健康度?如果只是開發(fā)小玩具監(jiān)控和統(tǒng)計大可不必,只需記錄本地日志即可,對于成熟的大型后臺服務(wù)系統(tǒng),監(jiān)控、統(tǒng)計、追蹤必不可少,無監(jiān)控,不運營

開源的監(jiān)控軟件有:Prometheus、Zabbix、Open-Falcon。

追蹤系統(tǒng)也非常重要,特別是目前微服務(wù)化,一次服務(wù)請求需要經(jīng)歷多個不同的微服務(wù)處理,給分布式追蹤帶來新的挑戰(zhàn),主要包含以下三個方面:

  • 通過收集日志(Logging),記錄程序的調(diào)試信息或錯誤信息,對系統(tǒng)和各個服務(wù)的運行狀態(tài)進行監(jiān)控

  • 通過收集量度(Metrics),比如累加量,對系統(tǒng)和各個服務(wù)的性能進行監(jiān)控

  • 通過分布式追蹤(Tracing ),追蹤服務(wù)請求是如何在各個分布的組件中進行處理的細(xì)節(jié)

業(yè)界也有一些成熟的開源軟件用于監(jiān)控與追蹤:SkyWalking、Pinpoint、Zipkin、CAT大眾點評開源。不過大公司一般都有自研的一套監(jiān)控與追蹤系統(tǒng),比如騰訊內(nèi)部就有多套自研監(jiān)控與調(diào)用鏈追蹤系統(tǒng)。


搜索引擎

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

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

數(shù)據(jù)分為結(jié)構(gòu)化數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù)

像數(shù)據(jù)庫表這種的數(shù)據(jù)是結(jié)構(gòu)化數(shù)據(jù);而對于像HTML、XML、文檔這樣不定長度且無固定格式的數(shù)據(jù)我們稱之為非結(jié)構(gòu)化數(shù)據(jù)。非結(jié)構(gòu)化數(shù)據(jù)也稱為全文數(shù)據(jù),對非結(jié)構(gòu)化數(shù)據(jù)的搜索可以用全文檢索的方式,

目前兩大主流的全文搜索引擎「Solr」和「Elasticsearch」都是基于 Lucene 建立。搜索引擎需要學(xué)習(xí)的內(nèi)容:

  • 搜索引擎原理,搜索引擎利用倒排索引技術(shù)來實現(xiàn)對全文數(shù)據(jù)的高效檢索。

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

  • Elasticsearch 原理與使用

  • Solr 原理與使用


大數(shù)據(jù)

大數(shù)據(jù),又稱為巨量資料,指的是在傳統(tǒng)數(shù)據(jù)處理應(yīng)用軟件不足以處理的大或復(fù)雜的數(shù)據(jù)集的術(shù)語。隨著后臺服務(wù)用戶數(shù)增加和數(shù)據(jù)的積累,產(chǎn)生海量有待挖掘價值的數(shù)據(jù),分析利用這些數(shù)據(jù)可以反饋線上決策,優(yōu)化運營策略,產(chǎn)生數(shù)據(jù)價值。

海量數(shù)據(jù)也可以定義為來自各種來源的大量非結(jié)構(gòu)化或結(jié)構(gòu)化數(shù)據(jù)。

在軟件開發(fā)領(lǐng)域的大數(shù)據(jù)概念自 20 世紀(jì) 90 年代的數(shù)據(jù)倉庫開始,對于大數(shù)據(jù)的處理也導(dǎo)致各種海量數(shù)據(jù)的統(tǒng)計和處理技術(shù)發(fā)展。

主要包含以下的技術(shù)點需要學(xué)習(xí):數(shù)據(jù)存儲、離線分析、流式計算。

  • 大數(shù)據(jù)存儲:Hadoop 框架,HDFS、HBase、YARN 架構(gòu)、Apache Kudu

  • 離線分析:Hive、MapReduce、Spark

  • 流式計算:Flink、Storm、Kafka Stream、Spark Streaming


虛擬化

虛擬化,是指通過虛擬化技術(shù)將一臺計算機虛擬為多臺邏輯計算機。

虛擬化的好處

  • 靈活性:在同一硬件上同時運行多個操作系統(tǒng)

  • 敏捷性:移動操作系統(tǒng)的方式與將文件或圖片從一臺物理服務(wù)器移動到另一臺物理服務(wù)器的方式相同。

  • 容錯:當(dāng)物理服務(wù)器出現(xiàn)故障時,管理軟件會自動將實例遷移到可用服務(wù)器,甚至無感知物理硬件故障。

  • 降低成本:您不再需要過多的物理服務(wù)器,操作和維護所需的費用也隨之減少。

常見的虛擬化技術(shù):KVM、Xen、OpenVZ、Docker

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

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

中間件

在后端開發(fā)中你可能經(jīng)常聽說到「中間件」這個詞,那什么是中間件?看下Wiki上的定義:

中間件技術(shù)創(chuàng)建在對應(yīng)用軟件部分常用功能的抽象上,將常用且重要的過程調(diào)用、分布式組件、消息隊列、事務(wù)、安全、鏈接器、商業(yè)流程、網(wǎng)絡(luò)并發(fā)、HTTP 服務(wù)器、Web Service?等功能集于一身或者分別在不同品牌的不同產(chǎn)品中分別完成。

中國科學(xué)院軟件所研究員仲萃豪把中間件定義為「平臺+通信」。這個定義限定了只有用于分布式系統(tǒng)中的此類軟件才能被稱為中間件,同時此定義也把中間件與實際應(yīng)用的應(yīng)用軟件區(qū)分開來。

大白話來說,中間件就是把分布式系統(tǒng)中一些通用功能的抽象出來提供服務(wù)的一類軟件統(tǒng)稱。它屏蔽掉了底層操作系統(tǒng)的復(fù)雜性,向上提供一個統(tǒng)一的開發(fā)環(huán)境,降低了軟件系統(tǒng)開發(fā)的復(fù)雜度,由于中間件是介于操作系統(tǒng)和應(yīng)用軟件之間,為應(yīng)用軟件提供服務(wù)功能的軟件,由于介于兩種軟件之間,所以稱為中間件。

常見的的開源中間件有下面幾種,組合起來就能搭建一個完整的分布式后臺服務(wù)系統(tǒng):

  • web server 中間件,Nginx、OpenResty、Tomcat…

  • 緩存中間件,服務(wù)端緩存包括 Redis、Memcached…

  • 消息隊列中間件,Kafka、RabbitMQ、ActiveMQ…

  • RPC框架,Tars、Dubbo、gRPC、Thrift

  • 數(shù)據(jù)庫中間件,Sharding jdbc

  • 日志系統(tǒng)中間件,ELK B指的是一套解決方案,是 Elasticsearch、Logstash 、 Kibana、Beats 是這 4 種軟件產(chǎn)品的首字母縮寫。

  • 配置中心中間件,Apollo、zookeeper統(tǒng)一配置管理

  • API網(wǎng)關(guān),開源項目有 Tyk、kong、zuul、orange…


版本控制

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

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

  • 常見的有集中式版本控制系統(tǒng),代表是SVN;

  • 分布式版本控制系統(tǒng),代表是Git


工具

一些和后端開發(fā)或者說軟件開發(fā)相關(guān)的工具推薦,主要是編輯器和 IDE。

編輯器

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

當(dāng)然除了 Vim 如果是文字編輯工作,比如寫 README 文檔或者寫技術(shù)博客,那么強烈推薦學(xué)習(xí)下 Markdown 語法,這是一種種輕量級標(biāo)記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,注重內(nèi)容本身不用過多的調(diào)整排版。Markdown 編輯器推薦 Typora 、有道云筆記 Markdown 編輯器、VSCode Markdown插件。

IDE

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

集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面等工具。

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

  • CLion - 跨平臺的C/C++ IDE 開發(fā)工具,支持C++11 、C++14、libc++以及Boost。

  • GoLand - Go語言的集成開發(fā)環(huán)境。

  • IntelliJ IDEA - 2001年發(fā)布。一套智能的 Java 集成開發(fā)環(huán)境,特別專注與強調(diào)程序師的開發(fā)撰寫效率提升。

  • PhpStorm - PHP IDE開發(fā)工具。

  • PyCharm - 一款結(jié)合了Django框架的Python IDE開發(fā)工具。

  • AppCode - Swift 和 Objective-C IDE開發(fā)工具。

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

在2019年的 Stack Overflow 組織的開發(fā)者調(diào)研中,VS Code被認(rèn)為是最受開發(fā)者歡迎的開發(fā)環(huán)境。


測試

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

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

  • 單元測試

  • 壓力測試

  • 全鏈路測試

  • A/B 測試,灰度發(fā)布,藍(lán)綠部署


學(xué)習(xí)順序

總結(jié)下,后端技術(shù)學(xué)習(xí)的內(nèi)容還是很多的,不可能一蹴而就。

這篇文章能看到這里的同學(xué),如果是初學(xué)者,可能就想問直接問我從哪里開始學(xué)習(xí)?那我就不賣關(guān)子,如果你不知道從哪開始學(xué),對于學(xué)習(xí)路線各個節(jié)點,我就按個人的學(xué)習(xí)經(jīng)驗并結(jié)合認(rèn)識的大廠高 P 給的建議,給你把以上技術(shù)路線學(xué)習(xí)優(yōu)先級做個排序,你照著學(xué)就行,排序規(guī)則:

星級越高,排名越靠前,重要程度越高,優(yōu)先安排時間學(xué)習(xí)。

  • 計算機基礎(chǔ) 5星

  • Linux 5 星

  • 數(shù)據(jù)庫 5 星

  • 設(shè)計模式 5 星

  • 工具 5 星

  • 中間件 4 星

  • 分布式 4 星

  • 高并發(fā)、高可用、高性能 4 星

  • 搜索引擎 4 星

  • 測試 3 星

  • 監(jiān)控與統(tǒng)計 3 星

  • 虛擬化 3 星

  • 安全 3 星

  • 大數(shù)據(jù) 3 星


語言的困惑

細(xì)心的讀者應(yīng)該發(fā)現(xiàn)了,到目前為止本文討論的后端技術(shù)學(xué)習(xí)路線內(nèi)容,并沒有提及特定編程語言,不提及并不是說不重要,語言是很多技術(shù)的前置知識。打個比方來說,編程語言是磚瓦,高大上的項目都是一磚一瓦堆砌而成。

其實你在學(xué)習(xí)上述技術(shù)點的過程中,會自然而然的接觸到各種編程語言的中間件或是開源項目,不管用什么語言做后端服務(wù)開發(fā),都是沒有問題的,并且都不有很多優(yōu)秀的開源框架可以借鑒學(xué)習(xí),關(guān)鍵是要有清晰的學(xué)習(xí)路線,主流的后端開發(fā)語言包括 Java、C++、PHP、Python、Go ,那學(xué)哪個呢?

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

如果你是職場社畜,那就要適應(yīng)團隊,產(chǎn)品業(yè)務(wù)需要用什么語言開發(fā)那就學(xué)哪個。萬變不離其宗,后端技術(shù)的知識都是相通的,不要被特定語言所束縛,這些通用的后端技術(shù)掌握后,剩下的就只是編程語言學(xué)習(xí),很快啊,很快的。


結(jié)語

這篇文章我從月初開始整理內(nèi)容、繪制思維導(dǎo)圖,真真是肝了半個月之久。創(chuàng)作過程中,我把自己從初級開發(fā)人員到現(xiàn)在高級工程師,這些年學(xué)習(xí)的技術(shù)都在腦子里過了一遍。

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

高清路線大圖

小林已經(jīng)放到公眾號里了

后臺回復(fù)「后端」即可獲取

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉