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