Должны ли разработчики .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 ]

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

Конечно, вы должны. Лучший способ стать чрезмерно специализированным и целеустремленным (и, соответственно, иметь ограниченные рыночные навыки) - это работать только с одним типом языка и избегать всех остальных как «не связанных с вашей текущей задачей».

Каждый программист должен иметь некоторый опыт работы с современным языком JIT'd OO (C # / Java), более простым языком нижнего уровня (C, FORTRAN и т. Д.), Интерпретируемым языком очень высокого уровня (Python, Ruby и т. Д.) и функциональный язык (Scheme, Lisp, Haskell и т. д.). Даже если вы не используете их все изо дня в день, расширение вашего мыслительного процесса, которое дает такое знание, весьма полезно.

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

Я уже знаю C, и это помогло мне в течение 1.1 дней, когда было много вещей, которых еще нет в базовых библиотеках .NET, и мне нужно P / Invoke что-то из SDK платформы.

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

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

Правда, C намного ниже цепочки. Знание MSIL может помочь разработчикам понять, как лучше оптимизировать свои приложения. Что касается изучения C или MSIL, почему не оба? :)

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

.NET разработчики должны узнать о CLR. Но они также должны выучить C. Я не понимаю, как кто-то действительно может понять, как работает CLR, без какого-либо низкого уровня понимания того, что происходит на голом металле.

Тратить время на изучение понятий более высокого уровня, безусловно, полезно, но если вы слишком много концентрируетесь на высоком уровне за счет низкого уровня, вы рискуете стать одним из тех «архитекторов», которые могут рисовать коробки и строки на досках, но которые не могут написать настоящий код.

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

3 голосов
/ 04 ноября 2009

Чтобы быть достаточно продвинутым в написании C #, вам нужно понимать концепции C, даже если вы не изучаете язык должным образом.

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

  • Кодирование в jQuery должно сочетаться с пониманием JavaScript
  • Для проектирования схем необходимо знание физики
  • Любой хороший баскетболист узнает о мышцах, костях и питании
  • Скрипач узнает о взаимодействии канифоли, трения, волосков лука, струн и сухости древесины
3 голосов
/ 24 сентября 2008

Я думаю об этом так:

  1. Программисты, вероятно, должны на самом деле работать на соответствующем языке высшего уровня. Что подходит, зависит от вашего сценария. Драйвер устройства или встроенная система относятся к другому классу, чем настольное приложение CRUD или веб-страница.
  2. Вы хотите, чтобы ваши программисты имели как можно больше практики на языке, на котором они работают.
  3. Поскольку большинство программистов заканчивают работу над обычными настольными и веб-приложениями, вы хотите, чтобы учащиеся-программисты как можно быстрее переходили на языки более высокого уровня во время обучения в школе.
  4. Однако языки более высокого уровня запутывают некоторые основные проблемы программирования, такие как указатели. Если мы применяем наш принцип использования того, что подходит и для студентов, эти языки более высокого уровня могут не подходить для студентов первого курса. Это исключает Java, .Net, Python и многие другие.
  5. Таким образом, учащиеся должны использовать C (или еще лучше: C ++, поскольку он «более высокого уровня» и охватывает большинство одинаковых понятий) в течение первого или двух лет обучения в школе, чтобы охватить основные понятия, но быстро перейти к Уровень языка, чтобы включить более сложные программы ранее.
3 голосов
/ 24 сентября 2008

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

Чтобы быть более конкретным - я думаю, что любой хороший / великий программист должен знать эти вещи по прямому опыту:

  • В чем разница между регистром и переменной?
  • Что такое DMA?
  • Как пиксель выводится на экран (на низком уровне)?
  • Что такое прерывания?
  • ...

Знание этих вещей - это разница между работой с системой, которую вы понимаете , и системой, которая, насколько вы знаете, работает магией. :)

Чтобы ответить на некоторые комментарии

У вас есть два разных типа разработчиков:

  • людей, которые могут сделать одну вещь 10 способами на одном или двух языках
  • людей, которые могут делать одну вещь одним или двумя способами на 10 разных языках

Я твердо считаю, что вторая группа - лучшие разработчики в целом.

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

Я не вижу причин, почему они должны. Такие языки, как Java и C #, были разработаны таким образом, что вам не нужно беспокоиться о деталях низкого уровня. Это то же самое, что спросить, должен ли разработчик WinForms тратить время на изучение Win32 API, потому что это происходит под ним.

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

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

Мне нравится изучать новый язык каждый год. Не обязательно овладевать этим, но заставлять мой мозг мыслить по-разному.

Я чувствую, что изучение C - это хороший язык для изучения понятий низкого уровня без необходимости программирования на ассемблере.

Однако я чувствую, что изучение уроков из таких языков, как Haskell, Python и даже, возможно, регулярных выражений (не совсем язык, но вы понимаете, что я делаю?) Так же важно, как и уроки, которые нужно извлечь из C.

Итак, я говорю, узнайте о CLR и MSIL на работе, если это ваша область, и в свободное время, попробуйте подбирать один раз один раз. Если это случилось с C в этом году, хорошо для вас и наслаждайтесь игрой с указателями;)

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

Должны ли разработчики .net изучать C? Я бы сказал «не обязательно», но мы всегда должны баловаться каким-то языком за пределами нашего профессионального бейливика, потому что каждый язык приносит с собой новый способ мышления о проблемах. За свою профессиональную карьеру в качестве разработчика .net (а до этого VB 2-6) я написал небольшие проекты на Pascal, LISP, C, C ++, PHP, JavaScript, Ruby и Python и в настоящее время работаю над Lua Perl.

Кроме C ++, я не перечисляю ни одного из них в своем резюме, потому что не хочу быть профессионалом ни в одном из них. Вместо этого я привожу интересные идеи от каждого из них для использования в моей работе на основе .net

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

...