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

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

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

Подробнее

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

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

Итоговая оценка знаний студентов по дисциплине формируется на протяжении учебного семестра в соответствии с правилами балльно-рейтинговой системы (см. ниже).

На протяжении всего семестра за определенные виды работ, выполняемые студентами, выставляются баллы. Итоговый рейтинг по дисциплине представляет собой сумму баллов, полученных студентом за прохождение контрольных точек – рубежных контролей, домашних заданий, защиты итогового проекта. Важное условие — своевременное выполнение работ.
Для успешной аттестации по данному курсу студентам необходимо набрать пороговый рейтинг — 50 баллов. При пересчете баллов студенты могут получить итоговую оценку: 0–49 неудовлетворительно, 50–69 удовлетворительно, 70–79 хорошо, 80–100 отлично.

Подробнее

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

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

Выпускник Технопарка. Закончил с отличием магистратуру МГТУ им. Баумана (кафедра ИУ6). Аспирант...


Подробнее

Виктор Могилин Виктор Могилин

Руководитель группы разработки С/C++ в проекте почта@mail.ru. Отвечаю за работу почтового back-e...


Подробнее

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

Выпускник МГТУ им. Н.Э. Баумана (кафедра ИУ3). Аспирант кафедры ФН-7. Руководитель группы р...


Подробнее

Программа

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

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

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

Семинар №1: Семинар №1. Работа с системами контроля версий на примере Git и сборки проектов (make/cmake). Решение индивидуальных задач повышенной сложности на тему «Адресная арифметика. Одно- и многомерные массивы и строки. Алгоритмы их обработки»  

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

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

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

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

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

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

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

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

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

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

Семинар №2: Семинар №2. Проектирование полиморфной иерархии классов повышенного уровня сложности  

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

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

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

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

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

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

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

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

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

Смешанное занятие №3: Семинар №3. Оптимизация полиморфной иерархии классов с использованием элементов библиотек STL и BOOST. Проектирование клиент-серверного взаимодействия  

Каждый студент может продолжить выполнение проекта со своей командой - например, спланировать и осуществить системную оптимизацию иерархии классов, полученной как результат второго модуля, с использованием возможностей библиотек STL и Boost (напр., стандартных и интервальных контейнеров, обобщенных алгоритмов, «умных» указателей и т.д.). В решении задачи максимально актуализируются знания, получаемые на лекциях №№7 – 8.
4 часа + 4 часа СР

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

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

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

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

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

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

Лекция №10: Лекция №10. Идиоматика C++. Основы рефакторинга и качество исходного кода. Стандарты кодирования и методологии разработки ПО   + ДЗ №7 + ДЗ №7

Объектно-ориентированные идиомы языка C++ и управление памятью. Статический анализ и рефакторинг исходного кода. Анти-шаблоны, логические и семантические ошибки, «технический долг» проекта. Понятие, факторы и метрики качества исходного кода. Оформление и документирование кода. Методологии промышленной разработки.
Домашнее задание №7: Проведение ревью кода другой команды (доп.)
Готовясь к практикуму №7, ваша команда осуществляет инспекцию кода другой команды, также отдавая свой продукт на анализ. По результатам анализа обе команды исправляют найденные недочеты и снижают «технический долг» проектов.
Домашнее задание №7: Настройка CI (доп.)
Демонстрация работоспособности CI
4 часа + 3 часа СР

Семинар №4: Семинар №4. Инспекция и рефакторинг объектно-ориентированного исходного кода  

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

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

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

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

На пересдаче студенты могут поднять свой оценку на 1 балл выше
4 часа