C++至今不可替代

转自: https://blog.csdn.net/ttwwok/article/details/21452013

社区之星第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 


你可能感兴趣的:(书籍资料)