不論是學Java還是學C++,我們的目的都是為了進BAT等大廠。
眾所周知C++難學難精,Java難道不香嗎?我們為什么還要學習C++折磨自己?

上面的代碼就是C++,不論真偽,C++確實不易維護,能看懂別人寫的C++代碼,著實有點困難。Java其實也挺難學的,它只是跟C++難的不在一個點上,C++難的是語言本身,Java難的是各種框架、庫。既然都難,那我們為什么不選個性能王者?要知道,3種主流的操作系統Windows、Linux、Unix內核部分也都是用C++和匯編寫的。
C++的難其實也有好處,市場上這類人才很稀缺。Java雖說也是需求量不小,但想找到個不錯的Java開發者還是可以的,反觀C++,就難了,這恰恰就是我們的增值點。看看各大廠在招聘C++研發、開發工程師時給出的薪資就能感覺到。
C++在傳統上很強勢的領域中依然具有統治地位,譬如服務器端開發、游戲開發、嵌入式軟件開發、基礎設施和超大型軟件應用領域。
1. 我們目前見到的各種桌面應用軟件,尤其是Windows桌面軟件,例如QQ、安全類殺毒類軟件、瀏覽器等。
2. 一些基礎軟件和高級語言的運行時環境,例如大型數據庫軟件、Java虛擬機、C#的CLR、Python編譯器和運行時環境等。
3. 業務型應用軟件的后臺,例如大型網絡游戲的服務端和一些企業內部的應用系統等。
通常情況下,我們可以將C++看作C語言的一個超集。C++雖然從功能層面來看,離C語言越來越“遠”,但從語法層面來看,其大多數語法與C語言基本一致。對于C++面向對象的特性,如果仔細探究的話,我們會發現C++類方法的具體語法還是C語言的過程式語法,雖然這種現狀正在不斷改變。
C語言目前主要用于操作系統類偏底層的應用開發,比如Windows、Linux這樣的大型商業操作系統,以及嵌入式操作系統、嵌入式設備。有些開源軟件也會選擇C語言進行開發,主要是考慮程序執行效率和生成的可執行文件的體積(C代碼生成的可執行文件體積相對較小),當然,其中不乏一些歷史技術選型的原因,比如Redis、libevent、Nginx等。
在將高級語言翻譯成機器二進制碼時,C++編譯器生成了大量的額外機器碼,而這種機器碼相對于C語言來說不是必需的。例如,對于一個C++類的實例方法,編譯器在生成這個方法的機器碼時,會將函數的第1個參數設置為對象的this指針地址,以此來實現對象與函數的綁定。正因如此,許多開發者都會優化和調整編譯器生成的匯編代碼。
雖然Java、Python等的SDK或運行時環境最終也會調用操作系統API,但其自帶的SDK或者運行時環境都提供了常見的操作系統功能。而C++的運行時環境一般是操作系統自身,因此C++是離操作系統更近的一種編程語言,執行效率更高。
但是,C++的整套語法不具備“功能完備性”,在大多數情況下,單純地使用其本身提供的功能無法創建出任何有意義的程序,還必須借助操作系統API來實現。例如,C++本身不直接提供網絡通信功能的SDK,必須借助操作系統提供的套接字API才能實現網絡通信;而對于Java來說,JDK自帶的java.net、java.io等包則提供了完整的網絡通信功能。所以,熟悉操作系統相關原理和API是用好C++的前提,這也是C++難學、對新手不友好的主要原因之一。
不過,隨著C++標準和版本的不斷迭代,這種現狀正在改變:在C++標準庫中引入了越來越多的功能,避免直接調用操作系統API。
不管怎樣,應用直接使用操作系統API,程序執行效率高,控制力度大,開發能力僅僅限制于操作系統本身,這是 C++的優勢之一。比如對于 Java,假設操作系統提供了某個功能,但Java虛擬機不提供該功能,則開發人員也無法使用該功能。
編程大師Charles Petzold曾說過,操作系統是一個非常復雜的系統,在API之上加一層編程語言并不能消除其復雜性,最多將復雜性隱藏起來而已,而懂得系統API能讓我們更快地掙脫困境。
學好 C/C++ 體系的技術棧必須結合操作系統的運行機制來學習。展開來說,就是你必須掌握操作系統層面的幾大基礎知識:
第一個基礎知識是匯編。
第二個基礎知識是編譯、鏈接與運行時體系知識。
第三個基礎知識是狹義的操作系統原理。
第四個基礎知識是多線程知識。
第五個是網絡編程,直白地說就是 Socket 編程。

首先,應該打好基礎。我們要熟練使用C++,還要結合具體的操作系統學習C++,熟悉某操作系統的API函數,以及與系統API關聯的各類技術,比如各種進程與線程函數、多線程資源同步函數、文件操作函數、系統時間函數、內存分配與管理函數、網絡編程、PE或ELF文件的編譯、鏈接原理等。
如果已打好基礎,就可以找一些高質量的開源項目去實戰。最好找一些沒有復雜業務的開源項目,或者是自己熟悉其業務的開源項目(如IM系統)。如果不熟悉其業務,那么不但要學習其業務(軟件功能),還要學習其源碼,最終兩者難以兼顧。
因此,在學習這些項目之前,應該先確定自己的學習目的。如果學習目的是學習和借鑒這款軟件的架構設計,那么建議先進行整體把握,不要一開始就迷失在細枝末節中,這叫作“粗讀”。如果學習目的是學習開源軟件在一些細節上的處理方法,那么可以有針對性地閱讀自己感興趣的模塊,深入每一行代碼。當然,學習適合自己當前階段的項目源碼才是最好的。
學習的過程一般是接觸、熟悉、模仿、創造。不管對什么開源項目,在沒有任何思路或者解決方案時,我們都應該先接觸、熟悉、不斷模仿,做到至少心中有一套對某場景的解決方案,再來談創新、批判及改造。
總之,C++是一門講究深度的編程語言,其“深度”不體現在掌握多少C++語法,而在于是否熟悉所寫的C++代碼背后的系統原理,這是需要長期積累的,當然,一旦學成,就可以快速學習其他編程語言和框架。

說了這么多,再給大家強烈推薦一本學習C++的新書《C++ 服務器開發精髓》,作者是有著多年高性能高并發服務開發經驗的張遠龍老師。這本書正是一本可以幫你成為 C/C++ 技術棧熟練工的書。聽說這本書京東還沒到貨就已經預售出2000冊,到貨直接登頂京東計算機圖書TOP1。

我也和電子工業出版社楊老師給大家申請到了3本贈書,大家可以通過XXXXXX參與抽獎。
當然也一并給大家申請了5折包郵的粉絲福利價!原價168元,現在半價84元直接入手!要知道這可是有700多頁干貨的大部頭,等不及的朋友可以掃碼或者點擊閱讀原文直接下單。




此次朋友圈點贊送書,全靠運氣,2021 年 8 月21 號晚 8 點朋友圈點贊順序為 8、38、68、98、128、158、188、218 的 8 位小伙伴各送一本《C++ 服務器開發精髓》。添加下面微信好友,參加送書活動。
