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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 184 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Проектирование больших систем на С++}}
+
Занятия проводятся по вторникам шестой парой (в 18:00).
  
'''Внимание!''' Экзамен 15.01 завершен, оценки выставлены в табличке.
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
* Все ведомости есть в наличии в электронном виде, оценки тех, кто сдавал 15.01 (в том числе тех, кто сдавал спецкурсом) будут отправлены 16.01 в учебную часть.
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.
* Вопросы при несогласии с оценкой принимаются по почте до 16 января 09:00
+
* Если оценку НЕ нужно ставить (передумали сдавать) – просьба сообщить на почту
+
* В табличке результатов есть поле про отправленную ведомость
+
  
== Информация к экзамену ==
+
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
Экзамен состоится:
+
* 26 декабря 2020 г. в 13:00 для любой группы
+
* 12 января 2021 г. в 9:00 для '''421''' группы
+
* 15 января 2021 г. в 9:00 для '''518/2''' группы
+
  
Слушателям, сдающим курс в качестве спецкурса по выбору, можно сдавать в любую дату. Студентам из 421 и 518/2 групп для сдачи в день, отличный от назначенного по расписанию, необходимо заранее сообщить о таком намерении.
+
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
Максимальная сумма баллов за экзаменационный тест – 50. Баллы, полученные за выполнение необязательных домашних задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
+
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
 +
 
 +
== Занятия в 2024 г. ==
 +
* [https://docs.google.com/spreadsheets/d/1daYZmqfhzrqL30kgwXsSy0f5zUFXY8yf5jTKFlMicJo/edit?usp=sharing Таблица результатов]
 +
* Первое занятие состоится 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 баллов
 
* Оценка '''отлично''': не менее 40 баллов
 
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
* Для получения зачета достаточно набрать количество баллов для оценки "удовлетворительно".
 
  
Экзамен будет проходить в форме электронного теста, ссылка на тест будет доступна в разделе [https://lomonosov-msu.ru/rus/user/event-request/list "Мои заявки"]. Экзаменационный тест состоит из 15-16 вопросов, время на выполнение – 40 минут. Ответ на каждый вопрос – выбор одного из вариантов, либо в виде числа, либо в виде текста. Код писать не нужно. Тест будет открыт для зарегистрированных (по форме выше) участников с 09:00 до 09:45. В 09:45 все результаты будут собраны. Результаты будут размещены в общей таблице в течение часа после окончания теста.
+
За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:
 +
* Оценка '''отлично''' (автомат)
 +
* Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
 +
* Возможность участвовать в досрочном экзамене
  
'''Внимание!''' При переключении вкладки браузера с экзаменом таймер может отставать от реальных значений. Просьба следить за физическим временем!
+
Критерии получения бонусов будут сформулированы позднее.
  
Во время экзаменационного теста задать вопросы можно на zoom-конференции по той же ссылке, что и лекционная.
+
[[Media: Pbs_exam_example.pdf|Пример экзаменационного варианта (pdf)]] (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)
  
== Общая информация ==
+
== Содержание курса ==
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
'''Занятие 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]
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
'''Занятие 2.''' Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.  
 
+
* [https://disk.yandex.ru/i/YgMRuCOO5XNAnw Лекция 2]
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
+
* [https://disk.yandex.ru/i/YQRRH-kfxgs_Kw Дополнительные слайды] (исключения вывода типа для auto, value-категории, информация для теста)
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
+
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 
+
* [https://disk.yandex.ru/i/dSbYR9vwi8SGQw Задание 1]
[[Media: Pbscpp_content2020.pdf|Программа курса 2020(pdf)]]
+
 
+
== Занятия в 2020г ==
+
* Занятия в осеннем семестре 2020 г. завершены.
+
* Для прохождения дистанционных тестов и сдачи экзамена необходимо подать заявку на курс https://lomonosov-msu.ru/rus/event/6349/, зарегестрировавшись на сайте при отсутствии учетной записи
+
* Видео-записи лекций [https://yadi.sk/d/EEvF2IzHUlYMiQ здесь]
+
* Таблица результатов [https://clck.ru/QpapD здесь]
+
 
+
== Содержание курса ==
+
'''Занятие 1.'''  Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto. Ключевые слова override и final.
+
* [[Media: Lecture_pbscpp_1_2020.pdf|Лекция 1]].
+
  
'''Занятие 2.''' Удаленные функции. Псевдонимы. Scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов. lambda-выражения.
+
'''Занятие 3.''' Лямбда-выражения. Структурное связывание. Неупорядоченные контейнеры. Вызовы функций.
* [[Media: Lecture_pbscpp_2_2020.pdf|Лекция 2]].
+
* Лекция 3
* [https://yadi.sk/i/eTdJ1VNwsZJ4nA Задача 1]. (Больше не принимается)
+
* Задание 2
  
'''Занятие 3.''' Особенности lambda-функций. Неупорядоченные контейнеры hashmap/hashset. Функторы и связыватели. std::bind, std::invoke, std::apply.
+
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
* [[Media: Lecture_pbscpp_3_2020.pdf|Лекция 3]].
+
* Лекция 4
* Доп.задача про UB при захвате this. (Больше не принимается)
+
  
'''Занятие 4.''' Указатели на методы внутри класса. Move-семантика и типы ссылок.
+
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
* [[Media: Lecture_pbscpp_4_2020.pdf|Лекция 4]].
+
* Лекция 5
 +
* Задание 3
  
'''Занятие 5.''' Свертывание ссылок. Универсальные ссылки и проблема их перегрузки. Идеальная передача. Генерация компилятором перемещающих операций.  
+
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
* [[Media: Lecture_pbscpp_5_2020.pdf|Лекция 5]].
+
* Лекция 6 (CRTP)
* [https://yadi.sk/i/L6FP82WCj5VmEw Задачи]. (Больше не принимаются)
+
* Лекция 6 (паттерны)
 +
* Задание 4
 +
* Код для задания 4
  
'''Занятие 6.''' Операторы new и delete, их перегрузка. Умные указатели.
+
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
* [[Media: Lecture_pbscpp_6_2020.pdf|Лекция 6]].
+
* Лекция 7
* [https://yadi.sk/i/3ui6cNkvsQ-7YQ Задача]. (Больше не принимается)
+
* Репозиторий, где пишем код на занятиях
  
'''Занятие 7.''' Владение памятью. Дополнение про умные указатели.
+
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
* [[Media: lec7pbs.pdf|Лекция 7]]
+
* Лекция 8
* [https://yadi.sk/i/2q9G29DFmwtVzg Задача]. (Больше не принимается)
+
  
'''Занятие 8.''' Идиомы CRTP и PImpl. Паттерны Bridge и Command.
+
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
* [[Media: Lecture_pbscpp_8_2020.pdf|Лекция 8]]
+
* Лекция 9
 +
* Задание 5
  
'''Занятие 9.''' Паттерны Singleton, Strategy, Decorator, Observer. Создание объектов с помощью фабрик.
+
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
* [[Media: Lecture_pbscpp_9_2020.pdf|Лекция 9]]
+
* Лекция 10
  
'''Занятие 10.''' Паттерн Visitor. Идиома Type Erasure. Правило SFINAE и диспетчеризация дескрипторов.
+
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
* [[Media: Lecture_pbscpp_10_2020.pdf|Лекция 10]]
+
* Лекция 11
* [https://yadi.sk/i/HIelFsMSWhXVog Задачи]. (Больше не принимаются)
+
* Задача 6
 +
* [http://google.github.io/googletest/ Документация по googletest]
  
'''Занятие 11.''' Тестирование кода. Unit-тесты и библиотека gtest/gmock. Отладка кода и strace.
+
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
* [[Media: Lecture_pbscpp_11_2020.pdf|Лекция 11]]
+
* Лекция 12
 +
* Задача 7
  
'''Занятие 12.''' Отладочные макроопределения, asserts. Обработка исключений. Гарантии безопасности исключений. ValueOrException. Неопределенное поведение.
+
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
* [[Media: Lecture_pbscpp_12_2020.pdf|Лекция 12]]
+
* Лекция 13
 +
* Задача 8 и пример входного файла (дедлайн DD.MM.YYYY 09:00)
 +
* Комментарии по проверке находятся в отдельном листе таблицы результатов.
  
'''Занятие 13.''' Оптимизация программ на C++.  
+
'''Занятие 14.''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
* [[Media: Lecture_pbscpp_13_2020.pdf|Лекция 13]]
+
* Лекция 14
* [https://yadi.sk/i/ccDtj0NiB7wkBQ Задача]. (Больше не принимается)
+
  
 
== Литература ==
 
== Литература ==
Строка 97: Строка 105:
 
* Ф. Пикус, Идиомы и паттерны проектирования в современном 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 г.
Строка 107: Строка 116:
 
* Б. Страуструп, Программирование. Принципы и практика использования 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].
  
  
 
[[Категория:Лекционные курсы кафедры МК]]
 
[[Категория:Лекционные курсы кафедры МК]]
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]

Текущая версия на 21:23, 10 сентября 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. Лямбда-выражения. Структурное связывание. Неупорядоченные контейнеры. Вызовы функций.

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

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

  • Лекция 4

Занятие 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.