當前位置: 妍妍網 > 碼農

後端知識那麽多,重點要學啥?

2024-04-20碼農

最近有小夥伴問我,一名後端工程師的學習路線是什麽?其實作在很多程式設計師都不是科班出生的,大學壓根沒學過什麽電腦相關的課程。非科班出生的程式設計師的劣勢在於基礎會稍差,比如電腦基礎、電腦網路等都了解的不多,不過沒關系,只要你利用業余時間系統的來學習,照樣可以做到後來居上。但是問題是,我們的學習路徑是什麽?該如何學,網上課程那麽多,我到底該看哪一個?開啟自己的我的最愛,數不清的資料全部在吃灰,到頭來一個也沒學。

其實同型別的資料我們保存1-2個就足夠了,然後一段時間內專心學習一門知識,猥瑣發育,最後驚艷所有人。

ok,廢話不多說,我今天要分享的就是後端工程師的學習路徑和相關的書籍、視訊,由於後端語言居多,所以本文不會分享語言相關的內容。

電腦組成原理

首先要講的自然就是電腦組成原理相關的知識了,當然這並不是和你單單的介紹電腦是什麽組成的,不是教你如何組裝電腦,而是告訴你比如電腦是如何運算我們的數據的、CPU這個大腦是如何高效處理我們的邏輯的、CPU又是如何與記憶體之間通訊的,加快執行我們的程式在CPU維度有哪些最佳化以及我們運行程式的時候如何解決CPU和記憶體、記憶體和磁盤之間的速度鴻溝等等...

這裏我和大家推薦 【電腦組成與設計 硬體/軟體介面】 這本書

學習這本書你可以獲取以下知識:

  1. 電腦是怎麽從大型裝置逐漸發展到今天的個人PC機,以及電腦系統結構中的8個偉大的思想:面向莫耳定律的設計、抽象的簡化設計、加速大機率事件、透過並列提高效能、透過流水線提供效能、透過預測提供效能、記憶體層次、透過冗余提高可靠性。

  2. 如何判斷一個CPU的效能?最直白的反應就是CPU夠不夠快,也就是我們的程式要跑多久,這個響應時間我們一般稱之為CPU執行時間,這裏需要註意的是CPU執行時間並不包含程式執行期間涉及的IO,再細分的話,又可以分為使用者CPU時間和系統CPU時間

  3. 有無符號數和無符號數是如何表示的?CPU如何進行比較運算、分支判斷、迴圈執行的?我們的程式碼其實是要經過編譯、組譯、連結這樣幾個流程的,加法、減法、乘法、除法以及浮點數相關的運算在電腦層面是如何被實作的。

  4. CPU是如何進行數據冒險,控制冒險的?流水線技術是如何提供吞吐的,處理器的數據通路和控制同路是如何設計的。

  5. 再接下來就是記憶體相關的知識了,比如虛擬記憶體技術、程式分段技術、分頁技術,當發生缺頁後如何找到磁盤頁的,以及為了提升地址的查詢速度,做了哪些最佳化,頁表的好處與壞處是什麽?TLB的好處與壞處是什麽?

總之,學習了電腦組成之後,內功絕對可以大增。如果覺得書本知識枯燥難以閱讀的話,我這裏再給你推薦個視訊: 電腦科學速成課(https://www.bilibili.com/video/BV1EW411u7th)

非常生動形象的課,一共40集,每集大概10分鐘,全部看完7個小時足矣,非常適合入門,這個視訊配上書籍,簡直完美。

作業系統

學習電腦組成原理之後,我們會了解電腦各個硬體之間是如何協調工作的,那麽接下來就是肝作業系統了,作業系統是處於電腦硬體與軟體資源之間的程式。從程式設計師的角度來看,學習作業系統可以幫助我們更好的了解程式是如何被排程的等等。作業系統需要處理如管理與配置記憶體、決定系統資源供需的優先次序、控制輸入裝置與輸出裝置、操作網路與管理檔案系統等基本事務,作業系統也提供一個讓使用者與系統互動的操作界面。這裏和大家推薦 【現代作業系統】 這本書

透過學習這本書你可以獲得以下知識:

  1. 行程是什麽、行程的模型、行程的建立、行程的終止、行程的階層、行程的實作、多道程式的設計模型

  2. 執行緒是什麽、執行緒模型、使用者空間的執行緒、內核空間的執行緒、單執行緒與多執行緒的優缺點

  3. 行程間可以透過哪些方式來通訊,什麽是行程間的競爭條件、臨界區

  4. 排程過程涉及到的演算法,比如先來先服務、短作業優先演算法、最短剩余時間優先以及比較公平的時間片輪轉排程

  5. 常見的頁面置換演算法有哪些,比如最優頁面置換演算法、最近未使用頁面置換演算法以及最近最少使用頁面置換演算法等等

  6. 檔案系統的了解,比如有關檔的構造、命名、存取、使用、保護、實作和管理是怎麽設計的

  7. IO裝置的了解,比如如何讀寫IO裝置的內容,常見的有記憶體對映IO、直接記憶體存取

  8. 了解什麽是死結,造成死結的條件以及解決死結的經典方法,如何預防死結等等

如果覺的書本知識難以閱讀的話,這裏也推薦個視訊 作業系統-清華大學(https://www.bilibili.com/video/BV1wq4y1M7qf)

這是由清華大學的老師講的作業系統視訊課,簡單、通俗易懂,每段視訊的時長也不長,大概就10來分鐘。

TCP/IP

當具備了電腦組成、作業系統的基礎知識後,接下來就可以看看網路相關的內容了,電腦網路中面試官最喜歡問的就是TCP/IP相關的知識了,關於這方面的知識,我推薦一本書 【圖解】TCP/IP

這本書全文基本都是圖文結合的,閱讀起來非常輕松,不得不說這個日本作者很牛逼,可以把很復雜的網路協定解釋的這麽簡單,關鍵圖文的方式更加容易記憶。

我這裏還推薦一本金塊小冊 【深入理解 TCP 協定:從原理到實戰】

這本小冊,我記得當時花了2-3天就看完了,整個閱讀體驗非常絲滑,也是非常通俗易懂的書籍,如果想要應付面試,這本小冊絕對是個不錯的選擇。總之透過以上兩本書,你可以獲得以下知識:

  1. 網路的分層模型

  2. TCP協定為什麽是可靠的協定

  3. 什麽叫面向連線、基於字節流、全雙工的協定

  4. 封包是如何被拆分的,MTU和MSS分別是什麽,位於哪一層

  5. 為什麽TCP、IP的握手需要三次,揮手要四次,揮手三次行不行

  6. 三次握手太慢,有沒有更快的方式

  7. TIME_WAIT是什麽狀態?TIME_WAIT是哪一方的狀態,為什麽TIME_WAIT那一方需要持續2個MSL的時間

  8. 不知道你有沒有遇到過"Connection Reset" 或者"Connection refused" ,它們代表什麽意思

  9. 發送方沒收到接收方的ACK怎麽辦,發送方重傳的機制是怎麽樣的,多久重傳才合適

  10. 如果接收方沒有能力接受大量的數據怎麽辦,這就引入了滑動視窗的概念,滑動視窗是如何控制數據視窗大小的

  11. 一開始發送方並不知道接收方能接收多少數據,那如何發送數據呢,每次發一點太慢,每次發很多對方又接收不了

總之,如果你的工作不是搞網路的,又不想花費大量時間來閱讀TCP相關的知識,那麽上面兩本書個人覺得足夠了。

數據結構與演算法

這方面我看的書比較少,所以不打算推薦書籍,數據結構與演算法可能大家更加註重的演算法,BAT等大廠的面試離不開演算法,以前聽到小道訊息,據說字節跳動的面試官一般演算法題都會從leetcode上挑選原題,並且也不會太難,所以這方面的知識,我還是直接建議大家動手練寫,直接去leetcode上刷題,比如每日2道,一個月下來就是60道

如圖所示,具體的演算法分類大概這麽多,大家刷題的時候,註意不要把精力全部都放在一種型別上,盡量廣一點,當然有很多冷門的型別,個人覺得也不必花費太多時間,像熱門的演算法如陣列、字串、動態規劃、圖、連結串列等可以多花點心思。

這裏再推薦一個學習數據結構的有趣網站 visualgo (https://visualgo.net/zh)

這個網站透過動圖的方式幫助你了解各種數據結構是怎麽樣的形式。

比如對於這個二叉搜尋樹來說,每次走到哪個節點,對應的程式碼還給你展示出來,確實很生動。

MySQL

MySQL應該是每個後端工程師必備的技能,當然這裏說的不是簡單的CURD,而是稍微高級點的,比如索引知識、架構模式、高可用等等,由於現在MySQL基本都是使用InnoDB儲存引擎,因此我推薦 【MySQL技術內幕 InnoDB儲存引擎】

透過這本書,你可以了解到以下知識:

  1. MySQL幾種儲存引擎的介紹與比較

  2. InnoDB的架構模式

  3. 插入緩沖、兩次寫、自適應哈希、異步IO、重新整理鄰接頁分別是為了解決什麽問題

  4. 日誌型別,比如錯誤日誌、慢查詢日誌、二進制日誌等

  5. 索引相關知識,為什麽用b+樹索引,聚集索引和輔助索引的區別,b+樹索引的分裂與管理,什麽情況下用聯合索引,覆蓋索引為什麽好

  6. 鎖相關的知識,InndoDB會涉及哪些鎖,行鎖有哪些演算法,死結怎麽避免

  7. 什麽是臟讀、幻讀,如何解決

  8. 事務相關的知識,這個是重中之重了,比如redo log、undo log是幹什麽的,事務的隔離級別有哪些,它們有什麽區別?XA事務是在什麽地方體現的,長事務會有什麽問題

自古MySQL就是後端同學面試中的必考技能,並且隨著互聯網卷的程度越來越高了,MySQL問的姿勢也多了,因此這方面是需要多花時間學習的。

當然如果條件允許的話,也推薦看林曉斌老師的【MySQL45講】,但是這門課不適合新手小白,適合有一定MySQL基礎的從業人員,看完絕對收獲滿滿。

Redis

說了資料庫,就得說緩存了,說到緩存,那就是當下最流行的NoSQL資料庫Redis,Redis面試的重要程度不亞於MySQL,我這裏和大家推薦 【redis的設計與實作】

透過這本書,你可以獲得以下知識:

  1. 基本的底層數據結構以及優缺點,比如SDS、整數集合、跳躍表、壓縮列表

  2. 哈希表是如何解決沖突的

  3. 持久化相關的,AOF和RDB的區別,它們的優缺點是什麽,AOF和RDB的過程會阻塞主行程嗎

  4. redis的過期鍵是如何刪除的

  5. redis的事件模型,檔事件和時間事件分別是什麽

  6. serverCron函式是幹嘛的

  7. 主從復制模式下,舊版和新版的復制模式有什麽區別

  8. 哨兵、分片

  9. lua指令碼解決原子性的問題

這本書側重原理與實作,閱讀起來也是通俗易懂,適合新手小白和需要進階的工程師。

最後

創作不易,各位的 「三連」 就是對作者最大的支持,也是作者最大的創作動力,我們下期見。

👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨。

往期推薦