阅读更多

2顶
3踩

编程语言

原创新闻 2016年,我们为什么要学习C++?

2016-07-06 16:30 by 副主编 mengyidan1988 评论(4) 有10546人浏览
c++
引用

原文链接:Why would you learn C++ in 2016?
作者:Krzysztof Szatan
译者:孙薇
选自《程序员》杂志


学习C++的一大好处在于,它可以帮助我们理解生命周期(Lifetime)和所有权(Ownership)的概念,以及类型的抽象,还可了解到怎样利用类型保持API的使用方式不变。除此之外,为何各种高级语言层出的今天,学习C++仍颇有价值?本文将为你道来。



“C++已死”

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

大家怎么看待指针?

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

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



C++持续完善过程(图片来源:https://isocpp.org/std/status)

该语言正在经历大浪淘沙的过程,套用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++代码了。

企业代码库的现实场景

很多计算机科学专业的本科生以为自己将会走上像摇滚明星、忍者或者超级英雄那样的事业之路:“只管等着让世界看到我的能力!”这种想法源于他们自认为“是优秀人才,并非常人”。本来抱着一腔期待,准备投身于长时间的设计,以及实现复杂的算法(至少我以前是这么想的),然后获得了第一份工作,结果很快就被20年的老代码给打垮了。有着固定缓存的strcpy函数分散在数百个文件、上千行函数、五个版本的手写linked lists中——请感受一下。于是你卷起袖子,动手收拾这个烂摊子。结果你的主管对你说道:“不要着急,年轻人,公司老早就要求实现这个功能了。不,我们不准备使用新的GCC编译器,别的团队都还没准备好呢。”现在你开始思考:“我哪里犯错了呢……”

这个问题可不是C++所特有的,还会出现在调试一些由Reflection的爱好者所创建老旧的Java代码时。如果你是一名Web开发者,很可能会遇到一些PHP的问题。即便使用Ruby,Python或者一些较新的语言,那些枯燥的工作也都会榨干你的精力。
“你能把那个按钮挪到右边并改成粉色吗?”这就是大多数公司在工作中的现实场景。我想说的是:除了大量遗留问题,或者无聊的代码之外,还存在着少量既有挑战性,又有趣味性的工作,而这些工作有些刚好是C++能发光发热的领域。

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

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

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

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

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

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

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

链接已失效
3 楼 jiuyuehe 2016-07-12 14:28
2 楼 jsjs9494 2016-07-08 15:54
C+Python > C++
1 楼 fqg05 2016-07-06 17:26
呵呵呵呵呵呵

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • C/C++大学B组蓝桥杯历年决赛真题(2012年至2016年)

    2012年至2016年C/C++大学B组蓝桥杯历年决赛真题 用于学习交流

  • 2016年,我们为什么要学习C++

    英文原文:Why would you learn... 学习 C++ 的一大好处在于,它可以帮助我们理解生命周期(Lifetime)和所有权(Ownership)的概念,以及类型的抽象,还可了解到怎样利用类型保持 API 的使用方式不变。除此之外,为何

  • 既然C++不如Java、Python,为什么还要学C++?

    既然C++的发展不如Java、Python,我们为什么要学习C++?在有Java、Python等优秀编程语言存在的情况下,C++它的魅力与优势是什么,今天我们来了解一下: 所以我们到底要不要学 C++?当然要,而且必须要。为什么? ...

  • Why would you learn C++ in 2016?(2016年,为什么我们要学习C++)

    http://itscompiling.eu/2016/03/10/why-learn-cpp-2016/“C++ is dead”I’ve been hearing this since I went to the university. That’s like 10 years ago. Back then Java was already domina

  • Why would you learn C++ in 2016 (2016年,为什么我们要学习C++)

    Why would you learn C++ in 2016 (2016年,为什么我们要学习C++)

  • 为什么要学习 Kotlin ?

    为什么我喜欢 Kotlin ?我想解释一下为什么我更喜欢Kotlin而不是Java。简而言之,在不牺牲性能或安全性的前提下,许多无数的Kotlin功能使代码比Java更加简洁易懂。Kot...

  • c++是什么?

    C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

  • C++和Rust_我们为什么用Rust?

    Rust 可以被归为通用的、多范式、编译型的编程语言,类似 C/C++。与这两门编程语言不同的是,Rust 是线程安全的!Rust 编程语言的目标是,创建一个安全和并发的软件系统。它强调安全性、并发和内存控制。尽管 Rust ...

  • C++难学吗?为什么难学?如何去学?

    为什么难学?如何去学? 经常上网,发现最多人问的问题就是C++难不难学。而得到的回答却基本上是说很难学,甚至有说要两年才算入门。我开始是学VB的,现在转学QT。谈谈我对C++的看法。 1、入门兴趣和方向 大家...

  • 为什么要学习Python?这10个理由足够了!

    如果你定期关注现今的科技发展,那么你可能想知道我为什么要写这篇文章告诉人们学习Python?因为几年前我提倡Java而不是Python。在2016年,Python取代Ja...

  • 2016年6月17日学习日记c++第三讲

    2016年6月17日学习日记c++第三讲 1、c变量:被修饰的变量不能改变 2、c指针: 指针常量:指针指向不能变,指向变量的值可以改变char*const p; 常量指针:指针指向可以改变,指向变量的值不能变const char *p 3...

  • 为什么要学 Python???

    如果你定期关注现今的科技发展,那么你可能想知道我为什么要写这篇文章告诉人们学习Python? 在2016年,Python取代Java成为高校中最受欢迎的语言,从那时起它受欢迎的程度就没有减退过。 但是,随着新时代的到来,...

  • 2016年最新C/C++学习路线图 附完整视频资源

    这张学习路线图到底有什么用?能给你什么帮助呢?  我是一名C/C++老师,经常和同学们打交道,发现大家遇到的困难大部分类似,大致分为以下几类:  1、刚接触C/C++,不知道该从哪里学起,也不知道该学点啥; ...

  • 2016年世界编程大赛_在2016年学习的最佳编程语言是什么?

    2016年世界编程大赛Craig’s Best Programming Language to Learn in 2015 article was a huge hit, and in this article he offers a fresh perspective on the programming landscape in 2016. 克雷格(Craig) 在...

  • vue3.2+ts+vite+admin 开发的admin管理系统模板

    vue3.2+ts+vite+admin 开发的admin管理系统模板

  • chromedriver-win64-124版本浏览器驱动

    自动化测试工具selenium使用的浏览器驱动下载 chromedriver驱动压缩包 Java web 自动化测试工具需要使用的chromedriver浏览器驱动

  • node-v8.1.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • 2. Power Query 逆透视&分组依据.xlsx

    2. Power Query 逆透视&分组依据.xlsx

  • Java 实现微信红包分配算法内含源码以及说明书可以自己运行复现.zip

    Java 实现微信红包分配算法内含源码以及说明书可以自己运行复现.zip

Global site tag (gtag.js) - Google Analytics