撰稿丨千山
当前,程序员关于编程语言的选择很多,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