.NET开发人员是否真的应该花时间学习C以进行低级曝光?

时间:2020-03-06 14:38:48  来源:igfitidea点击:

当Joel Spolsky和Jeff Atwood在播客中就程序员是否应该学习C(无论他们的行业和交付平台如何)达成分歧时,在开发人员社区中引发了一场爆炸性的辩论,今天在某些群体中可能仍在争论不休。我一直在阅读许多程序员博客作者的相关文章。双方的论据无疑都具有分量,我没有发现的是,从仅关注.NET Framework的开发人员的角度来看,这种观点是独特的。几乎所有的人都在以一般程序员的观点发表评论。

我想知道什么?回想一下Jeff Atwood的观点,即在如此高水平的开发人员大部分时间将花费在学习业务/领域上,而不是学习实现这些领域要求的技术所需要的任何东西。根据我的工作经验,这非常准确地描述了许多人的工作生活。现在假设.NET开发人员可以花时间进行"课外"学习,那应该是C吗?

作为记录,我本人还是在学校里学过C的,我绝对可以理解和理解支持者的理由。但是,当仔细考虑时,我个人觉得.NET开发人员不应该直接研究C。因为,我希望更多开发人员需要一些时间来学习MSIL和CLR。

也许我不熟悉一群不寻常的同事,但我不知道,但是在我看来,很多人并没有意识到他们的Cor VB代码在JIT进入并成为原始机器代码之前首先在IL中进行编译。 。大多数人不了解IL,并且对CLR如何准确地处理他们编写的代码不感兴趣。通过Cwa读Jeffrey Richter的CLR令我感到震惊,在许多领域中,我感到震惊。尽管同事们认为它"水平太低",但我还是很高兴地阅读了它。我不是IL方面的专家,但了解基础知识之后,由于我已经熟悉IL的堆栈行为,因此发现自己更容易阅读他的文章。我发现自己正在拆卸汇编程序,以查看在编写某些代码时IL的结果。

我学习CLR和MSIL,因为我知道这是我下面的直接层。允许我执行自己的工作层的那一层。 C,实际上是进一步下降。更接近我们的"现实"的是CLR和MSIL。这就是为什么我建议其他人参加的原因,因为我看不到有足够的人深入研究这一层。或者,团队是否已经精通MSIL?

解决方案

CLR是一台虚拟机,因此,如果我们学到了所有内容,那么我们只会知道虚拟机上正在发生的事情。

学习C会在内存使用方面为我们提供有关物理机的更多信息,正如我们提到的,这是CLR在下面使用的内容。学习CLR的工作方式并不会像学习C那样使我们对垃圾回收有足够的了解。使用C,我们将真正理解内存管理中涉及的内容。

另一方面,学习CIL比通过学习C可以告诉我们更多有关.NET中执行的知识。尽管如此,IL在大多数情况下如何映射到机器语言仍然是一个谜,因此了解一些高级操作码,就像转换类型的转换一样,在大多数情况下都是不透明的,因此对于了解实际情况并没有帮助。但是,学习C和指针将启发我们一些方面的知识。

当然可以变得过于专业和专一(以及相应的市场技能有限)的最大方法是仅使用一种类型的语言,而将所有其他语言避免为"与当前任务无关"。

每个程序员都应该对现代的JIT OO语言(C#/ Java),较低级别的简单语言(C,FORTRAN等),非常高级的解释语言(Python,Ruby等)有一定的经验功能语言(方案,Lisp,Haskell等)。即使我们并非每天都使用所有这些知识,但是拓宽此类知识授予的思维过程还是非常有用的。

的确,C处于链的下方。了解MSIL可以帮助开发人员了解如何更好地优化其应用程序。至于学习C或者MSIL,为什么不两者都选? :)

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

C有点像具有更好语法的汇编语言,是一种很好地了解正在发生的事情的好方法(尽管有些事情仍然对我们隐藏)。

从另一端看,我认为每个人都应该了解Haskell或者Lisp之类的知识,以便对高级内容有所了解(并以更简洁的形式查看C3中引入的一些想法)

我认为必须学习某种编译语言和汇编语言。否则,我们将无法获得在语言和堆栈之间切换所需的多功能性。

更具体地说-我认为任何优秀/优秀的程序员都必须通过直接的经验来了解这些知识:

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

知道这些事情是使用我们了解的系统和大家知道的魔法工作的系统之间的区别。 :)

解决一些意见

我们最终将拥有两种不同类型的开发人员:

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

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

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

我觉得学习C是学习低级概念的好语言,而无需编写汇编代码。

但是我觉得从Haskell,python甚至可以说是正则表达式这样的语言中学习课程(不完全是一种语言,但是我们能理解我的意思吗?)与从C中收集的课程一样重要。

因此,我想说的是,如果这是我们所在的地区,请了解工作中的CLR和MSIL,并在业余时间尝试每隔一段时间选择一种不同的语言。如果今年恰好是C,对我们有好处,并喜欢玩指针;)

我已经知道C了,这在1.1天内帮助了我。在1.1天内,.NET基本库中还没有很多东西,因此我必须从Platform SDK中调用/调用某些东西。

我的看法是,我们应该始终分配时间来学习一些我们尚不了解的东西。要回答问题,我认为学习C并不是必需的,但是,如果我们有空闲时间,C是一种很好的学习语言,并且与其他语言一样有效。

我是这样想的:

  • 程序员可能实际上应该使用适当的高级语言进行工作。适当的选择取决于方案。设备驱动程序或者嵌入式系统与CRUD桌面应用程序或者网页位于不同的类中。
  • 我们希望程序员尽可能多地使用其所使用的语言进行练习。
  • 由于大多数程序员最终都会在通用桌面和Web应用程序上工作,因此我们希望编程学生在上学期间尽快进入更高层次的语言。
  • 但是,高级语言掩盖了一些基本的编程问题,例如指针。如果我们也运用适用于学生的原则,那么这些高级语言可能不适合一年级学生。这就排除了Java,.Net,Python和许多其他工具。
  • 因此,学生在开学的第一到两年中应该使用C(或者更好的C:C ++,因为它是"高级",并且涵盖了大多数相同的概念)来涵盖基本概念,但是要迅速使用高级语言来学习尽早启用更困难的程序。

如果我们认为自己是程序员,我会说是,学习C。

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

如果我们花费一整天的时间进行编程或者考虑编程,并且打算使整个职业都围绕着编程进行,那么最好确保我们了解自己的知识。学习C语言可能会建立知识基础,如果我们要深入了解编程技能,这将很有帮助。

有了一切,就需要权衡取舍。我们学习的语言越多,投入技术的时间越多,学习其他技能的时间就越少。例如,学习C或者阅读有关项目管理的书会更好吗?这取决于目标。我们想成为最好的EVAR程序员吗?学习C。花费大量时间编写代码并将自己奉献给技术。我们是否想管理别人而不是整天编码?利用我们将花费的时间进行编程,并找到提高软技能的方法。

.NET开发人员应了解CLR。但是他们也应该学习C。我看不出没有对裸机上发生的事情有一些低级的了解,没有人能真正理解CLR的工作方式。

花时间学习高级概念肯定是有益的,但是如果我们过多地专注于高级而以低级为代价,则可能会成为那些可以在白板上绘制框和线的"建筑师"之一但是谁也无法编写任何实际代码。

通过学习C所学的知识将对职业生涯的其余部分很有用。随着Microsoft更改其平台,我们对CLR的了解将变得过时。

.net开发人员应该学习C吗?我会说"不一定",但是我们应该总是在专业百力威之外尝试某种语言,因为每种语言都带来了一种新的问题思考方式。在从事.net(以及之前的VB 2-6)开发人员的职业生涯中,我用Pascal,LISP,C,C ++,PHP,JavaScript,Ruby和Python编写了小型项目,目前正在Lua和Perl。

除了C ++,我没有在简历中列出任何人,因为我不希望成为其中的专业人员。取而代之的是,我从每个主题中带回有趣的想法,以便在基于.net的工作中使用。

C确实很有趣,因为它确实使我们接近操作系统,但这并不是成为一名优秀程序员所需的唯一知识。

我看不出他们为什么要这么做。 Java和Cwe等语言经过精心设计,因此我们不必担心底层细节。这就像询问WinForms开发人员是否应该花时间学习Win32 API一样,因为这就是下面的情况。

虽然学习起来并没有什么坏处,但我们可能会需要花费更多的时间来学习自己熟悉的语言和平台,从而获得更多收益,除非非常需要学习底层技术细节。

是学习C还是MSIL的问题,还是更根本的问题?我要说的是,一般而言,更多的开发人员可以站在这里学习有关物理或者虚拟计算机如何工作的更多信息。一个人只要了解一个盒子里的语言和API就可以成为一个称职的程序员。为了使专业更上一层楼,我觉得开发人员确实需要了解整个堆栈。不一定要详细介绍,但要有足够的概括性来帮助解决问题。

通过学习更多有关编译器和语言设计的知识,可以在这里谈论很多这些技能。我们可能需要学习C才能做到这一点(糟糕透顶),但是编写编译器是学习C的一个很好的背景。SteveYegge在他的博客中谈到了这一点,在这一点上,我基本上同意他的观点。我在大学里编写的编译器课程是我参加过的最令人大开眼界的课程之一,我真的希望它是200级课程,而不是400级课程。

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

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

  • 学习足够的汇编程序,以将两个数字加起来并在控制台上显示结果。我们将对计算机的实际运行情况有一个更好的了解,这对于我们为什么使用二进制/十六进制是有意义的。 (这可以在一天内完成,也可以使用cmd.exe中的调试完成)。
  • 学习足够的C语言,以分配一些内存并使用指针。一个简单的链表就足够了。 (可以在一两天内完成)。
  • 花更多时间学习将要使用的语言。我会让兴趣引导我们使用哪种语言(C#,Java,Ruby,Python等)。

为了在编写C#方面有足够的高级,即使我们没有学习适当的语言,也需要了解C中的概念。

不过,更一般而言,如果我们对任何技能都很认真,那么我们应该知道在主要工作水平以下至少一个抽象水平上发生了什么。

  • jQuery中的编码应与对JavaScript的理解相结合
  • 设计电路需要了解物理
  • 任何优秀的篮球运动员都会了解肌肉,骨骼和营养
  • 小提琴手将学习松香,摩擦,弓毛,细绳和木材干燥之间的相互作用