Углубленное программирование на C/C++

Осень 2020

Цель курса — формирование практических навыков и умений, необходимых специалистам по разработке программного обеспечения (ПО) UNIX-подобных операционных систем для участия в проектах промышленной разработки среднего уровня сложности на языках C и C++, в том числе для замещения стажерских должностей разработчиков серверной части высоконагруженных приложений.

Описание
Учебный курс «Углубленное программирование на C/C++» состоит из 10 лекций и 7 практикумов. Общая аудиторная нагрузка составляет 64 а.ч., из которых 36 а.ч. приходится на лекционные занятия, 28 а.ч. — на практические работы.

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

Итоговая оценка знаний студентов по дисциплине формируется на протяжении учебного семестра в соответствии с правилами балльно-рейтинговой системы (см. ниже).
Подробнее
Чему научитесь
В процессе изучения курса у студентов формируются знания в области многопоточного программирования, шаблонов объектно-ориентированного программирования, стандартах кодирования и определения качества кода, а также формируются навыки и умения написания безопасного кода, использования элементов библиотек STL и BOOST и рефакторинга своего и чужого кода.
Подробнее

Преподаватели

Алексей Халайджи Алексей Халайджи

Выпускник Технопарка и Школы Анализа Данных.
Закончил с отличием магистратуру МГТУ им. Баума...


Подробнее

Илья Санеев Илья Санеев

Выпускник МГТУ им. Н.Э. Баумана (ИУ3).
Ведущий C++ разработчик группы анализа запросов БЮ По...


Подробнее

Юлиана Лихолай Юлиана Лихолай

Руководитель группы C/C++ разработки Почты Mail.Ru Group

Программа

занятие Часы в ауд. + сам. работа

Лекция №1: Цели и задачи курса. Организация и использование оперативной памяти. Вопросы качества структурного программного кода на языке С.  
+ ДЗ №1

Цели, задачи, структура курса. Язык C в современной промышленной разработке. Организация оперативной памяти. Одно- и многомерные массивы, строки и указатели. Выделение и освобождение памяти, управление памятью и производительность кода. Стандарт POSIX и переносимый исходный код. Обзор возможностей разных стандартов языка C. Анти-шаблоны структурного программирования, их поиск и устранение. Вопросы безопасности структурного кода.
Домашнее задание №1: ИЗ №1
К РК №1 необходимо индивидуально решить ИЗ №1 по программированию на языке С в соответствии с назначенным вариантом, а также разбиться на команды, продумать идею семестровых проектов, разбить их на задачи и поделить их между участниками команды.

ИЗ1 посвящено приобретению навыков безопасной работы с памятью на языке C с использованием базовых структур данных и налаживания базовой инфраструктуры для автоматической проверки кода. В качестве результата ИЗ2 ожидается:
* грамотное разбиение проекта на файлы;
* использование безопасного стиля программирования - проверка возможных ошибок, корректное завершение программы в случае их возникновения и правильная работа с памятью;
* максимальное покрытие кода юнит-тестами;
* рабочий CI, включающего в себя автоматическую сборку проекта, статический анализ кода, прохождение линтеров, valgrind, запуск юнит-тестов и получение отчёта о покрытии кода тестами
* все автоматические проверки должны проходить на итоговой версии, которая проходит ревью
4 ак. ч. + 4 ак. ч. СР

Семинар №1: Обзор инструментария для построения инфраструктуры для современного проекта на C/C++  

На первой части семинара будет разобрано как собирать проекты на C/C++ на разных платформах и операционных системах. Помимо этого будут рассмотрены средства отладки программ и статического анализа кода, а также будет показано, как работать с Git при совместной работе над одним командным проектом.
4 ак. ч. + 3 ак. ч. СР

Лекция №2: Основы системного программирования. Внешние библиотеки и линковщик. Оптимизация работы с оперативной и сверхоперативной памятью.  
+ ДЗ №2

Взаимодействие приложения с операционной системой (ОС) семейства UNIX. Многопоточное программирование с использованием потоков POSIX. Работа с разделяемой памятью. Линковщик и внешние библиотеки. Оптимизация работы с оперативной и кэш-памятью ЦП ЭВМ.
Домашнее задание №2: ИЗ №2
К семинару №2 необходимо индивидуально решить ИЗ2 по программированию на С в соответствии с назначенным вариантом.

ИЗ2 посвящено приобретению навыков системной разработки на C и работе с внешними библиотеками. В качестве результата ИЗ2 ожидается:
* грамотное разбиение проекта на файлы;
* наличие двух реализаций – последовательной и параллельной, оформленных в виде статической и динамической библиотеки соответственно, а также тестирующей программы, которая будет сравнивать на разных входных данных результаты обеих реализаций между собой;
* максимальная утилизация ресурсов процессора при параллельной обработке данных путём использования нескольких процессов или потоков;
* продуманные структуры данных в целях экономии оперативной памяти;
* реализация алгоритмов, эффективно взаимодействующих с кэш-памятью.
 
4 ак. ч. + 3 ак. ч. СР

Контрольное занятие №1: Рубежный контроль №1. Обсуждение идей командных проектов на C++  

Студенты в командах должны представить идеи своих командных семестровых проектов на языке C++.
4 ак. ч. + 4 ак. ч. СР

Лекция №3: Основные вопросы объектно-ориентированного программирования на языке C++  
+ ДЗ №3 + ДЗ №4 + ДЗ №5

Инкапсуляция и ответственность класса. Принципы SRP, OCP. Идиома RAII. Праводопустимые выражения. Конструкторы (операции) переноса и иные расширения объектной модели в C++11. Инкапсуляция и вопросы производительности.
Домашнее задание №3: UML
Спроектировать (сформировать диаграмму) полиморфную иерархию из трех или более классов с множественным наследованием, семантика и функциональная нагрузка которых определяются самостоятельно выбранным или назначенным вариантом задания (напр., моделирование поведения робота-исполнителя, стратегическая игра и т.д.). В решении задачи максимально актуализируются знания, полученные на лекциях №3 – 4.

Дедлайн: РК №2
Домашнее задание №4: Каркас кода и покрытие тестами
Реализовать полученную как результат практикума №3 полиморфную иерархию классов на языке C++, преобразовать один из элементов иерархии в шаблон класса, при необходимости его специализировать, дополнить результат иерархией классов-обработчиков исключительных ситуаций, смоделировать каждую подобную ситуацию и обеспечить ее корректную обработку. В решении задачи максимально актуализируются знания, полученные на лекциях №3 – 5
Домашнее задание №5: Прохождение ревью
Оценивается программная реализация трёх компонент:
- реализация интерфейсного каркаса проекта и юнит-тестов - 5 баллов
- реализация основной библиотеки с использованием STL, реализующей ядро проекта и предоставляющей необходимые интерфейсы для возможного расширения - 5 баллов
- доработка проекта с использованием сторонних библиотек и современных возможностей языка - 5 баллов
4 ак. ч. + 3 ак. ч. СР

Лекция №4: Дополнительные вопросы объектно-ориентированного программирования на языке C++. Динамическая идентификация типов (RTTI)  

Абстрактные классы. Принципы LSP, ISP, DIP. Множественное и виртуальное наследование. Динамическая идентификация типов времени выполнения (RTTI) и операции приведения типов. Производительность и безопасность полиморфизма и средств поддержки RTTI.
4 ак. ч. + 3 ак. ч. СР

Лекция №5: Принципы и шаблоны объектно-ориентированного проектирования. Базовые шаблоны, шаблоны GoF  
+ ДЗ №6

Принципы и шаблоны объектно-ориентированного проектирования. Базовые шаблоны, шаблоны GoF. Ключевые проблемы и принципы объектно-ориентированного проектирования. Основные конфликты. CAP-теорема. Типология шаблонов. Базовые шаблоны: наследование и композиция, интерфейс, делегирование, неизменяемые объекты. Каталог GoF: порождающие, структурные и порождающие шаблоны. Закон Деметра. Правила Фута — Опдайка.
Домашнее задание №6: Внедрение архитектурных паттернов в проект
На практикуме №6 ваша команда демонстрирует применение стандартных шаблонов объектно-ориентированного проектирования, решающих возникшие в ходе развития проекта проблемы с архитектурой
4 ак. ч. + 3 ак. ч. СР

Семинар №2: Тестирование и Объектно-ориентированное проектирование  

Введение в тестирование. Взаимосвязь тестирования и проектирования. Обзор возможностей GTest.
В качестве самостоятельного задания стутдентам предлагается спроектировать (сформировать диаграмму) полиморфную иерархию из трех или более классов (возможно, с множественным наследованием) для своей части проекта, семантика и функциональная нагрузка которых определяются самостоятельно выбранным или назначенным вариантом задания (напр., моделирование поведения робота-исполнителя, стратегическая игра и т.д.). В решении задачи максимально актуализируются знания, полученные на лекциях №3 – 5.
4 ак. ч. + 3 ак. ч. СР

Лекция №6: Проектирование сетевых приложений на C/C++  

В лекции рассматриваются следующие вопросы:
1. базовый набор функции для работы с TCP в unix-системах;
2. построение простейшего http-клиента. Структура HTTP-запроса;
3. виды сокетов;
4. построение простейшего tcp-сервера;
5. подходы организаций сетевых приложений;
6. введение в boost::asio.
4 ак. ч.

Лекция №7: Обработка исключительных ситуаций. Шаблоны классов и методов. Обобщенное и безопасное программирование  

Обработка исключительных ситуаций и вопросы производительности. Безопасное программирование. Нейтральность кода. Критерии безопасности и нейтральности классов и методов. Безопасность конструкторов и деструкторов. Исключения в стандартной библиотеке. Обобщенное программирование. Рекурсивное определение шаблонов. Элементы метапрограммирования. Идиома SFINAE. Библиотека Boost.Type Traits.
4 ак. ч. + 3 ак. ч. СР

Контрольное занятие №2: Рубежный контроль №2. Обсуждение результатов проектирования командных проектов  

На РК2 каждая команда предоставляет проработанную UML-диаграмму для своего проекта, а также предоставляет реализованный каркас кода и набор тестов на будущую реализацию. Вместе с ментором выявляются потенциальные проблемы дальнейшего сопровождения и развития проекта, корректируются планы дальнейшей работы над проектом каждого члена команды.
4 ак. ч. + 2 ак. ч. СР

Лекция №8: Практическое введение в STL  
+ ДЗ №7

Предпосылки создания, назначение и гарантии производительности библиотеки Standard Templates Library (STL). Итераторы STL: итераторы вставки и работа с потоками. Контейнеры и адаптеры STL. Обобщенные алгоритмы: основные характеристики и условия применения. Отношения сравнения. Функциональные объекты: предопределенные и пользовательские классы-функторы. STL в языке C++11
Домашнее задание №7: Реализация основной библиотеки проекта с использованием STL
Необходимо реализовать собственную библиотеку, реализующую основные функции MVP, с использованием STL
4 ак. ч. + 3 ак. ч. СР

Лекция №9: Введение в коллекцию библиотек Boost и обзор возможностей новых стандартов языка C++  
+ ДЗ №8

Рассмотрение некоторых библиотек из Boost. Взаимодействие Boost и стандарта языка. Проверки уровня компиляции, вариативные контейнеры и их связь с объединениями, произвольные типы, циклический буфер, умные указатели, сериализация данных, вопросы функционального программирования и взаимодействия с внешним миром.
Домашнее задание №8: Реализация итогового проекта с использованием собственной и сторонних библиотек
На практикуме №6 ваша команда демонстрирует применение библиотек (прежде всего - из Boost) или современных возможностей языка, решающих возникшие в ходе развития проекта проблемы с архитектурой
4 ак. ч. + 3 ак. ч. СР

Лекция №10: Идиоматика C++. С++ как мультипарадигмальный язык. Нововведения C++20.  
+ ДЗ №9 + ДЗ №10 + ДЗ №11

Структурные и объектно-ориентированные идиомы языка C++.
Идиома SFINAE. Концепты.
Элементы функционального программирования.
Подходы к написанию асинхронных программ. Корутины.
Домашнее задание №9: Организация асинхронной и/или многопоточной работы системы (доп.)
Требуется, чтобы асинхронная и/или многопоточная работы системы были оправданно использованы в проекте
Домашнее задание №10: Настройка CI (доп.)
Настройка статического анализа, линтеров, unit-тестов и др. проверок и внедрение в рабочий процесс
Домашнее задание №11: Проведение ревью кода другой команды (доп.)
Необходимо согласовать проведение ревью с другой командой, выполнить его и по результатам оформить отчёт, в котором отразить, что было найдено, какая обратная связь от команды была получена, и что уже было поправлено.
4 ак. ч. + 3 ак. ч. СР

Семинар №3: Консультация по лекционной части курса и обсуждение командных проектов  

На занятии обсуждается текущее состояние командных проектов. Студенты могут задать вопросы по лекционной части курса и скорректировать дальнейшие планы по подготовке проекта к защите. Также во время семинара студенты могут продолжить обсуждение и работу над проектом вместе с другими участниками своей команды.
4 ак. ч. + 4 ак. ч. СР

Контрольное занятие №3: Рубежный контроль №3. Контроль готовности основных функций MVP командных проектов  

К РК3 студенты должны продемонстрировать работоспособность основных функций MVP и прохождение тестов. В зависимости от результатов корректируются планы доработки проектов к защите.
4 ак. ч.

Семинар №4: Предзащита проектов  

Основная цель занятия - проверить готовность команд к защите, проработать выступление и отметить последние недочёты в проектах, которые следует поправить к защите.
4 ак. ч.

Контрольное занятие №4: Публичная защита семестровых проектов  

На защите студенты защищают итоговые проекты, которые они разрабатывали в командах на протяжении всего семестра.
4 ак. ч.

Контрольное занятие №5: Пересдача  

На пересдаче студенты могут поднять свою оценку на 1 балл выше, продемонстрировав владение теоретической и практической частей курса в формате небольшого экзамена.
4 ак. ч.

РАСПИСАНИЕ

Полное расписание