为何在2023年仍然选择学习C++?

发表时间: 2023-07-27 14:25

我是柠檬哥,专注编程知识分享。

欢迎关注@程序员柠檬橙编程路上不迷路,私信发送以下关键字获取编程资源:


发送 1024 打包下载10个G编程资源学习资料

发送 888 获取铁杆粉丝红包见面礼

发送 001 获取阿里大神LeetCode 刷题笔记

发送 002 获取获取谷歌公司编程代码规范

发送 003 获取10个精美简历模板PDF和Word版

发送 004 获取100道精选 C++ 面试题和答案word版

发送 005 获取获取谷歌LeetCode算法笔记


大家好,我是 柠檬哥。

在知乎看到这个话题的讨论,有一些精彩观点分享给大家。

我敢说现在无论哪家大公司都会用到C++,而且会一直用到C++的。

百度自动驾驶系统、华为服务器、腾讯网易的游戏…我敢肯定都用到C++了。

任何一家公司,但凡追求效率的软件和系统,都会采用C++开发,C++的一些优越性是其他语言无法比拟的。

只要操作系统还是用C来写,C就永远不会被淘汰,这个问题想都不要想。国内的C岗位主要是做内核相关的开发,以及一些嵌入式的需求,当然嵌入式的也有用C++的。

C++不会被淘汰的原因之一是C不会被淘汰,因为C++抱紧了C的大腿,C++最基础的定位就是better C。也有一些领域是C++专属的,比如说游戏引擎、高频交易。

业界很多声音 : C++ 过于复杂?

“过于复杂”指的是加入了冗余的部分,使得本该简单事情变复杂了。

然而啊。。。C++的复杂并不是如你所想。

C++的核心设计哲学是Zero Overhead。啥意思?说人话就是:你没有用到的特性,不应该给你带来任何负担。这个哲学的好处在哪里?当你没有学到/用到一个知识点的时候,你不需要为它付出代价。

当你不明白左值右值的时候,单纯地传值就可以玩的很Happy,而当你想要榨取性能,避免拷贝复制的时候,你才需要和复杂的左右值,std::move, 标准swap&和对象内建swap等听起来就有点晕的概念搏斗一下。

当你不需要自己设计内存分配机制,就完全不需要理会allocator 这个听起来就不是很简单的东西,放心地使用STL内置的default部分。但是你在嵌入式环境下或者近实时操作系统里想要确保内存分配的速度和效率,就可以看看怎么重载- -下 operator new之类的方法。

当你不需要使用模板工作时,大可以把C++当成一个带 类的C玩得飞起。不需要为各种偏特化,类型萃取,integral, std::tuple等 高阶咒语头疼不已。但是你需要构建一套 需要非常灵活拓展的framework,又不想受限于复杂的继承体制时,variadic template和concept就是你最好的朋友。

在你不熟悉FP的时候,完全可以不去考虑 lambda 表达式,不去考虑std::function,不去写那些高阶函数。但是当你觉得想把Lisp和Haskel中有些概念比如闭包、monad等搬到C++时,你会觉得其实这些东西蛮顺手的。

这多么人性化! C++为不同的能力阶段的人提供了不同层次的工具,而且它们几乎完全正交!但是就是有些人要跳出来“太复杂啦!我们需要简单的语言!”

爱因斯坦说过一-句话“科学要简单,但不是过于简单。”简单的是概念和概念的层次,却不是概念的数量和概念本身的复杂程度。狭义相对论可以把麦克斯维方程组用一个简单的张量公式表示,却不能避免张量概念本身的复杂性。

经典力学是不是太复杂啦?我们需要简单的!有啊,牛顿力学。只要你不涉及到速度、质量足够大的场景,就不需要相对论;

流体力学是不是太复杂啦? 我们需要简单的!有啊,简单流体力学。只要你不涉及湍流,就不要考虑数值求解内维尔-斯托克斯方程。

量子力学是不是太复杂啦? 我们需要简单的!有啊,普通量子力学。只要你不涉及复杂多体交换关联势,你就不需要学习高量和重正化群。

C++是不是太复杂啦?得啦,当你面对的问题还都不涉及到你暂时用不到的内容时,C++够简单啦。。。

这里引用一位 985 CS 专业的老学长谈学习C++的一些感受。

作者:彭双全 链接:https://www.zhihu.com/question/27331184/answer/49986515

学习C++的大抵都听过这句话:

一年精通,三年熟悉,五年了解,十年用过

说说我的体验吧

本科开始就开始学C++,当然只是皮毛,研究生开始看大量C++书籍,什么c++primer effective系列 modern系列,深度探索C++对象模型等,C++书籍看了不下50本,自以为对C++算很了解了。

于是,开始找工作,第一次参加了某歌在学校的笔试+面试,看了我的简历,精通C++?然后问了我一些C++相关知识,发现自己连听都没听过,随便说一个,std::string能否被继承,为什么?

这个问题看起来很简单,但是里面涉及大量的知识,比如对STL中string的实现是否了解,以及是否了解内存泄漏等等。

然后去了第一家公司做网络开发,涉及大量的TCP底层知识以及重构Linux下API

第二家公司开始做推荐系统

第三家公司负责广告引擎

也就是在这家公司,负责的项目,动不动就OOM,造成了千万损失,能体会到当时什么感觉吗?使用简单的排除法之后,发现问题跟glibc有关,所以在临时解决问题之后,用了一个月的时间,分析glibc内存管理源码.

说实话,C++ 我现在已经学不动了,新知识越来越多了,hold不住了,哈哈哈

最近网上看到很多人都自诩精通C++,斗胆一说,真不敢说精通,怀着一腔热血研究C++,掉进去搞了七年。C++ Primer,C++ 程序设计语言,翻来覆去看了n遍,其他的诸如Thinking in C++,Effective C++,C++ 程序设计与演进…市面上能买的到的基本都通读过。最大的一点感受,C++太博大精深了,有多少精力都能耗进去。实际项目开发中20%都用不到,模板乃至模版元编程,即使你敢写,也要掂量下你的同事能不能跟上节奏。

一度怀疑花了那么多精力学习C++是否值得,直到后面有机会专攻Webkit内核代码,里面有些对性能有变态要求的模块,诸如JavaScript解析引擎,内存池管理,C++的高级玩法都玩到了,C++的优势得得到了充分的展现。在Webkit里面浸淫了两年,在实际层面理解了C++的价值,她在复杂性管理和效率之间的有着完美平衡,但是前提是你能驾驭它。

再往后就不写代码了,回顾下C++的学习过程与我而言是一门修行,作为一个合格的程序员,深入理解一门语言是必须的,一通百通,后面Java,C#,OC基本上都是一周上手,轻轻松松。但是回顾学习本身,还是值得商阙。

总结起来说:

1.语言光看是没用的,看了不实践,分分忘光,很多Effective C++提到的问题,只有实际犯错后才会真正记住,多看,多练。

2.语言只是知识体系里面很小的一部分,其他诸如算法,设计模式,计算机体系结构,编译系统的理解,同样重要,缺了就是短板,把读C++设计新思维,More Efftive C++的时间拿去读APUE,敏捷软件开发与实践,收获会更大。

3.书先读厚,再读薄,看Webkit最大的感受是,里面的C++用得很克制,只是在必须使用时才会用到高阶技术,而这种场合无非是一些基础数据结构,一些对内存和性能有极致要求的地方,否则不光维护难,哪天出问题了,debug多层模版时想死的心都有…。建议看一篇Google写的C++编码规范,如果只是达到这个要求,精读三四本书就够了。

4.既然学深了就多去理解他背后的设计逻辑和哲学体系,为什么引入一些特性,抛弃一些特性,原因是什么。看看STL的一些源码,那是精髓中的精髓,最后试着自己写一套自己的基础数据结构和算法出来,比光看书有效多了。