Должны ли разработчики .NET * действительно * тратить время на изучение C для низкого уровня воздействия? - PullRequest
15 голосов
/ 24 сентября 2008

Когда Джоэл Спольски и Джефф Этвуд начали разногласия в своем подкасте о том, должны ли программисты изучать C, независимо от их отрасли и платформы распространения, это вызвало довольно бурные дебаты в сообществе разработчиков, которые, вероятно, все еще бушуют сегодня среди определенных групп. Я читал несколько отрывков из ряда блоггеров-программистов с их мнением по этому вопросу. Аргументы с обеих сторон, безусловно, имеют вес, и то, что я не нашел, это точка зрения, которая уникально с точки зрения разработчиков, ориентированных только на .NET Framework . Практически все они комментировали общую точку зрения программиста.

Что я пытаюсь получить? Вспомните мнение Джеффа Этвуда о том, что большую часть времени разработчики на таком высоком уровне будут тратить на изучение бизнеса / домена , помимо всего, что необходимо для изучения технологий для достижения этих требований к домену. По моему опыту работы это очень точное описание трудовой жизни многих. Теперь предположим, что разработчики .NET могут потратить время на «внеклассное» обучение, должно ли быть C?

Для справки, я выучил С еще в школе, и я могу абсолютно понять и оценить, что обосновывают сторонники. Но когда я все обдумываю, я лично чувствую, что разработчики .NET не должны погружаться прямо в C. Потому что, я хотел бы, чтобы больше разработчиков заняло некоторое время, чтобы изучить их, - MSIL и CLR .

Может быть, я застрял с необычной группой коллег, я не знаю, но мне кажется, что многие люди не сохраняют осознанного понимания , что их код на C # или VB сначала компилируется в IL прежде чем JIT входит и делает его необработанным машинным кодом. Большинство из них не знают IL и не интересуются тем, как точно CLR обрабатывает код, который они пишут. Чтение CLR Джеффри Рихтера через C # было для меня шоком во многих областях; рад, что я прочитал это, несмотря на то, что коллеги отклонили это как "слишком низкий уровень". Я не эксперт по IL, но со знанием основ я обнаружил, что легче слежу за его текстом, так как уже был знаком со стековым поведением IL. Я обнаружил, что разбираю сборки, чтобы посмотреть, как получается IL, когда я пишу определенный код.

Я изучаю CLR и MSIL, потому что знаю, что это прямой слой ниже меня . Слой, который позволяет мне выполнять свой собственный слой работы. С, на самом деле еще ниже. Ближе к нашей «реальности» есть CLR и MSIL. Вот почему я бы порекомендовал другим попробовать их, потому что я не вижу достаточного количества людей, которые копаются в этом слое. Или ваша команда уже знакома с MSIL?

Ответы [ 15 ]

1 голос
/ 24 сентября 2008

Если вы считаете себя программистом, я бы сказал, да, выучите C.

Многие люди, которые пишут код, не считают себя программистами. Я пишу .NET приложения, может быть, 3 часа в день на работе, но я не называю себя «программистом». Я делаю много вещей, которые не имеют ничего общего с программированием.

Если вы целый день программируете или думаете о программировании, и ваша карьера будет вращаться вокруг программирования, то вам лучше быть уверенным, что вы знаете свои вещи. Изучение C, вероятно, поможет создать базу знаний, которая будет полезна, если вы собираетесь углубиться в навыки программирования.

Со всем есть компромиссы. Чем больше языков вы изучаете и чем больше времени уделяете технологиям, тем меньше у вас времени на изучение других навыков. Например, было бы лучше изучить C или читать книги по управлению проектами? Это зависит от ваших целей. Вы хотите быть лучшим программистом EVAR? Изучите C. Потратьте часы и часы на написание кода и посвятите себя ремеслу. Вы когда-нибудь хотели управлять кем-то другим вместо того, чтобы писать весь день? Используйте время, которое вы потратите на программирование, и найдите способы улучшить свои мягкие навыки.

1 голос
/ 24 сентября 2008

Изучение MSIL не может быть плохой идеей, но в некотором смысле это просто еще один язык .NET, но с неприятным синтаксисом. Это еще один слой вниз, и я думаю, что люди должны иметь хотя бы какое-то смутное понимание всех слоев.

C, немного похожий на ассемблер с более приятным синтаксисом, является хорошим способом получить представление о том, что происходит на довольно низком уровне (хотя некоторые вещи все еще скрыты от вас).

И с другой стороны, я думаю, что каждый должен знать что-то вроде Haskell или Lisp, чтобы получить представление о вещах более высокого уровня (и увидеть некоторые идеи, представленные в C # 3 в более чистой форме) *

0 голосов
/ 24 сентября 2008

Я разместил это в другой теме, но здесь это применимо к:

Я полагаю, что вам нужен хороший фундамент, но большую часть времени уделяйте изучению того, что вы будете использовать.

  • Выучите достаточно ассемблера, чтобы сложить два числа и отобразить результат на консоли. У вас будет гораздо лучшее понимание того, что на самом деле происходит с компьютером, и будет понятно, почему мы используем бинарные / шестнадцатеричные. (это можно сделать за один день и можно сделать с помощью debug из cmd.exe ).
  • Изучите достаточно C, чтобы выделить часть памяти и использовать указатели. Достаточно простого связанного списка 1011 *. (это можно сделать через день или два).
  • Потратьте больше времени на изучение языка, который вы собираетесь использовать. Я бы позволил вашим интересам ориентировать вас на какой язык (C #, Java, Ruby, Python и т. Д.).
0 голосов
/ 24 сентября 2008

Проблема в изучении C или MSIL или это более фундаментально? Я бы сказал, что в целом больше разработчиков могут узнать больше о том, как компьютеры , физические или виртуальные, работают. Человек может стать достаточно компетентным программистом, только понимая язык и API в коробке. Чтобы поднять профессию на новый уровень, я чувствую, что разработчики действительно должны понимать весь стек. Не обязательно подробно, но достаточно обобщенно, чтобы помочь решить проблемы.

Многие из этих навыков, о которых здесь говорят, можно приобрести, узнав больше о компиляторах и дизайне языка. Вам, вероятно, нужно изучить C, чтобы сделать это (упс, подлый), но написание компилятора - отличный контекст для изучения C. Стив Йегге говорит об этом в своем блоге, и я в основном с ним согласен точка. Мой курс по написанию компиляторов в университете был одним из самых захватывающих курсов, которые я когда-либо посещал, и я действительно хотел бы, чтобы это был курс 200 уровней, а не 400 уровней.

0 голосов
/ 24 сентября 2008

CLR - это виртуальная машина, поэтому, если это все, чему вы научитесь, то вы знаете только, что происходит на виртуальном уровне.

Обучение C научит вас больше о физической машине в том, что касается использования памяти, что, как вы упоминаете, является тем, что CLR использует ниже. Изучение того, как работает CLR, не даст вам такого понимания, скажем, сбора мусора, как изучение C. С C вы действительно оцените, что задействовано в управлении памятью.

Обучение CIL , с другой стороны, рассказывает вам немного больше о выполнении в .NET, чем вы, изучая C . Тем не менее, то, как IL отображает на машинный язык, по большей части остается загадкой, поэтому знание некоторых высокоуровневых кодов операций, таких как коды типов, не так уж полезно с точки зрения понимания на самом деле происходит, поскольку они по большей части непрозрачны. Однако изучение C и указателей поможет вам понять некоторые из этих аспектов.

...