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++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ