Проектирование больших систем на С++ — различия между версиями

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 48 промежуточные версии 1 участника)
Строка 3: Строка 3:
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
  
Занятия проводятся по вторникам шестой парой (в 18:00).
+
Занятия проводятся по вторникам шестой парой (в 18:00) '''ДИСТАНЦИОННО''', ссылка на видеоконференцию публикуется в [https://t.me/+OlbcW8JHJMdjOGZi чате в Telegram]
  
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
Строка 15: Строка 15:
 
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
 
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
  
== Занятия в 2024 г. ==
+
== Занятия в 2025 г. ==
'''Занятия 05.11.2024 не будет! (преподаватель на больничном по уходу за собой)'''
+
  
'''Занятия 29.10.2024 не будет!'''
+
* [https://docs.google.com/spreadsheets/d/1qxbn-J2YLaPhsL-msDzq8Od13aR1j1lp_JGvFNtwnmk/edit?usp=sharing Таблица результатов]
 
+
* [https://t.me/+OlbcW8JHJMdjOGZi Чат в Telegram]
* [https://docs.google.com/spreadsheets/d/1daYZmqfhzrqL30kgwXsSy0f5zUFXY8yf5jTKFlMicJo/edit?usp=sharing Таблица результатов]
+
* Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
* Первое занятие состоится 3 сентября.
+
* Следующие задания проводятся дистанционно.
* Тест 1: 17.09.2024
+
* Досрочный экзамен: 23.12.2025 18:00 (ауд. 504)
* Тест 2: 24.09.2024
+
* Основной экзамен: 20.01.2026 13:00 (ауд. 579)
* Тест 3: 01.10.2024
+
* Тест 4: 08.10.2024
+
* Тест 5: 15.10.2024
+
* Тест 6: 12.11.2024
+
* Тест 7: 19.11.2024
+
* Тест 8: 26.11.2024
+
* Досрочный экзамен: DD.MM.YYYY HH:MM (ауд. NN)
+
* Основной экзамен: DD.MM.YYYY HH:MM (ауд. NN)
+
  
 
== Экзамен ==
 
== Экзамен ==
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50.
+
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.
  
 
* Оценка '''отлично''': не менее 40 баллов
 
* Оценка '''отлично''': не менее 40 баллов
Строка 40: Строка 31:
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
  
За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:
+
[[Media: Pbs_exam_example_2024.pdf|Пример экзаменационного варианта (pdf)]]
* Оценка '''отлично''' (автомат)
+
* Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
+
* Возможность участвовать в досрочном экзамене
+
 
+
Критерии получения бонусов см. в таблице успеваемости.
+
 
+
[[Media: Pbs_exam_example.pdf|Пример экзаменационного варианта (pdf)]] (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)
+
  
 
== Содержание курса ==
 
== Содержание курса ==
'''Занятие 1.''' Организационные вопросы. C++ Style Guide. Вводный тест.
+
'''Занятие 1.''' Введение. Организационные вопросы. Вводный тест. Стиль кодирования.
 +
* [https://disk.yandex.ru/i/RS2x0iZmCY-NDQ Лекция 1]
 
* [https://github.com/catboost/catboost/blob/master/CPP_STYLE_GUIDE.md Yandex C++ Style Guide].
 
* [https://github.com/catboost/catboost/blob/master/CPP_STYLE_GUIDE.md Yandex C++ Style Guide].
 
* [https://google.github.io/styleguide/cppguide.html Google C++ Style Guide]
 
* [https://google.github.io/styleguide/cppguide.html Google C++ Style Guide]
 
'''Занятие 2.''' Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.
 
* [https://disk.yandex.ru/i/YgMRuCOO5XNAnw Лекция 2]
 
* [https://disk.yandex.ru/i/YQRRH-kfxgs_Kw Дополнительные слайды] (исключения вывода типа для auto, value-категории, информация для теста)
 
 
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
* [https://disk.yandex.ru/i/dSbYR9vwi8SGQw Задание 1] (больше не принимается)
+
* TODO на 2026 год: добавить в слайды контент на 20 минут. Можно, например, про STL напомнить.
  
'''Занятие 3.''' Лямбда-выражения. Связыватели. Некоторые особенности C++17.
+
'''Занятие 2.''' Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).
* [https://disk.yandex.ru/i/s_xbIq4nUrZ4PA Лекция 3]
+
* [https://disk.yandex.ru/i/7-DPnwcUrkONYA Лекция 2]
* [https://disk.yandex.ru/i/EsnIYzNCQylo9Q Задание 2] (больше не принимается)
+
* [https://disk.yandex.ru/d/L19s661Y8JrTyA Задание 1] (результаты см. в таблице успеваемости в отдельной вкладке)
  
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
+
'''Занятие 3.''' Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).
* [https://disk.yandex.ru/i/kzEnu6IkyBDFyg Лекция 4]
+
* [https://disk.yandex.ru/i/i3EFnpjuyybS6w Лекция 3]
 +
* [https://disk.yandex.ru/i/_p8FUMICX1XnwQ Запись лекции]
  
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
+
'''Занятие 4.''' Семантика перемещения в C++.
* [https://disk.yandex.ru/i/h-uQEspqzaqR-g Лекция 5]
+
* [https://disk.yandex.ru/i/fC2fUMpHDZ6IOA Лекция 4]
* [https://disk.yandex.ru/i/wsD6fWbzC5OkmQ Задание 3] (больше не принимается)
+
* [https://disk.yandex.ru/i/hflbAyVsoTVwBA Запись лекции]
* [https://disk.yandex.ru/d/VCOpY0oE6NvgCQ Мемы про Ложкина]
+
* TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.
  
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
+
'''Занятие 5.''' Операторы new и delete. Умные указатели. Управление владением памяти.
* [https://disk.yandex.ru/i/1Nl2sBwn6ZTNxw Лекция 6]
+
* [https://disk.yandex.ru/i/VIoQHePuAQd7ow Лекция 5]
* [https://disk.yandex.ru/i/h6TH_DyT4ctS2A Задание 4] (больше не принимается)
+
* [https://disk.yandex.ru/d/eFyL3Xl08USEAg Запись лекции]
* [https://mks2.cs.msu.ru/root/pbs_tree Код для задания 4]
+
  
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
+
'''Занятие 6.''' Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.
* [https://disk.yandex.ru/i/EUs0mYjw8IVKeg Лекция 7]
+
* [https://disk.yandex.ru/i/AVYcaBknBY2qMA Лекция 6]
* [https://mks2.cs.msu.ru/root/pbs_examples_2024 Репозиторий, где пишем код на занятиях]
+
* [https://disk.yandex.ru/i/RGy1wEp6qVfICg Запись лекции]
 +
* TODO на 2026 год: добавить хрона на 20 минут
  
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
+
'''Занятие 7.''' Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.
* [https://disk.yandex.ru/i/5-9XGr4aQR9C2w Лекция 8]
+
* [https://disk.yandex.ru/i/KoXyTFzqz1COlQ Лекция 7]
 +
* [https://disk.yandex.ru/i/XjJStMwlxdIkkQ Запись лекции]
 +
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
 +
* TODO на 2026 год: реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие
  
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder
* [https://disk.yandex.ru/i/6Ggf49W6ABX9Ag Лекция 9]
+
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
* [https://disk.yandex.ru/i/wjUqFUiAv4dK_A Задание 5]
+
* [https://disk.yandex.ru/d/29jv8mY0b9pgbg Запись лекции]
  
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
+
'''Занятие 9.''' Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento
* [https://disk.yandex.ru/i/A0z1X7NJZLPNFQ Лекция 10]
+
* [https://disk.yandex.ru/i/UJy3YqRQctV0xw Лекция 9]
* [https://disk.yandex.ru/d/xN7XO0vN9nJ9tQ Котики 2023]
+
* [https://disk.yandex.ru/i/RgDFARE9MOXtXg Запись лекции]
* [https://disk.yandex.ru/d/-yCZ26QYPEh8iQ Котики 2024]
+
  
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
+
'''Занятие 10.''' Принципы SOLID, DRY, KISS, закон Деметры и принцип Tell Don't Ask. Антипаттерны.
* [https://disk.yandex.ru/i/VX2GqMOB9t76wA Лекция 11]
+
* [https://disk.yandex.ru/i/U8GEeji5tplglQ Лекция 10]
* [https://disk.yandex.ru/i/PszIrXsYR52scg Задача 6]
+
* [https://disk.yandex.ru/i/HP-aGOtM8OzIdA Запись лекции]
* [http://google.github.io/googletest/ Документация по googletest]
+
 
 +
'''Занятие 11.''' Правило SFINAE и альтернативы. Проблема перегрузки универсальных ссылок. Обработка исключений. Неопределенное поведение.
 +
* [https://disk.yandex.ru/i/BTykqhT7LgFG3w Лекция 11]
 +
* [https://disk.yandex.ru/i/TtMsjb37VqfMXw Запись лекции]
  
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
+
'''Занятие 12.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
* [https://disk.yandex.ru/i/gzYOfpC0JfJPJw Лекция 12]
+
* [https://disk.yandex.ru/i/Y6dlmjnbsa4Tlw Лекция 12]
* [https://disk.yandex.ru/i/Du4WrQRZeGi0RQ Задача 7]
+
* [https://disk.yandex.ru/i/i4Ihcs_MZqr1yw Запись лекции]
 +
* [http://google.github.io/googletest/ Документация по googletest]
  
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
+
'''Занятие 13.''' Отладка кода на C++. Оптимизация программ. Идиома Copy-On-Write. Упаковка структур. Сериализация данных. Protobuf.
* Лекция 13
+
* [https://disk.yandex.ru/i/pPHCQa6g2u_nrw Лекция 13]
* [https://disk.yandex.ru/i/XXJ48YldZyX9aw Задача 8] и [https://disk.yandex.ru/d/1Eur7mnEAK2hHw пример входного файла]
+
* Комментарии по проверке находятся в отдельном листе таблицы результатов.
+
  
'''Занятие 14.''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
+
== Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F) ==
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов]
+
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 +
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
  
 
== Литература ==
 
== Литература ==

Текущая версия на 14:53, 5 декабря 2025


Занятия проводятся по вторникам шестой парой (в 18:00) ДИСТАНЦИОННО, ссылка на видеоконференцию публикуется в чате в Telegram

Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит Владимир Владимирович Жуков.

В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.

В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.

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

Программа курса (pdf)

Занятия в 2025 г.

  • Таблица результатов
  • Чат в Telegram
  • Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
  • Следующие задания проводятся дистанционно.
  • Досрочный экзамен: 23.12.2025 18:00 (ауд. 504)
  • Основной экзамен: 20.01.2026 13:00 (ауд. 579)

Экзамен

Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.

  • Оценка отлично: не менее 40 баллов
  • Оценка хорошо: не менее 30 и не более 39 баллов
  • Оценка удовлетворительно: не менее 20 и не более 29 баллов

Пример экзаменационного варианта (pdf)

Содержание курса

Занятие 1. Введение. Организационные вопросы. Вводный тест. Стиль кодирования.

Занятие 2. Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).

Занятие 3. Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).

Занятие 4. Семантика перемещения в C++.

  • Лекция 4
  • Запись лекции
  • TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.

Занятие 5. Операторы new и delete. Умные указатели. Управление владением памяти.

Занятие 6. Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.

Занятие 7. Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.

Занятие 8. Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder

Занятие 9. Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento

Занятие 10. Принципы SOLID, DRY, KISS, закон Деметры и принцип Tell Don't Ask. Антипаттерны.

Занятие 11. Правило SFINAE и альтернативы. Проблема перегрузки универсальных ссылок. Обработка исключений. Неопределенное поведение.

Занятие 12. Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.

Занятие 13. Отладка кода на C++. Оптимизация программ. Идиома Copy-On-Write. Упаковка структур. Сериализация данных. Protobuf.

Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F)

Занятие 14 (2024). Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.

Литература

Основная

  • С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
  • Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
  • CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  • Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности. М.:Диалектика, 2017 г.

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

  • Klaus Iglberger. C++ Software Design: Design Principles and Patterns for High-Quality Software. O'Reilly Media; 1st edition. 2022.
  • Anthony Williams. C++ Concurrency in Action: Practical Multithreading.
  • А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
  • Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.
  • Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
  • Б. Страуструп, Язык программирования С++, 4-е издание.
  • Б. Страуструп, Программирование. Принципы и практика использования C++.
  • Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
  • Курс Основы C++ от Академии Яндекса.
  • Документация по Google Test.
  • Документация protobuf.
  • Yandex C++ Style Guide.
  • Google C++ Style Guide.