校招形勢前端
在去年結束的秋季招聘中,後臺開發或服務器開發的崗位需求一度火熱,甚至超過了算法崗。很多同窗從諸神黃昏的算法崗戰場上退下,轉向更偏向工程能力的後臺開發崗,從而形成後臺開發崗位競爭的大爆發。linux
後臺開發工程師主流使用的編程語言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就將以C++的角度,講講如何學習和準備後臺開發的崗位。web
1、語言基礎面試
不管是C++開發仍是Java開發,對於一個碼農而言,最重要的就是對於編程語言的熟悉。一樣,不管從事哪一種類型的崗位,首當其衝的就是要掌握好語言基礎。正則表達式
C++是一門博大精深的編程語言,不只擁有繼承於C語言的過程化程序設計思想,還包含有面對對象(OOP)的設計理念。強大而又複雜。相對來講,C++的學習成本較高,語言裏面的坑較多。語言基礎的學習路線以下:算法
1 語法基礎sql
重點掌握:(務必熟悉底層機制原理)數據庫
指針和引用的概念編程
指針與內存關係後端
程序編譯過程
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++》
2、算法與數據結構
對於普通人而言,算法的學習最重要的是可以造成基本的算法思惟,懂得從程序設計的角度對高重複性的操做作優化。這其中基本算法思想的掌握和經常使用數據結構的理解是必不可少。這方面的學習更傾向於多看多想多練。
1 常見算法類型
(務必可以手撕代碼)
排序算法(冒泡、插入、選擇、快排、希爾、堆排、歸併、桶排、基數、計數)、字符串操做、數組操做、遞歸、回溯、分治、動態規劃等
如何準備算法可見歷史文章
2 經常使用數據結構
(務必熟悉底層原理和實現)
鏈表、棧、隊列、樹(二叉樹、平衡二叉樹、紅黑樹、B樹、B+樹、哈夫曼樹、字典樹)、跳錶、圖
3 推薦書籍
《大話數據結構》適合入門學習
《劍指offer》必刷66題
《算法導論》儘可能看,能啃完就是大神
3、計算機網絡
網絡相關的東西不是不少,關鍵在於對常見網絡協議簇的認識和理解,以及一些常規操做底層設計實現的剖析。好比:
| 輸入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.一、HTTP2.0區別
HTTP和HTTPS區別
HTTPS加密過程
非對稱加密和對稱加密算法
Nagle算法
2 推薦書籍
《計算機網絡自頂向下方法》教材書,可放手邊查閱
《TCP/IP詳解》重點了解TCP、IP、UDP協議實現
4、數據庫
數據庫的通常使用其實不難,可是對於不一樣數據庫的特性、實現機制、應用場景和性能優化方面卻可以難倒一大批面試者。一樣數據庫自己也是很是好的項目實例,每每可以從中學習到許多程序設計的思想和模式。所以,對數據庫要明白怎麼用、爲何用、怎麼用得好這幾個方面的問題。
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設計與實現》比較全面的書,能夠多看看
5、操做系統
操做系統的問題會集中在進程和線程,可是這一類的問題每每會以開放題的形式出現。主要考察的是對操做系統組件以及運行過程的理解。好比:
| 開機登陸系統發生了什麼?
| 複製粘貼是怎樣操做的?
1 重點掌握
物理內存和虛擬內存
緩存IO和直接IO
做業調度算法
線程和進程
進程和線程的調度
線程的建立和結束
線程狀態
線程間通訊與線程同步機制
互斥鎖和信號量
線程池
消費者和生產者
死鎖
併發和並行
2 推薦書籍
《深刻理解計算機系統》很全面的書,這一本就夠用了
6、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 推薦書籍
《鳥哥私房菜》入門足夠了,多敲多寫才能更快掌握
7、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服務器實現
8、項目準備
若是以上的東西你都已經準備好了,那麼相信你已經了具有C++後臺開發能力。可是要記得,一個大型線上項目的開發,歷來都不純粹是單一語言的設計和實現。
所以用C++或者用Java或者用Golang或者用Python的區別或許沒那麼大,它們都有擅長的地方,畢竟存在即真理。因此,若是你真的有精力的話,不妨還能夠了解一下更深層次的技術:
海量日誌處理和並行計算開發
分佈式技術框架、中間件等 Dubbo、Spring Cloud 、Zookeeper 、Kfaka
流媒體分發技術CDN
...
固然,這些都不是很是必要的。可是絕對是亮點!此外,你能夠準備一些基礎向的相關項目:
網絡庫,可參考Muduo或者Nginx實現
web服務器/http服務器,可實現基本的http響應請求和處理
簡易版STL庫,展示C++的綜合代碼能力
局域網聊天室開發,涉及到網絡編程實如今線羣聊
分佈式日誌系統
簡易版數據庫設計
可參考一些C++經常使用庫,造一些輪子或者作些有趣的小工具。
......更多靈感可查看歷史文章
總結
在校園招聘中,對後臺開發的面試大多仍是針對候選人的計算機基礎。大多數學生在校內接觸不到太多高併發高可用的服務場景,甚至能上線的項目都不多,所以也很難要求校招生可以真正具有後臺開發的能力。
因此對於C++後臺開發崗而言,對C++/Linux的充分熟悉以及紮實的計算機基礎和有相關的學習經歷,就已經可以知足各大公司的要求了。固然若是有在基礎架構分佈式開發等方面的經驗,就更是各大廠搶手的香餑餑。
本文所介紹的總體學習路線可覆蓋絕大多數大廠的面試題目和考察範圍,現在學習資料太多,選擇路線清晰的適合本身的才最重要。資料沒必要多,能理解掌握纔是最關鍵的。