1. 程式人生 > >Linux C/C++ 學習路線(已拿騰訊、百度 offer)

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++ 方向的同學,基本上按照上面的路線走,多實戰操作。

日積月累,終有所成!!!