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