Теория когнитивной нагрузки, проработанные и “затухающие” примеры

образовательный процесс
программирование
когнитивная нагрузка
Дата публикации

7 августа 2022 г.

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

Память и когнитивная нагрузка

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

Основные каналы получения новой информации - визуальный и вербальный (аудиальный). Если оба канала получают связанную информацию, которая затем сохраняется в постоянной памяти, при этом в разных отделах мозга, то и вспомнить такую информацию легче. Для этого необходимо задействовать один из каналов, чтобы активировать другой.

Когнитивная архитектура

Когнитивная архитектура

Дополнительная когнитивная нагрузка ложится на человека, если информация в визуальном и вербальном каналах повторяет друг друга. Появляется эффект разделения внимания (split-attention effect). Мозг непроизвольно сравнивает информация, поступающую из разных каналов и проверяет, совпадает ли она 1.

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

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

Теория когнитивной нагрузки описывает следующие типы взаимодействия с новым материалом:

  • внутренняя когнитивная нагрузка - требования возлагаемые на самого учащегося (что необходимо держать в памяти, чтобы усвоить новую информацию);
  • внешняя нагрузка - создаётся внешними факторами, отвлекающими от обучения (запутанное объяснение информации преподавателем, плохо структурированные инструкции и так далее);
  • уместная нагрузка - усилия, которые необходимо приложить, чтобы создать связь между новым и уже изученным, показывает различие между пониманием и простым запоминанием.

Теория говорит о том, что рабочая память разделяется между этими тремя источниками нагрузки. Задача преподавателя максимизировать внутреннюю нагрузку и до минимума сократить две другие.

Сделать это как раз и помогают описанные далее методы.

Проработанные примеры

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

Хороший пример:

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

Проработанные примеры бывают двух видов:

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

Для новичков больше подходят примеры, ориентированные на процесс.

Рассмотрим следующий проработанные пример:

# Используйте черепашку и цикл чтобы нарисовать квадрат
# со стороной равной 100 пикселей

# Импортируем необходимые функции
from turtle import Turtle

# Инициализируем объект Turtle
t = Turtle()

# Движение и поворот для каждой из сторон
for side in range(__): # <- Какое значение нужно указать?
    t.forward(__)
    t.right(90)

1 строка - условие встроено в само решение, 4, 7 строки - промежуточные задачи, 11 строка - комментарий указывает, где учащемуся необходимо внести изменения в пример.

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

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

Распределение проработанных примеров и задач для самостоятельного решения

Распределение проработанных примеров и задач для самостоятельного решения

Затухающие примеры

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

Образец последовательности затухающих примеров приведен далее.

Задача № 1. Найти сумму длин слов в массиве:

# total_length(["red", "green", "blue"]) => 12
def total_length(list_of_words):
    total = 0
    for word in list_of_words:
        total = total + length(word)
    return total

Для этой задачи даётся полное решение.

Задача № 2. Найти длину каждого слова в массиве и сохранить её в новом массиве:

# word_lengths(["red", "green", "blue"]) => [3, 5, 4]
def word_lengths(list_of_words):
    list_of_lengths = []
    for ____ in ____:
        append(list_of_lengths, ____)
    return list_of_lengths

Теперь в примере появились пропуски, которые акцентируют внимание на операторе цикла.

Задача № 3. Объединить в одну строку все строковые элементы массива:

# join_all(["red", "green", "blue"]) => "redgreenblue"
def join_all(list_of_words):
    joined_words = ____
    for ____ in ____:
        ____
    return joined_words

В данном примере фокусируемся на обновлении переменной-аккумулятора, которая хранит строку-ответ.

Задача № 4. Получить аббревиатуру из слов, хранящихся в массиве:

# make_acronym(["red", "green", "blue"]) => "RGB"
def make_acronym(list_of_words):
    ____

Эту задачу учащимся нужно решить самостоятельно.

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

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


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

Сноски

  1. Часть информации взята с этого сайта, другая - из этой записи в блоге↩︎

  2. Информация о проработанных примерах↩︎

  3. С англ. Faded examples, по этому трудно подобрать другой перевод.↩︎