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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 72 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Проектирование больших систем на С++}}
+
Занятия проводятся по вторникам шестой парой (в 18:00).
Занятия в осеннем семестре 2022 г. завершены.
+
  
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 +
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
[[Media: Pbscpp_content_2022.pdf|Программа курса 2022(pdf)]]
+
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
  
== Занятия в 2022 г ==
+
== Занятия в 2024 г. ==
* Занятия завершены.
+
* [https://docs.google.com/spreadsheets/d/1daYZmqfhzrqL30kgwXsSy0f5zUFXY8yf5jTKFlMicJo/edit?usp=sharing Таблица результатов]
* Таблица результатов [https://docs.google.com/spreadsheets/d/1Exq4vDEQ2eg82WZLEmjTKfE-C334_uOtnzraGMdnz50 здесь]
+
* Первое занятие состоится 3 сентября.
 +
* Тест 1: 17.09.2024
 +
* Тест 2: 24.09.2023
 +
* Тест 3: 01.10.2023
 +
* Тест 4: 08.10.2023
 +
* Тест 5: 15.10.2023
 +
* Тест 6: 29.10.2023
 +
* Тест 7: 05.11.2023
 +
* Тест 8: 12.11.2023
 +
* Досрочный экзамен: DD.MM.YYYY HH:MM (ауд. NN)
 +
* Основной экзамен: DD.MM.YYYY HH:MM (ауд. NN)
  
 
== Экзамен ==
 
== Экзамен ==
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50. Баллы, полученные за выполнение необязательных домашних задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
+
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50.
  
 
* Оценка '''отлично''': не менее 40 баллов
 
* Оценка '''отлично''': не менее 40 баллов
Строка 22: Строка 32:
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
  
Примеры экзаменационных задач: [[Media: cpp_exam_demo.pdf|pdf]].
+
За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:
 +
* Оценка '''отлично''' (автомат)
 +
* Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
 +
* Возможность участвовать в досрочном экзамене
 +
 
 +
Критерии получения бонусов будут сформулированы позднее.
 +
 
 +
[[Media: Pbs_exam_example.pdf|Пример экзаменационного варианта (pdf)]] (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)
  
 
== Содержание курса ==
 
== Содержание курса ==
'''Занятие 1.''' Вводный тест. Некоторые особенности C++11, вывод типа.
+
'''Занятие 1.''' Организационные вопросы. 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]
  
'''Занятие 2.''' Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.  
+
'''Занятие 2.''' Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.  
* [https://disk.yandex.ru/i/LLhLfKUrtxM5Ug Лекции 1-2]
+
* [https://disk.yandex.ru/i/YgMRuCOO5XNAnw Лекция 2]
* [https://disk.yandex.ru/i/0zz99oSXBbX6Qg Задача] (больше не принимается)
+
* [https://disk.yandex.ru/i/YQRRH-kfxgs_Kw Дополнительные слайды] (исключения вывода типа для auto, value-категории, информация для теста)
 +
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 +
* [https://disk.yandex.ru/i/dSbYR9vwi8SGQw Задание 1] (больше не принимается)
  
'''Занятие 3.''' Лямбда-выражения. Структурное связывание. Неупорядоченные контейнеры. Вызовы функций.
+
'''Занятие 3.''' Лямбда-выражения. Связыватели. Некоторые особенности C++17.
* [https://disk.yandex.ru/i/ntdIW0Go_MPKog Лекция 3]
+
* [https://disk.yandex.ru/i/s_xbIq4nUrZ4PA Лекция 3]
 +
* [https://disk.yandex.ru/i/EsnIYzNCQylo9Q Задание 2] (задача 2 больше не принимается, но задача 1 всё ещё принимается)
  
 
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
 
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
* [https://disk.yandex.ru/i/4LGYLn2L_2bupA Лекция 4]
+
* [https://disk.yandex.ru/i/ZAJSObjAUZ-OjA Лекция 4]
* [https://disk.yandex.ru/i/jisLZBBHGoln0g Запись]
+
* [https://disk.yandex.ru/i/VYfxjjh17NtYRg Задачи] (больше не принимается)
+
  
 
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
 
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
* [https://disk.yandex.ru/d/3kTuofEnSVWIsA Лекция 5]
+
* Лекция 5
* [https://disk.yandex.ru/i/S6jW75TBRi3qEg Запись]
+
* Задание 3
* [https://disk.yandex.ru/i/dI1xkV7mZrpmkQ Задача] (больше не принимается)
+
  
 
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
 
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
* [https://disk.yandex.ru/i/uPzr89AF4zrv-Q Лекция 6]
+
* Лекция 6 (CRTP)
* [https://disk.yandex.ru/i/RyTb7iq0unfprA Запись]
+
* Лекция 6 (паттерны)
* [https://disk.yandex.ru/i/ePt7dk53Iem4fQ Задача] и [https://github.com/konovodov/-cmc_msu_cpp_course2021/tree/main код] к ней (больше не принимается)
+
* Задание 4
 +
* Код для задания 4
  
 
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
 
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
* [https://disk.yandex.ru/i/uH6561AFNRS4aw Лекция 7]
+
* Лекция 7
* [https://disk.yandex.ru/i/Ef_-x_nandwIgg Запись]
+
* Репозиторий, где пишем код на занятиях
  
 
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
 
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
* [https://disk.yandex.ru/i/jMw0tBnMgH9vbQ Лекция 8]
+
* Лекция 8
* [https://disk.yandex.ru/i/5upciy1jo7s67A Запись]
+
  
 
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
 
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
* [https://disk.yandex.ru/i/zV2fe1AVusaMDg Лекция 9]
+
* Лекция 9
* [https://disk.yandex.ru/i/TN3QQUHCIOBt6w Запись]
+
* Задание 5
* [https://disk.yandex.ru/i/O0_xPykHi9gPbQ Задачи] (больше не принимаются)
+
  
 
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
 
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
* [https://disk.yandex.ru/d/EOLsv_3KAfUcSg Лекция 10]
+
* Лекция 10
* [https://disk.yandex.ru/i/6jITF-YaW0n6_Q Запись]
+
  
 
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
 
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
* [https://disk.yandex.ru/i/1r0rTlv7tm-GCQ Лекция 11]
+
* Лекция 11
* [https://disk.yandex.ru/i/kpkxZnzU8GX86Q Запись]
+
* Задача 6
* [https://github.com/konovodov/-cmc_msu_cpp_course2021/tree/main/testing пример] кода с занятия
+
* [http://google.github.io/googletest/ Документация по googletest]
* [https://disk.yandex.ru/i/2wiQon6oTY_ZKA Задачи] (больше не принимаются)
+
  
 
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
 
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
* [https://disk.yandex.ru/i/Nvu2219cQk7suQ Лекция 12]
+
* Лекция 12
* [https://disk.yandex.ru/i/xHhpvZda4o7x-g Запись]
+
* Задача 7
* [https://disk.yandex.ru/i/wIkIR4l1KoMlLg Задача] (больше не принимается)
+
  
 
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
 
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
* [https://disk.yandex.ru/i/3aPdb6gO7767ig Лекция 13]
+
* Лекция 13
* [https://disk.yandex.ru/i/zinAW8OvEoYcsA Запись]
+
* Задача 8 и пример входного файла (дедлайн DD.MM.YYYY 09:00)
* [https://disk.yandex.ru/i/vE7LwXekadSUcw Задача] и [https://disk.yandex.ru/d/_9udeF-WPVN9qA пример] входного файла к ней. (Больше не принимается). Комментарии по проверке находятся в отдельном листе таблицы результатов.
+
* Комментарии по проверке находятся в отдельном листе таблицы результатов.
 +
 
 +
'''Занятие 14.''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 +
* Лекция 14
  
 
== Литература ==
 
== Литература ==
Строка 101: Строка 119:
 
* [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:28, 25 сентября 2024

Занятия проводятся по вторникам шестой парой (в 18:00).

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

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

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

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

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

Занятия в 2024 г.

  • Таблица результатов
  • Первое занятие состоится 3 сентября.
  • Тест 1: 17.09.2024
  • Тест 2: 24.09.2023
  • Тест 3: 01.10.2023
  • Тест 4: 08.10.2023
  • Тест 5: 15.10.2023
  • Тест 6: 29.10.2023
  • Тест 7: 05.11.2023
  • Тест 8: 12.11.2023
  • Досрочный экзамен: DD.MM.YYYY HH:MM (ауд. NN)
  • Основной экзамен: DD.MM.YYYY HH:MM (ауд. NN)

Экзамен

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

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

За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:

  • Оценка отлично (автомат)
  • Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
  • Возможность участвовать в досрочном экзамене

Критерии получения бонусов будут сформулированы позднее.

Пример экзаменационного варианта (pdf) (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)

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

Занятие 1. Организационные вопросы. C++ Style Guide. Вводный тест.

Занятие 2. Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.

Занятие 3. Лямбда-выражения. Связыватели. Некоторые особенности C++17.

Занятие 4. Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.

Занятие 5. Особенности перемещающих операций в классах. Умные указатели.

  • Лекция 5
  • Задание 3

Занятие 6. Умные указатели и владение памятью. Идиома CRTP.

  • Лекция 6 (CRTP)
  • Лекция 6 (паттерны)
  • Задание 4
  • Код для задания 4

Занятие 7. Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.

  • Лекция 7
  • Репозиторий, где пишем код на занятиях

Занятие 8. Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.

  • Лекция 8

Занятие 9. Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.

  • Лекция 9
  • Задание 5

Занятие 10. Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.

  • Лекция 10

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

Занятие 12. Отладка и дебаг кода. Оптимизация программ на C++. Строки.

  • Лекция 12
  • Задача 7

Занятие 13. Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.

  • Лекция 13
  • Задача 8 и пример входного файла (дедлайн DD.MM.YYYY 09:00)
  • Комментарии по проверке находятся в отдельном листе таблицы результатов.

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

  • Лекция 14

Литература

Основная

  • С. Мейерс, Эффективный и современный С++: 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.