Files
eduplan-cpp-eltex/PLAN.md
T

14 KiB
Raw Blame History

ИУП: подготовка под «Разработчик C/C++» (Eltex, Новосибирск)

Актуальный режим (23.09.2026): собеседование ≤ 1 недели, подготовка фуллтаймом — рабочий документ сейчас WEEK7.md (интенсив 7 дней). Этот файл — полный трек на пост-офферный период и калибровка по диагностике.

Цель: пройти собеседование на вакансию hh #136775547 (Eltex, embedded C/C++, Linux, TCP/IP) и подтвердить уровень практикой, а не самооценкой.

Принципы плана:

  • каждая точка трека закрывается артефактом, у которого есть машинная или ревью-проверка;
  • материалы — первопартийные (официальные доки, man-страницы, книги авторов стека);
  • теории ровно столько, сколько нужно для практики: сначала задача, потом разбор;
  • ритм недельный, с обязательным «выходом» (код/разбор) каждую неделю;
  • ревизия плана каждые 4 недели по факту прохождения.

Диагностика (вход)

/home/pi/eduplan/diag — квиз по 4 доменам (C/C++, алгоритмы, Linux/OS, сети) и 9 практических задач (биты, связный список, ring buffer, разбор IPv4-пакета, ДП, потоки, epoll-сервер, bash, отладка gdb). Результат задаёт: с каких модулей стартовать, какие закрывать «по касательной», а какие — с нуля. Пока уровня не знаем, все модули помечены как «полный».

Трек модулей

Обозначения: К — контрольная точка, A — артефакт. Оценка «сдал»: артефакт собирается и проходит автопроверку/ревью; провал — точка не закрыта.

M0. Диагностика — 1 день

  • A: diag/results_quiz.json, diag/results_tasks.json.
  • К: пройден квиз (≥ 24/32 верных, иначе модуль-дыра уходит в план) и 9 задач.

M1. Системный C — 1 неделя

  • Память и владение: malloc/free, утечки, double free, dangling, переполнение буфера.
  • Указательная арифметика, выравнивание, структуры и padding, bitfields, union.
  • UB: переполнение знаковых, strict aliasing, неинициализированная память, порядок вычислений; как ловить — -Wall -Wextra -fsanitize=address,undefined.
  • Строки/буферы, memcpy vs strcpy, restrict, endianness, work with bytes.
  • A: 20 задач (массивы, битовые операции, парсинг бинарных структур) + конспект по UB.
  • К: A собирается с -Wall -Wextra -Werror и проходит автопроверку.
  • Материалы: cppreference (C), man-страницы 3 раздел, lkmpg (глава про кодинг-стиль и ошибки), OSTEP (глава про адресное пространство и malloc).

M2. Алгоритмы и структуры данных — 4–6 недель (приоритет по запросу)

Порядок — от «спрашивают почти всегда» к «глубина»:

  1. Сложность, амортизация, оценка на салфетке.
  2. Массив/строка: два указателя, скользящее окно, префиксные суммы, бинарный поиск (в т.ч. lower_bound руками).
  3. Сортировки: понимание всех, stability, компараторы; встроенная сортировка с ключом.
  4. Хеш-таблицы: коллизии, открытая адресация vs цепочки, нагрузка; unordered_map.
  5. Связные списки: разворот, поиск цикла (Флойд), пересечение, k-й с конца.
  6. Стек/очередь/ring buffer, монотонный стек/дек.
  7. Бинарные деревья и BST, обходы (рекурсия/итерация), LCA; куча и priority_queue (heapify O(n), top-K).
  8. Графы: представления, BFS/DFS, топосорт, компоненты, Дейкстра (неотрицательные веса), union-find.
  9. ДП: базовые состояния и переходы, задача о рюкзаке, LIS O(n log n), разбор «как доказывать корректность и считать сложность».
  10. Битовая арифметика, математика, строковые алгоритмы (хеш/префикс-функция — по остатку).
  • A: 60 задач (Яндекс-тренировки по алгоритмам + LeetCode/Codeforces-набор), 3 «живых» разбора вслух с замером времени, файл-трекер с датами и статусами.
  • К: 60% задач решены без подсказки за целевое время; 3 разбора приняты на ревью.
  • Материалы: официальные Яндекс Тренировки по алгоритмам (бесплатно), cppreference, OSTEP — как базис по структурам; Кормен — как справочник, не как старт.

M3. C++ как язык — 2 недели

  • RAII, Rule of 0/3/5, move-семантика, std::move vs перемещение, noexcept.
  • Умные указатели: unique_ptr/shared_ptr/weak_ptr, циклы ссылок.
  • Шаблоны и STL: контейнеры, итераторы, алгоритмы, лямбды, auto, structured bindings.
  • Исключения и гарантии безопасности (basic/strong), RAII-обёртки.
  • Виртуальность, vtable, виртуальный деструктор, slicing.
  • A: своя реализация vector/unique_ptr + мини-библиотека утилит.
  • К: сборка с -Wall -Wextra -Werror под ASAN/UBSAN, тесты проходят; ревью кода.
  • Материалы: cppreference (эталон синтаксиса/поведения), Core Guidelines (C++ Core Guidelines — официальный свод), книги автора языка (Страуструп) — выборочно.

M4. Многопоточность — 2 недели

  • std::thread, mutex/lock_guard, condition_variable, атомики и memory_order, барьеры.
  • Гонки, дедлоки, ложное пробуждение, паттерны: producer/consumer, пул потоков, thread-safe singleton, reader-writer.
  • Инструменты: ThreadSanitizer, -pthread, helgrind — по возможности.
  • A: bounded blocking queue + пул потоков с тестами, гонки ловятся TSan.
  • К: TSan чистый на 4×4 потоков/20k элементов, счётчики совпадают.
  • Материалы: cppreference (atomic/thread), документация компилятора по санитайзерам.

M5. Linux: системное программирование — 3 недели

  • Процессы: fork/exec/wait, зомби, сигналы и маски, exit-коды.
  • Файловый ввод-вывод: open/read/write/lseek/mmap, буферизация, права.
  • IPC: pipes, FIFO, unix-сокеты, shared memory.
  • Мультиплексирование: select → poll → epoll (LT/ET), неблокирующие сокеты.
  • Сокеты: TCP/UDP клиент-сервер, SO_REUSEADDR, разбор ошибок errno.
  • /proc, /sys, ulimit, cgroups (обзор), systemd-юниты (обзор).
  • A: TCP-эхо-сервер на epoll с поддержкой многих соединений + клиент; конспект по системным вызовам с man-страницами.
  • К: автотест поднимает сервер, гоняет 3 соединения, проверяет эхо; ревью кода.
  • Материалы: man7.org (man-страницы, разделы 2/3/7), LKMPG, OSTEP (процессы/потоки), Beej's Guide to Network Programming.

M6. Сети L2/L3 и анализ трафика — 3 недели

  • OSI/TCP-IP стеки; инкапсуляция; MTU/фрагментация.
  • L2: Ethernet, MAC, ARP, VLAN 802.1Q, STP (обзор), коммутация, learning/broadcast.
  • L3: IPv4-заголовок и контрольная сумма, маски/подсети, маршрутизация, ICMP, TTL.
  • L4: TCP (handshake, состояния, окно, ретрансмиссии, таймеры), UDP, порты, NAT.
  • Прикладные: DNS, DHCP, HTTP-минимум.
  • Инструменты: tcpdump, Wireshark, tcpreplay-разбор дампов, iperf.
  • A: 5 письменных разборов дампов (ARP-запрос, VLAN-кадр, TCP-handshake, ретрансмиссия, ICMP unreachable) + свой дамп, снятый своей программой (tcpdump).
  • К: разборы приняты на ревью; в каждом названы поля и вывод — что происходит в сети.
  • Материалы: RFC 791/793 (первоисточники), man-страницы сокетов, Wireshark wiki.

M7. Инструменты и инженерная гигиена — параллельно с M1–M6

  • git: ветки, rebase, cherry-pick, bisect, stash, worktree, конфликты.
  • gdb: breakpoints/watch/backtrace, разбор падений, core dumps, отладка потоков.
  • Сборка: Makefile руками → CMake, флаги, санитайзеры, препроцессор.
  • Docker: образ под сборку/тесты, воспроизводимое окружение.
  • bash: пайплайны, регулярки, awk/sed на уровне «разобрать лог», set -euo pipefail.
  • A: скрипт check.sh (сборка+тесты+санитайзеры), разбор одного реального падения в gdb, Makefile+CMake для своих задач.
  • К: скрипт зелёный на чистом клоне; падение разобрано письменно.

M8. Ядро и embedded (плюс к вакансии) — 2 недели

  • Модуль ядра: сборка, insmod/rmmod, printk, параметры, /proc.
  • Символьный драйвер: file_operations, копирование user↔kernel.
  • Device Tree (обзор), cross-compile (aarch64), uboot и bringup (обзор).
  • A: рабочий модуль + символьный драйвер, собранные под текущее ядро (или в QEMU).
  • К: модуль грузится и выгружается, драйвер отдаёт данные cat-ом.
  • Материалы: LKMPG (sysprog21.github.io/lkmpg), docs.kernel.org, эликсир (исходники ядра), kernel.org driver-api.

M9. Электроника (если проект аппаратный) — 1–2 недели

  • Основы схемотехники: питание, делители, подтяжки, транзистор как ключ.
  • Интерфейсы: UART/I2C/SPI, уровни, осциллограмма.
  • Чтение принципиальной схемы, работа мультиметром/осциллографом, пайка.
  • A: письменный разбор одной схемы из открытого проекта + замеры (если есть доступ к железу студии).
  • К: разбор принят на ревью; термины и режимы интерфейсов объяснены без подглядывания.

M10. Мок-интервью и выход — финальные 2 недели

  • 3 живые сессии: (1) алгоритмы — 2 задачи вслух с замером, (2) C/C++ глубина + Linux, (3) сети L2/L3 + анализ дампа.
  • Резюме под вакансию + сопроводительное с готовностью к офисному формату.
  • A: 3 записи/протокола сессий с разбором ошибок; резюме и cover под Eltex.
  • К: не больше 1 грубой ошибки на сессию; резюме отревьюено.

Ритм

  • Будни: 1.5–2 ч практики (задачи) + 30 мин разбора теории под сегодняшние задачи.
  • Выходные: 3 ч — «грязный» модуль недели (драйвер/сервер/дампы) с артефактом.
  • Каждую неделю — отчёт: что закрыто, что нет, где упёрся; каждые 4 недели — ревизия плана (пункты переехать/выбросить/добавить).
  • Правило: не начинать новый модуль, пока не закрыта контрольная точка предыдущего; исключение — M7 (идёт параллельно).

Порядок запуска (после диагностики)

Старт — с M2 (приоритет Туры) с параллельным добором M1 там, где диагностика показала дыры; M3/M4/M5 — по мере закрытия M2; M6/M7/M8/M9/M10 — по срокам собеседования. Если собеседование ближе 6 недель — сжатый вариант: M2 (ядро) + M5/M6 + M7 + M10, остальное после оффера.