非常詳細的 Linux C/C++ 學習路線總結!已拿騰訊offer
阿新 • • 發佈:2020-03-29
> 創作不易,點贊關注支援一下吧,我的更多原創技術分享,關注公眾號「**後端技術學堂**」第一時間看!
最近在知乎經常被邀請回答類似如何學習C++和C++後臺開發應該具體儲備哪些基礎技能的問題。
本身我從事的的C++後臺開發的工作,目前在騰訊從事軟體開發工作,所以寫這篇文章,分享自己的C++後臺開發學習路徑和點過的技能樹,希望能給想從事後臺開發的同學一點參考,若能幫你少走些彎路就更好。
工欲善其事必先利其器,好的書籍能讓學習事半功倍,所以每個技能點之後我會推薦一些書,都是我讀過且口碑不錯的書,供參考。
### 文末可以獲取學習路線資源,需要的同學自取。
**分享的是我的學習路徑,如果你也能順著這個學習路徑認真學一遍,我想在後臺開發技術上你已經有一個很不錯的技術積累,加上專案練習通過大部分大廠面試是沒有問題的。**
## 計算機基礎綜合
考過CS或者軟體工程研究生的同學可能對這個標題不陌生,是的,我說的就是專業課代號408的**計算機基礎綜合**。這門專業課包含:資料結構、計算機組成原理、計算機網路、作業系統。
為什麼提起這門課程呢,因為基礎知識太重要了!這是科班區別於培訓班的最大不同,理論知識不一定馬上能用於專案上,但當與人討論起某個技術問題時你能夠知道它深層次的原因,看問題的角度會更加全面和系統。
打個比方,你可能聽過堆疊的名詞,但知道它的具體結構和不同嗎?學完資料結構就明白了;你知道計算機會算加減乘除,但具體是如何實現的呢?組成原理會告訴你;知道程式執行的時候怎麼區分指令地址和資料地址的嗎?作業系統會告訴你答案。
所以如果你大學不是計算機相關專業,或者是本專業但是沒有完全吃透基礎的話,強烈建議你務必抽時間好好學習這幾門課程。
#### 推薦書:
**計算機基礎綜合**推薦看大學的計算機專業教材就可以:資料結構、計算機組成原理、計算機網路、作業系統。
- 資料結構
> 1.教材:[《資料結構》](https://www.baidu.com/s?wd=《資料結構》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[嚴蔚敏](https://www.baidu.com/s?wd=嚴蔚敏&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao) 清華大學出版社
>
> 2.輔導書:《演算法與資料結構考研試題精析(第二版)》[機械工業出版社](https://www.baidu.com/s?wd=機械工業出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
- 計算機組成原理
> 教材:[《計算機組成原理》](https://www.baidu.com/s?wd=《計算機組成原理》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[唐朔飛](https://www.baidu.com/s?wd=唐朔飛&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao) [高等教育出版社](https://www.baidu.com/s?wd=高等教育出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
>
> 輔導書:
>
> [《計算機組成原理考研指導》](https://www.baidu.com/s?wd=《計算機組成原理考研指導》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)徐愛萍 清華大學出版社
>
> 《計算機組成原理--學習指導與習題解答》[唐朔飛](https://www.baidu.com/s?wd=唐朔飛&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao) [高等教育出版社](https://www.baidu.com/s?wd=高等教育出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
- 作業系統
> 教材:[《計算機作業系統(修訂版)》](https://www.baidu.com/s?wd=《計算機作業系統(修訂版)》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)湯子瀛 [西安電子科技大學出版社](https://www.baidu.com/s?wd=西安電子科技大學出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
>
> 輔導書:《作業系統考研輔導教程(計算機專業研究生入學考試全真題解) 》電子科技大學出版社
>
> 《作業系統考研指導》清華大學出版社
- 計算機網路
> 教材:《計算機網路(第五版)》謝希仁 電子工業出版社
>
> 輔導書:《計算機網路知識要點與習題解析》哈爾濱工程大學出版社
#### 視訊教材
看上面的課本教程估計非常枯燥,下面是我覺得講的不錯的國內大學公開課我聽過一部分,講的都是計算機專業的基礎內容,如果你沒有系統的學過或者學的不好,都是非常建議刷一遍視訊課的。
[武漢大學-資料結構 MOOC網路課程 ](https://www.icourse163.org/course/WHU-1001539003)
[華中科技大學-計算機組成原理](https://www.icourse163.org/course/HUST-1003159001)
[電子科技大學-計算機組成原理](https://www.icourse163.org/course/UESTC-1001543002)
[華中科技大學-作業系統原理](https://www.icourse163.org/course/HUST-1003405007)
[哈爾濱工業大學-計算機網路](https://www.icourse163.org/course/HIT-154005)
**這一小節寫的有點多,因為基礎實在是太重要了!科班和非科班的差距不是誰學的程式語言多,也不是誰框架用的溜,本質區別是理論知識儲備差別和用CS思維獨立思考分析解決問題的能力。**
## C++和C語法基礎
**語法是一門語言的基礎**,C++的基礎語句和語法和C是很像的,最大的不同在class和異常處理機制,還有模板的應用,所以有C基礎語法學起來是很快,沒有C基礎也沒關係,啃完下面推薦的書也差不多,光說不練假把式,看完之後趁熱把課後習題敲一遍並且自己編譯通過才算看完。
#### 推薦書:
[《C++ Primer 中文版(第 5 版)》](https://book.douban.com/subject/25708312/) 經典的入門書籍,不要拿大學教材XX強來對比,不是一個等級。
## 標準庫STL學習
**STL提供了豐富的演算法庫支援和各種容器**,C++標準庫提供了包括最基礎的標準輸入輸出`iostrem`、各種容器`vector、set、string` ,熟練掌握標準庫,不用重複造輪子(練手學習目的的造輪子除外)寫出更C++的程式碼。
#### 推薦書:
[《C++ Primer 中文版(第 5 版)》](https://book.douban.com/subject/25708312/)
[《STL原始碼剖析》]( https://book.douban.com/subject/1110934/ )
## C++進階
**學完了上面的C++基礎只是會用,要用好還需要不斷學習進階**, 站在巨人的肩膀上寫出更健壯高效的程式碼,你沒踩過的坑前人已經踩過一遍,關於一些語言細節和更好的編碼習慣,有很多優秀的書籍可以學習。
#### 推薦書
[《Effective C++》](https://book.douban.com/subject/1842426/) 改善程式與設計的55個具體做法,非常值得一看,老手和新手的差別由此產生!
[《More Effective C++(中文版》](https://book.douban.com/subject/5908727/)
> 同一個作者,繼Effective C++之後,Scott Meyers於1996推出這本《More Effective C++(35個改善程式設計與設計的有效方法)》“續集”。條款變得比較少,頁數倒是多了一些,原因是這次選材比“一集”更高階,尤其是第5章。Meyers將此章命名為技術。
[《Inside the C++ Object Model》](https://book.douban.com/subject/1484262/) 這本書還有中文版本,翻譯質量也很高[《深度探索C++物件模型》](https://book.douban.com/subject/1091086/)
## C++11新標準
**新標準提供瞭解決現有問題更優雅、更C++的實現**。現行的大部分C++軟體還是C++98的標準,C++98是C++的第一個標準,經歷這麼多年的發展,從前你需要從Boost庫(一個在C++98年代的準C++標準)獲得的對C++的擴充支援的大部分功能已經納入了C++11和甚至C++2X更新的標準當中,與時俱進拿起更先進的生產工具,工具就是效率。
#### 推薦書:
[《深入理解C++11》](https://book.douban.com/subject/24738301/)
## Linux系統基礎和shell script
**如今幾乎所有的網際網路服務都是跑在linux系統上面的**。 對Linux系統一無所知那更加談不上後臺開發了,所以要先學習linux系統操作,不如檔案管理,系統命令,檔案系統,許可權管理,系統服務等。
至於shell script 就類似win的批處理指令碼,相信我,你在linux下幹活早晚會需要它,所以趁早系統學起來。
#### 推薦書:
[《鳥哥的Linux私房菜基礎學習篇》](https://book.douban.com/subject/4889838/) 這個系列還有一個伺服器架設篇,前期學習個人感覺沒必要看
[《Linux Shell指令碼攻略》](https://book.douban.com/subject/6889456/)
[《Shell指令碼學習指南》](https://read.douban.com/ebook/124173616/?dcs=subject-rec&dcm=douban&dct=6889456)
## Linux環境高階程式設計
**普通使用者只需懂系統操作,軟體開發人員還要懂程式設計介面**。上一階段你已經能夠完成熟練操作Linux系統,知道一些常規的系統命令和服務,並且能夠利用shell script寫一些小工具提高日常開發效率。
我們的目標是星辰大海,作為軟體工程師,還需要更加深入的掌握linux系統程式設計技巧,**學習系統程式設計介面、系統呼叫API、記憶體管理、程序間通訊(IPC)**,這是本階段的學習目的。
#### 推薦書:
[《UNIX環境高階程式設計》](https://book.douban.com/subject/1788421/) 這本是linux程式設計必看的APUE,強烈推薦通讀一遍,後續值得反覆翻閱。
[《Linux/UNIX系統程式設計手冊》](https://book.douban.com/subject/25809330/) 這本書和APUE有點重複,我看完APUE這本就跳著看了,平常可以看目錄查閱。
## Linux網路程式設計套接字
在同一臺機器上程序間的通訊(IPC)有多種方式,可以是通過**訊息佇列、FIFO、共享記憶體**等方式。網路程式設計套接字是指:分佈在不同機器上的程式通過系統提供的網路通訊介面,跨越網路將不同機器上的程序連線起來,實現跨機器的網路通訊。一般有**UDP套接字、TCP套接字、Unix Domain,當然,如果你是通訊從業者對SCTP套接字肯定也不會陌生。**
#### 推薦書:
[《UNIX網路程式設計 卷1:套接字聯網API(第3版)》](https://book.douban.com/subject/4859464/)
[《UNIX網路程式設計 卷2:程序間通訊(第2版)》](https://book.douban.com/subject/26434599/)
## 資料庫和儲存
**程式執行資料都在易失性的記憶體中,需要持久化儲存時就需要資料庫**。一個後臺服務系統一般來說都需要考慮資料落地和永續性儲存的問題,這時就會涉及到資料庫選型和應用,資料庫分為關係型資料庫和非關係型資料庫。
**關係型資料庫**指採用了關係模型來組織資料的資料庫,代表是MySql。
關係模型指的就是二維表格模型,而一個關係型資料庫就是由二維表及其之間的聯絡所組成的一個數據組織。
**非關係型資料庫**以鍵值對儲存,且結構不固定,每一個元組可以有不一樣的欄位,每個元組可以根據需要增加一些自己的鍵值對,不侷限於固定的結構,可以減少一些時間和空間的開銷。代表有redis、memcached,騰訊內部元件ckv也是非關係型資料庫。
#### 推薦書:
[《SQL必知必會》](https://book.douban.com/subject/24250054/)
[《高效能MySQL》](https://book.douban.com/subject/23008813/)
[redis官方文件](https://redis.io/documentation) [redis中文網](http://redis.cn/)
> 關於redis還有很多應用,比如基於redis的分散式鎖的應用,高併發搶紅包模型等,這個後面可以寫一篇關於分散式鎖的原理和應用文章。
## 演算法基礎
**計算機演算法就是利用程式語言編寫出計算機能理解的解決問題的方法。**
好的演算法能更簡潔高效的解決問題,如今不論是校招還是社招,大廠筆試都會考察演算法,即使不是為了筆試作為軟體從業者也應該經常練習演算法,保持手感。學習演算法是學習解決問題的通用性方法有助於提高邏輯思維能力。
#### 學習方法
**就我個人經驗來說,不推薦直接啃書的方式學習演算法,建議看書的同時結合刷線上程式設計演算法題的方式。**
具體的:邊看資料結構或演算法導論,同時在[牛客](https://www.nowcoder.com/activity/oj)或者 [leetcode](https://leetcode-cn.com/ )上刷題,因為看書太枯燥很容易失去耐心,線上刷題的好處是你可以每天定目標,享受每個題目通過的快感,有正向反饋更容易堅持下來。
## 架構能力
**架構能力是利用已有知識來設計整個後臺服務系統的能力。**不僅要求掌握技能的維度還要深度,需要能根據不同需求和系統約束,制定不同的設計方案。
這時候考慮的東西會更多,包括服務模型的設計:是多程序還是多執行緒甚至協程微執行緒,分散式還是集中式;
儲存的選型:考慮資料庫選型用哪個?需要根據儲存的資料特徵和應用場景來區分,如果是社交應用的資料用非關係型資料庫來儲存可能更好,如果是電商訂單型別的資料,那麼用關係型資料庫來儲存可能更好;
當然,還有後臺系統的其他方方面面需要考慮,不一一舉例了。
## 更多的練習
**說了這麼多,最最重要的還是練習練習練習。**理論知識儲備是必要條件,移動網際網路時代大家接觸到的碎片化資訊太雜太亂,我個人經驗,高濃度的知識精華還是需要在大師的書本中汲取,所以看書是最正確和快速的學習路徑,沒有捷徑可走。
不過光看書也是不行,程式設計能力和技術是也是一門現代手藝活,還需要日常不斷的打磨手藝,正如**一萬小時定律**:
> 人們眼中的天才之所以卓越非凡,並非天資超人一等,而是付出了持續不斷的努力。1萬小時的錘鍊是任何人從平凡變成世界級大師的必要條件。要成為某個領域的專家,需要10000小時,按比例計算就是:如果每天工作八個小時,一週工作五天,那麼成為一個領域的專家至少需要五年。這就是一萬小時定律。
怎麼打磨提高程式設計技術能力呢?找專案,**找感興趣的**東西用程式碼去實現它,興趣是最好的老師,這點在程式設計和技術學習上也完全適用。
人們總傾向於去做快速獲得的愉悅感的事情,比如打一盤遊戲30分鐘就能獲得快感。相反,技術碎片的提高是一個長期的過程,三分鐘熱度肯定是難以成功的。
所以要用技術做自己感興趣的東西和帶趣味性的程式設計,比如寫個爬蟲小程式抓取網站資料或者寫個小遊戲,再或者自己造輪子給自己用,並樂此不疲的優化輪子。這樣每走一步都能獲得一點成就感,激勵自己繼續走下去,慢慢的一定會有質的飛躍。
## 一個網站
這個網站一定要告訴大家,網站就是個C++百科全書,類似Linux的man手冊,平常開發查忘記了函式名或者容器用法直接搜尋非常方便,我下載了離線版本。
網址:C++參考: [cppreference](https://en.cppreference.com/w/cpp)
## 待續
一口氣寫下來肯定還不夠完善,文章會保持更新和修改,想到了再補充吧文章在公眾號保持更新。
我整理了文中提到和推薦的電子書與視訊教材,都是學習過程收集的,搜尋 「**後端技術課堂**」 回覆 「**1024**」 免費分享給大家。
### 創作不易,點贊關注支援一下吧
我會持續分享軟體程式設計和程式設計師那些事,歡迎關注。若你對程式設計感興趣,我整理了這些年學習程式設計大約3G的資源彙總,關注公眾號「**後端技術學堂**」後傳送「**資料**」免費獲取。
![掃碼關注我](https://upload-images.jianshu.io/upload_images/7842464-146a203080f94c9a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)