如何拿下C++開發系列offer??讀完下文就懂了。

2020-08-14 19:09:34

Hello:
Person person = new Person();
person.Name = 「xueyubin」;
person.WeChat = 「18309212110」;
person.HeaderPhoto=「戴眼鏡、黑眼圈、格子衫、牛仔褲、雙肩包」;
person.Sex = 「男」;
String major[] = { ‘C’,「C++」, 「Linux」,「MySQL」 };
person.IWantSay(「關心足夠大的問題,注重考察成本的增長趨勢!」)

目錄

一、語言基礎

無論是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+樹、哈夫曼樹、字典樹)、跳錶、圖

推薦書籍

《大話數據結構》適合入門學習
《劍指offer》必刷66題
《演算法導論》儘量看,能啃完就是大神

三、計算機網路

網路相關的東西不是很多,關鍵在於對常見網路協定簇的認識和理解,以及一些常規操作底層設計實現的剖析。比如:

輸入http://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++常用庫,造一些輪子或者做些有趣的小工具。在这里插入图片描述