知识分享|没有人能真正精通 C++
发布时间:2023-09-13 15:31:30
任何说自己很懂 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++的了解足够多,所以我认为我并不足够了解这种语言。