学习成为一名优秀(优秀)程序员的必备条件是学习如何使用C(或C ++)吗?[关闭]


25

当我第一次开始学习如何编程时,真正的程序员可以在睡眠中编写汇编。计算机科学方面的任何认真教育都将包括大量使用汇编进行编程的培训和实践。从那以后,情况发生了变化,以至于我看到带有汇编的计算机科学学位(如果有的话)被降级为一项任务和一章,从四年制学习中总共进行了两周的工作。

C / C ++编程似乎遵循了类似的路径。采访那些花了不超过两周的C ++编程并且只在某本书中读过C的大学毕业生,我不再感到惊讶。虽然最严重的CS学位似乎仍包括大量的时间学习和使用其中一种或两种语言,但显然趋势是学校中C / C ++的执行较少。

显然,无需阅读或编写任何C或C ++代码行就能从事出色的工作。

考虑到所有这些,学习这两种语言值得吗?他们是否必须要出类拔萃?(除了显而易见的,非语言的建议,例如“语言的选择对于全面的教育可能很重要”,以及“在程序员的整个职业生涯中不断尝试和学习新语言可能是一个好主意,伸展灰色细胞”)


8
C在当今的软件基础结构中无处不在。学习它肯定会使您对编写的软件中实际发生的事情有更深入的了解。(请参阅developers.stackexchange.com/questions/14744/…)。
查尔斯·索尔维亚


切线:一个好的程序员会适应各种编程范例,这意味着已经学习(并使用)了几种语言。
Matthieu M.

学习更多的语言不会有伤害。
2011年

4
没有C / C ++。只有C和C ++。它们是非常不同的语言,根据您所谈论的内容,答案可能会完全不同。
卡勒布(Caleb)2012年

Answers:


63

乔尔斯波斯基(是啊,乔尔)争论了一段时间后,真正艰难的程序员都知道如何使用较硬的语言(如C,C ++和Lisp)及其结构(如指针和功能特性),以及更高级别的语言通常不足以证明您的能力。

我能理解他的观点,即了解C和C ++的人以及实际上精通C和C ++的人比使用Ruby(并且使用Ruby)编程的人了解更多有关幕后事情的知识。我会这样说:如果您了解“硬”语言,则可能很好地证明了您能够在遵守严格约束的前提下进行编程,或者您掌握复杂的思维方式。如果您精通高级语言,那么在遵守严格约束的前提下也可以进行编程,但是没有任何证据。

我认为学习C或C ++不会损害您的大脑(尽管有些人似乎相信这一点)。实际上,学习它只是为了欣赏更好的高级语言可能是一个好主意。


34

是的,要成为一名优秀的程序员,必须了解C(或C ++)(在当前时代)。

这不是语言本身,而是环境。

程序不能在真空中运行。优秀的程序员知道他/她的环境,就像伟大的雕刻家知道他/她的材料一样。我们当前的编程环境(操作系统,编译器,网络等)基于C / C ++构建。

优秀的程序员编写高效的程序,并在现实生活中对其进行调试。他必须了解环境-如今,它需要了解C / C ++。

编辑:无法抗拒添加矩阵引用。Morpheus可能会问:您想服用Java药并继续生活在虚拟机提供的舒适环境中吗?还是您服用C丸,看看兔子的洞有多深?


9
+1作为Matrix参考,我将其保留以备将来使用:-)
Konamiman 2011年

20

我必须参阅另一篇乔尔的文章。在“泄漏抽象法则”中,学习诸如C,Lisp,C ++之类的语言以及涉及内存管理的语言,还涉及学习一种思维方式,该思维方式定义了我们接下来的职业生涯。

我在“数据结构和算法”课程中的教授William Spears向一群持怀疑态度的计算机科学专业的学生讲了为什么我们不学习最新的工具。这些学生抱怨说,他们觉得自己没有为“现实世界”做好准备,因为我们没有学习Java。我们不是在学习JavaScript。HTML没有类。我们没有学习[[INSERT TECHNOLOGY HERE]]。

我们为什么不学习最新的工具?根据我们的教授的说法,技术变化如此之快,以至于四年之内,我们学习的工具可能已经过时了。好吧,在这个行业工作了几年之后,我不得不说我同意他的评估。

计算机科学教育的目的是学习如何学习。找出解决开发中许多问题的解决方案通常需要具有开箱即用的思维能力,这只能通过学习基础知识,基础知识,基于C,C ++和Lisp的原始计算机科学来解决。

当现实世界中的那些抽象泄漏并且会泄漏时,对基本知识的理解就是将平均值与最佳值区分开的原因。


3
我肯定错过了什么。Lisp与学习基础有什么关系?这是有史以来最大的抽象反转。其最初的基本设计目标之一是“假装我们并没有真正在图灵机上使用,而是可以看到这样做能使事情简化多少”。
梅森惠勒

6
@梅森:学习Lisp几乎不会教您有关真实计算机的任何知识。它会教给您很多有关计算理论的知识。原始计算机科学不仅仅是原始计算机。
David Thornley

2
@Mason Wheeler Learning Lisp引入了几个高级概念,包括:数据/代码可互换,反射/自修改代码,以及将编译器/ vm视为最终产品的一部分的重要性
blueberryfields

@blueberryfields:...所有这些都被更有经验的编码人员在某种程度上认为是有害或安全漏洞。教给新手的东西很不好。
梅森惠勒

2
@Mason我不理解您的评论内容-我们在这里谈论的是优秀的程序员,而不是新手。我不会认为对这些概念没有透彻了解并在工作中适当(定期)应用这些概念的程序员是专家。
blueberryfields

18

让我这样说吧。假设您需要雇用某人来从事一些C ++工作,而某人申请了在大学里做过一个C ++项目但自毕业以来仅使用Java编程的人。相反,假设您需要雇用某个人从事一些Java工作,而某人申请了在大学里做过Java项目但自毕业以来仅使用C ++编程的人。

您将更愿意雇用谁?我会与C ++人士争辩,因为转而使用垃圾收集语言比转而使用垃圾收集语言要容易得多。对于其他概念和其他语言,也是如此,例如从编译类型转换为解释类型,或从静态类型转换为动态类型。在几乎每种功能之间您都可以在语言之间进行比较,C ++处于困难的境地,这使得编写程序很痛苦,但它也是判断程序员的绝佳基准。

您可以在不接触C或C ++代码的情况下事业蒸蒸日上吗?当然可以,但我仍然不想雇用无法或不愿意这样做的人。


3
令人印象深刻的论点。如果我需要完成Java工作,可以聘请具有Java经验的人员。如果我需要完成C ++的工作,我会聘请具有C ++经验的人。如果我必须聘请Java来担任C ++职位,那么我可能会花一些额外的面试时间来询问他有关指针,内存管理和RAII的知识。同样,如果我必须聘请C ++来担任Java职位,那么我会在面试中花更多时间询问抖动,设计模式,反射等问题。这两种技能似乎都不需要更多的智能,只是经验。无论如何,大多数学习曲线都在库中。
亚伦诺特,2011年

13

不,不是必须学习C或C ++才能成为一名优秀的程序员,但了解它会帮助您清除一些基本概念,例如内存管理。


7

学习这两种语言值得吗?

显然,无需阅读或编写任何C或C ++代码行就能从事出色的工作。


6

简而言之,不,他们不是。它们是学习有用的语言,但是您可以轻松成为一名优秀的程序员,而无需使用C或C ++。大多数优秀的程序员可能都会碰过它们,但这并不重要-如今,在许多应用程序中,它们的使用率不及.NET和Java,因此它们的必要性有所下降。

请注意,我并不是说它们不值得学习,我认为它们都是重要的学习语言,尤其是如果您打算从编程中谋取职业。但是您可以在没有接触过的情况下成为一个体面的程序员吗?当然。


5

这取决于您的兴趣。
如果要从事系统编程,那么您将必须学习C / C ++,因为它们是CS的默认语言。为了熟悉OS概念,编译器,数据结构,内存管理等,您必须了解C / C ++。另外,还可以在C / C ++上获得大量的优秀文本,书籍和文章,这些信息可以优化您的编程技能。前几天在/ * *程序员/我读了一个很好的答案为什么Ç - 因为它靠近金属
另一方面,如果您想限制自己进行应用程序编程,则无需使用C / C ++,直接从C#(.Net)/ Java开始,您将获得出色的开发人员的工作。但是,如果您真的喜欢硬核编程,我相信有一天您将开始学习C / C ++。


接近金属!喜欢那个评论。
Wajih,2011年

3

这完全取决于您要使用的应用程序域。如果要在嵌入式环境中玩,那么您几乎需要了解C或C ++。C ++可能也是游戏开发中最常用的语言。如果要在Web应用程序上工作,则C或C ++可能没有那么重要。没有一种语言具有定义高级软件工程师的先决条件。


3

C被称为“便携式组装”,这是非常正确的。它旨在使Unix可跨处理器移植,并描述与底层处理器指令集非常接近的代码。

如果您发现自己想在实际硬件上工作,在嵌入式软件或设备驱动程序等环境中工作,那么就无法解决C问题。如果要使用更主流的高级语言,这是一个更好的主意,因为使C功能强大的许多功能也使C变得危险,因此已被简化或简单地删除了。

我个人认为了解运行程序的最终需求非常重要,因为许多设计决策均取决于此,因此,您至少应该熟悉如何将代码映射到汇编指令集上以及如何在实际的代码中工作硬件。您认为理所当然的事情确实需要时间做,为什么。

因此,我至少建议您看一下C和一些高级指针算术代码,这样您就知道每天不必处理什么。


1

C非常有用,因为它靠近硅。C或汇编语言将使您对计算机可以做什么以及它们如何工作有很好的感觉,这可能有助于理解什么是可能的以及什么是实用的。此外,您可能会对其中有很多C代码感兴趣,并且许多现代语言都使用了它的许多语法和语义。

C ++是一种高级语言,其中包含一些非常有趣的功能。它有很多好的用途,并且是一种强大的语言。另一方面,还有许多其他强大而有用的语言。

因此,我强烈建议学习在较低级别上发生的事情,而C是学习它们的绝佳方法,因此,我强烈建议学习C。学习它会教给您一些东西,但是还有许多其他方法可以学习其中的大多数东西,如果您已经在使用主流语言,那么有更好的语言可以学习新概念。


0

这取决于您认为要制作的软件类型。游戏通常用C / C ++编写,因为就可执行代码而言,它通常是一种更可优化的语言。在某种程度上,您编码的内容就是您所获得的。

话虽如此,C#也已被用来编写游戏程序。至少在Windows平台上,C#可能是用于桌面应用程序开发最佳语言之一。

与Visual Studio一样,C#几乎成为我使用的唯一软件开发语言(如SQL和PHP等语言),因为它出于所有意图和目的,在我看来,这真是太棒了。

如果您在Windows上进行开发,我强烈建议您与其他内容一起学习C#.NET。

我不认为C ++本身是必需的,但是拥有较低级别的指针,内存管理和其他概念的知识是很高兴的。


1
@尼克:计算机世界已经超越了Windows和C#。
游侠

2
因此,为什么我说“如果您在Windows上进行开发”
尼克·贝德福德

0

@Nick Bedford对您正在使用的域是正确的。我的软件同行编写设备驱动程序和嵌入式软件。C是去那里的方法。而且不要将C ++视为第二语言,它们有很多重叠之处。


3
如果您不认为C ++与C是另一种语言,那么您真的不太了解C ++。仅可以重叠进行工作,但不建议这样做。
David Thornley

也许我夸大了相似性。但是它们与例如C和Perl更相同。
Brian Carlton

0

许多人说C对于内存管理是很好的学习,我同意。我对学习C的观点是,为了学习如何调试程序而学习非常好。为C编写的很多东西都可能出错,这需要您考虑如何调试程序。我很少在我的任何编程中(使用C或其他语言)使用调试工具,只是因为C教会了我如何在程序中添加内置调试实用程序。

职业需要学习C / C ++吗?不,但是我也看到很多 Java开发人员不了解很多编程基础知识,因为他们只学习Java。与Perl程序员相同。无论C / C ++是否是其中一种语言,学习一种以上的语言都是职业的要求。


+1-看到以不同语言以不同方式呈现的相似概念有助于我更好地理解这些概念,并以全新的视角看待它们。
jmort253

0

一开始,我曾经以为我的大学是Dennis M. Ritchie的一代,因为在有很多相对较新的语言(例如Java,Visual Basic等)的情况下,它在两个学期内都包含了C。但是事实是,或者至少现在我相信,C是可以帮助您了解编程基本概念的最佳语言之一。

关于不学习C(或C ++)的职业-是的,这是可能的,但是学习C可以在编程中展示您的知识。


0

对我来说答案是肯定的。C和C ++都是我的CS学位课程中必修的课程,我坚信拥有CS或相关学位是成为“优秀程序员”的最低要求。此外,成为“优秀程序员”意味着能够合理化所发生的问题,并理解为什么某些事情无法像人们期望的那样起作用。在我的职业生涯中,有很多次我看到个人被问题困扰,并认为有超自然力量在与他们对抗……这太荒谬了。

IMO,知道C能够使用人类有史以来最强大的工具之一来理解任何命令式语言并解决问题。


0

一个能力十足的程序员有很多技巧,其中包括:

1) 低级编程 ...至少C。一些集会不会受伤。

2) 函数式编程 ...一种纯函数式语言,而不是混合语言-Scheme在这里有效。

3)OOP ...通常我会说一句Smalltalk,但我想我们现在可以使用Java。


0

C是所有编程语言的母亲。...C方面的专业知识使您在很短的时间内就可以轻松了解Java之类的任何其他语言。

C ++是一种完全不同的球类游戏,并且是最复杂的。


0

不必学习C或C ++成为一名优秀的(优秀)程序员,但是有必要学习Assembly才能成为一名优秀的(优秀)程序员。出色的编程意味着可以跨存储器,Mhz,带宽,功率限制进行优化,然后选择最佳的设计和/或实现方式来完成手头的任务。在计算机科学家中,经过数十年的技术发展,最主要的缺点仍然是最佳地管理数据。这是通过编写汇编语言(任何汇编语言;可以是ARM或MIPS或x86,或者微控制器或DSP,甚至比通过verilog / VHDL还要低的语言)教授的一套技能。


0

我熟练地使用了c,c ++,assembly和Lisp,我想说要成为一名优秀的程序员,必须学习任何一种特定的语言都是没有意义的。我对成为一名优秀程序员的经验是能够以解决问题的方式思考。语言只是让您表达自己的问题解决能力。例如,C的简单性使您可以轻松地表达算法,而Lisp则允许您递归解决问题。因此,语言不会使您成为程序员。在成为一名优秀的程序员之前,您必须首先是一个解决问题的人。语言只是您用来解决问题的工具。


-1

仅仅对内存管理有深入的了解就值得很好地学习C。与C ++相同,但其目标是学习数据结构。


用来学习数据结构的语言并不重要。
kirk.burleson 2011年

我相信是因为在许多其他语言中使用了数据结构,却不知道它们如何在内存中处理。C ++(不使用STL)迫使程序员学习如何在底层处理数据结构。
AQUA

-1

不。有很多糟糕的程序员在编写C / C ++代码。使您成为一名优秀的程序员的原因是,您了解何时以及为什么需要使用C / C ++编写某些东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.