你們好,我是軒轅。linux
上一週沒有怎麼更文,不少粉絲在後臺催更了,讓我趕忙寫小說,我也想啊,不過業餘時間就那麼多,事情又比較多,只能一件件安排過來呀。程序員
上週有兩件事耽擱了一些時間。面試
第一件事是爲了忙搬家的事費了很多功夫,雖然以前送了幾輪書,但發現個人書怎麼還有那麼多,感受還能夠送好幾回的樣子。因此還沒關注的朋友趕忙關注,指不定哪天又來送書了(是那種有不少能夠自選的哦)。算法
第二件事就是花了幾個晚上和週末,整理了我最擅長的三個方向的技術學習路線:C/C++後端開發、網絡安全、Java後端開發。shell
星球裏,還有微信上有太多的讀者詢問我這樣的問題:新手怎麼學?要學到什麼樣子才能找工做?有什麼學習資料推薦?數據庫
其實學習路線一類的文章網絡上也有很多,但我看了不少,大部分都是羅列了許多的課程和知識點,卻缺乏一個相似時間軸的東西,告訴你們按照什麼樣的節奏來推動,因此呢,我但願補上這一個重要的信息。編程
這份學習路線,包含了重新手到工做分階段所須要學習的內容、詳細的知識點、能夠參考的書單、電子書資源等等。後端
今天先給你們看C/C++後端開發的,長文預警,發車~設計模式
開局一張圖,內容全靠編,沒錯,我們先來看一張全局圖,先從整體上有個宏觀的認識。緩存
這張圖有點大,因爲微信對圖片壓縮的厲害,若是想要高清版的,能夠發送私信:C++,自動獲取。
我將學習路線分爲基礎、進階、拓展三大部分,每一部分又分爲兩個階段,總共分爲了六個階段來進行。
在我看來,相對來講,Python、Java這類上層語言是面向業務編程,而C/C++這類底層語言更可能是面向計算機編程,因此第一個基礎階段須要補充一些計算機的基礎知識,這個階段個人建議是這樣的:
首先,初學者須要瞭解計算機的基本常識和最基本的工做原理,像圖靈機、馮諾伊曼體系架構,就屬於這個範疇。
接着,還須要瞭解現代計算機的一些基本要素,好比計算機總線系統、數據信息的存儲與表示,常見的CPU體系架構與指令集、程序的基本概念、編程語言的發展歷史,類型等等。
這一部分的知識,能夠參考的書目有:
固然,上面這些書的內容其實有不少,一開始不用太過深刻,不用想着把書看完,那是一個巨大的工做量,對新手來講也是不現實的,一開始瞭解我上面提到的內容就能夠了。
上面是偏理論的知識,在這個小節,初學者能夠開始來學習使用Linux了,作C/C++後端開發,那必然是要常常與Linux打交道的。
對新手而言,這個小節,主要是學習基本使用爲主,旨在從熟悉的Windows切換到陌生的Linux系統,你們可使用虛擬機軟件在裏面安裝Ubuntu、CentOS來學習。須要學習的有了解下Linux基本的操做,經常使用的命令,權限管理基本概念,到後面可使用命令開發一些簡單的shell腳本等等。
這一部分的知識,能夠參考的書目有:
接下來,我們能夠正式來接觸C語言編程了。
C語言是計算機編程的基礎,雖然語法自己的知識點並很少,但想要學好,光學會語言自己遠遠不夠,其背後涉及的複雜龐大的計算機系統知識才是大頭。在這一個小節,我們只是邁出萬里長征第一步,掌握基本的語法知識,能順利的編寫一些簡單程序便可。
這一部分的知識,能夠參考的書目有:
第一階段的最後一部分,是時候來學習一些計算機網絡的知識。
做爲基礎階段,這一小節主要從宏觀上學習計算機網絡,而不是死扣某一個協議的某些字段意義。
首先從局域網出發,瞭解計算機通訊的基本網絡——以太網,局域網內是如何通訊的?集線器、交換機有什麼區別?MAC地址、IP地址、子網、子網掩碼分別是作什麼用的?
隨後引出更大的廣域網、互聯網,什麼是網絡通訊協議,通訊協議分層的問題,經過七層和四層模型快速創建起計算機網絡的基礎概念,各層協議的做用,分別有哪些協議,這些協議在當今的互聯網中具體是怎麼應用的。
這一部分的知識,能夠參考的書目有:
第一階段的學習到此爲止,新手經過上面幾個基礎課程,開始創建起對計算機和編程的初步認知。
第二階段仍是打基礎,這個階段中,一方面在第一階段之上,進行一些提高,另外一方面是繼續擴展學習須要掌握的基礎課程。
有了C語言的基礎,這個階段開始能夠進入C++的學習。
基本上全部人都知道,C++是一門很複雜的課程,感受永遠也沒法所有掌握。做爲基礎階段,這一小節主要的目標是掌握C++最基本的面向對象編程便可。
面向對象的幾個基本概念,繼承、封裝、多態、重載,以及友元、虛函數、引用與指針的區別,RAII編程技法,STL經典容器和迭代器的使用,到這裏,可以編寫基本的C++程序,能看懂C++項目源碼就可。
這一部分的知識,能夠參考的書目有:
C和C++的基礎具有了,是時候來接觸一下數據結構與算法了。
這部份內容初學者可能以爲有些枯燥,但千萬要頂住,這是每個程序員必須翻過的一座山。
經常使用的數據結構都在下面的圖中了,首先經過學習數據結構的基本定義,從理論上了解每一個數據結構的應用場景,各自的特色。
接着,能夠看一下牛客網上的《劍指Offer》和LeetCode,經過刷題來掌握常見數據結構的使用。
這一部分的知識,能夠參考的書目有:
代碼是如何變成CPU執行的指令的?可執行文件是如何構建的?這類問題須要學習編譯原理才能瞭解,作C/C++開發多少須要瞭解一些編譯原理的知識。
基礎階段的最後一部分,能夠來接觸一些數據庫的基礎知識了。
這個階段主要學一些理論知識,重點掌握庫、表、索引等概念,而後學習SQL的編寫,學會增刪改查數據。暫時不用編程來操做數據庫。
這一部分的知識,能夠參考的書目有:
通過前面兩個階段,這個時候你已經具有基本的編程知識,計算機系統、網絡、數據庫、編程語言、數據結構與算法都打過交道,能夠開始比較正式的項目開發了。
接下來,開始進入第三個階段:進階。在這個階段,主要是對以前學習的內容進行提高,學習的內容將更加深刻。
是時候開始和操做系統見面了,有了前面編程基礎的鋪墊,能夠思考咱們編寫的程序,操做系統是如何來管理運行的。
進程與線程是什麼、進程的地址空間佈局是什麼樣的、虛擬內存是什麼東西,內核態與用戶態又是什麼意思,操做系統又是如何如何處理系統調用、中斷與異常的,這些知識都藏在操做系統這門課中。
這一部分的知識,能夠參考的書目有:
前面咱們學習了C++基礎,但那個時候,還只是停留在入門級,關於C++的高階知識,在進階階段該來安排一下了。
把上面這部份內容掌握了,C++這門語言,你基本就上路了。
這一部分的知識,能夠參考的書目有:
學C/C++,光學語言不行,還得知道程序執行的底層原理。這一小節的內容,能夠幫助你深刻了解代碼和數據在內存中的執行過程和原理,對理解計算機工做原理很是有幫助。
一個優秀的程序員,必定也是一個調試高手。調試技術是每一個程序員必須掌握的一項技能,這裏的進階內容,建議學習一下軟件調試的原理,操做系統和CPU爲調試提供的技術支持,GDB經常使用命令須要掌握,特定環境下排查問題很是管用。
若是有精力,能夠簡單瞭解一下彙編語言,在調試時候,若是能看懂彙編指令,也是大有裨益。
這一部分的知識,能夠參考的書目有:
基礎階段接觸了經常使用的數據結構與算法,在進階階段將接觸一些更加複雜的算法,也是各大公司面試中出鏡率極高的內容。
這一部分的知識,能夠參考的書目有:
第四階段,開始全面提高編程能力,這部分的內容都是偏實戰化的,也是跟操做系統密切相關的部分,一方面須要繼續補充學習操做系統相關的編程知識,另外一方面須要經過大量編程和項目實際開發經從來錘鍊提高。
網絡編程,socket編程,各類網絡IO模型的區別與底層原理,尤爲是epoll模型中的各類細節問題,須要摸得很是熟悉。
多線程與多進程技術,Linux上的fork機制、pthread線程庫、C++的thread庫、線程同步技術,這都須要在實際編程中去掌握學習。
多進程必然涉及進程間通訊,進程間通訊經常使用的方式有哪些?各自的原理是什麼?這也是面試中常常出現的考題。
網絡編程和多進程通訊之中經常使用RPC和序列化技術,業界經常使用的幾大RPC框架和序列化技術均可以學習使用下,比較它們的原理異同,各自的優劣勢等等。
學到這個階段,對計算機網絡的學習須要進一步加深。在以前的基礎之上,更加專一一些重點協議的實現原理,關鍵的通訊過程,好比TCP、HTTP等這些重點協議是須要重點研究的對象。
在這個階段,你還須要學習使用抓包軟件抓取網絡數據包,實際的觀察學習網絡中的數據,加深對網絡通訊的理解和認知。
這一部分的知識,能夠參考的書目有:
完成前面四個階段,你徹底能夠開始開發一些更大型的項目了。在第五階段,主要是拓展學習一些與後端開發相關的知識。
開始接觸大型項目開發後,建議補充學習一下設計模式的知識,有助於提高編程架構能力,寫出更加優秀的代碼。
課本上的設計模式有二十多種,但精力有限的狀況下,挑選一些主要常常打交道的便可。
這一部分的知識,能夠參考的書目有:
作C/C++編程,建議補充學習一些跟網絡安全相關的知識,加解密技術、數字簽名技術、常見的軟件漏洞原理等等,拓展一下相關的知識面。
C/C++由於是比較底層的語言,常常須要與CPU、操做系統這些打交道,常常開發一些系統底層程序,因此瞭解學習一些計算機底層知識,對本身計算機系統知識的構建很是有幫助,也對未來在工做中遇到實際問題能提供一些更加底層的視角去分析看待問題。
這一部分的知識,能夠參考的書目有:
這個階段,再來學習一些C/C++後端開發技術棧中常常打交道的第三方組件,好比數據庫、緩存系統等等。不只僅學會使用,還要掌握瞭解它們的底層原理,這個時候,前面所學的計算機底層知識在這裏就能派上用場了。
MySQL是互聯網中應用很是多的數據庫系統,在基礎階段只學習了數據庫的理論知識和SQL的用法。
到這個階段,須要更加深刻,研究MySQL的底層原理,索引實現原理、事務實現原理、鎖機制等等,不只能用,還要能在開發大型項目遇到數據庫性能問題時,瞭解原理更好的解決問題。
這一部分的知識,能夠參考的書目有:
Redis做爲MySQL的好搭檔,緩存系統的主流選擇,其重要性愈來愈強了。
除了基本的使用,還須要學習一下Redis背後的原理,內存數據結構如何實現,持久化、高可用、集羣擴展、分佈式鎖如何實現等等問題都值得研究。一方面Redis做爲很是優秀的開源軟件,其自己就很是值得借鑑學習,另外一方面學習背後的實現原理,對實際工做中解決問題也有很是大的幫助。
這一部分的知識,能夠參考的書目有:
除了MySQL和Redis,其餘常見的後端開發軟件有下面這些,有時間也建議學習下,一邊學使用,一邊學原理:
以上就是作C/C++後端開發,重新手入門到工做所須要學習的內容整理了,可能並不全面,但掌握以上這些內容足以勝任大部分的崗位要求了。
除了學習路線,我還整理了這個過程當中學習的大量學習資料,配合上面的學習路線使用:
整理不易,若是以爲還不錯的話,歡迎幫軒轅點贊評論轉發三連支持呀~