熬夜肝了一份 C++/Linux 開發學習路線
大家好,我是帥地。
之前寫過幾篇學習路線的文章
一般開發崗主流的就是 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,還得研究下他們的一些源碼,下面我總結一下一些比較重要的知識(其實是根據面試結果來挑選)。
- 指針與引用的區別,C 與 C++ 的區別,struct 與 class 的區別
- struct 記憶體對齊問題,sizeof 與 strlen 區別
- 面向對象的三大特性:封裝、繼承、多態
- 類的訪問許可權:private、protected、public
- 類的構造函數、析構函數、賦值函數、拷貝函數
- 移動構造函數與拷貝構造函數對比
- 記憶體分區:全局區、堆區、棧區、常量區、程式碼區
- 虛函數實現動態多態的原理、虛函數與純虛函數的區別
- 深拷貝與淺拷貝的區別
- 一些關鍵字:static, const, extern, volatile 等
- 四種類型轉換:static_cast、dynamic_cast、const_cast、reinterpret_cast
- 靜態與多態:重寫、重載、模板
- 四種智慧指針及底層實現:auto_ptr、unique_ptr、shared_ptr、weak_ptr
- 右值引用
- std::move函數
- 迭代器原理與迭代器失效問題
- 一些重要的 STL:vector, list, map, set 等。
- 容器對比,如 map 與 unordered_map 對比,set 與 unordered_set 對比,vector 與 list 比較等。
- STL容器空間配置器
等等。
根據書來學就可以了,然後學到一些重點,可以重點關注一下。
書籍推薦:
1、《C++Primer》,這本書內容很多的,把前面基礎的十幾章先看一看,不用從頭到尾全啃,後面可以字典來使用。
2、《STL 源碼剖析》,必看書籍,得知道常見 STL 的原理,建議看個兩三遍。
3、《深度探索C++對象模型》,這本主要講解面向對象的相關知識,可以幫你掃清各種迷霧。
書籍整理看這裡:少走彎路,必讀電腦經典書籍推薦(含下載方式)
影片推薦:可以在 B 站侯捷老師講的影片,不適合初學者,講的大部分都是進階,大家 B 站搜索侯捷就行
面試題:學完之後可以通過面試題複習,這裡整理了:15萬字C++開發面試手冊出爐(C++和電腦基礎全有)
二、電腦網路(1-2個月)
無論你是從事啥崗位,無論是校招還是社招,電腦網路基本都會問,特特是騰訊,位元組,shopee,小米等這些非 Java 系的公司,問的更多。這塊認真學,一個半月就可以搞定了。
電腦網路就是一堆協議的構成,下面是一些比較重要的知識點,學的時候可以重點關注下。
物理層、鏈路層:
- MTU,MAC地址,乙太網協議。
- 廣播與 ARP 協議
網路層
- ip 地址分類
- IP 地址與 MAC 地址區別
- 子網劃分,子網掩碼
- ICMP 協議及其應用
- 路由定址
- 區域網,廣域網區別
傳輸層(主要就是 TCP)
- TCP首部報文格式(SYN、ACK、FIN、RST必須知道)
- TCP滑動窗口原理,TCP 超時重傳時間選擇
- TCP 擁塞控制,TCP 流量控制
- TCP 三次握手與四次揮手以及狀態碼的變化
- TCP連接釋放中TIME_WAIT狀態的作用
- SYN 泛洪攻擊
- TCP 粘包,心跳包
- UDP 如何實現可靠傳輸
- UDP 與 TCP 的區別
- UDP 以及 TCP 的應用場景
應用層
- DNS 原理以及應用
- HTTP 報文格式,HTTP1.0、HTTP1.1、HTTP2.0 之間的區別
- HTTP 請求方法的區別:GET、HEAD、POST、PUT、DELETE
- HTTP 狀態碼
- HTTP 與 HTTPS 的區別
- 數字證書,對稱加密與非對稱加密
- cookie與session區別
- 輸入一個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+計組入門教程
總之,這一套學下來,感覺需要一年了,當然,這個不好衡量,還得看你自己掌握了哪些基礎。
九、總結
學了之後要驗證自己學得如何,可以來帥地的網站看看這些面試題,通過面試題查漏補缺
小破站網址:www.iamshuaidi.com,後續會越來越完善,包括各種演算法也都會更新,建議大家收藏。
另外,文中涉及到的書單,可以這裡下載:www.iamshuaidi.com/753.html
總之,關於校招,學習路線,面試題等等,很多我在網站都更新了,包括個人經歷,大家迷茫沒事做時,可以多打開看看。
最後,大家加油,努力學兩年,爭取日後那個好的 offer.