經(jīng)驗(yàn)分享:熬夜肝了這一份C++開(kāi)發(fā)學(xué)習(xí)路線(xiàn)!

寫(xiě)之前先來(lái)回答幾個(gè)問(wèn)題
1、C++ 后臺(tái)開(kāi)發(fā)有哪些崗位?
C++ 后臺(tái)開(kāi)發(fā)的崗位還是很多的,例如游戲引擎開(kāi)發(fā),游戲服務(wù)端開(kāi)發(fā),音視頻服務(wù)端/客戶(hù)端開(kāi)發(fā),數(shù)據(jù)庫(kù)內(nèi)核開(kāi)發(fā)等等,而且 C++ 也能用來(lái)寫(xiě)深度學(xué)習(xí),做硬件底層這些。
總之,C++ 后臺(tái)開(kāi)發(fā)的崗位,還是很豐富的,大家不用擔(dān)心找不到合適的崗位。
2、C++ 后臺(tái)開(kāi)發(fā)崗位需求量大嗎?
一般大公司大需求量會(huì)多一些,小公司需求量較少。
說(shuō)到崗位需求量,那肯定是 Java 的崗位需求量是最大的,當(dāng)然,學(xué) Java 的人也是最多的(太卷了),假如你要學(xué)習(xí) C++,那我覺(jué)得你要定位大公司可能會(huì)好一點(diǎn),進(jìn)大公司反而會(huì)比 Java 容易。
下面跟大家說(shuō)一說(shuō) C++ 后臺(tái)開(kāi)發(fā)學(xué)習(xí)路線(xiàn),為了方便大家做規(guī)劃,每一個(gè)模塊的學(xué)習(xí),我都會(huì)說(shuō)下大致的學(xué)習(xí)時(shí)間

一、C++ 基礎(chǔ)(3-6個(gè)月)
假如你有 C 語(yǔ)言基礎(chǔ),那么這塊感覺(jué)花個(gè)三四個(gè)月就能拿下了,假如你是零基礎(chǔ)的,估計(jì)還得學(xué)兩三個(gè)月的 C 語(yǔ)言,也就是說(shuō),得花半年時(shí)間才行,沒(méi)有 C 語(yǔ)言基礎(chǔ)的看這個(gè) C 語(yǔ)言教程:一份評(píng)價(jià)超高的 C 語(yǔ)言入門(mén)教程
C++ 這塊,重點(diǎn)需要學(xué)習(xí)的就是一些關(guān)鍵字、面向?qū)ο?/strong>以及STL 容器的知識(shí),特別是 STL,還得研究下他們的一些源碼,下面我總結(jié)一下一些比較重要的知識(shí)(其實(shí)是根據(jù)面試結(jié)果來(lái)挑選)。
指針與引用的區(qū)別,C 與 C++ 的區(qū)別,struct 與 class 的區(qū)別
struct 內(nèi)存對(duì)齊問(wèn)題,sizeof 與 strlen 區(qū)別
面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)
類(lèi)的訪(fǎng)問(wèn)權(quán)限:private、protected、public
類(lèi)的構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)、拷貝函數(shù)
移動(dòng)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)對(duì)比
內(nèi)存分區(qū):全局區(qū)、堆區(qū)、棧區(qū)、常量區(qū)、代碼區(qū)
虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)的原理、虛函數(shù)與純虛函數(shù)的區(qū)別
深拷貝與淺拷貝的區(qū)別
一些關(guān)鍵字:static, const, extern, volatile 等
四種類(lèi)型轉(zhuǎn)換:static_cast、dynamic_cast、const_cast、reinterpret_cast
靜態(tài)與多態(tài):重寫(xiě)、重載、模板
四種智能指針及底層實(shí)現(xiàn):auto_ptr、unique_ptr、shared_ptr、weak_ptr
右值引用
std::move函數(shù)
迭代器原理與迭代器失效問(wèn)題
一些重要的 STL:vector, list, map, set 等。
容器對(duì)比,如 map 與 unordered_map 對(duì)比,set 與 unordered_set 對(duì)比,vector 與 list 比較等。
STL容器空間配置器
等等。
根據(jù)書(shū)來(lái)學(xué)就可以了,然后學(xué)到一些重點(diǎn),可以重點(diǎn)關(guān)注一下。
書(shū)籍推薦:
1、《C++Primer》,這本書(shū)內(nèi)容很多的,把前面基礎(chǔ)的十幾章先看一看,不用從頭到尾全啃,后面可以字典來(lái)使用。
2、《STL 源碼剖析》,必看書(shū)籍,得知道常見(jiàn) STL 的原理,建議看個(gè)兩三遍。
3、《深度探索C++對(duì)象模型》,這本主要講解面向?qū)ο?/strong>的相關(guān)知識(shí),可以幫你掃清各種迷霧。
視頻推薦:可以在 B 站侯捷老師講的視頻,不適合初學(xué)者,講的大部分都是進(jìn)階
二、計(jì)算機(jī)網(wǎng)絡(luò)(1-2個(gè)月)
無(wú)論你是從事啥崗位,無(wú)論是校招還是社招,計(jì)算機(jī)網(wǎng)絡(luò)基本都會(huì)問(wèn),特特是騰訊,字節(jié),shopee,小米等這些非 Java 系的公司,問(wèn)的更多。這塊認(rèn)真學(xué),一個(gè)半月就可以搞定了。
計(jì)算機(jī)網(wǎng)絡(luò)就是一堆協(xié)議的構(gòu)成,下面是一些比較重要的知識(shí)點(diǎn),學(xué)的時(shí)候可以重點(diǎn)關(guān)注下。
物理層、鏈路層:
MTU,MAC地址,以太網(wǎng)協(xié)議。
廣播與 ARP 協(xié)議
網(wǎng)絡(luò)層
ip 地址分類(lèi)
IP 地址與 MAC 地址區(qū)別
子網(wǎng)劃分,子網(wǎng)掩碼
ICMP 協(xié)議及其應(yīng)用
路由尋址
局域網(wǎng),廣域網(wǎng)區(qū)別
傳輸層(主要就是 TCP)
TCP首部報(bào)文格式(SYN、ACK、FIN、RST必須知道)
TCP滑動(dòng)窗口原理,TCP 超時(shí)重傳時(shí)間選擇
TCP 擁塞控制,TCP 流量控制
TCP 三次握手與四次揮手以及狀態(tài)碼的變化
TCP連接釋放中TIME_WAIT狀態(tài)的作用
SYN 泛洪攻擊
TCP 粘包,心跳包
UDP 如何實(shí)現(xiàn)可靠傳輸
UDP 與 TCP 的區(qū)別
UDP 以及 TCP 的應(yīng)用場(chǎng)景
應(yīng)用層
DNS 原理以及應(yīng)用
HTTP 報(bào)文格式,HTTP1.0、HTTP1.1、HTTP2.0 之間的區(qū)別
HTTP 請(qǐng)求方法的區(qū)別:GET、HEAD、POST、PUT、DELETE
HTTP 狀態(tài)碼
HTTP 與 HTTPS 的區(qū)別
數(shù)字證書(shū),對(duì)稱(chēng)加密與非對(duì)稱(chēng)加密
cookie與session區(qū)別
輸入一個(gè)URL到顯示頁(yè)面的流程(越詳細(xì)越好,搞明白這個(gè),網(wǎng)絡(luò)這塊就差不多了)
書(shū)籍推薦:零基礎(chǔ)可以先看《圖解HTTP》,當(dāng)然,也可以直接看《計(jì)算機(jī)網(wǎng)網(wǎng)絡(luò):自頂向下》這本書(shū),這本書(shū)建議看兩遍以及以上,還有時(shí)間的可以看《TCP/IP詳解卷1:協(xié)議》。

三、操作系統(tǒng)(1-2個(gè)月)
操作系統(tǒng)和計(jì)算機(jī)網(wǎng)絡(luò)差不多,不過(guò)計(jì)算機(jī)網(wǎng)絡(luò)會(huì)問(wèn)的多一些,操作系統(tǒng)會(huì)少一些,學(xué)到時(shí)候如果可以帶著問(wèn)題去學(xué)是最好的,例如
咋就還有進(jìn)程和線(xiàn)程之分?為什么要有掛起、運(yùn)行、阻塞等這么多種狀態(tài)?怎么就還有悲觀(guān)鎖和樂(lè)觀(guān)鎖,他們的本質(zhì)區(qū)別?
進(jìn)程咋還會(huì)出現(xiàn)死鎖,都有哪些處理策略?進(jìn)程都有哪些調(diào)度算法?
虛擬內(nèi)存解決了什么問(wèn)題?為啥每個(gè)進(jìn)程的內(nèi)存地址就是獨(dú)立的呢?
為啥 cpu 很快而內(nèi)存很慢?磁盤(pán)怎么就更慢了?
總結(jié)起來(lái)大致:
1、進(jìn)程與線(xiàn)程區(qū)別
2、線(xiàn)程同步的方式:互斥鎖、自旋鎖、讀寫(xiě)鎖、條件變量
3、互斥鎖與自旋鎖的底層區(qū)別
4、孤兒進(jìn)程與僵尸進(jìn)程
5、死鎖及避免
6、多線(xiàn)程與多進(jìn)程比較
7、進(jìn)程間通信:PIPE、FIFO、消息隊(duì)列、信號(hào)量、共享內(nèi)存、socket
8、管道與消息隊(duì)列對(duì)比
9、fork進(jìn)程的底層:讀時(shí)共享,寫(xiě)時(shí)復(fù)制
10、線(xiàn)程上下文切換的流程
11、進(jìn)程上下文切換的流程
12、進(jìn)程的調(diào)度算法
13、阻塞IO與非阻塞IO
14、同步與異步的概念
15、靜態(tài)鏈接與動(dòng)態(tài)鏈接的過(guò)程
16、虛擬內(nèi)存概念(非常重要)
17、MMU地址翻譯的具體流程
18、缺頁(yè)處理過(guò)程
19、缺頁(yè)置換算法:最久未使用算法、先進(jìn)先出算法、最佳置換算法
書(shū)籍推薦:《現(xiàn)代操作系統(tǒng)》
四、MySQL(一個(gè)月左右)
數(shù)據(jù)庫(kù)一般主流的有 MySQL 和 Oracle,不過(guò)建議大家學(xué)習(xí) MySQL 了,因?yàn)榇蟛糠止径际鞘褂?MySQL,也是屬于面試必問(wèn),而且工作中 MySQL 也是接觸的最多的,畢竟工作 crud 才是常態(tài)。
下面這些是我認(rèn)為比較重要的知識(shí)點(diǎn):
1、一條 sql 語(yǔ)句是如何執(zhí)行的?也就是說(shuō),從客戶(hù)端執(zhí)行了一條 sql 命令,服務(wù)端會(huì)進(jìn)行哪些處理?(例如驗(yàn)證身份,是否啟用緩存啥的)。
2、索引相關(guān):索引是如何實(shí)現(xiàn)的?多種引擎的實(shí)現(xiàn)區(qū)別?聚族索引,非聚族索引,二級(jí)索引,唯一索引、最左匹配原則等等(非常重要)。
3、事務(wù)相關(guān):例如事務(wù)的隔離是如何實(shí)現(xiàn)的?事務(wù)是如何保證原子性?不同的事務(wù)看到的數(shù)據(jù)怎么就不一樣了?難道每個(gè)事務(wù)都拷貝一份視圖?MVCC 的實(shí)現(xiàn)原理(重要)等等。
4、各種鎖相關(guān):例如表鎖,行鎖,間隙鎖,共享鎖,排他鎖。這些鎖的出現(xiàn)主要是用來(lái)解決哪些問(wèn)題?(重要)
5、日志相關(guān):redolog,binlog,undolog,這些日志的實(shí)現(xiàn)原理,為了解決怎么問(wèn)題?日志也是非常重要的吧,面試也問(wèn)的挺多。
6、數(shù)據(jù)庫(kù)的主從備份、如何保證數(shù)據(jù)不丟失、如何保證高可用等等。
7、一些故障排查的命令,例如慢查詢(xún),sql 的執(zhí)行計(jì)劃,索引統(tǒng)計(jì)的刷新等等。
對(duì)于 2-4 這四個(gè)相關(guān)知識(shí),面試被問(wèn)到的頻率是最高的,有時(shí)候面試會(huì)讓你說(shuō)一說(shuō)索引,如果你知道的多的話(huà)就可以瘋狂扯一波了,記得我當(dāng)時(shí)總結(jié)了一套扯的模版:
先說(shuō)從 B 樹(shù)角度說(shuō)為啥索引會(huì)快-》趁機(jī)說(shuō)一下索引的其他實(shí)現(xiàn)方式-〉不同引擎在索引實(shí)現(xiàn)上的不同-》系統(tǒng)是如果判斷是否要使用索引的-〉明明加了索引卻不走索引?
只有你對(duì)各種數(shù)據(jù)結(jié)構(gòu)和索引原理都懂,你才能扯的起來(lái),對(duì)于事物和鎖也是,當(dāng)時(shí)面試官問(wèn)了我事務(wù)是如何保證一致性的,剛好我研究過(guò) ,redolog,binlog,undolog 這些日志,然后和面試官扯了好久。
書(shū)籍:《MySQL必知必會(huì)》和《MySQL技術(shù)內(nèi)幕》
五、網(wǎng)絡(luò)編程(一個(gè)月左右)
網(wǎng)絡(luò)編程這塊,有些公司還是問(wèn)的挺多的,特別是 IO 多路復(fù)用,同步非同步 IO,阻塞非阻塞啥的,當(dāng)時(shí)面騰訊基本每次都問(wèn),,,,學(xué)習(xí) C++ 這塊還是要重視一下,下面我說(shuō)一下比較重要的吧。
1、IO多路復(fù)用:select、poll、epoll的區(qū)別(非常重要,幾乎必問(wèn),回答得越底層越好,要會(huì)使用)
2、手撕一個(gè)最簡(jiǎn)單的server端服務(wù)器(socket、bind、listen、accept這四個(gè)API一定要非常熟練)
3、線(xiàn)程池
4、基于事件驅(qū)動(dòng)的reactor模式
5、邊沿觸發(fā)與水平觸發(fā)的區(qū)別
6、非阻塞IO與阻塞IO區(qū)別
書(shū)籍:可以看一看《Unix網(wǎng)絡(luò)編程》
六、數(shù)據(jù)結(jié)構(gòu)與算法(3-6+月)
數(shù)據(jù)結(jié)構(gòu)與算法,我覺(jué)得是需要花最多時(shí)間的,因?yàn)樗惴ㄟ@塊,很難快速突擊,從基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與各種算法思想到 leetcode 刷題,如果你零基礎(chǔ),那真的需要挺久的,不過(guò)你有一些基礎(chǔ),可能會(huì)快一點(diǎn),看你想掌握到什么程度了。
我這里大致說(shuō)一下學(xué)習(xí)流程吧
1、先學(xué)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與算法:鏈表,隊(duì)列,棧,哈希表,二叉樹(shù),圖,十大排序,二分查找。
2、之后了解一下算法思想:遞歸,深度與廣度搜索,枚舉,動(dòng)態(tài)規(guī)劃這些。
入門(mén)數(shù)據(jù)結(jié)構(gòu)推薦《數(shù)據(jù)結(jié)構(gòu)與算法分析:c語(yǔ)言描述版》這本書(shū),學(xué)的過(guò)程中,也可以配合刷題,一般刷《劍指 offer》 + LeetCode 刷個(gè)兩三百就差不多了,沒(méi)時(shí)間到就先刷 《劍指 offer》吧。
七、項(xiàng)目(2個(gè)月左右)
項(xiàng)目是必須要做的了,不過(guò) C++ 的會(huì)少一些,至少?zèng)]那么多培訓(xùn)機(jī)構(gòu)視頻可以白嫖,不過(guò)大家可以跟著書(shū),或者 github 上找或者自己花點(diǎn)錢(qián)買(mǎi)一個(gè)付費(fèi)視頻吧。
推薦自學(xué)項(xiàng)目:實(shí)現(xiàn) http服務(wù)器( github 一堆源碼、音視頻服務(wù)器(慕課網(wǎng)))、實(shí)現(xiàn)一個(gè)聊天系統(tǒng)(這塊有些書(shū)就有附帶)
八、學(xué)習(xí)順序
我建議有時(shí)間的,可以先入門(mén)下 C++ ,然后就是開(kāi)始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,算法這塊長(zhǎng)期保持刷題,然后一邊深入學(xué)習(xí) C++,之后學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng),在之后學(xué)習(xí)網(wǎng)絡(luò)編程,項(xiàng)目這塊放到最后面。
如果時(shí)間比較緊的,算法這塊可以放松一點(diǎn),C++ 和項(xiàng)目可以?xún)?yōu)先,計(jì)算機(jī)基礎(chǔ)可以突擊學(xué)習(xí),通過(guò)視頻或者別人總結(jié)的筆記突擊
總之,這一套學(xué)下來(lái),感覺(jué)需要一年了,當(dāng)然,這個(gè)不好衡量,還得看你自己掌握了哪些基礎(chǔ)。
另外的話(huà)為了幫助大家,輕松,高效學(xué)習(xí)C語(yǔ)言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開(kāi)始的教程到C語(yǔ)言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!可以來(lái)我粉絲群領(lǐng)取哦~

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)最重要的是你可以在群里面交流提問(wèn)編程問(wèn)題哦!
編程學(xué)習(xí)書(shū)籍分享:

編程學(xué)習(xí)視頻分享:
