轉(zhuǎn)行了!
大家好,我是二哥呀。
微信上收到一個讀者的私信,他正在一所 985 高校讀研,專業(yè)是機械工程,想轉(zhuǎn)行做軟件開發(fā),問我該選擇 C++ 還是 Java?

那考慮到還有不少讀者有類似的問題,我這里就把我之前的回答整理一下發(fā)出來,希望能給大家一些參考和啟發(fā)~
一、編程語言之間的區(qū)別
眾多的編程語言(C/C++、Java、Python、JavaScript)當(dāng)中,到底哪一門適合自己?其實會困擾很多初學(xué)者。借這個機會,就簡單給大家普及下。
C語言就好像是編程界的大叔,因為年長、穩(wěn)重,被尊稱為前輩。它更偏向于底層,用于系統(tǒng)和硬件編程。
C++算是 C語言的同室宗親,從小就受到 C語言的各種關(guān)照,自己也比較上進,練就了無數(shù)禁咒級別的魔法,擁有更強大的力量,廣泛應(yīng)用于游戲開發(fā),以及追求極致性能的應(yīng)用開發(fā)。
Java 雖然在名字上和 C/C++ 風(fēng)馬牛不相及,但其實有著頗深的淵源。Java 更喜歡跨平臺,也更愿意設(shè)身處地地為他人著想,所以在編程語言中的呼聲很高,有帝王之相。Java 可以用來做網(wǎng)站、做軟件、做安卓、做游戲,幾乎可以勝任所有工作。
Python 看起來似乎很年輕,但其實比 Java 還要年長幾歲,隨著大數(shù)據(jù)、人工智能的興起,Python 重新贏得了人們的青睞和信任,屬于典型的大器晚成,在人工智能、深度學(xué)習(xí)、自然語言處理等領(lǐng)域有著得天獨厚的優(yōu)勢。
JavaScript 從名字上看好像是 Java 的小弟,但它們之間的關(guān)系也僅限于此。JavaScript 面向的是前端開發(fā)者,可以說有瀏覽器的地方就離不開 JavaScript。
對于初學(xué)者來說,如果非要選擇一門編程語言來作為入門語言的話,我認(rèn)為 C++ 應(yīng)該排在最后。從崗位的選擇上來看,前端無疑選擇 JavaScript,后端可選 C語言和 Java,算法選擇 Python。等有了 C語言的基礎(chǔ)后,再學(xué) C++ 的阻力就會小很多。
JavaScript 在這些編程語言當(dāng)中是最特殊的,代碼編寫、代碼運行和代碼調(diào)試都可以直接在瀏覽器的開發(fā)者模式下進行,對于初學(xué)者來說,這一點極其重要,因為令人心煩的開發(fā)環(huán)境配置就省去了。
C++ 和 Java 之間的區(qū)別可以追溯到它們各自的傳統(tǒng),如果想知道 C++ 和 Java 之間有哪些細(xì)微的區(qū)別,可以到維基百科上看這個條目:
https://zh.wikipedia.org/wiki/Java%E5%92%8CC%2B%2B%E7%9A%84%E5%B0%8D%E7%85%A7
二、學(xué)C++的看不起 Java的?
為了幫大家對編程語言有一個初步的認(rèn)知,前面順帶分析了C語言、Python 和 JavaScript。針對讀者微笑的情況,我們來重點討論一下 C++ 和 Java。
編程界有一個固有的偏見,就是大多數(shù)人會默認(rèn) C++ 可以輕松轉(zhuǎn) Java,但 Java 轉(zhuǎn) C++ 很難。理由是,Java 程序員在軟件工程上的修煉比 C++ 更充分,但在內(nèi)存管理和硬件優(yōu)化上有著明顯的不足。
但 Gosling 曾說過一句話:“語言只是實現(xiàn)目標(biāo)的工具,而不是目標(biāo)本身?!?/p>
因此,我們學(xué)編程的這群人不應(yīng)該有這種偏見,應(yīng)該針對自身的情況,做出最有利于自己的選擇,因為每一種編程語言都有自己的應(yīng)用領(lǐng)域,而每個人的能力又千差萬別。
如果你是計算機科班生,天賦很高,自己對編程也有濃厚的興趣愛好,也想挑戰(zhàn)自己,那么可以選擇 C++。
C++ 的應(yīng)用范圍非常廣,能應(yīng)對多方面的需求,比如說網(wǎng)絡(luò)、通訊、圖像、游戲、桌面等等,像操作系統(tǒng)的部分內(nèi)核也都是由 C++ 編寫的。Java 的 Hotspot 虛擬機,整體上都是用 C++ 實現(xiàn)的,只有非常少量的匯編。
除此之外,下面這道選擇題無疑更富有哲理性:

Java 相比較于 C++,除了語言本身之外,我覺得最大的優(yōu)勢在于 Java 擁有著強大而豐富的開源生態(tài),就 Spring 這一體系的框架足以吊打任何對手。
英語里有個單詞——accountable,這東西不太好翻譯,直譯比較難把真正要表達(dá)的意思傳遞出來,用通俗一點的話講,叫做——指望得上。
Java 就是一種指望得上的編程語言。
往小了說,個人開發(fā)者可以到 GitHub 上 down 下來一套源碼,改上三五個月,就能交付一套成熟而完善的系統(tǒng)。
往大了說,阿里這家國內(nèi)互聯(lián)網(wǎng)頭部公司,主要的技術(shù)棧就是 Java,就不說它的產(chǎn)品了,光它的開源項目,我都能掰扯一整天。
Canal,主要用途是基于 MySQL 數(shù)據(jù)庫增量日志解析,提供增量數(shù)據(jù)訂閱和消費。 EasyExcel,一款快速、簡單避免 OOM 的 java 處理 Excel 工具。 Arthas,一款能夠分析、診斷、定位 Java 應(yīng)用問題的診斷工具。 FastJson,一款json 解析庫,幾乎由溫少一人開發(fā)和維護,強的一筆。 Druid,為監(jiān)控而生的數(shù)據(jù)庫連接池。 Nacos,一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。 RocketMQ,一款高性能、高可靠、高實時、分布式的消息隊列,目前已成為 Apache 的一個頂級項目。 Dubbo,一款高性能、輕量級的開源 Java RPC 框架
如果你肯花一點時間到 GitHub 或者碼云上逛一逛的話,就會發(fā)現(xiàn),原來 Java 的世界如此龐大和美好!
有人說,C++比 Java 難學(xué),但其實要加一個前提條件,就是如果你不下狠功夫,不去花時間和精力的話,不管是 C++,還是 Java,都很難學(xué)。很多初學(xué)者在遇到 C++ 中的指針、虛函數(shù)、動態(tài)綁定的時候,會怵得慌,我敢肯定,他在遇到 Java 中的并發(fā)編程、JVM 時也會怵得慌。
只不過,Java 對于初學(xué)者更友好一點,C++ 對高階程序員更開放一點。
當(dāng)然了,無論選擇哪一門編程語言,我覺得抽象思維能力是非常的重要的,這也是計算機領(lǐng)域最重要和最基礎(chǔ)的能力。你得把現(xiàn)實世界里復(fù)雜的問題抽象化,然后轉(zhuǎn)換成計算機能夠運行的語言,從高級編程語言,再到匯編語言,最后到機器語言。
三、到底該選擇 C++ 還是 Java
看到這,大家不會以為二哥是個 Javaer,就推薦讀者選擇 Java 了吧?
這個讀者的情況是,他之前已經(jīng)把 C++ 的基本編程語法學(xué)完了,希望能找一個計算機和機械結(jié)合的工作,所以我給他的建議是繼續(xù)學(xué)習(xí) C++。
因為他本身的學(xué)歷是過關(guān)的,985 的研究生,盡管是非科班,但編程的門檻已經(jīng)可以輕松跨過了。再加上他想要從事計算機和機械相結(jié)合的工作,那 C++ 無疑是更合適的,畢業(yè)后可以轉(zhuǎn)型做工業(yè)領(lǐng)域的 C++ 軟件開發(fā),很多工業(yè)軟件方面招C++的挺多的。
機械專業(yè)有C語言的功底,學(xué)習(xí) C++ 以及數(shù)據(jù)結(jié)構(gòu)與算法就不會有特別大的阻力。再加上有單片機的基礎(chǔ),深入搞一下 Linux 往嵌入式方向發(fā)展也是可以的。
或者可以轉(zhuǎn)機器人、自動駕駛,因為很多底層的控制算法庫是都是基于C/C++開發(fā)的,比如快速傅里葉變換算法、矩陣計算、特征值求解等等。機器人非常關(guān)鍵的一點是對性能非常苛刻,性能要求嚴(yán)格的地方,C/C++就是王者。
再或者可以直接轉(zhuǎn) Linux C++ 服務(wù)器端開發(fā)(也就是在 Linux 進行 C++編程),這條路也是非常吃香的。
四、C++ 學(xué)習(xí)資料推薦
學(xué)習(xí) C++ 語法,首推《C++ Primer 第五版》。我在參加第一份工作的時候,就買過一本《C++ Primer 第四版》,這本書一直不舍得扔,盡管它已經(jīng)非常破了,但我們之間的感情是深厚的,畢竟跟隨我輾轉(zhuǎn)了好幾個城市了。

這本書非常全面地講解了 C++ 的語法以及 C++ 的各種特性,如果能堅持看完的話,幫助會很大。如果時間比較充分的話,建議至少看兩遍。如果時間比較緊張的話,至少通讀一遍吧,要能把握住這本書的大體框架,然后結(jié)合個人的實際情況選擇性地看一些重點章節(jié)。
然后是《Effective C++》,侯捷老師譯的,這本書主要講解了編寫 C++ 代碼需要注意的一些條款,和《Effective Java》 屬于同一個系列。

第三本是《STL源碼剖析》這本書,侯捷老師寫的,這本書講了C++的底層實現(xiàn),包括各種容器(vector、list、heap、deque、Red Black tree、hash table、set/map)的實現(xiàn)、各種常見算法(排序、查找、排列組合、數(shù)據(jù)移動與復(fù)制技術(shù))的實現(xiàn)等。

第四本《深度探索C++對象模型》,侯捷老師譯的,這本書講解了 C++ 面向?qū)ο筇匦缘牡讓訉崿F(xiàn)機制,讀起來雖然有點晦澀,但讀完后就會搞明白“代碼跑起來的時候?qū)嶋H發(fā)生了什么”。

既然有三本書都是侯捷老師的,那再刷一刷侯捷老師的視頻,豈不是效果更佳?不過,由于涉及到版權(quán),國內(nèi)的 B 站、A 站都下架了相關(guān)的視頻資源,包括:
《C++面向?qū)ο蟾呒壘幊獭?/section> 《STL》 《C++ 內(nèi)存管理》 《C++ 11 新特性》 《C++ 程序的生前死后》
我從網(wǎng)上 down 了一份,保存到了本地。大家需要的話,可以在后臺回復(fù)「侯捷」關(guān)鍵字拉取下載鏈接。

五、計算機基礎(chǔ)
其實不管是學(xué)習(xí) Java,還是學(xué)習(xí) C++,還是任何一門其他的編程語言,有時間有精力的話都要學(xué)習(xí)計算機基礎(chǔ)。
1)數(shù)據(jù)結(jié)構(gòu)與算法
我畫了一張腦圖,里面幾乎涵蓋了所有數(shù)據(jù)結(jié)構(gòu)與算法書籍中都會講到的知識點。

書的話推薦小爭哥的《數(shù)據(jù)結(jié)構(gòu)與算法之美》,由淺入深的一本書,讀起來就像打游戲刷boss一樣,沒有其他算法書那種嚼蠟感。

視頻課的話推薦浙大的數(shù)據(jù)結(jié)構(gòu)課,講解簡明易懂,B 站和 mooc 上都可以觀看。
https://www.bilibili.com/video/av18586085/
學(xué)的差不多后就到 LeetCode 上刷題,刷題的過程中可以同步學(xué)習(xí) STL 源碼剖析,雙管齊下后的結(jié)果就是你在編寫 C++代碼的時候更加游刃有余。
刷題可以分為兩種方法,一種超級兔子系,一種超級烏龜系。兔系追求的是暴力,可以照著答案去刷,刷多了就自己慢慢領(lǐng)悟了;龜系講究的是質(zhì)量,追求最優(yōu)解,一道題可能要做多種解法。
2)操作系統(tǒng)
操作系統(tǒng)是管理計算機硬件和軟件資源的程序,是計算機的基石,也是校招面試中考察的核心知識點。當(dāng)學(xué)了 C++ 基礎(chǔ)語法后,再加上數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ),操作系統(tǒng)這塊硬骨頭就不那么難啃了。
推薦兩門視頻課,先看一門國內(nèi)的,再看一門國外的,中西合璧,藥效持久。
國內(nèi)的推薦哈工大的《操作系統(tǒng)》實驗課,分為四個部分:
01、操作系統(tǒng)基礎(chǔ)篇
https://mooc.study.163.com/course/1000002004
02、操作系統(tǒng)之進程與線程
https://mooc.study.163.com/course/1000002008
03、操作系統(tǒng)之內(nèi)存管理
https://mooc.study.163.com/course/1000003007
04、操作系統(tǒng)之外設(shè)與文件系統(tǒng)
https://mooc.study.163.com/course/1000002009

國外的推薦 MIT(麻省理工學(xué)院)的 6.S081(Introduction to Operating System,操作系統(tǒng)導(dǎo)論)這門課:
https://www.bilibili.com/video/BV19k4y1C7kA

可以配合這份 30 萬字左右的中文在線閱讀文檔一起刷,
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
我還整理了一份操作系統(tǒng)的核心知識點,大家需要的話,可以在后臺回復(fù)「操作系統(tǒng)」關(guān)鍵字拉取下載鏈接。

針對 Linux 的話,可以先看《鳥哥的 Linux 私房菜》,主要是了解基本的 Linux 命令,進一步學(xué)習(xí)的話,可以看《UNIX環(huán)境高級編程》,如果還想對 Linux 內(nèi)核原理進行深度學(xué)習(xí)的話,可以看一下《Linux內(nèi)核設(shè)計與實現(xiàn)》,這本書可以幫助你快速建立起比較完善的知識框架。

3)計算機網(wǎng)絡(luò)
計算機網(wǎng)絡(luò)和操作系統(tǒng)有一個共同點,就是它們有著相當(dāng)復(fù)雜的體系結(jié)構(gòu),很多初學(xué)者都會覺得比較難,那可能是沒有產(chǎn)生足夠的求知欲。
也許你可以這樣問自己一下:那些 P 站上的小電影,是怎么傳輸過來的呢?
這么一問,是不是瞬間就支棱起來了?
入門的話,推薦三本書,《圖解 HTTP》、《圖解 TCP/IP》、《網(wǎng)絡(luò)是怎樣連接的》。第三本書雖然名字上沒有帶圖解,但其實可以歸為一個系列。

如果想看視頻的話,推薦 B 站上的《計算機網(wǎng)絡(luò)微課堂》,有讀者在留言區(qū)這樣評價說:“吹爆,這種課才應(yīng)該是真正的國家精品課程”:
https://www.bilibili.com/video/BV1c4411d7jb

學(xué)習(xí)完前面這些,就基本上掌握了計算機網(wǎng)絡(luò)的理論知識,如果還想對網(wǎng)絡(luò)編程進行實戰(zhàn)的話,可以看一看《Unix 網(wǎng)絡(luò)編程》這本書。

4)數(shù)據(jù)庫
要想學(xué)好數(shù)據(jù),首先要學(xué)習(xí)一下 SQL,書的話推薦《SQL 必知必會》;視頻的話推薦一個老外的視頻課(中字版啦),內(nèi)容制作得非常棒,所以完全不用擔(dān)心聽不懂,這個視頻的整個畫面制作得非常舒適,觀感非常好。
https://www.bilibili.com/video/BV1UE41147KC

然后再學(xué)習(xí)一下市場占有率非常高的 MySQL,書的話推薦《高性能 MySQL》;視頻的話推薦尚硅谷的一個,一位女老師講的,質(zhì)量也非常不錯。
https://www.bilibili.com/video/BV12b411K7Zu

六、學(xué)習(xí)建議
1、自學(xué)才是硬道理。強大的自學(xué)能力是獨自解決問題的根本,程序員需要擁有強大的自學(xué)能力。
2、一個人可以走得很快,但一群人才能走的更遠(yuǎn)。最好加入一些有氛圍的技術(shù)交流群,結(jié)交一兩個有能力的同階段的人,切磋精進一下。
3、入門階段,coding 為主,視頻和看書為輔,不要搞反了。記住這個公式:只看+不練=假把戲。
4、如果你以后不想當(dāng)一個優(yōu)秀的工程師,不想在計算機這條道路上走得更遠(yuǎn),只想躺平當(dāng)個平平淡淡的碼農(nóng),那么我推薦一條路:跟著老師一步步走,跟著大學(xué)的教學(xué)方案,一步步走就行了。
5、學(xué)習(xí)的最好方法就是逐步擴大勝利戰(zhàn)果,先從最小的勝利開始,讓自己感受到學(xué)習(xí)的快樂,盡快地進入到一種正反饋的狀態(tài)當(dāng)中。
6、羅馬不是一天建成的,請保持耐心。

沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。
推薦閱讀:
