【資源】一個C/C++開發工程師的學習路線(已經無路可退,唯有逆風飛翔)【內附資源頁】
知乎同步地址:https://zhuanlan.zhihu.com/p/96165809
宣告:
1)該文章整理自網上的大牛和專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料並沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,並聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬於第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
文章目錄
資源(^-^)V
可以直接去我的WX號,回覆【福利】,獲取更多資源!
推薦一個可以搜尋一些pdf版的電子書的網站——鳩摩搜書,https://www.jiumodiary.com/
比如搜尋【深度學習】,
下文中提到的一些書都可以去其中搜尋,或者也可以直接百度:
不過百度的坑比較多,但是也是可以嘗試的,再或者指令碼之家,https://www.jb51.net/books/
如果實在找不到,也可以直接去CSDN的下載區下載,https://download.csdn.net/,淘寶找一個商家下載即可,一般也就一兩塊。
〇、寫在前面
- 關於深度學習和演算法工程師的成長路線在這個部落格中,【記錄】一個深度學習演算法工程師的成長之路(思考和方法以及計劃);
- 關於後臺學習和開發工程師的學習路線在這個部落格中,【資源】C/C++開發工程師的學習路線(已經無路可退,唯有逆風飛翔),即本文。
事實上19屆秋招演算法崗就有些【供過於求】了,頭條甚至發了 演算法勸退貼,而這很大程度上就是由於前幾年演算法就業形勢太好了,導致一大批人轉演算法,這導致的大泡沫其實還沒有消化掉,所以其實不是現在演算法突然不好找工作了,而是之前太容易了。其實你說公司真的不缺演算法工程師嘛?當然不是,公司也是有演算法工程師的缺口的,那為什麼出現這種情況?除了要勸退一部分盲目入行的同學;聽到、遇到的好幾個HR都說,收到幾百份簡歷,但是沒什麼匹配的。所以說做演算法的人多是真的,可是需要做演算法的人也是真的,而主要的矛盾點在於 供需不匹配。
所以在這個大背景下,加上最近看到好多關於C/C++的學習路線,以及若干大佬的面經,此外也有很多同學詢問演算法或者資料結構相關的資源,就有了這麼一個部落格。因為我也在學習,沒有辦法給出具體的方案,不過下面提到的這些相關的都是必備的,也就是必須要學習的。這個文章應該會是一個【資源】性質的文章,關於 準備學什麼,需要學什麼,希望和各位共勉。
一、程式設計能力
在這個部落格中談到過,【記錄】一個深度學習演算法工程師的成長之路(思考和方法以及計劃),這裡面還是直接拿出來用了。
這真是個老生常談的問題,為什麼這麼說呢,自然是因為這個【程式設計能力】我聽過不下幾百遍,聽的腦瓜子都疼,可是沒法子,這就是 必備技能,必備到什麼程度?
這麼說吧,假如你想寫作文,如果你不會寫字,組詞,造句,我想你應該完全沒法完成這個創作過程。很形象吧,但是也確實如此,仔細想一想,招你進去是要幹活的,公司不會招聘一個只會 MATLAB 或者 python 都用不熟的人來做專案開發吧,做純演算法研究都不行。
- MATLAB 大家都懂的,做實驗室研究確實很棒,高效方便的矩陣和陣列運算,畫圖方面也相當不錯,但是工業應用還沒聽過誰說是用 MATLAB 實現的呢。
- python 你可能想問為什麼,可以這麼說,如果連 python 這樣比較簡單的語言還用不熟,那真是無話可說。
- C++ 你更不必說了,因為這是一個開發工程師的主要工具,你的刀都沒了還準備打架嗎?嗯?
那麼 具體地說,程式設計能力需要哪些基本要求呢?
(1)熟練使用 linux
新手肯定都是用 Windows 起手的了,像我之前就是這樣,但是在學習過程中發現在 Windows 上搞不定了,一般也會先忍幾次,然後掉頭就去學 linux 了,一定是這樣的過程。尤其是很多工業上的專案實現都是在 linux 下完成的,深度學習的很多演算法也是在 Windows 上真的搞不定,所以 linux 真的是一個必備的工具。。。
但是在條件上可能很多人都覺得不是太合適,比如實驗室條件,電腦條件等等,那也沒有辦法,只能搞起,下面是好久之前詢問大佬給的意見,可供參考。
如果是剩下的完全是在使用的過程中現用現學,手邊常備一本書 《鳥哥的linux私房菜》,神書,你可以百度或者Google一下自然就知道這個書的強大了。在或者現在的網路比較強大了,資源也是很多,實驗樓 也是一個不錯的選擇,幫你搭配好的環境,直接使用就OK了。如果還是想自己搞一下,虛擬機器也是一個不錯的選擇,不會影響你電腦本來的環境配置,但是還滿足了要求。
個人建議:
- 《鳥哥的linux私房菜》
- 實驗樓
linux 核心的推薦放在後面了。
(2)流暢使用 python
網路如此發達的今天,如果你說你找不到資源我是不相信的,但是如果你說你眼花繚亂了,我是毫不質疑的。因為我當時就就是這樣的,基礎部分看廖雪峰的 python教程 就可以了,我個人有看一些,但是真正入門的是一本書——《Python程式設計:從入門到實踐》,極其的基礎,但是對小白來說非常友好。
有的同學會問是學 python2 還是 python3?這麼說吧,python 核心團隊計劃2020年停止支援 python2,也就是說 python2 馬上就要說再見了,肯定還是學 python3,遇到之前的 python2 的程式碼再查詢區別即可。python 學起來其實很簡單,看別人程式碼的過程就是學習的過程。對於不熟悉的用法多搜下官方文件,如 python,numpy,pandas,matplot,scikit-learn 等等。
python 的開發環境值得說一下,因為有太多選擇,這裡比較建議使用 pycharm 和 jupyter notebook 吧,具體可以參考這個部落格——Windows10 下 Anaconda和 PyCharm 的詳細的安裝教程(圖文並茂)。
個人計劃:
- 《Python程式設計:從入門到實踐》
- 廖雪峰的 python教程
(3)熟練使用 C++
至於 C++,比較普遍的都是 《C++ primer》 或 《C++ primer plus》 這樣的大塊頭書,我也寫過這類的部落格,不過還沒有寫完,因為寫起來太累了。。。《C++ Primer》學習筆記/習題答案 總目錄,這種特別厚的書有一個什麼樣的問題呢?
直接看圖說話:
怕嗎?知道什麼叫做恐懼嗎?就這?沒錯,真的厚,,,我服了,但是你還是得看,比如我現在就暫時停下了《C++ primer》的部落格更新,去啃《C++ primer plus》了,原諒我的不厚道,對不住了兄弟們,我實在是覺得《C++ primer》的邏輯有點異於常人。。。《C++ primer plus》更適合我一點,最近正在寫《C++ primer plus》的課後題:https://github.com/TeFuirnever/Cpp-Primer-Plus,有一起的小夥伴可以關注一下。
入門之後就需要看一下《Effective C++》這本書了,可以說是必須要看的書之一,不過有大佬跟我說看過《C++ Primer》之後就不用了看《Effective C++》這本書,因為基本都包含在內了。。。你可以試一試。
看完上面的書之後(大塊頭書優點在於全面,同時也往往導致了重點不突出),可以看一下 《王道程式設計師求職寶典》,這類書就是比較實用,推薦可以後期提高或者準備面試之前看。
如果想看視訊課程的話,推薦中國慕課上浙江大學的 《程式設計入門——C語言 浙江大學》,《C語言程式設計進階》,第一個課是非常基礎的C,第二個課是進階加上一些資料結構,目前還在更新中,不過看視訊課程一般比較慢,但是如果沒什麼基礎或者特別想把基礎學好的話,強烈推薦。
個人計劃:
- 《C++ primer》
- 《C++ primer plus》
- 《Effective C++:改善程式與設計的55個具體做法》
- 《more effective C++》
- 《程式設計入門——C語言 浙江大學》
- 《C語言程式設計進階》
- 《王道程式設計師求職寶典》
(4)良好的演算法與資料結構基礎
開發能力如果想過關,演算法效率必須要高,因為在實際生產中還是有要求的。因為工業界用的演算法是滯後於學術界好幾年的,所以不要對公司所做的演算法有太多的幻想,現實用的演算法也沒有那麼高階,大部分時間都不是用在建模,而是在開發,這也就是說你要好好準備演算法與資料結構,這樣你就立於不敗之地了,無論是啥,都能遊刃有餘,懂不?
道聽途說的,某師哥說過進入公司培訓期間就是刷LeetCode!?!
個人計劃:
- LeetCode
- 牛客網
- 《劍指offer》(準備校招刷一遍,校招過程再刷一遍,哪裡不會刷哪裡)
- 《演算法圖解》(python寫的,演算法的入門書籍,寫的真的牛逼,通俗易懂,之前寫過 筆記,其實就是偷偷抄了抄書,寫了寫個人看法)
- 《大話資料結構》(c語言寫的,資料結構的入門書籍,寫的真的牛逼,和《演算法圖解》一樣,都是神書,作者自嗨寫成了教案,你說牛逼不)
- 《演算法導論中文第三版》(這是本神書。。。據說你要是能看完就是大佬了,如果能看懂部分就是大牛,如果能全部看懂那你一定是在吹牛逼,騙誰呢兄弟???)
- 網易雲課堂-浙江大學《資料結構課程》(推薦,0基礎學生的必備良藥,基礎視訊,每節課的配套題目必須獨立完成)
- 《程式設計師程式碼面試指南》(左程雲,好書,配套左神的視訊使用效果更佳)
(5)良好的程式設計習慣
這裡說的習慣有:多使用類,多利用函式封裝,寫好專案的目錄結構,良好的變數或者函式命名,善用程式的註釋功能。這可以幫助你更好的和同事或者同行溝通,而且看著也舒服,就算好久不看程式了,依然可以做到很好的回溯記憶。
這個真的是一個很重要的但是被好多人忽略的習慣,希望我們們能跳過這個坑,讓自己更具有影響力。
二、C++的其他重要書籍
《STL原始碼剖析》是一本 STL 方面的神書,介於 STL 的地位,雖然是一個很老的書了,很多內容都過時了,比如空間配置器,但是面試官還是會問。。。可以跟面試官講講 ptmalloc 的實現,故而整本書都是重點,有沒有回到高中或者上學的時候那種感覺,老師說劃重點了,整本書都是(微笑)。
《深度探索C++物件模型》基礎書籍,雖然基本只會問虛擬函式的實現,看一篇部落格也能應付面試,但是還是建議多看幾遍。比如某大佬(當然不是我)表明自己STL和物件模型我都看了3遍以上,因為太容易忘了,所以還沒開始的我和你趕緊的吧。
個人計劃:
- 《STL原始碼剖析》
- 《深度探索C++物件模型》
三、g++, CMake和Makefile
關於部署在移動端嵌入式平臺,需要使用 c / c++ / java 語言,g++,CMake 和 Makefile 正是 Linux 下編譯 C系程式碼 的工具,也是必備的基礎。實際上一些開源專案也需要預編譯,更多的等到了工作崗位自然懂。
個人計劃:
- g++
- CMake
- Makefile
四、shell,vim 和 git
Linux 下一個熟練的工程師,會比 Windows 下工作效率高很多,提高寫程式碼效率可以從終端多工管理,熟練使用 shell 命令,熟練使用 vim 等開發環境,熟練使用 git 命令等地方入手。
- shell 命令是 Linux 的操作基礎,也是學習使用 Linux 的開始,而慢慢熟悉高階的 shell 命令在將來的工作中會帶來很大的效率提升。
- vim 是 Linux 下最常用的編輯器,從小白到高手都可以使用,而它的列編輯,查詢替換,自動補全等功能都是效率的保證,或許從 visual studio 等環境切換過來的同學剛開始會有些許不適應,但是時間久了就會越來越明白 vim 的好。
- git 是程式設計師必備的素養,慢慢學會維護幾個自己的程式碼庫,等到將來出問題的時候就明白了。
個人計劃:
- shell
- vim
- git
五、作業系統
《深入理解計算機系統》(CSAPP),一本神書,極度推薦*****,號稱比同等質量的金子更加之前的書,這個評價一點也不為過,是一個必讀的書籍。
《現代作業系統》,建議在讀完上一本書後再讀,講述作業系統的概念,可以配套網易雲盤北大或者清華的作業系統課程視訊,這樣效率會高很多,不然自己摸路實在是。。。不想說了,就這樣吧。
《UNIX環境高階程式設計》(APUE),同樣是一本強烈推薦的書籍*****,尤其是如果想進鵝廠(騰訊),建議此書列為必讀,如果能夠理解這本書的內容,網路程式設計不會是你拿到offer的攔路石。
關於想去哪一個公司,可以留言區發表一下看法,我們探討探討,共同努力,話不多說,我想去位元組。。。不過現在還只是在做夢中。。。
還有一個一個牛客推薦的——MIT6.828的這門課,要求自己設計出一個簡易的作業系統,是一個極好的實踐專案(7個lab),如果有機會就建議搞一下,因為這可以作為作為專案的東西。
個人計劃:
- 《深入理解計算機系統》
- 《現代作業系統》
- 《UNIX環境高階程式設計》
- 《MIT6.828》
六、計算機網路
不知道你們本科學沒學過計算機網路,如果學過的話應該會好一些,雖然學的比較水,但是聊勝於無。本人在本科學過的《計算機網路 自頂向下方法》,這本書雖然厚,雖然是翻譯版本,但是真的不錯。
《圖解TCP/IP》,這本書非常的簡單明瞭又很薄,只要花上三天時間就能大概讀完。多讀讀這本書還是挺有好處的,基礎資料,又有圖,可以說是很友好了。
《TCP/IP詳解》卷一,一本進階書籍,屬於必讀的書籍之一,其中的12-16章是重點,TCP、IP、UDP等等。
其它部分看書太麻煩了,直接從部落格裡看了。
個人計劃:
- 《計算機網路 自頂向下方法》
- 《圖解TCP/IP》
- 《TCP/IP詳解》卷一
- 部落格。。。
七、資料庫
很多面試官都會問一下,你是不是學過資料庫,如果沒有的話,大概就不會問了,不是什麼特別影響的事。
《資料庫概論》基礎書籍,快速讀過一遍就可以了,重在瞭解概念與基礎,相當於是個入門級別的。
《Mysql必知必會》基礎書籍,快速瞭解mysql的好書,強烈推薦,Mysql(關係型資料庫管理系統)是一個很重要的資料庫知識,是 SQL 語言是用於訪問資料庫的最常用標準化語言。
《高效能mysql》,這個書只要讀前面索引和效能的部分即可,除非你有很多時間去準備,這樣就隨便了,我是不行了。。。
如果問了資料庫的話,也不會太多,校招時間有限,所以建議基礎先打好,後續再學習更深入的部分。
個人計劃:
- 《資料庫概論》
- 《Mysql必知必會》
- 《高效能mysql》
- 牛客網
八、Linux提高
Linux 環境程式設計 apue 和 unp 兩本是必須的,但是因為太厚了,看起來還是有點痛苦的,還好是不需要全看的,而且內容重疊很多。大佬推薦:unp 卷1前面8章是重點,卷2前面4部分都挺重要的;apue 全部,先是要有個概念,自己寫程式碼的時候就知道哪塊重要了。
《深入理解linux核心》,這本書是挺有名,不過很多人都是完全啃不動,一個大佬推薦《linux核心設計與實現》,外加一大堆部落格,除此之外,《深入理解計算機系統》講的東西比較簡單,可以作為一個補充。
《Linux多執行緒伺服器端程式設計》,陳碩的書,講 muduo 網路庫的,如果你能看好多遍的,收穫肯定是非常多的。另外前面部分是後臺開發的一些經驗之談,對面試也很有用。還有好多專案都是基於 muduo 實現的,基本上是必讀書籍了。
《Redis設計與實現》也是一本看完之後感覺特別好的書,很值得學習,可以很快就看完。有很多重要的資料結構可以在面試的時候講出來,比如跳錶、redis 的 hash 表等等。
《深入理解Nginx》也是極其經典的一本書,因為 nginx 太經典了,很多面試官也都提到過,所以可以看一下。
一個大佬還推薦了,短小精悍的原始碼——leveldb,對照部落格就可以把 leveldb 原始碼看完,並不需要多長時間,在此基礎上還可以瞭解一下 rocksdb。
《Linux核心完全剖析——基於0.12核心》,這個書好像之前CSDN上有人下載過,具體的忘了。
個人計劃:
- 《apue》
- 《unp》
- 《深入理解linux核心》
- 《Linux多執行緒伺服器端程式設計》
- 《Redis設計與實現》
- 《深入理解Nginx》
- 《leveldb》
- 《rocksdb》
- 《Linux核心完全剖析——基於0.12核心》
九、後臺開發
《後臺開發:核心技術與應用實踐》是騰訊的員工寫的,雖然這本書評價比較差,幾乎都是抄的部落格,但是內容上總結的很好,可以認為就是給我們們校招的同學寫的(原來抄部落格就能寫書,那我豈不是也能寫書了),都是後臺開發需要的基礎知識的總結,這本書中內容所代表的知識,基本都是騰訊的C++後臺開發工程師所必備的基礎,可以作為一個複習提綱。
十、總結
這就是一個拉鋸戰,誰能站到最後,誰就通吃,就是這麼簡單又殘酷的道理,建議多看看面經,就知道自己有多菜了。。。共勉。
留言區有話就留言,可以一起加油,一起努力,已經無路可退,唯有逆風飛翔。
如果有幸幫到你,請幫我點個【贊】,給個【關注】!如果能順帶【評論】給個鼓勵,我將不勝感激。
如果想要更多的資源,歡迎關注 @我是管小亮,文字強迫症MAX~
想看更多文(段)章(子),歡迎關注微信公眾號「程式設計師管小亮」~
參考文章
相關文章
- GO學習路線及資源分享Go
- C++學習路線圖C++
- PHP學習路線資源總結[持續更新]PHP
- C/C++學習路線———學習筆記C++筆記
- Java全棧學習路線、學習資源和麵試題一條龍Java全棧
- 大資料經典學習路線大資料
- 三星S8創新加持 iPhone已經無路可退iPhone
- 網路學習英文的資源站點蒐集
- 侯捷老師C++學習路線C++
- 大資料工程師-學習路線-轉大資料工程師
- 資源 | 25個深度學習開源資料集,have fun !深度學習
- 大資料經典學習路線,必看!!大資料
- iOS學習資源(一)iOS
- Django 最佳學習路徑 | 涵蓋眾多學習資源Django
- C++相關資源C++
- 網路資源下載 - 中醫經絡
- iOS開發學習路線iOS
- 小白如何學習大資料開發,大資料學習路線是怎樣的?大資料
- web前端學習路線,前端開發最全知識點彙總(附學習教程資料)Web前端
- 小白 C++ 入門併發瘋學習路線(書單)C++
- “無法找到網路路徑”無法實現資源共享
- 來自一線開發者的Swift學習資源推薦Swift
- 大資料學習路線大資料
- JAVA學習資源一覽Java
- 開源已經勝出,但是可持續嗎?
- 風機故障診斷學習資源(更新中)
- 雲原生運維工程師學習路線與資料運維工程師
- Kinect開發學習筆記之(二)Kinect開發學習資源整理筆記
- Java學習路線圖,內附完整Java自學視訊教程+工具經驗Java
- Django的學習資源Django
- 好程式設計師大資料學習路線之大資料自學路線一程式設計師大資料
- 資料科學、資料工程學習路線資料科學
- PHP工程師的最佳學習路線PHP工程師
- RAII:C++資源管理的利器(轉)AIC++
- 大資料經典學習路線(及供參考)大資料
- Android開發,你應該知道的學習資源Android
- 想從事遊戲開發的隊友們,5個階段學習路線給你準備好了!(含引擎/書籍資源)遊戲開發
- C#開源資源專案C#