Перейти к содержимому
Skein

performance

Производительность

Как найти, почему программа тормозит, и действительно её ускорить — сначала замерь, потом чини настоящее узкое место, а не угадывай.

9 юнитов·85 уроков·~50 ч

Начать трек →
00

С нуля

Перед senior-материалом: что вообще такое работа над производительностью и горстка слов, которые остальной трек считает уже знакомыми.
01

Сначала профиль: измерь куда реально уходит время

Почему интуиция ошибается чаще половины случаев, как закон Амдала задаёт потолок любому ускорению, и какой измерительный цикл сеньоры запускают до того, как трогают строчку кода.
02

Горячие пути: диагностика, формы и исправления

Горячий путь — функция, которую профилировщик находит снова и снова. Пять форм (CPU, аллокация, кеш, лок, syscall), один диагностический цикл и аппаратные счётчики, разрешающие неоднозначность — от junior-интуиции до senior TMA.
03

Cache vs big-O: когда учебник лжёт

O(N) сканирование contiguous памяти регулярно бьёт O(log N) обход дерева — потому что cache lines, prefetcher и branch prediction доминируют wall-clock time способами, которые big-O не может описать.
04

Сборка мусора: бюджет пауз, давление аллокаций и невидимый хвост

Пауза GC — симптом; rate аллокаций — причина. Сначала сокращай аллокации, потом настраивай коллектор, в последнюю очередь меняй алгоритм.
05

N+1: одна логическая операция, много round-trip'ов

Почему один экран рендерится в 200 запросов к БД, четыре паттерна фикса (JOIN, IN, batch-loader, prefetch) с tradeoff'ами, и как та же проблема повторяется в REST, gRPC и микросервисном fan-out.
06

Batching: амортизируй фиксированную цену каждой операции

Per-op фикс. цена доминирует? Батч. Окно = размер и max wait; бо́льшие батчи покупают throughput, платят tail-latency.
07

Bundle budgets: байты, за которые юзеры реально платят

JS bundle байты = parse + compile + execute на CPU юзера. Per-route бюджеты, enforce CI, monitor RUM.
08

Складываем всё: performance как дисциплина, не как проект

Семь инструментов, один цикл. Profile, classify, fix, verify, enforce. Цикл делает performance устойчивым свойством команды, а не разовым проектом.

Проекты по этому треку

Guided-проекты, которые закрепляют изученное здесь.

◆ Проекты

Очередь задач at-least-once

Собери долговечную очередь задач на Postgres с visibility timeout и идемпотентными консьюмерами, чтобы упавший воркер не терял задачу.

◆ Проекты

Фильтр Блума

Собери пространственно-эффективное вероятностное множество, отвечающее на запросы членства за O(1) с настраиваемой вероятностью ложных срабатываний, — и разберись, почему ложных отрицаний в нём быть не может принципиально.

◆ Проекты

Лаборатория cache stampede

Воспроизведи thundering-herd промах кэша под нагрузкой, затем убей его через single-flight и пересчёт с ранним истечением.

◆ Проекты

Прерыватель цепи

Собери прерыватель цепи, который прекращает долбить падающую зависимость, безопасно прощупывает её в состоянии half-open и автоматически восстанавливается — именно этот паттерн не даёт каскаду микросервисов превратить один плохой узел в полный простой.

◆ Проекты

Совместные курсоры

Показать живой курсор и выделение каждого подключённого пользователя в общем документе, без конфликтов, через WebSocket.

◆ Проекты

Палитра команд

Палитра команд ⌘K с нечётким ранжированием, асинхронными источниками действий и полным клавиатурным управлением (стрелки, Enter, Escape, области видимости) — интерактивный слой, который нужен каждому профессиональному инструменту.

◆ Проекты

Кольцо consistent hashing

Собери кольцо на виртуальных узлах, которое перераспределяет минимальный набор ключей при появлении или уходе узла — базовый примитив за Dynamo, Cassandra и каждым шардированным кэшем, который должен пережить ротацию узлов без полного перебалансирования.

◆ Проекты

Сервис фич-флагов

Собери небольшой сервис флагов с правилами таргетинга, процентными раскатками и типизированным SDK, который вычисляет флаги на клиенте из закешированного набора правил.

◆ Проекты

Конкурентный сервис ингеста на Go

Собери конкурентный воркер ингеста/фан-аута на Go — а затем эксплуатируй его: ограничь работу, примени backpressure, сделай вызовы downstream устойчивыми к отказам, выкати в минимальном контейнере и разбери инцидент с утечкой горутин, пока он не съел твою память.

◆ Проекты

Кодирование Хаффмана

Собери lossless-компрессор с нуля: постройте оптимальное дерево prefix-free кодов снизу вверх, выведи битовые строки и докажи, что round-trip точен, а результат короче кодирования фиксированной шириной.

◆ Проекты

JSON-парсер с нуля

Напиши рекурсивно-нисходящий парсер JSON по спецификации — токенизатор, диспетчер значений, обработчик escape-последовательностей, декодер чисел — и наблюдай, как каждый крайний случай RFC 8259 превращается в конкретный путь в коде.

◆ Проекты

LRU-кэш

Собери LRU-кэш с вытеснением за O(1) на связке хешмапы и двусвязного списка — та самая задача, которая показывает, почему вытеснение из кэша сложнее, чем кажется.

◆ Проекты

Next.js-приложение в продакшен

Собери мультитенантное контент-приложение на App Router — а потом эксплуатируй его: закрой авторизацию и секреты, наслои кэши, реши каждый выбор edge-vs-node и разберись с инцидентом, когда один тенант отравляет общую ISR-страницу.

◆ Проекты

Офлайн-синхронизация PWA

Notes PWA с офлайн-приоритетом: локальная очередь записей (IndexedDB), которая синхронизируется при переподключении через last-writer-wins, service worker для кеширования ресурсов и background sync для пропущенных записей.

◆ Проекты

Загрузка через presigned URL

Прямая загрузка в хранилище через presigned URL с ограничениями размера и content-type и webhook завершения, проверяющим, что объект действительно прибыл, — чтобы API-сервер никогда не касался байт файлов.

◆ Проекты

Асинхронный Python-сервис: собрать и эксплуатировать

Собери асинхронный FastAPI-сервис приёма, который валидирует, прогоняет через пайплайн и выдерживает нагрузку, — а потом эксплуатируй его: упакуй, контейнеризуй с корректным поведением PID-1 и разберись с инцидентом, когда проглоченный CancelledError тихо протекает задачами, пока event loop не начинает голодать.

◆ Проекты

Визуализатор планов запросов

Вставь EXPLAIN (ANALYZE, FORMAT JSON) и отрисуй дерево плана с таймингом по узлам и ошибкой оценки строк, чтобы плохой join был виден сразу.

◆ Проекты

Распределённый rate limiter

Собери token-bucket лимитер, который держится поперёк многих инстансов приложения за счёт счётчика в Redis, а не в памяти процесса.

◆ Проекты

React-фича под нагрузкой

Выкати одну настоящую production-фичу на React — живой совместный дашборд активности — а потом эксплуатируй её: оптимистичные правки, стриминговые обновления, бюджет на кадр, полную доступность и разбор инцидента, когда render-шторм замораживает вкладку.

◆ Проекты

Движок регулярных выражений

Собери движок регулярных выражений с нуля через конструкцию Томпсона и симуляцию подмножества состояний — тот же метод, что делает grep и re2 иммунными к катастрофическому обратному ходу.

◆ Проекты

Мини-сигналы

Собери реактивную библиотеку сигналов примерно в 100 строк (signal/computed/effect) с автоматическим отслеживанием зависимостей и безглючными батч-обновлениями — та же модель, что лежит в основе Solid, Preact Signals и Vue 3.

◆ Проекты

Список с пропусками

Реализуй вероятностную упорядоченную структуру данных, которая обеспечивает O(log n) поиск, вставку и удаление без балансировочной бухгалтерии деревьев — только слоистые «экспресс-полосы» через отсортированный связный список.

◆ Проекты

Текстовый diff — алгоритм Майерса

Реализуй алгоритм diff Майерса с нуля: вычисли наибольшую общую подпоследовательность, построй edit script обратным ходом, докажи минимальность и применяй патчи так, чтобы любой round-trip был побайтово точным.

◆ Проекты

Планировщик сборки на топологической сортировке

Собери планировщик задач на основе DAG — как Make или CI-пайплайн — который упорядочивает задачи по зависимостям, обнаруживает циклы до дедлока и определяет, какие задачи можно выполнять параллельно.

◆ Проекты

Движок автодополнения на основе trie

Собери префиксное дерево для ранжированного автодополнения — вставляй слова с весами, проходи каждый префикс за O(длина_префикса + результаты) и детерминированно разрешай ничьи без базы данных.

◆ Проекты

Union-Find (система непересекающихся множеств)

Построй структуру непересекающихся множеств от наивного массива родителей до почти константного амортизированного времени — и прими на ней алгоритм Краскала для поиска минимального остовного дерева.

◆ Проекты

URL-сокращатель под нагрузкой

Собери URL-сокращатель, который выдерживает настоящий трафик, — а потом эксплуатируй его: задеплой, наблюдай и разберись с инцидентом, когда одна горячая ссылка плавит твой кэш.

◆ Проекты

Виртуальная таблица данных

Отрисуй и плавно прокручивай 100 тыс. строк на 60fps с windowing-виртуализацией, залипающими заголовками и полной клавиатурной навигацией — без библиотек, только математика.

◆ Проекты

Краш-устойчивое key-value хранилище с WAL

Собери крошечное дисковое KV-хранилище, которое переживает kill -9 на середине записи, дописывая в write-ahead log до изменения основного файла.

Следующий трек

Data engineering

Работа с данными в больших объёмах — как дёшево хранить огромные массивы и строить по ним аналитику и поиск. Продвинутый уровень; сначала изучи обычные базы данных.