學了C++不知道怎麼搞後臺開發?先看看這份學習路線吧!
作者:AJ
在去年結束的秋季招聘中,後臺開發或伺服器開發的崗位需求一度火熱,甚至超過了演算法崗。不少同學從諸神黃昏的演算法崗戰場上退下,轉向更偏向工程能力的後臺開發崗,從而造成後臺開發崗位競爭的大爆發。
後臺開發工程師主流使用的程式語言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就將以C++的角度,講講如何學習和準備後臺開發的崗位。
一、語言基礎
無論是C++開發還是Java開發,對於一個碼農而言,最重要的就是對於程式語言的熟悉。同樣,無論從事哪種型別的崗位,首當其衝的就是要掌握好語言基礎。
C++是一門博大精深的程式語言,不僅擁有繼承於C語言的過程化程式設計思想,還包含有面對物件(OOP)的設計理念。強大而又複雜。相對來說,C++的學習成本較高,語言裡面的坑較多。語言基礎的學習路線如下:
1 語法基礎
重點掌握:(務必熟悉底層機制原理)
- 指標和引用的概念
- 指標與記憶體關係
- 程式編譯過程
- static、const、#define的用法和區別
- C和C++區別
- 記憶體模型
- 記憶體中的棧和堆分配
2 面對物件基礎
(務必熟悉底層機制原理)
- 面向物件理解
- 解構函式
- 建構函式
- 拷貝構造
- 多型
- 純虛擬函式和虛擬函式
- 虛擬函式實現機制
- 虛擬函式表
- 訪問限定符 public、private、protected
- 繼承原理、虛繼承、菱形繼承
- 靜態繫結和動態繫結
- new/delete和malloc/free
- 過載、重寫和隱藏
3 語法進階
(務必熟悉底層機制原理)
- 智慧指標
- 左值、右值引用和move語義
- 型別轉換方式
- 常用的設計模式
- 執行緒安全的單例模式
- 記憶體溢位和記憶體洩漏
- C++11新特性
- 靜態連結庫和動態連結庫
4 STL標準模板庫
(務必能進行原始碼剖析)
- 迭代器、空間配置器理解
- 常用容器特點、用法以及底層實現vector、list、deque、set、map、unorderedmap
5 推薦書籍
- C++Primer》可作為工具書,隨手查閱
- 《EffectiveC++》深入瞭解C++的程式設計規範
- 《STL原始碼剖析》剖析STL的原始碼底層,非常具有學習價值
- 有精力還可以看《深度探索C++物件模型》《more EffecticeC++》
二、演算法與資料結構
對於普通人而言,演算法的學習最重要的是能夠形成基本的演算法思維,懂得從程式設計的角度對高重複性的操作做優化。這其中基本演算法思想的掌握和常用資料結構的理解是必不可少。這方面的學習更傾向於多看多想多練。
1 常見演算法型別
(務必能夠手撕程式碼)
- 排序演算法(冒泡、插入、選擇、快排、希爾、堆排、歸併、桶排、基數、計數)、字串操作、陣列操作、遞迴、回溯、分治、動態規劃等
2 常用資料結構
(務必熟悉底層原理和實現)
- 連結串列、棧、佇列、樹(二叉樹、平衡二叉樹、紅黑樹、B樹、B+樹、哈夫曼樹、字典樹)、跳錶、圖
3 推薦書籍
- 《大話資料結構》適合入門學習
- 《劍指offer》必刷66題
- 《演算法導論》儘量看,能啃完就是大神
三、計算機網路
網路相關的東西不是很多,關鍵在於對常見網路協議簇的認識和理解,以及一些常規操作底層設計實現的剖析。比如:
| 輸入www.baidu.com會發生什麼
| 微信掃描登入會發生什麼
1 重點掌握知識點
- OSI七層模型
- TCP/IP五層模型
- TCP/IP協議總結
- TCP、UDP區別
- TCP三次握手、四次揮手
- TCP狀態轉換
- TCP狀態中TIME_WAIT
- TCP連線建立需要為什麼不是兩次握手
- TCP第三次握手失敗會出現什麼
- TCP長連線和短連結及優缺點
- TCP擁塞控制-慢啟動、擁塞避免、快重傳、快啟動
- TCP如何保證可靠性傳輸
- TCP如何解決粘包、拆包問題
- TCP為什麼可靠
- UDP如何實現TCP可靠傳輸
- IP地址和子網掩碼
- ARP解析過程
- DNS原理
- HTTP狀態碼
- HTTP1.0、HTTP1.1、HTTP2.0區別
- HTTP和HTTPS區別
- HTTPS加密過程
- 非對稱加密和對稱加密演算法
- Nagle演算法
2 推薦書籍
- 《計算機網路自頂向下方法》教材書,可放手邊查閱
- 《TCP/IP詳解》重點了解TCP、IP、UDP協議實現
四、資料庫
資料庫的一般使用其實不難,但是對於不同資料庫的特性、實現機制、應用場景和效能優化方面卻能夠難倒一大批面試者。同樣資料庫本身也是非常好的專案例項,往往能夠從中學習到許多程式設計的思想和模式。因此,對資料庫要明白怎麼用、為什麼用、怎麼用得好這幾個方面的問題。
1 重點掌握
- 資料庫類別
- 關係型資料庫和非關係型資料庫區別
MySQL: - SQL常見語句
- MySQL內連結,外連結(左連結、右連結、全連結)
- MySQL索引型別和原理
- MySQL事務實現原理ACID
- MySQL資料儲存引擎
- MySQL主從複製原理、作用和實現
- MySQL日記系統redo log、binlog、undo log
- MVCC實現原理
- Sql優化思路
- 正規化理論
- 資料庫高併發解決方法
Redis:
- Redis支援的資料型別
- Redis持久化
- Redis 架構模式
- 主從複製
- 一致性雜湊演算法
2 推薦書籍
- 《高效能 Mysql》能夠加深對Mysql的理解和使用
- 《Redis設計與實現》比較全面的書,可以多看看
五、作業系統
作業系統的問題會集中在程序和執行緒,但是這一類的問題往往會以開放題的形式出現。主要考察的是對作業系統元件以及執行過程的理解。比如:
| 開機登入系統發生了什麼?
| 複製貼上是怎樣操作的?
1 重點掌握
- 實體記憶體和虛擬記憶體
- 快取IO和直接IO
- 作業排程演算法
- 執行緒和程序
- 程序和執行緒的排程
- 執行緒的建立和結束
- 執行緒狀態
- 執行緒間通訊與執行緒同步機制
- 互斥鎖和訊號量
- 執行緒池
- 消費者和生產者
- 死鎖
- 併發和並行
2 推薦書籍
- 《深入理解計算機系統》很全面的書,這一本就夠用了
六、Linux系統
對Linux系統的熟練使用是後臺開發/伺服器開發的必備技能點。這年頭,不會幾個Linux指令都不好意思說自己是敲程式碼的。(客戶端和前端的同學表示不服)不管怎樣,對於Linux系統的掌握無論在哪個方向上,都會有用武之地的。
1 Linux系統操作和命令
- top命令
- ps命令
- netstat命令
- awk命令
- find命令
- grep命令
- wc命令
- sed命令
- head和tail命令
- 正則表示式
- 如何查找出現頻率最高的100個IP地址
- linux如何統計檔案中某個字串出現的頻率
- linux啟動的第一個程序
- linux檢視端口占用
- linux檢視CPU和記憶體使用
- Linux檢視系統負載命令
- Linux除錯程式
- Linux硬連結和軟連線
- core dump
- cmake和makefile
- Shell指令碼基本語法和使用
2 推薦書籍
- 《鳥哥私房菜》入門足夠了,多敲多寫才能更快掌握
七、Linux網路程式設計
後臺開發是離不開網路程式設計的,甚至簡單來說,後臺開發就是用厲害點的電腦去處理大規模的網路請求。所以作為一名合格的後端開發人員,對Linux網路程式設計的熟悉是必不可少的。
1 重點掌握
- 孤兒程序、殭屍程序和守護程序
- 程序間通訊方式signal、file、pipe、shm、sem、msg、socket
- 執行緒同步機制執行緒:互斥量、鎖機制、條件變數、訊號量、讀寫鎖
- fork返回值
- 五大IO模型:阻塞I/O、非阻塞I/O、I/O複用、訊號驅動I/O、非同步I/O
- IO複用機制
- epoll與select/poll
- LT水平觸發和ET邊緣觸發
- Reactor和Proactor模式
- 反向代理、負載均衡
2 推薦書籍
- 《UNIX環境高階程式設計》APUE 比較難啃,可以挑著看
- 《Unix網路程式設計》UNP 同樣比較難啃,可以挑著看
- 《Linux多執行緒伺服器端程式設計》Muduo網路庫,推薦看看原始碼實現
- 《深入理解Nginx》深入瞭解基於C的web伺服器實現
八、專案準備
如果以上的東西你都已經準備好了,那麼相信你已經了具備C++後臺開發能力。但是要記得,一個大型線上專案的開發,從來都不純粹是單一語言的設計和實現。
因此用C++或者用Java或者用Golang或者用Python的區別或許沒那麼大,它們都有擅長的地方,畢竟存在即真理。所以,如果你真的有精力的話,不妨還可以瞭解一下更深層次的技術:
- 海量日誌處理和平行計算開發
- 分散式技術框架、中介軟體等 Dubbo、Spring Cloud 、Zookeeper 、Kfaka
- 流媒體分發技術CDN
- ...
當然,這些都不是非常必要的。但是絕對是亮點!此外,你可以準備一些基礎向的相關專案:
- 網路庫,可參考Muduo或者Nginx實現
- web伺服器/http伺服器,可實現基本的http響應請求和處理
- 簡易版STL庫,展現C++的綜合程式碼能力
- 區域網聊天室開發,涉及到網路程式設計實現線上群聊
- 分散式日誌系統
- 簡易版資料庫設計
- 可參考一些C++常用庫,造一些輪子或者做些有趣的小工具。
本文所介紹的整體學習路線可覆蓋絕大多數大廠的面試題目和考察範圍,如今學習資料太多,選擇路線清晰的適合自己的才最重要。資料不必多,能理解掌握才是最關鍵的。根據上述學習路線,我總結出一份複習文件。關注微信搜尋業餘碼農即可獲得全套答案總結。