❝文章每周持續更新,「三連」讓更多人看到是對我最大的肯定。可以微信搜索公眾號「 后端技術學堂 」第一時間閱讀(一般比博客早更新一到兩篇)
❞
最近在知乎經常被邀請回答類似如何學習C++和C++后台開發應該具體儲備哪些基礎技能的問題。
本身我從事的的C++后台開發的工作,目前在鵝廠從事軟件開發工作,所以寫這篇文章,分享自己的C++后台開發學習路徑和點過的技能樹,希望能給想從事后台開發的同學一點參考,若能幫你少走些彎路就更好。
工欲善其事必先利其器,好的書籍能讓學習事半功倍,所以每個技能點之后我會推薦一些書,都是我讀過且口碑不錯的書,供參考。
文末可以獲取學習路線資源,需要的同學自取。
「分享的是我的學習路徑,如果你也能順着這個學習路徑認真學一遍,我想在后台開發技術上你已經有一個很不錯的技術積累,加上項目練習通過大部分大廠面試是沒有問題的。」
計算機基礎綜合
考過CS或者軟件工程研究生的同學可能對這個標題不陌生,是的,我說的就是專業課代號408的「計算機基礎綜合」。這門專業課包含:數據結構、計算機組成原理、計算機網路、操作系統。
為什么提起這門課程呢,因為基礎知識太重要了!這是科班區別於培訓班的最大不同,理論知識不一定馬上能用於項目上,但當與人討論起某個技術問題時你能夠知道它深層次的原因,看問題的角度會更加全面和系統。
打個比方,你可能聽過堆棧的名詞,但知道它的具體結構和不同嗎?學完數據結構就明白了;你知道計算機會算加減乘除,但具體是如何實現的呢?組成原理會告訴你;知道程序執行的時候怎么區分指令地址和數據地址的嗎?操作系統會告訴你答案。
所以如果你大學不是計算機相關專業,或者是本專業但是沒有完全吃透基礎的話,強烈建議你務必抽時間好好學習這幾門課程。
推薦書:
「計算機基礎綜合」推薦看大學的計算機專業教材就可以:數據結構、計算機組成原理、計算機網路、操作系統。
-
數據結構
❝2.輔導書:《算法與數據結構考研試題精析(第二版)》機械工業出版社
❞
-
計算機組成原理
❝輔導書:
《計算機組成原理考研指導》徐愛萍 清華大學出版社
《計算機組成原理--學習指導與習題解答》唐朔飛 高等教育出版社
❞
-
操作系統
❝教材:《計算機操作系統(修訂版)》湯子瀛 西安電子科技大學出版社
輔導書:《操作系統考研輔導教程(計算機專業研究生入學考試全真題解) 》電子科技大學出版社
《操作系統考研指導》清華大學出版社
❞
-
計算機網絡
❝教材:《計算機網絡(第五版)》謝希仁 電子工業出版社
輔導書:《計算機網絡知識要點與習題解析》哈爾濱工程大學出版社
❞
視頻教材
看上面的課本教程估計非常枯燥,下面是我覺得講的不錯的國內大學公開課我聽過一部分,講的都是計算機專業的基礎內容,如果你沒有系統的學過或者學的不好,都是非常建議刷一遍視頻課的。
「這一小節寫的有點多,因為基礎實在是太重要了!科班和非科班的差距不是誰學的編程語言多,也不是誰框架用的溜,本質區別是理論知識儲備差別和用CS思維獨立思考分析解決問題的能力。」
C++和C語法基礎
「語法是一門語言的基礎」,C++的基礎語句和語法和C是很像的,最大的不同在class和異常處理機制,還有模板的應用,所以有C基礎語法學起來是很快,沒有C基礎也沒關系,啃完下面推薦的書也差不多,光說不練假把式,看完之后趁熱把課后習題敲一遍並且自己編譯通過才算看完。
推薦書:
《C++ Primer 中文版(第 5 版)》 經典的入門書籍,不要拿大學教材XX強來對比,不是一個等級。
標准庫STL學習
「STL提供了豐富的算法庫支持和各種容器」,C++標准庫提供了包括最基礎的標准輸入輸出iostrem
、各種容器vector、set、string
,熟練掌握標准庫,不用重復造輪子(練手學習目的的造輪子除外)寫出更C++的代碼。
推薦書:
C++進階
「學完了上面的C++基礎只是會用,要用好還需要不斷學習進階」, 站在巨人的肩膀上寫出更健壯高效的代碼,你沒踩過的坑前人已經踩過一遍,關於一些語言細節和更好的編碼習慣,有很多優秀的書籍可以學習。
推薦書
《Effective C++》 改善程序與設計的55個具體做法,非常值得一看,老手和新手的差別由此產生!
❝同一個作者,繼Effective C++之后,Scott Meyers於1996推出這本《More Effective C++(35個改善編程與設計的有效方法)》“續集”。條款變得比較少,頁數倒是多了一些,原因是這次選材比“一集”更高階,尤其是第5章。Meyers將此章命名為技術。
❞
《Inside the C++ Object Model》 這本書還有中文版本,翻譯質量也很高《深度探索C++對象模型》
C++11新標准
「新標准提供了解決現有問題更優雅、更C++的實現」。現行的大部分C++軟件還是C++98的標准,C++98是C++的第一個標准,經歷這么多年的發展,從前你需要從Boost庫(一個在C++98年代的准C++標准)獲得的對C++的擴充支持的大部分功能已經納入了C++11和甚至C++2X更新的標准當中,與時俱進拿起更先進的生產工具,工具就是效率。
推薦書:
Linux系統基礎和shell script
「如今幾乎所有的互聯網服務都是跑在linux系統上面的」。 對Linux系統一無所知那更加談不上后台開發了,所以要先學習linux系統操作,不如文件管理,系統命令,文件系統,權限管理,系統服務等。
至於shell script 就類似win的批處理腳本,相信我,你在linux下干活早晚會需要它,所以趁早系統學起來。
推薦書:
《鳥哥的Linux私房菜基礎學習篇》 這個系列還有一個服務器架設篇,前期學習個人感覺沒必要看
Linux環境高級編程
「普通用戶只需懂系統操作,軟件開發人員還要懂編程接口」。上一階段你已經能夠完成熟練操作Linux系統,知道一些常規的系統命令和服務,並且能夠利用shell script寫一些小工具提高日常開發效率。
我們的目標是星辰大海,作為軟件工程師,還需要更加深入的掌握linux系統編程技巧,「學習系統編程接口、系統調用API、內存管理、進程間通信(IPC)」,這是本階段的學習目的。
推薦書:
《UNIX環境高級編程》 這本是linux編程必看的APUE,強烈推薦通讀一遍,后續值得反復翻閱。
《Linux/UNIX系統編程手冊》 這本書和APUE有點重復,我看完APUE這本就跳着看了,平常可以看目錄查閱。
Linux網絡編程套接字
在同一台機器上進程間的通信(IPC)有多種方式,可以是通過「消息隊列、FIFO、共享內存」等方式。網絡編程套接字是指:分布在不同機器上的程序通過系統提供的網絡通信接口,跨越網絡將不同機器上的進程連接起來,實現跨機器的網絡通信。一般有「UDP套接字、TCP套接字、Unix Domain,當然,如果你是通信從業者對SCTP套接字肯定也不會陌生。」
推薦書:
數據庫和存儲
「程序運行數據都在易失性的內存中,需要持久化存儲時就需要數據庫」。一個后台服務系統一般來說都需要考慮數據落地和持久性存儲的問題,這時就會涉及到數據庫選型和應用,數據庫分為關系型數據庫和非關系型數據庫。
「關系型數據庫」指采用了關系模型來組織數據的數據庫,代表是MySql。 關系模型指的就是二維表格模型,而一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織。
「非關系型數據庫」以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不局限於固定的結構,可以減少一些時間和空間的開銷。代表有redis、memcached,騰訊內部組件ckv也是非關系型數據庫。
推薦書:
❝關於redis還有很多應用,比如基於redis的分布式鎖的應用,高並發搶紅包模型等,這個后面可以寫一篇關於分布式鎖的原理和應用文章。
❞
算法基礎
「計算機算法就是利用編程語言編寫出計算機能理解的解決問題的方法。」
好的算法能更簡潔高效的解決問題,如今不論是校招還是社招,大廠筆試都會考察算法,即使不是為了筆試作為軟件從業者也應該經常練習算法,保持手感。學習算法是學習解決問題的通用性方法有助於提高邏輯思維能力。
學習方法
「就我個人經驗來說,不推薦直接啃書的方式學習算法,建議看書的同時結合刷在線編程算法題的方式。」
具體的:邊看數據結構或算法導論,同時在牛客或者 leetcode上刷題,因為看書太枯燥很容易失去耐心,在線刷題的好處是你可以每天定目標,享受每個題目通過的快感,有正向反饋更容易堅持下來。
架構能力
**架構能力是利用已有知識來設計整個后台服務系統的能力。**不僅要求掌握技能的維度還要深度,需要能根據不同需求和系統約束,制定不同的設計方案。
這時候考慮的東西會更多,包括服務模型的設計:是多進程還是多線程甚至協程微線程,分布式還是集中式;
存儲的選型:考慮數據庫選型用哪個?需要根據存儲的數據特征和應用場景來區分,如果是社交應用的數據用非關系型數據庫來存儲可能更好,如果是電商訂單類型的數據,那么用關系型數據庫來存儲可能更好;
當然,還有后台系統的其他方方面面需要考慮,不一一舉例了。
更多的練習
**說了這么多,最最重要的還是練習練習練習。**理論知識儲備是必要條件,移動互聯網時代大家接觸到的碎片化信息太雜太亂,我個人經驗,高濃度的知識精華還是需要在大師的書本中汲取,所以看書是最正確和快速的學習路徑,沒有捷徑可走。
不過光看書也是不行,編程能力和技術是也是一門現代手藝活,還需要日常不斷的打磨手藝,正如「一萬小時定律」:
❝人們眼中的天才之所以卓越非凡,並非天資超人一等,而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成世界級大師的必要條件。要成為某個領域的專家,需要10000小時,按比例計算就是:如果每天工作八個小時,一周工作五天,那么成為一個領域的專家至少需要五年。這就是一萬小時定律。
❞
怎么打磨提高編程技術能力呢?找項目,「找感興趣的」東西用代碼去實現它,興趣是最好的老師,這點在編程和技術學習上也完全適用。
人們總傾向於去做快速獲得的愉悅感的事情,比如打一盤游戲30分鍾就能獲得快感。相反,技術碎片的提高是一個長期的過程,三分鍾熱度肯定是難以成功的。
所以要用技術做自己感興趣的東西和帶趣味性的編程,比如寫個爬蟲小程序抓取網站數據或者寫個小游戲,再或者自己造輪子給自己用,並樂此不疲的優化輪子。這樣每走一步都能獲得一點成就感,激勵自己繼續走下去,慢慢的一定會有質的飛躍。
一個網站
這個網站一定要告訴大家,網站就是個C++百科全書,類似Linux的man手冊,平常開發查忘記了函數名或者容器用法直接搜索非常方便,我下載了離線版本。
網址:C++參考: cppreference
待續
一口氣寫下來肯定還不夠完善,文章會保持更新和修改,想到了再補充吧文章在公眾號保持更新。
我整理了文中提到和推薦的電子書與視頻教材,都是學習過程收集的,搜索 「后端技術課堂」 回復 「1024」 免費分享給大家。
「原創不易,看到這里動動手指,點位的「三連」是對我持續創作的最大支持,我們下篇文章再見。」
❝可以微信搜索公眾號「 后端技術學堂 」回復「資料」有我給你准備的各種編程學習資料。文章每周持續更新,我們下期見!
❞