Серия «Учу программирование»

Какие могут быть проблемы с обучением, если всё есть в сети, на русском и в открытом доступе

Затронута важная тема!

Оригинальный пост:

Озарение! Зачем мне нужен LoC-контейнер

Заклинание призыва инициатора (вроде так произносится):

@entity8844

Многие программисты, которые сильно погружены в тему, просто не способны рассказать что-то полезное не потому, что не понимают материал, а потому, что не понимаю проблем начинающих. У кого-то были отличные учителя и они не заметили трудностей на этапе обучения. Кто-то просто очень давно учился и уже не понимает проблем начинающих. Кому-то сразу и всё было понятно (большинство, конечно, выберет это вариант! :).

Какой бы ни была причина, суть не меняется. Большое количество контента в сети не даёт понимания материала.

Штука, про которую ты хотел написать, судя по контексту, называется "контейнер инъекции зависимости" (Dependency Injection Container). Хорошо бы подучить матчасть, чтобы понимать зачем оно надо и какие проблемы решает.

IoC - это "принцип инверсии управления (Inversion of Control). Опять таки хорошо бы почитать что это и зачем оно надо.

Вот пояснение о инверсии зависимости с сайта всё тех же «мелко-мягких»:

Зависимость в приложении должна быть направлена в сторону абстракции, а не на детали реализации. При написании большинства приложений направление зависимостей времени компиляции задается в сторону времени выполнения.

Я понимаю о чём речь, но до сих пор читаю такие тексты с усилием. Когда начинал разбираться в теме – это был просто шум. Есть люди, которые сразу и легко такое понимают, но я, к сожалению, не из таких. Поэтому нужны хорошие примеры с плавным погружением в проблему и предоставлением инструментов для решения. А таких в сети хрен целых и ноль десятых.

Вообще подобные рекомендации очень похожи на классическое «учи матчасть». Отправлять учить матчасть – святое дело для каждого, кто разобрался в теме :). Но это так не работает. Я читал Троелсена по рекомендациям, смотрел и читал множество материалов в сети на разных языках, покупал в складчину переводы по разным темам. К сожалению, подавляющее их большинство являются копией содержания популярных книг с полным сохранением сложности формулировок. Мой наставник верно подметил, что с таким же успехом можно учить французский язык по словарику. Владеющему языком словарик сильно помогает, а начинающим такой словарик будет почти бесполезен.

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

Много раз такое слышал – но это совет, который не решает вопроса. Не понял тему – читай предыдущую. Так вопросов по предыдущей теме и не было (!!!). Снова попадаем в рекомендацию «учи матчасть».

Сейчас же материалов по программированию в интернете полно - бери да учись. И видео, и блоги, и официальная документация. Всё бесплатно. Да вот взять хотя бы документацию от мелко-мягких https://learn.microsoft.com/ru-ru/dotnet/core/extensions/dep... Всё по русски, с объяснением зачем оно надо и примерами.

Чтобы найти нужную статью – надо знать, что искать и уметь вычленять важное из ещё мало понятной темы (вот так задачка!).

Я преподаю компьютерную графику студентам (визуализация интерьеров в 3ds max). Они тоже задают странные (по моему мнению, конечно) вопросы.

Например, если у меня студент спрашивает, как двигать объект, то я не понимаю, почему он не написал это в гугле. Так и пиши - «как двигать объект 3ds max». Будет много видео на первой же странице. Но есть и более сложные примеры - «как сделать здание с плавно меняющимся размером окон». Такой запрос на параметрическое моделирование не выведет и ответов не даст. Хотя с моей стороны очевидно, что информация по параметрическому моделированию в сети уже есть. Её много, она на русском и бесплатна.

Программирование существенно сложнее из-за большого количества мнений. Здесь не всё так однозначно, как в теме 3d моделирования. Даже если известно, что искать. Запрос может привести тебя к тонне материала, в котором большАя часть будет копипастой из словарика, не меньшая будет не по уровню сложной (привет интерфейсы и полиморфизм, я снова иду к вам!), ещё часть будет в стиле «учи матчасть» и совсем малая будет действительно актуальной и полезной. Изучить последнее после процеживания всего остального - та ещё задачка.

Реально понимание приходит, когда ученик сталкивается с нерешаемой ранее задачей, для решения которой вводят новый инструментарий. Тогда и становится понятно на кой оно надо. Для этого важно выделить проблему и без избытка информации подвести к её решению. Но чаще предлагают найти и понять проблему самому (уже задачка). А потом с полным осознанием ситуации (с чего бы?) подобрать нужный инструментарий и решить проблему (а чего не понятно – всё же есть в сети и бесплатно). Абсурд.

Недавно смотрел, как жена игра играет в PS4. Она почти никогда не играла в видеоигры. Сидит и вообще тормозит! А всё дело в том, что для неё задачка – это найти нужную кнопку на геймпаде. Когда думаешь о таком, места на размышления о тактике или оценке поведения врага не остается. Она не видела ничего, что происходит на экране из того, что видел я.

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

Я верю, что те люди, которые откликаются на помощь с обучением, хотят помочь. Но описанные рекомендации и советы просто не работают. Поэтому, когда тема IoC-контейнеров стала хотя бы более-менее ясна, я написал этот пост радости наполненный

...ошибками и корявым объяснением...

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

Показать полностью

Озарение! Зачем мне нужен LoC-контейнер

Наконец-то я понял, зачем оно надо!

(или опять туплю и ничего так и не понял?)

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

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

А можно сделать по-другому. Оставить в коде своего рода ссылки, по которым можно будет найти нужный объект (пишу код по новому - возьми фигуру вот тут).

Тогда в случае изменений не придётся искать все места, где использовался старый код и менять его. Достаточно поменять набор объектов в месте, на которое указывают ссылки (тот самый контейнер).

Старый код остается неизменным! Данные для работы выносятся в отдельное место, которое при необходимости и редактируется.

Как же это было трудно... А оказалось элементарно и просто.

А какие примеры помогли вам быстро и легко понять что-то в программировании, когда вы только начинали учиться?

Отличная работа, все прочитано!