月入 5 萬(wàn)大牛分享:為什么每一名程序員都應(yīng)該學(xué)習(xí) C++?
本文最初發(fā)布于 Level Up Coding 博客。
掌握 C++ 可不容易,但一旦你掌握了,就會(huì)獲得豐厚的回報(bào)。

通常,程序員在他們的編程生涯中會(huì)使用多種編程語(yǔ)言。然而,我們也看到,有些程序員一直在使用同一種編程語(yǔ)言。例如,我們經(jīng)常遇到有幾十年經(jīng)驗(yàn)的 Java 專家和 C# 專家。但是,學(xué)習(xí)多種語(yǔ)言會(huì)使你在軟件開(kāi)發(fā)生涯中更加自信和嫻熟。例如,如果你掌握了 Go 語(yǔ)言,你就會(huì)了解幾個(gè)令人印象深刻的語(yǔ)言設(shè)計(jì)概念,提高自己的通用編程技能。
學(xué)習(xí) Python 也很好,因?yàn)槲覀兛梢杂?Python 知識(shí)來(lái)編寫(xiě)任何自動(dòng)化腳本,而且很有成效。學(xué)習(xí)一種新的編程語(yǔ)言無(wú)疑會(huì)給我們帶來(lái)獨(dú)特的經(jīng)驗(yàn)和新的技術(shù)專長(zhǎng)。與其他流行的編程語(yǔ)言相比,C++ 語(yǔ)言能帶給我們?cè)S多好處。與其他現(xiàn)代語(yǔ)言不同,學(xué)習(xí) C++ 確實(shí)不容易,很費(fèi)時(shí)間。因此,現(xiàn)在大多數(shù)程序員都跳過(guò)了 C++ 的學(xué)習(xí),并且更喜歡那些提供更抽象的開(kāi)發(fā)環(huán)境的現(xiàn)代語(yǔ)言。

我將解釋一下,為什么學(xué)習(xí) C++ 是所有努力成為編程專家的程序員的必修課。
C++ 激勵(lì)你學(xué)習(xí)計(jì)算機(jī)科學(xué)基礎(chǔ)知識(shí)
每一個(gè)技術(shù)上合理的軟件程序背后,都可以找出幾個(gè)核心的計(jì)算機(jī)科學(xué)理論。例如,Git 程序使用了圖論、散列和許多基本的計(jì)算機(jī)科學(xué)算法。例如,以下是 Git 代碼庫(kù)中的合并排序?qū)崿F(xiàn):

Git 中的合并排序?qū)崿F(xiàn),作者截圖
如今,每個(gè)商業(yè)實(shí)體通常都會(huì)向云計(jì)算生態(tài)系統(tǒng)發(fā)展,并努力實(shí)現(xiàn)業(yè)務(wù)流程的自動(dòng)化。因此,現(xiàn)在大多數(shù)程序員通過(guò)編程解決商業(yè)問(wèn)題,而不是與計(jì)算機(jī)科學(xué)相關(guān)的問(wèn)題。
但是,即使是從事面向商業(yè)的軟件開(kāi)發(fā)項(xiàng)目,他們也經(jīng)常要運(yùn)用計(jì)算機(jī)科學(xué)理論來(lái)編寫(xiě)更好的代碼,使軟件更有效率。因此,對(duì)每個(gè)程序員來(lái)說(shuō),計(jì)算機(jī)科學(xué)理論知識(shí)都是必不可少的。
毫無(wú)疑問(wèn),C++ 是一種高級(jí)語(yǔ)言,它提供了比 C 語(yǔ)言更高級(jí)、對(duì)人更友好的抽象。但是,C++ 鼓勵(lì)人們像 C 語(yǔ)言一樣使用指針和手動(dòng)管理內(nèi)存。另外,C++ 標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì)注重計(jì)算機(jī)科學(xué)概念、性能和靈活性,而不是僅僅注重開(kāi)發(fā)的便利性。因此,當(dāng)你學(xué)習(xí) C++ 時(shí),會(huì)無(wú)意中學(xué)習(xí)到計(jì)算機(jī)科學(xué)的基礎(chǔ)知識(shí)。

使用 C++ 構(gòu)建輕量級(jí)、高性能、簡(jiǎn)單的解決方案
大多數(shù)現(xiàn)代編程語(yǔ)言專注于用類似偽代碼的語(yǔ)法來(lái)隱藏底層技術(shù)細(xì)節(jié),而在性能、輕量化和靈活性方面考慮不多。但是,C++ 仍然可以生成輕量級(jí)的二進(jìn)制文件,是編寫(xiě)性能優(yōu)先的軟件系統(tǒng)的最佳選擇。
像 Golang 這樣符合現(xiàn)代潮流的編程語(yǔ)言,通過(guò)提供類似 C 語(yǔ)言的最小語(yǔ)法和自動(dòng)內(nèi)存管理(通過(guò)垃圾收集)與 C++ 競(jìng)爭(zhēng)。但是,Go 會(huì)生成很大的二進(jìn)制文件,所以它不適合于輕量級(jí)的場(chǎng)景。這就是為什么大多數(shù)程序員使用 Go 來(lái)構(gòu)建高性能的云工具,因?yàn)閷?duì)云環(huán)境來(lái)說(shuō),二進(jìn)制文件的大小并不是問(wèn)題。在高性能、輕量級(jí)的軟件開(kāi)發(fā)方面,程序員仍然喜歡用 C++ 而不是 Go。
Go 通常是靜態(tài)鏈接標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),當(dāng)我們導(dǎo)入 fmt 時(shí),它會(huì)將一個(gè) 1.2MB 的 Go 最小二進(jìn)制文件增加到 1.8MB。C++ 通常是動(dòng)態(tài)鏈接,當(dāng)我們包含 iostream 時(shí),它會(huì)將一個(gè) 16.5KB 的最小二進(jìn)制文件增加到 17.3KB。在 GNU/Linux 平臺(tái)上,Go 二進(jìn)制文件大小增加了 50%,而 C++ 二進(jìn)制文件大小增加了不到 5%。
上述簡(jiǎn)單的實(shí)驗(yàn)證明,C++ 更適合于高性能、輕量級(jí)的軟件開(kāi)發(fā)。C++ 是一種復(fù)雜的全加載語(yǔ)言,但通過(guò)選擇自己偏好的特性,你仍然可以編寫(xiě)出最小的代碼。
C++ 技巧能讓你更快地學(xué)習(xí)其他編程
語(yǔ)言程序員根據(jù)自己的喜好學(xué)習(xí)各種編程語(yǔ)言。有些程序員在開(kāi)始從事企業(yè)級(jí)軟件開(kāi)發(fā)項(xiàng)目時(shí)學(xué)習(xí)編程語(yǔ)言。同時(shí),有些程序員傾向于把學(xué)習(xí)編程語(yǔ)言作為一種業(yè)余愛(ài)好。有些語(yǔ)言很容易掌握,有些則需要不斷的試驗(yàn)來(lái)獲得進(jìn)一步的經(jīng)驗(yàn)。
由于復(fù)雜的語(yǔ)法(C++ 有 60 個(gè)關(guān)鍵詞)、多功能的標(biāo)準(zhǔn)庫(kù)、面向硬件的開(kāi)發(fā)環(huán)境以及鮮為人知的最佳實(shí)踐,C++ 需要更多的時(shí)間來(lái)獲得專業(yè)工作經(jīng)驗(yàn)。C++ 是一種多范式、多功能的編程語(yǔ)言。換句話說(shuō),你可以在用 C++ 編寫(xiě)代碼時(shí)制定自己的編程風(fēng)格和最佳實(shí)踐。
學(xué)習(xí) C++ 標(biāo)準(zhǔn)庫(kù)和開(kāi)發(fā)模式需要扎實(shí)的計(jì)算機(jī)科學(xué)知識(shí)和技術(shù)能力。因此,當(dāng)你精通 C++ 時(shí),學(xué)習(xí)一門(mén)新語(yǔ)言就是小菜一碟。

與操作系統(tǒng) API 交互的最佳語(yǔ)言
每個(gè)操作系統(tǒng)都為開(kāi)發(fā)者提供了一個(gè)可編程接口,用于處理操作系統(tǒng)級(jí)的操作,如進(jìn)程管理、文件處理、GUI 渲染和網(wǎng)絡(luò)請(qǐng)求處理(通過(guò)套接字)。所有這些 API 都暴露了基于 C/C++ 的接口,因?yàn)槊總€(gè)操作系統(tǒng)都是用 C/C++ 編寫(xiě)的。
GNU/Linux 系統(tǒng)以 C 語(yǔ)言頭文件的形式提供 Unix 風(fēng)格的 API 和 GTK GUI 庫(kù)。MacOS 也提供 Objective-C 接口,我們可以通過(guò) Apple Clang LLVM 編譯器來(lái)使用。因此,我們可以用 C++ 直接訪問(wèn)任何操作系統(tǒng)級(jí)的 API,因?yàn)?C++ 是 C 的超集,而且蘋(píng)果編譯器允許開(kāi)發(fā)者混合使用 C++ 和 Objective-C。例如,請(qǐng)看 Electron 如何在 C++ 源文件中使用 GTK C 頭文件:

Electron 中的文件選擇對(duì)話框源代碼,作者截圖
另一方面,其他所有的編程語(yǔ)言都需要特定語(yǔ)言的綁定來(lái)訪問(wèn)操作系統(tǒng)的 API。由于這個(gè)原因,幾乎所有的操作系統(tǒng)級(jí)框架都是用 C++ 編寫(xiě)的??纯聪旅孢@些基于 C++ 的框架:
Electron
React Native
Flutter
Neutralinojs
另外,像 Chromium、Firefox、Tensorflow、LLVM 和 V8 這樣的大型軟件項(xiàng)目也使用 C++ 作為主要的開(kāi)發(fā)語(yǔ)言。
C++ 知識(shí)有助于你做出更好的技術(shù)決策
程序員不僅按照規(guī)范編寫(xiě)代碼,他們還設(shè)計(jì)軟件系統(tǒng)及組織項(xiàng)目結(jié)構(gòu)。設(shè)計(jì)階段在軟件開(kāi)發(fā)中非常重要,因?yàn)樗鼮檎麄€(gè)軟件系統(tǒng)奠定了基礎(chǔ)。我們經(jīng)常要在設(shè)計(jì)階段和開(kāi)發(fā)階段做出技術(shù)決策。
C++ 是一種復(fù)雜的語(yǔ)言——你有許多方法來(lái)解決同一個(gè)編程問(wèn)題。另外,C++ 被設(shè)計(jì)成一門(mén)速度很快的語(yǔ)言,但讓程序員可以充分控制程序的執(zhí)行,按照自己的意愿優(yōu)化代碼。因此,你需要謹(jǐn)慎地作出技術(shù)決策,根據(jù)自己的偏好,為自己的需求選擇最佳的 C++ 特性。
C++ 是一種多范式語(yǔ)言,盡管大家都知道它是一種基于 OOP 的語(yǔ)言。一些程序員使用 C++ 編程時(shí)會(huì)采用傳統(tǒng)的 OOP 范式。同時(shí),有些程序員使用 C++ 編程時(shí)會(huì)采用過(guò)程以及函數(shù)編程范式。有時(shí),我們經(jīng)常不得不避免使用一些 C++ 特性,以便簡(jiǎn)化我們的源代碼。例如,谷歌的 C++ 風(fēng)格指南建議不要使用 C++ 異常。所有這些情況都能提高我們的技術(shù)決策能力。

小結(jié)
我們已經(jīng)討論了在編程生涯中學(xué)習(xí) C++ 的好處。目前有二十多種穩(wěn)定的、功能齊全的、流行的編程語(yǔ)言。沒(méi)有一種編程語(yǔ)言被稱為“最好的編程語(yǔ)言”——每一種編程語(yǔ)言都在特定領(lǐng)域有著良好的表現(xiàn)。因此,學(xué)習(xí)一種自己喜歡的、精心挑選的編程語(yǔ)言,并稱它們?yōu)椤拔易詈玫木幊陶Z(yǔ)言”,是一個(gè)明智的決定。
如果你仔細(xì)挑選五種編程語(yǔ)言,從各方面進(jìn)行考慮——毫無(wú)疑問(wèn),C/C++ 也會(huì)在你的名單上。
學(xué)習(xí) C++ 而不學(xué)習(xí) C,就像學(xué)習(xí) React.js 應(yīng)用開(kāi)發(fā)而不試驗(yàn)原生 JavaScript 和 DOM 一樣——所以,先學(xué)習(xí) C,然后進(jìn)一步學(xué)習(xí) C++,可以為你的編程生涯帶來(lái)上面所有的好處。
感謝您的閱讀。
查看英文原文:
https://levelup.gitconnected.com/why-every-programmer-should-learn-c-during-their-careers-959e1bc2ea68
寫(xiě)在最后:另外,對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書(shū)籍分享:

粉絲編程交流:
