知識(shí)分享|沒有人能真正精通 C++
發(fā)布時(shí)間:2023-09-13 15:31:30
任何說自己很懂 C++的人可能都是在夸大其詞。
我想你可能已經(jīng)注意到了,是的,今天的大多數(shù)程序員都在使用 Python、Rust、Go 或是其他新的編程語言。大部分人已經(jīng)不再需要掌握 C、C++等古老的編程語言了,甚至很多程序員已經(jīng)從手動(dòng)編碼開始向 AI 編碼轉(zhuǎn)型。
但即便如此,還是有很多人認(rèn)為自己足夠了解并熟練掌握 C++這門古老的編程語言,但他們之中絕大部分人其實(shí)都在夸大其詞。這個(gè)說法來自 Louis Brandy 此前發(fā)布的一篇博客——《永遠(yuǎn)不要相信自稱懂 C++的程序員》。
1、C++的“雙峰”特性
在博客中,Brandy 提到,自己在長期面試 C++程序員的過程中開始意識(shí)到 C++非常重要的一個(gè)特性,C++是一種“雙峰”語言。也就是說剛剛接觸 C++的開發(fā)者會(huì)覺得它很簡單,但隨著了解深入,他們的自信會(huì)被這種語言龐大的復(fù)雜性慢慢摧毀,直到他們犯下了足夠的錯(cuò)誤,就像下面這張圖所展示的一樣。
程序員,尤其是那些曾經(jīng)學(xué)習(xí)過 C 語言的程序員,通常能夠非??焖俚卣莆?C++并感覺對(duì)這門語言非常熟練。這些程序員會(huì)告訴你他們精通 C++,然而其實(shí)這并不是真實(shí)的。
隨著他們繼續(xù)學(xué)習(xí) C++,他們會(huì)經(jīng)歷這個(gè)沮喪的低谷,在這里他們會(huì)完全了解到這門語言的全部復(fù)雜性。但好消息是,程序員很容易意識(shí)到自己處于谷前和谷后的區(qū)別。只要你和他們提起 C++的復(fù)雜性,處于谷后位置的人會(huì)為你描述上百種他們寫 C++的挫敗經(jīng)歷。而處于谷前的人則會(huì)說,C++不過是有類的 C 而已。
2、沒人能真正精通 C++
當(dāng)然,很多程序員把這種說法當(dāng)做一個(gè)玩笑,但也有很多人在爭論這種理論的正確性。在 Reddit 上,程序員們分享了對(duì)該說法的觀點(diǎn),一位技術(shù)管理者提到,面試時(shí)他會(huì)讓程序員以 1—10 分為標(biāo)準(zhǔn)描述自己的 C++水平,如果答案高于 6,那就需要詳細(xì)談?wù)勱P(guān)于這門語言的細(xì)節(jié)了。
此外,這位面試官還提到,建議程序員在面試時(shí),盡量不要直接說自己對(duì)哪門語言的掌握程度很好,而是要與面試官交流你具體擅長處理哪類業(yè)務(wù)或哪類問題,否則當(dāng)你遇到一位技術(shù)狂熱者時(shí),你將很容易在面試過程中暴露自己的無知。
在當(dāng)前以 AI 為主導(dǎo)的世界中,C++這門古老的語言好像更多變成了幫助人們建立知識(shí)體系和賣書的工具,而不是實(shí)際被用于生產(chǎn)的語言。一些 Reddit 用戶分享了他們將精通 C++寫在簡歷上,但當(dāng)被問到智能指針和右值引用等問題時(shí)卻回答不出來的窘迫經(jīng)歷。
事實(shí)上,很多開發(fā)者在使用 C++進(jìn)行工作時(shí),其實(shí)并不了解它的細(xì)節(jié),使用 C++幾十年的人大多也不敢說非常熟悉這種語言。甚至連 C++之父 Bjarne Stroustrup 也曾表示自己并非 100%精通 C++,他提到:“C++存在一些錯(cuò)綜復(fù)雜的陷阱,大多數(shù)人甚至沒法寫出一個(gè)簡單的沒有漏洞或錯(cuò)誤的類。”
2、世界仍然需要 C++
當(dāng)前編程世界中的真相是,你可以選擇任何適合你得編程語言。如果有人反駁這個(gè)觀點(diǎn),那便會(huì)被貼上“語言霸凌”的標(biāo)簽,編程語言只是一個(gè)程序員需要學(xué)習(xí)和使用的工具。如果 Python 能夠幫助你很好的完成工作,為什么還要使用 C++呢?
目前很多開發(fā)者已經(jīng)認(rèn)為 C++是一種瀕臨死亡的語言,但事實(shí)上并不是這樣。如果開發(fā)人員需要從頭開始構(gòu)建一些東西,例如操作系統(tǒng)、游戲或其他基礎(chǔ)軟件,C++目前仍被認(rèn)為是實(shí)現(xiàn)這些目標(biāo)的首選語言,當(dāng)然在面對(duì)很多現(xiàn)代應(yīng)用開發(fā)時(shí)使用復(fù)雜性過高的 C++會(huì)變得很痛苦。
C++為了不限制程序員的想法,包含了太多的范式,包括面向?qū)ο螅`活應(yīng)用 virtual 繼承+shared_ptr)、模塊化(type rich programming 和 meta programming)、函數(shù)式編程(lambda,配合文件),以及面向過程編程。然而當(dāng)前世界上的大多數(shù)需求,只需要用到面向?qū)ο蠡蚝瘮?shù)式編程。
顯然,無論是對(duì)于 C++還是其他語言,幾乎沒有人能夠做到對(duì)它們百分百了解,尤其是當(dāng)語言復(fù)雜性和特性隨著版本更新而不斷變化的情況下。C++只是在這種情況下會(huì)變得更甚,并且由于這種經(jīng)典語言的名氣效應(yīng),人們會(huì)給 C++程序員設(shè)定更高的標(biāo)準(zhǔn)。
大多數(shù) C++程序員都存在著這樣一種心態(tài)——“如果我能遵守這些規(guī)則,避免炫技、避免犯錯(cuò),我就可以避免把槍口對(duì)準(zhǔn)自己的腳?!币粋€(gè)很明顯的道理是,當(dāng)你被問及是否了解 C++時(shí),最好的答案是:我對(duì) C++的了解足夠多,所以我認(rèn)為我并不足夠了解這種語言。