5 столпов изучения программирования

Перевод статьи Рэйнера Ханекампа “5 Pillars of Learning Programming”.

Изучение программирования

Учиться программировать тяжело. Мне все время кажется, что в процессе обучения в университетах и на курсах упускаются важные аспекты программирования, а также применяются неудачные методы для обучения новичков.

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

Цель новичка — усвоить основы программирования и понять важность библиотек и фреймворков.

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

Разработка через тестирование (TDD)

Разработка через тестирование

TDD дает много преимуществ. К сожалению, это продвинутая тема, к которой новички не совсем готовы.

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

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

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

Например: если выбранная технология это Spring, я даю упражнения и тесты внутри Spring-проекта. Студентам не нужно ничего знать о Spring. Все, что они должны знать, это где находятся упражнения и кнопка для запуска тестов.

Кроме того, учащиеся должны знать, как пользоваться дебаггером и иметь REPL под рукой. Возможность анализировать код в ходе запуска и наличие «песочницы» для маленьких экспериментов необходимы в TDD.

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

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

Сперва основы

Основы программирования

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

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

Сами идеи функции, переменной, условия и цикла совершенно чужды новичкам. Эти 4 элемента составляют основу программирования. В нем все сделано из этих элементов и зависит от них.

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

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

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

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

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

Библиотеки и фреймворки

Библиотеки и фреймворки

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

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

Чтобы успешно совершить переход к такому образу мышления, примеры, которые разбирались в разделе «Основ», должны быть решаемы с помощью известных библиотек, таких как Moment.js, Jackson, Lodash или Apache Commons.

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

Как и в случае с TDD, у студентов должны возникать подозрения, если коллега хвастается своей самодельной библиотекой для управления состояниями, которая делает Redux ненужным.

Когда дело дойдет до фреймворков, у студентов не будет проблем с пониманием их важности, если они уже поймут пользу библиотек.

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

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

Мастер и подмастерье

Наставничество

Когда мне было 20 с небольшим, я хотел научиться играть на пианино. Я не хотел обращаться к учителю и думал, что смогу научиться самостоятельно. 5 лет спустя я посоветовался с профессиональным наставником. Ну, что я могу сказать?.. Я за 1 месяц научился большему, чем за предыдущие 5 лет.

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

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

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

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

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

Когда подмастерья достигают определенного уровня мастерства, их нужно поощрять к исследованию новых территорий. Мастер превращается в наставника, который делится «мудростью» и открыт для дискуссий.

Вызов и мотивация

Вызов и мотивация

«А давайте сделаем клон Facebook!» Это не слова генерального директора, за которым стоит полчище разработчиков-сеньоров и многомиллионный бюджет. Это упражнение для вводного курса для программистов. Это просто невозможное предприятие. Даже хуже: учеников помещают в страну чудес и заставляют поверить, что у них есть навыки, которых в действительности нет.

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

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

Мотивация это хорошо, но не за счет контента. Программирование это непростое дело. Если у студентов нет внутренней мотивации, кодинг им ее не даст.

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

Например, многие бизнес-приложения основаны на сложных формах и сетках. Их создание — важный навык, и его можно развить с помощью упражнений. Приложение вроде Facebook & Co., вероятно, не лучший урок для изучения студентами.

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

Почему? Потому что постоянно что-то идет не так. Мы проводим бесконечные часы за исправлением каких-то очень странных багов, которые могут быть вызваны простыми опечатками. Какой-то инструмент может не работать из-за небольшого апгрейда библиотеки. Или система падает, потому что кто-то забыл добавить файл в git. Список можно продолжать.

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

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

Итоговый совет

Нельзя стать профессиональным программистом за 2 недели, 2 месяца и даже за год. Это требует времени и терпения.

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


[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх