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