後端技術學堂
正文
我的另一篇文章 《騰訊 C++ 背景開發面試筆試知識點參考筆記》整理了 C++ 背景開發知識點,本文嘗試從自身學習過程出發,介紹這些技術點的掌握途徑和學習路線。
本身我從事的的 C++ 背景開發的工作,目前在騰訊負責産品軟體開發,是以寫這篇文章,分享自己的 C++ 背景開發學習路徑和點過的技能樹,希望能給想從事背景開發的同學一點參考,若能幫你少走些彎路就更好。
工欲善其事必先利其器,好的書籍能讓學習事半功倍,是以每個技能點之後我會推薦一些書,都是我讀過且口碑不錯的書,供參考。
分享的是我的學習路徑,如果你也能順着這個學習路徑認真學一遍,我想在背景開發技術上你已經有一個很不錯的技術積累,加上項目練習通過大部分大廠面試是沒有問題的。
計算機基礎綜合
考過 CS 或者軟體工程研究所學生的同學可能對這個标題不陌生,是的,我說的就是專業課代号 408 的計算機基礎綜合。這門專業課包含:資料結構、計算機組成原理、計算機網路、作業系統。
為什麼提起這門課程呢,因為基礎知識太重要了!理論知識不一定馬上能用于項目上,但當與人讨論起某個技術問題時你能夠知道它深層次的原因,看問題的角度會更加全面和系統。
打個比方:
- 你可能聽過堆棧的名詞,但知道它的具體結構和不同嗎?學完資料結構就明白了;
- 你知道計算機會算加減乘除,但具體是如何實作的呢?組成原理會告訴你;
- 知道程式執行的時候怎麼區分指令位址和資料位址的嗎?作業系統會告訴你答案。
是以如果你大學不是計算機相關專業,或者是本專業但是沒有完全吃透基礎的話,強烈建議你務必抽時間好好學習這幾門課程。
推薦書:
計算機基礎綜合推薦看大學的計算機專業教材就可以:資料結構、計算機組成原理、計算機網路、作業系統。
- 資料結構
教材:
《資料結構》 清華大學出版社
輔導書:
《算法與資料結構考研試題精析(第二版)》
- 計算機組成原理
教材:
《計算機組成原理》唐朔飛 高等教育出版社
輔導書:
《計算機組成原理考研指導》徐愛萍 清華大學出版社
《計算機組成原理--學習指導與習題解答》唐朔飛 高等教育出版社
- 作業系統
教材:
《計算機作業系統(修訂版)》湯子瀛 西安電子科技大學出版社
輔導書:
《作業系統考研輔導教程(計算機專業研究所學生入學考試全真題解) 》電子科技大學出版社
《作業系統考研指導》清華大學出版社
- 計算機網絡
教材:
《計算機網絡(第五版)》謝希仁 電子工業出版社
輔導書:
《計算機網絡知識要點與習題解析》哈爾濱工程大學出版社
視訊教材
看上面的課本教程估計非常枯燥,下面是我覺得講的不錯的國内大學公開課我聽過一部分,講的都是計算機專業的基礎内容,如果你沒有系統的學過或者學的不好,都是非常建議刷一遍視訊課的。
- 武漢大學 —— 資料結構 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 将此章命名為技術。
《深度探索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 這本就跳着看了,平常可以看目錄查閱。
TCP/IP協定
目前網絡通信中應用最廣泛的協定就是 IP TCP 協定,後面 Unix 提供的 TCP 套接字也是基于協定實作,是以很有必要系統的學習 TCP/IP 協定。
推薦書:
大學的計算機網絡教程
《TCP/IP詳解 卷1:協定》
《TCP/IP詳解 卷2:實作》
《TCP/IP詳解 卷3:TCP事務協定、HTTP、NNTP和UNIX域協定》
這幾本書很厚,可以先看卷1、卷3
Linux網絡程式設計套接字
在同一台機器上程序間的通信(IPC)有多種方式,可以是通過消息隊列、FIFO、共享記憶體等方式。網絡程式設計套接字是指:分布在不同機器上的程式通過系統提供的網絡通信接口,跨越網絡将不同機器上的程序連接配接起來,實作跨機器的網絡通信。一般有UDP套接字、TCP套接字,當然,如果你是通信從業者對 SCTP 套接字肯定也不會陌生。
推薦書:
《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》
《UNIX網絡程式設計 卷2:程序間通信(第2版)》
資料庫和存儲
程式運作資料都在易失性的記憶體中,需要持久化存儲時就需要資料庫。一個背景服務系統一般來說都需要考慮資料落地和持久性存儲的問題,這時就會涉及到資料庫選型和應用,資料庫分為關系型資料庫和非關系型資料庫。
關系型資料庫:指采用了關系模型來組織資料的資料庫,代表是 MySql。
關系模型指的就是二維表格模型,而一個關系型資料庫就是由二維表及其之間的聯系所組成的一個資料組織。
非關系型資料庫:以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不局限于固定的結構,可以減少一些時間和空間的開銷。代表有redis、memcached,騰訊内部元件 ckv 也是非關系型資料庫。
推薦書:
《SQL必知必會》
《高性能MySQL》
redis官方文檔
關于redis還有很多應用,比如基于 redis 的分布式鎖的應用,高并發搶紅包模型等.
算法基礎
計算機算法就是利用程式設計語言編寫出計算機能了解的解決問題的方法。
好的算法能更簡潔高效的解決問題,如今不論是校招還是社招,大廠筆試都會考察算法,即使不是為了筆試作為軟體從業者也應該經常練習算法,保持手感。學習算法是學習解決問題的通用性方法有助于提高邏輯思維能力。
學習方法
就我個人經驗來說,不推薦直接啃書的方式學習算法,建議看書的同時結合刷線上程式設計算法題的方式。
具體的:邊看資料結構或算法導論,同時在牛客或者 leetcode 上刷題,因為看書太枯燥很容易失去耐心,線上刷題的好處是你可以每天定目标,享受每個題目通過的快感,有正向回報更容易堅持下來。
架構能力
架構能力是利用已有知識來設計整個背景服務系統的能力。不僅要求掌握技能的次元還要深度,需要能根據不同需求和系統限制,制定不同的設計方案。
這時候考慮的東西會更多,包括服務模型的設計:是多程序還是多線程甚至協程微線程,分布式還是集中式;
存儲的選型:考慮資料庫選型用哪個?需要根據存儲的資料特征和應用場景來區分,如果是社交應用的資料用非關系型資料庫來存儲可能更好,如果是電商訂單類型的資料,那麼用關系型資料庫來存儲可能更好;
當然,還有背景系統的其他方方面面需要考慮,不一一舉例了。
更多的練習
說了這麼多,最最重要的還是練習練習練習。理論知識儲備是必要條件,移動網際網路時代大家接觸到的碎片化資訊太雜太亂,我個人經驗,高濃度的知識精華還是需要在大師的書本中汲取,是以看書是最正确和快速的學習路徑,沒有捷徑可走。
不過光看書也是不行,程式設計能力和技術是也是一門現代手藝活,還需要日常不斷的打磨手藝,正如一萬小時定律:
人們眼中的天才之是以卓越非凡,并非天資超人一等,而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成世界級大師的必要條件。要成為某個領域的專家,需要10000小時,按比例計算就是:如果每天工作八個小時,一周工作五天,那麼成為一個領域的專家至少需要五年。這就是一萬小時定律。
怎麼打磨提高程式設計技術能力呢?找項目,找感興趣的東西用代碼去實作它,興趣是最好的老師,這點在程式設計和技術學習上也完全适用。
人們總傾向于去做快速獲得的愉悅感的事情,比如打一盤遊戲 30 分鐘就能獲得快感。相反,技術碎片的提高是一個長期的過程,三分鐘熱度肯定是難以成功的。
是以要用技術做自己感興趣的東西和帶趣味性的程式設計,比如寫個爬蟲小程式抓取網站資料或者寫個小遊戲,再或者自己造輪子給自己用,并樂此不疲的優化輪子。這樣每走一步都能獲得一點成就感,激勵自己繼續走下去,慢慢的一定會有質的飛躍。
一個網站
這個網站一定要告訴大家,網站就是個 C++ 百科全書,類似 Linux 的 man 手冊,平常開發查忘記了函數名或者容器用法直接搜尋非常友善。