Files

214 lines
19 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.
# ИУП — интенсив 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 электроника и схемотехника.