Files
eduplan-cpp-eltex/WEEK7.md
T

15 KiB
Raw Blame History

ИУП — интенсив 7 дней (фуллтайм, собеседование ≤ 1 неделя)

Версия 2, 23.09 — пересобрана по результату диагностики (квиз 14/32). Срок: собеседование максимум через неделю, подготовка фуллтайм (~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++ урезан: за него отвечает сильная сторона, забирать у неё часы смысла нет.

Правила интенсива

  1. Каждый день — три блока: карточки (30 мин) → алгоритмы (3 ч) → системное (3 ч) → разбор и код (1,5 ч). Блок не начинается, пока не закрыта вчерашняя точка.
  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 — 60 карточек «числа и факты» (algo 20, linux 14, net 14, c_cpp 12). Маркеры: >=80% ок, 50–79% добор, <50% дыра.
  • Трекер дня: TRACKER.md в корне репозитория.

D0 — 23.09, диагностика (квиз пройден, 14/32)

  • Квиз: пройден — 14/32, слабейшие домены: алгоритмы, Linux, сети (см. таблицу выше).
  • Осталось: cd diag && python3 grade.py 01 02 03 04 05 06 07 08 09 — 9 практических задач.
  • Разбор промахов квиза вместе со мной, калибровка дней (уже сделана в этой версии плана).
  • Точка: есть results_quiz.json и results_tasks.json, названы 3 слабейших темы.

D1 — 24.09: инварианты сложности + хеш-таблицы | fork/COW/сигналы

  • Карточки (30 мин) — домен algo: бинарный поиск в 1e6, хеш O(1)/worst O(n), heapify O(n), устойчивость сортировок, Дейкстра и условие применимости.
  • Утро, алгоритмы (3 ч) — формальные свойства, а не «умение решать»: O-оценки и амортизация, хеш-таблицы (цепочки vs открытая адресация, загрузка, tombstone, worst O(n)), сортировки и устойчивость, бинарный поиск и lower_bound руками. Практика: tasks/10_hash — своя таблица на линейном зондировании; 6–8 задач Codeforces по тегам hashing и sortings, рейтинг 800–1400.
  • День, системное (3 ч) — Linux: fork/exec/wait, COW-страницы, зомби и waitpid, сигналы и коды возврата (137 = 128+9 SIGKILL, 139 = 128+11 SIGSEGV), errno. Практика: мини-шелл (fork + exec + wait + exit + пайплайн по желанию) — прямой вопрос на собеседовании; прогнать под ASAN.
  • Разбор и код (1,5 ч) — tasks/01_bits и tasks/03_ring на чистом C (без C++-обёрток), сборка -Wall -Wextra -Werror -fsanitize=address,undefined; одна задача вслух; трекер.
  • Точка: 10_hash PASS; мини-шелл запускает ls/cat; ASAN чистый; карточки algo ≥ 80%.

D2 — 25.09: деревья и куча | epoll и неблокирующие сокеты

  • Карточки (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

  • Карточки (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 и подсети

  • Карточки (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

  • Карточки (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, резюме

  • Карточки (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: повтор и два мок-интервью

  • 2 ч — повтор: только карточки с промахами и слабые темы из трекера.
  • 3 ч — мок-интервью №1: алгоритмы, 2 задачи вслух с таймером (я веду и разбираю).
  • 2 ч — мок-интервью №2: C/C++ + Linux + сети, включая разбор дампа.
  • 1 ч — вопросы работодателю, легенда по опыту, финальная вычитка резюме.
  • Точка: ≤ 1 грубая ошибка на сессию; резюме и сопроводительное готовы.

После собеседования

Незакрытое (полный трек PLAN.md): M2 хвост (битовые/строковые алгоритмы, математика), M6 глубина (STP, маршрутизация, HTTP), M7 полностью (Docker в бою, bisect на реальном репозитории), M8 ядро (полноценный драйвер, uboot/bringup), M9 электроника и схемотехника.