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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
(Содержание курса)
 
(не показаны 479 промежуточные версии 4 участников)
Строка 1: Строка 1:
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
[[Категория:Спецкурсы кафедры МК]]
 +
[[Категория:Лекционные курсы кафедры МК]]
 +
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
 +
 
 +
Занятия проводятся по вторникам шестой парой (в 18:00) '''ДИСТАНЦИОННО''', ссылка на видеоконференцию публикуется в [https://t.me/+OlbcW8JHJMdjOGZi чате в Telegram]
  
Занятия проходят по пятницам, с 8:45, в ауд. '''609'''.
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 +
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
 +
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
 +
 +
== Занятия в 2025 г. ==
 +
 +
* [https://docs.google.com/spreadsheets/d/1qxbn-J2YLaPhsL-msDzq8Od13aR1j1lp_JGvFNtwnmk/edit?usp=sharing Таблица результатов]
 +
* [https://t.me/+OlbcW8JHJMdjOGZi Чат в Telegram]
 +
* Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
 +
* Следующие задания проводятся дистанционно.
 +
* Досрочный экзамен: 23.12.2025 18:00 (ауд. 504)
 +
* Основной экзамен: 20.01.2026 13:00 (ауд. 579)
 +
 +
== Экзамен ==
 +
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.
 +
 +
* Оценка '''отлично''': не менее 40 баллов
 +
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 +
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 +
 +
[[Media: Pbs_exam_example_2024.pdf|Пример экзаменационного варианта (pdf)]]
  
 
== Содержание курса ==
 
== Содержание курса ==
 +
'''Занятие 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://google.github.io/styleguide/cppguide.html Google C++ Style Guide]
 +
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 +
* TODO на 2026 год: добавить в слайды контент на 20 минут. Можно, например, про STL напомнить.
  
'''Занятие 1.''' Вводный тест. Вывод типов шаблонов и auto. Ключевое слово decltype. Инициализация с фигурными скобками.
+
'''Занятие 2.''' Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).
 +
* [https://disk.yandex.ru/i/7-DPnwcUrkONYA Лекция 2]
 +
* [https://disk.yandex.ru/d/L19s661Y8JrTyA Задание 1] (результаты см. в таблице успеваемости в отдельной вкладке)
  
'''[[Media: Lection_pbscpp_2.pdf|Занятие 2]].''' Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr.
+
'''Занятие 3.''' Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).
 +
* [https://disk.yandex.ru/i/i3EFnpjuyybS6w Лекция 3]
 +
* [https://disk.yandex.ru/i/_p8FUMICX1XnwQ Запись лекции]
  
'''[[Media: Lection_pbscpp_3.pdf|Занятие 3]].''' Лямбда-выражения, функторы и связыватели.
+
'''Занятие 4.''' Семантика перемещения в C++.
 +
* [https://disk.yandex.ru/i/fC2fUMpHDZ6IOA Лекция 4]
 +
* [https://disk.yandex.ru/i/hflbAyVsoTVwBA Запись лекции]
 +
* TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.
  
'''Занятие 4.''' Семантика перемещения, std::move, перемещающие конструкторы и операторы перемещения, типы ссылок.
+
'''Занятие 5.''' Операторы new и delete. Умные указатели. Управление владением памяти.
 +
* [https://disk.yandex.ru/i/VIoQHePuAQd7ow Лекция 5]
 +
* [https://disk.yandex.ru/d/eFyL3Xl08USEAg Запись лекции]
  
== Предварительный план ==
+
'''Занятие 6.''' Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.
1. Обзор основных особенностей C++11:
+
* [https://disk.yandex.ru/i/AVYcaBknBY2qMA Лекция 6]
* выводы типов, auto, decltype, вывод возвращаемого значения
+
* [https://disk.yandex.ru/i/RGy1wEp6qVfICg Запись лекции]
* ranged-based циклы, инициализация с фигурными скобками, override, final, scoped enums, static_assert
+
* TODO на 2026 год: добавить хрона на 20 минут
* lambda-выражения, функторы, связыватели и адаптеры
+
2. Семантика перемещения
+
* типы ссылок и rvalue
+
* std::move, std::forward и их применение
+
3. Умные указатели
+
* перегрузка операторов new, delete, аллокаторы.
+
* необходимость умных указателей и недостатки "голых указателей"
+
* uniq_ptr и исключительное владение
+
* shared_ptr и совместное владение, weak_ptr
+
* идеи intrusive_ptr и других указателей
+
* самостоятельная реализация shared_ptr
+
4. Паттерны проектирования
+
* идиома PImpl, паттерн Bridge
+
* паттерн Singleton
+
* паттерн Fabric Method
+
* паттерн Visitor и двойная диспетчеризация
+
* задача с самостоятельной реализацией
+
  
5. Метапрограммирование
+
'''Занятие 7.''' Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.
* шаблонное программирование
+
* [https://disk.yandex.ru/i/KoXyTFzqz1COlQ Лекция 7]
* метапрограммирование с макросами, x_macro
+
* [https://disk.yandex.ru/i/XjJStMwlxdIkkQ Запись лекции]
* самостоятельное решение задач
+
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
* реализация списка типов и использование в фабриках
+
* TODO на 2026 год: реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие
  
6. Обработка исключений. Гарантии безопасности исключений. Задача на класс исключений.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder
 +
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
 +
* [https://disk.yandex.ru/d/29jv8mY0b9pgbg Запись лекции]
  
7. Параллелизм и многопоточность.  
+
'''Занятие 9.''' Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento
* Data race и deadlock
+
* [https://disk.yandex.ru/i/UJy3YqRQctV0xw Лекция 9]
* Способы синхронизации: mutex, atomic variable, condition variable, spin lock
+
* [https://disk.yandex.ru/i/RgDFARE9MOXtXg Запись лекции]
  
 +
'''Занятие 10.''' Принципы SOLID, DRY, KISS, закон Деметры и принцип Tell Don't Ask. Антипаттерны.
 +
* [https://disk.yandex.ru/i/U8GEeji5tplglQ Лекция 10]
 +
* [https://disk.yandex.ru/i/HP-aGOtM8OzIdA Запись лекции]
 +
 +
'''Занятие 11.''' Правило SFINAE и альтернативы. Проблема перегрузки универсальных ссылок. Обработка исключений. Неопределенное поведение.
 +
* [https://disk.yandex.ru/i/BTykqhT7LgFG3w Лекция 11]
 +
* [https://disk.yandex.ru/i/TtMsjb37VqfMXw Запись лекции]
 +
 +
'''Занятие 12.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.
 +
* [https://disk.yandex.ru/i/Y6dlmjnbsa4Tlw Лекция 12]
 +
* [https://disk.yandex.ru/i/i4Ihcs_MZqr1yw Запись лекции]
 +
* [http://google.github.io/googletest/ Документация по googletest]
 +
 +
'''Занятие 13.''' Отладка кода на C++. Оптимизация программ. Идиома Copy-On-Write. Упаковка структур. Сериализация данных. Protobuf.
 +
* [https://disk.yandex.ru/i/pPHCQa6g2u_nrw Лекция 13]
 +
 +
== Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F) ==
 +
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 +
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
  
 
== Литература ==
 
== Литература ==
 +
===Основная===
 
* С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
 
* С. Мейерс, Эффективный и современный С++: 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 г.
 
* А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
 
* Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.  
 
* Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.  
Строка 61: Строка 112:
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
* Б. Страуструп, Дизайн и эволюция языка С++.
+
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
* D. Abrahams, A. Gurtovoy C++ Template Metaprogramming.
+
* Курс [https://academy.yandex.ru/handbook/cpp Основы C++] от Академии Яндекса.
 
+
* [http://google.github.io/googletest/ Документация] по Google Test.
 
+
* [https://developers.google.com/protocol-buffers/docs/overview?hl=en Документация] protobuf.
[[Категория:Лекционные курсы кафедры МК]]
+
* [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].

Текущая версия на 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.