alexfox's blog

By alexfox, 3 years ago, In Russian

Всем привет!

В данном посте я расскажу про то, как студенты УрФУ программируют в курсе алгебры. Этот курс несколько лет используется на ФИИТ УрФУ, а с 2023 года будет использоваться в новом алгоритмическом бакалавриате.

Для начала я дам слово одному из тренеров по спортивному программированию в УрФУ Дмитрию Косолобову:

— Давным-давно, в 2007 году, я слушал алгебру на первом курсе в УрФУ (тогда еще УрГУ). И мы с одногруппниками-олимпиадниками ворчали (между собой, т.к. преподавателю сказать боялись, да и не думали, что это что-то изменит) на разные аспекты преподавания. Среди «ворчунов» был Алексей Ефремов — победитель ВсОШ по информатике и Михаил Рубинчик — призер ВсОШ, а сейчас тренер УрФУ по спортивному программированию, как и я. Сам я олимпиадником не был и не являюсь, моя основная деятельность — наука и преподавание.

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

Тогда, в 2007, наше ворчание между собой на том и кончилось. А спустя годы так вышло, что меня пригласили реформировать курс алгебры.

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

Участники первой встречи

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

  • Попович Александр
  • Плющенко Андрей
  • Гейн Александр Георгиевич
  • Косолобов Дмитрий

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

После запуска курса к процессу подключился Гейн Павел — призёр ВКОШП и полуфинала ICPC, преподаватель ШАДа, разработчик Яндекса. Он участвовал в обкатке курса, а также лично придумал и реализовал задачи для самоконтроля на ulearn.me (о них скажем ниже).

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

Что было

Алгебра и геометрия — классический курс, который преподают первокурсникам всех математических и программистских направлений в стране. Программа была сформирована десятилетия назад и с годами почти не менялась: у студентов было 1-2 лекции, на которых разбиралась теория, и 1-2 практики, где решались задачи на теорию с лекций (количество лекций и практик зависит от подхода университета). Курс совсем не адаптировался под будущих программистов, и нужно было как-то мотивировать студентов серьезно отнестись к этому предмету. Перед нами встала непростая задача: максимально приблизить курс к практике, не потеряв интеллектуальную составляющую. Курс алгебры не должен был превратиться в сборник математических рецептов, он должен был давать студентам глубокое понимание основ всех методов, развивать мозг и учить студентов языку математики.

Что мы сделали

  1. Сократили группы обучения: было 20-30 человек (на других направлениях так и остается), стало 10-15 человек.
  2. Добавили в курс элементы самопроверки.
  3. Ввели компьютерные практики.
  4. Перестроили последовательность чтения лекций так, чтобы было легче понимать алгебраические объекты и демонстрировать практическую пользу курса.
  5. Добавили одну новую тему — сингулярное разложение — и демонстрации ее использования.

В итоге курс получился не для слабаков: материала в нем много, да еще и программировать на математическом предмете приходится. В августе 2019 на встречах реформаторов периодически звучали вопросы: «А студенты-то вообще вывезут?».

Самопроверка

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

Компьютерные практики

Компьютерные практики — задачи, которые давались для решения на одну неделю. Через неделю их можно было сдать и получить максимальные или почти максимальные баллы. Следующая неделя после сдачи отводилась на дорешивание задач с помощью выложенных подсказок. На дорешивании можно было получить 1/3 от максимального балла.

Для практик был выбран язык Python. Некоторые студенты познакомились с ним еще в школе. Но перед тем, как выдать первое задание, ребятам дали краткий туториал с минимумом необходимых знаний средств языка и задачами для самопроверки. Студенты, у которых возникали вопросы, могли прийти на специальную консультацию от Дмитрия Косолобова и Виктора Самуня (преподаватель курса по Python) или в специально созданный чатик техподдержки в Telegram на тему языка и среды Jupiter Notebook.

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

Приём задач состоит из 3 частей:

  • Проверка на антиплагиат
  • Автоматическое тестирование (как на олимпиадах)
  • Устное объяснение решения

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

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

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

Пример задачи

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

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

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

Изменили программу

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

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

Последовательность тем лекций выбиралась одновременно с построением последовательности тем практик (в том числе компьютерных). Обычно в приоритете был выбор тем практики, чтобы вместо практик не возникала пустота.

Делать упор на практичность нам удаётся без упрощения материала — мы не только не выбросили из курса доказательства и всякие математические интересности, но и добавили новых.

Интенсивность у курса очень высокая. Если студент что-нибудь не поймёт, он может надолго выпасть из происходящего. Так что и последовательность тем, и подача каждой лекции идут от простого случая к абстракции. Например, определитель матрицы вводится не просто формулировкой «поверьте: вот тут всегда плюс, а вот тут всегда минус», а через геометрический смысл объёма; всю векторную алгебру сначала показываем на 2х и 3х мерных случаях, а уже потом переходим к n-мерным абстракциям. Это немного замедляет, но значительно увеличивает вероятность понимания с первого раза.

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

Полная программа курса

Самая любимая тема Димы

К классическим темам добавилось сингулярное разложение (aka SVD aka Метод главных компонент aka PCA). Используется в машинном обучении и статистических расчётах, распознавании лиц, приближенной трансформации точек поворотами, фильтрации видео и других интересных вещах.

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

Программирование не только в алгебре

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

  • Vote: I like it
  • +52
  • Vote: I do not like it