План изучения программирования сосредоточенный на проблемах новичков | Часть 0
Приветствую, примерно полтора месяца назад я написал пост о проблемах планов изучения программирования. Потом были посты о методах изучения, подходящих материалах, и т.д. и т.п., из них можно собрать примерный план, избежав каких то ошибок. Но все же, это скорее усложнит жизнь новичку, и только добавит вопросов. Поэтому, кажется хорошей идеей полностью прописать этот план.
Поскольку подразумевается серия постов(примерно 10-12), чтобы текст не был слишком большим, буду ссылаться на прошлые посты, лежащие здесь или на моем на канале - https://t.me/tobeprog (там же будут выходить посты дополняющие и раскрывающие план). Если будет подобная ссылка, то сразу будет краткое изложение сути материала на другой ее стороне.
Зачем нужен очередной план изучения программирования?
Мне не нравится вектор большинства планов, они не сосредоточены на проблемах новичков. Зачастую, это просто список учебных материалов с небольшими аннотациями. Списки эти могут разительно отличатся, проблемы у новичков на удивление похожи. Особенно паршиво, когда вовремя не обозначенная проблема, может на корню зарубить весь процесс изучения.
Может показаться, что это не задача плана изучения. Он всего лишь должен рассказать о хороших источниках, а уже задача источника правильно направить ученика, предвидеть ошибки и прочее. Чтобы разобраться в этом вопросе, копнем чуть глубже.
Почему так сложно понять проблемы новичков?
Побочка индустрии, она развивается так быстро, потому что технологии как бы наслаиваются друг на друга. Знания тоже, выучиваешь одно, на его основе второе, третье и так до бесконечности. Ко всему прочему, программирование - ремесло. Сложно вспоминать проблемы с основами ООП, когда они погребены под большим пластом практики. И это - очевидный 'затык', сколько про него написано материалов, предлагающих свой подход к его преодолению. Что уж говорить про то, что рано легло в основу, и стало чем то сверх очевидным.
В посте, ссылка на который выше, как раз, о проблеме 'непонимания самого процесса программирования'. Его зачастую не объясняют, поскольку это единственный способ программировать, другой еще не придумали, вот только новички не программировали и об этом не знают.
Отсюда и появляется проблема не намеренного 'снобизма'. Вот как программисту объяснить работу циклов новичку? Она очевидна, буквально дословный перевод, показывает взаимодействия. Вот только новичок не понимает, что же делать? Объяснить внутряк, на более глубоком уровне, может так станет понятно? И вот тут появляется эта пропасть, когда простые вещи, вдруг становятся невероятно сложными, непонимание новичка может быть на другом уровне, нежели объяснение учителя.
Тоже касается и книг/курсов. Предположим программисту предложат прочитать курс по вводу в какой нибудь оояп. Как сделать этот курс максимально полезным? Ну разумеется все возможное время посвятить ООП. Курс точно так же, может быть хорош, может отлично объясняться парадигма и даваться интересные задачи, и при этом ученик не научиться программировать.
Как бы идеально не была рассмотрена какая то определенная тема, если она по итогу не впишется в общую картину, то это будет пустой тратой времени. И вот тут основная загвоздка - откуда у новичков может быть сформирована эта картина? Более того, сформирована правильно?
И как же это исправить?
Задача плана именно в том, чтобы выстроить эту картину. Не просто рассказать о хорошем материале, но и объяснить, что именно нужно из него получить, какую роль сыграют эти знания в общем прогрессе. Изучающий должен понимать на каком он этапе, куда движется, и главное, каким образом, ему поможет то, что он учит сейчас. Более того, объяснять как двигаться по материалу, рассматривая возможные проблемы и их решения.Кому то покажется, что от подобного подхода теряется какая то роль открытия, как будто добавляются спойлеры, которых быть не должно. Но именно этот подход позволяет не просто идти по материалам, надеясь, что в конечном итоге все сложится и нужные навыки приобретаются(и будет очень обидно, если нет). Но и взаимодействовать с ним на другом уровне, самостоятельно видеть возможные пробелы, в определенных местах отступать от плана, к примеру если материал в источнике подан не понятно, но при этом ученик знает, что конкретно ищет, он вполне может поискать это в другом месте, не теряя общей картины. Появляется контроль.
Ко всему прочему, именно этот подход позволяет рассматривать общие проблемы, их удобно разбивать на подзадачи, и с помощью плана, постепенно закрывать, идя по материалам, а не предполагать что они закроются сами собой. Ну и как итог, все это дает возможность не просто оценить прогресс, но и сам план. Может быть подход, который в нем заложен вовсе не близок, а понять это через ряд названий незнакомых материалов, очевидно, невозможно.
Примерный план
Кратко опишу суть, аргументировав основные решения. Мне кажется, это даст понять примерное направление. Чтобы лишний раз не повторяться - два больших поста, которые хорошо дополнят сказанное:
Про практику и методы Научиться программировать
Примерный посыл плана, но более развернуто Python | Для изучающих программирование. Часть 2 , лучший симбиоз учебных материалов, как перейти к большим проектам
1 этап. Программирование - не выученный синтаксис языка, программирование - умение решать задачи, свои задачи с помощью кода. Весь первый этап будет посвящен приобретению этого навыка. Инструмент - Python, он позволяет быстро писать сложные программы или их рабочие прототипы, т.е. как можно быстрее прийти к самому процессу программирования.
Заход в Python будет через 'автоматизацию на Python', это сильно упростит понимание создания программ, привязав их к понятным бытовым задачам. Много проектов, приобретается скилл разбивать задачу на подзадачи, нахождение интересных решений, сами программы довольно впечатляющие, и главное - понимание ЯПа как инструмента.
2 этап. CS и теория, тут важно уточнить, теория в данном случае, не просто общие познания, это именно подъем на другой уровень самого практического навыка. Необходимость, особенно после Python(на этом этапе от него ненадолго отступим), он отлично решает проблему первого этапа, но при этом обладает рядом существенных недостатков. Если упростить - на нем можно писать откровенно плохой код. И 'теоретическое' дополнение должно решить эту проблему.
Почему же, не стартануть с CS сразу? Питон через автоматизацию даст кучу проектов, набьет руку, и приучит к коду. Новые техники ложатся на отработанную основу, к примеру, изучили разные сортировки, и вместо отдаленных от практики задач, можем применять их в своих проектах. Само изучение пойдет куда легче, основы уже есть из питона, т.е. меньше распыления и сосредоточенность на конкретных проблемах.
3 этап. Может показаться, что если уже есть понимание самого процесса, наложена практика с теорией, то цель достигнута. Это так, но все же стоит это все объединить, закрыв какие то непонятные моменты. Снова возвращаемся к Python, но уже с несколько другим, более глубоким взглядом.
Поскольку, программирование - создание программ, то имея рабочий инструментарий, мы можем приступить к чему то действительно сложному. И весь этап будет состоять из двух частей: закрыть оставшиеся вопросы, объединив и дополнив полученные знания ну и прикоснуться к действительно сложным проектам.