Этапы формирования навыков программирования
В настоящее время многие программисты параллельно основной работе занимаются авторством обучающего контента, преподаванием, менторством. Обучению разработке ПО стало новым мейнстримом и для этого нужно большое количество преподавателей. Но проблема в том, что программисты, как правило, не умеют учить других людей. У меня есть опыт как программиста, так и учебного дизайнера и в этой статье хочу рассказать про этапы обучения любому новому навыку в программировании. В целом эти этапы универсальны и могут применяться к любой сфере, но примеры в статье будут посвящены программированию.
Структура статьи
Погружение в навыки
1.1 Навык
1.2 Алгоритм действий и знания
1.3 Осознанность применения навыка
1.4 Комплексные навыкиЭтапы формирования навыков
2.1 Передача знаний
2.2 Усвоение знаний
2.3 Формирование навыка
2.4 Применение и интеграция навыка
2.5 Оценка и рефлексия
2.6 Закрепление навыка
1. Погружение в навыки
1.1 Навык
Навык — это умение выполнять определенные действия для достижения заданного результата или решения задачи. Применительно к программированию навыком можно назвать как в целом умение программировать, так и умение выполнять какую-то небольшую операцию, например, объявить переменную, найти индекс элемента в массиве и т.д. В данном случае различается комплексность навыков. Умение программировать — это очень комплексный навык, состоящий из множества более мелких навыков. А умение объявить переменную, наоборот, простой, мелкий навык, практически не требующих других навыков программирования.
1.2 Алгоритм действий и знания
Любой навык (и более комплексный, и менее) выражается в каком-то алгоритме действий, который нужно совершить, чтобы прийти к результату. Например, для того, чтобы объявить переменную в JavaScript нужно:
Выбрать ключевое слово var, const или let;
Подобрать допустимое имя переменной;
Поставить оператор присвоения »=»;
Указать значение переменной в соответствии с правилами того типа данных, к которому относится значение. Например, строку взять в кавычки, дробное число писать через точку, массив взять в квадратные скобки, а элементы разделить запятой и т.д.
Выполнение алгоритма действий неотрывно связано со знаниями, как устроена предметная область. Так для алгоритма выше нужно знать различия между ключевыми словами var, const и let, знать базовые правила наименования переменных и оператор присваивания, знать синтаксис записи различных типов данных и тд.
1.3 Осознанность применения навыка
Можно не обладать всеми этими знаниями на высоком уровне, чтобы объявить переменную. Например, студент просто помнит, что преподаватель называл переменные английскими словами: age, count, res и использует подобные слова при решении задач. Но при этом студент может не помнить ни одного правила наименования переменных и при случаи попробует обозначить переменные просто цифрами.
На примере с переменной мы подошли к осознанности применения навыка. Осознанность применения навыка — это способность студента соотносить действия по выполнению навыка со знаниями предметности области. Чем больше знаний о предметной области и чем лучше студент соотносит их с действиями, тем выше осознанность применения навыка и правильность действий. Преподавателю всегда стоит помнить, что внешне студент может демонстрировать владение навыком, но при этом осознанность выполняемых действий может быть низкая. При изменении контекста задачи такой студент не справится с применением навыка. Поэтому так важно не просто решать задачи, но и просить студентов озвучивать ход решения, аргументировать выполняемые действия. В данном случае лучше решить меньше задач, но глубже их проработать.
1.4 Комплексные навыки
Чем с более комплексными навыками мы имеем дело, тем больше количество действий в алгоритме, больше вариативность этих действий, больше требований к знаниям предметной области, чтобы выбрать правильные действия. Так уже при написании простого приложения, например, ToDo List студент столкнется не только с необходимостью осознанно писать код, но и структурировать свою работу, разделять ее на этапы, думать на несколько шагов вперед. Тут уже часто проявляется проблема, что студенты не знают с чего начать, как выстроить последовательность шагов к результату. В таких случаях в обучении незаменим лайвкодинг, когда преподаватель показывает в динамике как из ничего создается программа.
2. Этапы формирования навыка
Давайте рассмотрим, из каких этапов состоит формирование навыка у студента.
2.1 Передача знаний (Knowledge Transfer)
Прежде всего мы сообщаем студенту знания, необходимые для применения навыка, и показываем, как выполняется алгоритм действий для достижения результата навыка.
Для передачи знаний обычно используются такие форматы:
Рассказ/лекция — концептуальное объяснение теории: что значат те или иные понятия, принципы и тд. Например, что такое переменная, как концептуально выглядит работа цикла for, что такое DOM и т.д.
Лайвкодинг — демонстрация применения навыка с объяснением значения каждого действия. Демонстрация объявления переменных, вывод в консоль элементов массива с помощью цикла for, получение значение элемента DOM и т.д.
Разбор готовых примеров — разбор различных комбинаций кода, чтобы студенты лучше понимали, как адаптировать навык к различным ситуациям.
Обычно преподаватели хорошо справляются с этим этапом. Среди ошибок, которые здесь встречаются, это заполнение трансфером знаний всего времени урока или большей его части. Нужно уметь вовремя остановиться, выделять главное и переходить к следующим этапам.
2.2 Усвоение знаний (Knowledge Acquisition)
Тот факт, что мы протранслировали знания студентам еще не означает, что они их восприняли и усвоили. Трансляцией знаний мы просто положили в рот студенту некоторый материал. Теперь нужно стимулировать студента к усвоению этого материала.
Чтобы спровоцировать усвоения знаний подойдут такие методы:
Пересказ. На первом этапе можно просто стимулировать студентов пересказать то, что они услышали от преподавателя. Например, расскажите, как работает хук useEffect в React? И далее продолжаем с вопросами, которые просто заставляют студентов вспомнить материал. Из каких составных частей он состоит? Какой функционал нужно помещать в этот хук?
Вопросы на понимание. Когда студенты смогли хотя бы пересказать материал, то необходимо переходить к вопросам, которые потребуют от студентов более глубокого обдумывания материала и, соответственно, понимания темы, например: Что случится с компонентом, если useEffect будет написан без массива с зависимостями? Или вопросы на интеграцию новых знаний с другими знаниями, например, как выполнение useEffect встраивается в жизненный цикл компонента?
Объяснение примеров кода, что выведет код — по аналогии с разбором кода от преподавателя на этапе трансляции знаний здесь уже студенты объясняют код, а также предсказывают его результат на основе своего понимания его работы.
Этим этапом усвоение знаний не ограничивается. Далее по ходу практической работы студенты будут дополнять и уточнять свои представления о том, как устроена предметная область. Однако перед тем, как нырять в эту самую практическую работу, где студенты столкнуться не только с проблемами понимания, но и правильного синтаксиса при написании кода, лучше, чтобы они просто проговорили порядок работы с новой конструкцией программирования.
Если говорить про реальную ситуацию на уроках, то здесь часто преподаватели ждут вопросов от студентов. А у них обычно нет вопросов. Это, конечно, не значит, что все понятно. Студенты просто не умеют анализировать свои знания и задавать вопросы. Поэтому этот этап требует проактивной позиции преподавателя.
В свою очередь даже при проактивной позиции преподавателя и задавании им вопросов не всегда может получиться полезный диалог. Например, группа совсем неактивная и не получается настроить контакт со студентами. В таком случае не стоит зацикливаться на этом этапе, но в дальнейшем к нему переодически возвращаться в процессе работы с осознанностью решения.
2.3. Формирование навыка (Skill Formation)
Предыдущий этап усвоения знаний лишь предпосылка к тому, чтобы начать формирование навыка. Как ранее говорилось, навык заключается в умении применять и адаптировать под контекст алгоритм действия для решения задачи. Чем более сложный навык, тем большую цепочку действий он предполагается и тем от большего количества условий зависит выполнение каждого действия.
Формирование навыка уместно сравнить с тем, как дети учатся ходить. В начале они много видят, как ходят взрослые (трансляция и усвоение знаний). Однако это не приводит к тому, что дети сразу встают и идут. На первых порах их нужно поддерживать, предоставлять возможность выполнить ограниченное количество шагов и тд. Постепенно мышцы ребенка укрепляются, он начинает лучше чувствовать равновесие и, как следствие, проходить все более длинную дистанцию пока не начнет свободного ходить.
Точно также и при освоении навыков программирования: студенты видят как преподаватель пишет код, объясняет его, возможно, могут даже сами его интерпретировать, но это не значит, что после они могут сразу же сами свободно программировать. Необходимо плавно подводит студентов к самостоятельному программированию и решению задач, постепенно передавая все больший контроль за решением задачи. Вот два основных метода, как это можно сделать:
Решение задач с помощью преподавателя. Например, вы предлагаете публично решить задачу одному из студентов группы и с помощью вопросов и подсказок направляете его на правильное решение. Далее берете другого студента и другую задачу и постепенно уменьшаете количество подсказок. Больше вовлекаете остальную группу в участие в решении.
Решение задач, где уже есть часть решения (задачи на завершение). Это другой способ плавного подведения студентов к полностью самостоятельному решению задач. В этом случае вы даете задачи, где уже частично написан код решения, но пропущены какие шаги (какие-то строки кода). И это могут быть разные шаги в нескольких задачах, так что студенты проработают разные элементы кода. Чтобы решить задачу студентам нужно понять уже имеющийся код и дописать недостающий. Постепенно объем готового кода уменьшается, а количество кода, который нужно написать, увеличивается.
Решение задачи командой студентов. В это подходе главным образом студенты помогают друг другу. Сила этого подхода в том, что студенты могут свободно, без давления авторитета преподавателя обсуждать и проговаривать ход своей работы, видеть, как по-разному восприняли одну и туже информацию от преподавателя разные студенты и, таким образом, более глубоко погружаться тему. Преподаватель здесь может играть роль тренера, который переодически вмешивается в командное решение, чтобы направить его в правильное русло или просто сделать более активным. Для преподавателя преимущества командной работы студентов перед индивидуальной еще и в том, что он может видеть со стороны, как рассуждают студенты. И далее на основе этой информации лучше объяснять и подсказывать студентам.
Первоначально, в качестве поддержки в формировании навыка важно, чтобы на виду у студента всегда находился синтаксис изучаемых конструкций. Запомнить его с ходу довольно трудно, поэтому затык с ним может стать препятствием для студента к более общему и глубокому понимаю смысла изучаемых конструкций. Примеры синтаксиса на виду помогут студенту больше сосредоточиться на понимании смысла.
Постепенное уменьшение поддержки приводит нас к полностью самостоятельному решению задач студентами. Важная часть мастерства преподавателя состоит в выстраивании оптимального пути уменьшении этой поддержки. В каких-то темах этот путь должен быть коротким, а в каких-то включать больше промежуточных шагов (задач с поддержкой).
По ходу формирования навыка идут несколько учебных процессов:
Уменьшение поддержки от преподавателя;
Увеличение требований к осознанности решения: более аргументированное объяснение, поиск пробелов, ошибок в знаниях студентов;
Увеличение сложности задач (более длинный алгоритм решения, использование более редких знаний);
На этом этапе для многих преподавателей является трудным простроить постепенный процесс уменьшения поддержки студентов. Чаще всего, если все время урока не ушло на трансфер знаний и есть практика, то происходит резкий переход от трансфера знаний к самостоятельному решению задач студентами. Часть студентов оказывается к этому не готова и такие студенты выключаются из урока. Стоит обращать внимание на наличие промежуточных задач с поддержкой перед переходом студентов к самостоятельному решению задач.
2.4 Применение и интеграция навыка (Application and Integration)
Когда студенты научились решать небольшие изолированные задачи на изучаемый навык, то необходимо постепенно расширять контекст задач. Давать более комплексные задачи, требующие применения не только изучаемых конструкций, но и других ранее пройденных конструкций/концепций программирования. В примере с useEffect можно предложить студентам написать программу, где будет использоваться пройденные ранее useState, useRef, рендеринг массива в JSX и т.д.
При этом не стоит недооценивать сложность таких заданий для студентов. Тот факт, что будут использовать только ранее изученные конструкции, часто заставляет воспринимать такие задачи как простые для студентов, а иногда и вовсе от них отказываться по причине большей приоритетности изучения новой темы. Однако интеграция и совместное использование нескольких навыков это отдельная сложная учебная задача. Студенты могут по отдельности довольно неплохо применять изученные конструкции, но при этом быть неспособными писать комплексные программы. Учитывая, что конечная цель обучения программирования, решение бизнес задач, требующих совместного использования широкого спектра навыков, интеграция является важным шагом обучения, который не стоит пропускать или оставлять на конец курса.
Что касается трудностей для преподавателей на этом этапе, то для тех, кто доходит до такой интегрированной практики, может не всегда хватать на нее время, учитывая низкую скорость программирования студентов. Распространенным заблуждением является убеждение, что для интеграции достаточно большого комплексного проекта в конце. Это не так, нужен регулярный «continuous integration».
2.5 Оценка и рефлексия (Assessment and Reflection)
Оценка
Оценка происходит по ходу всего урока. Преподавателю следует постоянно соотносить ход своего повествования, предлагаемых активностей, задач с тем, насколько студенты хорошо осваивают новые знания и навыки. Тем не менее к концу урока или к концу изучения темы необходимо уделить оценке больше внимания, чтобы сформировать достаточно четкое понимание возможностей студентов:
Что студенты знают/понимают, в чем ориентируются из того, что прошли.
Что могут написать, какие задачи решить?
Могут ли интегрировать полученные навыки в контекст более комплексных задач?
При оценке нужно прежде всего опираться на наблюдения:
Вы что-то спрашивали и студенты аргументировано вам отвечали;
Давали студентам задачи или более комплексные проекты и студенты их сами решали.
Тут велико искушение пойти по пути: «ну я же это им рассказывал», «ну мы же разбирали такой пример», поэтому они должны знать, уметь и т.д. То есть оценивать студентов на основе того, что вы, как преподаватель, говорили, показывали, писали, а не что делали сами студенты. На этапе оценке речь идет не о том, что студенты должны, а что они могут по факту. Это кажется очевидным, но заблуждения здесь встречаются в 3 из 4 случаев.
В целом оценка знаний студентов по ходу урока это одна из самых сложных и неочевидных задач для преподавателя. С одной стороны в голову ко всем не залезешь. С другой слабое представление о возможностях студентов соотносится с лекционным стилем преподавания. В таком случае по ходу урока просто недостаточно активностей, где студенты могут себя проявить, а преподаватель на основе наблюдений за их работой сформировать представление об уровне студентов.
Неправильная оценка или отсутствие ее в целом постепенно приводит к все большему разрыву между преподавателем и студентами. Студенты все меньше понимают уроки и все меньше в них участвуют, им все труднее сформулировать какие-то конкретные вопросы, большая часть из них замыкается, а меньшая становится более агрессивной. Исправление такой ситуации опять же начинается с оценки студентов с целью формировании у преподавателя четкой картины реального положения вещей: реальных знаний и возможностей студентов, от которых нужно отталкиваться при ведении уроков.
Рефлексия
Под рефлексией здесь понимается самооценка студента или представление студента о своих знаниях, навыках, возможностях. Это отдельный мягкий навык, который у большинства студентов развит довольно плохо.
По ходу уроков желательно стимулировать студентов к рефлексии над тем, что они поняли, что они могут написать, какие задачи решить. Задавать простые вопросы, например,
В чем чувствуете себя уверенно, а в чем нет в новой теме?
Что вам кажется не совсем логичным или запутанным в новой теме?
Представьте, какие задачи могли бы решить с текущим пониманием темы? Подумайте, в какой момент могли бы начаться трудности.
Тут не нужны сложные вопросы. Регулярная работа с рефлексией поможет найти наиболее работающие вопросы для вашей группы студентов. Однако 90% успеха рефлексии зависит от атмосферы: насколько студенты доверяют преподавателю, насколько эмоционально безопасным выглядит демонстрирование непонимания и т.д.
2.6 Закрепление (Reinforcement)
Формирование даже простого навыка редко ограничивается одним уроком. Особенно если мы говорим об устойчивом навыке, который будет со студентом надолго, и который студент сможет осознанно применять в различном контексте. К сожалению, наши процессы формирования нейтронных связей не такие быстрые и прямолинейные. Поэтому важна повторяющаяся регулярная практика, во время которой студент накопить как большое количество практики выполнения целевого алгоритма действий, так и много различного контекста применения навыка.
Повторяющаяся, регулярная практика не значит, что нужно каждый урок прорешивать задачи на все пройденные темы. Это избыточно и не получится по времени. Наоборот, с течением времени промежутки между повторениями стоит увеличивать.
Закрепление будет происходить естественно, если при изучении новых тем преподаватель регулярно проходит со студентами этап Применения и интеграции навыка, который предполагает решение комплексных задач, включающих в себя не только новую изучаемую конструкцию, то и ранее изученные темы. И здесь уже стоит следить за собой, чтобы не давать какие-то однотипные задачи, где, например, постоянно используется работа с массивом и циклом for, но слишком редко применяется объекты и цикл while. При придумывании задачи на интеграцию стоит просто спросить себя, что из ранее изученного мы давно не использовали?
2.7 Работа с этапами формирования навыка
Процесс обучения не линейный. В процессе можно много раз возвращаться к тем или иным стадиям. Некоторые стадии идут параллельно другим (например, усвоение знаний, оценка и рефлексия). Не всегда нужно проходить все этапы. Однако иметь в голове понимание процесса формирования навыков полезно. Анализируя проведенные уроки и эти этапы можно лучше понимать проблемы студентов с формированием навыков программирования.