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