161 lines
14 KiB
Markdown
161 lines
14 KiB
Markdown
# ИУП: подготовка под «Разработчик 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,
|
||
остальное после оффера.
|