Linux C/C++ 學習路線(已拿騰訊、百度 offer)

1、秋招 Linux C/C++ offer 狀況前端

2、Linux C/C++ 方向的一些思考mysql

3、計算機基礎知識的梳理ios

4、C++ 方向的深刻學習路線c++

5、項目 + 亮點 + 面試的一些思考面試

6、總結算法

 

                                   前言

Linux C/C++ 從零基礎到大神的學習路線,本身的真實學習路線,乾貨不少,建議收藏,認真閱讀。sql

在校期間,我一直走的都是 Linux C/C++ 學習路線,歷經暑期實習、秋招決戰、校招期間投的大部分崗位都是 Linux C/C++ 後臺方向,對於這個方向,有着本身的理解。數據庫

從接觸 C++ 到我如今正式工做,大概有 2 年多的時間,對於這個方向的學習路線、以及學習編程的方法摸索出來了一些,看完本文,但願對於正在走 Linux C/C++ 路上的同窗能有所幫助。apache

1、秋招 Linux C/C++ offer 狀況

本人就讀於雙非院校、非科班本科學生,專業是偏硬件的(學校課程只有一門 C 語言與編程相關,其他的課程跟編程一點點的關係都沒有),在校期間也沒拿過什麼大的獎項。編程

計算機基礎爲零,大二上學期接觸 C 語言,大二一年學了 C 語言和數據結構,大三在學校的實驗室開始學習計算機基礎和學習 C++ 方向,一路自學編程,始終相信本身,也是拿到了大廠 offer。

秋招 offer 狀況:

 

  • 騰訊 後臺開發工程師(實習轉正)
  • 百度 手百 feeds 流,軟件研發工程師
  • 美團 後臺開發 (C++ 方向面試)
  • 做業幫 後臺開發工程師
  • 好將來 後臺開發工程師
  • 迅雷 後臺開發工程師
  • 盛大遊戲 C++ 開發工程師

。。。

2017 年暑期實習騰訊,2018 年初實習百度,校招拿了十幾個 Linux C/C++ 方向的 offer,最終的選擇也很玄學,去了本身想去的公司,從事本身喜歡的崗位,如今在編程的路上越走越遠。

 

2、Linux C/C++ 方向的一些思考

一、

對於方向的抉擇,不少人都選擇了 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++ 方向沒有那麼多有趣的東西能夠作,在很長的一段時間內,要靠本身的興趣去堅持學習。

二、

我在大三的時候,用 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 語言沒有興趣的人,不建議走這個方向。

三、

我一路走過來,真的很痛苦,在校期間都想過放棄這個方向,曾經想學個 Java 可能會好一些(身邊學習 Java 的人仍是挺多的),每當快放棄的時候,又想到都學了這麼長時間了,再堅持堅持,就這樣一路走過來了;我是以爲本身真的挺幸運的,有時候,真的不必定非要頭鐵 C++ 方向,要看整個市場行情,順勢而爲,選擇好方向,在深刻!

對於 Java 仍是 C++ 方向的選擇,沒有哪一個方向必定好找工做,沒有哪一個方向必定工資待遇高,互聯網這行,尤爲是靠技術說話的,這些都取決於你自身的技術能力。

選擇走 C++ 方向的,必定要走 Linux C/C++,面向網絡編程,學會 Linux 相當重要!

大廠特別喜歡考察計算機基礎知識,對於基礎掌握的如何,在很大程度上將決定你是否能進入大廠,必定要重視基礎知識的學習;秋招準備:基礎 + 算法 + 項目,加上本身的方向(C++、Java、Python、前端等),其中每一個環節都得準備到位,才能最大程度上拿到大廠 offer,意識很重要,有了意識,再看具體的學習路線。

 

3、計算機基礎知識的梳理

計算機基礎:數據結構 + 算法、操做系統 + 計算機網絡、數據庫 + Linux、C 語言

工做必備工具:Linux + Git + Sql

無論你是學習什麼方向的,Java、Python、前端、測試、運維等等,這些基礎都不能忽視,有時間的話,必定要打紮實了,有了紮實的功底,在這行才能走的更遠更快!

一、經常使用數據結構與算法:

  • 平衡二叉樹
  • 紅黑樹
  • B-樹
  • KMP算法
  • 棧/隊列
  • 布隆過濾器

靠前的數據結構必定要很是的熟練,對於樹、圖複雜的數據結構,最起碼的掌握定義、原理、部分實現,我就記得:我在面試的時候,手寫過紅黑樹的旋轉算法,對於圖的一些最短路徑算法也是當面手寫過,頭條的面試基本上就是全程算法,難度不低。

  • 冒泡
  • 插入
  • 選擇
  • 快排
  • 希爾
  • 堆排
  • 歸併
  • 桶排
  • 基數
  • 計數
  • 字符串常見算法
  • 數組常見算法
  • 遞歸算法

 

必定要保證掌握基礎算法 + 常見算法。

在算法方面的要求上,C++ 方向對於算法的要求明顯更高,算法功底必定要紮實!

二、操做系統:很常問的一些技術點,堆和棧、內存分區、虛擬內存 + 物理內存、進程 + 線程 + 協程、死鎖、分片機制、五大組件、中斷和系統調用 、同步和異步等等問題。

對於操做系統的理解,對於這些基礎的計算機知識的掌握是必須深刻學習,要花很大的功夫去理解清楚這些,工做中,對於真實線上系統的穩定性、對於底層技術的理解是有幫助的,操做系統是面試中常見問題之一。

三、計算機網絡:OSI 七層模型和 TCP/IP 四層體系結構,TCP 三次握手與四次揮手、常見的網絡協議(網橋、ARP、IP、ICMP、TCP、UDP、DNS、DHCP)、TCP 粘包、流量控制 + 擁塞控制、數字簽名原理、http + https,http 的狀態碼,https 的安全機制,網絡安全、輸入 www.baidu.com 背後發生了什麼等等問題。

其實工做中,有時就會出現,網絡抖動、網絡延遲,網絡擁塞的狀況,此時就須要具有必定的網絡知識,及時的解決問題,計算機網絡是面試中常見問題之一。

四、數據庫:數據庫做爲存儲數據的地方,其不一樣的數據結構、與應用的場景不同,採起不一樣的數據庫,對於 mysql 基本操做、寫 sql 的優化、表的設計、索引優化、如何更快的查詢、底層數據結構的設計原理等等問題。

常見的設計模式、主要是學習設計模式的思想、單例模式是必須寫代碼實現的,其餘設計模式理解思想,做爲了解內容,後臺開發工程師與 mysql 打交道挺多的,也是面試常見問題之一。

五、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,也是面試常見問題之一。

 

六、C 語言

C 語言是我學習編程的第一門語言,是面向過程的語言,對於 C 語言中的數組、函數、指針、內存對其模式、大小端問題、野指針、內存泄露、static、register、define、typedef、struct、union 等一些關鍵字的考察。

我一直把 C 語言當作基礎,不是方向,在 C 語言這裏學到了不少編程的思想,對於 Linux C/C++ 方向,C 語言是基本功,也是一定考察的地方,當初我也是由於特別喜歡 C,走上了 C++ 的道路。因此c語言其實對於全部語言的編程者來講都是值得學習和借鑑的。

C 語言能夠學,C 語言是基礎,不是方向,可是選擇走 C++ 就是要選擇的方向了,要謹慎選擇!

對於上面的每個模塊,其實都能單拿出來,寫的更爲具體一些,可是我的比較懶,就寫出大綱來給你們借鑑一些吧。

4、C/C++ Linux方向的深刻學習路線

一、C++ 基礎

C++ 是面向對象的語言,必定要理解清楚面向對象的思想,先把 C++ 的基礎知識點打牢,剛從面向過程當中轉變過來,必定必定要適應面向對象的寫法。

在學習面向對象的時候,也要考慮如何用面向過程去實現面向對象(其實也就是結構體中有一個成員是函數指針),對於 C++ 的基礎知識,我簡單羅列以下:

一、const的用法

二、引用的用法

三、#define用法

四、構造函數

五、析構函數

六、拷貝構造

七、new、delete 和 malloc、free 的區別

八、訪問限定符 public、private、protected

九、深拷貝和淺拷貝

十、友元函數

十一、static

十二、內聯函數

1三、繼承、虛繼承

1四、鑽石繼承問題

1五、同名覆蓋問題

1六、虛函數表

1七、虛指針

1八、虛函數、純虛函數

1九、接口

20、多態

2一、重寫

2二、重載

2三、函數重載

2四、運算符重載

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++,我列出來的都是很是重要的知識點,固然了,也不可能所有列到,有不少技術問題,不少細節,我可能沒有考慮到,沒有寫到,這個還須要在學習的時候,認真看看視頻、看看書,把相應的知識都學到位,基礎打紮實一些。

5、項目 + 亮點 + 面試的一些思考

1

項目:對於暑期找實習,或者秋招找工做,除了基礎跟方向,接下來就是項目的準備了,對於 C++ 方向,不少人不知道要準備什麼項目?其實項目不在於有多大、有多難,在於項目是不是本身真正作的,本身是否徹底消化了,項目中是否有什麼亮點?

C++ 方面的實戰項目,以數據結構 + 網絡編程 + 實用工具爲主;數據結構方面:能夠實現紅黑樹、B+ 樹,又或者用圖解決什麼實際問題,這些複雜的數據結構實現能夠做爲項目的。

 

1.對於項目這塊,面試的常見問題有:

a、作這個項目的背景是什麼?
b、項目中具體有哪些模塊,都是怎麼實現的?

c、項目中你的技術亮點有哪些?
d、項目中有什麼難點,你是怎麼解決的?
e、要是從新作這個項目,你這個項目有什麼不足,你會進行哪些改進?

2.亮點:找實習或者找工做,必須的有本身的亮點,我以爲在那麼多基礎知識中,數據結構 + C 語言就是個人亮點之一,只要問到關於這 2 個方面的問題,儘可能回答全面清楚一些,還有就是本身對於 Linux 內核數據結構的剖析也是亮點之一,總之,必定要找到本身的亮點,與別人不同的地方,這個就是面試的加分項。

搜索引擎的底層原理、通信的底層原理,對於這些底層的實現,有興趣的能夠了解看看,其實也沒那麼難,要是在面試的時候,能回答出對這些技術的瞭解,以及本身的一些思考,那就是加分項了。

三、

面試:春招實習、秋招決戰,我不知道投了多少家公司,也不知道面試了多少場,基本上都是海投的,有了面試機會,就要抓住每一次,面試完多作總結、概括、反思;其實面試很玄學,有自身實力的緣由,也有運氣的成分,相信本身,好好表現就好。

對於面試,纔開始我也是比較緊張的,可是當你面的多了,慢慢的就會調整過來,就會好不少,我如今把面試當作是,這是一次近距離和優秀的人交流的機會,是一次學習進步的機會,有了這種心態,其實就好的多了。

對於面試我也自我總結了一些面試題及回答經驗,分析出題人出題的思路在哪裏,畢竟咱們不是要去死記面試題,重要是面試官考題的技術點在哪裏?把技術點吃透,以後再問到相似的問題就不會慌了。

6、總結

推薦一些好的視頻網站:b 站、牛客網、極客時間、51cto、騰訊課堂,網易雲課程,基本上你所須要的視頻資料均可以去找,實在不行上淘寶看看,我在b站也會平常更新,可是目前還不是不少。

https://space.bilibili.com/437693511

有興趣的朋友能夠看看

我走的是 Linux C/C++ 路線,秋招投遞這個崗位也不少,對於簡歷,面試方面以爲很差不足能夠聯繫我,給你必定的指導吧,這個看時間。

對於想走 Linux C/C++ 方向的同窗,基本上按照上面的路線走,多實戰操做。

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

相關文章
相關標籤/搜索