Архитектор поневоле

Глоссарий

Термины курса простыми словами — без академизма и без имён на обложках. Если по ходу истории что-то забылось, загляни сюда.

277 терминов

связанность (coupling)
Насколько изменение в одном месте вынуждает менять другое. Не дефект — свойство любой системы; вопрос лишь в том, сколько её и какая.
общее знание (shared knowledge)
Всё, что один компонент знает про устройство другого: форматы, схемы таблиц, правила. Чем его больше, тем чаще они меняются вместе.
общий жизненный цикл (shared lifecycle)
Компоненты, которые тестируются, деплоятся и падают вместе. Модули одного монолита связаны так, даже если ничего не знают друг о друге.
поток знания
Направление, в котором одно знает про другое. Течёт против стрелки зависимости: кто вызывает — тот и должен знать устройство того, кого вызывает.
upstream / downstream
Upstream — тот, чьим знанием пользуются; downstream — тот, кто вынужден это знание усвоить и подстраиваться под его изменения.
upstream
Компонент, чьим функционалом и знанием пользуются другие. Его изменения способны сломать тех, кто ниже по потоку.
downstream
Компонент-потребитель: он знает устройство upstream и обязан меняться вслед за ним.
essential vs accidental
Существенные связи нужны для цели системы. Случайные — паразитные (как чтение чужих таблиц): их можно и нужно убирать.
каскадные изменения
Когда правка в одном месте тянет за собой обязательные правки в других. Распространяются ровно по потоку общего знания.
контракт
Явно согласованный узкий интерфейс между компонентами (API, представление). Прячет внутреннее устройство и переносит минимум знания.
инкапсуляция
Сокрытие внутреннего устройства за интерфейсом: снаружи видно «что делает», но не «как устроено внутри».
неявное знание
Предположения, которые нигде не записаны: «сервер в UTC», «заказы не удаляются», «колонка называется так». Самые опасные связи — их не видно, пока не порвутся.
SLO (service level objective)
Внутренняя цель по качеству сервиса: например, «99% запросов быстрее 200 мс». То, за чем команда следит сама.
SLA (service level agreement)
Обещание клиенту с последствиями за нарушение (штраф, компенсация). SLO обычно строже SLA — запас на всякий случай.
перцентиль
p95 = «95% запросов быстрее этого значения, худшие 5% — медленнее». Показывает хвост задержек, а не размытое среднее.
p99
99-й перцентиль: только 1% запросов медленнее. Часто именно эти «худшие 1%» видят самые активные клиенты.
медиана (p50)
Значение, быстрее которого ровно половина запросов. В отличие от среднего, её не задирают редкие выбросы.
хвостовые задержки (tail latency)
Самые медленные запросы — правый хвост распределения. Обычно именно они портят впечатление, хотя среднее выглядит хорошо.
усиление хвоста
Если страница ждёт много бэкендов сразу, шанс поймать хотя бы один медленный растёт. Редкая задержка одного становится обычной для страницы.
пропускная способность (throughput)
Сколько запросов (или записей) система обрабатывает в единицу времени. Дополнение к задержке: одно про «сколько», другое про «как быстро».
fault vs failure
Fault — сбой одного компонента (упал диск). Failure — когда система в целом перестала делать своё дело. Цель — чтобы fault не превращался в failure.
отказоустойчивость
Способность системы продолжать работать, когда часть её компонентов вышла из строя.
шторм ретраев (retry storm)
Сервис тормозит → клиенты повторяют запросы → нагрузка растёт → он тормозит сильнее. Самоусиливающаяся лавина, из которой трудно выбраться.
предохранитель (circuit breaker)
Обёртка над вызовом: если сервис стабильно падает, она временно перестаёт его дёргать и быстро отвечает ошибкой — чтобы дать ему прийти в себя.
экспоненциальная задержка
Повторять неудачный запрос не сразу, а с растущей паузой (1с, 2с, 4с…) плюс случайный разброс — чтобы не долбить сервис синхронно.
сброс нагрузки (load shedding)
Осознанно отклонять часть запросов при перегрузе, чтобы обслужить остальные. Лучше ответить «нет» быстро, чем умереть под всеми сразу.
обратное давление (backpressure)
Сигнал «притормози» от получателя к отправителю, когда тот не успевает переваривать поток. Иначе очередь растёт до отказа.
chaos engineering
Намеренно ломать части системы в проде (гасить узлы, резать сеть), чтобы заранее убедиться, что она это переживает.
OLTP
Онлайн-обработка транзакций: много мелких чтений и записей по ключу, миллисекунды на запрос. Так работает оформление заказа.
OLAP
Аналитическая обработка: редкие тяжёлые запросы, сканирующие миллионы строк ради отчёта. Противоположность OLTP по паттерну доступа.
shared-nothing
Архитектура, где узлы не делят ни память, ни диск и общаются только по сети. Хорошо масштабируется — ценой сложности распределёнки.
Cynefin
Рамка, которая делит проблемы по их природе: ясные, запутанные, сложные, хаотичные. Для каждой — свой способ действовать; универсального нет.
когнитивная нагрузка
Сколько всего нужно держать в голове, чтобы понять или изменить код. Чем выше — тем медленнее и рискованнее правки.
известное незнание
Ты знаешь, чего именно не знаешь, и можешь это выяснить анализом. Признак «запутанной», но не «сложной» задачи.
неизвестное незнание
Ты даже не подозреваешь, чего не знаешь. Такие задачи не просчитать заранее — только пробовать и смотреть, что выйдет.
фиче-флаг (feature flag)
Переключатель, который включает или прячет функциональность без нового деплоя. Позволяет катить код и открывать его постепенно.
канареечный релиз
Выкатить изменение сначала на малую долю трафика, посмотреть на метрики и только потом — на всех. Название — от канареек в шахтах.
staging
Отдельное окружение, максимально похожее на прод, где проверяют изменения перед выкаткой на реальных пользователей.
переписывание с нуля (big-bang)
Заменить работающую систему новой одним рывком. Соблазнительно и почти всегда болезненно: риск копится до самого включения.
impedance mismatch
Несовпадение форм: объекты в коде — деревья и графы, а реляционная таблица — плоская. Стыковать их приходится вручную или через ORM.
ORM
Библиотека, которая автоматически раскладывает объекты кода по таблицам и обратно. Экономит рутину, но прячет то, что реально уходит в базу.
N+1 запросов
Один запрос за списком плюс по одному за каждым элементом. Незаметно превращается в сотни обращений к базе на одну страницу.
нормализация
Хранить каждый факт ровно в одном месте, а ссылаться на него по id. Меньше дублей — но больше джойнов при чтении.
денормализация
Сознательно продублировать данные, чтобы читать их быстрее без джойнов. Плата — следить, чтобы копии не разъехались.
JSONB
Тип в PostgreSQL, хранящий JSON в бинарном виде с индексами. Удобно для гибких, вложенных данных без жёсткой схемы колонок.
schema-on-read
Схему данных трактуют при чтении, а не при записи. Гибко для разнородных данных, но структура ничем не гарантирована.
event sourcing
Хранить не текущее состояние, а полный журнал произошедших событий. Состояние — это результат их проигрывания по порядку.
CQRS
Разделить модель на запись и чтение: пишем в одном виде, читаем из другого, заточенного под запросы. Больше гибкости — больше движущихся частей.
графовая модель
Данные как узлы и связи между ними. Блестит там, где важны сами связи: соцграфы, маршруты, рекомендации.
источник истины
Место, где факт хранится в оригинале. Всё остальное (кэши, индексы, отчёты) — производное, которое можно пересобрать.
производные данные
То, что можно заново вычислить из источника истины: индексы, кэши, витрины. Потерять не страшно — пересоберётся.
неустранимая сложность
Сложность самой задачи: она есть при любом решении. Убрать нельзя — можно лишь честно с ней работать.
привнесённая сложность
Лишняя сложность, которую добавило наше решение, а не задача. Вот её и стоит вычищать.
god-class
Класс, который знает и делает слишком много. Меняешь одно — рискуешь задеть всё остальное, что он в себя вобрал.
степени свободы
Сколько независимых решений приходится держать в голове одновременно. Чем больше — тем труднее рассуждать о системе.
наблюдаемость (observability)
Возможность понять, что происходит внутри системы, по её сигналам снаружи: логи, метрики, трейсы. Без неё отладка — гадание.
реплика для чтения
Копия базы, которую нагружают только чтением (отчёты, аналитика), чтобы не мешать основной записи.
модульность
Разбиение системы на части, каждую из которых можно понять и менять, не держа в голове всё остальное.
сокрытие информации
Прятать самое переменчивое (детали реализации) за стабильным интерфейсом. Тогда изменения внутри не выплёскиваются наружу.
абстракция
Показать суть и спрятать детали. Хорошая абстракция даёт много пользы за простой интерфейс.
глубокий модуль
Простой интерфейс поверх богатой начинки. Максимум пользы за минимум того, что нужно знать снаружи.
мелкий модуль
Интерфейс почти такой же сложный, как содержимое. Пользы прячет мало, а знать про него нужно много — часто не окупается.
протекающая абстракция
Абстракция, сквозь которую всё равно приходится знать детали реализации. Обещала спрятать — а знание протекло наружу.
big ball of mud
Система без внятной структуры: всё связано со всем. Растёт сама собой, менять её страшно.
связность (cohesion)
Насколько элементы внутри модуля служат одной цели. Высокая связность — хорошо: всё, что меняется вместе, лежит рядом.
модульный монолит
Один процесс деплоя, но внутри — чёткие модули с границами и контрактами. Порядок микросервисов без их сетевой боли.
распределённый монолит
Худшее из двух миров: сервисы разнесли по сети, но связи оставили тесными. Меняешь один — приходится катить остальные.
оверинжиниринг
Заложить гибкость под будущее, которое может не наступить. Платишь сложностью сейчас за пользу, которой, возможно, не будет.
сила интеграции
Какой тип знания течёт через границу: детали реализации → правило → чужая модель → контракт. Чем «сильнее», тем чаще изменение проходит каскадом.
интрузивная связь
Зависимость от того, что автор вообще не считал интерфейсом: чужие таблицы, приватные поля. Сильнейший и самый хрупкий уровень.
функциональная связь
Модули делят не данные, а поведение: одно правило, инвариант, порядок действий. Меняться обязаны синхронно.
модельная связь
Наружу отдана внутренняя доменная модель. Каждый её рефакторинг задевает всех потребителей.
контрактная связь
Интеграция через «модель модели», спроектированную под задачи потребителя. Слабейший уровень: не привязан к внутренностям и версионируется.
конасценция (connascence)
Мера того, насколько сложное и неявное знание связывает два фрагмента кода: они «рождены вместе», если менять их приходится синхронно.
симметричная связь
Одно правило реализовано в двух местах. Ни вызова, ни импорта — только обязанность меняться синхронно. Самая невидимая связь.
DRY
«У каждого знания в системе — одно авторитетное представление». Лекарство от одного правила, размноженного по разным модулям.
движок хранения
То, как БД физически пишет и читает данные с диска. Определяет, при какой нагрузке она летает, а при какой задыхается.
B-дерево
Движок, обновляющий данные на месте страницами фиксированного размера. Отличные точечные чтения; каждая запись правит страницу и журнал. Так устроен PostgreSQL.
LSM-дерево
Движок, который только дописывает данные последовательными порциями и сливает их фоном. Высокая пропускная способность записи ценой более дорогого чтения.
WAL (журнал упреждающей записи)
Сначала БД дописывает изменение в последовательный журнал, потом правит сами страницы. Страховка на случай сбоя посреди записи.
memtable
Свежие записи LSM копятся в памяти в отсортированном виде и лишь потом сбрасываются на диск одним куском.
SSTable
Отсортированный неизменяемый файл, в который LSM сбрасывает memtable. Со временем такие файлы фоном сливаются.
компакция
Фоновое слияние файлов LSM: выбрасывает перезаписанные и удалённые значения, чтобы чтения не деградировали. Ест диск и CPU.
амплификация записи
Когда одна логическая запись превращается в несколько физических: журнал, страницы, каждый индекс. Главная причина, почему запись со временем дорожает.
амплификация чтения
Когда одно логическое чтение вынуждает заглянуть в несколько мест сразу. Плата LSM за дешёвую запись.
страничный кэш (buffer pool)
Горячие страницы БД, лежащие в RAM. Пока рабочий набор влезает — всё быстро; перестал влезать — каждое обращение падает на диск.
bloom-фильтр
Компактная структура, которая мгновенно отвечает «этого ключа здесь точно нет». Спасает LSM от лишних заглядываний в файлы.
вторичный индекс
Дополнительная структура для быстрого поиска не по первичному ключу. Ускоряет чтение — и облагает налогом каждую запись.
выделение сервиса
Вынести модуль из монолита в отдельный сервис за сетью. Не «переместить код», а решить, каким знанием он владеет и что отдаёт наружу.
своя база у сервиса
У каждого сервиса — собственное хранилище, в которое больше никто не лезет напрямую. Иначе общая база тайком снова всех связывает.
частичный отказ
За сетью вызов может не просто вернуть ошибку, а зависнуть или потеряться — и ты не узнаешь, дошёл он или нет. Особенность распределённых систем.
распределённая транзакция
Попытка сделать атомарной операцию через несколько сервисов сразу. Дорого, хрупко и держит блокировки по сети — обычно её избегают.
идемпотентность
Операция, которую можно безопасно повторить: второй и третий раз дают тот же результат, что и первый. Спасение там, где запрос мог потеряться.
согласованность в конечном счёте
Части системы сходятся к общему состоянию не мгновенно, а спустя короткое время. Плата за жизнь без распределённых транзакций.
владение данными
У каждого факта — один сервис-хозяин, который его меняет. Остальные спрашивают через контракт, а не правят напрямую.
эволюция схемы
Как менять формат сообщений и данных, не ломая тех, кто ещё живёт на старой версии. Правило: добавляй, но не удаляй и не переиспользуй.
обратная совместимость
Новый код умеет читать данные, записанные старым. Без неё нельзя обновиться, не переписав сразу всё.
прямая совместимость
Старый код спокойно читает данные, записанные новым, — просто игнорирует незнакомые поля. Нужна, пока обе версии живут вместе.
Protocol Buffers
Бинарный формат со схемой: компактный и с проверкой совместимости. Хорош для нагруженного межсервисного трафика.
Avro
Бинарный формат со схемой, заточенный под эволюцию: писатель и читатель могут иметь разные версии схемы.
реестр схем
Общее место, где хранятся версии схем сообщений. Позволяет проверять совместимость до того, как новая версия уедет в прод.
постепенная выкатка (rolling upgrade)
Обновляют узлы по очереди, поэтому какое-то время старая и новая версии кода работают одновременно. Значит, формат обязан быть добр к обеим.
терпимый читатель (tolerant reader)
Читай только те поля, что тебе нужны, и молча пропускай незнакомые. Тогда чужие добавления в сообщение тебя не ломают.
сериализация
Превращение объекта в памяти в поток байтов (для сети или диска) и обратно. Формат сериализации определяет, легко ли потом менять схему.
дистанция
«Расстояние» между связанными компонентами: разные процессы, сервисы, команды. Чем оно больше, тем дороже координировать совместное изменение.
волатильность
Как часто компонент, как ожидается, будет меняться. Выгода от чистой границы пропорциональна волатильности: вокруг стабильного её строить незачем.
связанность жизненного цикла
Компоненты вынуждены собираться, тестироваться и деплоиться вместе. Общий деплой связывает даже тех, кто по смыслу не связан.
core-поддомен
То, в чём бизнес выигрывает у конкурентов. Меняется чаще всего — самый волатильный, ему и нужны чистые границы.
supporting-поддомен
Нужен бизнесу, но не даёт преимущества и меняется редко. Вкладываться в его модульность обычно не окупается.
generic-поддомен
Задача, которую все решают одинаково (аутентификация, платёжный шлюз). Стабильна, и её чаще берут готовой, чем пишут.
наведённая волатильность
Стабильный сам по себе компонент, сильно связанный с волатильным, вынужден меняться вместе с ним — и становится волатильным заодно.
сбалансированная связанность
Цель — не убрать связи, а свести три оси (сила, дистанция, волатильность) так, чтобы система оставалась модульной: BALANCE = (STRENGTH XOR DISTANCE) OR NOT VOLATILITY.
глобальная сложность
Сильная связь, растянутая на большую дистанцию: изменение тащит за собой согласование через сервисы и команды. Худший угол — распределённый монолит.
локальная сложность
Слабая связь на малой дистанции: путаница есть, но она заперта в одном месте и наружу не расползается. Терпимо, иногда просто расточительно.
репликация
Хранить копии одних и тех же данных на нескольких узлах — чтобы пережить падение одного и разгрузить чтение.
лидер и реплики (leader/follower)
Один узел (лидер) принимает записи и раздаёт их копиям (follower). Реплики отвечают на чтение и готовы подхватить, если лидер упадёт.
failover
Автоматическое переключение на реплику, когда лидер упал. Спасает от простоя — но должно происходить быстро и без двух лидеров разом.
синхронная репликация
Лидер подтверждает запись только когда её приняла реплика. Ничего не теряется при падении — но лидер ждёт, и подвисшая реплика тормозит все записи.
асинхронная репликация
Лидер отвечает сразу, а репликам шлёт изменения следом. Быстро — но при падении лидера свежие, ещё не доехавшие записи можно потерять.
отставание реплик (replication lag)
Реплика получает изменения с задержкой, поэтому отдаёт слегка устаревшие данные. Отсюда «не вижу свою только что созданную запись».
чтение своих записей
Гарантия, что пользователь сразу видит то, что только что записал. Требует читать свои свежие данные с лидера, а не с отстающей реплики.
шардирование (партиционирование)
Разбить большой набор данных на части (шарды) по разным узлам — ради объёма и пропускной способности записи, которых не тянет одна машина.
ключ шардирования
Поле, по которому данные раскладываются на шарды. Самое дорогое решение: поменять его потом почти невозможно, а плохой выбор рождает горячий шард.
горячий шард (hot spot)
Один шард, на который легла непропорциональная доля нагрузки (например «по региону» → Москва). Больше железа ему не поможет — виноват ключ.
согласованное хеширование
Способ раскладывать ключи по узлам так, что при добавлении узла переезжает лишь малая часть данных, а не всё разом.
ребалансировка шардов
Перераспределение данных при добавлении/удалении узлов. Цель — переместить как можно меньше и не остановить систему.
транзакция
Группа операций, которые выполняются как одно целое: либо все вместе, либо никак. Основа денежных инвариантов.
ACID
Атомарность, согласованность, изоляция, долговечность — набор гарантий транзакции. Разные СУБД трактуют их по-своему, особенно изоляцию.
уровень изоляции
Договор о том, какие гонки между одновременными транзакциями СУБД берёт на себя, а какие оставляет тебе. От read committed до serializable.
сериализуемость
Сильнейшая изоляция: транзакции ведут себя так, будто выполнялись строго по одной. Дорого — поэтому включают точечно, где нужны деньги.
snapshot isolation
Каждая транзакция видит согласованный «снимок» данных на момент старта. Защищает от многого, но не от write skew.
write skew
Две транзакции читают одно и то же, каждая решает «всё ок» и пишет — а вместе нарушают инвариант. Так рождается отрицательный остаток.
потерянное обновление
Две транзакции читают значение, обе меняют и записывают — одно изменение затирает другое. Классика двойного списания.
двухфазная блокировка (2PL)
Способ добиться сериализуемости через блокировки: держишь их до конца транзакции. Надёжно, но снижает параллелизм.
двухфазный коммит (2PC)
Протокол, чтобы несколько узлов либо все закоммитили, либо все откатили. Дорог и хрупок (координатор — точка отказа) — обычно избегают.
ненадёжная сеть
Сеть теряет, задерживает и дублирует сообщения. Поэтому нельзя достоверно отличить медленный узел от упавшего — только гадать по таймауту.
обнаружение сбоя по таймауту
«Не ответил за N секунд — считаем упавшим». Это догадка, а не факт: узел может быть жив, просто завис или сеть тормозит.
рассинхрон часов (clock skew)
Часы разных узлов расходятся и скачут при синхронизации. Поэтому упорядочивать события по времени с их часов — ненадёжно.
монотонные часы
Часы, которые только идут вперёд и годятся для измерения интервалов. В отличие от «настенных», они не скачут назад при синхронизации.
пауза процесса (GC)
Сборка мусора или приостановка виртуалки могут заморозить процесс на секунды. Со стороны он «мёртв», а потом оживает зомби, не зная, сколько прошло.
split-brain
Два узла одновременно считают себя лидером и оба действуют. Итог — конфликты и двойная работа. Главный страх распределённых систем.
fencing token
Монотонный номер, выдаваемый вместе с правом на действие. Ресурс отвергает запросы со старым номером — так зомби-лидер не навредит.
византийский отказ
Узел ведёт себя произвольно или злонамеренно, а не просто падает. Защита дорога и нужна в основном там, где узлам нельзя доверять.
консенсус
Несколько узлов договариваются об одном значении (например, кто лидер) и держатся его, переживая отказ меньшинства.
линеаризуемость
Система ведёт себя так, будто существует одна копия данных с атомарными операциями. Сильнейшая согласованность — и самая дорогая по задержке.
кворум
Минимум узлов (обычно большинство), которые должны согласиться, чтобы решение считалось принятым. Гарантирует, что двух лидеров не выберут.
теорема CAP
При разрыве сети система выбирает одно из двух: согласованность (все видят одно) или доступность (отвечают все половины) — но не оба сразу.
выбор лидера
Как узлы гарантированно назначают ровно одного лидера. Надёжно делается через консенсус, а не самоназначением.
тотально упорядоченная доставка
Все узлы получают сообщения в одном и том же порядке. Эквивалентно консенсусу — на этом строят реплицированные журналы.
сервис координации
Готовая система (ZooKeeper, etcd, Consul) с консенсусом внутри. Берут её вместо того, чтобы писать свой алгоритм — он обманчиво сложен.
болтливые сервисы
Два сервиса, которым нужно множество сетевых перекличек на одну операцию. Признак сильной связи, растянутой на большую дистанцию.
частота интеграции
Как часто компоненты дёргают друг друга. Высокая частота через сеть — дорогая и хрупкая; сигнал, что дистанцию пора сокращать.
ребалансировка связанности
Подстройка трёх осей (сила, дистанция, волатильность), когда изменение сбило баланс. Иногда лечится слиянием — декомпозиция не в одну сторону.
пакетная обработка (batch)
Офлайн-обработка: читаем неизменяемый вход и заново генерим выход при каждом запуске. Медленно, зато устойчиво к ошибкам и безопасно перезапускается.
неизменяемые входы
Входные данные конвейера не меняются во время обработки. Поэтому упавший прогон можно просто перезапустить с нуля — результат воспроизводим.
перезапуск обработки
Прогнать конвейер заново на тех же входах — чтобы исправить баг в коде или пересобрать производные данные. Дешевле и надёжнее ручной штопки.
MapReduce
Классическая модель распределённой пакетной обработки: map раскладывает данные, reduce сводит. Идейный предок Spark и подобных движков.
dataflow-движок
Система вроде Spark или Flink: описываешь граф преобразований данных, а движок распределяет его по узлам. Гибче голого MapReduce.
ETL
Extract-Transform-Load: вытащить данные из источников, преобразовать и загрузить в хранилище для аналитики. Классический батч-сценарий.
потоковая обработка (stream)
Обработка неограниченного потока событий по мере поступления — секунды вместо ночи. Противоположность батчу по времени реакции.
журнал событий (log)
Упорядоченная, только-дозаписываемая лента событий (Kafka-подобная). В отличие от очереди — хранит историю: её можно перечитать и пересобрать из неё что угодно.
брокер сообщений
Посредник, принимающий сообщения от продюсеров и раздающий потребителям. Развязывает их во времени: получатель может быть недоступен — сообщение подождёт.
Change Data Capture (CDC)
Превращение изменений в базе в поток событий. Позволяет строить производные представления (поиск, кэш), не трогая код, который пишет в базу.
материализованное представление
Заранее посчитанный и сохранённый результат запроса, который обновляется из журнала изменений. Быстрое чтение ценой поддержки в актуальном состоянии.
exactly-once
Гарантия, что эффект операции применён ровно один раз. Достигается не «идеальной доставкой», а идемпотентностью получателя: повтор ничего не портит.
at-least-once
Сообщение доставят хотя бы раз, но, возможно, несколько. Честный режим сети — поэтому получатель обязан быть идемпотентным.
«вывернуть базу наизнанку»
Сделать журнал событий источником истины, а базу, индекс, кэш и склад — производными потребителями лога. Мощно, гибко и дорого; нужно не всем.
сквозной (end-to-end) аргумент
Корректность обеспечивают крайние точки (идемпотентность + id запроса), а не гарантии промежуточных звеньев. Проверяй итог там, где за него отвечаешь.
своевременность vs целостность
Своевременность — насколько данные свежи (карта может чуть отставать). Целостность — что они не врут (остаток нельзя посчитать неверно). Разные требования к разным данным.
trust, but verify
Не доверяй гарантиям систем вслепую: регулярно сверяй производные данные с источником истины аудитом. Тихая порча данных — худший вид сбоя.
петля обратной связи
Решение алгоритма меняет мир так, что подтверждает само себя: пометил район «рискованным» → меньше сервиса → больше проблем → «видите, риск». Самосбывающийся прогноз.
алгоритмическая предвзятость
Модель, обученная на прошлом, закрепляет и усиливает уже существующую дискриминацию — и прячет её за видимостью «объективных цифр».
слежка
Побочный продукт тотального трекинга поведения. Копится «на всякий случай», а согласие на сбор чаще всего иллюзорно — его никто не читает и не может оспорить.
минимизация данных
Собирать только то, что действительно нужно, и не дольше, чем нужно. Данные, которых нет, невозможно потерять, украсть или использовать во зло.
большая языковая модель (LLM)
Модель, которая продолжает текст наиболее правдоподобным образом. Генерирует правдоподобное, а не гарантированно истинное — уверенный тон входит в комплект.
агент
Программа с целью, которая в цикле рассуждает, действует инструментами и смотрит на результат — пока цель не достигнута. Модель внутри — мотор рассуждений, не автор ответов.
агентный цикл
Посмотри на ситуацию → реши, что делать → сделай → посмотри, что вышло → повтори. Останавливается, когда цель достигнута — или когда его остановили предохранители.
генеративный ИИ
Реактивный «консультант»: один запрос — один ответ, без цели, памяти и действий. Агент — это тот же консультант, которому дали цель, руки и цикл.
промпт
Инструкция модели на естественном языке. Неявное знание в чистом виде: никакая граница не проверяет, поняли ли её, — изменил формулировку, и поведение поплыло.
галлюцинация
Уверенный правдоподобный ответ, не опирающийся на факты. Не сбой, а штатный режим генеративной модели; лечится источниками данных и правом сказать «не знаю», а не «моделью побольше».
недетерминизм
Один и тот же вход может дать разные выходы. Валюта агентных систем: ею платят за гибкость на задачах без готовых правил. Платить за детерминированные задачи — расточительство.
автономия
Сколько шагов агент делает без человека. Свойство дизайна, а не модели: границу автономии проводит архитектор — и отвечает за неё.
инструменты агента (tool use)
Способ дать агенту руки: модель выбирает, что вызвать, детерминированный код валидирует и исполняет. Модель никогда не трогает систему сама.
function calling
Механика tool use: модель возвращает намерение — имя функции и параметры по схеме, — а исполняет его оркестратор. Модель заполняет форму, а не совершает действие.
схема инструмента
Имя, параметры с типами, описание — всё, что модель знает об инструменте. Это контракт, сплошная линия на карте: узкий инструмент переживает миграции базы, «выполни SQL» — нет.
минимальные привилегии
У агента ровно те права и инструменты, без которых задача не решается. Поверхность возможного вреда определяется списком инструментов, а не «умом» модели.
human-in-the-loop
Опасное действие исполняется только после подтверждения человеком: агент готовит заявку, человек жмёт кнопку. Граница — по цене ошибки и обратимости.
ReAct
Чередование «рассуждение → действие → наблюдение» в одном цикле: модель думает, зовёт инструмент, смотрит на результат — и думает дальше уже со свежими фактами.
встроенные инструменты
Готовые «чужие руки» платформ: исполнение кода, веб-поиск, чтение файлов. Мощность в обмен на поверхность риска — добавлять по потребности задачи, не по прайс-листу.
окно контекста
Всё, что модель «знает» в момент ответа: промпт, история, результаты инструментов. Конечное и платное: за токены платишь на каждом вызове — кэширование префикса лишь удешевляет повторную часть.
токен
Единица текста и единица тарификации модели. Контекст — деньги: чем больше токенов в окне, тем дороже каждый шаг агентного цикла.
сессия
Состояние диалога между вызовами. Живёт не в модели, а в нашем хранилище — со сроком жизни, владельцем и правилами доступа, как любые данные компании.
короткая память
То, что лежит в окне контекста прямо сейчас: текущий диалог, свежие результаты инструментов. Быстро и точно, но дорого — платишь на каждом вызове.
длинная память
Факты вне окна контекста — в обычном внешнем хранилище. В окно попадают выборкой по релевантности, а не целиком: спросили про возврат — подгрузили правила возвратов.
суммаризация контекста
Сжатие старой части диалога в короткую сводку, чтобы влезать в окно и бюджет. Свежее — дословно, старое — конспектом, устойчивые факты — во внешнее хранилище.
структурированный вывод
Ответ модели строго по JSON-схеме: контракт на форму выхода. Гарантирует, что ответ разберётся кодом; истинность содержания не гарантирует — её проверяют другие слои.
эмбеддинг
Перевод текста в вектор-смысл: у близких по смыслу текстов — близкие векторы. «Сыр помягче для ребёнка» и «нежная моцарелла» рядом, хотя не делят ни одного слова.
векторное хранилище
Индекс эмбеддингов, заточенный под поиск ближайших соседей среди миллионов векторов. Ещё одно производное представление: источник истины остаётся в каталоге.
RAG
Retrieval-augmented generation: найти знание поиском и подложить в контекст — вместо дообучения. Волатильные факты приходят к модели данными, а не весами.
наивный RAG
Цепочка «вопрос → поиск → ответ»: один заход, без оценки собственной выдачи. Дёшев и достаточен для вопросов, ответ на которые лежит в одном месте.
агентный RAG
Поиск как инструмент внутри агентного цикла: модель планирует, оценивает выдачу, переформулирует и ищет ещё. Кратно дороже цепочки — плати им только за составные вопросы.
дообучение (fine-tuning)
Правка весов модели под свою задачу. Отлично держит тон, стиль и жаргон; для волатильных фактов — бетон: цикл обновления днями и никакого «удалить устаревшее».
свежесть индекса
Насколько производное представление отстаёт от источника истины. Свойство конвейера с явным SLO, а не модели: производные отстают по построению — вопрос лишь на сколько.
мультиагентная система
Несколько специализированных агентов вместо одного универсала. Границы — по доменам знания: у каждого своё узкое меню инструментов и короткий промпт.
агентный workflow
Состояние («блокнот» задачи) + узлы («работники») + рёбра («маршруты»). Новое только одно: узлом может быть не только код, но и агент.
паттерны оркестрации
Конвейер, параллель, маршрутизатор, групповой чат — четыре способа собрать бригаду. Выбор между ними — выбор, где жить недетерминизму.
маршрутизация (handoff)
Лёгкий агент-диспетчер определяет домен вопроса и передаёт его специалисту целиком. Определить домен — дёшево, ответить — дорого; handoff разводит эти цены.
групповой чат агентов
Агенты обсуждают задачу, ведущий модерирует. Самый мощный и непредсказуемый по цене паттерн: для исследований и дебатов, не для потока с SLA.
workflow-as-agent
Бригада, инкапсулированная за одним входом: снаружи — узкий контракт, внутри — узлы из кода и агентов. Глубокий модуль, как учил шестой модуль.
god-агент
Агент с десятками инструментов из всех доменов: путается в выборе, возит всё меню в каждый вызов и стоит как маленькая бригада. God-класс, который ещё и галлюцинирует.
MCP (Model Context Protocol)
Стандарт вертикали «агент ↔ инструменты и данные»: сервер публикует инструменты со схемами, любой агент любого фреймворка подключается без кастомного клея. «OpenAPI для агентов».
MCP-сервер
Сторона, публикующая инструменты по MCP. Для чужих агентов — граница знания: наружу выходит спроектированный минимум, а не зеркало внутренних API.
A2A (Agent-to-Agent)
Протокол горизонтали «агент ↔ агент»: карточки агентов, задачи с жизненным циклом, асинхронные сценарии. Для переговоров автономных агентов из разных экосистем.
карточка агента (agent card)
Машиночитаемая визитка агента в A2A: кто я, что умею, как со мной говорить. Discovery для горизонтальных связей.
AG-UI
Протокол «агент ↔ человек»: стриминг состояния агента в интерфейс — шаги, промежуточные результаты, кнопки подтверждения, а не только финальный текст.
discovery
Ритуал знакомства клиента с MCP-сервером: спросил список инструментов, получил схемы, начал звать. Машиночитаемое меню вместо документации для людей.
недоверенный клиент
Чужой агент за границей системы: аутентификация на каждом вызове, минимальные права, лимиты, параноидальная валидация, полный аудит. Чужая модель может прислать что угодно.
трейс агента
Запись каждого такта цикла: что модель подумала, какой инструмент выбрала, что получила. Без трейса разбор инцидента — гадание, с ним — три минуты чтения.
evals
Регрессионные тесты недетерминированного кода: золотой набор диалогов с критериями, прогон на каждое изменение промпта или модели. Пороги вероятностные, дисциплина — как в CI.
золотой набор
Эталонные диалоги — типовые, сложные, коварные, — на которых проверяется каждое изменение. Каждый инцидент добавляет в набор новый тест: инъекция с промокодом теперь живёт там.
бюджет токенов
Жёсткий потолок расходов на сессию или агента, живущий в оркестраторе. Предохранитель от циклов: два вежливых бота способны сжечь дневной бюджет за пятьдесят минут.
предохранители (guardrails)
Границы в коде вокруг агента: бюджет, лимит шагов, таймаут, circuit breaker, фильтры входа и выхода. Не спрашивают модель, согласна ли она остановиться.
prompt injection
Враждебные инструкции внутри данных — отзыва, письма, веб-страницы. Для модели инструкции и данные — один поток токенов, поэтому чужой текст может командовать агентом.
«инструкции ≠ данные»
Недоверенный контент маркируется и оборачивается, чтобы модель читала его как данные. Помогает вероятностно; детерминированно защищают только права и HITL.
версионирование промптов
Промпт — артефакт с версией, ревью и прогоном evals перед выкаткой, как схема в реестре. «Поправил формулировку на проде» — так теряют качество молча.
уровни автономии
Сам / с подтверждением человека / никогда. Решение архитектора, живущее в коде оркестратора, — а не свойство модели и не пожелание промпта.
матрица «цена ошибки × обратимость»
Чем дороже и необратимее действие, тем ниже автономия агента. Слова — тоже действия: обещание необратимо с момента, когда его прочитали.
прозрачность ИИ
Человек всегда знает, что говорит с машиной. Информирует, но не снимает ответственности: плашка «ответ сгенерирован» — честность, а не щит от собственных слов.
оспоримость
С любого места диалога можно дойти до живого человека и оспорить решение. Правило, которого нет на бумаге, оспорить нельзя — поэтому скрытая персонализация не проходит.
ответственность за агента
Слово, сказанное системой компании в канале компании, — слово компании. «Модель так решила» — размывание ответственности с приятным голосом.
аудит решений агента
Трейс шагов и журнал событий отвечают на «кто сказал и почему» с точностью до токена. Но аудит находит автора записи — автор решения о границах всегда человек.
колоночное хранение
На диске рядом лежат значения одной колонки, а не поля одной строки. Скан «три колонки за три года» читает три плотных ленты — и они отлично сжимаются, потому что соседи похожи.
временной ряд
Последовательность значений одной величины во времени: цена сыра по дням, курс по часам. Ключевое свойство — соседние точки похожи, и на этом строится всё хранение.
компрессия временных рядов
Дельта дельт для таймстампов плюс XOR для значений: похожие соседи схлопываются в почти нули. У Facebook в Gorilla точка ужалась с 16 байт до 1.37 — в двенадцать раз.
прореживание (downsampling)
Хранить для старых периодов не каждую точку, а агрегаты: минимум, максимум, среднее по дню или неделе. График на тысячу пикселей не заметит разницы, а диск и запросы — заметят.
retention (политика хранения)
Не «когда удалять», а какое представление положено каждому возрасту данных: память → колонки → агрегаты → сырьё в дешёвом архиве. Пока сырьё вечно, остальное пересобираемо.
дрейф схемы (schema drift)
Эволюция схем глазами бесправного потребителя: поставщик меняет колонки, единицы и форматы когда хочет и никого не предупреждает. Договориться нельзя — можно только защититься на своей стороне.
слой сырья (raw layer)
Файлы от источников хранятся как пришли — неизменяемо, с версиями и датами. Разбор отделён от скачивания: парсер можно чинить и переигрывать по всему архиву.
карантин данных
Подозрительные данные не публикуются и не теряются — задерживаются с пометкой «проверяется», пока не разберётся человек. Между молчаливой ложью в витрине и остановкой всего конвейера есть третий путь.
разные частоты (mixed frequency)
Валюта — ежедневно, инфляция — ежемесячно, ВВП — ежеквартально. Каждый ряд хранится в родной частоте; выравнивание — явная операция витрин и моделей, а не тихая интерполяция на входе.
ревизия
Официальное число пересмотрели задним числом: быстрая оценка → уточнённая → годовая, а иногда и через шесть лет. Не ошибка, а расписание: плата статистики за скорость публикации.
винтаж данных
Состояние знания на дату: ряд таким, каким его видел мир, скажем, 16 марта — со всеми тогдашними значениями и без всего, что стало известно позже.
битемпоральность
Две оси времени у каждой точки: о каком периоде факт и когда о нём узнали. «Текущее» — представление поверх истории публикаций, а не единственная ячейка.
point-in-time корректность
Любой вопрос к данным можно задать «по состоянию на дату» — и получить только то, что было известно тогда. Основа воспроизводимых отчётов и честных бэктестов.
альтернативные данные
Данные, собранные не статистическим ведомством, но говорящие об экономике: онлайн-цены, транзакции платформ, логистика. Свежее официальных рядов — и с честными каветами о покрытии.
nowcasting
Оценка того, что происходит прямо сейчас, до выхода официальной статистики: онлайн-цены сегодня подсказывают инфляцию, которую опубликуют через месяц. Опережающий сигнал, а не замена.
методология индекса
Столетняя наука о том, как честно сложить миллионы цен в одно число: сопоставимые товары, веса по количествам, формулы Ласпейреса—Пааше—Фишера. Переиспользуй, не изобретай.
порог анонимности
В любой публикуемой ячейке — минимум N участников, иначе агрегат не публикуется. Превращает принцип «никого нельзя восстановить» в проверяемое правило конвейера.
бейзлайн
Дешёвый простой метод — «как в прошлом сезоне» — который любая модель обязана измеримо обойти на данном ряду. В M5 его не обошли 92.5% участников; отнеситесь к нему серьёзно.
глобальная модель
Одна модель, обученная сразу на всех рядах: паттерны переиспользуются между рядами (cross-learning), а эксплуатационная сложность не растёт с каталогом — O(1) вместо O(N).
согласование прогнозов (reconciliation)
Сумма прогнозов регионов обязана сходиться с прогнозом страны. Для фактов это тождество, для независимых прогнозов — отдельный шаг фабрики.
foundation-модель временных рядов
Предобучена на миллиардах чужих точек, прогнозирует незнакомый ряд без обучения. Сильна на холодном старте; на коротких низкочастотных рядах — ядре макроэкономики — уступает простой статистике.
контаминация бенчмарка
Претрейн модели видел тестовые ряды публичного лидерборда — «zero-shot» на знакомом тесте показывает фантомное преимущество в десятки процентов. Верить можно только собственному экзамену.
look-ahead bias
В обучение или бэктест протекло будущее: перемешанные разбиения, ревизованные значения, признаки-послезнайки. Коварство в том, что утечка улучшает метрики — подглядывающий код побеждает в бэктестах.
катящееся начало (rolling origin)
Серия честных запусков «из прошлого»: обучение на известном до точки t, прогноз вперёд, сдвиг, повтор. Оценка из десятков репетиций реальной жизни, а не одного удачного разреза.
feature store
Признак определяется один раз и материализуется в два представления: offline-история для обучения и online-значения для инференса. Лечит расхождение «ноутбук против прода» в корне.
training/serving skew
Модель училась на одной версии признака, а в проде получает другую: два кода, два окна, две таймзоны. Нарушение DRY, за которое штрафует не ревьюер, а качество прогнозов.
дрейф данных
Распределение входов сместилось относительно обучающего: новый регион, другая структура категорий. Модель спрашивают о мире, которого она не видела; повод присмотреться, не приговор.
дрейф смысла (concept drift)
Входы те же, но связь между ними и ответом изменилась: после шока ставки спрос реагирует на цены иначе. Лечится переобучением на данных нового мира.
семантический слой
Каталог метрик с зафиксированными формулами, джойнами и срезами. LLM выбирает из меню, а не сочиняет SQL по внутренностям — пространство ошибок сжимается с «любой запрос» до «не та метрика».
text-to-SQL
Модель пишет SQL по вопросу на человеческом языке. На учебных схемах — ~90% точности, на живых корпоративных — 10–20%: сочинение по чужой внутренней модели остаётся лотереей.
grounding
Каждое число в ответе приходит из движка данных с паспортом: ряд, срез, винтаж. Не «попросили модель не выдумывать», а архитектура, в которой выдумке некуда встать.
микрофронтенды
Независимо поставляемые фронтенд-приложения, скомпонованные в одно целое. Покупают командам автономный деплой; качество кода и скорость страницы не покупают.
релизный поезд
Все команды деплоятся одним расписанием: красный тест одной задерживает вагоны всех. Цена связанного деплоя, измеряемая в днях ожидания фичи.
закон Конвея
Структура системы копирует структуру коммуникаций организации. Микрофронтенды — способ применить его сознательно: выровнять артефакты по командам, а не бороться с ним.
вертикальная нарезка
Зона = раздел = команда: пользовательский сценарий не пересекает границу деплоя. Дефолт для микрофронтендов; горизонталь (несколько МФ на странице) — осознанное исключение.
оболочка (app shell)
Тонкое приложение-каркас: разбирает адрес, грузит зону нужной версии по манифесту, держит сессию. Чем тоньше — тем реже меняется, а её изменения видят все зоны сразу.
манифест версий
Карта деплоев зон: какая зона какой версии где лежит. Деплой — обновить строчку, откат — вернуть. Реестр схем и request routing, встретившиеся в браузере.
связь через общие данные (common coupling)
Несколько компонентов читают и пишут одну общую структуру — таблицу, стор, глобальный объект. Общие гонки, общий излом, ничья ответственность: самая липкая форма связанности после интрузивной.
состояние в адресе
Всё, что описывает «где пользователь и на что смотрит», живёт в URL по опубликованной схеме параметров. Слабейшая связь зон — плюс перезагрузка, история и «поделиться» бесплатно.
контрактный тест
Издатель фиксирует схему события, слушатель — свои ожидания; несовместимое изменение роняет сборку, а не прод. Знание границы проверяется на границе.
version skew
В проде одновременно живут сочетания версий, которых не было ни на одном стенде: вкладка со вчерашней оболочкой + сегодняшняя зона. Лечится совместимостью на шаг назад, а не перезагрузкой чужих вкладок.
бюджет производительности
SLO фронтенда: вес бандла, время до рабочего экрана, отклик — в перцентилях, по зоне и по сквозному пути. Держится механикой CI, а не благими намерениями.
общие зависимости (shared)
Шарится короткий список: фреймворк и ядро дизайн-системы как singleton с дисциплиной версий. Остальное зоны бандлят сами — свобода обновляться дороже мегабайта дублирования.
платформенная команда
Команда, чей продукт — рельсы для остальных: оболочка, дизайн-система, пайплайны, бюджеты. Метрика успеха — добровольное использование: обязательное обязано быть удобным.
маятник автономия ↔ консистентность
Качнули к автономии — команды летят, целое расползается; к консистентности — целое собирается, скорость душится. Зрелость — не вечная точка равновесия, а дешёвое качание.