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