14

当 Joel Spolsky 和 ​​Jeff Atwood 在他们的播客中开始就程序员是否应该学习 C 产生分歧时,无论他们的行业和交付平台如何,它在开发人员社区内引发了一场相当爆炸性的辩论,今天可能仍在某些群体中肆虐。我一直在阅读一些程序员博主的文章,他们对此事的看法。双方的论点当然很重要,但我没有发现从只专注于 .NET Framework的开发人员的角度来看,这是一个独特的视角。几乎所有人都在评论一般程序员的观点。

我想达到什么目的?回想一下 Jeff Atwood 的观点,即处于如此高水平的开发人员将花费的大部分时间都花在学习业务/领域上,而不是学习满足这些领域需求的技术所需的一切。以我的工作经验,这是对许多工作生活的非常准确的描述。现在假设 .NET 开发人员可以花时间进行“课外”学习,应该是 C 吗?

作为记录,我自己在学校就学过 C,我完全可以理解和欣赏支持者的推理。但是,仔细考虑之后,我个人认为 .NET 开发人员不应该直接研究 C。因为,我希望更多的开发人员花一些时间来学习 - MSILCLR

也许我被一群不寻常的同事困住了,我不知道,但在我看来,很多人并没有意识到他们的 C# 或 VB 代码在 JIT 进入并使其成为原始机器之前首先在 IL 中编译代码。大多数人不了解 IL,并且对 CLR 如何准确处理他们编写的代码不感兴趣。通过 C#阅读 Jeffrey Richter 的CLR在很多方面都让我感到震惊。很高兴我读了它,尽管同事们认为它“水平太低”。我不是 IL 专家,但有了基础知识,我发现自己更容易理解他的文字,因为我已经熟悉了 IL 的堆栈行为。我发现自己在反汇编程序集,以查看当我编写某些代码时 IL 的结果。

我学习 CLR 和 MSIL 因为我知道那是我下面的直接层。允许我执行自己的工作的层。C,实际上是进一步下降。更接近我们“现实”的是CLR和MSIL。这就是为什么我会建议其他人尝试这些,因为我没有看到足够多的人深入研究这一层。或者,您的团队是否已经全部熟悉 MSIL?

4

15 回答 15

35

你当然应该。变得过度专业化和专心致志(并且相应地,具有有限的适销技能)的最好方法是只使用一种类型的语言并避开所有其他“与您当前的任务无关”的语言。

每个程序员都应该对现代 JIT 的 OO 语言(C#/Java)、较低级别的简单语言(C、FORTRAN 等)、非常高级的解释语言(Python、Ruby 等)和函数式语言(Scheme、Lisp、Haskell 等)。即使您不每天都使用它们,这些知识所赋予的拓宽您的思维过程也是非常有用的。

于 2008-09-24T07:19:31.307 回答
6

我已经知道 C,这在 1.1 天帮助了我,在 .NET 基础库中还没有很多东西,我必须从 Platform SDK 中 P/Invoke 一些东西。

我的看法是,我们应该总是分配时间来学习我们还不知道的东西。为了回答你的问题,我认为学习 C 对你来说不是必须的,但如果你有空闲时间,C 是一种很好的学习语言,并且与其他任何语言一样有效。

于 2008-09-24T07:50:26.240 回答
5

诚然,C 远低于链条。了解 MSIL 可以帮助开发人员了解如何更好地优化他们的应用程序。至于学习 C 或 MSIL,为什么不两者兼而有之?:)

于 2008-09-24T07:19:54.163 回答
4

.NET 开发人员应该了解 CLR。但他们也应该学习 C。如果不了解裸机上发生的情况,我看不出任何人如何真正理解 CLR 的工作原理。

花时间学习更高层次的概念当然是有益的,但如果你过多地专注于高层而忽略了低层次,你就有可能成为那些可以在白板上画框和线的“架构师”之一但是谁无法编写任何实际代码。

你通过学习 C 所学到的东西将对你的职业生涯的剩余部分有用。随着微软改变他们的平台,你对 CLR 的了解将变得过时。

于 2008-09-24T13:56:26.830 回答
3

我的看法是学习一些编译语言和汇编是必须的。否则,您将无法获得在语言和堆栈之间切换所需的多功能性。

更具体地说——我认为任何优秀/伟大的程序员都必须通过直接经验了解这些事情:

  • 寄存器和变量有什​​么区别?
  • 什么是 DMA?
  • 如何将像素放在屏幕上(低电平)?
  • 什么是中断?
  • ...

了解这些事情是使用您了解的系统和使用您所知道的通过魔术工作的系统之间的区别。:)

解决一些评论

您最终会拥有两种不同类型的开发人员:

  • 可以用一种或两种语言以 10 种方式做一件事的人
  • 可以用 10 种不同语言以一种或两种方式做一件事的人

我强烈认为第二组是整体上更好的开发人员。

于 2008-09-24T07:25:31.713 回答
3

我是这样想的:

  1. 程序员可能实际上应该使用适当的最高级别语言工作。什么是合适的取决于你的场景。设备驱动程序或嵌入式系统与 CRUD 桌面应用程序或网页属于不同的类。
  2. 您希望您的程序员尽可能多地练习他们所使用的语言。
  3. 由于大多数程序员最终都在使用通用桌面和 Web 应用程序,因此您希望编程学生在学校期间尽快进入更高级别的语言。
  4. 然而,高级语言混淆了一些基本的编程问题,比如指针。如果我们也应用我们的使用适合学生的原则,那些高级语言可能不适合一年级学生。这抛出了 Java、.Net、Python 和许多其他语言。
  5. 所以学生应该在学校的第一年或第二年使用 C(或者更好:C++,因为它是“更高级别”并且涵盖大部分相同的概念)来涵盖基本概念,但很快就会升级到更高级别的语言来学习更早地启用更困难的程序。
于 2008-09-24T13:44:25.347 回答
3

为了在编写 C# 方面足够先进,您需要了解 C 中的概念,即使您没有正确学习该语言。

不过,更一般地说,如果您对任何技能都很认真,您应该知道在您的主要工作级别之下至少一个抽象级别发生了什么。

  • 使用 jQuery 编码应该与对 JavaScript 的理解相结合
  • 设计电路需要了解物理学
  • 任何优秀的篮球运动员都会了解肌肉、骨骼和营养
  • 小提琴手将了解松香、摩擦、弓毛、弦和木材干燥度的相互作用
于 2009-11-04T19:30:33.160 回答
2

我喜欢每年学习一门新语言。不一定要掌握它,而是强迫我的大脑以不同的方式思考。

我觉得学习 C 是一种很好的语言,可以学习低级概念,而无需在汇编中进行编码。

然而,我觉得从 Haskell、python 甚至可以说是正则表达式(不完全是一种语言,但你明白我的意思吗?)等语言中学习课程与从 C 中收集的课程一样重要。

所以我说,如果那是您所在的地区,请在工作中了解 CLR 和 MSIL,并在您的业余时间尝试每隔一段时间学习一次不同的语言。如果今年恰好是 C,对你有好处,喜欢玩指针;)

于 2008-09-24T07:28:24.453 回答
2

我看不出他们应该有什么理由。Java 和 C# 等语言的设计使您不必担心底层细节。这就像询问 WinForms 开发人员是否应该花时间学习 Win32 API 一样,因为这就是下面发生的事情。

虽然学习它并没有什么坏处,但您可能会从花更多时间学习您熟悉的语言和平台中获得更多收益,除非非常需要学习低级技术细节。

于 2008-09-24T17:15:01.190 回答
1

学习 MSIL 并不是一个坏主意,但在某种程度上,它只是另一种 .NET 语言,但语法很糟糕。不过,它是另一层,我认为人们至少应该对所有层有一些模糊的理解。

C 有点像具有更好语法的汇编语言,是一种很好的方式来了解在相当低的级别上发生的事情(尽管有些事情仍然对你隐藏)。

另一方面,我认为每个人都应该了解一些类似 Haskell 或 Lisp 的知识,以了解更高级的东西(并以更简洁的形式看到 C# 3 中引入的一些想法)

于 2008-09-24T07:24:53.027 回答
1

如果你认为自己是一名程序员,我会说是的,学习 C。

许多编写代码的人并不认为自己是程序员。我可能每天工作 3 个小时编写 .NET 应用程序,但我不给自己贴上“程序员”的标签。我做了很多与编程无关的事情。

如果你整天都在编程或思考编程,并且你打算让你的整个职业生涯都围绕着编程,那么你最好确保你知道你的东西。学习 C 可能有助于建立一个知识基础,如果您要深入了解编程技能,这将很有帮助。

对于任何事情,都有取舍。你学习的语言越多,你花在技术上的时间越多,你学习其他技能的时间就越少。例如,学习 C 或阅读有关项目管理的书籍会更好吗?这取决于你的目标。你想成为最好的程序员EVAR?学习 C。花费数小时编写代码并全身心投入到这门手艺中。你曾经想管理别人而不是整天编码吗?利用您将投入编程的时间并找到提高您的软技能的方法。

于 2008-09-24T13:54:55.787 回答
1

.net 开发人员应该学习 C 吗?我会说“不一定”,但我们应该始终涉足我们专业范围之外的某种语言,因为每种语言都会带来一种思考问题的新方式。在我作为 .net(以及在此之前,VB 2-6)开发人员的职业生涯中,我用 Pascal、LISP、C、C++、PHP、JavaScript、Ruby 和 Python 编写了一些小项目,目前正在涉足 Lua 和珀尔。

除了 C++,我没有在我的简历中列出任何一个,因为我不想成为其中任何一个的专业人士。相反,我从他们每个人那里带回有趣的想法,用于我基于 .net 的工作中。

C 语言的有趣之处在于它确实让您接近操作系统,但这并不是成为一名优秀程序员所需了解的唯一级别。

于 2008-09-24T17:05:25.737 回答
0

CLR是一个虚拟机,所以如果您只了解这些,那么您只知道在虚拟级别发生了什么。

就内存使用而言,学习C将教你更多关于物理机器的知识,正如你所提到的,这是 CLR 在下面使用的。学习 CLR 的工作原理不会像学习 C 那样让您对垃圾收集等方面有更多的了解。使用 C 语言,您会真正体会到内存管理所涉及的内容。

另一方面,学习CIL比学习C更能告诉您在 .NET 中的执行。尽管如此,在很大程度上, IL如何映射到机器语言仍然是一个谜,因此了解一些高级操作码,比如用于转换类型的操作码,对于理解它们的实际情况并没有太大帮助。大部分是不透明的。然而,学习C和指针会在其中一些方面对您有所启发。

于 2008-09-24T07:19:23.587 回答
0

问题是学习 C 还是 MSIL,还是更基础?我想说的是,一般来说,更多的开发人员可以更多地了解计算机(物理的或虚拟的)是如何工作的。一个人只需了解一种语言和 API 就可以成为一个相当称职的程序员。为了让这个职业更上一层楼,我觉得开发人员真的需要了解整个堆栈。不一定要详细,但要足够概括以帮助解决问题。

这里讨论的很多这些技能可以通过更多地了解编译器和语言设计来获得。您可能需要学习 C 才能做到这一点(哎呀,偷偷摸摸),但是编译器编写是学习 C 的绝佳环境。Steve Yegge在他的博客上谈到了这一点,我在这一点上基本同意他的观点。我在大学里的编译器写作课程是我上过的最让人大开眼界的课程之一,我真希望它是一门 200 级的课程,而不是 400 级的课程。

于 2008-09-24T17:27:15.293 回答
0

我在另一个线程上发布了这个,但它适用于:

我相信你需要一个良好的基础,但将大部分时间花在学习你将使用的东西上。

  • 学习足够的汇编程序将两个数字相加并在控制台上显示结果。您将对计算机实际发生的事情有更好的理解,并且我们为什么使用二进制/十六进制是有意义的。(这可以在一天内完成,并且可以通过cmd.exe 进行调试)。
  • 学习足够多的 C 语言必须分配一些内存并使用指针。一个简单的链表就足够了。(这可以在一两天内完成)。
  • 花更多时间学习你将要使用的语言。我会让你的兴趣引导你进入哪种语言(C#、Java、Ruby、Python 等)。
于 2008-09-24T18:07:40.953 回答