當(dāng)前,程序員關(guān)于編程語(yǔ)言的選擇很多,Java、Python、C、Rust……直白地說(shuō),你不需要學(xué)習(xí)C++,也完全可以成為一名程序員。
但C++能經(jīng)歷四十余載光陰依然“生龍活虎”,那必然有其道理,所以依然有無(wú)數(shù)或聰明或勤勉或不信邪的有識(shí)之士前仆后繼,選擇挑戰(zhàn)C++。
眾所周知,C++很難。所以有人會(huì)語(yǔ)重心長(zhǎng)告誡后來(lái)者:珍惜生命,遠(yuǎn)離C++。也有人十年勤學(xué)歸來(lái),仍只是低調(diào)地提及“我有一定的C++基礎(chǔ)”。所以絕大部分時(shí)候,自稱自己“懂C++”的人很大概率只是個(gè)“懂王”。
圖源:quickmeme
1、沒(méi)有人可以完全懂C++,C++之父也不能
早在2010年,Joomla開發(fā)組成員Louis Brandy就在其個(gè)人博客發(fā)表過(guò)一篇文章——《永遠(yuǎn)不要相信自稱懂C++的程序員》。沒(méi)想到相關(guān)話題最近在Reddit上又火了。
當(dāng)時(shí),Brandy解釋說(shuō),從C轉(zhuǎn)到C++的程序員會(huì)認(rèn)為他們了解這門語(yǔ)言,因?yàn)樗麄兛梢院芸焓炀毷褂盟!八麄冊(cè)谡f(shuō)謊。當(dāng)一個(gè)程序員繼續(xù)使用C++時(shí),他們會(huì)經(jīng)歷挫折的低谷,在那里他們才會(huì)接受語(yǔ)言的全部復(fù)雜性。”
圖源:Louis Brandy’s blog
在Brandy的示意圖中,可以看到隨著學(xué)習(xí)的深入,越來(lái)越多的問(wèn)題開始涌現(xiàn)在學(xué)習(xí)者面前:令人困惑的模版錯(cuò)誤消息,有點(diǎn)過(guò)于“神奇”的引用類型,不知道怎么用的虛擬析構(gòu)函數(shù),糟糕的異常說(shuō)明符,靜態(tài)對(duì)象初始化問(wèn)題……
他提到,在面試中很容易分辨出C++程序員的學(xué)習(xí)階段。“只要提到C++是一種極其龐大和復(fù)雜的語(yǔ)言,經(jīng)歷低谷后的人可以給你列舉出他們?cè)阢@研這門語(yǔ)言時(shí)經(jīng)歷的127種形形色色的小挫折。”相對(duì)地,還未走過(guò)“絕望峽谷”的人往往持有一種迷之自信,他們通常會(huì)回答:“是的,我想是的。我的意思是,它就像帶有類的C。”
事到如今,C++變得更加像個(gè)包羅萬(wàn)象的龐然大物。對(duì)于Brandy的說(shuō)法,在Reddit論壇上引起了更多的討論。
有人認(rèn)為,Brandy的說(shuō)法有失偏頗。因?yàn)镃++太過(guò)巨大,除了興趣使然或者要賣課賣書的,沒(méi)有人會(huì)學(xué)習(xí)C++的全部知識(shí)。現(xiàn)實(shí)中更多的情況是——根據(jù)自身的需求學(xué)習(xí)某個(gè)知識(shí)子集。
雖然同屬C++領(lǐng)域,但因?yàn)槊總€(gè)人都有不同的知識(shí)子集,所以面試中常會(huì)遇到這種情況:面試官詢問(wèn)求職者他們的C++技能水平,比如按1-10分計(jì)算,自評(píng)分為多少。一般情況下,如果答案高于6,那么就到了談?wù)摷?xì)節(jié)的時(shí)候。只有談?wù)摷?xì)節(jié),才能真正理解每個(gè)人到底掌握的是哪一部分。
圖源:Reddit
這一觀點(diǎn)得到了很多網(wǎng)友的認(rèn)同。不少擁有C++多年開發(fā)經(jīng)驗(yàn)的程序員現(xiàn)身說(shuō)法,“了解使用C++并不意味著要了解語(yǔ)言的每一個(gè)細(xì)節(jié)”。
有人坦言:“自2004年以來(lái),我在工作中使用C++作為我的主要語(yǔ)言。但仍然不能說(shuō)我100%知道它。(因?yàn)檫@其中)隱藏著許多錯(cuò)綜復(fù)雜的陷阱。”
更有人勸誡:“沒(méi)有人真正‘懂’C++,如果你想知道程序員的話是否有價(jià)值,問(wèn)他們是否懂C++,如果他們有信心說(shuō)‘是’,那就對(duì)他們所說(shuō)的其他一切持保留態(tài)度。除非你和Bjarne Stroustrup交談。”
不過(guò)很快就有人回復(fù):即使是C++之父,也承認(rèn)過(guò)對(duì)C++并非全知全能。根據(jù)江湖傳說(shuō),Bjarne Stroustrup對(duì)自己C++水平的評(píng)分為7/10。他曾提到,世界上可能只有4個(gè)人完全理解它,但他不是其中之一。
綜合來(lái)看,討論清楚地指出了C++程序員的高標(biāo)準(zhǔn),幾乎沒(méi)有人會(huì)質(zhì)疑C++程序員對(duì)于其他語(yǔ)言的學(xué)習(xí)能力。
2、越過(guò)Java爬至榜三,下一版本節(jié)點(diǎn)已定
1979年誕生的C++固然強(qiáng)大,但畢竟也“年過(guò)不惑”,因此唱衰的聲音一直未絕。我們不時(shí)可以看到“C++已經(jīng)過(guò)時(shí)了”,“C++還能活多久”,以及“C++是否會(huì)被XX語(yǔ)言所取代”等言論。
大佬如Linus Torvalds也曾批評(píng)過(guò)“C++標(biāo)準(zhǔn)太復(fù)雜導(dǎo)致不合格使用者太多,容易誤用和濫用語(yǔ)言特性”,他建議,在系統(tǒng)編程里直接用C就可以,非系統(tǒng)編程里,應(yīng)該選擇一種有垃圾收集的語(yǔ)言,C++語(yǔ)言的特性基本無(wú)用,只會(huì)搗亂。
近年來(lái)大公司如微軟,也在出于內(nèi)存安全性的考慮力挺Rust。去年微軟Azure CTO Mark Russinovich 在推特公開呼吁停止使用C和C++創(chuàng)建新項(xiàng)目。今年5月,微軟透露正基于Rust改寫Windows 11內(nèi)核,部分替代之前的C++,看起來(lái)進(jìn)展良好。
那么C++是真的不行了嗎?并非如此。在TIOBE官網(wǎng)最新公布的7月編程語(yǔ)言排行榜中,C++超越Java位列第三,而且與排名第二的C差距僅為0.76%。
圖源:TIOBE
可見,C++的發(fā)展之勢(shì)依然非常穩(wěn)健,甚至?xí)r不時(shí)會(huì)有略有回升。這種情況下如果還有人覺(jué)得這是一門垂死的語(yǔ)言,不免有點(diǎn)“豬鼻子里插蔥——裝象”的嫌疑。
那么這么多年來(lái),是什么讓C++保持這種長(zhǎng)盛不衰的勢(shì)頭呢?“從小處著手,闡明基本原則,明確長(zhǎng)期目標(biāo),并根據(jù)現(xiàn)實(shí)世界中實(shí)際使用的反饋進(jìn)行開發(fā)。”C++之父如是說(shuō)。
Stroustrup曾表示:“從一開始我就知道,不可能構(gòu)建理想的語(yǔ)言,因此我必須以漸進(jìn)式發(fā)展為目標(biāo):改進(jìn)。說(shuō)真的,我并不相信完美語(yǔ)言的想法:要怎樣就算是完美呢?對(duì)誰(shuí)來(lái)說(shuō)(是完美的)?”為了應(yīng)對(duì)不斷變化的挑戰(zhàn),與時(shí)俱進(jìn)是必須的。
回顧一下歷代版本(C++按發(fā)布年份命名,遵循3年一個(gè)版本周期),可以發(fā)現(xiàn)其中幾個(gè)重要節(jié)點(diǎn)。
C++11:這個(gè)版本可以說(shuō)是C++發(fā)展史中的里程碑。C++11有許多功能從根本上改變了大家對(duì)C++的傳統(tǒng)印象,甚至有人說(shuō)此后的C++都不像C++了。比如,C++11帶來(lái)了TR1的組件,還有移動(dòng)語(yǔ)義,完美轉(zhuǎn)發(fā),可變參數(shù)模板,但這還不是全部。C++11甚至還提供了一個(gè)內(nèi)存模型作為基本的線程基礎(chǔ)和一個(gè)線程API。
C++20:這同樣是個(gè)大版本,帶來(lái)了比C++11更為龐大的更新。以Big Four——概念(Concept)、范圍庫(kù)(Ranges Library)、協(xié)程(Coroutines)、模塊(Module)為代表的新特性帶來(lái)了諸多驚喜。
概念讓你能為模板編寫要求,革新了我們思考和編寫通用代碼的方式;新的范圍庫(kù)使其能夠直接在容器上表達(dá)算法,使用管道符號(hào)組合算法并將其應(yīng)用于無(wú)限數(shù)據(jù)流;協(xié)程能夠以同步語(yǔ)法寫異步代碼的特性,使其成為編寫異步代碼的好工具;模塊將克服頭文件的限制,同時(shí)承諾實(shí)現(xiàn)更快的編譯時(shí)間,以及宏的隔離。
也正是因?yàn)镃++20的大動(dòng)作,導(dǎo)致C++23注定要給C++20修Bug,加上疫情也導(dǎo)致C++23的諸多討論只能在線上進(jìn)行,影響了效率,因而C++23最終缺少T0級(jí)特性,是一個(gè)中等偏小的發(fā)行版。值得注意的是,不久前ISO C++標(biāo)準(zhǔn)委員會(huì)舉行了線上會(huì)議,正式敲定了C++26的時(shí)間表(詳情可見《下個(gè)版本已定!C++自救新動(dòng)作!》),預(yù)計(jì)這將是一個(gè)中等/中等偏大的版本。
綜上所述,你可以說(shuō)C++變得比以前“臃腫”了,也可以說(shuō)它不如鼎盛時(shí)期有活力了,畢竟如今的語(yǔ)言選擇太多了,但是如果說(shuō)它快要滅絕了,顯然是不客觀的。
3、學(xué)還是不學(xué),這是一個(gè)問(wèn)題
在本文一開始,我們就提到C++門檻極高,要想精通更加不易。不過(guò)最新趨勢(shì)又顯示,C++寶刀未老,尚有極大用武之地,那么到底學(xué)還是不學(xué),要不要選C++作為技術(shù)棧,似乎就是個(gè)問(wèn)題。
1)可以不學(xué)
首先,需要明確的是,當(dāng)前編程世界百花齊放,你可以選擇任何適合你的語(yǔ)言。畢竟,編程語(yǔ)言只是程序員在需要時(shí)學(xué)習(xí)的工具。如果Python更適合你,為什么一定要選C++呢?
2)要學(xué)的話,明確適用領(lǐng)域
脫離適用領(lǐng)域討論語(yǔ)言從來(lái)都是空談。如何選擇語(yǔ)言往往取決于你在做什么。“C++從未像Java或JavaScript那樣流行,但其實(shí)也不應(yīng)該將它們放在一起比較,因?yàn)楦饔袑9ァ++不適合快速編寫性能平平的程序。它是為具有運(yùn)行時(shí)要求和獨(dú)立性的持久系統(tǒng)而設(shè)計(jì)的。”這是某位開發(fā)者在Quora的C++話題下的觀點(diǎn),可謂一針見血。在需要極高的性能和控制性的應(yīng)用場(chǎng)景里,比如操作系統(tǒng)、游戲引擎、嵌入式程序等等,C++絕對(duì)當(dāng)仁不讓。
3)對(duì)難度做好預(yù)期
C++是公認(rèn)的較難學(xué)習(xí)的編程語(yǔ)言,有人戲稱,“在C++中你找不到任何一件簡(jiǎn)單的事”。所謂的“X天速成”“X課包會(huì)”顯然不適用于此。
圖片
圖源:Reddit
在線學(xué)習(xí)平臺(tái)Springboard曾比較過(guò)“最難學(xué)習(xí)的5種編程語(yǔ)言”,C++力壓Prolog、Haskell,成為Top1。主要理由是:
- 它具有復(fù)雜的語(yǔ)法以支持多功能性
- 它是一種寬容的語(yǔ)言——你可以做任何技術(shù)上可能的事情,即使邏輯上不正確
- 最好由已經(jīng)有 C 編程基礎(chǔ)的人來(lái)學(xué)習(xí)
4、學(xué)好C++有哪些額外回報(bào)
開發(fā)框架Neutralinojs的作者Shalitha Suranga曾在博客中表示,“學(xué)習(xí)C++是所有努力成為編程專家的程序員的必修課”。為此,他列舉了學(xué)習(xí)C++的若干豐厚回報(bào)。
激勵(lì)你學(xué)習(xí)計(jì)算機(jī)科學(xué)基礎(chǔ)知識(shí)。C++提供了比C語(yǔ)言更高級(jí)、對(duì)人更友好的抽象。但是,C++鼓勵(lì)人們像C語(yǔ)言一樣使用指針和手動(dòng)管理內(nèi)存。另外,C++標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì)注重計(jì)算機(jī)科學(xué)概念、性能和靈活性,而不是僅僅注重開發(fā)的便利性。
構(gòu)建輕量級(jí)、高性能的解決方案。大多數(shù)現(xiàn)代編程語(yǔ)言專注于用類似偽代碼的語(yǔ)法來(lái)隱藏底層技術(shù)細(xì)節(jié),而在性能、輕量化和靈活性方面考慮不多。但是,C++仍然可以生成輕量級(jí)的二進(jìn)制文件,是編寫性能優(yōu)先的軟件系統(tǒng)的最佳選擇。
讓你更快地學(xué)習(xí)其他編程。C++是一種多范式、多功能的編程語(yǔ)言。換句話說(shuō),你可以在用C++編寫代碼時(shí)制定自己的編程風(fēng)格和最佳實(shí)踐。學(xué)習(xí)C++標(biāo)準(zhǔn)庫(kù)和開發(fā)模式需要扎實(shí)的計(jì)算機(jī)科學(xué)知識(shí)和技術(shù)能力。因此,當(dāng)你精通C++時(shí),學(xué)習(xí)一門新語(yǔ)言往往輕松許多。
與操作系統(tǒng)API交互的最佳語(yǔ)言。每個(gè)操作系統(tǒng)都為開發(fā)者提供了一個(gè)可編程接口,用于處理操作系統(tǒng)級(jí)的操作。所有這些API都暴露了基于C/C++的接口,因?yàn)槊總€(gè)操作系統(tǒng)都是用C/C++編寫的。
有助于做出更好的技術(shù)決策。解決編程問(wèn)題的方案往往不止一種。C++很復(fù)雜、速度快,但讓程序員可以充分控制程序的執(zhí)行,按照自己的意愿優(yōu)化代碼。因此,你需要謹(jǐn)慎地作出技術(shù)決策,根據(jù)自己的偏好,為自己的需求選擇最佳的C++特性。
參考鏈接
https://www.tiobe.com/tiobe-index/
https://analyticsindiamag.com/dont-trust-a-programmer-who-knows-c/
http://modernescpp.com/index.php/c-23-the-next-c-standard
https://www.springboard.com/blog/software-engineering/top-programming-languages/
https://levelup.gitconnected.com/why-every-programmer-should-learn-c-during-their-careers-959e1bc2ea68