# Поговорить про программы курсов ШАДа
-----
## Зачем?
Потребители программ в ШАДе:
- Сайт ШАД
- Странички курсов в 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 баллов в сумме за все доступные задачи.