Files

161 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ИУП: подготовка под «Разработчик 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,
остальное после оффера.