Сегодня школьникам разных возрастов предлагается большое количество вариантов реализовать свои навыки программирования: от участия в олимпиадах по информатике и разработки приложений и игр до освоения модных технологий, таких как машинное обучение, или даже ранние стажировки в ИТ‑компаниях.

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

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

Изучение Computer Science как способ зайти в ИТ для школьников
Изучение Computer Science как способ зайти в ИТ для школьников

Цели и метрики

Для начала определимся с долгосрочными целями школьного ИТ‑образования, рассматриваемые в статье и о метриках измерения его эффекта.

Цели обучения с точки зрения учеников:

  • Поступить на ИТ‑специальность ведущего ВУЗа

  • Профессионально реализоваться как программист

С точки зрения организаторов обучения кроме помощи с достижением целей выше добавляется:

  • Довести до окончания и освоения программы максимальное количество учеников

Для оценки эффективности обучения, исходя из целей, я выделяю две метрики:

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

\text{Доходимость} = \frac{\text{Завершили программу}}{\text{Пришли на первое занятие}}

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

Эффективность образовательной программы: сколько из завершивших обучение поступило на ИТ‑специальности ведущих ВУЗов или устроились в ИТ‑компании на желаемые позиции.

\text{Эффективность} = \frac{\text{Поступили или устроились в ИТ}}{\text{Выпустились по программе}}

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

Именно в контексте данных целей и метрик я опишу свое видение проблем и решений.

Эффективное обучение

Основываясь на своем эмпирическом опыте и исследованиях я выделю факторы наиболее влияющие на эффективность обучения:

  1. Образовательная программа

  2. Методика обучения

  3. Личность ученика

  4. Личность преподавателя

В данной статье фокус будет в основном на образовательной программе и методике обучения.

Что не так с традиционным обучением программированию

В школьном образовании преобладают три подхода к обучению программированию и информатике и у всех есть существенные проблемы:

Первый: Образование для развлечения — edutainment

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

Второй: Натаскивание на олимпиады и ЕГЭ

Этот подход хорошо подходит для подготовки к поступлению в ИТ‑ВУЗы, но часто сосредоточен на решении однотипных задач. Это может быть скучно для учеников, и в результате эти курсы часто сталкиваются с высоким оттоком. Однако те, кто «выживает», успешно поступают в университеты, но и там могут возникнуть сложности. Индустриальное программирование часто сосредоточено на проектной работе, в то время как спортивное программирование обычно фокусируется на решении коротких и точно поставленных задач.

Третий: Обучение индустриальным инструментам разработки

Обучение современным прикладным навыкам в теории звучит хорошо, но без хорошей базы создавать приложения на Android, разрабатывать веб‑сервисы или обучать ИИ довольно сложно. Для ученика будет много «магии», если не будет хорошо разобраны фундаментальные принципы, на которых строятся эти инструменты. Не зря же фундамент по Computer Science в большинстве случаев является обязательным требованием, будь то мобильная разработка или машинное обучение, в академических программах ведущих университетов и в требованиях к кандидатам на технические должности в крупных компаниях.

Альтернатива: Обучение Computer Science для младших школьников

Cчитаю, что сегодняшний небывалый интерес детей к технологиям и созданию игр полезно направить на изучение хардкорного Computer Science, с упором на практику как через решение задач так и создание проектов, как фундамента для дальнейшего освоения ИТ.

Похожий путь проходили, например, Марк Цукерберг, Илон Маск, а также мои знакомые и ученики, которые успешно реализовали себя в ИТ. Им требовалось знать и изучать темы Computer Science, выходящие далеко за пределы школьной программы, чтобы удовлетворить свой интерес к ИТ.

Билл Гейтс, Марк Цукерберг и Илон Маск начали программировать в возрасте 10–13 лет, используя вполне взрослые инструменты разработки для создания игр и приложений
Билл Гейтс, Марк Цукерберг и Илон Маск начали программировать в возрасте 10–13 лет, используя вполне взрослые инструменты разработки для создания игр и приложений
Игра Blastar, разработанная Илоном Маском в 1984 году на BASIC, когда ему было 12 лет
Игра Blastar, разработанная Илоном Маском в 1984 году на BASIC, когда ему было 12 лет

Опыт американских университетов преподавания Computer Science

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

Среди них на моё понимание преподавания программирования существенно повлияли курсы из двух американских университетов: «Методология программирования» от Стэнфорда и два курса от Принстона — «Введение в Java: междисциплинарный подход» и «Алгоритмы».

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

Курсы характеризуются хорошей структурой: материал подается последовательно, без резких перепадов сложности, и снабжен примерами из практики и ИТ‑индустрии. Все это подкреплено наглядными материалами и визуализацией.

Это классические курсы от авторитетных специалистов в сфере информатики:

Мехран Сахами руководил разработкой стандартов Computer Science от ACM.

Мехран Сахами ведет курс "Методология программирования" в Стэнфорде
Мехран Сахами ведет курс "Методология программирования" в Стэнфорде

Роберт Седжвик был аспирантом у легендарного Дональда Кнута и и сделал значительный вклад в развитие информатики. Его курс «Алгоритмы» является одним из самых популярных на Coursera.

Роберт Седжвик читает курс "Алгоритмы", Coursera
Роберт Седжвик читает курс "Алгоритмы", Coursera

Курсы от Стэнфорда и Принстона для шестиклассников

В 2016–2019 годах в рамках проекта Университета Иннополис по подготовке школьников к олимпиадам по информатике мы с коллегами разработали двухгодичную программу по Computer Science. В последующие годы я дорабатывал ее собственными силами.

В основе программы лежат материалы из Стэнфорда, Принстона, а также российский опыт преподавания олимпиадной информатики.

Цель программы — дать фундамент по программированию и алгоритмам как для участия в олимпиадах по информатике, так и для разработки собственных проектов.

Программа Computer Science для школьников
Программа Computer Science для школьников

Апробация и результаты

В 2017 я начал вести одну группу для казанских шестиклассников, отличившихся в олимпиадах по математике, по нашей программе.

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

Два года группа занималась по нашей программе Computer Science
Два года группа занималась по нашей программе Computer Science

На первое занятие ко мне пришло 17 учеников из казанских школ.

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

Итого, у меня выпустилось 13 учеников из первоначальных 17.

В девятом классе из этих 13 учеников 8 прошли на региональный этап в Татарстане; трое стали призерами, а один — победителем среди учащихся 9–11 классов.

Наша группа составила 40% от числа победителей и призеров. Это при том, что я далеко не топ‑тренер.

На региональном этапе ученики из моей группы заняли 40% призовых мест, их имена отмечены звездочкой
На региональном этапе ученики из моей группы заняли 40% призовых мест, их имена отмечены звездочкой

Стоит отметить, что уровень школьников в Татарстане один из самых высоких в России. В этом году, например, ученики из Казани завоевали две золотые медали на международной олимпиаде — столько же, сколько и Москва.

Недавно я собрал статистику о том, где ребята учатся и как они поступили.

В итоге, все они поступили на ИТ‑специальности: 8 из 13 — без вступительных испытаний, благодаря успехам на олимпиадах. Один из них учится в MIT.

8 из 13 поступили без вступительных испытаний
8 из 13 поступили без вступительных испытаний

По метрикам получается следующее:

  • 76% учеников, пришедших на первое занятие, успешно завершили обучение.

  • 92% из них поступили на ИТ‑специальности в ведущих ВУЗах.

  • 61% поступили без вступительных испытаний благодаря своим олимпиадным достижениям.

Это много или мало?

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

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

Как обучать школьников программированию: мои выводы

Далее я представлю свои размышления о том, как обучать школьников программированию и информатике, основываясь на собственном опыте разработки и ведения курса Computer Science. Этот подход является лишь одним из возможных и не претендует на универсальность. Более того, он требует значительных затрат времени и ресурсов.

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

Зачем учить Computer Science школьников

Чтобы увлечение программированием в школе принесло пользу, нужно учить фундаменту Computer Science.

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

Фундаментальные навыки в алгоритмах, структурах данных и программной инженерии помогут:

  • Разрабатывать приложения и игры

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

  • Поступить в ведущие российские и мировые университеты

    Содержание курса должно охватывать наиболее критические темы как российских ФГОС по информатике, так и международных, например, американские стандарты K12CS. Это позволит сдавать ЕГЭ по информатике, а также международные экзамены по Computer Science, такие как IB, A Level, AP на высокие баллы.

  • Участвовать и побеждать на олимпиадах по информатике

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

  • Разбираться в ИТ на уровне разработки решений

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

Computer Science - фундамент для дальнейшего погружения в ИТ. Здесь показаны возможные варианты продолжения ИТ-образования
Computer Science — фундамент для дальнейшего погружения в ИТ. Здесь показаны возможные варианты продолжения ИТ‑образования

Computer Science для школьников

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

Первый модуль: Робот исполнитель

  • Изучение базового синтаксиса языка и среды разработки Intellij Idea

  • Интуитивно понятное изучение циклов, ветвлений, тестирования и отладки

Адаптированная мной стэнфордская библиотека для робота-исполнителя Karel в среде разработки IntelliJ IDEA.
Адаптированная мной стэнфордская библиотека для робота‑исполнителя Karel в среде разработки IntelliJ IDEA.

Второй модуль: Графика, анимация, события

  • Интуитивное изучение математических операций и переменных

  • Применение принстонской графической библиотеки StdDraw, являющейся надстройкой над Java AWT и Swing, с открытым исходным кодом для учеников

Благодаря принстонской библиотеке StdDraw и нововведениям Java 21 графические  программы на Java вводного модуля стали выглядеть гораздо проще
Благодаря принстонской библиотеке StdDraw и нововведениям Java 21 графические программы на Java вводного модуля стали выглядеть гораздо проще

Модули 3–5: Элементы спортивного программирования

  • Освоение процедурного стиля программирования: ветвления, циклы, массивы, примитивные типы данных, функции, рекурсия, динамическое программирование

  • Решение большого количества задач, включая олимпиадные, по каждой теме.

  • Работа в тестирующих системах подобных Яндекс Контест

Шестой модуль: Создание классических игр и симуляций

  • Разработка игр и симуляций, включая «Змейку» и клеточный автомат «Жизнь»

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

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

Компьютерное моделирование как прикладное применение программирования в других областях
Компьютерное моделирование как прикладное применение программирования в других областях

Модули 7–8: ООП, создание игр и приложений

  • Учимся разрабатывать крупные программы, игры, приложения

  • Структурное программирование: ООП, декомпозиция, модульность, модульное тестирование, API

  • Ссылочные типы данных, классы‑обертки для примитивных типов, встроенные классы и объекты в Java (Color, String), пользовательские типы данных, модификаторы доступа, конструкторы, методы экземпляра, Java‑интерфейсы, массивы как объекты, массивы объектов

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

Меня, кстати, критикуют за обучение олимпиадников ООП, так как оно в спортивном программировании не нужно. Но мне кажется, что ООП хорошо прокачивает структурное программирование и открывает возможности заниматься проектами, а не только решением учебных задач. Я стараюсь не ставить целью победу на олимпиадах; результаты на олимпиадах должны быть следствием увлечения ребят Computer Science.

Ниже представлен пример в виде набора классов на Java для построения черепашьей графики.

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

Для реализации черепашьей графики создан пользовательский тип данных — Turtle.

import lib.StdDraw;
// Тип данынх для черепашей графики
public class Turtle {
    private double x, y;     // текущие координаты черепашки (x, y)
    private double angle;    // угол против часовой стрелки от оси x в градусах

    // начальные координаты (x0, y0)
    // направление черепашки составляет a0 градусов против часовой стрелки от оси x
    public Turtle(double x0, double y0, double a0) {
        x = x0;
        y = y0;
        angle = a0;
    }

    // повернуть черепашку на delta градусов против часовой стрелки
    public void turnLeft(double delta) {
        angle += delta;
    }

    // переместиться вперед на заданное расстояние с опущенным пером
    public void goForward(double step) {
        double oldX = x;
        double oldY = y;
        x += step * Math.cos(Math.toRadians(angle));
        y += step * Math.sin(Math.toRadians(angle));
        StdDraw.line(oldX, oldY, x, y);
    }
    // пример клиента для тестирования
    public static void main(String[] args) {
        double x0 = 0.5;
        double y0 = 0.0;
        double a0 = 60.0;
        double step = Math.sqrt(3)/2;
        Turtle turtle = new Turtle(x0, y0, a0);
        turtle.goForward(step);
        turtle.turnLeft(120.0);
        turtle.goForward(step);
        turtle.turnLeft(120.0);
        turtle.goForward(step);
        turtle.turnLeft(120.0);
    }
}

Клиенты DrunkenTurtle.java, Koch.java и Spiral.java строят изображения броуновского движения, кривых Коха и логарифмических спиралей, используя API класса Turtle.

// Строит путь "пьяной" черепашки - Бро́уновское движение 
public class DrunkenTurtle {
  
    public static void main(String[] args) {
        int trials = 100000;     // количество шагов
        double step = 0.005;     // размер шага

        Turtle turtle = new Turtle(0.5, 0.5, 0.0);
        for (int t = 0; t < trials; t++) {
            double randomAngle = 360 * Math.random();
            turtle.turnLeft(randomAngle);
            turtle.goForward(step);
        }
    }
}
Броуновское движение
Броуновское движение
// строит кривую Коха
public class Koch {

    // рекурсивно строит кривую Коха порядка n с заданным размером шага
    public static void koch(int n, double step, Turtle turtle) {
        if (n == 0) {
            turtle.goForward(step);
            return;
        }
        koch(n-1, step, turtle);
        turtle.turnLeft(60.0);
        koch(n-1, step, turtle);
        turtle.turnLeft(-120.0);
        koch(n-1, step, turtle);
        turtle.turnLeft(60.0);
        koch(n-1, step, turtle);
    }

    public static void main(String[] args) {
        int n = 5;
        double step = 1.0 / Math.pow(3.0, n);
        Turtle turtle = new Turtle(0.0, 0.5, 0.0);
        koch(n, step, turtle);
    }
}
Кривые Коха
Кривые Коха
// Строит логарифмическую спираль с помощью черепашьей графики
public class Spiral {
  
    public static void main(String[] args) {
        int n = 1440;     // количество поворотов
        double decay = 1.0004;   // коэффициент "затухания"

        double angle = 360.0 / n;
        double step = Math.sin(Math.toRadians(angle / 2.0));
        Turtle turtle = new Turtle(0.5, 0.0, angle / 2.0);
        for (int i = 0; i < 10 * n; i++) {
            step /= decay;
            turtle.goForward(step);
            turtle.turnLeft(angle);
        }
    }
}
Логарифмическая спираль
Логарифмическая спираль

Модули 9+: Алгоритмы и структуры данных

  • Адаптация принстонского курса «Алгоритмы»

  • Фокус на структурное программирование: ООП, API

  • Применение известных алгоритмов в различных сферах ИТ, в науке, в бизнесе

  • Использование в разработке своих проектов, игр, приложений

  • Подготовка к олимпиадам по информатике и программированию

Алгоритмы - классика Computer Science
Алгоритмы - классика Computer Science

Как обучать?

Знания и навыки не копируются в головы учеников путем озвучивания теории на лекции или со страниц учебника.

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

Для современного человека это не работает.

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

Фронтальная форма не работает на современных детях. Источник изображения - RSA ANIMATE: Changing Education Paradigms
Фронтальная форма не работает на современных детях.
Источник изображения — RSA ANIMATE: Changing Education Paradigms

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

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

Практикоориентированная структура курса

Во главе обучения стоит деятельность ученика.

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

Пример формулировок образовательных целей
Пример формулировок образовательных целей

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

Задачи ранжируются по приоритетам и сложности
Задачи ранжируются по приоритетам и сложности

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

Задача учителя — отслеживать решение задач учениками и на основе этого выстраивать занятие
Задача учителя — отслеживать решение задач учениками и на основе этого выстраивать занятие

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

Хорошая иллюстрация делает теорию проще для понимания
Хорошая иллюстрация делает теорию проще для понимания

Чек‑листы, инструкции и хорошо описанные API значительно увеличат решаемость задач. Необходимая информация должна быть «рядом» с заданиями.

Интерактивная платформа для персонализации обучения

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

Задачи можно сдавать сколько угодно раз, но каждый раз будет генерироваться новая
Задачи можно сдавать сколько угодно раз, но каждый раз будет генерироваться новая
Скрипт-генератор на Python для Open edX для примера выше
<problem>
  <script type="loncapa/python">

w, h = 8, 4
c = random.randint (0, (1 &lt;&lt; (w * h)) - 1)
pic = ' '.join (['%s&lt;br /&gt;' % ' '.join (['&lt;{0} class="a {1}"&gt;&lt;/{0}&gt;'.format ('b', 'i' if (c &gt;&gt; (x + w * y)) &amp; 1 == 0 else 'b') for x in range (w)]) for y in range (h)])
c2 = int (str (bin (c))[2:][::-1], 2)
d = '%x' % c2
d2 = d.upper ()

</script>
  <p>Постройте двоичный код черно-белого рисунка и запишите ответ в шестнадцетиричной системе?</p>
  <style>
.pic788 b.a {
  display: inline-block;
  width: 1em;
  height: 1em;
  margin: -0.1em;
}
.pic788 b.b {
  background: #101010;
}
.pic788 b.i {
  background: #f0f0f0;
}
.pic788 {
  padding: 1px 2px 0px 3px;
  line-height: 1.1em;
  background: #808080;
  display: inline-block;
}
  </style>
  <p class="pic788">$pic</p>
  <br/>
  <stringresponse answer="$d">
    <additional_answer>$d2</additional_answer>
    <textline size="10"/>
  </stringresponse>
</problem>

С помощью генератора удобно отрабатывать математические концепции алгоритмов
С помощью генератора удобно отрабатывать математические концепции алгоритмов
Скрипт-генератор на Python для Open edX для примера выше
<problem>
  <script type="loncapa/python">
    

import random

def insert_pivot(array, value):
    assert array
    maxs = list(map(lambda i: max(array[:i + 1]), range(len(array))))
    mins = list(map(lambda i: min(array[i:]), range(len(array))))
    places = set(filter(lambda i: maxs[i] &lt;= mins[i], range(len(array))))
    places.add(-1)
    places.add(len(array) - 1)
    pivot = random.choice(list(places)) + 1
    return array[:pivot] + [value] + array[pivot:]

def F(k, n):
    assert k &lt;= n
    assert 0 &lt; n
    if k == n:
        result = [k]
    else:
        result = insert_pivot(F(k + 1, n), k)
    return result

def G(c):
    n = 10
    if c:
        result = F(1, n)
    else:
        result = list(range(1, n + 1))
        random.shuffle(result)
    return ' '.join(map(lambda x: chr(ord('A') + x - 1), result))

o = list(range(5))
random.shuffle(o)
c = [True] * 2 + [False] * 3
c = list(map(c.__getitem__, o))
t = list(map(G, c))

t1, t2, t3, t4, t5 = t
c1, c2, c3, c4, c5 = c
answer = ' '.join(map(lambda x: str(x + 1), filter(c.__getitem__, list(range(5)))))

    
    </script>
  <p>
    Программе на вход подаются элементы A B C D E F G H I J, в указанном порядке. Программа может помещать элемент в стек, а также извлекать элемент из стека и выводить на экран. Какие результаты из указанных ниже могут быть выведены на экран этой программой.
    </p>
  <p>
    В ответ запишите в возрастающем порядке номера вариантов разделенные пробелом.
    </p>
  <p>
    1. $t1<br/>
    2. $t2<br/>
    3. $t3<br/>
    4. $t4<br/>
    5. $t5<br/>
    </p>
  <stringresponse answer="$answer" type="ci">
    <textline size="20"/>
  </stringresponse>
</problem>

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

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

Перевернутый класс

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

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

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

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

Примерные этапы занятия по программированию в формате перевернутого класса, длительностью два часа:

Описание этапа занятия

Время на этап

Обсуждение и фиксация прогресса по задачам в формате стендапа: что сделано, что осталось сделать, что мешает

10 минут

Погружение в тему через индивидуальные или групповые задания в Miro

15 минут

Обсуждение плана занятия и плана на неделю

5 минут

Индивидуальное изучение темы по материалам на платформе

10 минут

Прохождение тренажера на платформе для отработки понимания концепции

20 минут

Решение задач по программированию или разработка проектов

30 минут

Резервное время для продолжения программирования, обсуждения вопросов

30 минут

Мягкие навыки - Soft skills

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

В рамках одной из международных инициатив, профинансированных Microsoft, Intel и Cisco, была выделена основная группа мягких навыков, рекомендованных для развития у современных школьников. Эти навыки объединены в один метанавык — «совместное решение сложных задач», целью которого является подготовка учащихся к успешной интеграции в современную экономику.

Группа навыков "Совместное решение сложных задач". Из исследования AT21CS
Группа навыков "Совместное решение сложных задач". Из исследования AT21CS

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

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

Для развития навыка совместного решения сложных задач необходимо, чтобы у учеников была задача или «вызов», требующий как умственных усилий (когнитивные навыки), так и сотрудничества с другими людьми (социальные навыки).

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

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

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

Мотивация, игрофикация и визуализация

Современному образованию тяжело конкурировать с компьютерными играми
Современному образованию тяжело конкурировать с компьютерными играми

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

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

Игрофикация (gamification) — это один из инструментов управления деятельностью людей. Как и любой инструмент, он может приносить как относительную пользу, так и относительный вред.

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

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

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

Внешняя мотивация может существенно различаться по степени воздействия на автономию.

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

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

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

Я применяю игрофикацию в основном для визуализации, например, правил поведения на занятиях, учебного прогресса и приоритизации активностей.

И руководствуюсь следующими принципами:

  • «Игра», хоть и должна быть привлекательной, не должна оказываться в центре занятия. Она сопровождает и усиливает учебную деятельность, и только. С неё должно быть легко переключиться на основную деятельность.

  • Необходимо избегать сильных стимулов: ценных призов или иных существенных поощрений или наказаний.

  • Ученики могут отказаться от «игры» в любой момент.

  • «Игра» должна вестись по объективным, утвержденным правилам, которым подчиняется и учитель. Учитель не использует возможности админа для краткосрочной выгоды, в ущерб балансу. Иначе это становится банальным инструментом манипуляций.

Внешняя мотивация основанная на сильных стимулах подавляет автономию ученика
Classcraft — платформа для игрофикации обучения

Игрофикация позволяет:

  • Избежать прямых конфликтов с учениками: опоздавший или хулиган получает дебафы в «игре», а не строгий выговор. Кстати, первое наказание для ребят обычно страшнее.

  • Поощрять дополнительную активность с помощью незначительных дополнительных наград в «игре».

  • Визуализировать прогресс: чем дальше ученики продвигаются по курсу, тем больше возможностей открывается в «игре».

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

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

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

Много лет я использовал Classcraft — инструмент игрофикации, основанный на фэнтезийном сеттинге с элементами RPG. Но он мне немного поднадоел, поэтому я создал собственное приложение игрофикации, что‑то похожее на сильно упрощённый Тинькофф Инвестиции. В нём ученики могут получать на счет золото, которое затем могут обменять на доллары и покупать и продавать акции FAANG по реальному курсу. Это позволяет им, например, удачно инвестировать и увеличить свой капитал, или наоборот, потерять заработанные тяжелым гриндом усердным решением олимпиадных задач и сдачей проектов средства. Как побочный эффект, также может развиться финансовая грамотность и интерес к новостям в мире ИТ.

Приложение "Investor" для игрофикации обучения Computer Science
Приложение «Investor» для игрофикации обучения Computer Science

Отбор учеников и математика

Личность ученика играет ключевую роль в его способности успешно пройти курс. При формировании групп для обучения программированию я уделяю внимание следующим навыкам:

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

  • Базовая компьютерная грамотность: ввод текста на английской раскладке, установка и настройка программ, работа с файлами.

  • Метапредметные навыки: самостоятельность, осознанность, концентрация внимания, коммуникация.

Навыки в Scratch, робототехнике или Unity, полученные на уровне, который предлагается в большинстве кружков, по моим наблюдениям, не дают особых преимуществ в изучении Computer Science.

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

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

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

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

С какого возраста начинать?

Мне кажется, оптимальный возраст, когда школьники готовы изучать программирование, это 7–8 класс. В это время они как раз проходят полезные для Computer Science темы по математике: вычисления, функции и координатную плоскость.

Если у ребёнка есть интерес к математике, то эти темы он вполне может освоить при прохождении курса, в этом случае планку можно понизить до 6-го класса.

Заключение

  • Школьников можно и нужно учить алгоритмам и структурному программированию, если хотим подготовить их к карьере в ИТ.

  • Для этого нужна хорошо структурированная программа по Computer Science и работа над методикой обучения.

А вы как считаете, какие навыки нужно развивать в школе, чтобы потом хорошо чувствовать себя в ИТ?

Комментарии (13)


  1. MAXH0
    13.10.2023 11:40

    Ну что сказать - неплохая реклама курсов по 2 т.р. час с 5 человек в группе. Т.е. человек выставил себе ценник 10 т.р. час и на вопрос почему такая цена скромно отвечает: Потому что "занятия веду лично я"...

    Сами курсы мне понравились и по содержанию и по интерактиву, но цена откровенно коробит (Я работаю за бюджет и репетиторством не занимаюсь принципиально)...
    И еще коробят несколько фразы, которые часто проскальзывают у наших "цифровизаторов" образования: про фокус внимания, геймификацию и "современного человека". Эволюция вещь неторопливая и за 10 лет ни какого нового человека не формируется. И если концентрации нет, то значит надо её развивать. А не надеяться на интерактив.


    1. ufarobot Автор
      13.10.2023 11:40

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

      Но согласен, аргументы касательно цены подобраны неудачно; убрал их. Спасибо, что подчеркнули. А по содержанию статьи у вас есть комментарии?


      1. MAXH0
        13.10.2023 11:40

        Так они ниже... Курсы хорошие (скорее всего:). В особого "современного человека" я не верю, но это просто вера. В холивар я ударяться не буду. Я старательно объясняю ученикам, что концентрация = базовый навык программиста. Вы сами легко можете найти статьи на эту тему. И стремлюсь его формировать... И т.д.

        Мой личный выбор либо Python либо JavaScript. Python - это предподготовка к Cириусу. Там хороши и их курсы по олимпиадному программированию. JavaScript - прикладное web-программирование.

        Вы назвали идеальным возрастом 7-8 класс. Я тоже считаю его идеальным. НО подготовку лучше вести с 6 продвинутого. 5 класс не имеет еще той усидчивости. И главное, написание кода требует навыков вербального мышления. А оно только с 10+-2 лет начинает формироваться.


        1. ufarobot Автор
          13.10.2023 11:40

          Сами курсы мне понравились и по содержанию и по интерактиву, но цена откровенно коробит (Я работаю за бюджет и репетиторством не занимаюсь принципиально)...

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

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

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

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

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


          1. MAXH0
            13.10.2023 11:40
            +1

            Что-то мы не верно начали знакомство на Хабре.
            Прежде всего - "Добро пожаловать!"... Я посмотрел Ваши ответы - кругом взвешенная позиция. Адекватных людей на Хабре мало. А лично я, к тому же, рад видеть здесь коллегу.

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

            По поводу цены курса - это Ваше личное право. Раз есть с кем работать, то почему бы не работать. НО... Для меня бесплатные курсы Степика и Сириуса важнее и ценнее, чем Ваш курс. И это мое личное право так считать.

            Отдельное спасибо за наводки на некоторые документы и библиотеки. Если соберусь вводить курс по Java воспользуюсь вашим опытом. Хотя скорее не соберусь - и так фрагментация велика.

            Еще раз "Добро пожаловать" +


            1. ufarobot Автор
              13.10.2023 11:40

              Спасибо за ваши добрые слова!

              Вы правы, одна из целей поста — в конечном счёте, реклама курсов. Но основная причина, почему я решил заняться созданием и продвижением авторского курса, — это популяризация хардкорного computer science.

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

              Рад, что вы оценили предложенные мной материалы и библиотеки. Надеюсь, они пригодятся в вашей работе, если вы решите внедрить курс по Java.


  1. IvanSTV
    13.10.2023 11:40
    +1

    Для начала определимся с долгосрочными целями школьного ИТ‑образования, рассматриваемые в статье и о метриках измерения его эффекта.

    Цели обучения с точки зрения учеников:

    • Поступить на ИТ‑специальность ведущего ВУЗа

    • Профессионально реализоваться как программист

    Не подменяйте понятия. Школьное ИТ-образование ставит отнюдь не эти цели. Задача школьного образования - это дать учащимся общие знания о принципах работы с компьютером, алгоритмизации, ознакомление с началами программирования.
    А то, что вы написали - это задача углубленных курсов для детей школьного возраста (причем, старшего школьного возраста) по изучению программирования. Только несколько процентов школьников ставят себе цель профессионально реализоваться как программист. Забавно, но ниже вы пишете:

    В 2017 я начал вести одну группу для казанских шестиклассников, отличившихся в олимпиадах по математике,

    То есть, вы все-таки не о "просто школьниках" пишете. Я вам по секрету скажу, что олимпиадники - это дети УЖЕ ХОРОШО МОТИВИРОВАННЫЕ, и они вкурят проблему ПРАКТИЧЕСКИ В ЛЮБОМ ФОРМАТЕ, у них есть навык самообучения и самостоятельной работы, и весь труд преподавателя - это их направить,, здесь разговор, что-де "у меня есть хорошая методика для школьников" почти бессмысленен и сводится только к обсуждению преимуществ одной программы обучения перед другой.

    Я могу обучать олимпиадников по любому из предметов моей специализации (философия, политология), вообще не напрягаясь, как студентов ВУЗов. И будет неплохой результат! Нетрудно обучать олимпиадников, потому что они сами берут все, что им дают. Трудно обучать НЕ-ОЛИМПИАДНИКОВ, но вы об этом ни строчки не написали, подменив понятие "школьника" олимпиадниками.


    1. ufarobot Автор
      13.10.2023 11:40

      Не подменяйте понятия. Школьное ИТ-образование ставит отнюдь не эти цели.

      Здесь слово "школьное" применяется в смысле возраста, то есть ИТ-образование для детей школьного возраста.
      Если речь идёт об образовательных стандартах, то предмет называется "информатика". Да, я не имею в виду школьную информатику, когда говорю об "ИТ-образовании".

      То есть, вы все-таки не о "просто школьниках" пишете. 

      Вы правы по поводу олимпиадников. Я могу с вероятностью, близкой к 80–90%, поручиться, что если ко мне на курс придёт ребёнок, увлечённый математикой и способный концентрироваться, то он будет успешен на моём курсе. Поэтому я и рекомендую в конце статьи родителям отдавать приоритет математике. Кажется, про обычных школьников я не писал.
      Более того, на свои курсы я провожу отбор, где оцениваю математику и метапредметные навыки. Но быть олимпиадником необязательно; достаточно хорошо знать школьную программу. Это на самом деле тоже проблема, так как у большинства школьников с этим возникают трудности.


    1. ufarobot Автор
      13.10.2023 11:40

      Я вам по секрету скажу, что олимпиадники - это дети УЖЕ ХОРОШО МОТИВИРОВАННЫЕ, и они вкурят проблему ПРАКТИЧЕСКИ В ЛЮБОМ ФОРМАТЕ, у них есть навык самообучения и самостоятельной работы, и весь труд преподавателя - это их направить,, здесь разговор, что-де "у меня есть хорошая методика для школьников" почти бессмысленен и сводится только к обсуждению преимуществ одной программы обучения перед другой.

      Олимпиадник олимпиаднику рознь. Все дети разные и по-своему уникальные. Вы не представляете, сколько талантливых ребят разочаровались и разочаровываются в ИТ, в программировании. Успех в обучении — это как минимум произведение следующих факторов: образовательной программы, методики, личности учителя и личности ученика. Таланты ученика могут быть сведены на нет, если, например, предложить ему "любую программу" или учителя, который уверен, что напрягаться должен только ученик.

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

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

      Есть еще один момент с олимпиадниками, который меня сильно беспокоит. В большинстве кружков, которые я наблюдал, практикуется спартанский подход — выживает сильнейший. Если ученик выпадает из топа, то им никто не занимается и скорее всего исключат. То есть учителя как бы не несут ответственность за обучение всей группы. Наверное, это выглядит прагматично и логично с точки зрения учителя. Но с точки зрения родителя или самого ученика такой подход, конечно, не вызывает восторга. Поэтому я практикую "гуманный" подход, в том числе в олимпиадной подготовке. Для меня важен каждый ученик, и я несу ответственность за них. Я стараюсь основные силы тратить на отстающих. Именно поэтому я в начале обозначил метрику "доходимость" как основную.


  1. Negativelink
    13.10.2023 11:40

    Интересно, что сейчас в России многие ВУЗы преподают программирование даже для студентов, которые им никогда не интересовались на специальностях, при изучении которых зачастую даже математика нужна весьма ограниченно (лингвистика, например). В результате, на входе такой образовательной программы появляются такие же "школьники", но значительно взрослее (первый курс), а времени на их обучение остается очень немного (1-2 семестра). При этом навыки определенно требуются в дальнейшем, при изучении дисциплин на более старших курсах. Проблема отсутствия мотивации к изучению здесь стоит не менее остро, чем в случаях, описанных в статье.


  1. bpwalex
    13.10.2023 11:40
    +1

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


  1. lukashov159
    13.10.2023 11:40
    +1

    Сохранил. Пока 4класс.


  1. dprotopopov
    13.10.2023 11:40

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

    Нескромный вопрос - а по дороге кормить будут?