C++至今不可替代

2024-04-25 17:08
文章标签 c++ 替代 不可 至今

本文主要是介绍C++至今不可替代,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

社区之星第5期采访的嘉宾是拥有十年以上编程经验的CSDN社区活跃用户陈抒。他在采访中谈到C++语言的难点和优势,以及对C++性能的看法。他认为在云计算时代,C++在很多关键业务上起到不可替代的作用。

 陈抒认为能熟练掌握技术的方法是勤动手脑、抠细节

陈抒,拥有十年以上编程经验的老程序员。目前就职于Esri研发中心。文科毕业,自考计算机本科。曾做过保险业务员,程序员。精通Windows/Linux平台下的C++编程,熟悉Java,擅长互联网开发和基于Linux的服务器。

CSDN:你何时开始接触计算机?身为业务员,是什么原因促使你走上编程的道路?

陈抒:自大学毕业,再接触电脑是从1999年开始。我天生就对科学有很强的好奇心,当时我认为人的大部分时间是工作,选择自己喜欢的工作就是选择自己的生活方式。结果我很适合这个行业,也获得了自己喜欢的生活。

C++不可替代

CSDN:在众多语言中,你为何会首选C++,而不是其他语言,其中最主要的原因是什么?

陈抒:在我即将完成所有自学考试开始准备毕业论文的时候。我认识到文凭不能代表能力,必须掌握一门语言,才能找到工作。当时的选择似乎并不多,VB大行其道,VC也很普及。我的想法很简单,VC较难,会的人自然会少,竞争也少。而且我对自己有信心,能学会该语言。

CSDN:你认为C++最大的难点和优势是什么?

陈抒:以我经验来看构成C++学习困难有四点:

  • 知识点广泛而且难度高。按照几年前Scot Mayer在Effective C++中对C++的定义来看,C++是一门多范型语言,包括了C、面向对象编程和泛型编程。程序员需要正确理解很多基础概念,比如,堆和栈的区别、指针、指针的指针、虚函数的内部原理、继承引发的对象内存布局、多继承引发的模棱两可、模板以及编译器推导、STL算法等。C++的内容如此广泛,因此每个知识点的学习和积累都不是件容易的事情, 自然误用的情况常会发生。
  • C++打开了直接面向操作系统API编程的大门,因此使用C++完成工作,很多时候需要学习大量的平台相关的API,这些API有的非常复杂。比如被称为噩梦般的技术,Windows提供的COM/COM+库,其实就是需要了解一大堆基础知识才能操纵好。再比如:面向接口编程、虚函数表、设计模式中的工厂模式、Windows DLL地狱的由来、Windows注册表、序列化、Windows安全、RPC、IDL语言、支持脚本语言的自动化技术(IDispatch)、对象引用计数器,线程安全和套间和ATL模板技术等。
  • 而在C++的演化过程中,因为缺乏商业公司的大力赞助,缺乏良好设计的跨平C++类库,多数人只能使用标准C++库,但跨平台效果也不佳。直到近几年Boost为代表的现代C++库起到了很大的作用。同时,Java程序员早就享受着非常好的支持,SUN的丰富的JDK,大量活跃的开源社区(比如Apache) 对Java的推动也是非常明显的。
  • C++程序员成长周期长,特别是中国很多靠做项目挣钱的成长型企业面对选用C++作为编程语言会有所顾虑。

优势同样很明显:

假定程序员能很好的运用C++,那么程序可以获得很高的性能,消耗较少的资源。在云计算时代,C++在很多关键业务上起到不可替代的作用,也为这个地球节能。举个例子,我有一次要在美国服务器上部署一个JSF编写的网站,安装GlassFish失败是因为虚拟机核心线程和进程的总数被限制,只能换成C++编写的网站。这台服务器还同时运行着C++编写的TCP服务程序和NoSQL数据库。

CSDN:Linux之父Linus Torvald和Google首席工程师、Go语言之父Rob Pike曾表示,C++比较复杂,需要扎实的编程基础和期编程经验,没有丰富经验的程序员很难运用自如。你对此有什么想法或观点?理由是什么?

陈抒:Torvalds对这个世界贡献很大,我每天都在使用Ubuntu和Git,非常感谢他。但不知道他为什么恨C++。他曾说表示如果要用面向对象只需用C#和Java,为什么需要C++。刚巧这三个语言我都很熟悉。我认为仅仅是面向对象的话,C++、Java和C#都能胜任,但是只有C++能够同时达到C的性能。而且GCC团队早就用C++来实现C的编译器,而Linux内核据说使用的正是GCC编译代码,不知道Torvalds做何感想。

如果Go语言之父说将Google的关键服务,比如搜索引擎用非C++语言来替代,不知道他会做何回答。每个语言都有其擅长之处,其实我本人目前很喜欢Lisp语言。如果将来不再需要C++,只能说明我们的科技又有了巨大的进步。

扎实的基础=成功的阶梯

CSDN:你学习过很多语言,并且能运用自如,对编程新手有什么好建议吗?

陈抒:十多年的时间让我熟练掌握C++、Java、C#、JavaScript和Bash,但这并不是一件了不起的事情。幸运的是我对C++的深入研究与应用奠定了我扎实的基础,因此有利于学习其他高级语言。我对新手的建议是:

  • 多上CSDN写博客。好记性不如烂笔头。尤其是技术,非常细节。如果能够在博客中清晰的表达出来,那就说明对技术问题掌握的比较好了。
  • 尊重语言的设计原则。每个语言发明出来都有其设计目的,为了解决某个领域的问题,有其明确的设计原则。计算机科学包括算法,数学,也包括语言。我的一些朋友,总认为编程就是算法,结果对语言不认真研究。这样一是容易掉进语言的陷阱,影响代码质量,二是会让自己无法融入真正专业的技术团队。

CSDN:为什么你开发Java用Emacs而不是IDE?

陈抒:2006年,同事教我使用Emacs。因为以前美国公司的要求,必须手动写Ant脚本编译整个Java Web项目,因此从IDE换成了Emacs + JDEE的开发模式。当初自己摸索很辛苦,直到若干个月后才享受JDEE的开发模式。好处也非常明显:

  • 没有IDE可以自由的掌控自己的代码。
  • 便于在服务器上远程调试代码,因为一切都是基于命令行。
  • 开发机器要求配置低。
  • 由于要手工完成构建脚本,无论是Ant还是Maven,对Java工程的控制能力明显增强,为构建大的持续集成系统奠定了很好的基础。

CSDN:以你经验来看,美国程序员和中国程序员之间最大的区别是什么?

陈抒:我和美国程序员有过一些开发项目的合作,就我接触到的程序员来说,他们都很专业,用VIM开发C、Java、Ruby。我也是在他们的要求下,放弃了IDE开发的习惯。后来,我接触到很多开源社区的国外程序员,用VIM和Emacs编程的非常多,这跟Unix传统有很大的关系。

一般来讲,美国程序员(来自世界各地在美国工作的程序员)其实并不比中国程序员聪明,但是美国文化很尊重工程师。现代计算机领域还是美国在领跑,学校和企业都有比较规范的编程习惯和研发传统,因此一个年轻的工程师在美国公司的成长通常比我们快。同时,在英语上具备较大优势。

CSDN:你最尊敬或崇拜的技术人是谁?为什么?

陈抒:对我影响较大的专家或作者有C++作者Scott Mayer、Herb Sutter和Andrei Alexandrescu。COM领域是Don Box。C++库是CppCMS作者Artyom。

CSDN:Esri研发中心是如何进行Java项目开发管理的?

陈抒:Esri北京研发中心的总经理Moxie先生来自美国,因此按照那边的标准要求软件研发过程。项目管理采用Scrum敏捷方法,强调工程师的自我管理。我主要介绍一下我们的代码评审系统和持续集成系统。

首先我们使用Git进行代码管理,不同于VSS、CVS、Subversion,这是个分布式版本系统,功能极其强大,但是学习成本高,原理和使用技巧复杂。在此基础上,采用了Gerrit进行用户权限管理和代码评审管理,程序员的代码只有经过评审才能进入Git仓库。Gerrit是Android社区的评审系统,有很严谨的工作流,适合于那些关注代码质量的团队。持续集成,也就是代码入库后,会有服务器自动编译代码,运行单元测试,产生报表,打包并安装。这里面包含大量的技术细节。下面有个使用场景:

程序员A编写一个Java的库,经过代码评审后入库,一台Jenkins服务器发现代码已经更新,自动从Git中获取最新代码,进行编译。这个Java库采用Maven构建,因此编译后可以运行测试用例,进行代码静态扫描(使用Checkstyle、PMD、FindBugs),并将测试结果,代码扫描结果, 测试覆盖率等生成HTML报表发往报表服务器。如果测试通过的情况下,编译后的jar包会被部署在Nexus服务器上,供其他程序使用。

程序员B正在开发一个Web程序,也是通过Maven构建自己的工程,通过Maven的依赖管理很容易的就将Nexus服务器上的A写的jar包引入到自己的工程使用。当B的程序通过评审进入代码仓库,Jenkins服务器获取最新代码进行构建,同样进行代码扫描,运行单元测试,然后负责将war包远程部署到一台web服务器上用于并发测试。

程序员C正在制作一个安装包,他编写脚本安装web服务器和B的程序,以及其他一些产品需要的程序和文档。他所有的脚本和文件也会被提交到代码仓库中,Jenkins服务器检查到更新后会获取并运行一些事先编写的脚本执行复制文件,创建压缩包的工作。然后通过SSH公钥方式自动的登录到一台运行KVM的Linux机器上,将其中的一个虚拟机恢复到某个测试状态。再登录到这个虚拟机上,安装这个压缩包。

当一切都自动化的完成后,经理和工程师们都可以通过浏览器访问虚拟机,来检查产品的功能,通过报表系统来检查代码是否规范,测试是否通过。这个自动化过程其实是跨语言的。Java社区在这方面特别成熟,提供了很多有用的工具,因此我们先在Java开发中广泛使用。同时我们也已经用于JavaScript语言,还打算集成C++项目。另外,Esri工程师分布在全球各地,数量众多。因此我们正在建设基于GitLab的公司内部的Social coding模式,让工程师们像在社交网站上一样看到其他工程师的工作,并分享自己的工作。

CSDN帮助程序员了解国外的创新成就

CSDN:你在学习或工作中,是怎么接触到CSDN?CSDN对于你的工作或学习有什么影响,起到过什么帮助?有没有故事可以分享?

陈抒:接触CSDN是一件很自然的事情,当年我日以继夜的研究COM+和ATL,把自己总结的经验从Word文档直接复制到CSDN博客上发表。随着时间的推移,这个习惯就从2003年延续到现在。

CSDN:你对CSDN有什么建议,以及你对CSDN的未来有什么期待?

陈抒:最近两年技术发展非常快,CSDN每年举办了很多活动,帮助中国的程序员了解世界各地的创新成就,起到了非常好的社会作用。如果CSDN能够安排一些专题,去挖掘为什么硅谷有那么强的创造力,应该会很有意义。北京各大IT公司就有很多从硅谷回来的技术高管,他们应该能够分享很多这方面的见解。中国从来都不缺优秀的人,但是缺让很多聪明人都能发挥的制度。

陈抒CSDN ID:sheismylife  博客地址:http://blog.csdn.net/sheismylife 

这篇关于C++至今不可替代的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935282

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取