代码之家  ›  专栏  ›  技术社区  ›  icelava

.NET开发人员真的应该花时间学习C以获得低级别的曝光吗?

il clr c
  •  15
  • icelava  · 技术社区  · 16 年前

    当Joel Spolsky和Jeff Atwood在他们的播客中开始就程序员是否应该学习C(不管他们的行业和交付平台如何)产生分歧时,它在开发人员社区引发了一场爆炸性的辩论,这场辩论可能在今天的某些群体中仍然激烈。我读过很多程序员博客的文章,他们对这个问题的看法。双方的论据当然很有分量,我没有发现两个观点都是从 开发人员只关注.NET框架 . 实际上,他们所有人都是站在程序员的立场上评论的。

    我想知道什么?回想一下Jeff Atwood的观点,在如此高的水平上开发人员将花费大量的时间来学习 业务/领域 在学习实现这些领域需求所需的技术的基础上。在我的工作经历中,那是对许多人工作生活的一个非常准确的描述。现在假设.NET开发人员可以为“课外”学习腾出时间,应该 那个 是C?

    作为记录,我自己在学校里学过C,我完全可以理解和欣赏支持者的推理。但是,当思考问题时,我个人认为.NET开发人员不应该直接进入C语言,因为我希望更多的开发人员需要一些时间来学习- 密西尔 CLR .

    也许我和一群不寻常的同事困在一起,我不知道,但在我看来,很多人不守信用。 有意识的意识 他们的C或VB代码在JIT进入并使其成为原始机器代码之前首先在IL中编译。大多数人不了解IL,对如何 确切地 clr处理他们编写的代码。读杰弗里·里克特的 通过C语言实现CLR 在很多方面对我来说都是个打击;很高兴我读到了它,尽管同事们认为它“太低了”。我不是IL的专家,但是有了基础知识,我发现自己更容易跟随他的文本,因为我已经熟悉了IL的堆栈行为。我发现自己正在分解程序集,以便在编写特定代码时了解IL的结果。

    我学习clr和msil是因为我知道这是直接层 在我下面 . 允许我执行自己的工作层。C,实际上在更深处。更接近我们“现实”的是clr和msil。这就是为什么我会建议其他人去尝试这些,因为我没有看到足够多的人去钻研那个层。或者,你的团队已经都熟悉MSIL了吗?

    15 回复  |  直到 14 年前
        1
  •  6
  •   jop    16 年前

    我已经知道C了,这在1.1天的时间里对我有所帮助,在1.1天的时间里,.NET基本库中还存在很多东西,我必须从Platform SDK中P/Invoke一些东西。

    我的看法是,我们应该分配一段时间来学习我们还不知道的东西。为了回答你的问题,我认为学习C对你来说并不重要,但是如果你有时间的话,C是一种好的学习语言,和其他语言一样有效。

        2
  •  35
  •   Dark Shikari    16 年前

    你当然应该。过度专业化和专心致志(相应地,拥有有限的市场技能)的最好方法是只使用单一类型的语言,而将所有其他语言视为“与当前任务无关”。

    每一个程序员都应该有一个现代JIT OO语言(C.A/JAVA)的经验,一个较低层次的简单语言(C,FORTRAN等),一个非常高级的解释语言(Python,Ruby等)和一个函数语言(方案,Lisp,Haskell等)。即使你不是每天都使用它们,扩展你的思维过程,使之成为知识的赠款也是非常有用的。

        3
  •  5
  •   cruizer    16 年前

    是的,C在链条下面。了解MSIL可以帮助开发人员更好地了解如何优化他们的应用程序。至于学习C或MSIL,为什么不同时学习?:)

        4
  •  4
  •   Kristopher Johnson    14 年前

    .NET开发人员应该了解clr。但他们也应该学习C。我不明白,如果没有对裸金属上发生的事情的一些低级理解,任何人都无法真正理解CLR是如何工作的。

    花时间学习更高层次的概念当然是有益的,但是如果你花太多精力在高层次上,而牺牲了低层次,你就有可能成为一个“架构师”的人,他们可以在白板上画出框和线,但却无法编写任何实际的代码。

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

        5
  •  3
  •   Sklivvz    16 年前

    我认为学习一些编译语言和汇编是 必须 . 如果没有这一点,您将无法获得在语言和堆栈之间切换所需的多功能性。

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

    • 寄存器和变量的区别是什么?
    • 什么是DMA?
    • 如何在屏幕上放置像素(低级别)?
    • 什么是中断?

    了解这些是与你的系统一起工作的区别 理解 还有一个系统,据你所知,是靠魔法运作的。:)

    提出一些意见

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

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

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

        6
  •  3
  •   Joel Coehoorn    16 年前

    我这样想:

    1. 程序员应该 工作 用最高级的语言。什么是合适的取决于你的场景。设备驱动程序或嵌入式系统与CRUD桌面应用程序或网页位于不同的类中。
    2. 你希望你的程序员在他们工作的语言中有尽可能多的练习。
    3. 由于大多数程序员最终都在使用通用的桌面和网络应用程序,所以你希望在学校里,编程学生能尽快地使用更高级的语言。
    4. 但是,高级语言会混淆一些基本的编程问题,比如指针。如果我们也采用适合学生的语言,那么这些高级语言可能不适合一年级学生。这就抛出了Java、.NET、Python和许多其他。
    5. 因此,学生应该使用C(或者更好的是:C++,因为它是“更高级别的”,并且覆盖了大多数相同的概念),在第一年或两年的学校里覆盖基本概念,但是很快地移动到更高级的语言,以使更难的程序更早。
        7
  •  3
  •   Dinah SLaks    15 年前

    为了在写作C方面有足够的进步,你需要理解C中的概念,即使你没有正确地学习语言。

    不过,一般来说,如果你认真考虑 任何 技能,您应该知道在低于您的主要工作级别的至少一个抽象级别上发生了什么。

    • jquery中的编码应该与对javascript的理解相匹配。
    • 设计电路需要了解物理学
    • 任何一个优秀的篮球运动员都会学到肌肉、骨骼和营养。
    • 小提琴手将学习松香、摩擦、弓毛、弦和木材干燥的相互作用。
        8
  •  2
  •   Jim Burger    16 年前

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

    我觉得学习C是一种很好的语言,可以学习低层次的概念,而不需要在汇编中编写代码。

    然而,我觉得从诸如haskell、python甚至可以说是regex(不完全是一种语言,但你明白我的意思吗?)与从C中吸取的教训一样重要。

    所以我说,如果这是你的工作领域,那就学习一下工作中的clr和msil,在你的业余时间,试着每隔一段时间学习一种不同的语言。如果今年正好是C,那对你有好处,并且喜欢玩指点球;)

        9
  •  2
  •   ilitirit    16 年前

    我看不出他们为什么要这样做。像Java和C语言这样的语言是为了不必担心低级细节而设计的。这与询问WinForms开发人员是否应该花时间学习win32 api相同,因为这就是下面发生的事情。

    虽然学习它不会造成伤害,但是如果不需要学习低级的技术细节,花更多的时间学习您熟悉的语言和平台,您可能会获得更多。

        10
  •  1
  •   Khoth    16 年前

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

    C语言有点像汇编语言,语法更好,这是一个很好的方法来了解在相当低的层次上发生的事情(尽管有些事情仍然对您隐藏)。

    从另一方面来说,我认为每个人都应该知道一些像haskell或lisp这样的东西,以获得更高层次的东西的想法(并看到一些想法以更干净的形式在c 3中被引入)

        11
  •  1
  •   community wiki Jim    16 年前

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

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

    如果你花了一整天的时间来编程或者思考编程,而你的整个职业生涯都围绕着编程展开,那么你最好确定你了解你的东西。学习C很可能有助于建立一个知识基础,如果你要深入学习编程技能的话,这将是很有帮助的。

    凡事都有权衡。你学习的语言越多,花在技术上的时间越多,你学习其他技能的时间就越少。例如,学习C或阅读有关项目管理的书籍会更好吗?这取决于你的目标。你想成为最好的程序员吗?学习C。花几个小时写代码,全身心地投入到这个过程中。你想管理别人而不是整天编码吗?利用你花在编程上的时间,找到提高你的软技能的方法。

        12
  •  1
  •   Yes - that Jake.    16 年前

    .NET开发人员应该学习C吗?我会说“不一定”,但我们应该总是在我们的专业领域之外涉猎一些语言,因为每种语言都会带来一种新的思考问题的方式。在我的职业生涯中,作为.NET(在那之前,VB2-6)开发人员,我在PASCAL、LISP、C、C++、PHP、JavaScript、Ruby和Python和AM中写了小项目,目前正在Lua和Perl中涉猎。

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

    C的有趣之处在于它确实能让你接近操作系统,但这并不是你成为一名优秀程序员所需要知道的唯一一个层次。

        13
  •  0
  •   Mark Cidade    16 年前

    这个 CLR 是一个 事实上的 如果这就是你所学的,那么你只知道在虚拟层面上发生了什么。

    学习 C 会教你更多关于 身体的 机器就内存使用而言,正如您提到的,这是clr在下面使用的。学习clr是如何工作的,并不能像学习c那样让你深入了解垃圾收集。 真的? 了解内存管理所涉及的内容。

    学习 CIL 另一方面,在.NET中对执行的了解要比通过学习 C . 然而,如何 IL 地图到机器语言在很大程度上仍然是一个谜,所以了解一些高级操作码,比如铸造类型的操作码,对于理解真正发生的事情没有帮助,因为它们在很大程度上是不透明的。学习 C 然而,指针会在这些方面启发你。

        14
  •  0
  •   christopher_f    16 年前

    问题是学习C还是MSIL,还是更基本?我想说,一般来说,更多的开发人员可以站起来了解更多关于 计算机 物理或虚拟,工作。一个人只有在一个盒子里理解一种语言和API,才能成为一个相当有能力的程序员。为了将这个职业提升到下一个层次,我觉得开发人员真的需要了解整个堆栈。不一定要详细,但要有足够的概括性来帮助解决问题。

    这里讨论的很多技巧可以通过学习更多关于编译器和语言设计的知识来获得。您可能需要学习C才能做到这一点(哎呀,鬼鬼祟祟),但编译器编写是学习C的一个很好的环境。斯蒂夫·雅吉 talks about this 在他的博客上,我基本上同意他的观点。我在大学里的编译器写作课程是我所修过的最开眼的课程之一,我真希望它是一门200级的课程,而不是400级的课程。

        15
  •  0
  •   bruceatk    16 年前

    我把这个贴在另一条线上,但它适用于:

    我相信你需要一个良好的基础,但投入你的大部分时间来学习你将使用什么。

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