你們后端,到底要學(xué)啥?

最近有小伙伴問(wèn)我,一名后端工程師的學(xué)習(xí)路線是什么?其實(shí)現(xiàn)在很多程序員都不是科班出生的,包括我自己,大學(xué)壓根沒(méi)學(xué)過(guò)什么計(jì)算機(jī)相關(guān)的課程。非科班出生的程序員的劣勢(shì)在于基礎(chǔ)會(huì)稍差,比如計(jì)算機(jī)基礎(chǔ)、計(jì)算機(jī)網(wǎng)絡(luò)等都了解的不多,不過(guò)沒(méi)關(guān)系,只要你利用業(yè)余時(shí)間系統(tǒng)的來(lái)學(xué)習(xí),照樣可以做到后來(lái)居上。但是問(wèn)題是,我們的學(xué)習(xí)路徑是什么?該如何學(xué),網(wǎng)上課程那么多,我到底該看哪一個(gè)?打開自己的收藏夾,數(shù)不清的資料全部在吃灰,到頭來(lái)一個(gè)也沒(méi)學(xué)。

其實(shí)同類型的資料我們保存1-2個(gè)就足夠了,然后一段時(shí)間內(nèi)專心學(xué)習(xí)一門知識(shí),猥瑣發(fā)育,最后驚艷所有人。

ok,廢話不多說(shuō),我今天要分享的就是后端工程師的學(xué)習(xí)路徑和相關(guān)的書籍、視頻,由于后端語(yǔ)言居多,所以本文不會(huì)分享語(yǔ)言相關(guān)的內(nèi)容。
計(jì)算機(jī)組成原理
首先要講的自然就是計(jì)算機(jī)組成原理相關(guān)的知識(shí)了,當(dāng)然這并不是和你單單的介紹計(jì)算機(jī)是什么組成的,不是教你如何組裝電腦,而是告訴你比如計(jì)算機(jī)是如何運(yùn)算我們的數(shù)據(jù)的、CPU這個(gè)大腦是如何高效處理我們的邏輯的、CPU又是如何與內(nèi)存之間通信的,加快執(zhí)行我們的程序在CPU維度有哪些優(yōu)化以及我們運(yùn)行程序的時(shí)候如何解決CPU和內(nèi)存、內(nèi)存和磁盤之間的速度鴻溝等等...
這里我和大家推薦 《計(jì)算機(jī)組成與設(shè)計(jì) 硬件/軟件接口》 這本書

學(xué)習(xí)這本書你可以獲取以下知識(shí):
計(jì)算機(jī)是怎么從大型設(shè)備逐漸發(fā)展到今天的個(gè)人PC機(jī),以及計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)中的8個(gè)偉大的思想:面向摩爾定律的設(shè)計(jì)、抽象的簡(jiǎn)化設(shè)計(jì)、加速大概率事件、通過(guò)并行提高性能、通過(guò)流水線提供性能、通過(guò)預(yù)測(cè)提供性能、存儲(chǔ)器層次、通過(guò)冗余提高可靠性。 如何判斷一個(gè)CPU的性能?最直白的反應(yīng)就是CPU夠不夠快,也就是我們的程序要跑多久,這個(gè)響應(yīng)時(shí)間我們一般稱之為CPU執(zhí)行時(shí)間,這里需要注意的是CPU執(zhí)行時(shí)間并不包含程序執(zhí)行期間涉及的IO,再細(xì)分的話,又可以分為用戶CPU時(shí)間和系統(tǒng)CPU時(shí)間 有無(wú)符號(hào)數(shù)和無(wú)符號(hào)數(shù)是如何表示的?CPU如何進(jìn)行比較運(yùn)算、分支判斷、循環(huán)執(zhí)行的?我們的代碼其實(shí)是要經(jīng)過(guò)編譯、匯編、鏈接這樣幾個(gè)流程的,加法、減法、乘法、除法以及浮點(diǎn)數(shù)相關(guān)的運(yùn)算在計(jì)算機(jī)層面是如何被實(shí)現(xiàn)的。 CPU是如何進(jìn)行數(shù)據(jù)冒險(xiǎn),控制冒險(xiǎn)的?流水線技術(shù)是如何提供吞吐的,處理器的數(shù)據(jù)通路和控制同路是如何設(shè)計(jì)的。 再接下來(lái)就是存儲(chǔ)器相關(guān)的知識(shí)了,比如虛擬內(nèi)存技術(shù)、程序分段技術(shù)、分頁(yè)技術(shù),當(dāng)發(fā)生缺頁(yè)后如何找到磁盤頁(yè)的,以及為了提升地址的查詢速度,做了哪些優(yōu)化,頁(yè)表的好處與壞處是什么?TLB的好處與壞處是什么?
總之,學(xué)習(xí)了計(jì)算機(jī)組成之后,內(nèi)功絕對(duì)可以大增。如果覺(jué)得書本知識(shí)枯燥難以閱讀的話,我這里再給你推薦個(gè)視頻:計(jì)算機(jī)科學(xué)速成課(https://www.bilibili.com/video/BV1EW411u7th)
非常生動(dòng)形象的課,一共40集,每集大概10分鐘,全部看完7個(gè)小時(shí)足矣,非常適合入門,這個(gè)視頻配上書籍,簡(jiǎn)直完美。
操作系統(tǒng)
學(xué)習(xí)計(jì)算機(jī)組成原理之后,我們會(huì)了解計(jì)算機(jī)各個(gè)硬件之間是如何協(xié)調(diào)工作的,那么接下來(lái)就是肝操作系統(tǒng)了,操作系統(tǒng)是處于計(jì)算機(jī)硬件與軟件資源之間的程序。從程序員的角度來(lái)看,學(xué)習(xí)操作系統(tǒng)可以幫助我們更好的了解程序是如何被調(diào)度的等等。操作系統(tǒng)需要處理如管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入設(shè)備與輸出設(shè)備、操作網(wǎng)絡(luò)與管理文件系統(tǒng)等基本事務(wù),操作系統(tǒng)也提供一個(gè)讓用戶與系統(tǒng)交互的操作界面。這里和大家推薦 《現(xiàn)代操作系統(tǒng)》 這本書

通過(guò)學(xué)習(xí)這本書你可以獲得以下知識(shí):
進(jìn)程是什么、進(jìn)程的模型、進(jìn)程的創(chuàng)建、進(jìn)程的終止、進(jìn)程的層次結(jié)構(gòu)、進(jìn)程的實(shí)現(xiàn)、多道程序的設(shè)計(jì)模型 線程是什么、線程模型、用戶空間的線程、內(nèi)核空間的線程、單線程與多線程的優(yōu)缺點(diǎn) 進(jìn)程間可以通過(guò)哪些方式來(lái)通信,什么是進(jìn)程間的競(jìng)爭(zhēng)條件、臨界區(qū) 調(diào)度過(guò)程涉及到的算法,比如先來(lái)先服務(wù)、短作業(yè)優(yōu)先算法、最短剩余時(shí)間優(yōu)先以及比較公平的時(shí)間片輪轉(zhuǎn)調(diào)度 常見的頁(yè)面置換算法有哪些,比如最優(yōu)頁(yè)面置換算法、最近未使用頁(yè)面置換算法以及最近最少使用頁(yè)面置換算法等等 文件系統(tǒng)的了解,比如有關(guān)文件的構(gòu)造、命名、訪問(wèn)、使用、保護(hù)、實(shí)現(xiàn)和管理是怎么設(shè)計(jì)的 IO設(shè)備的了解,比如如何讀寫IO設(shè)備的內(nèi)容,常見的有內(nèi)存映射IO、直接存儲(chǔ)器存取 了解什么是死鎖,造成死鎖的條件以及解決死鎖的經(jīng)典方法,如何預(yù)防死鎖等等
如果覺(jué)的書本知識(shí)難以閱讀的話,這里也推薦個(gè)視頻操作系統(tǒng)-清華大學(xué)(https://www.bilibili.com/video/BV1wq4y1M7qf)

這是由清華大學(xué)的老師講的操作系統(tǒng)視頻課,簡(jiǎn)單、通俗易懂,每段視頻的時(shí)長(zhǎng)也不長(zhǎng),大概就10來(lái)分鐘。
TCP/IP
當(dāng)具備了計(jì)算機(jī)組成、操作系統(tǒng)的基礎(chǔ)知識(shí)后,接下來(lái)就可以看看網(wǎng)絡(luò)相關(guān)的內(nèi)容了,計(jì)算機(jī)網(wǎng)絡(luò)中面試官最喜歡問(wèn)的就是TCP/IP相關(guān)的知識(shí)了,關(guān)于這方面的知識(shí),我推薦一本書 《圖解》TCP/IP
這本書全文基本都是圖文結(jié)合的,閱讀起來(lái)非常輕松,不得不說(shuō)這個(gè)日本作者很牛逼,可以把很復(fù)雜的網(wǎng)絡(luò)協(xié)議解釋的這么簡(jiǎn)單,關(guān)鍵圖文的方式更加容易記憶。
我這里還推薦一本掘金小冊(cè) 《深入理解 TCP 協(xié)議:從原理到實(shí)戰(zhàn)》
這本小冊(cè),我記得當(dāng)時(shí)花了2-3天就看完了,整個(gè)閱讀體驗(yàn)非常絲滑,也是非常通俗易懂的書籍,如果想要應(yīng)付面試,這本小冊(cè)絕對(duì)是個(gè)不錯(cuò)的選擇??傊ㄟ^(guò)以上兩本書,你可以獲得以下知識(shí):
網(wǎng)絡(luò)的分層模型 TCP協(xié)議為什么是可靠的協(xié)議 什么叫面向連接、基于字節(jié)流、全雙工的協(xié)議 數(shù)據(jù)包是如何被拆分的,MTU和MSS分別是什么,位于哪一層 為什么TCP、IP的握手需要三次,揮手要四次,揮手三次行不行 三次握手太慢,有沒(méi)有更快的方式 TIME_WAIT是什么狀態(tài)?TIME_WAIT是哪一方的狀態(tài),為什么TIME_WAIT那一方需要持續(xù)2個(gè)MSL的時(shí)間 不知道你有沒(méi)有遇到過(guò)"Connection Reset" 或者"Connection refused" ,它們代表什么意思 發(fā)送方?jīng)]收到接收方的ACK怎么辦,發(fā)送方重傳的機(jī)制是怎么樣的,多久重傳才合適 如果接收方?jīng)]有能力接受大量的數(shù)據(jù)怎么辦,這就引入了滑動(dòng)窗口的概念,滑動(dòng)窗口是如何控制數(shù)據(jù)窗口大小的 一開始發(fā)送方并不知道接收方能接收多少數(shù)據(jù),那如何發(fā)送數(shù)據(jù)呢,每次發(fā)一點(diǎn)太慢,每次發(fā)很多對(duì)方又接收不了
總之,如果你的工作不是搞網(wǎng)絡(luò)的,又不想花費(fèi)大量時(shí)間來(lái)閱讀TCP相關(guān)的知識(shí),那么上面兩本書個(gè)人覺(jué)得足夠了。
數(shù)據(jù)結(jié)構(gòu)與算法
這方面我看的書比較少,所以不打算推薦書籍,數(shù)據(jù)結(jié)構(gòu)與算法可能大家更加注重的算法,BAT等大廠的面試離不開算法,以前聽到小道消息,據(jù)說(shuō)字節(jié)跳動(dòng)的面試官一般算法題都會(huì)從leetcode上挑選原題,并且也不會(huì)太難,所以這方面的知識(shí),我還是直接建議大家動(dòng)手練寫,直接去leetcode上刷題,比如每日2道,一個(gè)月下來(lái)就是60道

如圖所示,具體的算法分類大概這么多,大家刷題的時(shí)候,注意不要把精力全部都放在一種類型上,盡量廣一點(diǎn),當(dāng)然有很多冷門的類型,個(gè)人覺(jué)得也不必花費(fèi)太多時(shí)間,像熱門的算法如數(shù)組、字符串、動(dòng)態(tài)規(guī)劃、圖、鏈表等可以多花點(diǎn)心思。
這里再推薦一個(gè)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的有趣網(wǎng)站 visualgo(https://visualgo.net/zh)
這個(gè)網(wǎng)站通過(guò)動(dòng)圖的方式幫助你了解各種數(shù)據(jù)結(jié)構(gòu)是怎么樣的形式。
比如對(duì)于這個(gè)二叉搜索樹來(lái)說(shuō),每次走到哪個(gè)節(jié)點(diǎn),對(duì)應(yīng)的代碼還給你展示出來(lái),確實(shí)很生動(dòng)。
MySQL
MySQL應(yīng)該是每個(gè)后端工程師必備的技能,當(dāng)然這里說(shuō)的不是簡(jiǎn)單的CURD,而是稍微高級(jí)點(diǎn)的,比如索引知識(shí)、架構(gòu)模式、高可用等等,由于現(xiàn)在MySQL基本都是使用InnoDB存儲(chǔ)引擎,因此我推薦 《MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎》

通過(guò)這本書,你可以了解到以下知識(shí):
MySQL幾種存儲(chǔ)引擎的介紹與比較 InnoDB的架構(gòu)模式 
插入緩沖、兩次寫、自適應(yīng)哈希、異步IO、刷新鄰接頁(yè)分別是為了解決什么問(wèn)題 日志類型,比如錯(cuò)誤日志、慢查詢?nèi)罩尽⒍M(jìn)制日志等 索引相關(guān)知識(shí),為什么用b+樹索引,聚集索引和輔助索引的區(qū)別,b+樹索引的分裂與管理,什么情況下用聯(lián)合索引,覆蓋索引為什么好 鎖相關(guān)的知識(shí),InndoDB會(huì)涉及哪些鎖,行鎖有哪些算法,死鎖怎么避免 什么是臟讀、幻讀,如何解決 事務(wù)相關(guān)的知識(shí),這個(gè)是重中之重了,比如redo log、undo log是干什么的,事務(wù)的隔離級(jí)別有哪些,它們有什么區(qū)別?XA事務(wù)是在什么地方體現(xiàn)的,長(zhǎng)事務(wù)會(huì)有什么問(wèn)題
自古MySQL就是后端同學(xué)面試中的必考技能,并且隨著互聯(lián)網(wǎng)卷的程度越來(lái)越高了,MySQL問(wèn)的姿勢(shì)也多了,因此這方面是需要多花時(shí)間學(xué)習(xí)的。
當(dāng)然如果條件允許的話,也推薦看林曉斌老師的《MySQL45講》,但是這門課不適合新手小白,適合有一定MySQL基礎(chǔ)的從業(yè)人員,看完絕對(duì)收獲滿滿。
Redis
說(shuō)了數(shù)據(jù)庫(kù),就得說(shuō)緩存了,說(shuō)到緩存,那就是當(dāng)下最流行的NoSQL數(shù)據(jù)庫(kù)Redis,Redis面試的重要程度不亞于MySQL,我這里和大家推薦 《redis的設(shè)計(jì)與實(shí)現(xiàn)》
通過(guò)這本書,你可以獲得以下知識(shí):
基本的底層數(shù)據(jù)結(jié)構(gòu)以及優(yōu)缺點(diǎn),比如SDS、整數(shù)集合、跳躍表、壓縮列表 哈希表是如何解決沖突的 持久化相關(guān)的,AOF和RDB的區(qū)別,它們的優(yōu)缺點(diǎn)是什么,AOF和RDB的過(guò)程會(huì)阻塞主進(jìn)程嗎 redis的過(guò)期鍵是如何刪除的 redis的事件模型,文件事件和時(shí)間事件分別是什么 serverCron函數(shù)是干嘛的 主從復(fù)制模式下,舊版和新版的復(fù)制模式有什么區(qū)別 哨兵、分片 lua腳本解決原子性的問(wèn)題
這本書側(cè)重原理與實(shí)現(xiàn),閱讀起來(lái)也是通俗易懂,適合新手小白和需要進(jìn)階的工程師。
最后
創(chuàng)作不易,各位的「三連」就是對(duì)作者最大的支持,也是作者最大的創(chuàng)作動(dòng)力,我們下期見。
往期推薦
