О развитии глубоких знаний в области программирования

Иногда я вижу вопросы о краевых случаях и других странностях в переполнении стека, на которые легко отвечают такие люди, как Джон Скит и Эрик Липперт, демонстрируя глубокое знание языка и его многочисленных сложностей как этот:

  

Вы можете подумать, что для использования цикла foreach коллекция   вы итерации должны реализовать IEnumerable или IEnumerable<T>.   Но, как оказалось, это не требование. Что   требуется, чтобы тип коллекции должен иметь общедоступный метод   называемый GetEnumerator, и который должен возвращать некоторый тип, который имеет общедоступный   свойство getter называется Current и общедоступный метод MoveNext, который   возвращает bool. Если компилятор может определить, что все эти   требования выполняются, тогда код генерируется для использования этих методов.   Только если эти требования не выполняются, мы проверяем,   объект реализует IEnumerable или IEnumerable<T>.

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

Как простые смертные (которые не входят в команду компилятора C #) узнают о таких вещах?

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

130 голосов | спросил Robert Harvey 12 J000000Tuesday11 2011, 00:34:02

10 ответов


163

Прежде всего, спасибо за добрые слова.

Если вы хотите получить глубокое знание C #, это, несомненно, преимущество , чтобы иметь спецификацию языка, десятилетние проектные заметки, исходный код, базу данных ошибок и Anders, Mads, Скотта и Питера в коридоре. Мне, конечно, повезло, не сомневаюсь.

Однако даже без этих преимуществ все еще можно получить глубокое знание предмета.

Вернувшись в Microsoft, я работал над интерпретатором JScript, который поставлялся с Internet Explorer 3. Мой менеджер в то время рассказал мне то, что было лучшим советом, который я когда-либо получал. Он сказал, что он хотел, чтобы я стал признанным экспертом в Microsoft по синтаксису и семантике языка JScript, и что я должен пойти по этому вопросу, задав вопросы по этим аспектам JScript и отвечая на них. В частности, отвечая на вопросы, на которые я не знал ответов, потому что это те, о которых я бы узнал.

Очевидно, что StackOverflow и другие общедоступные Q & форумы похожи на выпивку из firehose для такого рода вещей. В то время я читал comp.lang.javascript и наши внутренние форумы Microsoft «JS User» религиозно и следил за советом моего менеджера: когда я увидел вопрос о семантике языка , которую я не знал ответ, я сделал это своим делом, чтобы узнать.

Если вы хотите совершить «глубокое погружение», вам нужно тщательно выбирать. Я по сей день am замечательно не знает, как работает объектная модель браузера. Поскольку в последние годы я концентрируюсь на том, чтобы стать экспертом по языку C #, я совершенно не осведомлен о том, как работают различные классы в библиотеках базового класса. Мне повезло, что у меня есть работа, которая приносит особые глубокие знания; если ваша работа или ваши таланты в большей степени соответствуют тому, что вы универсалист, то углубление может не сработать для вас.

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

ответил Eric Lippert 13 J000000Wednesday11 2011, 02:59:06
63

Будучи на стороне «гуру» разговора раз или два, я могу сказать вам, что много раз то, что вы воспринимаете как «глубокое знание» языка или системы программирования, часто является результатом «гуру», недавно борясь за месяц, чтобы решить ту же самую проблему. Это особенно актуально на форуме, где люди могут выбирать, на какие вопросы они будут отвечать. Даже такие, как Джон Скит и Эрик Липперт, должны были в один момент узнать мир привет. Они собирают свои знания по одной концепции за раз, как и все остальные.

ответил Karl Bielefeldt 12 J000000Tuesday11 2011, 01:58:18
47

Перефразируя Йоги Бхаджан:

  

«Если вы хотите что-то узнать, прочитайте об этом, если вы хотите   что-то понять, написать об этом; если вы хотите что-то освоить,    program .

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

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

ответил Maglob 12 J000000Tuesday11 2011, 01:17:59
25

Насколько я знаю, способы узнать это:

  • Читайте об этом от кого-то вроде Эрика Липперта
  • Опыт, а затем решить проблемы из первых рук.

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

ответил FrustratedWithFormsDesigner 12 J000000Tuesday11 2011, 00:39:46
22

Я бы сказал, сделайте следующее:

Изучив относительно полезный стек языков (те, которые вам нужны для реальной работы) на уровне, где вы можете выполнять большинство обычных задач, перестаньте изучать больше языков, пока вы не изучите хотя бы одну глубину. На мой взгляд, часть проблемы в нашей отрасли, по моему мнению, заключается в том, что люди изучают только первые 5-10% языка, прежде чем переходить на другой язык. После того, как у вас есть возможность выполнять большинство обычных задач в задании, начинайте внимательно изучать одну вещь. (Вы можете вернуться к тому, чтобы получить широту после того, как вы получите некоторую глубину, а затем перейдите туда и обратно между ними.)

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

Прочитайте расширенные книги на одном языке (для SQl Server, например, это будет включать чтение о настройке производительности и внутренних данных базы данных) вместо обучения в течение 30 дней типа книг.

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

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

Найдите хорошие технические блоги от известных экспертов в этой области и прочитайте их.

Прекратите бросать свои знания после того, как вы закончите с ним. Учитесь сохранять. Большинство экспертов не должны искать общий синтаксис. Им не нужно изобретать велосипед каждый раз, когда они сталкиваются с проблемой, потому что они помнят, как они раньше сталкивались с проблемой simliar. Они могут соединять точки и видеть, как проблема X, что они делали два года назад, похожа на проблему Y, которую они имеют прямо сейчас (это поражает меня, как мало людей, похоже, делают такие соединения). Следовательно, у них больше времени для исследования более интересных тем.

ответил HLGEM 12 J000000Tuesday11 2011, 02:57:30
9

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

ответил Marcelo 12 J000000Tuesday11 2011, 01:32:45
6

Получите Reflector или любой другой декомпилятор (так как он сейчас платит) и начните открывать некоторые из наиболее часто используемых библиотек .NET для узнать, как работают внутренние элементы. В сочетании с книгой типа CLR через C # вы получите достаточно глубокий (глубже, чем большинство из нас пойдет на их обычная работа).

ответил Bart 12 J000000Tuesday11 2011, 00:56:57
4

Я разработал этот вид знаний на C ++, выйдя в comp.lang.c++.moderated в течение пары лет, хотя я действительно не работал над тем, точка. Я не уверен, как гуру я могу сказать, что я есть.

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

  1. Знание пустяков по поводу языка и знание того, как избежать ловушек.
  2. Знание того, как эффективно решать проблемы.

Номер 2 может быть достигнут только путем программирования на языке и просмотра кода других людей, но число 1 может быть достигнуто за счет много времени, чтобы прочитать о языке на своих дискуссионных форумах, увидеть, какие вопросы задают люди, и каковы ответы. StackOverflow также подходит для этого.

ответил Ken Bloom 12 J000000Tuesday11 2011, 05:48:34
4

Опыт глубокого знания и программирования означает удобство на всех уровнях абстракции. То есть.

  • библиотеки и API-интерфейсы
  • семантика языка
  • оптимизация компилятора
  • внутренние компоненты компилятора и генерация кода
  • время выполнения и сборщик мусора
  • проблемы с архитектурой и набором команд

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

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

ответил Don Stewart 28 Mayam12 2012, 01:07:30
3

Прочитайте точное руководство . Это не очень глубокое знание. Он опубликован в спецификации языка C # в разделе 8.6.4 , Вы должны привыкнуть, по крайней мере, к сокращению спецификаций для языков, которые вы используете, а также к сокращению документации для всех встроенных библиотек.

Во всяком случае, это не моя идея глубокого знания; это просто неинтересная деталь реализации. Это может быть более интересно, если дизайнер объяснил, почему это было сделано более динамичным способом, а не просто проверяет, что объект реализует Iterable.

ответил kevin cline 28 Mayam12 2012, 10:08:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132