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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 286 промежуточные версии 4 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Проектирование больших систем на С++}}
+
[[Категория:Спецкурсы кафедры МК]]
!!Внимание!! Слушателям курса из групп м210 и РКТ просьба прояснить вопрос с ведомостями и выслать их по почте лектору.
+
[[Категория:Лекционные курсы кафедры МК]]
 +
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
  
== Информация к экзамену ==
+
Занятия проводятся по вторникам шестой парой (в 18:00) '''ДИСТАНЦИОННО''', ссылка на видеоконференцию публикуется в [https://t.me/+OlbcW8JHJMdjOGZi чате в Telegram]
Экзамен состоится:
+
* 26 декабря 2020 г. в 13:00 для любой группы
+
* 12 января 2021 г. в 9:00 для '''421''' группы
+
* 15 января 2021 г. в 9:00 для '''518/2''' группы
+
  
Слушателям, сдающим курс в качестве спецкурса по выбору, можно сдавать в любую дату. Студентам из 421 и 518/2 групп для сдачи в день, отличный от назначенного по расписанию, необходимо заранее сообщить о таком намерении.
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
'''Внимание!''' Для записи на экзамен 26 декабря НЕОБХОДИМО заполнить форму по ссылке https://lomonosov-msu.ru/rus/event/request/dashboard/6349 (отправить форму, перейдя в "Запись на экзамен 26 декабря" по ссылке "Заполнить" и нажав "отправить"). Форму можно заполнить в любое время до начала экзамена. Отменить запись невозможно.
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
По [https://yadi.sk/i/acVVv3WZ_A8cQA результатам] опроса назначается дополнительный экзамен в субботу 26.12 в 13:00.
+
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
  
Максимальная сумма баллов за экзаменационный тест – 50. Баллы, полученные за выполнение необязательных домашних задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
+
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
* Оценка '''отлично''': не менее 44 баллов
+
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
* Оценка '''хорошо''': не менее 34 и не более 43 баллов
+
* Оценка '''удовлетворительно''': не менее 24 и не более 33 баллов
+
* Для получения зачета достаточно набрать количество баллов для оценки "удовлетворительно".
+
  
Экзамен будет проходить в форме электронного теста, ссылка на тест будет доступна в разделе [https://lomonosov-msu.ru/rus/user/event-request/list "Мои заявки"]. Экзаменационный тест 26.12 состоит из 15-16 вопросов, время на выполнение – 40 минут. Ответ на каждый вопрос – выбор одного из вариантов, либо в виде числа, либо в виде текста. Код писать не нужно. Тест будет открыт для зарегистрированных (по форме выше) участников с 13:00 до 13:50. В 13:50 все результаты будут собраны. Результаты будут размещены в общей таблице в течение часа после окончания теста.
+
== Занятия в 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)
  
Во время экзаменационного теста задать вопросы можно на zoom-конференции по той же ссылке, что и лекционная.
+
== Экзамен ==
 +
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.
  
== Общая информация ==
+
* Оценка '''отлично''': не менее 40 баллов
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 +
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
[[Media: Pbs_exam_example_2024.pdf|Пример экзаменационного варианта (pdf)]]
  
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
+
== Содержание курса ==
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
+
'''Занятие 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 напомнить.
  
[[Media: Pbscpp_content2020.pdf|Программа курса 2020(pdf)]]
+
'''Занятие 2.''' Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).
 +
* [https://disk.yandex.ru/i/7-DPnwcUrkONYA Лекция 2]
 +
* [https://disk.yandex.ru/d/L19s661Y8JrTyA Задание 1] (результаты см. в таблице успеваемости в отдельной вкладке)
  
== Занятия в 2020г ==
+
'''Занятие 3.''' Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).
* Занятия в осеннем семестре 2020 г. завершены.
+
* [https://disk.yandex.ru/i/i3EFnpjuyybS6w Лекция 3]
* Для прохождения дистанционных тестов и сдачи экзамена необходимо подать заявку на курс https://lomonosov-msu.ru/rus/event/6349/, зарегестрировавшись на сайте при отсутствии учетной записи
+
* [https://disk.yandex.ru/i/_p8FUMICX1XnwQ Запись лекции]
* Видео-записи лекций [https://yadi.sk/d/EEvF2IzHUlYMiQ здесь]
+
* Таблица результатов [https://clck.ru/QpapD здесь]
+
  
== Содержание курса ==
+
'''Занятие 4.''' Семантика перемещения в C++.
'''Занятие 1.''' Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto. Ключевые слова override и final.  
+
* [https://disk.yandex.ru/i/fC2fUMpHDZ6IOA Лекция 4]
* [[Media: Lecture_pbscpp_1_2020.pdf|Лекция 1]].
+
* [https://disk.yandex.ru/i/hflbAyVsoTVwBA Запись лекции]
 +
* TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.
  
'''Занятие 2.''' Удаленные функции. Псевдонимы. Scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов. lambda-выражения.
+
'''Занятие 5.''' Операторы new и delete. Умные указатели. Управление владением памяти.
* [[Media: Lecture_pbscpp_2_2020.pdf|Лекция 2]].
+
* [https://disk.yandex.ru/i/VIoQHePuAQd7ow Лекция 5]
* [https://yadi.sk/i/eTdJ1VNwsZJ4nA Задача 1]. (Больше не принимается)
+
* [https://disk.yandex.ru/d/eFyL3Xl08USEAg Запись лекции]
  
'''Занятие 3.''' Особенности lambda-функций. Неупорядоченные контейнеры hashmap/hashset. Функторы и связыватели. std::bind, std::invoke, std::apply.
+
'''Занятие 6.''' Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.
* [[Media: Lecture_pbscpp_3_2020.pdf|Лекция 3]].
+
* [https://disk.yandex.ru/i/AVYcaBknBY2qMA Лекция 6]
* Доп.задача про UB при захвате this. (Больше не принимается)
+
* [https://disk.yandex.ru/i/RGy1wEp6qVfICg Запись лекции]
 +
* TODO на 2026 год: добавить хрона на 20 минут
  
'''Занятие 4.''' Указатели на методы внутри класса. Move-семантика и типы ссылок.
+
'''Занятие 7.''' Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.
* [[Media: Lecture_pbscpp_4_2020.pdf|Лекция 4]].
+
* [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 год: реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие
  
'''Занятие 5.''' Свертывание ссылок. Универсальные ссылки и проблема их перегрузки. Идеальная передача. Генерация компилятором перемещающих операций.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder
* [[Media: Lecture_pbscpp_5_2020.pdf|Лекция 5]].
+
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
* [https://yadi.sk/i/L6FP82WCj5VmEw Задачи]. (Больше не принимаются)
+
* [https://disk.yandex.ru/d/29jv8mY0b9pgbg Запись лекции]
  
'''Занятие 6.''' Операторы new и delete, их перегрузка. Умные указатели.
+
'''Занятие 9.''' Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento
* [[Media: Lecture_pbscpp_6_2020.pdf|Лекция 6]].
+
* [https://disk.yandex.ru/i/UJy3YqRQctV0xw Лекция 9]
* [https://yadi.sk/i/3ui6cNkvsQ-7YQ Задача]. (Больше не принимается)
+
* [https://disk.yandex.ru/i/RgDFARE9MOXtXg Запись лекции]
  
'''Занятие 7.''' Владение памятью. Дополнение про умные указатели.
+
'''Занятие 10.''' Принципы SOLID, DRY, KISS, закон Деметры и принцип Tell Don't Ask. Антипаттерны.
* [[Media: lec7pbs.pdf|Лекция 7]]
+
* [https://disk.yandex.ru/i/U8GEeji5tplglQ Лекция 10]
* [https://yadi.sk/i/2q9G29DFmwtVzg Задача]. (Больше не принимается)
+
* [https://disk.yandex.ru/i/HP-aGOtM8OzIdA Запись лекции]
  
'''Занятие 8.''' Идиомы CRTP и PImpl. Паттерны Bridge и Command.
+
'''Занятие 11.''' Правило SFINAE и альтернативы. Проблема перегрузки универсальных ссылок. Обработка исключений. Неопределенное поведение.
* [[Media: Lecture_pbscpp_8_2020.pdf|Лекция 8]]
+
* [https://disk.yandex.ru/i/BTykqhT7LgFG3w Лекция 11]
 +
* [https://disk.yandex.ru/i/TtMsjb37VqfMXw Запись лекции]
  
'''Занятие 9.''' Паттерны Singleton, Strategy, Decorator, Observer. Создание объектов с помощью фабрик.
+
'''Занятие 12.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
* [[Media: Lecture_pbscpp_9_2020.pdf|Лекция 9]]
+
* [https://disk.yandex.ru/i/Y6dlmjnbsa4Tlw Лекция 12]
 +
* [https://disk.yandex.ru/i/i4Ihcs_MZqr1yw Запись лекции]
 +
* [http://google.github.io/googletest/ Документация по googletest]
  
'''Занятие 10.''' Паттерн Visitor. Идиома Type Erasure. Правило SFINAE и диспетчеризация дескрипторов.
+
'''Занятие 13.''' Отладка кода на C++. Оптимизация программ. Идиома Copy-On-Write. Упаковка структур. Сериализация данных. Protobuf.
* [[Media: Lecture_pbscpp_10_2020.pdf|Лекция 10]]
+
* [https://disk.yandex.ru/i/pPHCQa6g2u_nrw Лекция 13]
* [https://yadi.sk/i/HIelFsMSWhXVog Задачи]. (Больше не принимаются)
+
* [https://disk.yandex.ru/d/lNCXgk7o0n7pVQ Запись лекции]
  
'''Занятие 11.''' Тестирование кода. Unit-тесты и библиотека gtest/gmock. Отладка кода и strace.
+
'''Занятие 14.''' Многопоточность в C++. Синхронизация потоков, условные переменные, std::future, std::promise, std::async и др. OpenMP. Потокобезопасность, паттерны, особенности архитектуры. Современные возможности C++20. Параллельные алгоритмы STL в C++17.
* [[Media: Lecture_pbscpp_11_2020.pdf|Лекция 11]]
+
* [https://disk.yandex.ru/i/EXqa_BMBTm4LnQ Лекция 14]
  
'''Занятие 12.''' Отладочные макроопределения, asserts. Обработка исключений. Гарантии безопасности исключений. ValueOrException. Неопределенное поведение.
+
== Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F) ==
* [[Media: Lecture_pbscpp_12_2020.pdf|Лекция 12]]
+
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 
+
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
'''Занятие 13.''' Оптимизация программ на C++.  
+
* [[Media: Lecture_pbscpp_13_2020.pdf|Лекция 13]]
+
* [https://yadi.sk/i/ccDtj0NiB7wkBQ Задача]. (Больше не принимается)
+
  
 
== Литература ==
 
== Литература ==
Строка 95: Строка 106:
 
* Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
 
* Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
 
* CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
 
* CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
* Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности.
+
* Курт Гантерот: Оптимизация программ на 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.  
 
* Anthony Williams. C++ Concurrency in Action: Practical Multithreading.  
 
* А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
 
* А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
Строка 105: Строка 117:
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
 
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
 
+
* Курс [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].

Текущая версия на 12:54, 7 декабря 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.

Занятие 14. Многопоточность в C++. Синхронизация потоков, условные переменные, std::future, std::promise, std::async и др. OpenMP. Потокобезопасность, паттерны, особенности архитектуры. Современные возможности C++20. Параллельные алгоритмы STL в C++17.

Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им 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.