# ИУП — интенсив 7 дней (фуллтайм, собеседование ≤ 1 неделя) **Версия 3, 23.09** — пересобрана по диагностике (квиз 14/32, карточки 11/60) и правке формата: сначала урок с теорией, потом задачи ступенями. Срок: собеседование максимум через неделю, подготовка фуллтайм (~8 ч/день). Цель: закрыть ровно то, что спросят на входе в Eltex (C/C++, базовые алгоритмы и структуры данных, Linux, L2/L3-сети, инструменты), и не утонуть в глубине. ## Что показала диагностика (это и определило план) | Домен | Результат | Вывод | |---|---|---| | C/C++ | 7/8 | сильная сторона, **времени почти не даём** | | Алгоритмы | **1/8** | провал: формальные свойства (сложности, условия применимости) | | Linux | 3/8 | пропущены fork/COW, epoll, mmap, waitpid — «не был уверен» | | Сети | 3/8 | пропущены числа и байты (14/4/62/TTL), порядок TCP-хендшейка | Отдельно: из 32 вопросов **11 пропущены**, и это почти все «точные факты» — числа, байты, сложности. То есть база есть, а не хватает заученных формулировок и уверенности в них. Поэтому в плане появился ежедневный блок карточек (`facts_drill.py`), а C++ урезан: за него отвечает сильная сторона, забирать у неё часы смысла нет. ## Как устроен день (v3, после правки 23.09) Первая версия была проверкой — а проверять пока нечего. Теперь каждый день начинается с материала: 1. **Урок (30–40 мин чтения).** `lessons/D<день>_*.md` — теория по-русски, разобранные примеры с кодом, готовые ответы на вопросы собеседования, ссылки на первопартийные материалы. Ничего не решаешь, просто читаешь и запускаешь примеры. 2. **Карточки (20 мин).** `python3 facts_drill.py --level base` — начинать с базы; в режиме `--learn` каждая ошибка объясняется. База закрыта (≥ 80%) — переходишь на уровень `base,core` (по умолчанию), потом `all`. 3. **Ступени в задаче.** Каждая задача разбита на шаги по 10–30 минут, после каждого шага прогон. Не «напиши хеш-таблицу», а «сначала хеш-функция, проверь, что 16/32/48 дают разные индексы». 4. **Зачёт.** `python3 grade.py <номер>` — критерий `PASS`. Это конец дня, а не начало. Итого: **урок → карточки → ступени → зачёт**. Задача без урока впереди — моя ошибка, пиши, и я допишу материал. 2. День закрыт, только если: решены задачи дня **без подсказки**, написан/починен код дня, сделана **одна задача вслух на таймер** (10 мин: разбор + код + сложность), заполнен трекер. 3. Теория — только под конкретную задачу, максимум 40 минут. Всё остальное — код и разбор своих ошибок по трекеру. 4. Требования по сложности, которые тест не ловит (например `heapify` за O(n)) — проверяю глазами по коду при разборе. Если делаешь «на оценку» не то, что заявлено, увижу. 5. Что осознанно НЕ лезет в неделю: полноценное ядро (модуль+драйвер как продукт), электроника и схемотехника, Docker в продакшне. Ядро — обзорно на D6, электроника — после оффера (полный трек `PLAN.md`, модули M8–M9). 6. Провалил день — не догоняю всё, переношу хвост в D7 и режу второстепенное (ядро, docker). Материалы: cppreference (C и C++), man7.org (разделы 2/3/7), Beej's Guide to Network Programming, RFC 791/793, Wireshark wiki, OSTEP (процессы/память), LKMPG, docs.kernel.org. Задачи: Codeforces с фильтром по тегу и рейтингу 800–1400 (`https://codeforces.com/problemset?tags=two+pointers,800-1400` — тег менять), Яндекс Тренировки по алгоритмам (`https://yandex.ru/yaintern/training/algorithm-training`), классика LeetCode — по названию (ссылки на leetcode.com открываются только в браузере). ## Пакет задач (каталог `diag/`) - `01..09` — **диагностика**: битовые операции, список, ring buffer, IPv4-заголовок, НВП, потоки, epoll-сервер, bash по логу, разбор падения в gdb. - `10_hash`, `11_heap`, `12_dijkstra`, `13_subnet` — **добор под слабые домены**: своя хеш-таблица с открытой адресацией, куча (`heapify` за O(n), top-K), Дейкстра на `priority_queue`, арифметика подсетей. - `python3 grade.py` — все 13 с автопроверкой (ASAN/UBSAN); `python3 grade.py 10 13` — выборочно; `--fast` — без санитайзеров. - `python3 facts_drill.py --level base` — 41 карточка базы с пояснениями (начинать отсюда); `--level base,core` — 93; `--level all` — 101. Уровень `deep` (8 карточек, нишевое: TID в /proc, ulimit, ICMP Time Exceeded и подобное) в базовый прогон не попадает. Маркеры итога: `>=80%` ок, `50–79%` добор, `<50%` дыра. - `lessons/` — уроки по дням: теория, разборы с кодом, ответы на вопросы собеседования. - Трекер дня: `TRACKER.md` в корне репозитория. --- ## D0 — 23.09, вход: база и знакомство - Квиз **14/32**, карточки **11/60** — значит базы пока нет, и задачи уровня «напиши хеш-таблицу» решать рано. Это нормальный вход, просто порядок другой: сначала уроки. - Сегодня: `python3 facts_drill.py --level base --learn` — 41 карточка базы, каждая ошибка объясняется. Это 20–30 минут и даёт словарь, без которого дальше нечего делать. - Задачи 01–13 сегодня решать не нужно. Смотрим на них как на цель недели, а не как на зачёт. - **Точка:** пройдены базовые карточки, записаны 3 темы, которые «совсем не помню» — по ним я усилю соответствующие дни. ## D1 — 24.09: сложность и хеш-таблицы | процессы и сигналы - **Урок:** `lessons/D1_algo.md` (сложность, таблица структур, устройство хеш-таблиц, разбор кода) и `lessons/D1_linux.md` (fork/exec/wait, COW, сигналы, разбор мини-шелла). Читать 40 минут, примеры из уроков запустить руками — они рабочие. - **Карточки:** `python3 facts_drill.py --level base` (домен `algo` — обязателен, остальное по времени). Если база даётся легко — `--level base,core`. - **Задача дня:** `tasks/10_hash` — но по ступеням из её `task.md` (Глава IV), по 10–30 минут на шаг, после каждого шага `python3 grade.py 10`. Ступень 1 — это хеш-функция и проверка, что 16/32/48 дают разные индексы, и только шестая ступень — перехеширование. - **Разминка:** `tasks/01_bits` (20 минут, четыре функции) и `tasks/03_ring` (40–60 минут, тоже по ступеням). - **Зачёт дня:** `PASS` по `01`, `03`, `10`; карточки `base` ≥ 80%. ## D2 — 25.09: деревья и куча | epoll и неблокирующие сокеты - **Урок:** `lessons/D2_algo.md` (деревья, BST-инвариант, обходы, куча, `heapify` за O(n), top-K), `lessons/D2_linux.md` (файловый ввод-вывод, `mmap`, `select`/`poll`/`epoll`, LT/ET, `SO_REUSEADDR`), `lessons/D2_cpp.md` (padding, правило 0/3/5, virtual-деструктор, `std::move`, UB). - Карточки (30 мин) — `algo`: heap insert O(log n), top-K, обходы деревьев, сложность DFS по памяти. - Утро, алгоритмы (3 ч) — бинарные деревья и BST: обходы рекурсией и итерацией, валидация BST, LCA; куча: **`heapify` снизу вверх за O(n)**, `priority_queue`, top-K, `nth_element`. Практика: **`tasks/11_heap`** + задачи Invert Binary Tree, Validate BST, Kth Largest Element, Top K Frequent Elements. - День, системное (3 ч) — Linux: файловый ввод-вывод (`open/read/write/lseek`), **`mmap`**, мультиплексирование `select → poll → epoll` (LT/ET), неблокирующие сокеты, `SO_REUSEADDR`, `EAGAIN`/`EINTR`. Практика: **`tasks/07_epoll`** — эхо-сервер держит нагрузку, плюс нагрузочный тест своими руками. - Разбор и код (1,5 ч) — C++ **ровно по промахам**: выравнивание и padding (sizeof 12), правило 0/3/5, virtual-деструктор, `std::move` как каст, UB — 45 минут, не больше; одна задача вслух; трекер. - **Точка:** 11_heap и 07_epoll PASS; сервер держит 3+ соединений и не течёт по дескрипторам; карточки `c_cpp` = 100%. ## D3 — 26.09: списки/стек | многопоточность и gdb - **Урок:** `lessons/D3_algo.md` (списки, разворот, цикл Флойда, кольцевой буфер, монотонный стек), `lessons/D3_threads.md` (мьютекс, `condition_variable`, атомики и `memory_order`, дедлоки, пул потоков), `lessons/D3_gdb.md` (gdb: break/watch/bt/frame, core dump, почему краш далеко от причины). - Карточки (30 мин) — `linux`: epoll O(1) против select O(n), mmap, waitpid, 137/139. - Утро, алгоритмы (3 ч) — связные списки (разворот, **цикл Флойда**, k-й с конца), стек/очередь/ring buffer, монотонный стек. Практика: `tasks/02_list`, `tasks/03_ring` (если ещё не сданы) + Valid Parentheses, Daily Temperatures, Reverse Linked List. - День, системное (3 ч) — многопоточность: `std::thread`, mutex/`lock_guard`, `condition_variable` и predicate-цикл, атомики и `memory_order`, гонки, дедлоки, ложные пробуждения; паттерны producer/consumer и пул потоков. Практика: `tasks/06_threads` до продакшн-вида + свой пул потоков. (TSan на этой машине может отвалиться по VMA — тогда инварианты + ASAN, в логе это помечено.) - Разбор и код (1,5 ч) — gdb: breakpoints, `watch`, `bt`, `frame`, отладка потоков; `tasks/09_gdb` + **своё падение** с письменным разбором; одна задача вслух; трекер. - **Точка:** пул потоков проходит счётчики 4×4×20k; падение разобрано письменно; карточки `linux` ≥ 80%. ## D4 — 27.09: графы | L2/L3 и подсети - **Урок:** `lessons/D4_algo.md` (BFS/DFS, топосорт, Дейкстра, union-find), `lessons/D4_net.md` (OSI и инкапсуляция, Ethernet 14 байт, VLAN +4, ARP, IPv4 по полям, TTL, подсети и маски, ICMP). - Карточки (30 мин) — `net`: 14 байт Ethernet, VLAN +4, /26 = 62, TTL, SYN/SYN-ACK/ACK. - Утро, алгоритмы (3 ч) — графы: представления, BFS/DFS, топологическая сортировка (только для DAG), компоненты связности, **Дейкстра (веса ≥ 0)**, union-find. Практика: **`tasks/12_dijkstra`** + Number of Islands, Course Schedule, Network Delay Time, Redundant Connection + 6–8 задач с тегами `graphs`, `dsu`. - День, системное (3 ч) — сети L2/L3: OSI и TCP/IP, инкапсуляция, Ethernet (14 байт), MAC, ARP, VLAN 802.1Q (+4 байта), IPv4-заголовок (20 байт) и контрольная сумма, **TTL**, маски и подсети, ICMP. Практика: `tasks/04_ipv4` + **`tasks/13_subnet`** + два письменных разбора дампов (`tcpdump`: ARP-обмен и TCP-handshake). - Разбор и код (1,5 ч) — задача вслух (граф или подсеть); разбор промахов дня; трекер. - **Точка:** 12_dijkstra и 13_subnet PASS; 2 разбора дампов письменно; карточки `net` ≥ 80%. ## D5 — 28.09: ДП | TCP глубоко, bash и /proc - **Урок:** `lessons/D5_algo.md` (рюкзак 0/1, монеты, Edit Distance, НВП за O(n log n)), `lessons/D5_net.md` (заголовок TCP, автомат состояний, окна и ретрансмиссии, TIME_WAIT, UDP, NAT, DNS/DHCP, `tcpdump`), `lessons/D5_bash.md` (пайплайны, `set -euo pipefail`, awk/sed, `/proc`, `ulimit`). - Карточки (30 мин) — `net` + `c_cpp` (20 байт IPv4/TCP, MTU 1500, DNS 53, ASAN/UBSAN). - Утро, алгоритмы (3 ч) — ДП: состояния и переходы, рюкзак 0/1, **НВП за O(n log n)**, строки (Edit Distance, Word Break). Практика: `tasks/05_lis` + Climbing Stairs, House Robber, Coin Change, Edit Distance + 5–6 задач с тегом `dp`. - День, системное (3 ч) — TCP глубоко: автомат состояний, окно и подтверждения, ретрансмиссии и таймеры, закрытие, UDP, порты, NAT, DNS/DHCP минимум; работа с `tcpdump`/Wireshark. Практика: 3 письменных разбора дампов (ретрансмиссия, ICMP unreachable, DNS) + захват трафика своей программой. - Разбор и код (1,5 ч) — bash и Linux-быт: пайплайны, `set -euo pipefail`, awk/sed, `/proc`, `ulimit`; `tasks/08_bash` (лог в 1e6 строк — только awk/sort, не bash-цикл); одна задача вслух; трекер. - **Точка:** 05_lis и 08_bash PASS; 3 разбора дампов; скрипт держит лог 100k строк за секунды. ## D6 — 29.09: закрытие слабых мест | ядро обзорно, docker, резюме - **Урок:** `lessons/D6_kernel.md` (модули, `printk`, `file_operations`, device tree, cross-compile, uboot), `lessons/D6_docker.md` (namespaces и cgroups, слои, multi-stage, volumes). - Карточки (30 мин) — все домены, полный прогон 60 карточек. - Утро, алгоритмы (3 ч) — **только слабые места по трекеру**: добить `10..13` до PASS, повторить hash/BST/heap/Дейкстра/ДП там, где были FAIL или «не знаю». - День, системное (3 ч) — ядро и embedded **обзорно**: модуль (сборка, insmod/rmmod, printk, параметры, `/proc`), символьный драйвер (`file_operations`), device tree, cross-compile, uboot/bringup — ровно чтобы отвечать словами; docker (образ под сборку/тесты) — 45 минут. - Разбор и код (1,5 ч) — **резюме + сопроводительное под Eltex** (учесть офисный формат), вопросы работодателю, легенда по опыту. - **Точка:** все 13 задач PASS; карточки ≥ 80% во всех доменах; резюме готово к отправке. ## D7 — 30.09: повтор и два мок-интервью - **Урок:** `lessons/D7_mock.md` — сценарий двух мок-интервью (алгоритмы и системное), карта слабых мест по урокам, вопросы работодателю, легенда по опыту. - 2 ч — повтор: только карточки с промахами и слабые темы из трекера. - 3 ч — мок-интервью №1: алгоритмы, 2 задачи вслух с таймером (я веду и разбираю). - 2 ч — мок-интервью №2: C/C++ + Linux + сети, включая разбор дампа. - 1 ч — вопросы работодателю, легенда по опыту, финальная вычитка резюме. - **Точка:** ≤ 1 грубая ошибка на сессию; резюме и сопроводительное готовы. --- ## После собеседования Незакрытое (полный трек `PLAN.md`): M2 хвост (битовые/строковые алгоритмы, математика), M6 глубина (STP, маршрутизация, HTTP), M7 полностью (Docker в бою, bisect на реальном репозитории), M8 ядро (полноценный драйвер, uboot/bringup), M9 электроника и схемотехника.