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

С чего начатьобновлено 07.10.20269 мин чтенияесть тренажёр

Вычислительное мышление — это способ решать задачи так, как их решает программист: разбить на части, найти повторы, отбросить лишнее и записать точный порядок действий. Термин популяризировала Джаннет Уинг в 2006 году, предложив считать его базовым навыком наравне с чтением, письмом и арифметикой.

Загружаем…

Определение Джаннет Уинг

В статье 2006 года Джаннет Уинг (Jeannette Wing) определила вычислительное мышление как навык формулировать задачу и её решение так, чтобы его мог выполнить человек или машина. Главная мысль статьи — этот навык нужен каждому, а не только программистам.

Уинг писала, что к чтению, письму и арифметике стоит добавить вычислительное мышление в набор умений каждого ребёнка[1]. Она подчёркивала несколько важных оговорок, без которых определение легко исказить. Это мышление человека, а не компьютера: машина ничего не придумывает, она лишь выполняет. Это про идеи, а не про конкретный язык или устройство. И это не то же самое, что умение программировать: программирование — один из способов применить такой подход, но далеко не единственный.

Не стоит думать, что речь идёт только об информатике. Удобный пример — сборка рюкзака в школу. Ребёнок, который разбивает задачу на части («учебники, пенал, форма»), замечает закономерность («по вторникам всегда физкультура»), отбрасывает лишнее («цвет пенала неважен») и составляет порядок действий, рассуждает вычислительно — хотя ни одной строки кода не написал.

Четыре составляющие вычислительного мышления

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

СоставляющаяЧто это значитПример из жизниПример в коде
ДекомпозицияРазбить большую задачу на маленькиеУборка комнаты: стол, пол, полкаИгра = движение + счёт + проигрыш
ЗакономерностиЗаметить, что повторяетсяКаждое утро одни и те же шагиЧетыре одинаковые стороны квадрата → цикл
АбстракцияОставить главное, отбросить деталиСхема метро вместо карты городаФункция kvadrat(storona) для любого размера
АлгоритмЗаписать точный порядок шаговРецепт блиновПрограмма на Python или скрипт в Scratch

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

Декомпозиция: разбить задачу на части

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

Задача «сделать игру» пугает. Задача «сделать так, чтобы яблоко падало сверху» — уже нет. Опытный программист, получив большое задание, первым делом пишет список частей. Ребёнку полезно делать так же, и пропускать этот шаг не стоит даже в маленьком проекте: перед тем как открыть Scratch, записать на листке, из каких кусков будет состоять игра, и отмечать готовые галочкой.

# Задача: нарисовать домик. Делим на части.
def stena():
    print("Рисую квадрат-стену")

def krysha():
    print("Рисую треугольник-крышу")

def okno():
    print("Рисую окно")

stena()
krysha()
okno()

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

Закономерности и абстракция

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

Если черепашка рисует квадрат командами «вперёд, направо» четыре раза подряд, закономерность очевидна, и её заменяет цикл. Тренажёр «Робот в лабиринте» в начале страницы построен именно на этом: на уровнях 5–8 появляется блок «повторить N раз», и длинную цепочку «вперёд, вперёд, вперёд» нужно заменить одним повтором. Попробуйте пройти уровень сначала без цикла, а потом с ним — разница в длине программы наглядна. Этот тренажёр устроен по тому же принципу, что и блоки Scratch из MIT Media Lab.

def mnogougolnik(storony):
    ugol = 360 // storony
    for i in range(storony):
        print("вперёд 50, поворот на", ugol)

mnogougolnik(4)
mnogougolnik(6)

Здесь абстракция видна в одной функции, и писать отдельную программу для каждой фигуры уже не нужно: квадрат, шестиугольник и восьмиугольник отличаются только числом сторон. Мы оставили главное — количество сторон — и отбросили всё остальное. Исследователи Scratch называют такую практику «абстрагированием и модульностью» и относят её к ключевым практикам наряду с экспериментированием, тестированием, отладкой и повторным использованием кода[2].

Алгоритм и отладка

Алгоритм — это конечная последовательность точных шагов, которая приводит к результату. Отладка — это поиск и исправление ошибок в алгоритме, и без неё вычислительное мышление неполно.

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

Отладку стоит воспринимать как нормальную часть работы, а не как наказание. Карен Бреннан и Митчел Резник среди практик вычислительного мышления прямо называют тестирование и отладку, а среди «перспектив» — умение задавать вопросы о мире и выражать себя через проекты[2]. Подробнее о поиске ошибок — в статье об отладке программ.

Упражнения для вычислительного мышления

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

  1. План проекта на листке. Перед любой игрой записать её части и порядок работы — декомпозиция.
  2. Найди повтор. Дать ребёнку длинную программу из одинаковых команд и попросить сократить её циклом — закономерность.
  3. Одна функция на все случаи. Нарисовать треугольник, квадрат и шестиугольник одной функцией с параметром — абстракция.
  4. Рецепт для робота. Записать инструкцию «как налить чай» так, чтобы её выполнил человек, который всё делает буквально, — алгоритм.
  5. Найди ошибку. Взрослый прячет одну неверную команду в программе, ребёнок ищет её — отладка.
  6. Лабиринт с циклами. Пройти уровни 5–8 в тренажёре на этой странице минимальным числом блоков.

Для младших подойдут игры без экрана: «робот-родитель», карточки команд, лабиринт на клетчатом листе. Они собраны в материале о программировании без компьютера. Для старших — задачи на алгоритмы, например в разделе про алгоритмы для детей.

Что известно о переносе навыков

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

Рональд Шерер и соавторы объединили данные 105 исследований[3]. Средний эффект оказался положительным (g ≈ 0,47); сильнее всего он проявился в творческом мышлении, математических навыках, метапознании, рассуждении и пространственных навыках. Однако в самых строгих работах — рандомизированных, где контрольная группа тоже занималась чем-то активным, — эффект был ниже. Авторы делают вывод: перенос не происходит автоматически, его нужно специально строить на занятиях.

Для сравнения, обзор Джованни Салы и Фернана Гобе показывает, что тренировка шахмат, музыки и рабочей памяти почти не даёт дальнего переноса[4]. На этом фоне программирование выглядит лучше, но обещания «прокачать мозг» всё равно преувеличены. Практический совет: если хотите, чтобы навыки из программирования пригодились в математике, прямо связывайте их — разбирайте задачу по шагам, ищите закономерность в последовательности чисел, проверяйте ответ. Подробнее о пользе и её пределах — в материале о пользе программирования для детей.

Мифы о вычислительном мышлении

Миф — это популярное утверждение, которое не подтверждается ни самим определением, ни исследованиями. О нашей теме их два основных.

«Вычислительное мышление — это умение думать как компьютер». Это не так: Уинг прямо писала, что речь о мышлении человека, а компьютер лишь исполняет то, что человек придумал.

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

Когда тренировка не поможет

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

  • Нужно подтянуть оценку по математике за 1 месяц. Нужны занятия по темам математики, а не косвенный перенос.
  • Ребёнок решает 1 упражнение раз в несколько недель. Навык не закрепится; регулярность важнее объёма.
  • Занятия сводятся к копированию 100% готового кода. Без своей декомпозиции и отладки мышление не тренируется.
  • Ребёнку 4 года. Ему пока достаточно простых игр на порядок действий.

Чего делать нельзя

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

  • Нельзя заставлять заучивать определения «декомпозиции» и «абстракции» без задач, где они нужны.
  • Не следует обещать ребёнку, что программирование «сделает его умнее»: это преувеличение.
  • Не стоит решать задачу за ребёнка, когда он застрял на декомпозиции: задайте вопрос «из каких частей она состоит?».
  • Нельзя пропускать проверку алгоритма: без запуска и отладки это просто план.
  • Не следует сводить всё к экрану: часть упражнений лучше делать на бумаге.

Источники

[1] Wing J. M. Computational thinking // Communications of the ACM. 2006. Vol. 49, № 3. P. 33–35.

[2] Brennan K., Resnick M. New frameworks for studying and assessing the development of computational thinking // Proceedings of the 2012 Annual Meeting of the American Educational Research Association. Vancouver, 2012.

[3] Scherer R., Siddiq F., Sánchez Viveros B. The cognitive benefits of learning computer programming: A meta-analysis of transfer effects // Journal of Educational Psychology. 2019. Vol. 111, № 5. P. 764–792.

[4] Sala G., Gobet F. Does far transfer exist? Negative evidence from chess, music, and working memory training // Current Directions in Psychological Science. 2017. Vol. 26, № 6. P. 515–520.

Вопросы и ответы

С какого возраста можно развивать вычислительное мышление?

Простые игры на порядок действий подходят уже с 5 лет. Цикл и условие ребёнок понимает в игровой форме в 6–8 лет, абстракцию через функции — обычно ближе к 11–12 годам.

Это то же самое, что логика?

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

Есть ли это в школьной программе?

Отдельного предмета нет, но по федеральной образовательной программе алгоритмы, исполнители, ветвления и циклы в курсе информатики 7–9 классов тренируют те же навыки.

Можно ли развивать навык без компьютера?

Да. Рецепты, маршруты, сортировка карточек и головоломки тренируют декомпозицию и алгоритмы. Компьютер добавляет главное — быструю проверку.

Как понять, что у ребёнка развивается этот навык?

Он сам начинает планировать проект по частям, предлагает «сделать это циклом» и ищет ошибку, не дожидаясь подсказки.

Поможет ли это на ОГЭ?

Косвенно: в материалах ФИПИ задания на исполнителей и программы требуют именно такого подхода. Но к экзамену всё равно нужно готовиться по его заданиям.