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