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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 155 промежуточные версии 4 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Проектирование больших систем на С++}}
+
[[Категория:Спецкурсы кафедры МК]]
'''Вниманию желающих сдавать экзамен 18 января!''' Просьба сообщить заранее на почту лектору о своём намерении сдавать в этот день.
+
[[Категория:Лекционные курсы кафедры МК]]
 +
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
  
----
+
Занятия проводятся по вторникам шестой парой (в 18:00) '''ДИСТАНЦИОННО''', ссылка на видеоконференцию публикуется в [https://t.me/+OlbcW8JHJMdjOGZi чате в Telegram]
  
Занятия в осеннем семестре 2022 г. завершены.
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
  
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.
 
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
[[Media: Pbscpp_content_2022.pdf|Программа курса 2022(pdf)]]
+
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
 +
 
 +
== Занятия в 2025 г. ==
  
== Занятия в 2022 г ==
+
* [https://docs.google.com/spreadsheets/d/1qxbn-J2YLaPhsL-msDzq8Od13aR1j1lp_JGvFNtwnmk/edit?usp=sharing Таблица результатов]
* Занятия завершены.
+
* [https://t.me/+OlbcW8JHJMdjOGZi Чат в Telegram]
* Все доп.задачи проверены, кроме последней, которая принимается до 31.12.2022 включительно.
+
* Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
* Таблица результатов [https://docs.google.com/spreadsheets/d/1Exq4vDEQ2eg82WZLEmjTKfE-C334_uOtnzraGMdnz50 здесь]
+
* Следующие задания проводятся дистанционно.
* Экзамен состоится 12 января в '''10:00''', в аудитории 510.
+
* Досрочный экзамен: 23.12.2025 18:00 (ауд. 504)
* Дополнительно (для желающих сдать спецкурс, и не участвовавших в экзамене 12.01) экзамен состоится 18 января в '''10:30''', сбор у аудитории 591. '''Внимание!''' Для записи на экзамен необходимо написать об этом лектору на почту.
+
* Основной экзамен: 20.01.2026 13:00 (ауд. 579)
  
 
== Экзамен ==
 
== Экзамен ==
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50. Баллы, полученные за выполнение необязательных домашних задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
+
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.
  
 
* Оценка '''отлично''': не менее 40 баллов
 
* Оценка '''отлично''': не менее 40 баллов
Строка 29: Строка 31:
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
  
Примеры экзаменационных задач: [[Media: cpp_exam_demo.pdf|pdf]].
+
[[Media: Pbs_exam_example_2024.pdf|Пример экзаменационного варианта (pdf)]]
  
В экзаменационной работе ожидается около 15 вопросов. У каждого вопроса будет указано максимальное число баллов, которое можно будет набрать за данный вопрос. На экзамене не потребуется писать код полноценных программ/функций/классов.
+
== Содержание курса ==
 +
'''Занятие 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 напомнить.
  
Студентам из групп, отличных от 421 и 518/2, сдающим курс в качестве спецкурса, на экзамене необходимо иметь при себе ведомость.
+
'''Занятие 2.''' Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).
 +
* [https://disk.yandex.ru/i/7-DPnwcUrkONYA Лекция 2]
 +
* [https://disk.yandex.ru/d/L19s661Y8JrTyA Задание 1] (результаты см. в таблице успеваемости в отдельной вкладке)
  
== Содержание курса ==
+
'''Занятие 3.''' Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).
'''Занятие 1.''' Вводный тест. Некоторые особенности C++11, вывод типа.
+
* [https://disk.yandex.ru/i/i3EFnpjuyybS6w Лекция 3]
 +
* [https://disk.yandex.ru/i/_p8FUMICX1XnwQ Запись лекции]
  
'''Занятие 2.''' Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.  
+
'''Занятие 4.''' Семантика перемещения в C++.
* [https://disk.yandex.ru/i/LLhLfKUrtxM5Ug Лекции 1-2]
+
* [https://disk.yandex.ru/i/fC2fUMpHDZ6IOA Лекция 4]
* [https://disk.yandex.ru/i/0zz99oSXBbX6Qg Задача] (больше не принимается)
+
* [https://disk.yandex.ru/i/hflbAyVsoTVwBA Запись лекции]
 +
* TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.
  
'''Занятие 3.''' Лямбда-выражения. Структурное связывание. Неупорядоченные контейнеры. Вызовы функций.
+
'''Занятие 5.''' Операторы new и delete. Умные указатели. Управление владением памяти.
* [https://disk.yandex.ru/i/ntdIW0Go_MPKog Лекция 3]
+
* [https://disk.yandex.ru/i/VIoQHePuAQd7ow Лекция 5]
 +
* [https://disk.yandex.ru/d/eFyL3Xl08USEAg Запись лекции]
  
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
+
'''Занятие 6.''' Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.
* [https://disk.yandex.ru/i/4LGYLn2L_2bupA Лекция 4]
+
* [https://disk.yandex.ru/i/AVYcaBknBY2qMA Лекция 6]
* [https://disk.yandex.ru/i/jisLZBBHGoln0g Запись]
+
* [https://disk.yandex.ru/i/RGy1wEp6qVfICg Запись лекции]
* [https://disk.yandex.ru/i/VYfxjjh17NtYRg Задачи] (больше не принимается)
+
* TODO на 2026 год: добавить хрона на 20 минут
  
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
+
'''Занятие 7.''' Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.
* [https://disk.yandex.ru/d/3kTuofEnSVWIsA Лекция 5]
+
* [https://disk.yandex.ru/i/KoXyTFzqz1COlQ Лекция 7]
* [https://disk.yandex.ru/i/S6jW75TBRi3qEg Запись]
+
* [https://disk.yandex.ru/i/XjJStMwlxdIkkQ Запись лекции]
* [https://disk.yandex.ru/i/dI1xkV7mZrpmkQ Задача] (больше не принимается)
+
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
 +
* TODO на 2026 год: реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие
  
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder
* [https://disk.yandex.ru/i/uPzr89AF4zrv-Q Лекция 6]
+
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
* [https://disk.yandex.ru/i/RyTb7iq0unfprA Запись]
+
* [https://disk.yandex.ru/d/29jv8mY0b9pgbg Запись лекции]
* [https://disk.yandex.ru/i/ePt7dk53Iem4fQ Задача] и [https://github.com/konovodov/-cmc_msu_cpp_course2021/tree/main код] к ней (больше не принимается)
+
  
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
+
'''Занятие 9.''' Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento
* [https://disk.yandex.ru/i/uH6561AFNRS4aw Лекция 7]
+
* [https://disk.yandex.ru/i/UJy3YqRQctV0xw Лекция 9]
* [https://disk.yandex.ru/i/Ef_-x_nandwIgg Запись]
+
* [https://disk.yandex.ru/i/RgDFARE9MOXtXg Запись лекции]
  
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
+
'''Занятие 10.''' Принципы SOLID, DRY, KISS, закон Деметры и принцип Tell Don't Ask. Антипаттерны.
* [https://disk.yandex.ru/i/jMw0tBnMgH9vbQ Лекция 8]
+
* [https://disk.yandex.ru/i/U8GEeji5tplglQ Лекция 10]
* [https://disk.yandex.ru/i/5upciy1jo7s67A Запись]
+
* [https://disk.yandex.ru/i/HP-aGOtM8OzIdA Запись лекции]
  
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
+
'''Занятие 11.''' Правило SFINAE и альтернативы. Проблема перегрузки универсальных ссылок. Обработка исключений. Неопределенное поведение.
* [https://disk.yandex.ru/i/zV2fe1AVusaMDg Лекция 9]
+
* [https://disk.yandex.ru/i/BTykqhT7LgFG3w Лекция 11]
* [https://disk.yandex.ru/i/TN3QQUHCIOBt6w Запись]
+
* [https://disk.yandex.ru/i/TtMsjb37VqfMXw Запись лекции]
* [https://disk.yandex.ru/i/O0_xPykHi9gPbQ Задачи] (больше не принимаются)
+
  
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
+
'''Занятие 12.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
* [https://disk.yandex.ru/d/EOLsv_3KAfUcSg Лекция 10]
+
* [https://disk.yandex.ru/i/Y6dlmjnbsa4Tlw Лекция 12]
* [https://disk.yandex.ru/i/6jITF-YaW0n6_Q Запись]
+
* [https://disk.yandex.ru/i/i4Ihcs_MZqr1yw Запись лекции]
 +
* [http://google.github.io/googletest/ Документация по googletest]
  
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
+
'''Занятие 13.''' Отладка кода на C++. Оптимизация программ. Идиома Copy-On-Write. Упаковка структур. Сериализация данных. Protobuf.
* [https://disk.yandex.ru/i/1r0rTlv7tm-GCQ Лекция 11]
+
* [https://disk.yandex.ru/i/pPHCQa6g2u_nrw Лекция 13]
* [https://disk.yandex.ru/i/kpkxZnzU8GX86Q Запись]
+
* [https://github.com/konovodov/-cmc_msu_cpp_course2021/tree/main/testing пример] кода с занятия
+
* [https://disk.yandex.ru/i/2wiQon6oTY_ZKA Задачи] (больше не принимаются)
+
  
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
+
== Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F) ==
* [https://disk.yandex.ru/i/Nvu2219cQk7suQ Лекция 12]
+
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
* [https://disk.yandex.ru/i/xHhpvZda4o7x-g Запись]
+
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
* [https://disk.yandex.ru/i/wIkIR4l1KoMlLg Задача] (больше не принимается)
+
 
+
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
+
* [https://disk.yandex.ru/i/3aPdb6gO7767ig Лекция 13]
+
* [https://disk.yandex.ru/i/zinAW8OvEoYcsA Запись]
+
* [https://disk.yandex.ru/i/vE7LwXekadSUcw Задача] и [https://disk.yandex.ru/d/_9udeF-WPVN9qA пример] входного файла к ней. (Больше не принимается). Комментарии по проверке находятся в отдельном листе таблицы результатов.
+
  
 
== Литература ==
 
== Литература ==
Строка 112: Строка 116:
 
* [http://google.github.io/googletest/ Документация] по Google Test.
 
* [http://google.github.io/googletest/ Документация] по Google Test.
 
* [https://developers.google.com/protocol-buffers/docs/overview?hl=en Документация] protobuf.
 
* [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.