非常詳細的 Linux C/C++ 學習路線總結!已拿騰訊offer

  • 2020 年 3 月 29 日
  • 筆記

創作不易,點贊關注支持一下吧,我的更多原創技術分享,關注公眾號「後端技術學堂」第一時間看!

最近在知乎經常被邀請回答類似如何學習C++和C++後台開發應該具體儲備哪些基礎技能的問題。

本身我從事的的C++後台開發的工作,目前在騰訊從事軟件開發工作,所以寫這篇文章,分享自己的C++後台開發學習路徑和點過的技能樹,希望能給想從事後台開發的同學一點參考,若能幫你少走些彎路就更好。

工欲善其事必先利其器,好的書籍能讓學習事半功倍,所以每個技能點之後我會推薦一些書,都是我讀過且口碑不錯的書,供參考。

文末可以獲取學習路線資源,需要的同學自取。

分享的是我的學習路徑,如果你也能順着這個學習路徑認真學一遍,我想在後台開發技術上你已經有一個很不錯的技術積累,加上項目練習通過大部分大廠面試是沒有問題的。

計算機基礎綜合

考過CS或者軟件工程研究生的同學可能對這個標題不陌生,是的,我說的就是專業課代號408的計算機基礎綜合。這門專業課包含:數據結構、計算機組成原理、計算機網路、操作系統。

為什麼提起這門課程呢,因為基礎知識太重要了!這是科班區別於培訓班的最大不同,理論知識不一定馬上能用於項目上,但當與人討論起某個技術問題時你能夠知道它深層次的原因,看問題的角度會更加全面和系統。

打個比方,你可能聽過堆棧的名詞,但知道它的具體結構和不同嗎?學完數據結構就明白了;你知道計算機會算加減乘除,但具體是如何實現的呢?組成原理會告訴你;知道程序執行的時候怎麼區分指令地址和數據地址的嗎?操作系統會告訴你答案。

所以如果你大學不是計算機相關專業,或者是本專業但是沒有完全吃透基礎的話,強烈建議你務必抽時間好好學習這幾門課程。

推薦書:

計算機基礎綜合推薦看大學的計算機專業教材就可以:數據結構、計算機組成原理、計算機網路、操作系統。

  • 數據結構

1.教材:《數據結構》嚴蔚敏 清華大學出版社

2.輔導書:《算法與數據結構考研試題精析(第二版)》機械工業出版社

  • 計算機組成原理

教材:《計算機組成原理》唐朔飛高等教育出版社

輔導書:

《計算機組成原理考研指導》徐愛萍 清華大學出版社

《計算機組成原理–學習指導與習題解答》唐朔飛高等教育出版社

  • 操作系統

教材:《計算機操作系統(修訂版)》湯子瀛 西安電子科技大學出版社

輔導書:《操作系統考研輔導教程(計算機專業研究生入學考試全真題解) 》電子科技大學出版社

《操作系統考研指導》清華大學出版社

  • 計算機網絡

教材:《計算機網絡(第五版)》謝希仁 電子工業出版社

輔導書:《計算機網絡知識要點與習題解析》哈爾濱工程大學出版社

視頻教材

看上面的課本教程估計非常枯燥,下面是我覺得講的不錯的國內大學公開課我聽過一部分,講的都是計算機專業的基礎內容,如果你沒有系統的學過或者學的不好,都是非常建議刷一遍視頻課的。

武漢大學-數據結構 MOOC網絡課程

華中科技大學-計算機組成原理

電子科技大學-計算機組成原理

華中科技大學-操作系統原理

哈爾濱工業大學-計算機網絡

這一小節寫的有點多,因為基礎實在是太重要了!科班和非科班的差距不是誰學的編程語言多,也不是誰框架用的溜,本質區別是理論知識儲備差別和用CS思維獨立思考分析解決問題的能力。

C++和C語法基礎

語法是一門語言的基礎,C++的基礎語句和語法和C是很像的,最大的不同在class和異常處理機制,還有模板的應用,所以有C基礎語法學起來是很快,沒有C基礎也沒關係,啃完下面推薦的書也差不多,光說不練假把式,看完之後趁熱把課後習題敲一遍並且自己編譯通過才算看完。

推薦書:

《C++ Primer 中文版(第 5 版)》 經典的入門書籍,不要拿大學教材XX強來對比,不是一個等級。

標準庫STL學習

STL提供了豐富的算法庫支持和各種容器,C++標準庫提供了包括最基礎的標準輸入輸出iostrem、各種容器vector、set、string ,熟練掌握標準庫,不用重複造輪子(練手學習目的的造輪子除外)寫出更C++的代碼。

推薦書:

《C++ Primer 中文版(第 5 版)》

《STL源碼剖析》

C++進階

學完了上面的C++基礎只是會用,要用好還需要不斷學習進階, 站在巨人的肩膀上寫出更健壯高效的代碼,你沒踩過的坑前人已經踩過一遍,關於一些語言細節和更好的編碼習慣,有很多優秀的書籍可以學習。

推薦書

《Effective C++》 改善程序與設計的55個具體做法,非常值得一看,老手和新手的差別由此產生!

《More Effective C++(中文版》

同一個作者,繼Effective C++之後,Scott Meyers於1996推出這本《More Effective C++(35個改善編程與設計的有效方法)》「續集」。條款變得比較少,頁數倒是多了一些,原因是這次選材比「一集」更高階,尤其是第5章。Meyers將此章命名為技術。

《Inside the C++ Object Model》 這本書還有中文版本,翻譯質量也很高《深度探索C++對象模型》

C++11新標準

新標準提供了解決現有問題更優雅、更C++的實現。現行的大部分C++軟件還是C++98的標準,C++98是C++的第一個標準,經歷這麼多年的發展,從前你需要從Boost庫(一個在C++98年代的准C++標準)獲得的對C++的擴充支持的大部分功能已經納入了C++11和甚至C++2X更新的標準當中,與時俱進拿起更先進的生產工具,工具就是效率。

推薦書:

《深入理解C++11》

Linux系統基礎和shell script

如今幾乎所有的互聯網服務都是跑在linux系統上面的。 對Linux系統一無所知那更加談不上後台開發了,所以要先學習linux系統操作,不如文件管理,系統命令,文件系統,權限管理,系統服務等。

至於shell script 就類似win的批處理腳本,相信我,你在linux下幹活早晚會需要它,所以趁早系統學起來。

推薦書:

《鳥哥的Linux私房菜基礎學習篇》 這個系列還有一個服務器架設篇,前期學習個人感覺沒必要看

《Linux Shell腳本攻略》

《Shell腳本學習指南》

Linux環境高級編程

普通用戶只需懂系統操作,軟件開發人員還要懂編程接口。上一階段你已經能夠完成熟練操作Linux系統,知道一些常規的系統命令和服務,並且能夠利用shell script寫一些小工具提高日常開發效率。

我們的目標是星辰大海,作為軟件工程師,還需要更加深入的掌握linux系統編程技巧,學習系統編程接口、系統調用API、內存管理、進程間通信(IPC),這是本階段的學習目的。

推薦書:

《UNIX環境高級編程》 這本是linux編程必看的APUE,強烈推薦通讀一遍,後續值得反覆翻閱。

《Linux/UNIX系統編程手冊》 這本書和APUE有點重複,我看完APUE這本就跳着看了,平常可以看目錄查閱。

Linux網絡編程套接字

在同一台機器上進程間的通信(IPC)有多種方式,可以是通過消息隊列、FIFO、共享內存等方式。網絡編程套接字是指:分佈在不同機器上的程序通過系統提供的網絡通信接口,跨越網絡將不同機器上的進程連接起來,實現跨機器的網絡通信。一般有UDP套接字、TCP套接字、Unix Domain,當然,如果你是通信從業者對SCTP套接字肯定也不會陌生。

推薦書:

《UNIX網絡編程 卷1:套接字聯網API(第3版)》

《UNIX網絡編程 卷2:進程間通信(第2版)》

數據庫和存儲

程序運行數據都在易失性的內存中,需要持久化存儲時就需要數據庫。一個後台服務系統一般來說都需要考慮數據落地和持久性存儲的問題,這時就會涉及到數據庫選型和應用,數據庫分為關係型數據庫和非關係型數據庫。

關係型數據庫指採用了關係模型來組織數據的數據庫,代表是MySql。
關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。

非關係型數據庫以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不局限於固定的結構,可以減少一些時間和空間的開銷。代表有redis、memcached,騰訊內部組件ckv也是非關係型數據庫。

推薦書:

《SQL必知必會》

《高性能MySQL》

redis官方文檔 redis中文網

關於redis還有很多應用,比如基於redis的分佈式鎖的應用,高並發搶紅包模型等,這個後面可以寫一篇關於分佈式鎖的原理和應用文章。

算法基礎

計算機算法就是利用編程語言編寫出計算機能理解的解決問題的方法。

好的算法能更簡潔高效的解決問題,如今不論是校招還是社招,大廠筆試都會考察算法,即使不是為了筆試作為軟件從業者也應該經常練習算法,保持手感。學習算法是學習解決問題的通用性方法有助於提高邏輯思維能力。

學習方法

就我個人經驗來說,不推薦直接啃書的方式學習算法,建議看書的同時結合刷在線編程算法題的方式。

具體的:邊看數據結構或算法導論,同時在牛客或者 leetcode上刷題,因為看書太枯燥很容易失去耐心,在線刷題的好處是你可以每天定目標,享受每個題目通過的快感,有正向反饋更容易堅持下來。

架構能力

架構能力是利用已有知識來設計整個後台服務系統的能力。不僅要求掌握技能的維度還要深度,需要能根據不同需求和系統約束,制定不同的設計方案。

這時候考慮的東西會更多,包括服務模型的設計:是多進程還是多線程甚至協程微線程,分佈式還是集中式;

存儲的選型:考慮數據庫選型用哪個?需要根據存儲的數據特徵和應用場景來區分,如果是社交應用的數據用非關係型數據庫來存儲可能更好,如果是電商訂單類型的數據,那麼用關係型數據庫來存儲可能更好;

當然,還有後台系統的其他方方面面需要考慮,不一一舉例了。

更多的練習

說了這麼多,最最重要的還是練習練習練習。理論知識儲備是必要條件,移動互聯網時代大家接觸到的碎片化信息太雜太亂,我個人經驗,高濃度的知識精華還是需要在大師的書本中汲取,所以看書是最正確和快速的學習路徑,沒有捷徑可走。

不過光看書也是不行,編程能力和技術是也是一門現代手藝活,還需要日常不斷的打磨手藝,正如一萬小時定律

人們眼中的天才之所以卓越非凡,並非天資超人一等,而是付出了持續不斷的努力。1萬小時的錘鍊是任何人從平凡變成世界級大師的必要條件。要成為某個領域的專家,需要10000小時,按比例計算就是:如果每天工作八個小時,一周工作五天,那麼成為一個領域的專家至少需要五年。這就是一萬小時定律。

怎麼打磨提高編程技術能力呢?找項目,找感興趣的東西用代碼去實現它,興趣是最好的老師,這點在編程和技術學習上也完全適用。

人們總傾向於去做快速獲得的愉悅感的事情,比如打一盤遊戲30分鐘就能獲得快感。相反,技術碎片的提高是一個長期的過程,三分鐘熱度肯定是難以成功的。

所以要用技術做自己感興趣的東西和帶趣味性的編程,比如寫個爬蟲小程序抓取網站數據或者寫個小遊戲,再或者自己造輪子給自己用,並樂此不疲的優化輪子。這樣每走一步都能獲得一點成就感,激勵自己繼續走下去,慢慢的一定會有質的飛躍。

一個網站

這個網站一定要告訴大家,網站就是個C++百科全書,類似Linux的man手冊,平常開發查忘記了函數名或者容器用法直接搜索非常方便,我下載了離線版本。

網址:C++參考: cppreference

待續

一口氣寫下來肯定還不夠完善,文章會保持更新和修改,想到了再補充吧文章在公眾號保持更新。

我整理了文中提到和推薦的電子書與視頻教材,都是學習過程收集的,搜索 「後端技術課堂」 回復 「1024」 免費分享給大家。

創作不易,點贊關注支持一下吧

我會持續分享軟件編程和程序員那些事,歡迎關注。若你對編程感興趣,我整理了這些年學習編程大約3G的資源匯總,關注公眾號「後端技術學堂」後發送「資料」免費獲取。