一、秋招 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 站、??途W、極客時間、51cto、騰訊課堂,網易云課程,基本上你所需要的視頻資料都可以去找,實在不行上淘寶看看,我在b站也會日常更新,但是目前還不是很多。
https://space.bilibili.com/437693511
有興趣的朋友可以看看
我走的是 Linux C/C++ 路線,秋招投遞這個崗位也很多,對于簡歷,面試方面覺得不好不足可以聯系我,給你一定的指導吧,這個看時間。
對于想走 Linux C/C++ 方向的同學,基本上按照上面的路線走,多實戰操作。
日積月累,終有所成?。?!加油??!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。