看過我經歷文章的同學,應該都知道
在研究生畢業的那一年,參加校招,拿到了幾個offer,最后選擇了阿里。
但阿里分配部門的時間特別晚,到了十一月底,才有人給我打電話過來,說我被分到了蝦米音樂,做開發。
那時候,開發還是個新興詞匯,我用的手機還是 2.2的系統。
后來,我還是接受了這個offer。
主要有兩個原因
第一,我其它offer都已經被拒絕了,秋招也基本接近尾聲。如果我不接這個offer,那我大概率只能再戰來年的春招。
有過校招經歷的同學應該都知道,春招其實是校招的補錄環節。招的崗位主要是秋招被那些offer收割機放棄工崗位,所以比較大的企業,一般不會參加春招的,他們崗位在秋招就已經招滿了。
所以,再戰春招的風險比較大,如果春招沒走了,那這個碩士算是白讀了。
第二,是新興的平臺。唯一可以肯定的是,它比傳統的老爺機好用,當年的機銷量也在持續上升。
對于喜歡創業的我來說,這或許是這個機會。學會在平臺開發軟件,我也就可以自己做產品了。
所以,綜合考慮,還是接受了這份offer,盡管蝦米并不是我想去的地方。
對于軟件開發而言,隨著桌面端應用開發已經全部被移動端開發所替代。所以當前大批量的桌面端應用開發人員被迫轉行。
對于C++而言,軟件開發的崗位目前有且僅有linux C++服務端開發這一個崗位。
很多同學不知道C++怎么學,我耗費了近一個月的閑暇時間給大家做了個linux C++的學習路徑圖。
這份路線圖,是我跟兩個大廠朋友共同完成的,為了不給大家造成誤導,連續勘校了一個月。
涵蓋了linux C++每個階段所需要學習的知識點。
包括計算機基礎(組成原理、計算機網絡、操作系統、編譯原理、數據結構、算法、設計模式)、開發環境及編譯器的使用、第一階段(C++入門)、第二階段(C++進階)、第三階段(征服Linux)、第四階段(高級進階)、第五階段(架構師)及近五十個優秀開源工程匯總、及程序員所需具備的軟技能。
關于計算機基礎知識,我之前有過一篇文章講解并推薦了學習書籍和視頻,在知乎目前也有六千贊,這里就不再重復了,大家可以直接移步過去參考,絕對會對你有所幫助,
本文共7100字,需要閱讀18分鐘,提前給出大家高清無水印版和下文中所推薦的各種學習資料。
大家在我備用號【java手記】中,回復 136 ,即可下載
我們這里著重講述linux C++的學習階段。
各個答主都著重在講述linux C++有哪些內容應該學并且推薦了一些資料,但這么多資料真的有多用嗎?
任何時候,我們都應該循序漸進!你讓一個小白,上來就學中間件?估計直接就勸退!
一、工具的選擇
工欲善其事,必先利其器。我們先看下開發工具的選擇
IDE:
我這里列出了系列和VS Code的IDE。對于C++er而言,我們可以使用CLion,也可以使用微軟開發的 Code(簡稱VS Code)。
CLion :跨平臺的C/C++ IDE 開發工具,支持C++11 、C++14、libc++以及Boost。
Code(簡稱VS Code):是一個由微軟開發,同時支持 、 Linux和macOS等操作系統的免費代碼編輯器,它支持測試,并內置了Git 版本控制功能,同時也具有開發環境功能,例如代碼補全(類似于 )、代碼片段和代碼重構等。該編輯器支持用戶個性化配置,例如改變主題顏色、鍵盤快捷方式等各種屬性和參數,同時還在編輯器中內置了擴展程序管理的功能。
在2019年的 Stack 組織的開發者調研中,VS Code被認為是最受開發者歡迎的開發環境。
編輯器:
在 Linux 下開發肯定離不開 Vim 或者 Emacs,這兩個都是常用的編輯器,已經形成了兩大愛好者陣營。特別是 Vim 編輯器,學習成本有點高,配合上各種插件和配置,有些 Vim 愛好者已經把它當成 IDE 來用了,一旦掌握可以大幅提升工作效率,值得你去學習。
當然除了 Vim 如果是文字編輯工作,比如寫 文檔或者寫技術博客,那么強烈推薦學習下 語法,這是一種種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,注重內容本身不用過多的調整排版。 編輯器推薦 、有道云筆記 編輯器、 插件。
版本控制:
大型軟件項目的代碼量巨大,如何有效組織和管理源碼和版本,于是產生了版本控制系統。版本控制系統就是我們常說的SVN 或 Git,用來追蹤、維護源碼、文件以及配置文件等等的改動,并且提供控制這些改動控制權的程序。
常見的版本控制系統分為兩大類:集中式版本控制和分布式版本控制。作為后端開發工程師,版本控制系統的使用也是必須掌握的基礎技能,不過這些系統一般都是邊使用邊熟悉,剛開始熟悉一些常用操作就好
二、第一階段:C++入門
很多同學問我,學C++要先學C語言嗎?當然不需要!
C++和C語言本來就是兩種不同的編程語言,但C++確實是對C語言的擴充和延伸,并且對C語言提供后向兼容的能力。
所以,如果你本身就要學C++,反而從C語言開始,把C語言學完以后,還需要重新學習和適應C++的區別和特性,浪費時間。
當然,如果你原來就會C語言,那你學C++會更快。畢竟,他們之間的區別并不像跟其它語言一樣那么大。
第一階段,大家只需要了解C++的語言基礎、一些基礎的linux命令和常用的幾個數據結構即可。
我們只需要能夠在linux上面簡單跑起來代碼,或者直接在IDE中跑出來,也是可以的。
在這個階段,我們需要的是快速入門,最后我們可以做一個電子詞曲人小項目,以使用C++的基礎知識。(電子詞典的源碼將和推薦的書籍、技術路圖一同提供)
強烈大家剛開始要跟著視頻學,C++本身就難,如果自己看書的話,會非常吃力。在看視頻的同時,把書做為輔助,有奇效。
視頻強推侯捷老師的C++面向對象程序設計,我當前入門C++就是跟著侯老師學的,講的非常仔細,現在候老師在B站上開源他的講課視頻,大家可以去看:
《候捷-C++面向對象高級開發(上)》:
《候捷-C++面向對象高級開發(下)》:
但候老師的課,一如即往的每節都非常長,短的也要三十分鐘……著實很難堅持。
對于定不住的同學,可以看小甲魚的《C++快速入門》,每個視頻十分鐘左右,共49集,看完以后,再看候老師的課會輕松很多。
《C++快速入門》:
配置書籍首推《C++ 》
本書是久負盛名的C++經典教程,其內容是C++大師 B. 豐富的實踐經驗和C++標準委員會原負責人Josée 對C++標準深入理解的完美結合,已經幫助全球無數程序員學會了C++。
《 C++:改善程序與設計的55個具體做法》(中文版)
一共組織55個準則windows下c語言 客戶機/服務器網絡編程,每一條準則描述一個編寫出更好的C++的方式。每一個條款的背后都有具體范例支撐,教你怎樣才能寫出優雅的C++代碼。這里也是很多關于C++方面面試問題的出處。
三、第二階段:C++進階
這個階段主要了解STL的使用,學會應用一些常用的設計,并且能夠開發一個貪吃蛇項目,以學習類和設計模式的使用。
有關STL標準庫的使用是比較難的,同樣推薦大家以視頻入手。
再次感謝侯捷老師,他錄制了46集的系列視頻講解了《C++ STL標準庫和 C++ 泛型編程》
侯捷-C++ STL標準庫和 C++ 泛型編程:
配置書籍推薦《C++ 標準程序庫》
這本書給我感覺就是既適合初期入門,又適合當字典用,因為里面的內容比較多,好多第一次記不住。
所以也可以大致看一遍,以后用時再具體記,這樣根據實際去學習我個人覺得效果會更好。
《STL源碼剖析》
學習編程的人都知道,閱讀、剖析名家代碼乃是提高水平的捷徑。源碼之前,了無秘密。大師們的縝密思維、經驗結晶、技術思路、獨到風格,都原原本本體現在源碼之中。在你仔細推敲之中,迷惑不解之時,恍然大悟之際,你的經驗、思維、視野、知識乃至技術品位都會獲得快速的成長。
四、第三階段:征服Linux
到了這部分,就真正開始涉及linux開發了
首先,我們需要熟悉Linux的常用基本指令:
書籍首推《鳥哥的linux私房菜》:
內容講的很好,比較簡單易懂,當然,如果你還是覺得困難的話,可以跟著視頻一塊學,在B站有一些up主錄制了《鳥哥的linux私房菜》的教學視頻,可以一起參考:
鳥哥的私房菜linux:
然后,我們需要學習各種基于linux的編程API,分別學會系統編程、網絡編程、數據庫編程。這些內容學完,已經能夠自行實現軟件開發了,找個工作問題不大。
1、系統編程
眾所周知,系統編程里有各種各樣的 API,同理Linux系統API的使用就更加重要。
2、網絡編程
后臺開發是離不開網絡編程的,甚至簡單來說,后臺開發就是用厲害點的電腦去處理大規模的網絡請求。所以作為一名合格的后端開發人員,對Linux網絡編程的熟悉是必不可少的。
3、數據庫編程
如果只是會MySQL基礎可能是遠遠不夠的,像是Redis,等非關系型數據庫也是當前的熱門。分布式數據庫,分布式存儲是當前每個大公司都會非常重視的核心,所以數據庫基礎非常的重要。
一般而言,Linux/Unix的書籍會一齊覆蓋系統、網絡、數據庫這三個方面的知識。所以,這里的書籍做一次統一推薦。
首推Linux編程經典書籍:《UNIX環境高級編程》,本書是被譽為UNIX編程“圣經”,這本書大而全,但也比較難啃,可以挑著看
如果覺得上面那本書看不懂,那推薦《Linux高性能服務器編程》,這本書對菜雞比較友好,內容很龐大,而且基礎講解的比較詳細。
如果只是會MySQL基礎可能是遠遠不夠的,像是Redis,等非關系型數據庫也是當前的熱門。
分布式數據庫,分布式存儲是當前每個大公司都會非常重視的核心,所以數據庫基礎非常的重要。
MySQL入門建議可以看《MySQL必知必會》。原理比較少,基本都是語法和使用細節,適合先過一遍。
Redis入門可以看《Redis設計與實現》這本書。非常詳細的講了Redis的底層數據結構,包括其集群部分也做了很好的解釋。除此之外可以再去理解一下分布式的Raft算法,協議等等。
很多同學在學習的同時,想要做些實戰項目,我也把的優秀開源項目進行了整理,這里也分享給大家。
這些內容學完以后,基本上具有了工作兩年的水平,別說校招,就是社招找工作都是非常簡單的。
第四階段:高級進階
在劃分時,我也是非常糾結的,因為編程的學習并不是完全線性的,并不一定要先學A才能學到B。比如,這里列到的監控的統計,大家在學習前面的編程書籍時,一般也都會涉及。
但我仍把它列到了高級進階部分,因為我是基于對就業的必要性來劃分的。很多同學看這個路線圖的主要目的就是為了找份工作,所以,我為了減輕大家負擔,把就業時可有可無的項放在了高級進階,而把必會的編程能力放在了第三階段:征服Linux。
高級進階部分主要考察的點在于中間件的使用、監控與統計、測試、性能調優和云原生。
1、中間件
后端開發中你可能經常聽說到「中間件」這個詞,那什么是中間件?看下Wiki上的定義:
中間件(英語:),又譯中間件、中介層,是一類提供系統軟件和應用軟件之間連接、便于軟件各部件之間的溝通的軟件,應用軟件可以借助中間件在不同的技術架構之間共享信息與資源。中間件位于客戶機服務器的操作系統之上,管理著計算資源和網絡通信。-- 維基百科
中間件能夠為上層應用軟件的開發提供便捷的、開箱即用的服務交互和計算的能力,縮短開發周期;屏蔽底層的差異;節省應用本身的系統資源,減少運行成本。
中間件部分主要的學習內容有:
這里需要說明的是,同一個中間件,有多種技術選型,大家不必全部都會,根據當前自己公司在使用的中間件類型學習即可。
比如RPC框架這里就列出來了四個Tars、Dubbo、gRPC、,這四個都是RPC框架,都各有優劣勢,大家只學習一款即可。
由于中間件內容眾多,且每個中間件都會有對應的書籍,我們就不再一一推薦了
2、云原生
隨著云時代的到來,大量公司的業務向云上遷移;
為了云上客戶能夠便捷的使用穩定高效的中間件能力,云廠商開始將自身沉淀的基礎中間件能力云化,用于支撐各個云上客戶和自身業務的快速生長。
比如阿里的一系列中間件產品,EDAS(用于幫助企業級客戶輕松構建并托管分布式應用服務)、用于加密安全的對象存儲 OSS、阿里云商用的專業消息中間件 [ONS]、阿里巴巴自主研發的分布式數據庫產品 [DRDS]等
如果你們公司有上云服務,那云上面的各種中間件產品和部署、使用方法是需要了解的。
3、性能調優
當看到性能指標時,我相信“高并發”和“響應快”一定是你最先想到的。而它們也正對應著性能優化的兩個核心指標——“吞吐”和“延時”。這兩個指標是從應用負載的角度來考察性能,并直接影響了產品終端用戶的體驗。性能分析,其實就是找出應用或系統的瓶頸,并設法去避免或者緩解它們,從而更高效地利用系統資源處理更多的請求。
性能調優,包括:
linux本身的調優方法:大家都知道Linux不同的發行版本和不同的內核對各項參數及設置均做了改動,從而使得系統能夠獲得更好的性能。
MySQL調優:MYSQL 如此方便和穩定,以至于我們在開發 WEB 程序的時候很少想到它。即使想到優化也是程序級別的,比如,不要寫過于消耗資源的 SQL 語句。但是除此之外,在整個系統上仍然有很多可以優化的地方。
GCC調優:代碼優化可以說是一個非常復雜而又非常重要的問題,以筆者多年的linux c開發經驗來說優化通常分為兩個方面,一是人為優化,也就是基于編程經驗采用更簡易的數據結構函數等來降低編譯器負擔,二是采用系統自帶的優化模式,也就是gcc - o系列
4、測試
做為服務端開發,為了保證代碼的正確以及能夠應對一定的流量壓力,會一些測試技巧是必不可少的。常見的有壓力測試、單元測試、全鏈路測試、A/B、灰度測試和藍綠測試。
5、監控與統計
后臺服務運行我們如何了解其運行狀態和健康度?如果只是開發小玩具監控和統計大可不必,只需記錄本地日志即可,對于成熟的大型后臺服務系統,監控、統計、追蹤必不可少,無監控,不運營
這里列出來了業界常用的幾個監控和追蹤管理的開源軟件,大家可以根據需要自行選擇學習其中一種。
第五階段:架構師階段
到了架構師階段,就不再是簡單的會用中間件和一些開源框架,而是要求有分布式架構、集群、源碼分析的能力。
1、分布式架構
如何設計一套分布式系統?
說白了就是:如何合理將一個系統拆分成多個子系統部署到不同機器上。
將系統拆分成多個子系統,這就意味著拆分后的系統必然需要通過網絡進行互相通信聯系。所以通信中的穩定和安全也顯得尤為重要。隨著業務慢慢的增長,擴展性、可靠性、數據一致性都需要進行考慮。
2、集群
分布式是指將不同的業務分布在不同的地方。而集群指的是將幾臺服務器集中在一起,實現同一業務。
分布式中的每一個節點,都可以做集群。而集群并不一定就是分布式的。
舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應服務器,后面幾臺服務器完成同一業務,如果有業務訪問的時候,響應服務器看哪臺服務器的負載不是很重,就將給哪一臺去完成。
而分布式,從窄意上理解,也跟集群差不多, 但是它的組織比較松散,不像集群,有一個組織性,一臺服務器垮了,其它的服務器可以頂上來。
分布式的每一個節點,都完成不同的業務,一個節點垮了,哪這個業務就不可訪問了。
3、安全
本質上后臺服務在網絡上運行,需要和各種網絡環境交互,在正常情況下能夠工作,但互聯網中有很多針對后臺服務的惡意攻擊,因此網絡安全也是后臺開發工程師需要學習的內容。
網絡攻防并不只是公司網絡安全工程師的責任,做為技術架構師,我們需要了解一些常見的網絡攻擊方法windows下c語言 客戶機/服務器網絡編程,當出現網絡攻擊時,不至于抓瞎。
4、源碼分析
知其然,知其所以然
做為架構師,我們需要清楚地知道我們所用的Linux內核和各種框架的內部具體是怎么實現的,以至于在出現各種疑難雜癥的時候,能夠從根本上分析并解決問題。
好了,整個linux C++的學習路線和學習資料都推薦給大家了,正如我文中所說,技術的學習并不是線性的,有時候,我們會發現一本書中在學著A同時講解著B的知識,而你會發現我居然沒把B跟A列在一個等級。
這是因為我分割技術時,是以是否以找工作必備為前提進行劃分的,對于找工作必備的知識點我盡量靠前,對于不那么必需的技能,一般往后放,以減少大家初入門時的學習壓力。
最后,希望大家都能如愿成為編程高手。
我是啟艦,不要讓未來的你討厭現在的自己,一起加油