鏈接:https://www.nowcoder.com/discuss/193598
來源:牛客網
Linux C/C 從零基礎到入門、到熟悉的一些路線,對於想走這個方向的同學,可以認真看看,分享到這里來,是因為牛客網對我的幫助很大,當初找工作的時候,天天刷牛客,特此回來報答一波,真的感激牛客網,提供了這么一個好的平台。
我將大致按照以下的目錄,分享自己一路走來的一些 C 經歷。
一、秋招自己的一些情況
二、Linux C/C 方向的一些思考
三、計算機基礎知識的梳理
四、C 方向的深入學習路線
五、項目 亮點 面試的一些思考
六、更多的個人分享
在校期間,我一直走的都是 Linux C/C 學習路線,歷經暑期實習、秋招決戰、校招期間投的大部分崗位都是 Linux C/C 后台方向,自己對於這個方向的理解、以及學習路線有一些感受與心得,想把學習路線、以及學習編程的方法分享給各位,對於正在走 Linux C/C 路上的同學能有所幫助。
一、秋招自己的一些情況
就讀於雙非院校、非科班本科學生,專業是偏硬件的(學校課程只有一門 C 語言與編程相關,其余的課程跟編程一點點的關系都沒有),在校期間也沒拿過什么大的獎項,計算機基礎為零,大二上學期接觸 C 語言,大二一年學了 C 語言和數據結構,大三在學校的實驗室開始學習計算機基礎和學習 C 方向,一路自學編程,始終相信自己,也是拿到了大廠 offer。
秋招 offer 情況:
騰訊 后台開發工程師(實習轉正)
百度 手百 feeds 流,軟件研發工程師
美團 后台開發 C 方向面試的
作業幫 后台開發
好未來 后台開發
迅雷 后台開發
。。。
在暑期實習過騰訊,大四上學期實習百度,校招拿了十幾個 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 方向的工程師,這個方向,學的不錯的,根本不用擔心找工作的問題,學的一般的,其實就比較難找了。
2、
Linux C/C 的效率是比 Java、Python 快一些的,更偏向於底層,能直接操作內存,對於編程思維、邏輯能力是有幫助的;其實學習這個方向,是有一點枯燥的,不像 Python 爬蟲、Java、前端能做出一些有趣的東西,小程序開發出一些產品,都能很快用於實戰,獲得編程的樂趣,進一步逼着自己學習,C 方向沒有那么多有趣的東西可以做,在很長的一段時間內,要靠自己的興趣去堅持學習。
我在大三的時候,用 C 寫過五子棋、內存監控工具、壓縮工具、以及實現一些比較復雜的數據結構,網絡編程的並發模型,這些項目,當你學習 Linux C/C 方向到一定程度的時候,你會找到這個方向的樂趣,跟其他方向完全不一樣的樂趣,不過,前期真的很難,有一段時間極其痛苦,是要經過很長一段時間的學習,才能有一定的效果,如果對這個方向,真的沒有啥興趣,最好選擇走前端、Java、Python 等是最好的選擇。
Linux C/C 方向,入門稍微難一點,一旦選擇了要走 C 方向的,在心態上面,要做好准備,一定不能有畏難心里,做好接觸底層、復雜邏輯的分析、以及具備面向過程 面向對象的思想;就是退一步講,我學習了 Linux C/C 方向,具備了編程思維和熟悉了 C 語言,以后去公司上班了,也能很快的上手 Java、Python 等方向(我說的上手指的是語言基礎很快的學習,要想深入,還得花大把的時間)。
3、
按照目前身邊人找工作的情況,普遍來說,Java、Python、前端、數據分析、測試方向都要比 C 好找一些,更容易找到工作,雖然我是走的 Linux C/C 方向,但是我是真的不建議對這個方向,沒有極其濃厚興趣的也走這個方向,我一路走過來,真的很痛苦,在校期間都想過放棄這個方向,學個 Java 可能會好一些(身邊學習 Java 的人還是挺多的),每當放棄的時候,想想都學了這么長時間了,再堅持堅持,就這樣一路走過來了,我覺得自己真的挺幸運的,有時候,真的不一定非要頭鐵 C 方向,要看整個市場行情,順勢而為,選擇好方向,在深入!
選擇走 C 方向的,一定要走 Linux C/C ,面向網絡編程,學會 Linux 至關重要!
大廠特別喜歡考察計算機基礎知識,對於基礎掌握的如何,在很大程度上將決定你是否能進入大廠,一定要重視基礎知識的學習;秋招准備:基礎 算法 項目,加上自己的方向(C 、Java、Python、前端等),其中每個環節都得准備到位,才能最大程度上拿到大廠 offer,意識很重要,有了意識,在看具體的學習路線。
三、計算機基礎知識的梳理
計算機基礎:數據結構 算法、操作系統 計算機網絡、數據庫 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 方向要慎重!
對於上面的每一個模塊,其實都能單拿出來,寫的更為具體一些,后面有時間的話,我會寫的盡量詳細。
四、C加加方向的深入學習路線
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、流類庫和文件
書籍: <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 網絡編程:
1、Linux 進程環境:僵屍進程、孤兒進程、守護進程、進程組、會話、前台進程組、后台進程組
2、Linux 進程七大通信方式:signal、file、pipe、shm、sem、msg、socket
3、Linux 線程:互斥量、鎖機制、條件變量、信號量、讀寫鎖
4、Linux 下並發模型:多進程、多線程、線程池
5、Linux 下 I/O 復用:select、poll、epoll 高並發
6、Linux 網絡編程
7、靜態庫和動態庫
書籍:
<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 ,我列出來的都是非常重要的知識點,當然了,也不可能全部列到,有很多技術問題,很多細節,我可能沒有考慮到,沒有寫到,這個還需要在學習的時候,認真看看視頻、看看書,把相應的知識都學到位,基礎打扎實一些。
五、項目 亮點 面試的一些思考
項目
對於暑期找實習,或者秋招找工作,除了基礎跟方向,接下來就是項目的准備了,對於 C 方向,很多人不知道要准備什么項目?其實項目不在於有多大、有多難,在於項目是否是自己真正做的,自己是否完全消化了,項目中是否有什么亮點?
C 方面的實戰項目,以數據結構 網絡編程 實用工具為主,數據結構方面:可以實現紅黑樹、B 樹,又或者用圖解決什么實際問題,這些復雜的數據結構實現可以作為項目的;
7 大進程間通信,6 大高並發模型,可以寫線程池,select、poll、epoll等局域並發聊天項目;實現工具,以自己寫個簡單的壓縮工具、編譯器、內存泄露檢測工具等,這些都是項目的來源,我的項目就有:網絡編程實現在線群聊、壓縮工具,對文件或者圖片進行壓縮。
對於項目這塊,面試的常見問題有:
a、做這個項目的背景是什么?
b、項目中具體有哪些模塊,都是怎么實現的?
c、項目中你的技術亮點有哪些?
d、項目中有什么難點,你是怎么解決的?
e、要是重新做這個項目,你這個項目有什么不足,你會進行哪些改進?
亮點
找實習或者找工作,必須的有自己的亮點,我覺得在那么多基礎知識中,數據結構 C 語言就是我的亮點之一,只要問到關於這 2 個方面的問題,盡量回答全面清楚一些,還有就是自己對於 Linux 內核數據結構的剖析也是亮點之一,總之,一定要找到自己的亮點,與別人不一樣的地方,這個就是面試的加分項。
搜索引擎的底層原理、通訊的底層原理,對於這些底層的實現,有興趣的可以了解看看,其實也沒那么難,要是在面試的時候,能回答出對這些技術的了解,以及自己的一些思考,那就是加分項了。
面試
春招實習、秋招決戰,我不知道投了多少家公司,也不知道面試了多少場,基本上都是海投的,有了面試機會,就要抓住每一次,面試完多做總結、歸納、反思;其實面試很玄學,有自身實力的原因,也有運氣的成分,相信自己,好好表現就好。
對於面試,才開始我也是比較緊張的,但是當你面的多了,慢慢的就會調整過來,就會好很多,我現在把面試當做是,這是一次近距離和優秀的人交流的機會,是一次學習進步的機會,有了這種心態,其實就好的多了。
六、更多的個人分享
推薦一些好的視頻網站:b 站、牛客網、極客時間、51cto、七月算法、網易雲課程,基本上你所需要的視頻資料都可以去找,實在不行上淘寶看看,有些視頻文中沒有給到,需要自己去找找,我的網盤滿了,清空了一些,這些都很好找到的。
對於實在自己找不到視頻、書籍資源的同學,你私聊我,我有時間給你找找,視頻其實核心就是:抓住黑馬(找一個全套的,跟着看、跟着學、一直走下去)。
我走的是 Linux C/C 路線,秋招投遞這個崗位也很多,對於沒有我簡歷的、沒有 Google C 編程規范的,你私聊我,把這些該有的資料都送給你。
對於這方面的分享,鑒於一篇文章根本寫不完,自己也是從去年開始分享自己一路走來的心得、體會,學習的編程經驗,目前分享了大約有 20 余萬字,設計考研/就業、方向的抉擇、以及春招暑期實習、秋招備戰的一些思路。
對於很多細節,上面的分享可能遠遠不夠,因為我自己也在不斷的學習路上,接觸編程的 3 年左右的時間,對於我的感受就是,一定要多實踐,多去敲,在多做一些好的項目,對於自己的提升是非常的大的。
想進大廠,多提升自己的技術能力,基礎扎實、算法在強一些,再加上玄學秋招,有些運氣,秋招的過程,真的很考驗一個人的心態,經歷過春招暑期實習、秋招的,多少會學到一些東西的,對於自己哪方面不足,也會有更明確的認識,總之,堅持下去 相信自己。
沒有誰會一夜之間突然長大,都是日積月累的厚積薄發!
下圖是我在實驗室的座位,以及 20 余萬字的個人分享,都是自己一路走過來的真實經歷。對於需要我簡歷、需要查看我 20 余萬字的真實經歷分享,又或者是需要 google C 編程規范,我的 C 項目等等,都可以加我,和我交流。
個人微信:18519336960
公眾號:【編程劍譜】,有興趣的可以關注一波
我在實驗室的座位(當年買的計算機方面的書籍挺多的)
下面是我公眾號分享的精選文章,值得一讀!