老司机漫谈C++

毕业后我进入中兴通讯,被分配到了多媒体产品线,做音视频处理,C++就成了不二的选择。至今为止使用了十多年了,一直在后台服务开发和多媒体处理这两个领域,虽然未必算C++编程高手,倒也纯熟,踏过无数坑之后,也对C++有了很深的感情。

1、C++的现状

近年来,Python、Rubby、Go大行其道,甚至于JavaScript和lua的风头都改过了C++,更不要说 几十年来一直和C++唱对台的Java,似乎C++已经没落。我现在需要招C++的开发,都已经很难招聘到合适的人了。培训学校都是教PHP、JS、Python,几乎没有教C++的。

事实上,C++依然悄悄统治这这个世界,只是平时大家注意不到:

  • 主流大厂:腾讯、Google、Baidu都是以C++作为主流语言,只有阿里采用Java比较多。
  • 操作系统:Mac OS X核心、Android底层、Windows GUI(Windows内核是汇编和C)都是C++写的。
  • 系统应用:如果你用的Windows系统,用Spy++ 和 Dependency Walker统计一下你电脑上的应用程序,你会发现80%以上的程序都是C/C++写的。
  • 浏览器:IE, Chrome, Firefox, Safari, Opera。Webkit也是C++开发的。
  • 数据库:Oracle, Mysql, DB2, SQL Server(主流的数据库都是混合C/C++), 以及 MongoDB,rethinkDB
  • Adobe几乎所有的主流产品:Photoshop,Acrobat Reader/Distiller, Illustrator
  • 很多游戏和游戏引擎。如:Doom III,cocos2d-x,Unreal,Unity 3D ……Blizzard、Microsoft、Electronic Art都是用C++写的游戏和游戏引擎。
  • 深度学习引擎:Caffe、MxNet、Tensorflow、CNTK底层语言都是C++

2、C++的窘境

既然C++还这么牛B,为什么感觉用的人越来越少呢:
- C++目前仍然停留在源代码共享的级别上,重复利用困难。微软曾经想用COM推广C++达到二进制共享的目的,实际并不成功。
- C++基础设施少,没有什么通用的框架,从上层到下层几乎都要自己写,开发成本高。
- C++的特性。指针和内存操作是优势,也是最大的难点,稍微疏忽就会造成严重错误,对开发者要求高
- C++学习周期长,难学难精通。有句话说的是“C++只有新手和高手,没有中间层”

3、C++的价值

C++之父Bjarne Stroustrup在 “2016 C++及系统软件大会”上阐述了C++的根本特征和优势

  • Direct map to handware 直译”直接到硬件“

    • C++语句是可以直接对应到CPU指令的。C++的数据类型也可以直接对应到CPU支持的数据类型,简而言之,就是不需要转换,效率高。
  • Zero overhead abstraction 直译”零负担抽象“

    • 一层意思是C++是有抽象的
    • 二层意思支持抽象的负担为0.像现在的java/C#等也是支持抽象的,但是抽象的代价很大,资源消耗多,运行速度慢。

作为一门强大得没边,几乎没有任何局限性、又兼顾底层效率的高级语言。主要应用领域有哪些呢

  • 后台开发。不管做游戏还是互联网,大多数后台服务器程序都是基于C++开发的。
  • 游戏开发:游戏引擎往往都需要进行高性能,这也是C++的优势领域。
  • 虚拟现实:这个领域一直在发展,目前VR眼镜比较火,需要大量基于这些的C++开发。
  • 音视频处理:在处理图像视频这方面C++具有天然的优势,比如OpenCV、Cuda、FFMpeg这些都是C++的自留地。
  • 其他还有编写操作系统、设备驱动、科学计算等不是那么常用的领域。

4、C++的成长路径

学习也好成长也好,总需要一个目标,这儿以“基于C++后台开发能力”为例列举一下学习路径:
1)掌握C++的基本语法,面向对象、继承、多态等特性
2)掌握C++常用库,比如STL、Boost等
3)掌握操作系统特性,如果你想做linux下的开发那么就需要对linux的shell熟悉,如果你想做windows下开发,那么也要了解win32的特性。
4)掌握必须的开发工具。windows下就需要熟悉Visual Studio的编译调试。Linux下就需要熟悉makefile、Gdb等。
5)掌握多进程多线程技术。多线程同步、多进程通信,这些都是系统必备。
6)掌握通信协议。现在最基本协议簇就是HTTP协议和TCP协议,用C++怎么封装使用。
7)掌握序列化工具。通信和存储都可能存在序列化和反序列化的工作。序列化的文本工具的就是XML和Json,二进制常用的就是Facebook Thrift和Google Buffer。
8)掌握数据库开发。数据的持续化是必须的,不说要好精通数据库技术,但是至少要熟悉高效使用。
9)掌握性能优化的常用方法和思路。性能是C++最大的优势。如何将它发挥出来,这是每个做C++的最有挑战的,内存、并发、分布式,各种解决思路都需要实践结合。
10)掌握系统架构和设计模式的基本方法。当你需要自己设计架构一个高性能C++服务器的时候,系统架构能力和高效的设计模式应用也是必不可少。

:遇到问题可以找资料的网站
● https://stackoverflow.com/
● https://segmentfault.com/

5、总结

语言只是工具,不同语言总有自己的局限性和优点。当你熟悉了一门语言之后,你会发现,编程语言只有喜欢与不喜欢的问题,没有会不会的问题。任何的一门语言,你都可以在两周内掌握并开始熟练编程。因为任何的一门语言,他们的底层函数库都是那么的相似,而他们API都是那样的依赖于操作系统。A语言里有的,B语言里也基本都有。通常而言,语言的差别主要表现在适用范围上。

选择C++,需要耐得住寂寞,这通常不是一条很炫的道路。从另一个方面来说,难度有多大门槛就有多高,一个C++高手肯定不会缺乏竞争力。

你可能感兴趣的:(C++)