熬夜肝了一份 C++/Linux 開發學習路線

大家好,我是帥地。

之前寫過幾篇學習路線的文章

前端開發學習路線

Java 後端開發學習路線

一般開發崗主流的就是 Java 後台開發,前端開發以及 C++ 後台開發,現在 Go 開發也是越來越多了,今天把 C++ 後台開發學習路線補上。

寫之前先來回答幾個問題

1、C++ 後台開發有哪些崗位?

C++ 後台開發的崗位還是很多的,例如遊戲引擎開發,遊戲服務端開發,音影片服務端/客戶端開發,資料庫內核開發等等,而且 C++ 也能用來寫深度學習,做硬體底層這些。

總之,C++ 後台開發的崗位,還是很豐富的,大家不用擔心找不到合適的崗位。

2、C++ 後台開發崗位需求量大嗎?

一般大公司大需求量會多一些,小公司需求量較少。

說到崗位需求量,那肯定是 Java 的崗位需求量是最大的,當然,學 Java 的人也是最多的,假如你要學習 C++,那我覺得你要定位大公司可能會好一點,進大公司反而會比 Java 容易。

假如你覺得自己實力很一般,夠不著大公司,那我覺得你可以考慮學習 Java,因為大部分小公司,Java 崗位多一些。

但是呢,假如你是應屆生,那麼語言其實也不是特別重要,只要你 把電腦基礎和演算法學好,就算你是學 Java 的,也可以去面 C++;學 C++ 的也可以去面 Java。

我當時是學 Java 的,不過秋招那會還面了幾個 C++ 崗位,直接和面試官說我不會 C++ 就可以了,他會問你其他的知識。

下面跟大家說一說 C++ 後台開發學習路線,為了方便大家做規劃,每一個模組的學習,我都會說下大致的學習時間

一、C++ 基礎(3-6個月)

假如你有 C 語言基礎,那麼這塊感覺花個三四個月就能拿下了,假如你是零基礎的,估計還得學兩三個月的 C 語言,也就是說,得花半年時間才行,沒有 C 語言基礎的看這個 C 語言教程:一份評價超高的 C 語言入門教程

C++ 這塊,重點需要學習的就是一些關鍵字面向對象以及 STL 容器的知識,特別是 STL,還得研究下他們的一些源碼,下面我總結一下一些比較重要的知識(其實是根據面試結果來挑選)。

  1. 指針與引用的區別,C 與 C++ 的區別,struct 與 class 的區別
  2. struct 記憶體對齊問題,sizeof 與 strlen 區別
  3. 面向對象的三大特性:封裝、繼承、多態
  4. 類的訪問許可權:private、protected、public
  5. 類的構造函數、析構函數、賦值函數、拷貝函數
  6. 移動構造函數與拷貝構造函數對比
  7. 記憶體分區:全局區、堆區、棧區、常量區、程式碼區
  8. 虛函數實現動態多態的原理、虛函數與純虛函數的區別
  9. 深拷貝與淺拷貝的區別
  10. 一些關鍵字:static, const, extern, volatile 等
  11. 四種類型轉換:static_cast、dynamic_cast、const_cast、reinterpret_cast
  12. 靜態與多態:重寫、重載、模板
  13. 四種智慧指針及底層實現:auto_ptr、unique_ptr、shared_ptr、weak_ptr
  14. 右值引用
  15. std::move函數
  16. 迭代器原理與迭代器失效問題
  17. 一些重要的 STL:vector, list, map, set 等。
  18. 容器對比,如 map 與 unordered_map 對比,set 與 unordered_set 對比,vector 與 list 比較等。
  19. STL容器空間配置器

等等。

根據書來學就可以了,然後學到一些重點,可以重點關注一下。

書籍推薦:

1、《C++Primer》,這本書內容很多的,把前面基礎的十幾章先看一看,不用從頭到尾全啃,後面可以字典來使用。

2、《STL 源碼剖析》,必看書籍,得知道常見 STL 的原理,建議看個兩三遍。

3、《深度探索C++對象模型》,這本主要講解面向對象的相關知識,可以幫你掃清各種迷霧。

書籍整理看這裡:少走彎路,必讀電腦經典書籍推薦(含下載方式)

影片推薦:可以在 B 站侯捷老師講的影片,不適合初學者,講的大部分都是進階,大家 B 站搜索侯捷就行

面試題:學完之後可以通過面試題複習,這裡整理了:15萬字C++開發面試手冊出爐(C++和電腦基礎全有)

二、電腦網路(1-2個月)

無論你是從事啥崗位,無論是校招還是社招,電腦網路基本都會問,特特是騰訊,位元組,shopee,小米等這些非 Java 系的公司,問的更多。這塊認真學,一個半月就可以搞定了。

電腦網路就是一堆協議的構成,下面是一些比較重要的知識點,學的時候可以重點關注下。

物理層、鏈路層

  1. MTU,MAC地址,乙太網協議。
  2. 廣播與 ARP 協議

網路層

  1. ip 地址分類
  2. IP 地址與 MAC 地址區別
  3. 子網劃分,子網掩碼
  4. ICMP 協議及其應用
  5. 路由定址
  6. 區域網,廣域網區別

傳輸層(主要就是 TCP)

  1. TCP首部報文格式(SYN、ACK、FIN、RST必須知道)
  2. TCP滑動窗口原理,TCP 超時重傳時間選擇
  3. TCP 擁塞控制,TCP 流量控制
  4. TCP 三次握手與四次揮手以及狀態碼的變化
  5. TCP連接釋放中TIME_WAIT狀態的作用
  6. SYN 泛洪攻擊
  7. TCP 粘包,心跳包
  8. UDP 如何實現可靠傳輸
  9. UDP 與 TCP 的區別
  10. UDP 以及 TCP 的應用場景

應用層

  1. DNS 原理以及應用
  2. HTTP 報文格式,HTTP1.0、HTTP1.1、HTTP2.0 之間的區別
  3. HTTP 請求方法的區別:GET、HEAD、POST、PUT、DELETE
  4. HTTP 狀態碼
  5. HTTP 與 HTTPS 的區別
  6. 數字證書,對稱加密與非對稱加密
  7. cookie與session區別
  8. 輸入一個URL到顯示頁面的流程(越詳細越好,搞明白這個,網路這塊就差不多了)

書籍推薦:零基礎可以先看《圖解HTTP》,當然,也可以直接看《電腦網網路:自頂向下》這本書,這本書建議看兩遍以及以上,還有時間的可以看《TCP/IP詳解卷1:協議》。

書籍下載看這裡:少走彎路,必讀電腦經典書籍推薦(含下載方式)

帥地也寫過一個極簡入門教程:www.iamshuaidi.com/359.html

三、作業系統(1-2個月)

作業系統和電腦網路差不多,不過電腦網路會問的多一些,作業系統會少一些,學到時候如果可以帶著問題去學是最好的,例如

咋就還有進程和執行緒之分?為什麼要有掛起、運行、阻塞等這麼多種狀態?怎麼就還有悲觀鎖和樂觀鎖,他們的本質區別?

進程咋還會出現死鎖,都有哪些處理策略?進程都有哪些調度演算法?

虛擬記憶體解決了什麼問題?為啥每個進程的記憶體地址就是獨立的呢?

為啥 cpu 很快而記憶體很慢?磁碟怎麼就更慢了?

總結起來大致:

1、進程與執行緒區別

2、執行緒同步的方式:互斥鎖、自旋鎖、讀寫鎖、條件變數

3、互斥鎖與自旋鎖的底層區別

4、孤兒進程與殭屍進程

5、死鎖及避免

6、多執行緒與多進程比較

7、進程間通訊:PIPE、FIFO、消息隊列、訊號量、共享記憶體、socket

8、管道與消息隊列對比

9、fork進程的底層:讀時共享,寫時複製

10、執行緒上下文切換的流程

11、進程上下文切換的流程

12、進程的調度演算法

13、阻塞IO與非阻塞IO

14、同步與非同步的概念

15、靜態鏈接與動態鏈接的過程

16、虛擬記憶體概念(非常重要)

17、MMU地址翻譯的具體流程

18、缺頁處理過程

19、缺頁置換演算法:最久未使用演算法、先進先出演算法、最佳置換演算法

書籍推薦:《現代作業系統》

這裡也有一門合併的影片:電腦基礎三門課影片

四、MySQL(一個月左右)

資料庫一般主流的有 MySQL 和 Oracle,不過建議大家學習 MySQL 了,因為大部分公司都是使用 MySQL,也是屬於面試必問,而且工作中 MySQL 也是接觸的最多的,畢竟工作 crud 才是常態。

下面這些是我認為比較重要的知識點:

1、一條 sql 語句是如何執行的?也就是說,從客戶端執行了一條 sql 命令,服務端會進行哪些處理?(例如驗證身份,是否啟用快取啥的)。

2、索引相關:索引是如何實現的?多種引擎的實現區別?聚族索引,非聚族索引,二級索引,唯一索引、最左匹配原則等等(非常重要)。

3、事務相關:例如事務的隔離是如何實現的?事務是如何保證原子性?不同的事務看到的數據怎麼就不一樣了?難道每個事務都拷貝一份視圖?MVCC 的實現原理(重要)等等。

4、各種鎖相關:例如表鎖,行鎖,間隙鎖,共享鎖,排他鎖。這些鎖的出現主要是用來解決哪些問題?(重要)

5、日誌相關:redolog,binlog,undolog,這些日誌的實現原理,為了解決怎麼問題?日誌也是非常重要的吧,面試也問的挺多。

6、資料庫的主從備份、如何保證數據不丟失、如何保證高可用等等。

7、一些故障排查的命令,例如慢查詢,sql 的執行計劃,索引統計的刷新等等。

對於 2-4 這四個相關知識,面試被問到的頻率是最高的,有時候面試會讓你說一說索引,如果你知道的多的話就可以瘋狂扯一波了,記得我當時總結了一套扯的模版:

先說從 B 樹角度說為啥索引會快-》趁機說一下索引的其他實現方式-〉不同引擎在索引實現上的不同-》系統是如果判斷是否要使用索引的-〉明明加了索引卻不走索引?

只有你對各種數據結構和索引原理都懂,你才能扯的起來,對於事物和鎖也是,當時面試官問了我事務是如何保證一致性的,剛好我研究過 ,redolog,binlog,undolog 這些日誌,然後和面試官扯了好久。

書籍:《MySQL必知必會》和《MySQL技術內幕》

具體可以看我寫的 MySQL 學習路線:肝完了,我的 MySQL 學習之路

書籍下載看這裡:少走彎路,必讀電腦經典書籍推薦(含下載方式)

五、網路編程(一個月左右)

網路編程這塊,有些公司還是問的挺多的,特別是 IO 多路復用,同步非同步 IO,阻塞非阻塞啥的,當時面騰訊基本每次都問,,,,學習 C++ 這塊還是要重視一下,下面我說一下比較重要的吧。

1、IO多路復用:select、poll、epoll的區別(非常重要,幾乎必問,回答得越底層越好,要會使用)

2、手撕一個最簡單的server端伺服器(socket、bind、listen、accept這四個API一定要非常熟練)

3、執行緒池

4、基於事件驅動的reactor模式

5、邊沿觸發與水平觸發的區別

6、非阻塞IO與阻塞IO區別

書籍:可以看一看《Unix網路編程》

六、數據結構與演算法(3-6+月)

數據結構與演算法,我覺得是需要花最多時間的,因為演算法這塊,很難快速突擊,從基礎數據結構與各種演算法思想到 leetcode 刷題,如果你零基礎,那真的需要挺久的,不過你有一些基礎,可能會快一點,看你想掌握到什麼程度了。

我這裡大致說一下學習流程吧

1、先跟著書學基礎數據結構與演算法:鏈表,隊列,棧,哈希表,二叉樹,圖,十大排序,二分查找。

2、之後了解一下演算法思想:遞歸,深度與廣度搜索,枚舉,動態規劃這些。

入門數據結構推薦《數據結構與演算法分析:c語言描述版》這本書,學的過程中,也可以配合刷題,一般刷《劍指 offer》 + LeetCode 刷個兩三百就差不多了,沒時間到就先刷 《劍指 offer》吧。

具體到演算法學習可以看我這篇文章:我是如何學習演算法的?

七、項目(2個月左右)

項目是必須要做的了,Java 的項目教程滿天飛,不過 C++ 的會少一些,至少沒那麼多培訓機構影片可以白嫖,不過大家可以跟著書,或者 github 上找或者自己花點錢買一個付費影片吧。

推薦自學項目:實現 http伺服器( github 一堆源碼、音影片伺服器(慕課網))、實現一個聊天系統(這塊有些書就有附帶)

八、學習順序

我建議有時間的,可以先入門下 C++ ,然後就是開始學習數據結構與演算法,演算法這塊長期保持刷題,然後一邊深入學習 C++,之後學習電腦網路,作業系統,在之後學習網路編程,項目這塊放到最後面。

如果時間比較緊的,演算法這塊可以放鬆一點,C++ 和項目可以優先,電腦基礎可以突擊學習,通過影片或者別人總結的筆記突擊,這裡又個影片:計網+OS+計組入門教程

總之,這一套學下來,感覺需要一年了,當然,這個不好衡量,還得看你自己掌握了哪些基礎。

九、總結

學了之後要驗證自己學得如何,可以來帥地的網站看看這些面試題,通過面試題查漏補缺

image-20210811144955757

小破站網址:www.iamshuaidi.com,後續會越來越完善,包括各種演算法也都會更新,建議大家收藏。

另外,文中涉及到的書單,可以這裡下載:www.iamshuaidi.com/753.html

總之,關於校招,學習路線,面試題等等,很多我在網站都更新了,包括個人經歷,大家迷茫沒事做時,可以多打開看看。

最後,大家加油,努力學兩年,爭取日後那個好的 offer.