Linux C/C++ 學習路線(已拿騰訊、百度 offer)
一、秋招 Linux C/C++ offer 情況
二、Linux C/C++ 方向的一些思考
三、計算機基礎知識的梳理
四、C++ 方向的深入學習路線
五、專案 + 亮點 + 面試的一些思考
六、總結
前言
Linux C/C++ 從零基礎到大神的學習路線,自己的真實學習路線,乾貨很多,建議收藏,認真閱讀。
在校期間,我一直走的都是 Linux C/C++ 學習路線,歷經暑期實習、秋招決戰、校招期間投的大部分崗位都是 Linux C/C++ 後臺方向,對於這個方向,有著自己的理解。
從接觸 C++ 到我現在正式工作,大概有 2 年多的時間,對於這個方向的學習路線、以及學習程式設計的方法摸索出來了一些,看完本文,希望對於正在走 Linux C/C++ 路上的同學能有所幫助。
一、秋招 Linux C/C++ offer 情況
本人就讀於雙非院校、非科班本科學生,專業是偏硬體的(學校課程只有一門 C 語言與程式設計相關,其餘的課程跟程式設計一點點的關係都沒有),在校期間也沒拿過什麼大的獎項。
計算機基礎為零,大二上學期接觸 C 語言,大二一年學了 C 語言和資料結構,大三在學校的實驗室開始學習計算機基礎和學習 C++ 方向,一路自學程式設計,始終相信自己,也是拿到了大廠 offer。
秋招 offer 情況:
- 騰訊 後臺開發工程師(實習轉正)
- 百度 手百 feeds 流,軟體研發工程師
- 美團 後臺開發 (C++ 方向面試)
- 作業幫 後臺開發工程師
- 好未來 後臺開發工程師
- 迅雷 後臺開發工程師
- 盛大遊戲 C++ 開發工程師
。。。
2017 年暑期實習騰訊,2018 年初實習百度,校招拿了十幾個 Linux C/C++ 方向的 offer,最終的選擇也很玄學,去了自己想去的公司,從事自己喜歡的崗位,現在在程式設計的路上越走越遠。
二、Linux C/C++ 方向的一些思考
1、
對於方向的抉擇,很多人都選擇了 Java 或者 Python 方向,Java 或者 Python 方向確實學的人多,崗位需求很多,入門能比 Linux C/C++ 方向容易一些,但是往深了學,各有各的難度,先敲定了方向,再深入學習。
Linux C/C++ 方向,國內真正掌握的人,其實是極少數,這個方向的學習人數也是相對比較少的,入門一般首選 C 語言或者 Python,C、C++ 在程式設計排行榜也是經久不衰的,排名靠前,如果喜歡,有興趣,走這個方向是可以的。
Linux C/C++ 方向,國內很多大公司都有招聘這個方向的崗位,BAT 都有,尤其騰訊,底層架構都是 C++ 寫的,百度核心搜尋很多模組也是 C++ 寫的,阿里雲也在招聘 C++ 方向的工程師,這個方向,學的不錯的,根本不用擔心找工作的問題,如果學的一般的,其實哪種語言就都比較難找了,畢竟都知道it行業是技術競爭,優勝劣汰。
Linux C/C++ 的效率是比 Java、Python 快一些的,更偏向於底層,能直接操作記憶體,對於程式設計思維、邏輯能力的提升是有幫助的;其實學習這個方向,是有一點枯燥的,不像 Python 爬蟲、Java、前端能做出一些有趣的東西,小程式開發出一些產品,都能很快用於實戰,獲得程式設計的樂趣,進一步刺激自己學習。
C++ 方向沒有那麼多有趣的東西可以做,在很長的一段時間內,要靠自己的興趣去堅持學習。
2、
我在大三的時候,用 C++ 寫過五子棋、記憶體監控工具、壓縮工具、以及實現一些比較複雜的資料結構,實現網路程式設計的併發模型;當你學習 Linux C/C++ 方向到一定程度的時候,你會找到這個方向的樂趣,跟其他方向完全不一樣的樂趣,不過,前期真的很難,有一段時間極其痛苦,是要經過很長一段時間的學習,才能有一定的效果,如果對這個方向,真的沒有啥興趣,最好選擇走前端、Java、Python 等是最好的選擇。但是如果你已經是從業Linux c/c++開發幾年了,那就繼續吧,技術提升沒你想的那麼難!
Linux C/C++ 方向,入門稍微難一點,一旦選擇了要走 C++ 方向的,在心態上面,要做好準備,一定不能有畏難心裡,做好接觸底層、複雜邏輯的分析、以及具備面向過程 + 面向物件的思想;就是退一步講,我學習了 Linux C/C++ 方向,具備了程式設計思維和熟悉了 C++ 語言,以後去公司上班了,也能很快的上手 Java、Python 等方向(我說的上手指的是語言基礎很快的學習,要想深入,還得花大把的時間),這也是c/c++的優勢所在。
按照目前身邊人找工作的情況,普遍來說,Java、Python、前端、資料分析、測試方向都要比 C++ 好找一些,更容易找到工作,雖然我是走的 Linux C/C++ 方向,但是對於對底層沒有興趣,對 C 語言沒有興趣的人,不建議走這個方向。
3、
我一路走過來,真的很痛苦,在校期間都想過放棄這個方向,曾經想學個 Java 可能會好一些(身邊學習 Java 的人還是挺多的),每當快放棄的時候,又想到都學了這麼長時間了,再堅持堅持,就這樣一路走過來了;我是覺得自己真的挺幸運的,有時候,真的不一定非要頭鐵 C++ 方向,要看整個市場行情,順勢而為,選擇好方向,在深入!
對於 Java 還是 C++ 方向的選擇,沒有哪個方向一定好找工作,沒有哪個方向一定工資待遇高,網際網路這行,尤其是靠技術說話的,這些都取決於你自身的技術能力。
選擇走 C++ 方向的,一定要走 Linux C/C++,面向網路程式設計,學會 Linux 至關重要!
大廠特別喜歡考察計算機基礎知識,對於基礎掌握的如何,在很大程度上將決定你是否能進入大廠,一定要重視基礎知識的學習;秋招準備:基礎 + 演算法 + 專案,加上自己的方向(C++、Java、Python、前端等),其中每個環節都得準備到位,才能最大程度上拿到大廠 offer,意識很重要,有了意識,再看具體的學習路線。
三、計算機基礎知識的梳理
計算機基礎:資料結構 + 演算法、作業系統 + 計算機網路、資料庫 + Linux、C 語言
工作必備工具:Linux + Git + Sql
不管你是學習什麼方向的,Java、Python、前端、測試、運維等等,這些基礎都不能忽視,有時間的話,一定要打紮實了,有了紮實的功底,在這行才能走的更遠更快!
1、常用資料結構與演算法:
- 平衡二叉樹
- 紅黑樹
- B-樹
- KMP演算法
- 棧/佇列
- 布隆過濾器
靠前的資料結構一定要非常的熟練,對於樹、圖複雜的資料結構,最起碼的掌握定義、原理、部分實現,我就記得:我在面試的時候,手寫過紅黑樹的旋轉演算法,對於圖的一些最短路徑演算法也是當面手寫過,頭條的面試基本上就是全程演算法,難度不低。
- 冒泡
- 插入
- 選擇
- 快排
- 希爾
- 堆排
- 歸併
- 桶排
- 基數
- 計數
- 字串常見演算法
- 陣列常見演算法
- 遞迴演算法
一定要保證掌握基礎演算法 + 常見演算法。
在演算法方面的要求上,C++ 方向對於演算法的要求明顯更高,演算法功底一定要紮實!
2、作業系統:很常問的一些技術點,堆和棧、記憶體分割槽、虛擬記憶體 + 實體記憶體、程序 + 執行緒 + 協程、死鎖、分片機制、五大元件、中斷和系統呼叫 、同步和非同步等等問題。
對於作業系統的理解,對於這些基礎的計算機知識的掌握是必須深入學習,要花很大的功夫去理解清楚這些,工作中,對於真實線上系統的穩定性、對於底層技術的理解是有幫助的,作業系統是面試中常見問題之一。
3、計算機網路:OSI 七層模型和 TCP/IP 四層體系結構,TCP 三次握手與四次揮手、常見的網路協議(網橋、ARP、IP、ICMP、TCP、UDP、DNS、DHCP)、TCP 粘包、流量控制 + 擁塞控制、數字簽名原理、http + https,http 的狀態碼,https 的安全機制,網路安全、輸入 www.baidu.com 背後發生了什麼等等問題。
其實工作中,有時就會出現,網路抖動、網路延遲,網路擁塞的情況,此時就需要具備一定的網路知識,及時的解決問題,計算機網路是面試中常見問題之一。
4、資料庫:資料庫作為儲存資料的地方,其不同的資料結構、與應用的場景不一樣,採取不同的資料庫,對於 mysql 基本操作、寫 sql 的優化、表的設計、索引優化、如何更快的查詢、底層資料結構的設計原理等等問題。
常見的設計模式、主要是學習設計模式的思想、單例模式是必須寫程式碼實現的,其他設計模式理解思想,作為了解內容,後臺開發工程師與 mysql 打交道挺多的,也是面試常見問題之一。
5、Linux系統
Linux是所有學c/c++同學都繞不開的坎,我整理了Linux方面需要掌握的技術點,不知道怎麼學習的同學可以借鑑一下。
系統命令工具
- 程序間通訊設施狀態 ipcs
- 虛擬記憶體統計工具 vmstat
- Linux系統執行時長 uptime
- CPU平均負載和磁碟活動 iostat
- 監控,收集和彙報系統活動 sar
- 監控多處理器使用情況 mpstat
- 監控程序的記憶體使用情況 pmap
- 程序監控工具 atop
- 控制檯的流量監控工具 vnstat
- 系統程序狀態 ps
- 詳細網路流量分析 tcpdump
- 記憶體使用狀態 free
- 系統管理員調優和基準測量工具 nmon
- 密切關注Linux系統 glances
- 檢視系統呼叫 strace
網路引數工具
- Linux網路統計監控工具 netstat
- 顯示和修改網路介面控制器 ethtool
- 網路資料包分析利刃 tcpdump
- 監控並幫助你除錯網路 bmon
- 獲取實時網路統計資訊 iptraf
- 顯示主機上網路介面頻寬使用情況 iftop
- 網路流量和 ip 流量分佈 ntopng
日誌監控工具
-
實時網路日誌分析器 GoAccess
- 多視窗之下日誌監控 MultiTail
- 日誌分析系統 LogWatch/Swatch
引數監控工具
- 監控apache網路伺服器整體效能 apachetop
- ftp 伺服器基本資訊 ftptop
- IO監控 iotop
- 電量消耗和電源管理 powertop
- 監控 mysql 的執行緒和效能 mytop
- 系統執行引數分析 htop/top/atop
工作基本上離不開 Linux,也是面試常見問題之一。
6、C 語言
C 語言是我學習程式設計的第一門語言,是面向過程的語言,對於 C 語言中的陣列、函式、指標、記憶體對其模式、大小端問題、野指標、記憶體洩露、static、register、define、typedef、struct、union 等一些關鍵字的考察。
我一直把 C 語言當做基礎,不是方向,在 C 語言這裡學到了很多程式設計的思想,對於 Linux C/C++ 方向,C 語言是基本功,也是必定考察的地方,當初我也是因為特別喜歡 C,走上了 C++ 的道路。所以c語言其實對於所有語言的程式設計者來說都是值得學習和借鑑的。
C 語言可以學,C 語言是基礎,不是方向,但是選擇走 C++ 就是要選擇的方向了,要謹慎選擇!
對於上面的每一個模組,其實都能單拿出來,寫的更為具體一些,但是個人比較懶,就寫出大綱來給大家借鑑一些吧。
四、C/C++ Linux方向的深入學習路線
1、C++ 基礎
C++ 是面向物件的語言,一定要理解清楚面向物件的思想,先把 C++ 的基礎知識點打牢,剛從面向過程中轉變過來,一定一定要適應面向物件的寫法。
在學習面向物件的時候,也要考慮如何用面向過程去實現面向物件(其實也就是結構體中有一個成員是函式指標),對於 C++ 的基礎知識,我簡單羅列如下:
1、const的用法
2、引用的用法
3、#define用法
4、建構函式
5、解構函式
6、拷貝構造
7、new、delete 和 malloc、free 的區別
8、訪問限定符 public、private、protected
9、深拷貝和淺拷貝
10、友元函式
11、static
12、行內函數
13、繼承、虛繼承
14、鑽石繼承問題
15、同名覆蓋問題
16、虛擬函式表
17、虛指標
18、虛擬函式、純虛擬函式
19、介面
20、多型
21、重寫
22、過載
23、函式過載
24、運算子過載
25、流類庫和檔案
2、C++ 進階
函式模板、類模板,C++ 中對於異常的處理,對於繼承和多型底層的理解,對於 virtual 底層的理解等。
對於 C++ 中 boost 庫八大智慧指標的掌握與理解,其核心是理解並且剖析過相應的原始碼, <scoped_ptr/shared_ptr/weak_ptr> 這三個是最核心的智慧指標,理解清楚智慧指標的本質是,記憶體的申請與釋放全部交給了物件管理,以避免人為疏忽,造成記憶體洩露。
何為c/c++Linux方向的深入學習,就是在掌握上述前提技術基礎之上的進階學習。
如果對上述技術覺得自己還有所不足的同學,推薦大家一個免費學習課程
連結:https://ke.qq.com/course/417774?flowToken=1010788
主要講的就是c/cLinux方向的技術分享
針對上面,從基礎到 C++,我列出來的都是非常重要的知識點,當然了,也不可能全部列到,有很多技術問題,很多細節,我可能沒有考慮到,沒有寫到,這個還需要在學習的時候,認真看看視訊、看看書,把相應的知識都學到位,基礎打紮實一些。
五、專案 + 亮點 + 面試的一些思考
1、
專案:對於暑期找實習,或者秋招找工作,除了基礎跟方向,接下來就是專案的準備了,對於 C++ 方向,很多人不知道要準備什麼專案?其實專案不在於有多大、有多難,在於專案是否是自己真正做的,自己是否完全消化了,專案中是否有什麼亮點?
C++ 方面的實戰專案,以資料結構 + 網路程式設計 + 實用工具為主;資料結構方面:可以實現紅黑樹、B+ 樹,又或者用圖解決什麼實際問題,這些複雜的資料結構實現可以作為專案的。
1.對於專案這塊,面試的常見問題有:
a、做這個專案的背景是什麼?
b、專案中具體有哪些模組,都是怎麼實現的?
c、專案中你的技術亮點有哪些?
d、專案中有什麼難點,你是怎麼解決的?
e、要是重新做這個專案,你這個專案有什麼不足,你會進行哪些改進?
2.亮點:找實習或者找工作,必須的有自己的亮點,我覺得在那麼多基礎知識中,資料結構 + C 語言就是我的亮點之一,只要問到關於這 2 個方面的問題,儘量回答全面清楚一些,還有就是自己對於 Linux 核心資料結構的剖析也是亮點之一,總之,一定要找到自己的亮點,與別人不一樣的地方,這個就是面試的加分項。
搜尋引擎的底層原理、通訊的底層原理,對於這些底層的實現,有興趣的可以瞭解看看,其實也沒那麼難,要是在面試的時候,能回答出對這些技術的瞭解,以及自己的一些思考,那就是加分項了。
3、
面試:春招實習、秋招決戰,我不知道投了多少家公司,也不知道面試了多少場,基本上都是海投的,有了面試機會,就要抓住每一次,面試完多做總結、歸納、反思;其實面試很玄學,有自身實力的原因,也有運氣的成分,相信自己,好好表現就好。
對於面試,才開始我也是比較緊張的,但是當你面的多了,慢慢的就會調整過來,就會好很多,我現在把面試當做是,這是一次近距離和優秀的人交流的機會,是一次學習進步的機會,有了這種心態,其實就好的多了。
對於面試我也自我總結了一些面試題及回答經驗,分析出題人出題的思路在哪裡,畢竟我們不是要去死記面試題,重要是面試官考題的技術點在哪裡?把技術點吃透,之後再問到類似的問題就不會慌了。
六、總結
推薦一些好的視訊網站:b 站、牛客網、極客時間、51cto、騰訊課堂,網易雲課程,基本上你所需要的視訊資料都可以去找,實在不行上淘寶看看,我在b站也會日常更新,但是目前還不是很多。
https://space.bilibili.com/437693511
有興趣的朋友可以看看
我走的是 Linux C/C++ 路線,秋招投遞這個崗位也很多,對於簡歷,面試方面覺得不好不足可以聯絡我,給你一定的指導吧,這個看時間。
對於想走 Linux C/C++ 方向的同學,基本上按照上面的路線走,多實戰操作。
日積月累,終有所成!!!