[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fportfolio\u002Frealtime-bot-detection-platform":167,"glossary":449},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Каждое наше приложение выходит и на Android — платформенные API, фоновое выполнение, разрешения и требования магазина вместе с ними.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","Фронтенд-фреймворк, в котором мы работаем, когда продукт уже на Angular, — строгая структура, подходящая большим долгоживущим приложениям.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","Язык, на котором написано каждое наше Flutter-приложение, — строгая null safety, полноценный pattern matching и компиляция в нативный код и веб.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","Python-фреймворк, который мы берём, когда продукту нужны админка, аутентификация и модель данных в первый же день, а не самописный сервис.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Каждый наш сервис поставляется в виде контейнера, поэтому на ноутбуке, в CI и в продакшене работает один и тот же артефакт, а не три разных.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","Автоматизация релизов в нашей мобильной разработке — подпись, сборки и загрузка в сторы идут из CI, а не с ноутбука одного инженера в день релиза.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Наш основной мобильный стек с 2018 года — одна кодовая база на Dart для iOS, Android, веба и десктопа без отдельной команды под каждую платформу.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Все проекты, к которым мы прикасаемся, живут в Git — ревью пул-реквестов, CI на каждой ветке и история, понятная и спустя месяцы.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Наш бэкенд-язык для real-time API и сервисов под нагрузкой — маленькие бинарники, быстрая сборка и конкурентность, которая остаётся читаемой.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","Облако, в котором работают наши продакшен-нагрузки, — управляемый Kubernetes, хранилище и сеть без серверов, которые надо обслуживать руками.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","Система сборки, через которую проходит каждый Android-релиз, — флейворы, конфигурации подписи и вся обвязка зависимостей под Flutter-приложением.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Так мы упаковываем деплой в Kubernetes — сервис, конфигурация, секреты и ingress как одна версионируемая единица, которую можно выкатить и откатить.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","То, что мы берём, когда Flutter-приложению нужен настоящий Android под ним, — platform channels, фоновые задачи и интеграции с нативными SDK.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Общая бизнес-логика для iOS и Android, а нативный интерфейс у каждой платформы свой, — альтернатива, когда Flutter не подходит.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Так мы запускаем сервисы в продакшене — деплой в Helm-чартах, откатываемые выкатки и масштабирование, для которого не нужен человек в три ночи.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Лёгкий обмен сообщениями между сервисами — publish\u002Fsubscribe и request\u002Freply без эксплуатационного веса полноценного кластера брокера.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue с серверным рендерингом, роутингом и SEO из коробки — так мы делаем сайты и веб-приложения, которые должны быстро грузиться и индексироваться.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Там, где PHP-бэкенд уже есть: дорабатываем его, интегрируемся с ним и делаем мобильные и веб-клиенты, которые он обслуживает.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Наша база данных по умолчанию — от проектирования схемы до настройки индексов мы берём её, если у продукта нет конкретной причины взять другую.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Наш язык для бэкендов, работы с данными и AI-интеграций — включая Python-биндинги, которые мы выпускаем к собственным инструментам на Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","Фронтенд-библиотека, в которой мы работаем, когда продукт уже на React, — компоненты, хуки и выросшая вокруг них экосистема.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Место для данных, которые должны быть быстрыми и которые не жалко пересчитать, — кэши, сессии, лимиты и очереди фоновых задач.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","Язык, на котором написана автоматизация наших мобильных релизов, — лейны Fastlane, кастомные действия и связка с CI, доставляющая сборки в сторы.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Куда мы идём, когда важны и скорость, и корректность, — рендеринг документов, CLI-инструменты и сервисы, которые обязаны оставаться быстрыми и предсказуемыми.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","База данных, которая поставляется внутри приложения, — локальные кэши, offline-first хранилище и всё, что должно работать без сети.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Headless CMS, к которой мы обращаемся, когда контент должны вести сами редакторы, — готовая админка и чистый API вместо самописных.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","То, что мы берём, когда Flutter-приложению нужен настоящий iOS под ним, — platform channels, интеграции нативных SDK, виджеты и App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","UI-фреймворк Apple, на котором мы делаем нативные поверхности, недоступные Flutter-приложению, — виджеты, App Clips и расширения.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Так мы стилизуем весь фронтенд — утилитарные классы и дизайн-токены вместо таблицы стилей, которая только растёт и никогда не чистится.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Стандарт для всего, что мы пишем для браузера и для Node-сервисов, — типы ловят ошибки интеграции раньше, чем код доходит до ревью.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Наш фронтенд-фреймворк для админок, дашбордов мерчантов и веб-приложений, которые должны оставаться поддерживаемыми годами, а не спринтами.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","Открытая модель распознавания речи от OpenAI — движок транскрипции для голосового ввода, который работает и как бэкенд-сервис, и прямо на устройстве в приложении.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"categories":426,"client":429,"date":430,"description":431,"duration":432,"extension":433,"image":434,"links":437,"meta":438,"metaDescription":439,"navigation":440,"ogDescription":441,"path":442,"seo":443,"slug":444,"stem":445,"technologies":446,"updated":447,"__hash__":448},"projects_ru\u002Fportfolio\u002Frealtime-bot-detection-platform.md","Платформа детекции ботов в реальном времени",{"type":171,"value":172,"toc":415},"minimark",[173,178,182,190,193,199,203,206,213,223,229,232,236,239,246,268,271,275,285,288,291,295,304,307,316,325,335,346,355,365,370,374,383,386,390,393,396],[174,175,177],"h2",{"id":176},"обзор-проекта","Обзор проекта",[179,180,181],"p",{},"Значительную долю трафика, приходящего на коммерческий сайт, генерируют не люди. Часть этого трафика безобидна: поисковые краулеры, мониторинг доступности, генераторы превью. Остальное — нет: подстановка учётных данных, скрейперы, боты, выкупающие товар, и автоматические клики, которые тихо расходуют рекламные бюджеты и отравляют каждую цифру в аналитике, на основании которой бизнес принимает решения. Проблема в том, что всё это приходит через ту же входную дверь, что и настоящие клиенты, а к моменту, когда оно попадает в недельный отчёт, деньги уже потрачены.",[179,183,184,185,189],{},"Наш клиент решил закрыть этот разрыв платформой, отвечающей на один вопрос — ",[186,187,188],"em",{},"человек это или машина?"," — пока визит ещё продолжается. Не ночной batch-процесс и не отчёт: вердикт, возвращаемый в тот же момент, когда загружается страница, чтобы системы самого клиента могли отреагировать немедленно.",[179,191,192],{},"Мы восемь месяцев строили этот продукт целиком — от браузерного сборщика сигналов через сервисы скоринга до дата-платформы под ними. Работа шла в течение 2022 года и завершилась в 2023-м.",[194,195,196],"nda-notice",{},[179,197,198],{},"Проект закрыт соглашением о неразглашении. Клиент, название продукта и пользовательский интерфейс опущены, а архитектура ниже описана на уровне формы, а не деталей реализации.",[174,200,202],{"id":201},"задача","Задача",[179,204,205],{},"Инженерную работу определяли три ограничения, и каждое тянуло в свою сторону.",[179,207,208,212],{},[209,210,211],"strong",{},"Всё должно было работать в реальном времени."," Вердикт, приходящий после того, как посетитель уже сконвертировался — или уже выжег бюджет, — это журнал аудита, а не защита. Скоринг должен был укладываться внутрь запроса, в бюджет задержки, достаточно малый, чтобы клиент добровольно поставил его в критический путь загрузки собственной страницы.",[179,214,215,218,219,222],{},[209,216,217],{},"Всё должно было выдерживать высокую нагрузку."," Платформа работала под настоящим high-load: ",[209,220,221],{},"десятки тысяч запросов в минуту"," по всей клиентской базе, с трафиком, который взлетал без предупреждения — запуск кампании на стороне клиента и атака с другой стороны для планировщика мощностей выглядят одинаково. Пик никогда не был средним, и систему нужно было рассчитывать на пик — но так, чтобы на средней нагрузке она оставалась приемлемой по стоимости.",[179,224,225,228],{},[209,226,227],{},"Всё должно было оставаться доказуемым."," Каждый вердикт должен был объясняться и допускать повторный разбор постфактум. Клиенты не действуют на основании необъяснённой оценки, а ни логика детекции, ни модели за ней не улучшаются, если под рукой нет сырых сигналов, породивших вчерашние решения. Это означало хранить всё — задача долговременного хранения и аналитики, стоящая прямо за задачей задержек.",[179,230,231],{},"Реальное время, большой объём и полное хранение — три требования, которым не удовлетворяет ни одна отдельная база данных. Бо́льшая часть архитектуры ниже следует из отказа поступиться хотя бы одним из них.",[174,233,235],{"id":234},"сбор-сигналов-на-чистом-javascript","Сбор сигналов на чистом JavaScript",[179,237,238],{},"Клиентская часть платформы — сборщик, который работает внутри страницы клиента и собирает доказательства, на основе которых выносится вердикт: характеристики браузера и окружения, поведение рендеринга и таймингов, паттерны взаимодействия и множество мелких несоответствий, отличающих настоящий браузер, которым управляет человек, от автоматизированного, надевшего user agent настоящего браузера.",[179,240,241,242,245],{},"Он написан на ",[209,243,244],{},"чистом JavaScript"," — без фреймворка, без рантайма, добавляемого на этапе сборки, без зависимостей. Это было осознанное ограничение, а не предпочтение:",[247,248,249,256,262],"ul",{},[250,251,252,255],"li",{},[209,253,254],{},"Он работает на чужой странице."," Сборщик встроен в тысячи сайтов, которые мы не контролируем, рядом со всем, что эти сайты ещё загружают. Он не может рассчитывать на модульную систему, набор полифилов или конкретный базовый уровень браузера — и не должен конфликтовать с тем, что уже есть на странице.",[250,257,258,261],{},[209,259,260],{},"Он должен быть маленьким и быстрым."," Всё, что отгружается каждому посетителю каждого клиента, измеряется относительно перформанс-бюджета самого клиента. Рантайм фреймворка оказался бы больше, чем весь сборщик целиком.",[250,263,264,267],{},[209,265,266],{},"Он работает во враждебной среде."," Объекты измерения активно пытаются его обойти. Сбор сигналов должен быть устойчив к странице, которая может быть инструментирована, пропатчена или эмулирована вокруг него, — а это аргумент в пользу кода без прослоек между ним и браузерными API, которые он читает.",[179,269,270],{},"Работа сборщика заканчивается на сборе и отправке сигналов. Все суждения выносятся на сервере, где логика не видна тому, о ком выносится суждение.",[174,272,274],{"id":273},"go-на-горячем-пути","Go на горячем пути",[179,276,277,278,284],{},"Каждый сервис на пути запроса написан на ",[209,279,280],{},[281,282,49],"a",{"href":283},"\u002Ftechnologies\u002Fgo",". Нагрузка близка к идеальной для языка форме: огромное количество мелких независимых, преимущественно I\u002FO-bound запросов, которые нужно обрабатывать конкурентно с предсказуемой задержкой.",[179,286,287],{},"На практике важнее всего оказались два свойства. Горутины сделали конкурентность на уровне запроса достаточно дешёвой, чтобы приём, обогащение и скоринг могли внутренне разветвляться без настройки пула потоков. А рантайм Go дал ту картину хвостовых задержек, на которой строилось продуктовое обещание: в системе реального времени важен не средний ответ, а самые медленные несколько процентов — ровно там, где более тяжёлый рантайм и тратит свой бюджет.",[179,289,290],{},"Сам путь намеренно короткий: принять и провалидировать, определить контекст, прогнать правила детекции и модели по входящим сигналам, вернуть вердикт. Всё, что не обязано произойти до ответа — сохранение, агрегация, обогащение, обратная связь для моделей, — вытеснено с горячего пути в асинхронный конвейер позади него.",[174,292,294],{"id":293},"от-одной-базы-к-дата-платформе","От одной базы к дата-платформе",[179,296,297,298,303],{},"Платформа стартовала на ",[209,299,300],{},[281,301,98],{"href":302},"\u002Ftechnologies\u002Fpostgres",", и на старте это было правильным решением. Одна база хранила события, аккаунты, конфигурацию и агрегаты; один язык запросов отвечал на любой вопрос; весь продукт можно было держать в голове целиком, пока он ещё нащупывал свою форму.",[179,305,306],{},"Столкновения с продакшен-объёмом это не пережило, и причину стоит сформулировать точно: дело было не в том, что «PostgreSQL слишком медленный», а в том, что от одного хранилища требовали быть четырьмя разными вещами одновременно. Высокочастотный append-only приёмник событий, хранилище быстрых выборок на пути запроса, аналитическое хранилище для агрегатов по миллиардам строк и поисковый индекс для разбора отдельных сессий — это четыре нагрузки с четырьмя противоречащими друг другу наборами требований. Тюнинг под любую из них ухудшал остальные.",[179,308,309,310,315],{},"Поэтому мы их разделили и перевели платформу в ",[209,311,312],{},[281,313,54],{"href":314},"\u002Ftechnologies\u002Fgcp",":",[179,317,318,320,321,324],{},[209,319,114],{}," — состояние горячего пути. ",[281,322,114],{"href":323},"\u002Ftechnologies\u002Fredis"," держит всё, к чему решение о скоринге должно обратиться за единицы миллисекунд: свежее состояние по посетителю и сессии, счётчики частоты и интенсивности, вычисленную конфигурацию и проверки репутации. Именно это делает вердикт внутри запроса возможным в принципе, и именно это забирает на себя объём чтений, который иначе лёг бы на основную базу.",[179,326,327,334],{},[209,328,329],{},[330,331,333],"term",{"slug":332},"pub-sub","Pub\u002FSub"," — шов между синхронным и асинхронным. Каждый оценённый запрос публикуется как событие, а ответ возвращается немедленно; всё, что дальше, читает уже оттуда. Это та развязка, которая позволяет пути запроса оставаться коротким, а остальную платформу — масштабировать, передеплоивать или временно притормаживать так, чтобы эндпоинт скоринга этого не заметил. И это же означает, что всплеск трафика попадает в очередь, а не в базу данных.",[179,336,337,340,341,345],{},[209,338,339],{},"Объектное хранилище"," — сырые события, навсегда. Каждый пакет сигналов архивируется в S3-совместимое ",[330,342,344],{"slug":343},"object-storage","объектное хранилище"," в исходном виде. Это самое дешёвое надёжное место для данных, будущее применение которых ещё неизвестно, и именно поэтому логику детекции можно ретроспективно прогонять по реальному историческому трафику, а не по его сводке.",[179,347,348,354],{},[209,349,350],{},[330,351,353],{"slug":352},"bigquery","BigQuery"," — аналитический слой. Агрегации по всей истории событий, отчётность по качеству трафика, когортный анализ и анализ кампаний, а также исследовательская работа, стоящая за новыми эвристиками детекции — всё это выполняется здесь, в хранилище, построенном под сканы такого размера, и полностью вне операционного пути.",[179,356,357,360,361,364],{},[209,358,359],{},"Elasticsearch"," — расследования. Когда клиент оспаривает вердикт или аналитик идёт по следу нового паттерна, вопрос звучит как «покажи мне вот эти сессии с шестью фильтрами» — это интерактивный поиск, а не агрегация. Эту задачу решает ",[330,362,359],{"slug":363},"elasticsearch",", поэтому исследовательские запросы никогда не касаются систем, обслуживающих трафик.",[179,366,367,369],{},[209,368,98],{}," остался, но с гораздо более узкой зоной ответственности: аккаунты, конфигурация клиентов и те реляционные данные, которым действительно нужны транзакции и ограничения целостности. Именно снятие нагрузок, для которых он никогда не был предназначен, снова сделало его подходящим инструментом.",[174,371,373],{"id":372},"kubernetes-в-google-cloud","Kubernetes в Google Cloud",[179,375,376,377,382],{},"Платформа работает как контейнеризованные сервисы в кластере ",[209,378,379],{},[281,380,78],{"href":381},"\u002Ftechnologies\u002Fkubernetes"," в Google Cloud. С таким профилем трафика альтернатива всерьёз и не рассматривалась: нагрузка, меняющаяся на порядок за минуты, требует инфраструктуры, которая добавляет мощность сама, и сервисов, каждый из которых дёшево реплицировать.",[179,384,385],{},"Здесь окупается разделение на небольшие сервисы на Go. У приёма, скоринга и асинхронных консьюмеров совсем разные кривые масштабирования, и, поскольку это отдельные деплойменты, каждый масштабируется по своему сигналу: слой приёма — по частоте запросов, консьюмеры — по глубине очереди. Rolling-деплои позволяли обновлять эндпоинт скоринга в рабочее время без окна обслуживания, что для сервиса, стоящего в пути загрузки страницы клиента, было жёстким требованием, а не удобством.",[174,387,389],{"id":388},"результаты","Результаты",[179,391,392],{},"Клиент завершил проект с продакшен-платформой, которая оценивает живой трафик в реальном времени, выдерживает десятки тысяч запросов в минуту с запасом на всплески в несколько раз выше и сохраняет каждый сырой сигнал, который когда-либо видела, — так что улучшение детекции, сделанное сегодня, проверяется на годах реального трафика, а не на синтетическом бенчмарке.",[179,394,395],{},"Не менее важно, что архитектура разделяет зоны ответственности по тем границам, которые действительно значимы для бизнеса: горячий путь остаётся маленьким, быстрым и скучным, а анализ, расследования и работа с моделями происходят за очередью, где они могут расти сколь угодно, никогда не угрожая времени ответа, которое видит клиент.",[179,397,398,399,401,402,404,405,409,410,414],{},"Именно такие системы мы берём целиком: высоконагруженные сервисы на ",[281,400,49],{"href":283},", событийная дата-платформа и инфраструктура ",[281,403,78],{"href":381},", на которой всё это работает. Сам сборщик — JavaScript без зависимостей, работающий в тысячах страниц, которые мы не контролируем, — это дисциплина, которую описывает наша страница ",[281,406,408],{"href":407},"\u002Fservices\u002Fweb-development\u002Fembeddable-widgets","встраиваемых виджетов и скриптов",". Если у вас похожая нагрузка — ",[281,411,413],{"href":412},"\u002Fcontact","расскажите нам о ней",".",{"title":416,"searchDepth":417,"depth":417,"links":418},"",2,[419,420,421,422,423,424,425],{"id":176,"depth":417,"text":177},{"id":201,"depth":417,"text":202},{"id":234,"depth":417,"text":235},{"id":273,"depth":417,"text":274},{"id":293,"depth":417,"text":294},{"id":372,"depth":417,"text":373},{"id":388,"depth":417,"text":389},[427,428],"backend","web","nda","2023-02-01","Платформа скоринга в реальном времени, которая отличает автоматизированный трафик от живых людей — сборщик сигналов на чистом JavaScript, сервисы скоринга на Go и дата-платформа в Google Cloud на Kubernetes, обрабатывающая десятки тысяч запросов в минуту.","8 месяцев","md",{"alt":435,"url":436},"Платформа детекции ботов в реальном времени: визуальные материалы скрыты по NDA","\u002Fprojects\u002Frealtime-bot-detection-platform\u002Fhero.webp",null,{},"Детекция ботов в реальном времени: сборщик на чистом JavaScript и сервисы на Go в Kubernetes и Google Cloud — десятки тысяч запросов в минуту.",true,"Отличать ботов от людей на десятках тысяч запросов в минуту: сборщик сигналов на чистом JS и скоринговые сервисы на Go в Kubernetes.","\u002Fportfolio\u002Frealtime-bot-detection-platform",{"title":169,"description":431},"realtime-bot-detection-platform","portfolio\u002Frealtime-bot-detection-platform",[51,100,116,80,56],"2026-09-05","I6OOSHHWP893qTDETEN2u_dT7_5xGBWcPSB_Z2uI8YI",[450,465,478,489,503,518,534,546,558,575,588,599,609,622,634,645,654,668,681,688,702,717,730,743,756,766,777,788,801,811,824,836,850,861,875,884,895,908,921,934,947,959,970,982,994,1006,1017,1031,1042,1054,1065,1078,1090],{"slug":451,"term":452,"definition":453,"category":454,"aliases":455,"links":457,"related":461,"readMore":-1,"target":463,"hasArticle":464},"aosp","AOSP","Android Open Source Project — Android без надстройки Google, который может форкнуть кто угодно. На его форках работают кассовые терминалы, киоски и автомобильные системы, а работа на этом уровне открывает части ОС, которых прикладной разработчик не видит.","platform",[456],"Android Open Source Project",[458],{"kind":459,"url":460},"website","https:\u002F\u002Fsource.android.com\u002F",[462],"host-card-emulation","\u002Fglossary#aosp",false,{"slug":466,"term":467,"definition":468,"category":454,"aliases":469,"links":470,"related":474,"readMore":-1,"target":477,"hasArticle":464},"app-clips","App Clips","Функция Apple, позволяющая запустить небольшую часть iOS-приложения — до 15 МБ — не устанавливая его целиком. Вызывается по QR-коду, NFC-метке или ссылке: для случаев, когда первое действие пользователя не должно требовать похода в App Store.",[],[471],{"kind":472,"url":473},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[475,476],"deep-linking","install-referrer","\u002Fglossary#app-clips",{"slug":352,"term":353,"definition":479,"category":454,"aliases":480,"links":481,"related":487,"readMore":-1,"target":488,"hasArticle":464},"Аналитическое хранилище Google Cloud. Вы запускаете SQL по миллиардам строк, и они сканируются за секунды, а данные при этом лежат отдельно от машин, выполняющих запросы. Именно это снимает отчётность и исследование данных с базы, обслуживающей живой трафик.",[],[482,484],{"kind":459,"url":483},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":485,"url":486},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[343,363],"\u002Fglossary#bigquery",{"slug":490,"term":491,"definition":492,"category":493,"aliases":494,"links":498,"related":501,"readMore":-1,"target":502,"hasArticle":464},"ci-cd","CI\u002FCD","Автоматизация, которая собирает, тестирует и выкладывает каждое изменение без ручного запуска команд. В мобильной разработке это то, что превращает релиз в нажатие кнопки вместо полудня ожидания, пока освободится нужный человек.","practice",[495,496,497],"CI","непрерывная интеграция","непрерывная поставка",[499],{"kind":485,"url":500},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":504,"term":505,"definition":506,"category":507,"aliases":508,"links":511,"related":514,"readMore":-1,"target":517,"hasArticle":464},"crud","CRUD","Create, read, update, delete — четыре операции, стоящие почти за каждой формой и админкой. Собирательное название для рутинной половины приложения, которая управляет данными, в отличие от частей с реальной предметной логикой.","architecture",[509,510],"Create, Read, Update, Delete","создание, чтение, обновление, удаление",[512],{"kind":485,"url":513},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[515,516],"rest","graphql","\u002Fglossary#crud",{"slug":519,"term":520,"definition":521,"category":493,"aliases":522,"links":526,"related":531,"readMore":-1,"target":533,"hasArticle":464},"dev-container","Dev Container","Среда разработки, описанная один раз в devcontainer.json — ОС, инструменты и версии рантаймов, которые нужны проекту, — и открываемая одинаково внутри контейнера в редакторе любого участника, вместо инструкции по установке, которую каждый понимает по-своему.",[523,524,525],"devcontainer.json","Dev Containers","VS Code Dev Containers",[527,529],{"kind":459,"url":528},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":472,"url":530},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[532],"container-registry","\u002Fglossary#dev-container",{"slug":363,"term":359,"definition":535,"category":454,"aliases":536,"links":539,"related":544,"readMore":-1,"target":545,"hasArticle":464},"Поисковый и аналитический движок, который индексирует записи, чтобы их можно было интерактивно фильтровать и искать, а не сканировать. К нему обращаются, когда вопрос звучит как «покажи вот эти сессии с шестью фильтрами», а не «просуммируй колонку».",[537,538],"Elastic","ELK",[540,542],{"kind":459,"url":541},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":485,"url":543},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[352],"\u002Fglossary#elasticsearch",{"slug":547,"term":548,"definition":549,"category":507,"aliases":550,"links":553,"related":554,"readMore":-1,"target":557,"hasArticle":464},"fan-out","Fan-out","Чтение источника один раз и доставка каждого обновления всем подписанным на него клиентам. Наивная версия пишет подписчикам в цикле и встаёт, как только один из сокетов начинает тормозить; рабочая — держит отдельный буфер на каждого клиента и отключает тех, кто не успевает.",[551,552],"веерная рассылка","фан-аут",[],[555,332,556],"websocket","server-sent-events","\u002Fglossary#fan-out",{"slug":559,"term":560,"definition":561,"category":493,"aliases":562,"links":565,"related":570,"readMore":-1,"target":574,"hasArticle":464},"gdpr","GDPR","Регламент ЕС о персональных данных людей в ЕС: законное основание для сбора, настоящее согласие на трекинг, право увидеть и удалить свои данные. Он следует за вашими пользователями, а не за вашими серверами: где зарегистрирована компания, значения не имеет.",[563,564],"Общий регламент по защите данных","General Data Protection Regulation",[566,568],{"kind":459,"url":567},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":485,"url":569},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[571,572,573],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":576,"term":577,"definition":578,"category":493,"aliases":579,"links":583,"related":586,"readMore":-1,"target":587,"hasArticle":464},"golden-test","Golden-тест","Тест, который отрисовывает виджет и сравнивает результат попиксельно с эталонным изображением. Во Flutter это самый дешёвый способ узнать, не сломал ли редизайн пустое состояние на 320pt, в тёмной теме, при 200% масштабе текста.",[580,581,582],"golden test","золотой тест","скриншотный тест",[584],{"kind":472,"url":585},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[490],"\u002Fglossary#golden-test",{"slug":516,"term":589,"definition":590,"category":507,"aliases":591,"links":592,"related":597,"readMore":-1,"target":598,"hasArticle":464},"GraphQL","Язык запросов к API, где клиент сам перечисляет нужные поля и получает один ответ ровно такой формы. Он снимает избыточную выдачу, к которой дрейфуют REST-эндпоинты, и добавляет собственный режим отказа: неограниченный запрос, обходящий всю модель данных.",[],[593,595],{"kind":459,"url":594},"https:\u002F\u002Fgraphql.org\u002F",{"kind":485,"url":596},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[515],"\u002Fglossary#graphql",{"slug":573,"term":600,"definition":601,"category":493,"aliases":602,"links":604,"related":607,"readMore":-1,"target":608,"hasArticle":464},"HIPAA","Закон США о защищённой медицинской информации: как её можно хранить, передавать, логировать и раскрывать. Как и PCI-DSS, это архитектурное ограничение, которое выбирают в начале, а не документ, который дописывают перед запуском.",[603],"Health Insurance Portability and Accountability Act",[605],{"kind":485,"url":606},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[571,559,572],"\u002Fglossary#hipaa",{"slug":610,"term":611,"definition":612,"category":507,"aliases":613,"links":616,"related":619,"readMore":-1,"target":621,"hasArticle":464},"headless-cms","Headless CMS","Система управления контентом с админкой и API, но без собственного фронтенда. Редакторы публикуют в одном месте, а сайт или приложение отрисовывает контент само — слой представления принадлежит вам, а не вендору CMS.",[614,615],"безголовая CMS","контентное API",[617],{"kind":485,"url":618},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[620,515],"server-side-rendering","\u002Fglossary#headless-cms",{"slug":462,"term":623,"definition":624,"category":454,"aliases":625,"links":629,"related":632,"readMore":-1,"target":633,"hasArticle":464},"Host Card Emulation","Режим, в котором Android-телефон программно эмулирует бесконтактную карту по NFC, без аппаратного защищённого элемента. Так платит приложение-кошелёк на терминале: телефон говорит с ним по тому же протоколу EMV Contactless, что и пластиковая карта.",[626,627,628],"HCE","EMV Contactless","бесконтактные платежи",[630],{"kind":472,"url":631},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[571,451],"\u002Fglossary#host-card-emulation",{"slug":635,"term":636,"definition":637,"category":454,"aliases":638,"links":639,"related":642,"readMore":-1,"target":644,"hasArticle":464},"impeller","Impeller","Движок рендеринга, на котором Flutter работает сегодня: по умолчанию на iOS с 2023 года и на Android с 2024-го. Он компилирует шейдеры заранее, а не во время первой анимации, что убрало главную видимую проблему Flutter в проде — джанк на компиляции шейдеров.",[],[640],{"kind":472,"url":641},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[643],"skia","\u002Fglossary#impeller",{"slug":476,"term":646,"definition":647,"category":454,"aliases":648,"links":649,"related":652,"readMore":-1,"target":653,"hasArticle":464},"Install Referrer","API Google Play, который передаёт только что установленному Android-приложению параметры кампании из ссылки, приведшей к установке. Android-половина отложенного диплинкинга и надёжный способ понять, откуда пришёл пользователь.",[],[650],{"kind":472,"url":651},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[475,466],"\u002Fglossary#install-referrer",{"slug":655,"term":656,"definition":657,"category":658,"aliases":659,"links":661,"related":666,"readMore":-1,"target":667,"hasArticle":464},"jwt","JWT","Подписанный токен, несущий свои данные внутри: сервер понимает, кому принадлежит запрос, не обращаясь к хранилищу сессий. Стандарт мобильной аутентификации. Подпись доказывает, что токен не меняли, но не скрывает его содержимое.","protocol",[660],"JSON Web Token",[662,664],{"kind":459,"url":663},"https:\u002F\u002Fjwt.io\u002F",{"kind":485,"url":665},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[571],"\u002Fglossary#jwt",{"slug":669,"term":670,"definition":671,"category":493,"aliases":672,"links":676,"related":679,"readMore":-1,"target":680,"hasArticle":464},"kyc","KYC","Know Your Customer — проверки личности, которые регулируемый финансовый продукт проводит, прежде чем разрешить переводить деньги: съёмка документов, liveness, санкционный и антиотмывочный скрининг. На онбординг это влияет сильнее любого дизайн-решения.",[673,674,675],"Know Your Customer","AML","KYC\u002FAML",[677],{"kind":485,"url":678},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[571,559],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":682,"category":454,"aliases":683,"links":685,"related":686,"readMore":687,"target":687,"hasArticle":464},"Переиспользование бизнес-логики на Kotlin между Android, iOS и сервером, при этом интерфейс на каждой платформе остаётся нативным. Альтернатива Flutter, когда UI обязан быть нативным, а правила за ним — нет.",[684],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":689,"term":690,"definition":691,"category":692,"aliases":693,"links":696,"related":699,"readMore":-1,"target":701,"hasArticle":464},"mvp","MVP","Минимальная версия продукта, которую можно показать реальным пользователям и которая при этом отвечает на вопрос, ради которого его делали. Решение об объёме, а не о качестве: MVP всё равно обязан работать.","business",[694,695],"минимально жизнеспособный продукт","minimum viable product",[697],{"kind":485,"url":698},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[700],"white-label","\u002Fglossary#mvp",{"slug":703,"term":704,"definition":705,"category":658,"aliases":706,"links":710,"related":715,"readMore":-1,"target":716,"hasArticle":464},"oauth","OAuth","Стандарт, на котором держатся «Вход через Apple», Google и остальные: пользователь авторизует ваше приложение у провайдера, которому уже доверяет, а приложение получает токен вместо пароля. Никто не заводит новый пароль, и вы его не храните.",[707,708,709],"OAuth 2.0","вход через соцсети","Sign in with Apple",[711,713],{"kind":459,"url":712},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":485,"url":714},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[655],"\u002Fglossary#oauth",{"slug":571,"term":718,"definition":719,"category":493,"aliases":720,"links":723,"related":728,"readMore":-1,"target":729,"hasArticle":464},"PCI-DSS","Стандарт безопасности карточной индустрии, обязательный для всех, кто хранит, обрабатывает или передаёт данные карт. Большинство приложений намеренно остаются вне зоны его действия, отдавая ввод карты сертифицированному платёжному провайдеру.",[721,722],"PCI DSS","Payment Card Industry Data Security Standard",[724,726],{"kind":459,"url":725},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":485,"url":727},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[655],"\u002Fglossary#pci-dss",{"slug":731,"term":732,"definition":733,"category":692,"aliases":734,"links":737,"related":740,"readMore":-1,"target":742,"hasArticle":464},"product-market-fit","Product-market fit","Момент, когда продукт доказуемо нашёл своих людей: они им пользуются, возвращаются и платят. До него разработка отвечает на вопрос, после — на спрос.",[735,736],"PMF","соответствие продукта рынку",[738],{"kind":485,"url":739},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[689,741],"time-to-market","\u002Fglossary#product-market-fit",{"slug":744,"term":745,"definition":746,"category":493,"aliases":747,"links":750,"related":753,"readMore":-1,"target":755,"hasArticle":464},"prompt-injection","Prompt injection","Атака, при которой текст от пользователя языковая модель читает как инструкции, а не как данные, и уходит в обход собственных правил. Родственник SQL-инъекции в эпоху LLM: возникает везде, где пользовательский ввод склеивается в промпт.",[748,749],"инъекция промпта","инъекция в промпт",[751],{"kind":485,"url":752},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[754],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":332,"term":333,"definition":757,"category":507,"aliases":758,"links":761,"related":764,"readMore":-1,"target":765,"hasArticle":464},"Шаблон обмена сообщениями: производитель публикует событие, а любое число потребителей независимо читает его через стоящий между ними брокер. Производитель никогда их не ждёт — так путь запроса остаётся быстрым, а более медленная работа выполняется в фоне.",[759,760],"публикация\u002Fподписка","Google Cloud Pub\u002FSub",[762],{"kind":485,"url":763},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":515,"term":767,"definition":768,"category":507,"aliases":769,"links":772,"related":775,"readMore":-1,"target":776,"hasArticle":464},"REST","Общепринятый стиль HTTP-API: URL называет ресурс, а HTTP-метод говорит, что с ним сделать. Способ по умолчанию, которым приложение общается с бэкендом, и то, что ожидает найти большинство сторонних интеграций.",[770,771],"REST API","Representational State Transfer",[773],{"kind":485,"url":774},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[555,556],"\u002Fglossary#rest",{"slug":572,"term":778,"definition":779,"category":493,"aliases":780,"links":783,"related":786,"readMore":-1,"target":787,"hasArticle":464},"SOC 2","Отчёт внешнего аудитора о том, как компания обращается с данными клиентов — безопасность, доступность, конфиденциальность, — а не сертификат, который можно купить. Корпоративные заказчики его требуют, а архитектуру он ограничивает задолго до самого аудита.",[781,782],"SOC2","System and Organization Controls",[784],{"kind":485,"url":785},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[571,559,573],"\u002Fglossary#soc-2",{"slug":789,"term":790,"definition":791,"category":692,"aliases":792,"links":795,"related":798,"readMore":-1,"target":800,"hasArticle":464},"saas","SaaS","Софт, который продают как постоянную подписку на размещённый у поставщика продукт, а не как разовую лицензию для установки у себя. Поставщик держит серверы, непрерывно выкатывает обновления и берёт плату за пользователя или за объём.",[793,794],"Software as a Service","ПО как услуга",[796],{"kind":485,"url":797},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[799,700],"multi-tenancy","\u002Fglossary#saas",{"slug":556,"term":802,"definition":803,"category":658,"aliases":804,"links":806,"related":809,"readMore":-1,"target":810,"hasArticle":464},"Server-Sent Events","Односторонний поток от сервера к клиенту поверх обычного HTTP-соединения. Проще, чем WebSocket, и достаточен там, где только серверу есть что сказать: прогресс операции, ответ AI, приходящий токен за токеном.",[805],"SSE",[807],{"kind":485,"url":808},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[555,515],"\u002Fglossary#server-sent-events",{"slug":643,"term":812,"definition":813,"category":454,"aliases":814,"links":817,"related":822,"readMore":-1,"target":823,"hasArticle":464},"Skia","Открытая 2D-графическая библиотека Google, которая рисует Chrome, Android и — до появления Impeller — каждый кадр Flutter. Она умеет выводить не только на экран, но и в PDF: именно это делает «печать в PDF» в Chrome.",[815,816],"Skia Graphics Engine","skia-safe",[818,820],{"kind":459,"url":819},"https:\u002F\u002Fskia.org\u002F",{"kind":485,"url":821},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[635],"\u002Fglossary#skia",{"slug":825,"term":826,"definition":827,"category":692,"aliases":828,"links":832,"related":833,"readMore":-1,"target":835,"hasArticle":464},"staff-augmentation","Staff augmentation","Модель найма, при которой инженеры внешнего партнёра входят в вашу команду и работают под вашим управлением — в вашем репозитории, ваших спринтах, вашем процессе, — а не сдают отдельный проект. Вы покупаете ресурс; код и контекст остаются у вас.",[829,830,831],"аутстаффинг","расширение команды","выделенные разработчики",[],[834,741],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":837,"term":838,"definition":839,"category":658,"aliases":840,"links":844,"related":847,"readMore":-1,"target":849,"hasArticle":464},"tls","TLS","Слой шифрования под HTTPS. Он подтверждает, что сервер именно тот, о ком говорит его сертификат, согласует свежий ключ на сессию и шифрует всё дальнейшее — сеть между вами видит шифртекст и не может незаметно его изменить.",[841,842,843],"SSL","HTTPS","Transport Layer Security",[845],{"kind":485,"url":846},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[848,655],"end-to-end-encryption","\u002Fglossary#tls",{"slug":741,"term":851,"definition":852,"category":692,"aliases":853,"links":856,"related":859,"readMore":-1,"target":860,"hasArticle":464},"Time to market","Время от решения строить продукт до момента, когда им пользуются настоящие люди. Большинство споров о стеке и объёме работ — на самом деле споры об этом числе: каждая сэкономленная неделя — это неделя выручки, обратной связи и позиции на рынке.",[854,855],"TTM","время выхода на рынок",[857],{"kind":485,"url":858},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[689,834],"\u002Fglossary#time-to-market",{"slug":862,"term":863,"definition":864,"category":658,"aliases":865,"links":867,"related":872,"readMore":-1,"target":874,"hasArticle":464},"webrtc","WebRTC","Браузерный и мобильный стандарт для передачи аудио, видео и данных напрямую между двумя устройствами; серверы участвуют только в том, чтобы их познакомить. На нём строят видеозвонок внутри приложения, когда не берут готовый SDK.",[866],"Web Real-Time Communication",[868,870],{"kind":459,"url":869},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":485,"url":871},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[873,555],"xmpp","\u002Fglossary#webrtc",{"slug":555,"term":876,"definition":877,"category":658,"aliases":878,"links":879,"related":882,"readMore":-1,"target":883,"hasArticle":464},"WebSocket","Протокол, который держит одно соединение между клиентом и сервером открытым, чтобы любая сторона могла отправить данные в любой момент, а не клиент спрашивал снова и снова. На нём работают живые котировки, чаты и статусы присутствия.",[],[880],{"kind":485,"url":881},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[556,515],"\u002Fglossary#websocket",{"slug":700,"term":885,"definition":886,"category":692,"aliases":887,"links":890,"related":893,"readMore":894,"target":894,"hasArticle":440},"White-label","Один продукт, выпускаемый под многими брендами. White-label платформа собирает каждому клиенту готовое к публикации приложение со своим названием, оформлением и контентом из общей кодовой базы, а не форкает проект под заказчика.",[888,889],"белый лейбл","мультитенантное приложение",[891],{"kind":485,"url":892},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[689],"\u002Fglossary\u002Fwhite-label",{"slug":873,"term":896,"definition":897,"category":658,"aliases":898,"links":901,"related":906,"readMore":-1,"target":907,"hasArticle":464},"XMPP","Открытый федеративный протокол обмена сообщениями и давняя альтернатива тому, чтобы писать чат-бэкенд самому или арендовать чужой. Он покрывает статусы присутствия, индикаторы набора и передачу файлов, а зрелые клиентские библиотеки есть под любую платформу.",[899,900],"Jabber","Extensible Messaging and Presence Protocol",[902,904],{"kind":459,"url":903},"https:\u002F\u002Fxmpp.org\u002F",{"kind":485,"url":905},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[862,555],"\u002Fglossary#xmpp",{"slug":909,"term":910,"definition":911,"category":692,"aliases":912,"links":916,"related":919,"readMore":-1,"target":920,"hasArticle":464},"in-app-purchase","Встроенные покупки","Продажа цифровых товаров и подписок через биллинг Apple и Google, который оба стора требуют для цифрового контента и с которого берут комиссию. Сложность никогда не в самой покупке, а в её восстановлении на новом устройстве и в честном учёте прав доступа.",[913,914,915],"in-app purchase","IAP","внутренние покупки",[917],{"kind":472,"url":918},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[731],"\u002Fglossary#in-app-purchase",{"slug":475,"term":922,"definition":923,"category":454,"aliases":924,"links":929,"related":932,"readMore":933,"target":933,"hasArticle":440},"Диплинкинг","Ссылка, которая открывает конкретный экран внутри установленного приложения, а не его главную или веб-страницу. Отложенный диплинкинг переживает установку: нажатие, прошедшее через магазин приложений, всё равно приводит на нужный экран.",[925,926,927,928],"deep linking","отложенный диплинкинг","Universal Links","Android App Links",[930],{"kind":485,"url":931},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[466,476],"\u002Fglossary\u002Fdeep-linking",{"slug":935,"term":936,"definition":937,"category":507,"aliases":938,"links":942,"related":945,"readMore":-1,"target":946,"hasArticle":464},"multi-arch-image","Мультиархитектурный образ","Один тег образа, который разрешается в разные бинарники для каждой архитектуры процессора — обычно это пара linux\u002Famd64 и linux\u002Farm64, — так что один и тот же docker pull работает без изменений и на серверах Intel\u002FAMD, и на ноутбуках с Apple Silicon.",[939,940,941],"мультиарх-сборка","multi-arch build","linux\u002Famd64 + linux\u002Farm64",[943],{"kind":472,"url":944},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[532],"\u002Fglossary#multi-arch-image",{"slug":799,"term":948,"definition":949,"category":507,"aliases":950,"links":953,"related":956,"readMore":-1,"target":958,"hasArticle":464},"Мультитенантность","Один развёрнутый бэкенд обслуживает много клиентов, и каждый видит только свои данные, конфигурацию и включённые функции, потому что контекст тенанта определяется для каждого запроса. Именно это делает линейку брендированных приложений одним продуктом, а не набором форков.",[799,951,952],"мультиарендность","тенант",[954],{"kind":485,"url":955},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[700,957],"feature-flags","\u002Fglossary#multi-tenancy",{"slug":343,"term":339,"definition":960,"category":507,"aliases":961,"links":965,"related":968,"readMore":-1,"target":969,"hasArticle":464},"Хранилище, которое держит файл целиком под ключом, а не в дереве файловой системы, — Amazon S3 и множество сервисов, совместимых с его API. Дешёвое, практически безграничное, привычное место для сырых событий, бэкапов и медиа: пишется один раз, читается редко, хранится вечно.",[962,963,964],"S3","S3-совместимое хранилище","блоб-хранилище",[966],{"kind":485,"url":967},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[352],"\u002Fglossary#object-storage",{"slug":754,"term":971,"definition":972,"category":493,"aliases":973,"links":977,"related":980,"readMore":-1,"target":981,"hasArticle":464},"Ограничение частоты запросов","Предел на число запросов от одного клиента за заданный интервал. Именно он не даёт одному увлечённому пользователю, скраперу или боту потратить месячный бюджет платного API за вечер, и стоять он должен на вашей стороне интеграции.",[974,975,976],"rate limiting","рейт-лимит","троттлинг",[978],{"kind":485,"url":979},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[744],"\u002Fglossary#rate-limiting",{"slug":983,"term":984,"definition":985,"category":454,"aliases":986,"links":989,"related":992,"readMore":-1,"target":993,"hasArticle":464},"platform-channels","Платформенные каналы","Мост, через который Flutter-приложение вызывает нативный код iOS и Android — Keychain и Keystore, биометрию, платёжные шторки, любой SDK без Dart-пакета. Работа рутинная, но настоящая, и первое место, где споткнётся инженер, не выходивший за пределы Dart.",[987,988],"platform channels","method channel",[990],{"kind":472,"url":991},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":995,"term":996,"definition":997,"category":658,"aliases":998,"links":1001,"related":1004,"readMore":-1,"target":1005,"hasArticle":464},"post-quantum-cryptography","Постквантовая криптография","Алгоритмы шифрования, рассчитанные на устойчивость к будущему квантовому компьютеру; стандарты уже финализированы NIST. Мигрировать нужно до появления железа: трафик, записанный сегодня, расшифруют, когда такая машина появится.",[999,1000],"PQC","постквантовое шифрование",[1002],{"kind":485,"url":1003},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[837,848],"\u002Fglossary#post-quantum-cryptography",{"slug":1007,"term":1008,"definition":1009,"category":493,"aliases":1010,"links":1014,"related":1015,"readMore":-1,"target":1016,"hasArticle":464},"staged-rollout","Поэтапная раскатка","Релиз сначала на небольшой процент пользователей и расширение только тогда, когда доля сессий без падений держится. Плохая сборка, пойманная на десяти процентах, — испорченный вечер; она же на ста процентах — испорченная неделя.",[1011,1012,1013],"staged rollout","phased release","канареечный релиз",[],[957,490],"\u002Fglossary#staged-rollout",{"slug":532,"term":1018,"definition":1019,"category":507,"aliases":1020,"links":1026,"related":1029,"readMore":-1,"target":1030,"hasArticle":464},"Реестр контейнеров","Хранилище образов контейнеров, адресуемых по имени и тегу, — Docker Hub, GitHub Container Registry или собственный реестр облачного провайдера. Публикация сборки в реестр превращает «у меня работает» в образ, который любой может скачать и запустить без изменений.",[1021,1022,1023,1024,1025],"реестр образов","Docker registry","GHCR","ghcr.io","container registry",[1027],{"kind":472,"url":1028},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[519,935],"\u002Fglossary#container-registry",{"slug":620,"term":1032,"definition":1033,"category":507,"aliases":1034,"links":1037,"related":1040,"readMore":-1,"target":1041,"hasArticle":464},"Серверный рендеринг","Сборка страницы в готовый HTML на сервере, чтобы первый же ответ содержал контент, заголовки, метатеги и структурированные данные. Краулеры, превью ссылок и медленные устройства читают это, не выполняя JavaScript.",[1035,1036],"SSR","server-side rendering",[1038],{"kind":485,"url":1039},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[610],"\u002Fglossary#server-side-rendering",{"slug":848,"term":1043,"definition":1044,"category":507,"aliases":1045,"links":1049,"related":1052,"readMore":-1,"target":1053,"hasArticle":464},"Сквозное шифрование","Шифрование, которое накладывается на устройстве отправителя и снимается только на устройстве получателя, так что сервис, передающий сообщение, не может его прочитать — ни по решению суда, ни после взлома. Оно защищает содержимое, но никогда — метаданные.",[1046,1047,1048],"E2EE","end-to-end encryption","оконечное шифрование",[1050],{"kind":485,"url":1051},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[837,655],"\u002Fglossary#end-to-end-encryption",{"slug":834,"term":1055,"definition":1056,"category":692,"aliases":1057,"links":1060,"related":1063,"readMore":-1,"target":1064,"hasArticle":464},"Совокупная стоимость владения","Во что продукт обходится за всю жизнь, а не только на этапе разработки: поддержка, обновления, ежегодные миграции на новые ОС и правила сторов, вторая команда, чтобы две кодовые базы не расходились. Обычно больше сметы на разработку и почти никогда в неё не входит.",[1058,1059],"TCO","total cost of ownership",[1061],{"kind":485,"url":1062},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[741],"\u002Fglossary#total-cost-of-ownership",{"slug":1066,"term":1067,"definition":1068,"category":507,"aliases":1069,"links":1073,"related":1076,"readMore":-1,"target":1077,"hasArticle":464},"state-management","Управление состоянием","То, как приложение решает, где живёт значение, кому позволено его менять и какие части экрана перерисовываются, когда оно меняется. Во Flutter выбор между Riverpod, BLoC и Provider — одно из первых архитектурных решений и одно из самых трудных для пересмотра.",[1070,1071,1072],"state management","BLoC","Riverpod",[1074],{"kind":472,"url":1075},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[576],"\u002Fglossary#state-management",{"slug":957,"term":1079,"definition":1080,"category":493,"aliases":1081,"links":1085,"related":1088,"readMore":-1,"target":1089,"hasArticle":464},"Фиче-флаги","Переключатели, которые включают и выключают функциональность из конфигурации, а не из релиза. Один бинарник ведёт себя по-разному для разных брендов, рынков и пользователей, а рискованную фичу можно погасить, не отправляя новую сборку на ревью.",[1082,1083,1084],"feature flags","фиче-флаги","feature toggle",[1086],{"kind":485,"url":1087},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[1007,700,799],"\u002Fglossary#feature-flags",{"slug":1091,"term":1092,"definition":1093,"category":507,"aliases":1094,"links":1098,"related":1101,"readMore":-1,"target":1102,"hasArticle":464},"floating-point","Числа с плавающей точкой","Двоичный формат IEEE 754, стоящий за double и float. Он не хранит 0.1 точно, поэтому 0.1 + 0.2 даёт 0.30000000000000004 — незаметно в графике и фатально в деньгах, которым место в целых минорных единицах или в decimal-типе.",[1095,1096,1097],"IEEE 754","double","плавающая запятая",[1099],{"kind":485,"url":1100},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point"]