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