【資源】一個C/C++開發工程師的學習路線(已經無路可退,唯有逆風飛翔)【內附資源頁】

我是管小亮發表於2020-04-02

知乎同步地址: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/,淘寶找一個商家下載即可,一般也就一兩塊。
在這裡插入圖片描述

〇、寫在前面

在這裡插入圖片描述
事實上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 學起來其實很簡單,看別人程式碼的過程就是學習的過程。對於不熟悉的用法多搜下官方文件,如 pythonnumpypandasmatplotscikit-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 命令在將來的工作中會帶來很大的效率提升。
  • vimLinux 下最常用的編輯器,從小白到高手都可以使用,而它的列編輯,查詢替換,自動補全等功能都是效率的保證,或許從 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 環境程式設計 apueunp 兩本是必須的,但是因為太厚了,看起來還是有點痛苦的,還好是不需要全看的,而且內容重疊很多。大佬推薦:unp 卷1前面8章是重點,卷2前面4部分都挺重要的;apue 全部,先是要有個概念,自己寫程式碼的時候就知道哪塊重要了。

《深入理解linux核心》,這本書是挺有名,不過很多人都是完全啃不動,一個大佬推薦《linux核心設計與實現》,外加一大堆部落格,除此之外,《深入理解計算機系統》講的東西比較簡單,可以作為一個補充。

《Linux多執行緒伺服器端程式設計》,陳碩的書,講 muduo 網路庫的,如果你能看好多遍的,收穫肯定是非常多的。另外前面部分是後臺開發的一些經驗之談,對面試也很有用。還有好多專案都是基於 muduo 實現的,基本上是必讀書籍了。

《Redis設計與實現》也是一本看完之後感覺特別好的書,很值得學習,可以很快就看完。有很多重要的資料結構可以在面試的時候講出來,比如跳錶、redishash 表等等。

《深入理解Nginx》也是極其經典的一本書,因為 nginx 太經典了,很多面試官也都提到過,所以可以看一下。

一個大佬還推薦了,短小精悍的原始碼——leveldb,對照部落格就可以把 leveldb 原始碼看完,並不需要多長時間,在此基礎上還可以瞭解一下 rocksdb

《Linux核心完全剖析——基於0.12核心》,這個書好像之前CSDN上有人下載過,具體的忘了。

個人計劃

  • 《apue》
  • 《unp》
  • 《深入理解linux核心》
  • 《Linux多執行緒伺服器端程式設計》
  • 《Redis設計與實現》
  • 《深入理解Nginx》
  • 《leveldb》
  • 《rocksdb》
  • 《Linux核心完全剖析——基於0.12核心》

九、後臺開發

《後臺開發:核心技術與應用實踐》是騰訊的員工寫的,雖然這本書評價比較差,幾乎都是抄的部落格,但是內容上總結的很好,可以認為就是給我們們校招的同學寫的(原來抄部落格就能寫書,那我豈不是也能寫書了),都是後臺開發需要的基礎知識的總結,這本書中內容所代表的知識,基本都是騰訊的C++後臺開發工程師所必備的基礎,可以作為一個複習提綱。

十、總結

這就是一個拉鋸戰,誰能站到最後,誰就通吃,就是這麼簡單又殘酷的道理,建議多看看面經,就知道自己有多菜了。。。共勉。

留言區有話就留言,可以一起加油,一起努力,已經無路可退,唯有逆風飛翔。

在這裡插入圖片描述

如果有幸幫到你,請幫我點個【贊】,給個【關注】!如果能順帶【評論】給個鼓勵,我將不勝感激。

如果想要更多的資源,歡迎關注 @我是管小亮,文字強迫症MAX~

想看更多文(段)章(子),歡迎關注微信公眾號「程式設計師管小亮」~

在這裡插入圖片描述

參考文章

相關文章