Почему Haskell в школе имеет значение

Сегодня хочу поделиться прекрасным опытом.

Я профессор вводного программирования в течение двух лет в школе Флорентино Амегино и двух курсов (функциональное программирование и структуры данных) в Национальный университет Кильмеса

В этот раз я хочу рассказать о своей работе в школе. Я пятый год работаю школьным профессором. Детям 15-16 и 16-17 лет (4-й и 5-й класс общеобразовательной школы соответственно).

В прошлом году у студентов 4 курса не было опыта программирования. То же самое не происходит с нынешним 4-м курсом, так как они уже давно играют с Царапать когда они были на 3 курсе.

плюй-камни.png

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

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

гобстейбл.png

Примитивные значения (и типы):

Colors: Red, Blue, Green, Black
Directions: North, South, East, West
Integers
Booleans

Примитивные команды:

PutStone(<color>)
TakeStone(<color>)
MoveTo(<direction>)

И есть определения новых процедур и функций:

procedure <procedureName>(<params>)
{ <commands> }

function <functionName>(<params>)
{ 
   <commands>
   return(<expression>)
}

примерgobs.jpg

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

procedure PutNStones(n, color)
{
  repeatWith i in 1 .. n
    { PutStone(color) }
}

procedure GoToEdge(dir)
{
    while(canMoveTo(dir))
     { MoveTo(dir) }
}

function countCellsOfCurrentColumn()
{
    GoToEdge(South)
    result := 1
    while(canMoveTo(North))
    { 
        MoveTo(North)
        result := result + 1
    }
    return(result)
}

procedure Main()
{
    PutNStones(countCellsOfCurrentColumn(), Blue)
}

«Могу ли я вызывать процедуры внутри функций?» — ответ «Да». Но глобальное состояние до и после вызова функции остается неизменным. Эффекты, возникающие внутри функции, отменяются, когда функция возвращает значение.

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

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

На четвертом курсе результаты такие:

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

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

Меня, как и других педагогов, беспокоит следующее:

  • Почему некоторым (или большинству) детей не нравится программирование?
  • Какие студенты успешно изучают программирование?
  • У кого из них могут возникнуть трудности с изучением этой дисциплины?
  • Как мы можем мотивировать учащихся в этом возрасте изучать программирование?

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

К счастью, это был не конец.

Я научился программировать, как те дети, используя Gobstones для изучения основных концепций структурного программирования. Затем я встретил Хаскелла и многих других. Но только «Haskell» расширил мои знания о математике и языках программирования до невообразимых пределов. Но почему Haskell поощрял это? Есть ли у меня какие-то специальные навыки для понимания абстрактных концепций и рассуждений о коде, который я пишу (см. свойства в нем)?

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

Результаты необыкновенные:

  • Многие апатичные студенты очнулись от своей летаргии. Теперь они становятся очень активными и отвечают на очень сложные вопросы, иногда даже лучше, чем другие более преданные своему делу студенты.
  • Большинство студентов могут делать очень абстрактные решения и легко моделировать свои идеи.
  • Все они согласны с тем, что императивное программирование было сложнее, и многие поражены тем, что Haskell — это язык программирования.

Когда я впервые представлял Haskell в обеих группах, они всего за два часа делали выводы по этим темам:

  • Функции, выражения и типы (они отвечают на вопросы о типе функций и выражений)
  • Параметрический полиморфизм и полиморфные функции
  • Куррификация
  • Сумма и типы произведений
  • Сопоставление с образцом.
  • Пристрастность и использование «Может быть».

На втором занятии с 5-го курса (еще два часа) они научились:

  • Списки, их конструкторы и операции (head, tail, null и т.д.). Они выводят типы всех функций и видят соответствие того, что они делают, на основе типов.
  • Сопоставьте, отфильтруйте и сложите, сравнивая их с итеративными реализациями на Python.
  • Они вывели типы функций пареметра. Одна девушка поняла разницу между foldr и foldl и сказала: «Если бинарная операция ассоциативна, результат будет тот же».
  • Наконец, мы обсудим, почему для функции map используется название «карта».

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

функциональное_программирование.png

Мои последние личные выводы о происходящем следующие:

  • Они очень рады видеть реализацию алгебраического типа данных покемонов, так как они отмечают, что программы имеют такие определения и свойства, в отличие от рисунков, которые они видят на экране, которые являются только эффектными. Им нравится осознавать, насколько абстрактен код, и большинство из них не приходят к таким выводам, когда программируют на императивных языках.
  • Им не нравится делать игры и развлекаться в школе, они хотят изучать актуальные идеи, которые можно использовать в реальных и даже сложных ситуациях. Они хотят быть полезными и давать правильные ответы на сложные вопросы.
  • Haskell не призывает вас думать как машина. Многим это не нравится (и мне тоже). У многих детей нет процедурного ума, но они могут многое абстрагироваться, так что мы можем получить очень хорошее приближение, используя это. Они могут изучить операционные концепции позже, но они не смогут, если не будут чувствовать себя комфортно в том, что они программируют и рассуждают о своем коде. Это возможно при правильном подходе.

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *