/cpp-junior

C++ Junior Training

Primary LanguageC++

C++ Junior Developer Training Course

88 hours training + 24 hours work project = 120 hrs.

Ожидания от участников

  • Математическая подготовка уровня не ниже полного среднего образования
  • Понимание механизмов построения алгоритмов, циклов, ветвления
  • Опыт базовой декомпозиции, процедурного программирования
  • Понимание алгоритмической сложности, О-нотации
  • Опыт работы хотя бы с один языком императивного программирования
  • Базовые знания алгоритмов поиска и сортировки, хотя бы пузырёк и прямой обход
  • Опыт работы с командной строкой
  • Опыт работы с linux
  • Опыт разработки на любом скриптовом языке

1. Цикл разработки (3 часов / включая 1 часа практики)

  1. Обзор возможностей языка (парадигмы, спецификации, стандарт)
  2. Первая программа (классический hello world, описание структуры простейшей программы, функция main, вывод в консоль)
  3. Компиляция (процесс подготовки объектного файла, модель памяти, единица трансляции)
  4. Линковка (сборка приложения, внешние библиотеки, статическая и динамическая линковка)
  5. Среда разработки (требования к среде, code style, компоненты)
  6. Компиляторы (gcc, mingw, clang, msvc, кросскомпиляция, поддержка языка)
  7. Связь с языком С (компиляция из среды c++, обратная поодержка, разработка без ООП)
  8. Свременный С++ (мажорные обновления стандарта, связь с развитием других популярных языков)
  9. Фреймворки (Qt, OpenCV, OpenMP, boost, POCO, SFML, SDL)

Практика

  1. Hello World (сборка и запуск, смена выводимого сообщения, синтаксические ошибки)

2. Инфраструктура разработки и сборки (4/2)

Git

  1. Локальный workflow
  2. Ветки и теги
  3. Удаленный workflow

Практика

  1. Клонирование репо на github
  2. Изменение
  3. Публикация

Cmake

  1. Структура проекта (синтаксис, подготовка make, сборка)
  2. Базовый workflow

Практика

  1. Сборка Hello World App (подготовка CMakeLists.txt, настройка среды)

3. Основы языка (8/2)

  1. Синтаксис языка (императивный стиль, зарезервированные слова, блоки, разделители, заголовочные файлы, препроцессор)
  2. Переменные и выражения (требования к именованию, унарные и бинарные операции, приоритет операций, сравнения, константы, квалификаторы)
  3. Типы данных (целочисленные, с плавающей запятой, символьные, булевы)
  4. Ветвление и циклы (базовые поддерживаемые методики организации циклов и ветвлений, break и continue, возможности switch-case, сложные условия)
  5. Область видимости и стек вызовов (переменные на стеке, правила доступа, возможные ошибки с двойным именованием)
  6. Ссылки и указатели (указатели в памяти, операции над указателями, разыменование, rvalue)

Практика

  1. Реализация консольной RPG в процедурном стиле. Функциональность выбора действий в цикле и состояний в условиях. Диалог с игроком

4. Процедурный стиль и структуры (6/2)

  1. Функции (синтаксис, параметры, методы передачи значений, возврат значения, квалификаторы, reuse, перегрузка, рекурсия)
  2. Массивы (одномерные, многомерные, символьные, динамические, доступ)
  3. Структуры, объединения, перечисления (базовые механики)
  4. Пространства имён (деление кода на логические модули, повторяемость наименований, доступ, using)

Практика

  1. Продолжение работы над консольной RPG, реализация структур игрока, врагов, инвентаря

5. Стандартная библиотека (8/3)

  1. Ввод-вывод (консольный ввод-вывод, потоки, манипуляторы, оператор << и >>)
  2. Строки (класс работы со строками, встроенные методы, приведение типов)
  3. Алгоритмы (find, swap, sort, min, max, fill, понятие предиката, велосипедостроение)
  4. Работа с файлами (сишный способ, потоки, чтение и запись, реакция на io ошибки)
  5. Библиотека языка С (assert, math, stdio, stdlib, cstring)

Практика

  1. Сохранение и загрузка состояний в консольной RPG через файлы. Хранение описаний предметов и врагов.

6. Объектный стиль (4/1)

  1. Зачем нужен объектно-ориентированный подход (классическая модель ООП + абстракция, понятие объекта и класса, свойства и методы, организация памяти)
  2. Инкапсуляция данных и поведения (модификаторы, квалификаторы, операторы, область видимости и доступ)
  3. Наследование и иерархия (перегрузка, виртуальные функции, ctor, dtor, абстракция, нисходящее и восходящее приведение)
  4. Повторное использование кода (наследование и делегирование)
  5. SOLID принципы дизайна
  6. Паттерны проектирования (порождающие, структурные) [GoF]
  7. static, extern, inline

Практика

  1. Рефакторинг RPG под использование ООП

7. Релизация объектного стиля в С++ (10/3)

  1. Структура классов и объекты (организация памяти объекта, представление, защита данных, синтаксис)
  2. Свойства и методы (описание и определение, предварительное объявление, ctor, dtor)
  3. Модификаторы и квалификаторы (область видимости и доступ, const, mutable, ограничение доступа)
  4. Перегрузка (сигнатуры, операторы)
  5. Наследование и иерархия (правила наследования, порядок доступа, абстракция, виртуальные функции)
  6. static, extern, inline (всего понемногу)

Практика

  1. Рефакторинг RPG с использованием наследования класса врагов. Изменяемость поведения.

8. Шаблоны (4/2)

  1. Обобщённое программирование (синтаксический сахар, обобщённые выражения, абстрагирование от типов данных)
  2. Шаблоны функций (обобщённые функции для математических операций)
  3. Шаблоны классов (классы с независимым значением аргумента, комплексные числа, перегрузка шаблонами)
  4. Обзор STL

Практика

  1. Реализация взаимодействия объектов RPG через шаблонную функцию.

9. Контейнеры (8/2)

  1. Вектор, массив, deque (случайный доступ, организация памяти)
  2. list (последовательный доступ, динамическая память)
  3. Map и multimap (ассоциативные списки, способы хранения, коллизии)
  4. Queue и unordered_queue (очереди FIFO)
  5. Set и multiset (множества, уникальность)
  6. Stack (очереди LIFO)
  7. Итераторы (обход контейнеров, сложность, правила выбора контейнеров)

Практика

  1. Миссии и задания в RPG, история действий

10. Дополнительные возможности (8/3)

  1. Приведение типов (STD функции приведения, проблемы и реакция на ошибки, cast-операции, проблемы double, проблемы строк)
  2. Работа с памятью (динамическая память, структуры, прямой доступ, выравнивание, куча)
  3. RAII и умные указатели (адаптеры и автоматическое управление выделяемыми ресурсами)
  4. Работа с сетью (библиотека curl, доступ к внешний ресурсам, ожидание данных, протоколы)

Практика

  1. Публикация статистики игры на внешний сайт, запрос статистики и вывод в игре

11. Исключения (6/2)

  1. Классификация исключений (логические ошибки, ошибки времени выполнения, bad_cast)
  2. Структура исключений (синтаксис, ключевые слова, правила вызова)
  3. assert (простейший анализ поведения программы)
  4. Реакция на исключения (способы обработки исключений, передача параметров, передача исключения, раскрутка стека)
  5. Методики построения классов с исключениями (возврат результатов операций, поведение деструкторов)
  6. Разработка собственного исключения (исключение с кодом)
  7. Неопределённое поведение (понятие undefined behaviour, core dump)
  8. Использование дебаггера (режимы компиляции, логирование, основы работы с дебаггером)
  9. Методики тестирования ПО (юнит тестирование, мок тестирование, стресстесты, регрессионные тесты, ручные тесты)

Практика

  1. Рефакторинг RPG. Использование исключений для обработки логики завершения игры или неверных действий игрока

12. Unit testing with Upp11 (5/2)

  1. Задачи модульных тестов (правила пнаписание, направленность, независимость, самоконтроль, TDD)
  2. Структура теста (работа с upp11)
  3. Оценка результатов (анализ поведения, исключения в тестах, тесты ради тестов)

Практика

  1. Покрытие RPG приложения модульными автотестами

13. Многопоточное программирование (8/3)

  1. Основы многопоточной разработки и разделяемые данные (спецификация и поведение ядра, виды многопоточности, модель памяти)
  2. Потоки (процессы и потоки, параллельное исполнение, независимость от задержек)
  3. Гонка за ресурсами (разделяемый доступ, порча данных)
  4. Примитивы синхронизации (мьютексы и спинлоки, атомарные типы)
  5. CAS операции (atomic_flag, способ атомарной обработки данных)
  6. Критическая секция (выделение критических ресурсов, ограничение разделяемых данных)
  7. Грануляция критической секции (избыточность, сериализация данных, ожидание и нееффективность потоков)
  8. Безопасность доступа к контейнерам (работа с итераторами, модификация, разделяемый доступ на чтение)
  9. Дедлоки (разрешение блокировок, scoped_lock, recursive_mutex)

Практика

  1. RPG как клиент-сервеное приложение со множеством игроков

14. Расширенные возможности* (8/3)

  1. Регулярные выражения (только std, никакой теории)
  2. RTTI (методы интроспекции, динамическое приведение типов)
  3. Лямбда функции (синтаксический сахар, запекание)
  4. Библиотека boost (основные возможности: математика, сеть, адаптеры)
  5. Списки инициализаций (синтаксический сахар, правила приведения, tuple, initializer_list)
  6. Автовывод типов (вывод значений, итераторы, вывод возвращаемых значений функций, универсальные ссылки)
  7. Вложенные пространства имён
  8. Аллокаторы (кастомная работа с памятью)

Практика

  1. Битвы между игроками в консольной RPG

15. Рабочий проект (24/24)