Должна.СЕТЕВЫЕ разработчики * действительно * будут тратить время на изучение языка Си для низкоуровневого ознакомления?

StackOverflow https://stackoverflow.com/questions/125791

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Достаточно изучите ассемблер, чтобы сложить два числа вместе и отобразить результат на консоли.Вы будете гораздо лучше понимать, что на самом деле происходит с компьютером, и вам станет понятно, почему мы используем двоичный / шестнадцатеричный код.(это можно сделать за день, а можно с помощью отлаживать из cmd.exe).
  • Изучите достаточно C, чтобы выделить немного памяти и использовать указатели.Простой связанный список этого достаточно.(это можно сделать за день или два).
  • Потратьте больше времени на изучение языка, который вы собираетесь использовать.Я бы позволил вашим интересам направлять вас на какой язык (C #, Java, Ruby, Python и т.д.).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top