88 hours training + 24 hours work project = 120 hrs.
- Математическая подготовка уровня не ниже полного среднего образования
- Понимание механизмов построения алгоритмов, циклов, ветвления
- Опыт базовой декомпозиции, процедурного программирования
- Понимание алгоритмической сложности, О-нотации
- Опыт работы хотя бы с один языком императивного программирования
- Базовые знания алгоритмов поиска и сортировки, хотя бы пузырёк и прямой обход
- Опыт работы с командной строкой
- Опыт работы с linux
- Опыт разработки на любом скриптовом языке
- Обзор возможностей языка (парадигмы, спецификации, стандарт)
- Первая программа (классический hello world, описание структуры простейшей программы, функция main, вывод в консоль)
- Компиляция (процесс подготовки объектного файла, модель памяти, единица трансляции)
- Линковка (сборка приложения, внешние библиотеки, статическая и динамическая линковка)
- Среда разработки (требования к среде, code style, компоненты)
- Компиляторы (gcc, mingw, clang, msvc, кросскомпиляция, поддержка языка)
- Связь с языком С (компиляция из среды c++, обратная поодержка, разработка без ООП)
- Свременный С++ (мажорные обновления стандарта, связь с развитием других популярных языков)
- Фреймворки (Qt, OpenCV, OpenMP, boost, POCO, SFML, SDL)
- Hello World (сборка и запуск, смена выводимого сообщения, синтаксические ошибки)
- Локальный workflow
- Ветки и теги
- Удаленный workflow
- Клонирование репо на github
- Изменение
- Публикация
- Структура проекта (синтаксис, подготовка make, сборка)
- Базовый workflow
- Сборка Hello World App (подготовка CMakeLists.txt, настройка среды)
- Синтаксис языка (императивный стиль, зарезервированные слова, блоки, разделители, заголовочные файлы, препроцессор)
- Переменные и выражения (требования к именованию, унарные и бинарные операции, приоритет операций, сравнения, константы, квалификаторы)
- Типы данных (целочисленные, с плавающей запятой, символьные, булевы)
- Ветвление и циклы (базовые поддерживаемые методики организации циклов и ветвлений, break и continue, возможности switch-case, сложные условия)
- Область видимости и стек вызовов (переменные на стеке, правила доступа, возможные ошибки с двойным именованием)
- Ссылки и указатели (указатели в памяти, операции над указателями, разыменование, rvalue)
- Реализация консольной RPG в процедурном стиле. Функциональность выбора действий в цикле и состояний в условиях. Диалог с игроком
- Функции (синтаксис, параметры, методы передачи значений, возврат значения, квалификаторы, reuse, перегрузка, рекурсия)
- Массивы (одномерные, многомерные, символьные, динамические, доступ)
- Структуры, объединения, перечисления (базовые механики)
- Пространства имён (деление кода на логические модули, повторяемость наименований, доступ, using)
- Продолжение работы над консольной RPG, реализация структур игрока, врагов, инвентаря
- Ввод-вывод (консольный ввод-вывод, потоки, манипуляторы, оператор << и >>)
- Строки (класс работы со строками, встроенные методы, приведение типов)
- Алгоритмы (find, swap, sort, min, max, fill, понятие предиката, велосипедостроение)
- Работа с файлами (сишный способ, потоки, чтение и запись, реакция на io ошибки)
- Библиотека языка С (assert, math, stdio, stdlib, cstring)
- Сохранение и загрузка состояний в консольной RPG через файлы. Хранение описаний предметов и врагов.
- Зачем нужен объектно-ориентированный подход (классическая модель ООП + абстракция, понятие объекта и класса, свойства и методы, организация памяти)
- Инкапсуляция данных и поведения (модификаторы, квалификаторы, операторы, область видимости и доступ)
- Наследование и иерархия (перегрузка, виртуальные функции, ctor, dtor, абстракция, нисходящее и восходящее приведение)
- Повторное использование кода (наследование и делегирование)
- SOLID принципы дизайна
- Паттерны проектирования (порождающие, структурные) [GoF]
- static, extern, inline
- Рефакторинг RPG под использование ООП
- Структура классов и объекты (организация памяти объекта, представление, защита данных, синтаксис)
- Свойства и методы (описание и определение, предварительное объявление, ctor, dtor)
- Модификаторы и квалификаторы (область видимости и доступ, const, mutable, ограничение доступа)
- Перегрузка (сигнатуры, операторы)
- Наследование и иерархия (правила наследования, порядок доступа, абстракция, виртуальные функции)
- static, extern, inline (всего понемногу)
- Рефакторинг RPG с использованием наследования класса врагов. Изменяемость поведения.
- Обобщённое программирование (синтаксический сахар, обобщённые выражения, абстрагирование от типов данных)
- Шаблоны функций (обобщённые функции для математических операций)
- Шаблоны классов (классы с независимым значением аргумента, комплексные числа, перегрузка шаблонами)
- Обзор STL
- Реализация взаимодействия объектов RPG через шаблонную функцию.
- Вектор, массив, deque (случайный доступ, организация памяти)
- list (последовательный доступ, динамическая память)
- Map и multimap (ассоциативные списки, способы хранения, коллизии)
- Queue и unordered_queue (очереди FIFO)
- Set и multiset (множества, уникальность)
- Stack (очереди LIFO)
- Итераторы (обход контейнеров, сложность, правила выбора контейнеров)
- Миссии и задания в RPG, история действий
- Приведение типов (STD функции приведения, проблемы и реакция на ошибки, cast-операции, проблемы double, проблемы строк)
- Работа с памятью (динамическая память, структуры, прямой доступ, выравнивание, куча)
- RAII и умные указатели (адаптеры и автоматическое управление выделяемыми ресурсами)
- Работа с сетью (библиотека curl, доступ к внешний ресурсам, ожидание данных, протоколы)
- Публикация статистики игры на внешний сайт, запрос статистики и вывод в игре
- Классификация исключений (логические ошибки, ошибки времени выполнения, bad_cast)
- Структура исключений (синтаксис, ключевые слова, правила вызова)
- assert (простейший анализ поведения программы)
- Реакция на исключения (способы обработки исключений, передача параметров, передача исключения, раскрутка стека)
- Методики построения классов с исключениями (возврат результатов операций, поведение деструкторов)
- Разработка собственного исключения (исключение с кодом)
- Неопределённое поведение (понятие undefined behaviour, core dump)
- Использование дебаггера (режимы компиляции, логирование, основы работы с дебаггером)
- Методики тестирования ПО (юнит тестирование, мок тестирование, стресстесты, регрессионные тесты, ручные тесты)
- Рефакторинг RPG. Использование исключений для обработки логики завершения игры или неверных действий игрока
- Задачи модульных тестов (правила пнаписание, направленность, независимость, самоконтроль, TDD)
- Структура теста (работа с upp11)
- Оценка результатов (анализ поведения, исключения в тестах, тесты ради тестов)
- Покрытие RPG приложения модульными автотестами
- Основы многопоточной разработки и разделяемые данные (спецификация и поведение ядра, виды многопоточности, модель памяти)
- Потоки (процессы и потоки, параллельное исполнение, независимость от задержек)
- Гонка за ресурсами (разделяемый доступ, порча данных)
- Примитивы синхронизации (мьютексы и спинлоки, атомарные типы)
- CAS операции (atomic_flag, способ атомарной обработки данных)
- Критическая секция (выделение критических ресурсов, ограничение разделяемых данных)
- Грануляция критической секции (избыточность, сериализация данных, ожидание и нееффективность потоков)
- Безопасность доступа к контейнерам (работа с итераторами, модификация, разделяемый доступ на чтение)
- Дедлоки (разрешение блокировок, scoped_lock, recursive_mutex)
- RPG как клиент-сервеное приложение со множеством игроков
- Регулярные выражения (только std, никакой теории)
- RTTI (методы интроспекции, динамическое приведение типов)
- Лямбда функции (синтаксический сахар, запекание)
- Библиотека boost (основные возможности: математика, сеть, адаптеры)
- Списки инициализаций (синтаксический сахар, правила приведения, tuple, initializer_list)
- Автовывод типов (вывод значений, итераторы, вывод возвращаемых значений функций, универсальные ссылки)
- Вложенные пространства имён
- Аллокаторы (кастомная работа с памятью)
- Битвы между игроками в консольной RPG