Курс по современному программированию на C++ от разработчика Федерико Бузато — это открытый материал, созданный в 2018 году для университетов Италии и индустрии, включая NVIDIA. Программа охватывает путь от истории языка и настройки окружения до продвинутых тем вроде оптимизации производительности и проектирования ПО. Обучение строится вокруг 29 лекций с более чем двумя тысячами слайдов, где каждый код иллюстрирует конкретную функцию, а не загромождает чтение лишними примерами.
Начинается курс с подготовки: выбор редактора, компиляции и создания Hello World. Затем идут базовые понятия: типизация, фундаментальные типы вроде void, nullptr, а также операторы с прецедентом и spaceship <=>. Рассматриваются целочисленные и плавающие типы, их арифметика, ошибки при переполнении и проблемы с плавающей точкой вроде NaN или катастрофической отмены. Следом идут структуры, инициализация, конструкторы, деструкторы и доступ к памяти через указатели, ссылки и стековые области. Особое внимание уделено ключевым словам const, constexpr, static_cast и работе с макросами препроцессора.
Раздел об объектно-ориентированном программировании разбирает иерархию классов, полиморфизм с использованием virtual, переопределение операторов и работу с абстрактными классами. Далее идут шаблоны: функции, классы, SFINAE, вариадные шаблоны и C++20 concepts. Важные темы — правило одной функции (ODR), модули C++20, управление циклическими зависимостями через #include и работа с библиотеками. Практически каждый раздел содержит код, который демонстрирует конкретную концепцию без лишней verbosity.
Курс также обучает стандартам разработки: соглашениям по именам, форматированию, документации, использованию clang-tidy и тестированию с помощью unit-тестов. Раздел по отладке охватывает инструменты вроде valgrind, санитайзеры, стектрейсы и методы харденинга кода. Блок оптимизации объясняет работу процессора, память, инструкции SIMD, кэширование и использование флагов компилятора для ускорения и снижения размера бинарников. Разбираются std::vector, итераторы, алгоритмы из <algorithm>, std::ranges, умные указатели и обработка ошибок через std::expected.
В финале рассматриваются принципы дизайна ПО: SOLID, разделение ответственности, паттерны вроде CRTP или PIMPL, управление жизненным циклом объектов и глобальными переменными. Отдельно выделены темы уменьшения времени сборки с использованием ninja, PCH, модулей и анализатора Templight. Материал полностью открыт для редактирования, а перевод с LaTeX планируется на Typst.