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

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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

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

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

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

Ответ 6

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

  • Программисты должны, вероятно, работать на языке самого высокого уровня. Что зависит от вашего сценария. Драйвер устройства или встроенная система находятся в другом классе из настольного приложения CRUD или веб-страницы.
  • Вы хотите, чтобы ваши программисты имели как можно больше практики на языке, на котором они работают.
  • Поскольку большинство программистов в конечном итоге работают с универсальными настольными и веб-приложениями, вы хотите, чтобы студенты-программисты переходили на языки более высокого уровня как можно скорее во время учебы.
  • Однако языки более высокого уровня запутывают несколько основных проблем программирования, таких как указатели. Если мы применяем наш принцип использования того, что подходит для студентов, то эти языки более высокого уровня могут не подходить для студентов первого курса. Это выбрасывает Java,.Net, Python и многие другие.
  • Таким образом, студенты должны использовать C (или еще лучше: С++, поскольку он "более высокого уровня" и охватывает большинство тех же концепций) в течение первого года или двух школ, чтобы охватить базовые концепции, но быстро перейдите к более высокому уровню, чтобы более сложные программы были более ранними.

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

Ответ 12

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

Ответ 15

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

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

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