程序员是否应该精通C++?

16

我想知道程序员是否有必要精通至少一种编程语言?

像 C#、Java、VB.Net 等编程语言每年或两年就会有变化。程序员是否需要掌握 C++,这是一种稳定的语言,很少发生变化?

我是一名使用 C# 开发人员,已经使用了七年,但仍然没有掌握它。

编辑 我认为我的问题被误解了。我不反对变化或进化。我喜欢诸如 C#、VB、Java 等语言提供的新功能和抽象。如果新功能能使程序员的生活更轻松,我也会等待新功能的出现。但这个事实也使得这些语言非常难以掌握。它们在不断演进。C++ 等语言具有缓慢的演变周期。因此,在这种情况下,成为 C++ 的专家是否有帮助?这就是我的原始问题的意思。 注:根据下面朋友的答案,我理解了语言和框架是表达概念的工具。同时,用不同的编程语言来表达概念可能是一个好主意。


15
不确定你是从哪里得出 C++ 很少更改的想法。你可能会很快感到惊讶,因为 C++0x 即将推出。(注:该链接已失效,指C++11标准) - Matthew Flaschen
7
等一下,你的意思不是“能”吗? - Jesse Millikan
4
如果你不具备“至少一门编程语言”的专业知识,那么我认为你不是一个程序员!;-) - Dan Puzey
2
如果你不想工作,那就辞职去做其他事情。 - user302845
1
@Matthew,很酷,C++带有lambda表达式 - Dan Bryant
显示剩余6条评论
22个回答

69
编程语言如C#,Java,VB.Net等每年或两年就会发生变化。它们并不是“改变”,而是演变。您的知识和经验并没有丢失。
一个程序员是否应该掌握C ++,这是一种稳定的语言,很少发生变化?
编程就是关于新的和变化的。如果您不喜欢它,请考虑另一个职业。
我是一名C#开发人员,现在已经使用了7年,但我仍然没有掌握它。
如果您要达到精通水平,生活将变得乏味,甚至可能毫无意义。也许重要的不是目标,而是道路?

编辑:阅读了您的评论后,我感到您将.NET类库的体积归因于C#语言本身的复杂性。不要混淆它们。C#语言相对简单,很容易“掌握”。您提到的char数据类型的有用方法只是来自.NET库的辅助方法之一。这是平台的一个优点。这就是使.NET开发人员如此高效的原因,因为他们不必花费数小时挖掘第三方库来执行基本操作:XML、图像、网络、数据库等等,这些都可以直接从.NET库中获得。当然,它的规模可能会让您感到害怕,并给人留下无尽的印象。它不是!只使用您需要的内容,其他的就让它们保持原样。


1
今天的投票次数已经用完了,否则我会立即给你点赞的... - David M
3
像Neil在下面说的那样,C++也在不断发展。对于我们这些深入使用C++的人来说,这些进化是非常重要的,即使更随意的用户可能很难看到它们的价值。我已经使用C++进行了10年(职业方面),但我仍然能够在其中找到新的学习内容。因此,真正的“稳定性”并没有那么重要。 - Joris Timmermans
2
@Yogendra:了解C++有其自身的好处,因为您将更好地理解高级语言(如C#)背后发生的情况。但是,精通C++并不会使您成为C#的大师。 - user151323
2
@Yogendra:.NET库非常庞大,这是该平台的资产之一。我也经常发现新事物,但我学会了不用担心它。除非你努力成为C#编程中的专家,否则你不可能学到所有东西。专注于你的项目,并将语言及其库视为工具。任何时候你学到新东西 - 享受它! - user151323
1
编程并不只是关于新的和变化的。我不同意这种说法。编程是关于制作软件,而不是关于“新的和变化”。并不是所有的“新的和变化”都是有用的。 - SigTerm
显示剩余6条评论

32

C++在我使用它的这段时间内发生了巨大变化,并且即将通过采用C++0x标准进行另一次巨大变革。如果您不喜欢变化,那么您就不适合从事这个行业。

至于“精通”,我会说任何声称完全掌握C++每个方面的人可能都在说谎(包括像Stroustrup这样的人,如果他曾经说过这样的话)。大多数有经验的C++程序员都是专家级别的,可以解决他们感兴趣的特定问题的语言子集 - 如果让他们超出这个子集,他们的缺乏知识很快就会显现出来。但当然,他们也可以很快学习新东西。


1
+1 是因为你是唯一指出 C++0x 的答案。 - Matthew Flaschen
3
“probably lying through their teeth”可以翻译为“可能正在故意说谎”,而“hopelessly delusional :-)”可以翻译为“毫无希望的妄想症者 :-)”。 - AndersK
4
我认为大多数C++开发者已经彻底地陷入了错觉中,是这样吗? - Joris Timmermans
1
每个方面的完全掌握。这里的“facet”是双关语吗?;-) - James McNellis
@James 当然,没有人现在或将来会完全掌握它们! - anon
显示剩余2条评论

17
我在想程序员是否有必要掌握至少一种编程语言的专业知识? 不止一种! ACM杰出科学家Kathleen Fisher写了一篇名为"我们需要不止一种"的文章,解释了为什么理解多种编程语言如此重要。这篇文章内容广泛,但特别提到了C++。
一个程序员是否应该掌握C++的精髓,因为它是一种稳定的语言,很少发生变化吗? 不一定。 两个观点:
  • C++ 看起来稳定,只是因为它已经处于生命周期的晚期,并且在其他语言变得更加流行时相对稳定。如果您在上个世纪九十年代工作,您会认为 C++ 非常不稳定。请参阅 Jim Waldo 的优秀著作 The Evolution of C++。即使现在,当 C++0x 标准最终被采用时,C++ 也将经历另一次动荡。

  • 对于任何程序员来说,深入理解一些具有显式内存管理的语言并在其中使用位、字节和字非常有价值。C 语言在这方面略好一些,但 C++ 是一种完全适合机器级编程的编程语言。然而,至少在我看来,重要的是要了解如何使用字节、字和指针进行编程,而不是像模板或受保护成员字段这样的黑暗角落。

  • 对于任何程序员来说,深入理解如何使用泛型是非常有价值的。C++ 模板仅适用于此,因为无法独立检查 C++ 模板的类型。更好的模型包括 Java 泛型、C# 泛型以及在 Haskell 和 ML 中找到的参数多态性。

  • 几乎不可能像精通 C++、Haskell、Perl 或 Common Lisp 等复杂语言一样精通任何东西。如果您想完全掌握某些东西,您必须坚持使用像 Lua 这样非常简单的语言。


1
我给你点赞。这是一个很好的答案。 - AlwaysAProgrammer
好的回答,但是 C++ 作为机器级语言?啊啊啊。写一些汇编语言程序,包括动态内存分配、通信和线程。这样你就会知道机器是如何工作的,以及程序如何与操作系统交互了! - Cylon Cat
1
@Cylon:实际上我喜欢C,但是在这个论坛里我已经被C++粉丝打压了很多次。至于汇编语言,它对于偶尔的过程确实非常好,但我看不出在汇编语言中构建整个系统的价值所在。事实上,甚至不清楚我们是否应该使用汇编编写固件——英特尔已经发出了一个提案,寻求找到构建固件的方式,需要更少的汇编编码。 - Norman Ramsey
@Norman,我听到你了;我在说汇编语言时有点半开玩笑。虽然我是在20世纪70年代末在IBM 370上做的,当时网站只有Fortran和Assembler。所以就用汇编语言了!很有趣,但不想再去那里了。在定时器和进程间通信之间,我编写了自己的事件驱动模型,其中包括调度程序和消息队列。这使得后来的许多编程工具和环境看起来并不那么可怕。 - Cylon Cat
嘿,Lua并不简单,只是它的语言规模不是很大而已! ;) - RCIX
显示剩余2条评论

6
我认为一个真正的“大师”程序员需要掌握多种工具。她可能会专精于一种或多种语言,但总体而言,她会确保涵盖更广泛的基础知识,而不是深入研究微小的细节。
以下是我认为有用的一些内容:
  • 一种接近底层的语言。如C、C++和汇编语言等,以了解程序如何与硬件交互。
  • 一种相对纯粹的面向对象语言(如C#、Java),以同时学习面向对象的概念,并认识到面向对象并非银弹。
  • 一种函数式编程语言(如Lisp、Haskell等),以跳出过程式/命令式的框架。
  • 一种“脚本语言”-Shell脚本语言或类似Python和Ruby的语言,因为迟早你会需要一些能够“包含所有内容”的东西来快速组合一些实用程序。
拥有这些技能将使你成为任何语言中更好的程序员。

4
我精通几种编程语言,但是深入理解“裸金属”概念可能是帮助您在各种语言之间的最佳支撑。对我来说,这意味着了解C/C++。例如,一旦您能欣赏用C语言编写的Linux内核的面向对象设计,就很容易欣赏其他语言提供的“捷径”(即核心语言功能),并且知道何时以及如何评估其效率。
所以,是的,我认为对于任何程序员来说,理解低级语言是一个巨大的资产。 C/C ++完全符合这个规定。

2
如果您使用C ++,那么您应该了解语言功能。我曾经是一个非常高级的C ++程序员,但现在我使用C#,所以我需要刷新一下。有时候过多的知识可能会干扰,所以我不太在意。
答案:每天编写C ++代码=是,编写c#代码=否。
要清楚,除非您一直在做这件事或者至少每天都在做,否则您无法掌握像这样的东西,至少对我来说是这样的。

2
大多数编程语言都在不断变化和发展,C++也是如此。每个新版本的标准都带来了语法上的改变,而一个重要的版本(C++0x)已经在即将到来。但即使相对于技术的进步而言,新版本的标准可能相对较少,对该技术的理解仍在不断演变。例如,当当前的C++标准首次出现时,大多数人并未使用模板或异常。随着人们对新功能的经验积累,他们不仅学习了机制本身的语法,还学会了使用这些设施的更广泛的影响。如果你看一下今天编写的应用程序,它可能会与几年前编写的应用程序看起来非常不同,即使两者都是由“专家”编写的。
如果你想成为一名优秀的程序员,那么通向精通的道路就是学习。尽可能地在尽可能多的不同领域学习。我相信其中最好的方法之一是学习尽可能多的编程语言,即使只是为了获得对该语言的基本理解。学习所有“大”语言,如C++、VB、Java、C#等。但不要局限于它们。也要学习小语言和更学术化的语言。你学习的每一种语言都不仅教会你那种语言,还教给你如何进行编程。
看看这本书吧,《七周七语言》。7 Languages in 7 Weeks

我们不应该开始称它为C++1x吗? - JeremyP
@JeremyP:Stroustrup不这么认为。 :) “我将继续使用C++0x来指代在此定义的功能集合中即将到来的C++标准。将‘x’视为十六进制。”来源:http://www2.research.att.com/~bs/C++0xFAQ.html - John Dibling
@JeremyP,“x”现在不再是占位符了。它现在是C++0x_。 - aehiilrs

2
一个优秀的程序员应该尽可能了解多种编程语言,C++在其中并没有特殊地位。一个懂得C++的程序员比一个不懂的要好,就像一个懂得Python的程序员比一个不懂的要好一样。
如果你不需要编写C++代码,那么你并不需要成为C++专家。这并不会有什么坏处,学习这门语言肯定会教给你在其他语言中也可以使用的知识。
但是其他语言同样适用这个道理。

1

程序员应该对几乎所有概念都有专业知识 :)


什么?(我需要填充一些内容,以使其成为有效的注释,但真的 - 什么?) - Binary Worrier
2
我认为mathk想表达的是,学习不同的编程语言主要是在学习不同的语法。一旦你学会了面向对象编程这样的概念,你就可以将其应用到不同的编程语言中。当比较函数式语言与其他函数式语言、命令式语言与其他命令式语言等时,这通常是成立的。 - Software.Developer
1
实际上,如果你想一想,你需要知道概念以及何时使用它们和何时不使用。理解一个概念并不是一件容易的事情。 就像学习一门语言一样,你需要选择最适合你目的的最佳单词和句子,以使你所写的内容完全清晰。 但这非常困难,也取决于你知道多少编程语言... - mathk

1
你是否已经掌握了英语(或者你所说的任何语言)?我已经讲英语30多年了,但仍然没有完全掌握它。在这方面,我认为英语和C#(C++、VB、Javascript等)并没有太大的区别。语言是不断发展的,保持学习,这是你能做的最好的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接