連接:https://www.nowcoder.com/discuss/193598
來源:牛客網前端
Linux C/C 從零基礎到入門、到熟悉的一些路線,對於想走這個方向的同窗,能夠認真看看,分享到這裏來,是由於牛客網對個人幫助很大,當初找工做的時候,每天刷牛客,特此回來報答一波,真的感激牛客網,提供了這麼一個好的平臺。 mysql
我將大體按照如下的目錄,分享本身一路走來的一些 C 經歷。 git
1、秋招本身的一些狀況
2、Linux C/C 方向的一些思考
3、計算機基礎知識的梳理
4、C 方向的深刻學習路線
5、項目 亮點 面試的一些思考
6、更多的我的分享 github
在校期間,我一直走的都是 Linux C/C 學習路線,歷經暑期實習、秋招決戰、校招期間投的大部分崗位都是 Linux C/C 後臺方向,本身對於這個方向的理解、以及學習路線有一些感覺與心得,想把學習路線、以及學習編程的方法分享給各位,對於正在走 Linux C/C 路上的同窗能有所幫助。 面試
1、秋招本身的一些狀況 正則表達式
就讀於雙非院校、非科班本科學生,專業是偏硬件的(學校課程只有一門 C 語言與編程相關,其他的課程跟編程一點點的關係都沒有),在校期間也沒拿過什麼大的獎項,計算機基礎爲零,大二上學期接觸 C 語言,大二一年學了 C 語言和數據結構,大三在學校的實驗室開始學習計算機基礎和學習 C 方向,一路自學編程,始終相信本身,也是拿到了大廠 offer。 算法
秋招 offer 狀況:
騰訊 後臺開發工程師(實習轉正)
百度 手百 feeds 流,軟件研發工程師
美團 後臺開發 C 方向面試的
做業幫 後臺開發
好將來 後臺開發
迅雷 後臺開發
。。。 sql
在暑期實習過騰訊,大四上學期實習百度,校招拿了十幾個 Linux C/C 方向的 offer,最終的選擇也很玄學,也去了本身想去的公司,從事本身喜歡的崗位。 shell
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 方向的工程師,這個方向,學的不錯的,根本不用擔憂找工做的問題,學的通常的,其實就比較難找了。
二、
Linux C/C 的效率是比 Java、Python 快一些的,更偏向於底層,能直接操做內存,對於編程思惟、邏輯能力是有幫助的;其實學習這個方向,是有一點枯燥的,不像 Python 爬蟲、Java、前端能作出一些有趣的東西,小程序開發出一些產品,都能很快用於實戰,得到編程的樂趣,進一步逼着本身學習,C 方向沒有那麼多有趣的東西能夠作,在很長的一段時間內,要靠本身的興趣去堅持學習。
我在大三的時候,用 C 寫過五子棋、內存監控工具、壓縮工具、以及實現一些比較複雜的數據結構,網絡編程的併發模型,這些項目,當你學習 Linux C/C 方向到必定程度的時候,你會找到這個方向的樂趣,跟其餘方向徹底不同的樂趣,不過,前期真的很難,有一段時間極其痛苦,是要通過很長一段時間的學習,纔能有必定的效果,若是對這個方向,真的沒有啥興趣,最好選擇走前端、Java、Python 等是最好的選擇。
Linux C/C 方向,入門稍微難一點,一旦選擇了要走 C 方向的,在心態上面,要作好準備,必定不能有畏難內心,作好接觸底層、複雜邏輯的分析、以及具有面向過程 面向對象的思想;就是退一步講,我學習了 Linux C/C 方向,具有了編程思惟和熟悉了 C 語言,之後去公司上班了,也能很快的上手 Java、Python 等方向(我說的上手指的是語言基礎很快的學習,要想深刻,還得花大把的時間)。
三、
按照目前身邊人找工做的狀況,廣泛來講,Java、Python、前端、數據分析、測試方向都要比 C 好找一些,更容易找到工做,雖然我是走的 Linux C/C 方向,可是我是真的不建議對這個方向,沒有極其濃厚興趣的也走這個方向,我一路走過來,真的很痛苦,在校期間都想過放棄這個方向,學個 Java 可能會好一些(身邊學習 Java 的人仍是挺多的),每當放棄的時候,想一想都學了這麼長時間了,再堅持堅持,就這樣一路走過來了,我以爲本身真的挺幸運的,有時候,真的不必定非要頭鐵 C 方向,要看整個市場行情,順勢而爲,選擇好方向,在深刻!
選擇走 C 方向的,必定要走 Linux C/C ,面向網絡編程,學會 Linux 相當重要!
大廠特別喜歡考察計算機基礎知識,對於基礎掌握的如何,在很大程度上將決定你是否能進入大廠,必定要重視基礎知識的學習;秋招準備:基礎 算法 項目,加上本身的方向(C 、Java、Python、前端等),其中每一個環節都得準備到位,才能最大程度上拿到大廠 offer,意識很重要,有了意識,在看具體的學習路線。
3、計算機基礎知識的梳理
計算機基礎:數據結構 算法、操做系統 計算機網絡、數據庫 Linux、C 語言
工做必備工具:Linux Git Sql
無論你是學習什麼方向的,Java、Python、前端、測試、運維等等,這些基礎都不能忽視,有時間的話,必定要打紮實了,有了紮實的功底,在這行才能走的更遠更快!
數據結構:對於經常使用的數據結構,鏈表、棧、隊列、矩陣、樹(BinTree、BST、AVL、RBtree、B 、B-)、跳錶、圖等,學習從定義--->原理--->實現--->應用,都要有不一樣程度的掌握,前面的數據結構必定要很是的熟練,對於樹、圖複雜的數據結構,最起碼的掌握定義、原理、部分實現,我就記得:我在面試的時候,手寫過紅黑樹的旋轉算法,對於圖的一些最短路徑算法也是當面手寫過,頭條的面試基本上就是全程算法,難度不低(我我的博客上面有全部的數據結構的整理)。
書籍:
<大話數據結構>,適合入門學習
<數據結構>,清華大學嚴蔚敏寫的,做爲進階和深刻
視頻:https://pan.baidu.com/s/1qQrHTdkvxMLSGv7G4nHWBw 密碼:4o9p
算法:必定要保證掌握基礎算法 常見算法,十大排序算法(冒泡、插入、選擇、快排、希爾、堆排、歸併、桶排、基數、計數)是最簡單的,也是必定必定要熟練掌握的,另外還有字符串常見算法、數組常見算法、遞歸算法等等,對於算法,從易到難,先把我列的一些算法掌握了,在去刷一些題,會有一些成就感,纔能有自信,也要早早開始,一直刷一些算法題,保持住手感,及時的作好概括整理、總結反思,視頻面試就是編譯器上面直接敲代碼,現場面試,大部分狀況下都是手寫代碼,寫一些核心的算法邏輯,要特別注意判斷邊界狀況,與面試官邊討論邊寫,《劍指 offer》至少刷 2-3 遍,在刷刷 leetcode 上面 easy、medium 類型的題目就行了(我 github 上面有本身整理的常見算法題目)。
書籍:
<啊哈算法>,適合入門學習
<編程之美>、<算法導論>,進階提高必看
對於算法導論,雖然比較難,數學公式不少,可是有視頻的,有些學到了,真的不虧,能夠學一部分的
<劍指 offer>、leetcode 找實習/工做前,刷題就好。
視頻:左神的算法視頻推薦看看,講的很清楚。
算法導論的視頻:https://pan.baidu.com/s/1Bm34-92TwN5TbMOXfPkY6g
密碼:1i38
操做系統:很常問的一些技術點,堆和棧、內存分區、虛擬內存 物理內存、進程 線程 協程、死鎖、分片機制、五大組件、中斷和系統調用 、同步和異步等等問題,對於操做系統的理解,對於這些基礎的計算機知識的掌握是必須深刻學習,要花很大的功夫去理解清楚這些,工做中,對於真實線上系統的穩定性、對於底層技術的理解是有幫助的,操做系統是面試中常見問題之一。
書籍:
<現代操做系統>、<深刻理解計算機系統> 是比較全面,寫的比較好的書,極力推薦。
視頻:
https://pan.baidu.com/s/1XiKe5e0UoI2Fp3Amn7aCCA
密碼:y230
計算機網絡:OSI 七層模型和 TCP/IP 四層體系結構,TCP 三次握手與四次揮手、常見的網絡協議(網橋、ARP、IP、ICMP、TCP、UDP、DNS、DHCP)、TCP 粘包、流量控制 擁塞控制、數字簽名原理、http https,http 的狀態碼,https 的安全機制,網絡安全、輸入 www.baidu.com 背後發生了什麼等等問題,其實工做中,有時就會出現,網絡抖動、網絡延遲,網絡擁塞的狀況,此時就須要具有必定的網絡知識,及時的解決問題,計算機網絡是面試中常見問題之一。
書籍:
<計算機網絡>(謝希仁第 7 版);
<TCP/IP>(卷一)
視頻:
https://pan.baidu.com/s/1xRvWUlWzQ9c67XTo0Lkg-g
密碼:c85g
數據庫:數據庫做爲存儲數據的地方,其不一樣的數據結構、與應用的場景不同,採起不一樣的數據庫,對於 mysql 基本操做、寫 sql 的優化、表的設計、索引優化、如何更快的查詢、底層數據結構的設計原理等等問題,常見的設計模式、主要是學習設計模式的思想、單例模式是必須寫代碼實現的,其餘設計模式理解思想,做爲了解內容,後臺開發工程師與 mysql 打交道挺多的,也是面試常見問題之一。
書籍:
<MySQL 必知必會>
<高性能 Mysql>
<大話設計模式>
視頻:
數據庫視頻:
https://pan.baidu.com/s/1yIT0nVwFazu0f7mJA0pBiA
密碼:33n1
Linux:Linux 的目錄結構、文件系統、啓動過程、用戶環境,Linux 下經常使用命令(find、grep、awk、xargs)、正則表達式、軟/硬連接、重定向、日誌信息、網絡配置(top、ps、ifconfig、ping 等)、簡單的 shell 腳本會寫(常見的腳本寫一些自動化工具或者定時任務)、熟練掌握 vim,用 C 寫代碼的話,還須要掌握 gcc、g 、gdb 調試,makefile 的編寫,工做基本上離不開 Linux,也是面試常見問題之一。
書籍:<鳥哥私房菜> 入門學習 Linux 足夠了
視頻:Linux 這塊的視頻,目前最好的是:馬哥的和老男孩的視頻,建議你們去網上搜着找一下。
https://pan.baidu.com/s/1y9Nw2sL0tcFzej2q6DzUwg
密碼:3o32
C 語言:C 語言是我學習編程的第一門語言,是面向過程的語言,對於 C 語言中的數組、函數、指針、內存對其模式、大小端問題、野指針、內存泄露、static、register、define、typedef、struct、union 等一些關鍵字的考察,我把 C 語言當作基礎,不是方向,在 C 語言這裏學到了不少編程的思想,對於 Linux C/C 方向,C 語言是基本功,也是一定考察的地方,當初我也是由於特別喜歡 C,走上了 C 的道路。
書籍:
<C 程序設計語言> 適合入門學習;
<C 缺陷與陷阱>、<C 專家編程>、<C 和指針> 適合進階提高
視頻:B 站郝斌的 C 語言強烈推薦
C 語言能夠學,C 語言是基礎,不是方向,可是選擇走 C 方向要慎重!
對於上面的每個模塊,其實都能單拿出來,寫的更爲具體一些,後面有時間的話,我會寫的儘可能詳細。
4、C加加方向的深刻學習路線
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 Primer> 第 5 版先全面的瞭解清楚 C 的基礎。
C 進階:函數模板、類模板,C 中對於異常的處理,對於繼承和多態底層的理解,對於 virtual 底層的理解等,以及對於 C 中 boost 庫八大智能指針的掌握與理解,其核心是理解而且剖析過這幾個核心的智能指針,理解清楚智能指針的本質是,內存的申請與釋放所有交給了對象管理,以免人爲疏忽,形成內存泄露。
書籍:
<Effective C >
<more Effectice C >
<深度探索 C 對象模型>
<C 沉思錄>
STL 源碼:對於 STL 中的容器剖析,常見容器有 list、vector、stack、queue、map 等,考察自動擴容的原理、map 的底層實現(RBtree),源碼是必須手動至少剖析一遍的。
對於迭代器、空間配置器的理解,好比:一級空間配置器、二級空間配置器的運用場合分別是什麼?一二級空間配置器的本質是什麼,如何用內存池去管理?所存在的問題又有哪些,源碼又是如何實現的等等,這些問題都須要去思考。
書籍:
<STL 源碼剖析>
<泛型編程與STL>
Linux 網絡編程:
一、Linux 進程環境:殭屍進程、孤兒進程、守護進程、進程組、會話、前臺進程組、後臺進程組
二、Linux 進程七大通訊方式:signal、file、pipe、shm、sem、msg、socket
三、Linux 線程:互斥量、鎖機制、條件變量、信號量、讀寫鎖
四、Linux 下併發模型:多進程、多線程、線程池
五、Linux 下 I/O 複用:select、poll、epoll 高併發
六、Linux 網絡編程
七、靜態庫和動態庫
書籍:
<Linux高性能服務器編程>
<UNIX網絡編程卷一>
<UNIX網絡編程卷二>
<UNIX 環境高級編程>
視頻推薦看:
陳碩的網絡編程:
連接:https://pan.baidu.com/s/1vSKPRpNEPSj59iASaZD38A 提取碼:e4q3
內核源碼剖析:對於 Linux 內核源碼,能夠先看 Linux 內核的設計與實現,瞭解清楚每部分的構造與原理,前期多看書、多看相關視頻,對一些源碼的解讀,到必定程度,最好拿到 Linux 2.6 版本內核源碼,我是用 Source Insight 工具輔助分析源碼的,這個工具對於源碼的分析特別友好,很快定位變量、追蹤函數,其實重點應該放在內核文件系統與內核數據結構的實現上面,多看看源碼是如何實現的,好比:內核鏈表的源碼實現,真的是一種很是獨特的思想,沒有看的能夠去看看(沒有源碼的能夠找我要)。
書籍:
<Linux 內核設計與實現>
<深刻理解 Linux 內核>
內核視頻:
連接:https://pan.baidu.com/s/1jvLYQFJa5ZTZ0_E3kZ-pcQ 提取碼:yn06
連接:https://pan.baidu.com/s/1ZsngBAllXGEkThSVearOuQ 提取碼:h9qs
C 相關視頻:推薦看黑馬的 C 視頻,是全套的,講的比較好,對於推動的書籍,先看看目錄,就大概瞭解其內容了。
開源網絡庫:對於 Linux C/C 方向,還須要關注一些業內開源的網絡庫,好比:MemCached、libevent 等,在 github 上面能夠直接搜,對於分佈式、高併發、集羣和負載均衡等知識,這部分做爲了解,要是有興趣,也能夠深刻看看,在深度的前提下,做爲技術廣度的擴充。
針對上面,從基礎到 C ,我列出來的都是很是重要的知識點,固然了,也不可能所有列到,有不少技術問題,不少細節,我可能沒有考慮到,沒有寫到,這個還須要在學習的時候,認真看看視頻、看看書,把相應的知識都學到位,基礎打紮實一些。
5、項目 亮點 面試的一些思考
項目
對於暑期找實習,或者秋招找工做,除了基礎跟方向,接下來就是項目的準備了,對於 C 方向,不少人不知道要準備什麼項目?其實項目不在於有多大、有多難,在於項目是不是本身真正作的,本身是否徹底消化了,項目中是否有什麼亮點?
C 方面的實戰項目,以數據結構 網絡編程 實用工具爲主,數據結構方面:能夠實現紅黑樹、B 樹,又或者用圖解決什麼實際問題,這些複雜的數據結構實現能夠做爲項目的;
7 大進程間通訊,6 大高併發模型,能夠寫線程池,select、poll、epoll等局域併發聊天項目;實現工具,以本身寫個簡單的壓縮工具、編譯器、內存泄露檢測工具等,這些都是項目的來源,個人項目就有:網絡編程實如今線羣聊、壓縮工具,對文件或者圖片進行壓縮。
對於項目這塊,面試的常見問題有:
a、作這個項目的背景是什麼?
b、項目中具體有哪些模塊,都是怎麼實現的?
c、項目中你的技術亮點有哪些?
d、項目中有什麼難點,你是怎麼解決的?
e、要是從新作這個項目,你這個項目有什麼不足,你會進行哪些改進?
亮點
找實習或者找工做,必須的有本身的亮點,我以爲在那麼多基礎知識中,數據結構 C 語言就是個人亮點之一,只要問到關於這 2 個方面的問題,儘可能回答全面清楚一些,還有就是本身對於 Linux 內核數據結構的剖析也是亮點之一,總之,必定要找到本身的亮點,與別人不同的地方,這個就是面試的加分項。
搜索引擎的底層原理、通信的底層原理,對於這些底層的實現,有興趣的能夠了解看看,其實也沒那麼難,要是在面試的時候,能回答出對這些技術的瞭解,以及本身的一些思考,那就是加分項了。
面試
春招實習、秋招決戰,我不知道投了多少家公司,也不知道面試了多少場,基本上都是海投的,有了面試機會,就要抓住每一次,面試完多作總結、概括、反思;其實面試很玄學,有自身實力的緣由,也有運氣的成分,相信本身,好好表現就好。
對於面試,纔開始我也是比較緊張的,可是當你面的多了,慢慢的就會調整過來,就會好不少,我如今把面試當作是,這是一次近距離和優秀的人交流的機會,是一次學習進步的機會,有了這種心態,其實就好的多了。
6、更多的我的分享
推薦一些好的視頻網站:b 站、牛客網、極客時間、51cto、七月算法、網易雲課程,基本上你所須要的視頻資料均可以去找,實在不行上淘寶看看,有些視頻文中沒有給到,須要本身去找找,個人網盤滿了,清空了一些,這些都很好找到的。
對於實在本身找不到視頻、書籍資源的同窗,你私聊我,我有時間給你找找,視頻其實核心就是:抓住黑馬(找一個全套的,跟着看、跟着學、一直走下去)。
我走的是 Linux C/C 路線,秋招投遞這個崗位也不少,對於沒有我簡歷的、沒有 Google C 編程規範的,你私聊我,把這些該有的資料都送給你。
對於這方面的分享,鑑於一篇文章根本寫不完,本身也是從去年開始分享本身一路走來的心得、體會,學習的編程經驗,目前分享了大約有 20 餘萬字,設計考研/就業、方向的抉擇、以及春招暑期實習、秋招備戰的一些思路。
對於不少細節,上面的分享可能遠遠不夠,由於我本身也在不斷的學習路上,接觸編程的 3 年左右的時間,對於個人感覺就是,必定要多實踐,多去敲,在多作一些好的項目,對於本身的提高是很是的大的。
想進大廠,多提高本身的技術能力,基礎紮實、算法在強一些,再加上玄學秋招,有些運氣,秋招的過程,真的很考驗一我的的心態,經歷過春招暑期實習、秋招的,多少會學到一些東西的,對於本身哪方面不足,也會有更明確的認識,總之,堅持下去 相信本身。
沒有誰會一晚上之間忽然長大,都是日積月累的厚積薄發!
下圖是我在實驗室的座位,以及 20 餘萬字的我的分享,都是本身一路走過來的真實經歷。對於須要我簡歷、須要查看我 20 餘萬字的真實經歷分享,又或者是須要 google C 編程規範,個人 C 項目等等,均可以加我,和我交流。
我的微信:18519336960
公衆號:【編程劍譜】,有興趣的能夠關注一波
我在實驗室的座位(當年買的計算機方面的書籍挺多的)
下面是我公衆號分享的精選文章,值得一讀!