35

这个问题似乎已经解决了,甚至被打死了。聪明的人在这个问题上说过聪明的话。要成为一名真正优秀的程序员,您需要了解 C 语言

还是你?

这周我开悟了两次。第一个让我意识到我的假设并没有超出我在它们背后的知识,并且考虑到在我的机器上运行的软件的复杂性,这几乎不存在。但真正让它回家的是这条 Slashdot 评论

最终结果是,我注意到传统 C“裸机”程序员认为实现更高级别语言的许多天真的方式。他们在他们影响的项目中做出糟糕的“优化”决策,因为他们不知道编译器是如何工作的,也不知道一个好的运行时系统与他们理解的幼稚的宏汇编器模型有多大不同。

然后它击中了我:C 只是另一种抽象,就像所有其他抽象一样。甚至CPU 本身也只是一个抽象!我只是从未见过它破裂,因为我没有测量它的工具。

我很困惑。我的思想是否像 Dijkstra 所说的 BASIC 那样被肢解得无法恢复?我是否生活在过早优化的持续状态中?既然我意识到我对任何事情一无所知,我还有希望吗?有什么要知道的吗?为什么它如此令人着迷,以至于我在过去五年中所写的所有内容都可能根本上是错误的?

总结一下:比 API 文档告诉我的更多有什么价值吗?

编辑:制作CW。当然,这也意味着现在您必须发布解释器/运行时优化的示例,比我们做得更好:)

4

19 回答 19

38

无论是了解 C 还是了解实现的底层细节都不会伤害到您——它们本身。如果你始终如一地从低级细节的角度思考和工作,即使它不合适,也会伤害你。

古语是“真正的程序员可以用任何语言编写 FORTRAN”。如果你用 C 做同样的事情,这不是一个改进。如果你在写 Lisp,那就写 Lisp。如果您正在编写 Python,请编写 Python。对 C 来说合适和合理的东西不适用于其中任何一个(或许多其他任何一个)。

一个优秀的程序员需要能够在许多不同的抽象级别上进行思考,并且(更重要的是)识别和应用适合手头任务的抽象级别。

了解 C 的抽象级别并没有什么坏处。对替代品的无知可以(并且将会)。

于 2010-05-21T14:05:36.680 回答
20

知识无害。曾经。那些用高级语言编写糟糕代码的人是因为他们没有正确掌握高级语言,糟糕的开发人员。

于 2010-05-21T13:49:18.250 回答
12

对于一个糟糕的开发人员来说,任何类型的知识都可能是危险的。

对于优秀的开发人员来说,任何类型的知识都是一种资产。

于 2010-05-21T14:34:35.353 回答
7

使用语言——自然(口语)或人工(编程)——需要大脑以某种方式适应。每种语言都有自己的语法、自己的词汇表 (API) 等。如果您主要是 Java 程序员并切换到 Ruby,那么您至少会遵循 Java 程序员的思维模式,如果不编写基本的 Java 代码红宝石。在您开始对新环境(Ruby 语法、Ruby API)感到自在并开始编写Ruby代码之前,您需要付出一些努力和练习。

所以,这个过程是完全正常的,以前模式的任何不利影响都是非常短暂的。更重要的是,你学习的每一种语言都能拓宽你的视野,让学习下一种语言变得更容易。旅行愉快。:]

于 2010-05-21T14:03:05.773 回答
6

编程与编程语言无关。它是关于解决问题的。用于解决问题的工具恰好是编程语言。你不是写代码来写代码,你写代码是为了执行它并解决问题。

你越了解你的工具,你就能更好、更快地解决问题。但是,当您尝试用锤子将螺丝钉入木头时,您会遇到严重的麻烦,但软件有一个很好的特性:对于任何给定的问题,都有无数种不同的解决方案。

因此,完全有可能编写一个锤子,以这样的角度击打螺丝,螺丝会告诉木头在自己身上打一个洞,以便螺丝适合。然后你可以把它藏在一个按钮后面,用户不会甚至不需要知道锤子到底是什么。

虽然它不是最有效的解决方案,但它仍然是一个有效且有效的解决方案。当您使用您使用的工具变得更好时,您最终会发现在 API 不提供时如何编写螺丝刀。

您知道的工具越多,知道如何解决任何问题的方法越多,您拥有的选择就越多,您对使用哪种解决方案的决策就越好。为工作选择正确的工具。但是,当您不知道这些工具和可能的解决方案时,您怎么能做到呢?

于 2010-05-21T14:31:31.613 回答
4

扩展其他人的评论......虽然我不确定我是否相信关于自然语言的 http://en.wikipedia.org/wiki/Whorfian_hypothesis">Whorfian 假设,但它显然是正确的编程。你知道的语言会影响你解决问题的方式。两个例子:

1)我多年前的一位教授:他试图找出他的字符串数组中是否有任何重复项。这是在 70 年代,所以他在 FORTRAN 中写了这个。他的蛮力 n^2 实施时间太长了。于是,他和一个朋友谈了起来。他的朋友知道 PL1(我认为是,也许是 APL),它有一个排序运算符。所以,在那种语言中,你学会了对事物进行分类,以及它有多么有用,因为它很容易。朋友先想出了明显的排序,再看相邻元素算法。快得多,而且我的 FORTRAN 写作教授也不会想到,即使它在 FORTRAN 中完全可以实现。

2) 当我读研究生的时候,我有一个物理研究生的室友。他去了麻省理工学院,只上了一门编程课,当然是Scheme。有一天,我在他的办公室停下来,他说:“嘿,Brian,你能看一下这段代码,告诉我它是否应该工作吗?” 这是一个分类程序。我看了看它,说它不可能工作,因为它显然是冒泡排序,但它只有一个循环(不,它不是一个时髦的循环,如果你生病了,你可以用它来写冒泡排序扭曲)。所以,我这么说。他回答说:“哦,但它在底部有一个递归调用!” 我从来没有想过要写一个递归冒泡排序。但更重要的是,他永远不会想到编写一个非递归函数!

关键是您所知道的语言在很大程度上决定了您将编写的代码类型。你知道的语言越多,你拥有的工具就越多,而且更多的工具永远不会坏,只要你知道什么时候使用它们......

于 2010-05-21T14:54:48.390 回答
3

要成为一名真正优秀的程序员,您需要了解 C。

我同意这一点。

但我也同意,要成为一名真正优秀的程序员,你必须真正知道如何用另一种语言编写代码(而不是如何用另一种语言编写 C 代码)。

于 2010-05-21T14:12:44.203 回答
3

了解 C 不会损害代码的质量,但肯定会知道“只有 C”

于 2010-05-21T16:41:50.683 回答
2

了解不同的语言是一种资产。了解编译器和解释器的构建方式也是一项资产。最后,每个程序员都应该花一些时间在汇编语言上来欣赏高级语言。:-)

在我的大学里,我们参加了一门“编程语言”课程,其中我们学习了 LISP、SNOBOL 和 ADA。在解决编程问题时,这些语言让您对不同的概念思维敞开心扉。总结是选择最适合问题的语言。

了解一门编程语言只是基础。如果我不知道其他相关主题,我的职业生涯不会走得很远:数据结构、算法、线性代数、布尔代数、微处理器设计和通信(人与人之间)。任何人都可以拿起一本书,学习一门语言并称自己为程序员。将熟练的开发人员与普通开发人员区分开来的是其他技能。

学习一门编程语言。学好它,这样你就可以将更多的脑力集中在手头的其他任务上。您不应该经常参考编程手册。我的大部分注意力都集中在任务要求以及算法和数据结构上,以在最短的时间内正确实现它。

于 2010-05-21T18:28:54.807 回答
2

不。

如果你失去了了解和改进的愿望,尽管你受到了伤害。

于 2010-05-21T13:50:53.927 回答
2

软件工程是关于理解抽象以及如何使用抽象来有效地解决问题(有效地意味着更低的成本、更快的性能或最短的功能交付时间表。)理解 C 只是对我们使用的抽象层的另一种见解一天,“放大”到这种细节水平所需的技能是有价值的,只要您在必要时也发展“缩小”技能。该技能集将在该学科的各个方面为您提供良好的服务,无论是设计对象模型、设置干净的功能组合,甚至只是为了清晰和可维护性而构建单独的方法。

于 2010-05-21T14:38:14.283 回答
1

学习 C(或任何语言)可能会伤害程序员,这似乎取决于您在学习 C 后无法学习任何东西。这里的教训应该是不要停止学习。此外,不要假设任何其他语言或技术都必须像 C(或您最喜欢的 C 编译器)一样工作。

也就是说,我认为学习 C 语言可能是了解硬件如何工作以及机器中实际发生的情况的好方法。我看不出知道这会如何以任何方式伤害你。我不认为无知有任何好处(除非它们是偶然的)。我承认学习 C 并不是了解机器的唯一方法,但这只是一种方法。

于 2010-05-27T22:58:04.970 回答
1

简短而甜蜜:

要成为一名优秀的程序员,您需要能够以有组织的方式进行思考。C 或 LUA 或 Java,等等。

于 2010-05-21T14:20:22.003 回答
1

不,了解一种编程语言的多种实现只能帮助您更好地理解这些抽象。

问题是您接受一个是最好的抽象,这将导致您无法成功使用您认为较小的其他抽象。

每个抽象都是根据特定的不同目标设计的,请选择最适合您需求的抽象。了解 Linux 是否会使了解 Windows 或 Mac OS 变得更加困难?它的接受,他们是不同的。

于 2010-05-21T13:56:48.610 回答
1

这里真正的问题是假设。那些其他开发人员假设他们知道它是如何工作的。假设是魔鬼,无论是来自认为自己已经搞清楚的经验丰富的开发人员,还是来自认为自己已经搞清楚的新手。

至少,这就是我在这里假设的

于 2010-05-21T16:17:34.560 回答
1

学习C是件好事。尝试用高级语言编写 C 代码是一件坏事。

于 2010-05-22T03:58:33.290 回答
1

只有在真正不需要时将这些知识应用于更高级别的语言才会受到伤害。当然,在编写自己的集合类方面有一些低级 C 经验,我也可以在 Java 中做到这一点。但它会是现有 Collections 库(Java API 作为 Commons Collections 的附加功能)的更好替代方案吗?也许。

在实践中,您必须计算所投入的时间是否值得。

事实上,您应该在破解您的代码之前简单地进行研究。看看您尝试做的事情是否可以使用内置或 3rd 方工具来完成。如果可以,请查看内置或 3rd 方工具是否能满足您的需求,以及它们是否表现良好。如果他们不这样做,请找出原因。如果他们/真的/不这样做,请重写。

正如其他人所说,所有知识都是值得的。我的意思是 /all/ - 低级优化的 C 代码,作为对开发良好的库的高级调用。如果您两者都知道,您将知道何时使用哪一个以及为什么使用。

于 2010-05-21T14:39:54.203 回答
0

理解多种语言/框架和编程范式永远不会受到伤害——它应该是有益的。

重要的是要了解您当前正在使用的语言/框架/环境,以了解做出实施选择的含义。在这里,使用其他语言获得的知识可能会让您看到更广泛的可能性——但您必须根据您当前的环境评估这些可能性。

真正让自己陷入困境的人是那些学习了某种语言,例如 C,然后用 C 来学习另一种语言,而不是根据它自己的优点、优点和缺点来学习它(有点像拿着锤子的勤杂工作为他唯一的工具——所有问题对他来说都像是钉子)。

于 2010-05-21T14:33:02.250 回答
0

例如,了解 C,然后使用我最喜欢的高级语言 (Python) 工作,这就是为什么我发现了解 C 很有帮助的一个例子。

了解 C,当我使用 Python 时,会在以下几个方面有所帮助:

(a) 我感谢 Python 的列表、字典和内置类型,因为它使在一行代码中重复地做某事变得容易,这需要我选择一些代码库,学习它并链接到它(哈希表,数据结构等),并避免用它击中自己的脚。

(b) Python 是用 C 编写的。作为一名 C 程序员也意味着,如果 Python 让我完成了 99% 的任务,但一些额外的抽象在 python 中可能很方便,我可以用 Python 编写那个抽象。我可以查看 CPython 解释器的源代码并了解内部发生的情况。实际上,作为一名 Python 程序员,我仍在使用基于 C 语言构建的东西。因此,知道语言仍然是有价值的。

我上面所说的一切也适用于使用 Perl、Ruby 和 PHP 的人。

于 2010-05-21T15:58:01.587 回答