Репозиторий содержит учебные проекты и решения задач по backend-разработке на C++.
Внутри:
lessons— пошаговые эксперименты и учебные проекты по Asio, lifetime, HTTP, многопоточности и архитектуре сервераsprint1— практические задачи сprecodeиsolution- во многих папках есть отдельные
README.mdс подробным объяснением
👉 Этот корневой README нужен как центральная навигация по всему уже сделанному материалу.
| 🔧 Шаг начала работы с репозиторием после клонирования на локальную машину или сервер | 📖 Что именно нужно сделать на этом шаге, чтобы начать навигацию по проекту и перейти к нужным материалам | 🧠 Зачем этот шаг нужен в общей логике работы с репозиторием | ✅ Итог | |
|---|---|---|---|---|
| 1 | Склонировать репозиторий | Код появится локально и станет доступен для изучения, сборки и запуска | Без клонирования невозможно перейти к урокам и задачам | Репозиторий доступен локально |
| 2 | Перейти в нужную папку | Можно выбрать конкретный lesson, problem, solution или sample | Это позволяет работать не со всем репозиторием сразу, а с конкретным разделом | Доступ к нужному разделу получен |
| 3 | Открыть README.md или папку |
Можно читать разбор задачи или сразу смотреть исходники | README даёт объяснение, а папка даёт прямой доступ к коду | Навигация по проекту начинается удобно |
git clone https://github.com/amanzhola/cppbackend.git
cd cppbackend| 🔄 Действие по обновлению template-части репозитория для получения новых автотестов и служебных изменений | 📖 Конкретная команда или последовательность действий, которую нужно выполнить в терминале | 🧠 Почему этот шаг важен для совместимости с template и автопроверкой | ✅ Итог |
|---|---|---|---|
| Добавить template remote | git remote add -m main template https://github.com/cpppracticum/cpp-backend-template-practicum-november.git |
Это подключает дополнительный удалённый репозиторий шаблона, из которого можно подтягивать обновления | Появляется доступ к официальному template-источнику |
| Получить обновления | git fetch template && git checkout template/main .github |
Эта команда подтягивает свежие изменения и обновляет служебную директорию .github |
Автотесты и CI-конфигурация остаются актуальными |
| Зафиксировать изменения | git add .github && git commit -m "update template" |
Изменения после обновления template сохраняются уже в твоём репозитории | Обновление шаблона закреплено в git |
При push в main запускается пайплайн GitHub Actions.
Ссылка на template Actions:
https://github.com/cpppracticum/cpp-backend-template-practicum-november/actions
| 🧪 Что происходит в GitHub Actions после отправки изменений в основную ветку репозитория | 📖 Какой эффект это даёт для проверки решений и сопровождения проекта в учебном процессе | 🧠 Почему это важно при работе с задачами и шаблоном practicum | ✅ Итог |
|---|---|---|---|
| Запускаются автотесты | Проверяется корректность решений, сборка, тесты и соответствие требованиям шаблона | Это позволяет быстро увидеть, что именно прошло, а что сломалось | Репозиторий можно проверять автоматически |
| Появляется статус CI | Видно, завершилась ли проверка успешно или с ошибкой | Это удобно как быстрый индикатор состояния проекта после push | Статус проверки прозрачен |
| Доступны логи выполнения | Можно открыть логи конкретного шага и посмотреть детали ошибок или предупреждений | Это особенно полезно для отладки, если локально всё выглядит иначе | Ошибки можно разбирать по логам |
cppbackend/
├── lessons/
└── sprint1/
Структура собрана по реальному дереву проекта.
| 📘 Основные группы материалов внутри каталога lessons и их роль в общей учебной траектории | 📖 Что именно находится в этой группе уроков и какие темы она покрывает по мере усложнения | 🧠 Почему эта группа важна для понимания backend-разработки на C++ | ✅ Итог |
|---|---|---|---|
| Ранние HTTP уроки | Первые шаги по учебным HTTP-серверам, запросам, ответам и базовой серверной логике | Это начальная точка входа в тему серверов и HTTP на C++ | Формируется базовая картина работы сервера |
| Эксперименты по Asio | Простые шаги по async-модели, event loop и базовым механизмам Boost.Asio | Эти эксперименты дают фундамент для дальнейшей асинхронной архитектуры | Понимание Boost.Asio закладывается с ранних примеров |
| Эксперименты по lifetime | Управление временем жизни объектов в асинхронном коде, shared_ptr и сохранность объектов | Это критически важно, потому что async-код ломается именно на lifetime-ошибках | Подготовка к реальным session/listener моделям |
Серия web_server_lesson_10_x |
Поэтапное развитие учебного HTTP-сервера от простых версий к более продвинутым | Это длинная практическая линия с постепенным наращиванием возможностей | Формируется пошаговое серверное мышление |
| Уроки 11–18 | Асинхронность, потоки, strand, post/defer/dispatch, async accept, async HTTP server | Это уже более зрелый backend-уровень и архитектура production-like сервера | Продвинутый блок lessons завершает основную линию |
| 🌐 Папка раннего HTTP-урока или промежуточного шага из каталога lessons | 📖 Что это за шаг в эволюции учебного HTTP-сервера и как к нему перейти из корневого README | 🧠 Что можно там посмотреть: README, код или промежуточное состояние проекта | ✅ Переход |
|---|---|---|---|
lessons/http_server_lesson9 |
Один из ранних оформленных HTTP-уроков с собственным README | Можно сразу открыть описание и затем перейти к коду | README |
lessons/http_server_lesson9_1 |
Промежуточный шаг серии без отдельного полноценного README | Здесь логично открывать саму папку и смотреть код напрямую | Папка |
lessons/http_server_lesson9_2 |
Следующий оформленный шаг серии с отдельным README | Можно перейти сразу к текстовому разбору | README |
lessons/http_server_lesson9_3 |
Ещё один ранний оформленный HTTP-урок | Доступен через README внутри папки | README |
lessons/http_server_lesson9_4 |
Завершающий ранний шаг в этой группе HTTP-уроков | Можно открыть README и потом код | README |
| ⚡ Папка с ранним экспериментом по Boost.Asio и базовой async-модели в lessons | 📖 Что это за экспериментальный шаг и чем он полезен при последовательном изучении Asio | 🧠 Что логично смотреть внутри: структуру, код, минимальные примеры и эволюцию идей | ✅ Переход |
|---|---|---|---|
lessons/hello |
Самый ранний минимальный пример в каталоге lessons | Удобен как самая простая стартовая точка | Папка |
lessons/lesson03_asio |
Один из первых шагов по теме Asio | Показывает базовую работу с Asio и минимальный код | Папка |
lessons/lesson03_asio_1 |
Следующий шаг в серии ранних Asio-экспериментов | Позволяет видеть постепенное усложнение примеров | Папка |
lessons/lesson03_asio_2 |
Продолжение ранней серии Asio | Подходит для чтения подряд вместе с соседними шагами | Папка |
lessons/lesson03_asio_3 |
Ещё один шаг по базовому Asio | Закрепляет ранние понятия asynchronous I/O | Папка |
| 🧠 Папка с экспериментом по lifetime в асинхронном коде и управлению временем жизни объектов | 📖 Какой это шаг в серии lesson04_asio_lifetime и почему его полезно держать в общей навигации | 🧠 Что именно можно там изучать: проблемы lifetime, сохранность объектов, связь с async-операциями | ✅ Переход |
|---|---|---|---|
lessons/lesson04_asio_lifetime_0 |
Самый ранний шаг серии lifetime | Полезен как старт серии по времени жизни объектов | Папка |
lessons/lesson04_asio_lifetime_1 |
Следующий шаг серии lifetime | Продолжает разбор базовых lifetime-вопросов | Папка |
lessons/lesson04_asio_lifetime_2 |
Последующий шаг по lifetime | Удобно читать как часть непрерывной линии | Папка |
lessons/lesson04_asio_lifetime_3 |
Продолжение серии | Показывает развитие идеи управления lifetime | Папка |
lessons/lesson04_asio_lifetime_4 |
Ещё один шаг серии | Полезен как часть общей группы lifetime-экспериментов | Папка |
lessons/lesson04_asio_lifetime_5 |
Следующий lifetime-эксперимент | Сохраняется в навигации как реальная часть проекта | Папка |
lessons/lesson04_asio_lifetime_6 |
Продолжение серии lifetime | Подходит для последовательного перехода по шагам | Папка |
lessons/lesson04_asio_lifetime_7 |
Предпоследний шаг из видимой серии | Полезен для непрерывности навигации | Папка |
lessons/lesson04_asio_lifetime_8 |
Последний видимый шаг серии lifetime | Завершает эту группу в корневой навигации | Папка |
| 🌍 Папка серии web_server_lesson_10_x, представляющая отдельный шаг развития учебного HTTP-сервера | 📖 Что это за конкретный шаг в последовательной линии lesson 10 и как лучше к нему переходить | 🧠 Что находится внутри: README с объяснением и исходный код текущего состояния сервера | ✅ Переход |
|---|---|---|---|
lessons/web_server_lesson_10_0 |
Начальный шаг серии lesson 10 с отдельным README | Можно открыть объяснение и смотреть первую версию кода | README |
lessons/web_server_lesson_10_0_1 |
Ранний промежуточный шаг серии lesson 10 | Содержит отдельный README и код | README |
lessons/web_server_lesson_10_1 |
Следующий шаг серии lesson 10 | Отдельный README доступен для чтения | README |
lessons/web_server_lesson_10_2 |
Следующий оформленный урок серии | Удобен для последовательного изучения | README |
lessons/web_server_lesson_10_3 |
Продолжение серии HTTP-сервера | README описывает этот шаг отдельно | README |
lessons/web_server_lesson_10_4 |
Следующий этап развития сервера | Содержит отдельный разбор | README |
lessons/web_server_lesson_10_5 |
Продолжение маршрутизации и логики сервера | Открывается через README | README |
lessons/web_server_lesson_10_6 |
Следующий оформленный шаг | Отдельный README внутри папки | README |
lessons/web_server_lesson_10_7 |
Следующий шаг series 10 | Доступен через README | README |
lessons/web_server_lesson_10_8 |
Продолжение архитектуры lesson 10 | Внутри есть README | README |
lessons/web_server_lesson_10_9 |
Следующий практический шаг | Можно сразу переходить к README | README |
lessons/web_server_lesson_10_10 |
Следующий урок серии | README внутри папки | README |
lessons/web_server_lesson_10_11 |
Продолжение lesson 10 | Отдельный README доступен | README |
lessons/web_server_lesson_10_12 |
Последующий шаг lesson 10 | Переход к README внутри | README |
lessons/web_server_lesson_10_13 |
Следующий шаг развития | Открывается через README | README |
lessons/web_server_lesson_10_14 |
Продолжение серии | README доступен | README |
lessons/web_server_lesson_10_15 |
Следующий шаг серии | Есть отдельный разбор | README |
lessons/web_server_lesson_10_16 |
Последующий шаг lesson 10 | Доступен через README | README |
lessons/web_server_lesson_10_17 |
Следующий урок в цепочке | README внутри папки | README |
lessons/web_server_lesson_10_18 |
Последующий шаг | Переход к README | README |
lessons/web_server_lesson_10_19 |
Следующий урок серии | Доступен по README | README |
lessons/web_server_lesson_10_20 |
Следующий оформленный шаг | Есть README | README |
lessons/web_server_lesson_10_21 |
Завершающий видимый шаг этой серии | Открывается через README | README |
| 🚀 Папка более продвинутого урока из серии web_server_lesson_11–18 с отдельным README и собственной темой | 📖 Что это за продвинутый урок и почему он важен в общей backend-линии lessons | 🧠 Что в нём можно изучать: асинхронность, потоки, strand, dispatch, shutdown, async accept, HTTP session | ✅ Переход |
|---|---|---|---|
lessons/web_server_lesson_11 |
Урок по архитектуре и асинхронной модели заказа/обработки | Полезен как переход к более серьёзной async-логике | README |
lessons/web_server_lesson_13 |
Урок про многопоточность, гонки, ThreadChecker и strand |
Важен для понимания async + multithreading | README |
lessons/web_server_lesson_14 |
Урок про boost::asio::post и поведение очереди задач |
Покрывает базу executor-модели | README |
lessons/web_server_lesson_15 |
Урок про boost::asio::defer и отличие от post |
Полезен для понимания планирования задач | README |
lessons/web_server_lesson_16 |
Урок про boost::asio::dispatch и порядок выполнения |
Даёт понимание sync/async поведения dispatch | README |
lessons/web_server_lesson_17 |
Async HTTP server part 1: graceful shutdown, signal_set, async accept stub | Подготавливает каркас полноценного async HTTP-сервера | README |
lessons/web_server_lesson_18 |
Async HTTP server part 2: Listener, SessionBase, Session, ServeHttp | Формирует уже рабочий асинхронный HTTP-сервер | README |
| 📦 Основные группы материалов внутри sprint1 и их роль в практическом блоке репозитория | 📖 Что именно лежит в этих каталогах и как это используется при решении задач | 🧠 Почему sprint1 важен как основной практический раздел текущего репозитория | ✅ Итог |
|---|---|---|---|
problems/*/precode |
Исходные заготовки задач, от которых начинается решение | Это стартовая точка перед реализацией собственного решения | Видно, от чего начиналась задача |
problems/*/solution |
Реализованные решения задач с исходниками и README | Это основной учебный результат и оформленные ответы | Главный практический блок репозитория |
samples |
Дополнительные примеры, например TCP/UDP | Это вспомогательная практика, полезная для закрепления базовых сетевых идей | Есть отдельные примеры вне задач |
| 🔑 Папка основной solution-задачи из sprint1, которая представляет важный этап практики по C++ backend | 📖 Что это за задача и почему она считается одной из ключевых внутри sprint1 | 🧠 Что можно открыть внутри: README, код solution, архитектуру и тесты | ✅ Переход |
|---|---|---|---|
sprint1/problems/sync_server/solution |
Синхронный сервер как базовая серверная практика | Удобен как стартовая задача по HTTP-серверу | README |
sprint1/problems/async_server/solution |
Асинхронный сервер как следующий шаг после sync-версии | Показывает переход к async HTTP-обработке | README |
sprint1/problems/map_json/solution |
JSON API сервер по картам и игровому конфигу | Важен как REST/JSON практика поверх HTTP-сервера | README |
sprint1/problems/final_task/solution |
Финальная задача с Docker и деплоем game_server |
Сводит вместе C++ backend, Docker и VPS-развёртывание | README |
| ➕ Папка дополнительной solution-задачи из sprint1, которая тоже имеет отдельный README и полезна для практики | 📖 Что представляет собой эта задача и какую часть навыков она тренирует внутри спринта | 🧠 Почему она сохраняется в центральной навигации наряду с основными задачами | ✅ Переход |
|---|---|---|---|
sprint1/problems/cafeteria/solution |
Задача про асинхронную симуляцию кафетерия и распределение ресурсов | Полезна для понимания таймеров, параллелизма и архитектуры | README |
sprint1/problems/restaurant_single_threaded/solution |
Однопоточная модель ресторана как ранний этап архитектурного мышления | Хороша как простая модель процессов без многопоточности | README |
sprint1/problems/radio/solution |
Дополнительная задача sprint1 с собственным README | Сохраняется как часть реального массива решений | README |
sprint1/problems/radio/solution_wsl_5s |
Альтернативная solution-версия radio под WSL/5s | Тоже имеет отдельный README и включается в навигацию | README |
sprint1/problems/seabattle/solution |
Дополнительная задача sprint1 с отдельным README | Полезна как часть полного набора решённых задач | README |
sprint1/problems/sum/solution |
Простая solution-задача с README | Тоже включена как часть общей практики спринта | README |
| 🧪 Папка примера из sprint1/samples, которая не является задачей problem/solution, но полезна для закрепления темы | 📖 Что находится в этом sample и как он помогает в изучении сетевого программирования | 🧠 Почему sample тоже стоит держать в центральной навигации репозитория | ✅ Переход |
|---|---|---|---|
sprint1/samples/tcp-udp |
Дополнительный пример TCP/UDP-клиентов и серверов | Полезен как вспомогательная практика по сетевому взаимодействию | README |
| 🧭 Шаг использования корневого README как навигации по lessons и sprint1 | 📖 Что именно делать пользователю на этом шаге, чтобы быстро перейти к нужному материалу | 🧠 Почему такой порядок работы удобен для большого учебного репозитория | ✅ Итог |
|---|---|---|---|
| 1 | Открыть нужную группу: lessons или sprint1 |
Это позволяет сразу выбрать между учебными уроками и практическими задачами | Навигация начинается с правильного уровня |
| 2 | Перейти по ссылке на README.md или папку |
В зависимости от наличия README можно открыть либо разбор, либо сам каталог с кодом | Переход занимает один клик |
| 3 | Читать README внутри конкретной задачи | Подробный разбор даётся там, где он относится к реальному коду | Объяснение остаётся рядом с кодом |
| 4 | Смотреть main.cpp или src/ рядом |
После README можно сразу переходить к исходникам без поиска по репозиторию | Изучение становится последовательным |
| 💡 Основная идея организации корневого README как центральной карты всего уже сделанного материала | 📖 Почему такой подход лучше, чем пытаться дублировать большие подробные объяснения прямо в корневом файле | 🧠 Что это даёт для чтения, навигации и поддержки репозитория в будущем | ✅ Итог |
|---|---|---|---|
| Не дублировать все подробности | Подробные объяснения уже лежат в отдельных README внутри уроков и решений, поэтому корень не должен копировать всё заново | Это сохраняет структуру чистой и уменьшает лишнее дублирование текста | Корневой README остаётся компактной картой |
| Дать полную навигацию | Из корня можно быстро перейти почти в любой важный раздел, включая README и даже папки без README | Это особенно важно, когда репозиторий стал большим и нелинейным | Репозиторий читается как оглавление |
| Показывать реальные группы | Здесь собраны и README-уроки, и ранние Asio/lifetime эксперименты, и sprint1-задачи, а не только “красивые” оформленные части | Это делает навигацию честной и полной | Видна реальная структура проекта |
| 🏁 Что уже есть в репозитории и как это отражено в корневом README после полной навигационной сборки | 📖 Какой именно материал охватывается этим корневым файлом и почему он теперь удобен как стартовая точка | 🧠 Что это означает для дальнейшего использования репозитория как учебной и демонстрационной базы | ✅ Итог |
|---|---|---|---|
lessons |
Полная учебная линия: HTTP, Asio, lifetime, async, multithreading, strand, dispatch, async HTTP server | Центральный README теперь даёт доступ и к README-урокам, и к ранним экспериментам без README | Навигация по lessons собрана полностью |
sprint1 |
Практические задачи с готовыми solution, README и дополнительными samples |
Корень стал удобной точкой входа ко всем реально реализованным задачам sprint1 | Навигация по sprint1 собрана полностью |
| Корневой README | Работает как центральное оглавление по всему уже сделанному материалу без дублирования подробных разборов | Это делает репозиторий удобнее для чтения, демонстрации и дальнейшего роста | Корневой README теперь выполняет роль полной карты проекта |