2022年,我们为什么要学习c++?(文末附完整c++后端学习路线)

linux大本营 linux大本营     2022-12-14     704

关键词:

“C++已死”

大学时代,我就听过这样的说法——差不多十多年前的事儿了。那时候至少在美国,Java已经成了各公司的主流语言。程序员也许都很熟悉Joel Spolsky在2005年12月对JavaSchools发起的批驳。此外,作为微软应对Java的手段,2000年左右推出的C#也有C++杀手的称号。这之后,动态语言风靡一时,Ruby和Python开始流行起来。那么,既然有了这些好用的语言,我们为什么还要选择C++语言呢?它难道不是C语言进阶版吗,就像当初的汇编语言进阶版一样?如果有时间,建议大家听一下Herb Sutter的演讲,讲得很好;时间有限的话也可以只看这个较短的视频演讲,其中包含有具体案例。从TIOBE语言排行榜中我们可以发现,在过去逾十多年的时间里,C++一直稳居最受欢迎语言列表的第三名。对一个老牌语言来说,这个成绩不算差了。这让我想到了另一个问题……

大家怎么看待指针?

大多立即将C++与指针关联起来的人都学错了。“带类的C语言”已经是老一套了。根据我个人经验,它糟糕透了。在C语言中,将多维数组作为函数参数传送、执行指针运算、以手动方式管理内存(就好像没有容器与智能指针一样)、实现双向链表等等,所有这些都是我们应当在C语言的课程上学过的。也许通过这种方式来学习C++并没有什么错?好吧,再想想。

当然,专业的程序员应当理解指针的工作方式,但它已经不是现代C++的主旨了。C++一直持续不断地发展,昨天正确的代码到了今天可能就成了糟糕的编程风格。

该语言正在经历大浪淘沙的过程,套用Bjarne Stroustrup博士的一句话,“C++就像一种新语言,各部分组合较之前更为顺畅。其更高层次的编程风格较之前更为自然,也一如既往的高效。”现在,C++有了Lambda表达式、内存模型(Memory Model)、Range-based for loops、移动语义(Move Semantics)、可变参数模板(Variadic Template)以及所有其他类似的高级功能,这些都能协助我们完成手上的工作。你是否也有一些旧代码需要按新标准来更新呢?不要担心,Clang-tidy就是你的救星!这个工具非常酷,可以通过静态分析找出老式风格代码,并给出修改建议。在使用C++时,工具的缺乏一直很令人头疼,不过这种情况正在改变。你以为只有Java才有自动重构功能?谷歌的Chandler Carruth在演讲中提到了使用Ninja编译LLVM/clang的问题,现在它们都能运用自动重构,立即生成1亿行的C++代码了。

C++称霸的领域:游戏、HPC、编译器、金融财务领域等等

如果不想把时间全用在增删改查之类的实现上,也许你可以考虑学习C++语言,并选择一个领域。下面我会给出一些建议。

游戏行业:几乎所有3A游戏都是使用C++编写的。大众公认电子游戏的开发者是软件行业里回报最高的工作之一,也是需求量最大的领域之一。因为速度非常重要,所以编写高效的代码就是最基本的要求。除了要懂C++之外,精通游戏开发更应注重理论与模式的钻研,而不限于特定的API或者Library。通常还必须具备高超的图形与数学技能,这些知识足够你活到老学到老。

HPC:以极限速度处理数据,要求对底层硬件有深刻的理解,这类知识可以直接应用在语言中。通用图形处理器(GPGPU)及CUDA、OpenCL之类的并行计算框架的出现,引发了对有这类技术的C++程序员的需求。如果深入到科学计算领域,还有很多能做的工作。不知你是否听说过机器学习?这是当今的热门话题。

编译器:这是我最喜欢的领域,LLVM项目如此成功,以致于很难找到一种既未使用LLVM库编写前端,也没有使用LLVM生成字节码的流行语言,而这些全都是C++。尽管编译器是以各种语言编写而成,但其背后的实现原理是相同的。我们使用优化器、静态分析程序、调试程序、标准库、链接器以及所有其他相关的工具来工作。

金融领域:除此之外,金融领域也有很多工作需要有能力编写低延迟代码的程序员。在这个领域,数学背景也是一大加分亮点。该领域的大多工作可能都涉及到开发与维护高频使用的交易平台。另外如果不想挂着程序员的名头,这个领域也是很棒的选择。可以说负责设计并实现金融数学模型的宽客(Quant)职位是所有程序员中最有可能获得高额奖励的。

以上只是我的几个建议,这些领域的共通点在于:无法通过数量取胜——让一大堆Java新手去解决问题,还指望他们得出有效、可维护的解决方案是不可能的。这里面需要很多行业内部的知识门道,只有跟这方面的前辈共过事后才能了解到,也就是说,这些人的可替换性很低。公司必须付给他们更高的薪水,并让他们解决自己感兴趣的问题,才能把人留住。当然,到处都有简单而枯燥的工作,但如果从事的是自己真心喜爱的工作,我们一般也会更有耐性。

第二点

C++和C语言的血缘关系

C++ 和C语言虽然是两门独立的语言,但是它们却有着扯也扯不清的关系。

早期并没有“C++”这个名字,而是叫做“带类的C”。

“带类的C”是作为C语言的一个扩展和补充出现的,它增加了很多新的语法,目的是为了提高开发效率。

 这个时期的C++ 非常粗糙,仅支持简单的面向对象编程,也没有自己的编译器,而是通过一个预处理程序(名字叫cfront),先将C++ 代码“翻译”为C语言代码,再通过C语言编译器合成最终的程序。

随着C++ 的流行,它的语法也越来越强大,已经能够很完善的支持面向过程编程、面向对象编程(OOP)和泛型编程,几乎成了一门独立的语言,拥有了自己的编译方式。

 作为能够处理底层事务的编程语言,C++似乎总是在学习难度上吊打其他语言,毕竟一个十几年经验的C++程序员,也不敢说自己精通C++。

所以C++从本质上来说,就是一门学习难度很高的编程语言,更别说,对于我们初学编程的小伙伴了。

 于是,大多数小伙伴在学习了一段时间的C++之后,几乎都会有相同的感受,大概就是

“我天天学 C++,学了一年,只会搞个小黑框,连个贪吃蛇都做不出来,到底学来有什么用?”

“C++之父”BjarneStroustrup 在创造C++之初,是想要一种能够兼顾在表达高级概念的同时也在底层与硬件沟通需求的语言。

他说,“C++ 是一种灵活的语言,它既能处理底层事务,也能处理高层事务。但它并非完美,随着语言成熟度、兼容性以及稳定性而来的,是语言的复杂性——我们无法摒弃某些陈旧的部分。”

而C++之所以能够几十年长盛不衰,且作为一直排名比较靠前的编程语言,它真正的优势在于:

一方面,它面向对象,允许直接访问计算机,最大程度地提升效率;

另一方面,它也能让你使用可承受的高效方法,(非人工介入地)来掌控系统的复杂度。

 而作为一种成熟的语言,C++基本上已经覆盖了大家能够想到的一切行业及应用领域——包括金融、农业、航空航天、半导体、设备驱动等等。

目前世界上所有流行的操作系统都是用C/C++实现,比如Window系统,苹果系统等;

目前几乎所有互联网公司服务器的解决方案均选择C/C++实现,如最主流的Nginx服务器,Apache服务器;

 还有我们比较熟悉的几个领域

一、 游戏

C++是游戏引擎和开发的首选,从维基百科列举的游戏引擎列表中,有61%的制定游戏引擎都是用C++实现的,包括《孤岛惊魂》《反恐精英》《天际》等。

二、 网站

C++是多数网站后端系统的语言首选,排名前五的网站Google、Facebook、YouTube、Yahoo、Amazon中,4个网站都使用了C++。

三、 人工智能

在人工智能领域(语言合成,图像识别等)实际工程化,需要达到几万的并发,这种情况下需要耗用大量的GPU资源,成本非常高。用C++提高计算效率,C++在工程上用处很大。

C++的优势在哪里

1、不管你走什么样的技术路线,不管你用不用它做开发,学习C++总会带来长远的好处。一名熟悉C++的开发人员,假如他不是一个偏执狂的话,再学习Java或C#,都要容易得多。

2、竞争力小,现在很多大学都主流教java,因为java相对C++简单,而且应用范围也蛮广的,但很多人觉得C++很难所以就放弃了,也就造就了C++竞争力小,而且真正的高级C++程序员很抢手的,可以说是,有钱都不一定招得到。

3、工资高,C++程序员工资普遍比其他语言高,当然是在同等技术情况下,不可能一个C++普通程序员和一个java的老鸟比。 

如果普通java程序员和普通c++程序员相比的话,基本上都是C++程序员工资高一些,而且C++的上限比java高太多了。

 最后,给大家分享一个C++后端的完整学习路线图(摘自零声教育课程学习路线)

部分试听视频

《tcp/ip详解卷一》: 150行代码拉开协议栈实现的篇章

linux多线程之epoll原理剖析与reactor原理及应用

内存泄漏的3个解决方案与原理实现,知道一个可以轻松应用开发工作

C/C++开发哪个方向更有前景,游戏,c++后端,网络处理,音视频开发,嵌入式开发,桌面开发

图片显示不清晰的可以点击下面链接查看网页详情版

c/c++ linux服务器开发/后台架构师完整学习路线网页详情版

 

2022年了,云游戏离我们还有多远?文末附彩蛋

...游戏,并且完全不需要担心硬件的配置与性能问题。我们常用的Windows远程桌面 查看详情

2022年了,云游戏离我们还有多远?文末附彩蛋

...游戏,并且完全不需要担心硬件的配置与性能问题。我们常用的Windows远程桌面 查看详情

2020年,阿里内推java后端面试题,文末附面试福利。

...何判断链表有环虚拟机类加载机制,双亲委派模型,以及为什么要实现双亲委派模型虚拟机调优参数拆箱装箱的原理JVM垃圾回收算法CMSG1hashset和hashmap的区别,haspmap的底层实现put操作,扩容机制,currenthashmap如何解决线程安全,1.7... 查看详情

如何学好c++和后端开发(文末赠8本书)

...所周知C++难学难精,Java难道不香吗?我们为什么还要学习C++折磨自己?上面的代码就是C++,不论真伪,C++确实不易维护,能看懂别人写的C+& 查看详情

cissp一次通过指南(文末附福利)

2017年12月19日,在上海黄浦区汉口路亚洲大厦17层通过了CISSP认证考试,拖拉了一年,终于成绩还算令人满意,为攒人品将自己一年多的复习心得和大家分享,希望能够帮到需要考证的朋友。本文作者:i春秋签约作家——tinyfisher... 查看详情

mac系统下如何学习c++

...xp就是为了学习c++如果mac可以c++就不要xp了谁能帮我解决:我们在学习C++的时候,有很多人不知怎样学习它、怎样学好它,也不知应先从那里开始学起,关于C++的入门其实很简单,你只要一步步按照你手中的那本C++教材来学就可以... 查看详情

stm32自平衡机器人项目,文末附代码电路图等资料(结尾有学习资料与学习群)(代码片段)

将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。机器人原理分析首先来看成品图:如图所示ÿ... 查看详情

源码分析kafka消息发送流程(文末附流程图)(代码片段)

...时也可以指定一个Callable接口用来执行消息发送的回调。我们在学习消息发送流程之前先来看一下用于封装一条消息的ProducerRecord的类图,先来认识一下kafka是如何对一条消息进行抽象的。1、ProducerRecord类图我们首先来看一下Produc... 查看详情

最受欢迎的10本编程书籍(文末附地址)(代码片段)

一般来说,学习的过程发生并终结在购买这一步,而后再未捡起。推特上一位名为PierredeWulf的网友突发奇想,有史以来最受欢迎的编程书籍到底是哪些?为了找到程序员们最为推崇的那些编程书籍,他使用Python编写了脚本,拉取... 查看详情

源码分析alibabasentinel滑动窗口实现原理(文末附原理图)(代码片段)

...3.3newEmptyBucket3.4resetWindowTo3.5addWaiting1、滑动窗口核心类图我们先对上述核心类做一个简单的介绍,重点关注核心类的作用与核心属性(重点需要探究其核心数据结构)。Metric指标收集核心接口,主要定义一个滑动窗口中成功的数... 查看详情

c++:在“替代”中迎来“转机”的2022年!(代码片段)

【CSDN编者按】告别各种不确定的2022,我们迎来了崭新的2023年,岁末年初,大家都有写总结的习惯,回顾与展望。作为知名的C++开发人员,BartlomiejFilipek在自己的博客上对C++2022进行了非常全面的总... 查看详情

45天,入门c++

为什么要限定45天?一个假期也差不多45天,对于学生党或许是一个弯道超车的好机会,不是学生党想转行学习C++看完这篇也能让你找到学习方向。关注我比较早的读者应该知道,我的工作是C++后台开... 查看详情

80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)(代码片段)

...不错。不过,考虑到大家不一定都习惯wps,这里我们简单写个小工具满足大家。文末附工具及源码下载方式合并与拆分效果如下:合并——拆分接下来,我们试试自己动手写这个工具吧!1.前期准备由于我们采... 查看详情

80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)(代码片段)

...不错。不过,考虑到大家不一定都习惯wps,这里我们简单写个小工具满足大家。文末附工具及源码下载方式合并与拆分效果如下:合并——拆分接下来,我们试试自己动手写这个工具吧!1.前期准备由于我们采... 查看详情

c++这么难,为什么我们还要学习c++?

文章目录前言1.为什么难学2.C++的意义3.什么时候该用C++4.如何学习C++5.学前勉言前言C++可算是一种声名在外的编程语言了。这个名声有好有坏,从好的方面讲,C++性能非常好,哪个编程语... 查看详情

c#winform实现登录界面验证码功能(文末附源码)

参考技术A闲来无事,最近自己发现自己的验证码功能还没有写过。于是就写下了这篇文章。界面就比较丑了,一个picturebox,一个textbox,一个button按钮主要想的是先把功能实现了,万一以后业务上需要使用呢。实现以后的功能图... 查看详情

c++这么难,为什么我们还要学习c++?

...本保留向后兼容性的同时,提供着改进和新功能。1.为什么难学每次提到C++编程,无论你是使用C++的开发者,还是使用其他编程语言和开发环境的开发者,我们对C++的评价往往都是“复杂且难学... 查看详情

为啥 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++?

...?【英文标题】:Whycan\'twestillusectypestocallC++fromPythonin2019?为什么2019年我们仍然不能使用ctypes从Python调用C++?【发布时间】:2019-10-2921:31:49【问题描述】:它仍然困扰着我。毕竟,C也没有完全标准化的ABI,但它适用于ctypes。为什... 查看详情