[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fportfolio\u002Fjepta":167,"glossary":331},[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":310,"client":312,"date":313,"description":314,"duration":315,"extension":316,"image":317,"links":319,"meta":320,"metaDescription":321,"navigation":322,"ogDescription":323,"path":324,"seo":325,"slug":326,"stem":327,"technologies":328,"updated":329,"__hash__":330},"projects_ru\u002Fportfolio\u002Fjepta.md","Jepta",{"type":171,"value":172,"toc":293},"minimark",[173,178,182,185,189,193,196,201,204,208,216,220,223,227,230,234,241,245,248,252,255,258,271,275,279],[174,175,177],"h2",{"id":176},"о-проекте","О проекте",[179,180,181],"p",{},"Jepta — гиперлокальная социальная сеть, построенная вокруг места, где вы живёте. Вместо глобального графа подписок она организует людей по близости: чаты, привязанные к адресу или дому, групповые чаты для тех, кто живёт по одному адресу, и каналы, которые ведут пекарня, мастерская или клуб в паре сотен метров от вас. Всё в приложении — предлагаемые чаты, каналы в ленте, посты, которые вы видите первыми, — ранжируется по расстоянию от текущей геопозиции.",[179,183,184],{},"Компания Netgineers GmbH обратилась к нам, когда продукт был уже определён, а бэкенд — в работе. Требовалась мобильная часть: одна кодовая база на Flutter для iOS и Android — для продукта с необычно широкой для первого релиза поверхностью.",[186,187],"gallery",{":images":188},"[{\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F01.webp\", \"alt\": \"Онбординг\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F02.webp\", \"alt\": \"Запрос геопозиции\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F03.webp\", \"alt\": \"Список чатов\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F04.webp\", \"alt\": \"Лента канала\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F05.webp\", \"alt\": \"Информация о канале\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F06.webp\", \"alt\": \"Чат с каналом\"}, {\"url\": \"\u002Fprojects\u002Fjepta\u002Fimages\u002F07.webp\", \"alt\": \"Новый пост\"}]",[174,190,192],{"id":191},"задача","Задача",[179,194,195],{},"Две вещи делали этот проект сложнее обычной разработки.",[197,198,200],"h3",{"id":199},"масштаб-поверхности-экранов","Масштаб поверхности экранов",[179,202,203],{},"Jepta — это не одна функция с настройками вокруг неё. Личные чаты, групповые чаты, чаты по адресу, лента каналов, профили каналов с часами работы и галереями фотографий, переписка канала с пользователем, редактор постов с настройкой комментариев для каждого поста, вкладка активности, вкладка профиля, поиск, добавление контактов по QR-коду, работа с геопозицией и разрешениями — всё это в первом релизе и в шестимесячном окне. При таком количестве экраны перестают быть независимыми единицами работы: без общего скелета каждый новый тянет за собой свои особенности навигации, свои состояния загрузки и пустого экрана, свою копию одного и того же списка.",[197,205,207],{"id":206},"реальное-время-везде","Реальное время везде",[179,209,210,211,215],{},"Чат — очевидное место, где появляются ",[212,213],"term",{"slug":214},"websocket","-соединения, но в Jepta они им не ограничены. Пришедший пост в канале, изменившийся счётчик комментариев, бейдж непрочитанного на вкладке чатов, отметка о прочтении — всё это работает через одно и то же постоянное соединение, в том числе на экранах, на которые пользователь сейчас не смотрит. Решать это отдельно на каждом экране означало бы по соединению на экран и состояние, которое расходится с самим собой при первом же переключении вкладки.",[174,217,219],{"id":218},"наш-подход","Наш подход",[179,221,222],{},"Мы рассматривали обе проблемы как одну: сначала построить общие части, а экраны сделать тонкими.",[197,224,226],{"id":225},"один-слой-реального-времени-и-много-потребителей","Один слой реального времени и много потребителей",[179,228,229],{},"WebSocket-соединение живёт под интерфейсом как единый клиент, который сам управляет своим жизненным циклом: подключение, аутентификация, heartbeat, переподключение с backoff, повторная подписка. Экраны не открывают сокеты — они подписываются на типизированные потоки событий и получают обновления. Сообщения, отправленные при отсутствии связи, ставятся в очередь и досылаются при переподключении, а не теряются; статус доставки (отправлено, доставлено, прочитано) — часть модели сообщения, а не догадка на основе того, что успело прийти. Поскольку слой общий, сообщение в открытом чате и увеличение бейджа на вкладке, куда пользователь не смотрит, — это одно и то же событие, обработанное один раз.",[197,231,233],{"id":232},"скелет-экрана-вместо-ручной-сборки-каждого","Скелет экрана вместо ручной сборки каждого",[179,235,236,237,240],{},"При таком количестве поверхностей выигрыш давало их единообразие: один навигационный граф с типизированными маршрутами, один подход к ",[212,238],{"slug":239},"state-management",", применённый одинаково в каждой фиче, и общий набор состояний: список, загрузка, пустой экран, ошибка. Новые экраны в основном собирались из готового — именно это сделало объём выполнимым в срок и сохранило приложение цельным, а не похожим на двадцать экранов от разных рук.",[197,242,244],{"id":243},"геопозиция-как-полноценные-входные-данные","Геопозиция как полноценные входные данные",[179,246,247],{},"Близость — не фильтр, прикрученный к ленте, а организующий принцип продукта, поэтому слой геопозиции должен был быть надёжным: сценарии выдачи разрешений, корректно работающие при отказе, закешированные координаты, чтобы лента не была пустой, пока определяется местоположение, и расстояние, показанное рядом с самим контентом («в 5 км от вас» в шапке канала), чтобы ранжирование читалось, а не выглядело загадкой.",[174,249,251],{"id":250},"результат","Результат",[179,253,254],{},"Jepta вышла на iOS и Android из одной кодовой базы на Flutter в отведённые шесть месяцев и с полным набором функций: чаты, каналы, посты, комментарии и лента с учётом геопозиции — в первом релизе, а не по частям в нескольких.",[179,256,257],{},"Дольше дедлайна прожила архитектура. Поскольку слой реального времени, навигационный граф и подход к состоянию были построены один раз и переиспользовались, добавление экрана после релиза осталось небольшим изменением, а не новой интеграцией с сокетом, роутером и кешем. Для продукта, чей роадмап — «больше поверхностей», именно эта разница накапливается.",[259,260,265,268],"testimonial",{"author":261,"avatar":262,"linkedin":263,"role":264},"Evgeny Syrtsov","\u002Fclients\u002Fevgeny-syrtsov.png","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fevgeny-syrtsov\u002F","Генеральный директор, Netgineers GmbH",[179,266,267],{},"Больше всего меня беспокоили шесть месяцев на приложение такого охвата. Jepta — это соседские чаты, каналы бизнеса, посты, комментарии и лента, которая перестраивается вокруг того места, где вы сейчас находитесь: длинный список экранов, фиксированная дата и трезвое ожидание, что половина уедет во второй релиз.",[179,269,270],{},"Команда Nerdy Production сначала построила общий фундамент — один слой реального времени, одну модель навигации, — и после этого каждый новый экран стал дешёвым. Мы вышли на iOS и Android с полным набором функций, чат надёжно работает с первого дня, а дорабатывать приложение с тех пор — небольшая задача, а не проект. Мы получили тот продукт, который заказывали, и к той дате, к которой заказывали.",[174,272,274],{"id":273},"faq","FAQ",[276,277],"questions",{":items":278},"[{\"title\": \"Что такое Jepta?\", \"text\": \"Jepta — приложение для гиперлокального общения в немецких районах. Оно организует людей по близости, а не по глобальному графу подписок: чаты, привязанные к адресу или дому, групповые чаты для тех, кто живёт по одному адресу, и каналы, которые ведёт локальный бизнес — например, пекарня или мастерская. Чаты, каналы и посты, которые видит пользователь, ранжируются по расстоянию от его текущего местоположения.\"}, {\"title\": \"Как разрабатывать приложение на Flutter с большим количеством экранов?\", \"text\": \"Сначала построить общие части, а экраны оставить тонкими. В Jepta это означало один навигационный граф с типизированными маршрутами, один подход к управлению состоянием, применённый одинаково в каждой фиче, и общий набор состояний: список, загрузка, пустой экран, ошибка. После этого новые экраны в основном собираются из готового, а не превращаются в новую интеграцию — именно это делает объём выполнимым в срок и не даёт приложению выглядеть как двадцать экранов от разных рук.\"}, {\"title\": \"Как работать с WebSocket-соединениями сразу на многих экранах во Flutter?\", \"text\": \"Держать одно соединение под интерфейсом — как единый клиент, который сам управляет своим жизненным циклом: подключение, аутентификация, heartbeat, переподключение с backoff, повторная подписка. Экраны не открывают собственных сокетов, а подписываются на типизированные потоки событий и получают обновления. Тогда сообщение в открытом чате и растущий бейдж непрочитанного на вкладке, куда никто не смотрит, — одно и то же событие, обработанное один раз, вместо соединения на каждый экран и состояния, которое расходится с самим собой.\"}, {\"title\": \"Что происходит с сообщениями, отправленными при отсутствии связи?\", \"text\": \"Они ставятся в очередь и досылаются при переподключении, а не теряются. Статус доставки — отправлено, доставлено, прочитано — хранится как часть модели сообщения, а не выводится из того, что успело прийти, поэтому интерфейс показывает реальный статус сообщения, а не догадку о нём.\"}, {\"title\": \"Сколько времени занимает разработка большого социального приложения на Flutter?\", \"text\": \"Jepta вышла на iOS и Android из одной кодовой базы на Flutter за шесть месяцев: чаты, каналы, посты, комментарии и лента с учётом геопозиции — всё в первом релизе, а не по частям в нескольких. Срок выдержали за счёт того, что слой реального времени, навигационный граф и подход к состоянию были построены один раз и переиспользовались на всех экранах.\"}, {\"title\": \"Может ли приложение на Flutter ранжировать контент по геопозиции?\", \"text\": \"Да, и в Jepta близость — организующий принцип продукта, а не фильтр поверх ленты. Это предъявляет требования к слою геопозиции: сценарии выдачи разрешений, корректно работающие при отказе, закешированные координаты, чтобы лента не была пустой, пока определяется местоположение, и расстояние, показанное рядом с тем контентом, к которому оно относится, — чтобы ранжирование читалось, а не выглядело загадкой.\"}]",[179,280,281,282,287,288,292],{},"Jepta сделана в рамках нашей услуги ",[283,284,286],"a",{"href":285},"\u002Fservices\u002Fflutter-app-development","разработки приложений на Flutter"," и стала опорным проектом нашей практики ",[283,289,291],{"href":290},"\u002Fservices\u002Fflutter-app-development\u002Fsocial","разработки социальных и комьюнити-приложений"," — тот же слой реального времени, только рассказанный со стороны сообщества.",{"title":294,"searchDepth":295,"depth":295,"links":296},"",2,[297,298,303,308,309],{"id":176,"depth":295,"text":177},{"id":191,"depth":295,"text":192,"children":299},[300,302],{"id":199,"depth":301,"text":200},3,{"id":206,"depth":301,"text":207},{"id":218,"depth":295,"text":219,"children":304},[305,306,307],{"id":225,"depth":301,"text":226},{"id":232,"depth":301,"text":233},{"id":243,"depth":301,"text":244},{"id":250,"depth":295,"text":251},{"id":273,"depth":295,"text":274},[311],"mobile","Netgineers GmbH","2023-06-01","Jepta — приложение для гиперлокального общения в немецких районах. Соседи переписываются в чатах, привязанных к улице или дому, локальный бизнес ведёт каналы с постами, часами работы и комментариями, а всё, что видит пользователь, ранжируется по реальной близости. Мы сделали Flutter-приложение для iOS и Android — большую поверхность экранов с WebSocket-слоем под каждым чатом и каналом.","6 месяцев","md",{"alt":169,"url":318},"\u002Fprojects\u002Fjepta\u002Fhero.webp",null,{},"Jepta — гиперлокальное Flutter-приложение для немецких районов: чаты по адресу, каналы локального бизнеса и лента с учётом геопозиции на iOS и Android.",true,"Соседский мессенджер, который знает, где вы находитесь: Flutter на iOS и Android, обмен сообщениями поверх WebSocket и каналы магазинов с вашей улицы.","\u002Fportfolio\u002Fjepta",{"title":169,"description":314},"jepta","portfolio\u002Fjepta",[41,18],"2026-09-05","x2u0DdFkLSkbhBn-M2vGtkcq3nPid5PkFHb3IaSF6Ig",[332,347,360,375,389,404,420,433,445,462,475,486,496,509,521,532,541,555,568,575,589,604,617,630,643,654,665,676,689,699,712,724,738,749,763,772,783,796,809,822,835,847,859,871,883,895,906,920,931,943,954,966,978],{"slug":333,"term":334,"definition":335,"category":336,"aliases":337,"links":339,"related":343,"readMore":-1,"target":345,"hasArticle":346},"aosp","AOSP","Android Open Source Project — Android без надстройки Google, который может форкнуть кто угодно. На его форках работают кассовые терминалы, киоски и автомобильные системы, а работа на этом уровне открывает части ОС, которых прикладной разработчик не видит.","platform",[338],"Android Open Source Project",[340],{"kind":341,"url":342},"website","https:\u002F\u002Fsource.android.com\u002F",[344],"host-card-emulation","\u002Fglossary#aosp",false,{"slug":348,"term":349,"definition":350,"category":336,"aliases":351,"links":352,"related":356,"readMore":-1,"target":359,"hasArticle":346},"app-clips","App Clips","Функция Apple, позволяющая запустить небольшую часть iOS-приложения — до 15 МБ — не устанавливая его целиком. Вызывается по QR-коду, NFC-метке или ссылке: для случаев, когда первое действие пользователя не должно требовать похода в App Store.",[],[353],{"kind":354,"url":355},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[357,358],"deep-linking","install-referrer","\u002Fglossary#app-clips",{"slug":361,"term":362,"definition":363,"category":336,"aliases":364,"links":365,"related":371,"readMore":-1,"target":374,"hasArticle":346},"bigquery","BigQuery","Аналитическое хранилище Google Cloud. Вы запускаете SQL по миллиардам строк, и они сканируются за секунды, а данные при этом лежат отдельно от машин, выполняющих запросы. Именно это снимает отчётность и исследование данных с базы, обслуживающей живой трафик.",[],[366,368],{"kind":341,"url":367},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":369,"url":370},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[372,373],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":376,"term":377,"definition":378,"category":379,"aliases":380,"links":384,"related":387,"readMore":-1,"target":388,"hasArticle":346},"ci-cd","CI\u002FCD","Автоматизация, которая собирает, тестирует и выкладывает каждое изменение без ручного запуска команд. В мобильной разработке это то, что превращает релиз в нажатие кнопки вместо полудня ожидания, пока освободится нужный человек.","practice",[381,382,383],"CI","непрерывная интеграция","непрерывная поставка",[385],{"kind":369,"url":386},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":390,"term":391,"definition":392,"category":393,"aliases":394,"links":397,"related":400,"readMore":-1,"target":403,"hasArticle":346},"crud","CRUD","Create, read, update, delete — четыре операции, стоящие почти за каждой формой и админкой. Собирательное название для рутинной половины приложения, которая управляет данными, в отличие от частей с реальной предметной логикой.","architecture",[395,396],"Create, Read, Update, Delete","создание, чтение, обновление, удаление",[398],{"kind":369,"url":399},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[401,402],"rest","graphql","\u002Fglossary#crud",{"slug":405,"term":406,"definition":407,"category":379,"aliases":408,"links":412,"related":417,"readMore":-1,"target":419,"hasArticle":346},"dev-container","Dev Container","Среда разработки, описанная один раз в devcontainer.json — ОС, инструменты и версии рантаймов, которые нужны проекту, — и открываемая одинаково внутри контейнера в редакторе любого участника, вместо инструкции по установке, которую каждый понимает по-своему.",[409,410,411],"devcontainer.json","Dev Containers","VS Code Dev Containers",[413,415],{"kind":341,"url":414},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":354,"url":416},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[418],"container-registry","\u002Fglossary#dev-container",{"slug":373,"term":421,"definition":422,"category":336,"aliases":423,"links":426,"related":431,"readMore":-1,"target":432,"hasArticle":346},"Elasticsearch","Поисковый и аналитический движок, который индексирует записи, чтобы их можно было интерактивно фильтровать и искать, а не сканировать. К нему обращаются, когда вопрос звучит как «покажи вот эти сессии с шестью фильтрами», а не «просуммируй колонку».",[424,425],"Elastic","ELK",[427,429],{"kind":341,"url":428},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":369,"url":430},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[361],"\u002Fglossary#elasticsearch",{"slug":434,"term":435,"definition":436,"category":393,"aliases":437,"links":440,"related":441,"readMore":-1,"target":444,"hasArticle":346},"fan-out","Fan-out","Чтение источника один раз и доставка каждого обновления всем подписанным на него клиентам. Наивная версия пишет подписчикам в цикле и встаёт, как только один из сокетов начинает тормозить; рабочая — держит отдельный буфер на каждого клиента и отключает тех, кто не успевает.",[438,439],"веерная рассылка","фан-аут",[],[214,442,443],"pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":446,"term":447,"definition":448,"category":379,"aliases":449,"links":452,"related":457,"readMore":-1,"target":461,"hasArticle":346},"gdpr","GDPR","Регламент ЕС о персональных данных людей в ЕС: законное основание для сбора, настоящее согласие на трекинг, право увидеть и удалить свои данные. Он следует за вашими пользователями, а не за вашими серверами: где зарегистрирована компания, значения не имеет.",[450,451],"Общий регламент по защите данных","General Data Protection Regulation",[453,455],{"kind":341,"url":454},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":369,"url":456},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[458,459,460],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":463,"term":464,"definition":465,"category":379,"aliases":466,"links":470,"related":473,"readMore":-1,"target":474,"hasArticle":346},"golden-test","Golden-тест","Тест, который отрисовывает виджет и сравнивает результат попиксельно с эталонным изображением. Во Flutter это самый дешёвый способ узнать, не сломал ли редизайн пустое состояние на 320pt, в тёмной теме, при 200% масштабе текста.",[467,468,469],"golden test","золотой тест","скриншотный тест",[471],{"kind":354,"url":472},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[376],"\u002Fglossary#golden-test",{"slug":402,"term":476,"definition":477,"category":393,"aliases":478,"links":479,"related":484,"readMore":-1,"target":485,"hasArticle":346},"GraphQL","Язык запросов к API, где клиент сам перечисляет нужные поля и получает один ответ ровно такой формы. Он снимает избыточную выдачу, к которой дрейфуют REST-эндпоинты, и добавляет собственный режим отказа: неограниченный запрос, обходящий всю модель данных.",[],[480,482],{"kind":341,"url":481},"https:\u002F\u002Fgraphql.org\u002F",{"kind":369,"url":483},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[401],"\u002Fglossary#graphql",{"slug":460,"term":487,"definition":488,"category":379,"aliases":489,"links":491,"related":494,"readMore":-1,"target":495,"hasArticle":346},"HIPAA","Закон США о защищённой медицинской информации: как её можно хранить, передавать, логировать и раскрывать. Как и PCI-DSS, это архитектурное ограничение, которое выбирают в начале, а не документ, который дописывают перед запуском.",[490],"Health Insurance Portability and Accountability Act",[492],{"kind":369,"url":493},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[458,446,459],"\u002Fglossary#hipaa",{"slug":497,"term":498,"definition":499,"category":393,"aliases":500,"links":503,"related":506,"readMore":-1,"target":508,"hasArticle":346},"headless-cms","Headless CMS","Система управления контентом с админкой и API, но без собственного фронтенда. Редакторы публикуют в одном месте, а сайт или приложение отрисовывает контент само — слой представления принадлежит вам, а не вендору CMS.",[501,502],"безголовая CMS","контентное API",[504],{"kind":369,"url":505},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[507,401],"server-side-rendering","\u002Fglossary#headless-cms",{"slug":344,"term":510,"definition":511,"category":336,"aliases":512,"links":516,"related":519,"readMore":-1,"target":520,"hasArticle":346},"Host Card Emulation","Режим, в котором Android-телефон программно эмулирует бесконтактную карту по NFC, без аппаратного защищённого элемента. Так платит приложение-кошелёк на терминале: телефон говорит с ним по тому же протоколу EMV Contactless, что и пластиковая карта.",[513,514,515],"HCE","EMV Contactless","бесконтактные платежи",[517],{"kind":354,"url":518},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[458,333],"\u002Fglossary#host-card-emulation",{"slug":522,"term":523,"definition":524,"category":336,"aliases":525,"links":526,"related":529,"readMore":-1,"target":531,"hasArticle":346},"impeller","Impeller","Движок рендеринга, на котором Flutter работает сегодня: по умолчанию на iOS с 2023 года и на Android с 2024-го. Он компилирует шейдеры заранее, а не во время первой анимации, что убрало главную видимую проблему Flutter в проде — джанк на компиляции шейдеров.",[],[527],{"kind":354,"url":528},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[530],"skia","\u002Fglossary#impeller",{"slug":358,"term":533,"definition":534,"category":336,"aliases":535,"links":536,"related":539,"readMore":-1,"target":540,"hasArticle":346},"Install Referrer","API Google Play, который передаёт только что установленному Android-приложению параметры кампании из ссылки, приведшей к установке. Android-половина отложенного диплинкинга и надёжный способ понять, откуда пришёл пользователь.",[],[537],{"kind":354,"url":538},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[357,348],"\u002Fglossary#install-referrer",{"slug":542,"term":543,"definition":544,"category":545,"aliases":546,"links":548,"related":553,"readMore":-1,"target":554,"hasArticle":346},"jwt","JWT","Подписанный токен, несущий свои данные внутри: сервер понимает, кому принадлежит запрос, не обращаясь к хранилищу сессий. Стандарт мобильной аутентификации. Подпись доказывает, что токен не меняли, но не скрывает его содержимое.","protocol",[547],"JSON Web Token",[549,551],{"kind":341,"url":550},"https:\u002F\u002Fjwt.io\u002F",{"kind":369,"url":552},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[458],"\u002Fglossary#jwt",{"slug":556,"term":557,"definition":558,"category":379,"aliases":559,"links":563,"related":566,"readMore":-1,"target":567,"hasArticle":346},"kyc","KYC","Know Your Customer — проверки личности, которые регулируемый финансовый продукт проводит, прежде чем разрешить переводить деньги: съёмка документов, liveness, санкционный и антиотмывочный скрининг. На онбординг это влияет сильнее любого дизайн-решения.",[560,561,562],"Know Your Customer","AML","KYC\u002FAML",[564],{"kind":369,"url":565},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[458,446],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":569,"category":336,"aliases":570,"links":572,"related":573,"readMore":574,"target":574,"hasArticle":346},"Переиспользование бизнес-логики на Kotlin между Android, iOS и сервером, при этом интерфейс на каждой платформе остаётся нативным. Альтернатива Flutter, когда UI обязан быть нативным, а правила за ним — нет.",[571],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":576,"term":577,"definition":578,"category":579,"aliases":580,"links":583,"related":586,"readMore":-1,"target":588,"hasArticle":346},"mvp","MVP","Минимальная версия продукта, которую можно показать реальным пользователям и которая при этом отвечает на вопрос, ради которого его делали. Решение об объёме, а не о качестве: MVP всё равно обязан работать.","business",[581,582],"минимально жизнеспособный продукт","minimum viable product",[584],{"kind":369,"url":585},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[587],"white-label","\u002Fglossary#mvp",{"slug":590,"term":591,"definition":592,"category":545,"aliases":593,"links":597,"related":602,"readMore":-1,"target":603,"hasArticle":346},"oauth","OAuth","Стандарт, на котором держатся «Вход через Apple», Google и остальные: пользователь авторизует ваше приложение у провайдера, которому уже доверяет, а приложение получает токен вместо пароля. Никто не заводит новый пароль, и вы его не храните.",[594,595,596],"OAuth 2.0","вход через соцсети","Sign in with Apple",[598,600],{"kind":341,"url":599},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":369,"url":601},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[542],"\u002Fglossary#oauth",{"slug":458,"term":605,"definition":606,"category":379,"aliases":607,"links":610,"related":615,"readMore":-1,"target":616,"hasArticle":346},"PCI-DSS","Стандарт безопасности карточной индустрии, обязательный для всех, кто хранит, обрабатывает или передаёт данные карт. Большинство приложений намеренно остаются вне зоны его действия, отдавая ввод карты сертифицированному платёжному провайдеру.",[608,609],"PCI DSS","Payment Card Industry Data Security Standard",[611,613],{"kind":341,"url":612},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":369,"url":614},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[542],"\u002Fglossary#pci-dss",{"slug":618,"term":619,"definition":620,"category":579,"aliases":621,"links":624,"related":627,"readMore":-1,"target":629,"hasArticle":346},"product-market-fit","Product-market fit","Момент, когда продукт доказуемо нашёл своих людей: они им пользуются, возвращаются и платят. До него разработка отвечает на вопрос, после — на спрос.",[622,623],"PMF","соответствие продукта рынку",[625],{"kind":369,"url":626},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[576,628],"time-to-market","\u002Fglossary#product-market-fit",{"slug":631,"term":632,"definition":633,"category":379,"aliases":634,"links":637,"related":640,"readMore":-1,"target":642,"hasArticle":346},"prompt-injection","Prompt injection","Атака, при которой текст от пользователя языковая модель читает как инструкции, а не как данные, и уходит в обход собственных правил. Родственник SQL-инъекции в эпоху LLM: возникает везде, где пользовательский ввод склеивается в промпт.",[635,636],"инъекция промпта","инъекция в промпт",[638],{"kind":369,"url":639},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[641],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":442,"term":644,"definition":645,"category":393,"aliases":646,"links":649,"related":652,"readMore":-1,"target":653,"hasArticle":346},"Pub\u002FSub","Шаблон обмена сообщениями: производитель публикует событие, а любое число потребителей независимо читает его через стоящий между ними брокер. Производитель никогда их не ждёт — так путь запроса остаётся быстрым, а более медленная работа выполняется в фоне.",[647,648],"публикация\u002Fподписка","Google Cloud Pub\u002FSub",[650],{"kind":369,"url":651},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":401,"term":655,"definition":656,"category":393,"aliases":657,"links":660,"related":663,"readMore":-1,"target":664,"hasArticle":346},"REST","Общепринятый стиль HTTP-API: URL называет ресурс, а HTTP-метод говорит, что с ним сделать. Способ по умолчанию, которым приложение общается с бэкендом, и то, что ожидает найти большинство сторонних интеграций.",[658,659],"REST API","Representational State Transfer",[661],{"kind":369,"url":662},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[214,443],"\u002Fglossary#rest",{"slug":459,"term":666,"definition":667,"category":379,"aliases":668,"links":671,"related":674,"readMore":-1,"target":675,"hasArticle":346},"SOC 2","Отчёт внешнего аудитора о том, как компания обращается с данными клиентов — безопасность, доступность, конфиденциальность, — а не сертификат, который можно купить. Корпоративные заказчики его требуют, а архитектуру он ограничивает задолго до самого аудита.",[669,670],"SOC2","System and Organization Controls",[672],{"kind":369,"url":673},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[458,446,460],"\u002Fglossary#soc-2",{"slug":677,"term":678,"definition":679,"category":579,"aliases":680,"links":683,"related":686,"readMore":-1,"target":688,"hasArticle":346},"saas","SaaS","Софт, который продают как постоянную подписку на размещённый у поставщика продукт, а не как разовую лицензию для установки у себя. Поставщик держит серверы, непрерывно выкатывает обновления и берёт плату за пользователя или за объём.",[681,682],"Software as a Service","ПО как услуга",[684],{"kind":369,"url":685},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[687,587],"multi-tenancy","\u002Fglossary#saas",{"slug":443,"term":690,"definition":691,"category":545,"aliases":692,"links":694,"related":697,"readMore":-1,"target":698,"hasArticle":346},"Server-Sent Events","Односторонний поток от сервера к клиенту поверх обычного HTTP-соединения. Проще, чем WebSocket, и достаточен там, где только серверу есть что сказать: прогресс операции, ответ AI, приходящий токен за токеном.",[693],"SSE",[695],{"kind":369,"url":696},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[214,401],"\u002Fglossary#server-sent-events",{"slug":530,"term":700,"definition":701,"category":336,"aliases":702,"links":705,"related":710,"readMore":-1,"target":711,"hasArticle":346},"Skia","Открытая 2D-графическая библиотека Google, которая рисует Chrome, Android и — до появления Impeller — каждый кадр Flutter. Она умеет выводить не только на экран, но и в PDF: именно это делает «печать в PDF» в Chrome.",[703,704],"Skia Graphics Engine","skia-safe",[706,708],{"kind":341,"url":707},"https:\u002F\u002Fskia.org\u002F",{"kind":369,"url":709},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[522],"\u002Fglossary#skia",{"slug":713,"term":714,"definition":715,"category":579,"aliases":716,"links":720,"related":721,"readMore":-1,"target":723,"hasArticle":346},"staff-augmentation","Staff augmentation","Модель найма, при которой инженеры внешнего партнёра входят в вашу команду и работают под вашим управлением — в вашем репозитории, ваших спринтах, вашем процессе, — а не сдают отдельный проект. Вы покупаете ресурс; код и контекст остаются у вас.",[717,718,719],"аутстаффинг","расширение команды","выделенные разработчики",[],[722,628],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":725,"term":726,"definition":727,"category":545,"aliases":728,"links":732,"related":735,"readMore":-1,"target":737,"hasArticle":346},"tls","TLS","Слой шифрования под HTTPS. Он подтверждает, что сервер именно тот, о ком говорит его сертификат, согласует свежий ключ на сессию и шифрует всё дальнейшее — сеть между вами видит шифртекст и не может незаметно его изменить.",[729,730,731],"SSL","HTTPS","Transport Layer Security",[733],{"kind":369,"url":734},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[736,542],"end-to-end-encryption","\u002Fglossary#tls",{"slug":628,"term":739,"definition":740,"category":579,"aliases":741,"links":744,"related":747,"readMore":-1,"target":748,"hasArticle":346},"Time to market","Время от решения строить продукт до момента, когда им пользуются настоящие люди. Большинство споров о стеке и объёме работ — на самом деле споры об этом числе: каждая сэкономленная неделя — это неделя выручки, обратной связи и позиции на рынке.",[742,743],"TTM","время выхода на рынок",[745],{"kind":369,"url":746},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[576,722],"\u002Fglossary#time-to-market",{"slug":750,"term":751,"definition":752,"category":545,"aliases":753,"links":755,"related":760,"readMore":-1,"target":762,"hasArticle":346},"webrtc","WebRTC","Браузерный и мобильный стандарт для передачи аудио, видео и данных напрямую между двумя устройствами; серверы участвуют только в том, чтобы их познакомить. На нём строят видеозвонок внутри приложения, когда не берут готовый SDK.",[754],"Web Real-Time Communication",[756,758],{"kind":341,"url":757},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":369,"url":759},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[761,214],"xmpp","\u002Fglossary#webrtc",{"slug":214,"term":764,"definition":765,"category":545,"aliases":766,"links":767,"related":770,"readMore":-1,"target":771,"hasArticle":346},"WebSocket","Протокол, который держит одно соединение между клиентом и сервером открытым, чтобы любая сторона могла отправить данные в любой момент, а не клиент спрашивал снова и снова. На нём работают живые котировки, чаты и статусы присутствия.",[],[768],{"kind":369,"url":769},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[443,401],"\u002Fglossary#websocket",{"slug":587,"term":773,"definition":774,"category":579,"aliases":775,"links":778,"related":781,"readMore":782,"target":782,"hasArticle":322},"White-label","Один продукт, выпускаемый под многими брендами. White-label платформа собирает каждому клиенту готовое к публикации приложение со своим названием, оформлением и контентом из общей кодовой базы, а не форкает проект под заказчика.",[776,777],"белый лейбл","мультитенантное приложение",[779],{"kind":369,"url":780},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[576],"\u002Fglossary\u002Fwhite-label",{"slug":761,"term":784,"definition":785,"category":545,"aliases":786,"links":789,"related":794,"readMore":-1,"target":795,"hasArticle":346},"XMPP","Открытый федеративный протокол обмена сообщениями и давняя альтернатива тому, чтобы писать чат-бэкенд самому или арендовать чужой. Он покрывает статусы присутствия, индикаторы набора и передачу файлов, а зрелые клиентские библиотеки есть под любую платформу.",[787,788],"Jabber","Extensible Messaging and Presence Protocol",[790,792],{"kind":341,"url":791},"https:\u002F\u002Fxmpp.org\u002F",{"kind":369,"url":793},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[750,214],"\u002Fglossary#xmpp",{"slug":797,"term":798,"definition":799,"category":579,"aliases":800,"links":804,"related":807,"readMore":-1,"target":808,"hasArticle":346},"in-app-purchase","Встроенные покупки","Продажа цифровых товаров и подписок через биллинг Apple и Google, который оба стора требуют для цифрового контента и с которого берут комиссию. Сложность никогда не в самой покупке, а в её восстановлении на новом устройстве и в честном учёте прав доступа.",[801,802,803],"in-app purchase","IAP","внутренние покупки",[805],{"kind":354,"url":806},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[618],"\u002Fglossary#in-app-purchase",{"slug":357,"term":810,"definition":811,"category":336,"aliases":812,"links":817,"related":820,"readMore":821,"target":821,"hasArticle":322},"Диплинкинг","Ссылка, которая открывает конкретный экран внутри установленного приложения, а не его главную или веб-страницу. Отложенный диплинкинг переживает установку: нажатие, прошедшее через магазин приложений, всё равно приводит на нужный экран.",[813,814,815,816],"deep linking","отложенный диплинкинг","Universal Links","Android App Links",[818],{"kind":369,"url":819},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[348,358],"\u002Fglossary\u002Fdeep-linking",{"slug":823,"term":824,"definition":825,"category":393,"aliases":826,"links":830,"related":833,"readMore":-1,"target":834,"hasArticle":346},"multi-arch-image","Мультиархитектурный образ","Один тег образа, который разрешается в разные бинарники для каждой архитектуры процессора — обычно это пара linux\u002Famd64 и linux\u002Farm64, — так что один и тот же docker pull работает без изменений и на серверах Intel\u002FAMD, и на ноутбуках с Apple Silicon.",[827,828,829],"мультиарх-сборка","multi-arch build","linux\u002Famd64 + linux\u002Farm64",[831],{"kind":354,"url":832},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[418],"\u002Fglossary#multi-arch-image",{"slug":687,"term":836,"definition":837,"category":393,"aliases":838,"links":841,"related":844,"readMore":-1,"target":846,"hasArticle":346},"Мультитенантность","Один развёрнутый бэкенд обслуживает много клиентов, и каждый видит только свои данные, конфигурацию и включённые функции, потому что контекст тенанта определяется для каждого запроса. Именно это делает линейку брендированных приложений одним продуктом, а не набором форков.",[687,839,840],"мультиарендность","тенант",[842],{"kind":369,"url":843},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[587,845],"feature-flags","\u002Fglossary#multi-tenancy",{"slug":372,"term":848,"definition":849,"category":393,"aliases":850,"links":854,"related":857,"readMore":-1,"target":858,"hasArticle":346},"Объектное хранилище","Хранилище, которое держит файл целиком под ключом, а не в дереве файловой системы, — Amazon S3 и множество сервисов, совместимых с его API. Дешёвое, практически безграничное, привычное место для сырых событий, бэкапов и медиа: пишется один раз, читается редко, хранится вечно.",[851,852,853],"S3","S3-совместимое хранилище","блоб-хранилище",[855],{"kind":369,"url":856},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[361],"\u002Fglossary#object-storage",{"slug":641,"term":860,"definition":861,"category":379,"aliases":862,"links":866,"related":869,"readMore":-1,"target":870,"hasArticle":346},"Ограничение частоты запросов","Предел на число запросов от одного клиента за заданный интервал. Именно он не даёт одному увлечённому пользователю, скраперу или боту потратить месячный бюджет платного API за вечер, и стоять он должен на вашей стороне интеграции.",[863,864,865],"rate limiting","рейт-лимит","троттлинг",[867],{"kind":369,"url":868},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[631],"\u002Fglossary#rate-limiting",{"slug":872,"term":873,"definition":874,"category":336,"aliases":875,"links":878,"related":881,"readMore":-1,"target":882,"hasArticle":346},"platform-channels","Платформенные каналы","Мост, через который Flutter-приложение вызывает нативный код iOS и Android — Keychain и Keystore, биометрию, платёжные шторки, любой SDK без Dart-пакета. Работа рутинная, но настоящая, и первое место, где споткнётся инженер, не выходивший за пределы Dart.",[876,877],"platform channels","method channel",[879],{"kind":354,"url":880},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":884,"term":885,"definition":886,"category":545,"aliases":887,"links":890,"related":893,"readMore":-1,"target":894,"hasArticle":346},"post-quantum-cryptography","Постквантовая криптография","Алгоритмы шифрования, рассчитанные на устойчивость к будущему квантовому компьютеру; стандарты уже финализированы NIST. Мигрировать нужно до появления железа: трафик, записанный сегодня, расшифруют, когда такая машина появится.",[888,889],"PQC","постквантовое шифрование",[891],{"kind":369,"url":892},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[725,736],"\u002Fglossary#post-quantum-cryptography",{"slug":896,"term":897,"definition":898,"category":379,"aliases":899,"links":903,"related":904,"readMore":-1,"target":905,"hasArticle":346},"staged-rollout","Поэтапная раскатка","Релиз сначала на небольшой процент пользователей и расширение только тогда, когда доля сессий без падений держится. Плохая сборка, пойманная на десяти процентах, — испорченный вечер; она же на ста процентах — испорченная неделя.",[900,901,902],"staged rollout","phased release","канареечный релиз",[],[845,376],"\u002Fglossary#staged-rollout",{"slug":418,"term":907,"definition":908,"category":393,"aliases":909,"links":915,"related":918,"readMore":-1,"target":919,"hasArticle":346},"Реестр контейнеров","Хранилище образов контейнеров, адресуемых по имени и тегу, — Docker Hub, GitHub Container Registry или собственный реестр облачного провайдера. Публикация сборки в реестр превращает «у меня работает» в образ, который любой может скачать и запустить без изменений.",[910,911,912,913,914],"реестр образов","Docker registry","GHCR","ghcr.io","container registry",[916],{"kind":354,"url":917},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[405,823],"\u002Fglossary#container-registry",{"slug":507,"term":921,"definition":922,"category":393,"aliases":923,"links":926,"related":929,"readMore":-1,"target":930,"hasArticle":346},"Серверный рендеринг","Сборка страницы в готовый HTML на сервере, чтобы первый же ответ содержал контент, заголовки, метатеги и структурированные данные. Краулеры, превью ссылок и медленные устройства читают это, не выполняя JavaScript.",[924,925],"SSR","server-side rendering",[927],{"kind":369,"url":928},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[497],"\u002Fglossary#server-side-rendering",{"slug":736,"term":932,"definition":933,"category":393,"aliases":934,"links":938,"related":941,"readMore":-1,"target":942,"hasArticle":346},"Сквозное шифрование","Шифрование, которое накладывается на устройстве отправителя и снимается только на устройстве получателя, так что сервис, передающий сообщение, не может его прочитать — ни по решению суда, ни после взлома. Оно защищает содержимое, но никогда — метаданные.",[935,936,937],"E2EE","end-to-end encryption","оконечное шифрование",[939],{"kind":369,"url":940},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[725,542],"\u002Fglossary#end-to-end-encryption",{"slug":722,"term":944,"definition":945,"category":579,"aliases":946,"links":949,"related":952,"readMore":-1,"target":953,"hasArticle":346},"Совокупная стоимость владения","Во что продукт обходится за всю жизнь, а не только на этапе разработки: поддержка, обновления, ежегодные миграции на новые ОС и правила сторов, вторая команда, чтобы две кодовые базы не расходились. Обычно больше сметы на разработку и почти никогда в неё не входит.",[947,948],"TCO","total cost of ownership",[950],{"kind":369,"url":951},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[628],"\u002Fglossary#total-cost-of-ownership",{"slug":239,"term":955,"definition":956,"category":393,"aliases":957,"links":961,"related":964,"readMore":-1,"target":965,"hasArticle":346},"Управление состоянием","То, как приложение решает, где живёт значение, кому позволено его менять и какие части экрана перерисовываются, когда оно меняется. Во Flutter выбор между Riverpod, BLoC и Provider — одно из первых архитектурных решений и одно из самых трудных для пересмотра.",[958,959,960],"state management","BLoC","Riverpod",[962],{"kind":354,"url":963},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[463],"\u002Fglossary#state-management",{"slug":845,"term":967,"definition":968,"category":379,"aliases":969,"links":973,"related":976,"readMore":-1,"target":977,"hasArticle":346},"Фиче-флаги","Переключатели, которые включают и выключают функциональность из конфигурации, а не из релиза. Один бинарник ведёт себя по-разному для разных брендов, рынков и пользователей, а рискованную фичу можно погасить, не отправляя новую сборку на ревью.",[970,971,972],"feature flags","фиче-флаги","feature toggle",[974],{"kind":369,"url":975},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[896,587,687],"\u002Fglossary#feature-flags",{"slug":979,"term":980,"definition":981,"category":393,"aliases":982,"links":986,"related":989,"readMore":-1,"target":990,"hasArticle":346},"floating-point","Числа с плавающей точкой","Двоичный формат IEEE 754, стоящий за double и float. Он не хранит 0.1 точно, поэтому 0.1 + 0.2 даёт 0.30000000000000004 — незаметно в графике и фатально в деньгах, которым место в целых минорных единицах или в decimal-типе.",[983,984,985],"IEEE 754","double","плавающая запятая",[987],{"kind":369,"url":988},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point"]