---
# System prepended metadata

title: Поговорить про программы курсов ШАДа

---

# Поговорить про программы курсов ШАДа

-----

## Зачем?

Потребители программ в ШАДе:

- Сайт ШАД
- Странички курсов в LMS
- Документы АНО ДПО ШАД

На сегодняшний день программы и описания **не синхронизированы** и **устарели**. Также сильно отличаются друг от друга странички курсов в LMS. Хотелось бы придумать единый формат, который подходит для всех трех потребителей и удобен преподавателям (и нам). А также собрать эту информацию в одном месте. В перспективе, нужно следить за версиями программ (например, через релизы) и добавить автоматизацию (например, конвертацию в .docx).

-----

## Нужно решить

- Какой формат использовать
- Где хранить программы
- Что должно входить в программу и насколько подробно

### Дополнительные вопросы:

- Является ли данная информация открытой?

-----

## Формат

### Предложение: Markdown (MD).

Аргументы "за":

- На сайте и LMS уже используется MD
- Легко конвертируется в .docx/.tex
- Куча бесплатных онлайн редакторов (например, этот)

Аргументы "против":

- .doc привычнее некоторым преподавателям

### ?

-----

## Место хранения

### GitHub

https://github.com/yandexdataschool/syllabi

За:

- Легко следить за изменениями
- Легко наладить версионность (например, если нужна программа прошлого года)

Против:

- Не все зарегистрированы на GitHub, не очень удобно это требовать
- На самом GitHub не очень удобный редактор (на GitLab получше)
- Есть преподаватели, не знакомые с Git - для них потребуется дополнительная работа по переработке материалов

### ?

-----

## Что должно быть в программе и в каком виде

- Название курса
- Количество лекций (полусеместровый или семестровый)
- Краткое описание
- Программа
- Список источников (литература, сайты, видео)
- Критерии оценки и каким образом осуществляется проверка (автоматическая или ручная)
- ?

------

# Пример 1: Функц. прогр., Денис Москалев.

LMS: https://lk.yandexdataschool.ru/courses/2015-spring/7.1233-functional_programming_hs/

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

Плохо:
 - Слишком подробное описание курса

# Функциональное программирование в языке Haskell

## Описание

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

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

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

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

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

## Программа

**1. $\lambda$-исчисление.** Функциональная модель вычислений. Чистое $\lambda$-исчисление. Подстановка и редукция.

**2. Рекурсия и редукция.** Теорема о неподвижной точке. Нормальная форма. Теорема Чёрча-Россера. Cтратегии редукции.

**3. Просто типизированное $\lambda$-исчисление.** Понятие типа. Просто типизированное $\lambda$-исчисление. Свойства просто типизированных систем.

**4. Введение в Haskell.** Язык Haskell. Основы программирования. Базовые типы. Операторы и их сечения.

**5. Типы данных.** Ленивость и строгость. Стандартные списки и работа с ними. Алгебраические типы данных и сопоставление с образцом.

**6. Классы типов.** Образцы и типы данных: дополнительные сведения. Классы типов. Стандартные классы типов.

**7. Свертки и развертки.** Свертки списков. Развертки и оптимизации. Полугруппы и моноиды. Класс типов Foldable.

**8. Аппликативные функторы.** Функторы. Класс типов Pointed. Аппликативные функторы.

**9. Использование аппликативных функторов.** Аппликативные парсеры. Класс типов Alternative. Класс типов Traversable.

**10. Монады.** Класс типов Monad. Монада Identity. Монада Maybe. Класс типов MonadFail. Список как монада.

**11. Использование монад.** Монада Reader: чтение из окружения. Монада Writer: запись в лог. Монада State: изменяемое состояние. Монада IO: ввод-вывод.

**12. Трансформеры монад.** Классы Alternative и MonadPlus. Монады с обработкой ошибок. Мультипараметрические классы типов. Трансформеры монад. Трансформер MaybeT.

**13. Вывод типов.** Главный тип. Подстановка типа и унификация. Теорема Хиндли-Милнера. let-полиморфизм и типы высших рангов.

## Критерии и методы выставления оценок за курс

Оценка отлично выставляется тем, кто наберет 90% баллов и более за выполнение домашних заданий, курсовой работы и тестирования. Оценка хорошо - тем, кто наберет 75% баллов. Оценка удовлетворительно (зачет) - тем, кто наберет 50% баллов. Большая часть баллов набирается слушателями в процессе прохождения приватного курса на платформе Stepik, разработанного специально для этого курса.

## Литература

### Основная:

- Miran Lipovača, Learn You a Haskell for Great Good! A Beginner’s Guide 2011 (русский перевод: Миран Липовача, Изучай Haskell во имя добра! Издательство: ДМК Пресс, 2012)
- Уилл Курт, Программируй на Haskell, М.:ДМК Пресс, 2019
- Vitaly Bragilevsky, Haskell in Depth, Manning Publications, 2020

### Дополнительная:

- Барендрегт Х., Ламбда-исчисление, его синтаксис и семантика, М.:Мир, 1985
- Филд А., Харрисон П., Функциональное программирование, М.:Мир, 1993
- John Harrison, Introduction to Functional Programming 
- Simon Peyton Jones, The Implementation of Functional Programming Languages,Prentice Hall, 1987
- Simon Marlow and Simon Peyton-Jones. The Glasgow Haskell Compiler.
- Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002 (русский перевод: Бенджамин Пирс, Типы в языках программирования, Издательство: Лямбда пресс, Добросвет, 2012)
- Sorensen M. H., Urzyczyn P. Lectures on the Curry-Howard Isomorphism. — Elsevier, 2006.
- Henk Barendregt, Lambda calculi with types, Handbook of logic in computer science (vol. 2), Oxford University Press, 1993
- Henk Barendregt, Wil Dekkers, Richard Statman, Lambda Calculus with Types, Cambridge University Press, 2013
- Саймон Марлоу. Параллельное и конкурентное программирование на языке Haskell. Издательство: ДМК Пресс, 2014

### Видео:

- Записи лекций для CSC, весна 2022: https://www.youtube.com/playlist?list=PLlb7e2G7aSpTDub2LFDVBvvjWj-53Gfuh


------

# Пример 2: С++, часть 1. Составленно по лекциям (осень 2023 года)

Хорошо:
 - Программа соответствует лекциям и семинарам, ее можно легко укоротить

Плохо:
 - Описание курса слишком лаконично и устарело
 - Отсутствует список источников
 - Не всегда просто восстановить описание лекции по видео - нужно отсматривать (пока не успел для лекций 9, 12 и 13)

# Обучение языку C++, часть 1

## Описание

С++ — мощный язык с богатым наследием. Тем, кто только ступил на путь освоения этого языка, очень просто заблудиться в изобилии техник и приёмов, созданных за последние 30 лет.  

Курс посвящён современному подмножеству языка — Modern C++ (стандарты 11, 14 и 17). Много внимания уделяется инструментам и библиотекам, которые не являются частью языка, но без которых не получится построить большой и сложный проект.  

## Программа:

1. **Введение и основы языка.** Стандарты С++. Компиляторы. Переменные, примитивные типы. Арифметические, логические, битовые операторы, операторы сравнения. Ввод и вывод. Функции, циклы, условия. Контейнеры и итераторы.
2. **Указатели, ссылки и структуры.** Массивы, указатели и ссылки. Операции с указателями. Время жизни объектов. Константность параметров. Структуры, перечисления. Передача параметров.
3. **Классы.** Структуры, методы, поля, переменная this. Константность методов, их аргументов, полей. Конструкторы, список инициализации, неявные преобразования. Инициализация по умолчанию. Модификаторы доступа.
4. **Шаблоны, STL, $\lambda$-функции.** Перегрузка функций и шаблонные функции. Шаблонные функции библиотеки STL. Шаблонные классы. Утиная типизация. Итераторы. Строки. $\lambda$-функции, список захвата и мутабельность.
5. **Динамическое управление памятью.** Автоматические переменные. Время жизни объектов. Операторы `new` и `delete`. Деструкторы. Копирование и перемещение. Правило пяти. Владение.
6. **Управление ресурсами.** Rvalue-ссылки и move-семантика. Управление ресурсами. RAII (Resource Acquisition Is Initialization). Умные указатели. Эксклюзивное владение и разделяемое владение. Передача владения.
7. **Наследование и полиморфизм.** Имена и области видимости. Поиск имени. Наследование. Принцип подстановки Лисков. Модификаторы доступа. Полиморфизм. Динамический полиморфизм. Приведение типов.
8. **Обработка ошибок и исключения.** Флаги выполнения и коды возврата. Either/Result. Исключения. Иерархия исключений. Гарантии безопасности исключений.
9. **Компиляция проектов.** 
10. **Расположение объектов в памяти. Выравнивание.** Структуры в памяти, Standard layout type (POD, Plain Old Data). Таблицы виртуальных функций. Выравнивание, операторы `alignof` и `alignas`. `std::aligned_storage`. Упаковка. Указатели на члены.
11. **Паттерны проектирования.** Порождающие паттерны: фабричный метод (Factory method), абстрактная фабрика (abstract factory), строитель (builder), cинглтон (singleton, одиночка). Структурные паттерны: мост (bridge), адаптер (adapter), компоновщик (composite). Поведенческие паттерны (behavioral): команда (command).
12. **Отладка в GDB.**
13. **Особенности стандарта С++ 20.**


## Критерии и методы выставления оценок за курс

### Домашнее задание

*Домашнее задание* — это одна большая задача, на решение которой нужно потратить значительное время.

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

Вероятные ДЗ:

 1. Получение изображения трёхмерной сцены с помощью трассировки лучей (рейтрейсинга)
 2. Интерпретатор для функционального языка
 3. Телеграм-бот

### Критерии оценивания

| семинары | 50-60% | 60-70% | 70-80% | 80-90% | 90-100% |
|----------|--------|--------|--------|--------|---------|
| 1 ДЗ     | незач  | зач    | зач    | зач    | зач     |
| 2 ДЗ     | зач    | зач    | хор    | хор    | отл     |
| 3 ДЗ     | зач    | хор    | хор    | отл    | отл     |

**Промежуточный дедлайн ШАД**: нужно получить >=2000 баллов в сумме за все доступные задачи.

