#мобильная_разработка — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #мобильная_разработка, aggregated by home.social.
-
Книга: «System Design. Проектирование мобильных систем. Подготовка к сложному интервью»
Привет, Хаброжители! Что вас ждет на интервью по проектированию мобильных систем (MSD)? Что делать, если вас попросят разработать новый YouTube или телеграм? Практическое руководство MSD превращает сложные собеседования в предсказуемый процесс. Вы получаете 5-шаговую схему эффективного прохождения интервью и разбор 7 реальных кейсов (лента новостей, мессенджер, YouTube, Google Drive, трейдинговая платформа и др.), позволяющих проектировать архитектуру клиента, API, офлайн-режим, кэширование и масштабируемость. Здесь вы найдете готовые шаблоны, trade-off’ы и шпаргалки — всё, чтобы уверенно проходить интервью в топ-компаниях и расти от мидла до стафф+.
https://habr.com/ru/companies/piter/articles/1039648/
#system_design #сюй #мобильная_разработка #вебразработка #котлин #kotlin
-
iPad как инструмент разработчика в эпоху агентного программирования
Ещё несколько лет назад разговоры об iPad как полноценном инструменте разработчика воспринимались скептически. Машинка для Netflix, блокнот для набросков, планшет для презентаций — но только не рабочая среда для написания и деплоя кода. У этого скептицизма были основания: iPadOS долго не имела нормальной многозадачности, инструментов для работы с серверами почти не существовало, а необходимость постоянно переключаться между приложениями делала любой серьёзный рабочий процесс мучительным. Сегодня картина изменилась кардинально, и сразу по двум причинам, которые усиливают друг друга.
https://habr.com/ru/articles/1039526/
#iPad #iPadOS #SSH #Git #DevOps #iOS_разработка #агентный_ИИ #Claude_Code #мобильная_разработка #Stage_Manager
-
iPad как инструмент разработчика в эпоху агентного программирования
Ещё несколько лет назад разговоры об iPad как полноценном инструменте разработчика воспринимались скептически. Машинка для Netflix, блокнот для набросков, планшет для презентаций — но только не рабочая среда для написания и деплоя кода. У этого скептицизма были основания: iPadOS долго не имела нормальной многозадачности, инструментов для работы с серверами почти не существовало, а необходимость постоянно переключаться между приложениями делала любой серьёзный рабочий процесс мучительным. Сегодня картина изменилась кардинально, и сразу по двум причинам, которые усиливают друг друга.
https://habr.com/ru/articles/1039526/
#iPad #iPadOS #SSH #Git #DevOps #iOS_разработка #агентный_ИИ #Claude_Code #мобильная_разработка #Stage_Manager
-
iPad как инструмент разработчика в эпоху агентного программирования
Ещё несколько лет назад разговоры об iPad как полноценном инструменте разработчика воспринимались скептически. Машинка для Netflix, блокнот для набросков, планшет для презентаций — но только не рабочая среда для написания и деплоя кода. У этого скептицизма были основания: iPadOS долго не имела нормальной многозадачности, инструментов для работы с серверами почти не существовало, а необходимость постоянно переключаться между приложениями делала любой серьёзный рабочий процесс мучительным. Сегодня картина изменилась кардинально, и сразу по двум причинам, которые усиливают друг друга.
https://habr.com/ru/articles/1039526/
#iPad #iPadOS #SSH #Git #DevOps #iOS_разработка #агентный_ИИ #Claude_Code #мобильная_разработка #Stage_Manager
-
iPad как инструмент разработчика в эпоху агентного программирования
Ещё несколько лет назад разговоры об iPad как полноценном инструменте разработчика воспринимались скептически. Машинка для Netflix, блокнот для набросков, планшет для презентаций — но только не рабочая среда для написания и деплоя кода. У этого скептицизма были основания: iPadOS долго не имела нормальной многозадачности, инструментов для работы с серверами почти не существовало, а необходимость постоянно переключаться между приложениями делала любой серьёзный рабочий процесс мучительным. Сегодня картина изменилась кардинально, и сразу по двум причинам, которые усиливают друг друга.
https://habr.com/ru/articles/1039526/
#iPad #iPadOS #SSH #Git #DevOps #iOS_разработка #агентный_ИИ #Claude_Code #мобильная_разработка #Stage_Manager
-
Про BDUI грабли на примере простого опросника, который не так прост, как кажется
Однажды у нас появилась задача, которая (на первый взгляд) выглядела очень простой: сделать опросник в приложении. На макетах всего лишь пара экранов, несколько вопросов, кнопка «Далее». Всё красиво, не сухо, с картинками у вариантов ответа и нормальной подачей, а не в формате «Заполните обязательные поля» Судя по макету всё просто: сверстать флоу и отправить все ответы одним POST в конце. Самый короткий путь — зашить вопросы, переходы и тексты на клиенте. Делов на пару дней — сделал и забыл. Но если опросник перестаёт быть одноразовой анкетой, а становится частью живого продукта, начинается веселье: сегодня нужно поменять текст, завтра - картинку, потом - порядок вопросов, потом - ветвление, потом - похожий сценарий для другой группы пользователей. Каждая правка текста, картинки, порядка вопросов или маршрута снова уезжает в релизный цикл web, iOS и Android. А синхронизировать такие изменения между тремя платформами намного сложнее, чем кажется на старте. По некоторым косвенным признакам мы понимали, что с этой анкетой всё будет именно так, поэтому в качестве альтернативы мы выбрали путь backend-driven UI, когда клиент показывает поддерживаемые типы экранов, а backend управляет сценарием: текстами, изображениями, порядком шагов, переходами и состоянием прохождения. Ниже расскажу почему мы пошли в backend-driven подход, где он действительно помог, а где показал явные ограничения и мог выбить нас из сроков.
https://habr.com/ru/companies/alfa/articles/1036748/
#bdui #мобильная_разработка #системный_анализ #backendразработка
-
Переезд с XML на Jetpack Compose на проде: базовые классы, архитектура, сложности и готовые решения
Меня зовут Родион, и я уже около 2,5 лет работаю в VK Android-разработчиком в крупном многомодульном проекте с сотнями экранов и довольно большой аудиторией. Когда я попал на проект, стек был классическим и проверенным: XML-вёрстка, навигация через Cicerone, Dagger 2 для DI, Coroutines и Flow для асинхронщины, а в качестве архитектурного паттерна — MVVM. Рано или поздно любая растущая кодовая база упирается в потолок своих архитектурных решений. У нас этот момент настал, когда количество экранов выросло до нескольких сотен и команда начала тратить больше времени на борьбу с неконсистентным состоянием UI. Классическая связка XML + ViewBinding + MVVM работала, но с каждым новым экраном мы всё острее чувствовали её ограничения: разрозненные StateFlow, дублирование кода во фрагментах, сложность переиспользования компонентов. Нужно было что-то менять — пересмотреть сам подход к построению UI. Так мы начали миграцию на Jetpack Compose (который на момент начала перехода уже был стабильным и самодостаточным). Полтора года спустя, пройдя через рефакторинг базовых классов, переход с MVVM на MVI и постепенную замену содержимого всех фрагментов, мы получили стек, на котором разработка ускорилась, а баги, связанные с состоянием экрана, практически исчезли. Полный переход на Jetpack Compose мы разделили на три больших этапа: - переписываем содержимое всех фрагментов на ComposeView; - переходим с Dagger2 на Koin; - меняем навигацию с Cicerone на Compose-навигацию. О втором и третьем этапах кратко расскажу ниже — в главе стратегии перехода, а на первом этапе остановлюсь подробнее. В этой статье не будет разбора плюсов и минусов Jetpack Compose, скорее она будет полезна тем, кто уже знаком с технологией, хочет её использовать, но боится нести в проект. Я расскажу, как мы шаг за шагом выполняли первый этап, и к чему в итоге пришли.
https://habr.com/ru/companies/vk/articles/1036772/
#android #jetpackcompose #мобильная_разработка #архитекура_приложений #kotlin #mvvm #mvi
-
[Перевод] Flutter 3.44 Конец эпохи CocoaPods и начало расцвета Swift Package Manager
Экосистема Flutter совершила один из самых значительных скачков вперед. С выходом Flutter 3.44 команда официально сделала Swift Package Manager (SwiftPM) менеджером зависимостей по умолчанию для iOS и macOS, ознаменовав начало конца эпохи CocoaPods. Но это еще не все. Этот релиз также знаменует собой серьезный архитектурный сдвиг в том, как поставляются виджеты Material и Cupertino. Давайте углубимся в детали.
https://habr.com/ru/articles/1036834/
#flutter #dart #android #ios #material #cupertino #мобильная_разработка #кроссплатформенность #кроссплатформенное_программирование #кроссплатформенная_разработка
-
[Перевод] Flutter 3.44 Конец эпохи CocoaPods и начало расцвета Swift Package Manager
Экосистема Flutter совершила один из самых значительных скачков вперед. С выходом Flutter 3.44 команда официально сделала Swift Package Manager (SwiftPM) менеджером зависимостей по умолчанию для iOS и macOS, ознаменовав начало конца эпохи CocoaPods. Но это еще не все. Этот релиз также знаменует собой серьезный архитектурный сдвиг в том, как поставляются виджеты Material и Cupertino. Давайте углубимся в детали.
https://habr.com/ru/articles/1036834/
#flutter #dart #android #ios #material #cupertino #мобильная_разработка #кроссплатформенность #кроссплатформенное_программирование #кроссплатформенная_разработка
-
[Перевод] Flutter 3.44 Конец эпохи CocoaPods и начало расцвета Swift Package Manager
Экосистема Flutter совершила один из самых значительных скачков вперед. С выходом Flutter 3.44 команда официально сделала Swift Package Manager (SwiftPM) менеджером зависимостей по умолчанию для iOS и macOS, ознаменовав начало конца эпохи CocoaPods. Но это еще не все. Этот релиз также знаменует собой серьезный архитектурный сдвиг в том, как поставляются виджеты Material и Cupertino. Давайте углубимся в детали.
https://habr.com/ru/articles/1036834/
#flutter #dart #android #ios #material #cupertino #мобильная_разработка #кроссплатформенность #кроссплатформенное_программирование #кроссплатформенная_разработка
-
[Перевод] Flutter 3.44 Конец эпохи CocoaPods и начало расцвета Swift Package Manager
Экосистема Flutter совершила один из самых значительных скачков вперед. С выходом Flutter 3.44 команда официально сделала Swift Package Manager (SwiftPM) менеджером зависимостей по умолчанию для iOS и macOS, ознаменовав начало конца эпохи CocoaPods. Но это еще не все. Этот релиз также знаменует собой серьезный архитектурный сдвиг в том, как поставляются виджеты Material и Cupertino. Давайте углубимся в детали.
https://habr.com/ru/articles/1036834/
#flutter #dart #android #ios #material #cupertino #мобильная_разработка #кроссплатформенность #кроссплатформенное_программирование #кроссплатформенная_разработка
-
Не только смартфоны: 5 сфер, где нужны мобильные разработчики
Хабр, привет! Меня зовут Борис Денисенко. Я мобильный разработчик и наставник на курсе
https://habr.com/ru/companies/yandex_praktikum/articles/1031664/
#android #мобильная_разработка #android_development #android_разработка #android_разработчик #kotlin #kotlin_multiplatform #java #ios_development #ios_разработка
-
Push-уведомления в мессенджере: production-грабли которых нет в туториалах
Это девятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но я её давно хотел разобрать, потому что туториалов в интернете много, а production-граблей в них почти нет. Если коротко, туториал по push выглядит так. Регистрируешь токен через Notifications.getExpoPushTokenAsync() . Отправляешь на бэкенд. Когда приходит пуш — addNotificationResponseReceivedListener ловит тап, навигируешь в нужный экран. Всё. В реальном мессенджере таких туториалов недостаточно. Появляется десяток узких проблем. Пуш приходит когда юзер уже в этом чате. Пуш приходит когда приложение убито системой. Navigation после открытия из пуша добавляет дублирующийся экран в стек. На iOS звонки идут через отдельный канал VoIP который требует совершенно другой инфраструктуры. Эти грабли я и разберу.
https://habr.com/ru/articles/1035992/
#react_native #push_notifications #expo #fcm #apns #callkit #voip #мессенджер #мобильная_разработка #deep_linking
-
Push-уведомления в мессенджере: production-грабли которых нет в туториалах
Это девятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но я её давно хотел разобрать, потому что туториалов в интернете много, а production-граблей в них почти нет. Если коротко, туториал по push выглядит так. Регистрируешь токен через Notifications.getExpoPushTokenAsync() . Отправляешь на бэкенд. Когда приходит пуш — addNotificationResponseReceivedListener ловит тап, навигируешь в нужный экран. Всё. В реальном мессенджере таких туториалов недостаточно. Появляется десяток узких проблем. Пуш приходит когда юзер уже в этом чате. Пуш приходит когда приложение убито системой. Navigation после открытия из пуша добавляет дублирующийся экран в стек. На iOS звонки идут через отдельный канал VoIP который требует совершенно другой инфраструктуры. Эти грабли я и разберу.
https://habr.com/ru/articles/1035992/
#react_native #push_notifications #expo #fcm #apns #callkit #voip #мессенджер #мобильная_разработка #deep_linking
-
Push-уведомления в мессенджере: production-грабли которых нет в туториалах
Это девятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но я её давно хотел разобрать, потому что туториалов в интернете много, а production-граблей в них почти нет. Если коротко, туториал по push выглядит так. Регистрируешь токен через Notifications.getExpoPushTokenAsync() . Отправляешь на бэкенд. Когда приходит пуш — addNotificationResponseReceivedListener ловит тап, навигируешь в нужный экран. Всё. В реальном мессенджере таких туториалов недостаточно. Появляется десяток узких проблем. Пуш приходит когда юзер уже в этом чате. Пуш приходит когда приложение убито системой. Navigation после открытия из пуша добавляет дублирующийся экран в стек. На iOS звонки идут через отдельный канал VoIP который требует совершенно другой инфраструктуры. Эти грабли я и разберу.
https://habr.com/ru/articles/1035992/
#react_native #push_notifications #expo #fcm #apns #callkit #voip #мессенджер #мобильная_разработка #deep_linking
-
Push-уведомления в мессенджере: production-грабли которых нет в туториалах
Это девятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но я её давно хотел разобрать, потому что туториалов в интернете много, а production-граблей в них почти нет. Если коротко, туториал по push выглядит так. Регистрируешь токен через Notifications.getExpoPushTokenAsync() . Отправляешь на бэкенд. Когда приходит пуш — addNotificationResponseReceivedListener ловит тап, навигируешь в нужный экран. Всё. В реальном мессенджере таких туториалов недостаточно. Появляется десяток узких проблем. Пуш приходит когда юзер уже в этом чате. Пуш приходит когда приложение убито системой. Navigation после открытия из пуша добавляет дублирующийся экран в стек. На iOS звонки идут через отдельный канал VoIP который требует совершенно другой инфраструктуры. Эти грабли я и разберу.
https://habr.com/ru/articles/1035992/
#react_native #push_notifications #expo #fcm #apns #callkit #voip #мессенджер #мобильная_разработка #deep_linking
-
Почему мало просто перейти на SwiftUI и Compose: заглядываем под капот перезапуска приложения Бургер Кинг
Когда старый монолит начинает мешать процессам в разработке, первое, что обычно приходит в голову командам — это переезд на новый стек. Логика понятна: сделаем новый UI, почистим код, а дальше и разработка пойдет бодрее. Чаще всего такое решение — очень дорогая иллюзия. Потому что в бигтехе проблема обычно не в UI, а в связности компонентов, зависимости фронта от бэка, сложных релизах и фичах, которые требуют синхронной работы команды. Мы — разработчики Surf, Android и iOS команды: Светлана Сорокина, Антон Бояркин и Алексей Рябков. Когда начали работать с Бургер Кинг над трансформацией приложения, столкнулись с похожей историей. Поэтому мы решили переписать архитектуру так, чтобы разные подрядчики могли нормально работать вместе, а продукт — развиваться быстрее.
https://habr.com/ru/articles/1034430/
#мобильная_разработка #мобильные_приложения #бигтех #бургер_кинг #фронтендразработка #разработка_под_android #разработка_под_ios #перезапуск #архитектура_приложений #процесс_разработки
-
Почему мало просто перейти на SwiftUI и Compose: заглядываем под капот перезапуска приложения Бургер Кинг
Когда старый монолит начинает мешать процессам в разработке, первое, что обычно приходит в голову командам — это переезд на новый стек. Логика понятна: сделаем новый UI, почистим код, а дальше и разработка пойдет бодрее. Чаще всего такое решение — очень дорогая иллюзия. Потому что в бигтехе проблема обычно не в UI, а в связности компонентов, зависимости фронта от бэка, сложных релизах и фичах, которые требуют синхронной работы команды. Мы — разработчики Surf, Android и iOS команды: Светлана Сорокина, Антон Бояркин и Алексей Рябков. Когда начали работать с Бургер Кинг над трансформацией приложения, столкнулись с похожей историей. Поэтому мы решили переписать архитектуру так, чтобы разные подрядчики могли нормально работать вместе, а продукт — развиваться быстрее.
https://habr.com/ru/articles/1034430/
#мобильная_разработка #мобильные_приложения #бигтех #бургер_кинг #фронтендразработка #разработка_под_android #разработка_под_ios #перезапуск #архитектура_приложений #процесс_разработки
-
Почему мало просто перейти на SwiftUI и Compose: заглядываем под капот перезапуска приложения Бургер Кинг
Когда старый монолит начинает мешать процессам в разработке, первое, что обычно приходит в голову командам — это переезд на новый стек. Логика понятна: сделаем новый UI, почистим код, а дальше и разработка пойдет бодрее. Чаще всего такое решение — очень дорогая иллюзия. Потому что в бигтехе проблема обычно не в UI, а в связности компонентов, зависимости фронта от бэка, сложных релизах и фичах, которые требуют синхронной работы команды. Мы — разработчики Surf, Android и iOS команды: Светлана Сорокина, Антон Бояркин и Алексей Рябков. Когда начали работать с Бургер Кинг над трансформацией приложения, столкнулись с похожей историей. Поэтому мы решили переписать архитектуру так, чтобы разные подрядчики могли нормально работать вместе, а продукт — развиваться быстрее.
https://habr.com/ru/articles/1034430/
#мобильная_разработка #мобильные_приложения #бигтех #бургер_кинг #фронтендразработка #разработка_под_android #разработка_под_ios #перезапуск #архитектура_приложений #процесс_разработки
-
Почему мало просто перейти на SwiftUI и Compose: заглядываем под капот перезапуска приложения Бургер Кинг
Когда старый монолит начинает мешать процессам в разработке, первое, что обычно приходит в голову командам — это переезд на новый стек. Логика понятна: сделаем новый UI, почистим код, а дальше и разработка пойдет бодрее. Чаще всего такое решение — очень дорогая иллюзия. Потому что в бигтехе проблема обычно не в UI, а в связности компонентов, зависимости фронта от бэка, сложных релизах и фичах, которые требуют синхронной работы команды. Мы — разработчики Surf, Android и iOS команды: Светлана Сорокина, Антон Бояркин и Алексей Рябков. Когда начали работать с Бургер Кинг над трансформацией приложения, столкнулись с похожей историей. Поэтому мы решили переписать архитектуру так, чтобы разные подрядчики могли нормально работать вместе, а продукт — развиваться быстрее.
https://habr.com/ru/articles/1034430/
#мобильная_разработка #мобильные_приложения #бигтех #бургер_кинг #фронтендразработка #разработка_под_android #разработка_под_ios #перезапуск #архитектура_приложений #процесс_разработки
-
Outbox-паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет
Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов. Сценарий с которого всё началось у меня. Пользователь в чате выбирает большое видео, нажимает отправить. Видео начинает грузиться. Пользователь нетерпеливый, прокручивает вверх посмотреть переписку, потом переходит в другой чат, потом возвращается. Что должен он увидеть? В Telegram он увидит свой видео-бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения , потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает. Это боль которая лечится не "правильным useState", а отдельным архитектурным слоем . Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.
https://habr.com/ru/articles/1034690/
#react_native #мессенджер #optimistic_update #outbox #мобильная_разработка #архитектура #telegram #асинхронность #обработка_ошибок #retry
-
Outbox-паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет
Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов. Сценарий с которого всё началось у меня. Пользователь в чате выбирает большое видео, нажимает отправить. Видео начинает грузиться. Пользователь нетерпеливый, прокручивает вверх посмотреть переписку, потом переходит в другой чат, потом возвращается. Что должен он увидеть? В Telegram он увидит свой видео-бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения , потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает. Это боль которая лечится не "правильным useState", а отдельным архитектурным слоем . Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.
https://habr.com/ru/articles/1034690/
#react_native #мессенджер #optimistic_update #outbox #мобильная_разработка #архитектура #telegram #асинхронность #обработка_ошибок #retry
-
Outbox-паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет
Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов. Сценарий с которого всё началось у меня. Пользователь в чате выбирает большое видео, нажимает отправить. Видео начинает грузиться. Пользователь нетерпеливый, прокручивает вверх посмотреть переписку, потом переходит в другой чат, потом возвращается. Что должен он увидеть? В Telegram он увидит свой видео-бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения , потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает. Это боль которая лечится не "правильным useState", а отдельным архитектурным слоем . Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.
https://habr.com/ru/articles/1034690/
#react_native #мессенджер #optimistic_update #outbox #мобильная_разработка #архитектура #telegram #асинхронность #обработка_ошибок #retry
-
Outbox-паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет
Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов. Сценарий с которого всё началось у меня. Пользователь в чате выбирает большое видео, нажимает отправить. Видео начинает грузиться. Пользователь нетерпеливый, прокручивает вверх посмотреть переписку, потом переходит в другой чат, потом возвращается. Что должен он увидеть? В Telegram он увидит свой видео-бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения , потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает. Это боль которая лечится не "правильным useState", а отдельным архитектурным слоем . Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.
https://habr.com/ru/articles/1034690/
#react_native #мессенджер #optimistic_update #outbox #мобильная_разработка #архитектура #telegram #асинхронность #обработка_ошибок #retry
-
Как я сделал на Flutter игру для разработчиков
Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито . В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025. Однажды у меня под рукой оказался датасет из иконок различных фреймворков и языков программирования. Так я решил разработать приложение, где нужно как можно быстрее находить и выбирать иконки языков программирования среди случайных иконок. До этого я не занимался разработкой и публикацией мобильных игр и приложений, но решил пройти весь путь с нуля. Статью разделим на две части: в первой расскажу как создавал первую версию игры и с какими трудностями столкнулся, а во второй — как мы готовили игру к конференции.
https://habr.com/ru/companies/avito/articles/1032250/
#flutter #gamedev #авито #мобильная_разработка #мобильные_игры #dart
-
Как я сделал на Flutter игру для разработчиков
Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито . В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025. Однажды у меня под рукой оказался датасет из иконок различных фреймворков и языков программирования. Так я решил разработать приложение, где нужно как можно быстрее находить и выбирать иконки языков программирования среди случайных иконок. До этого я не занимался разработкой и публикацией мобильных игр и приложений, но решил пройти весь путь с нуля. Статью разделим на две части: в первой расскажу как создавал первую версию игры и с какими трудностями столкнулся, а во второй — как мы готовили игру к конференции.
https://habr.com/ru/companies/avito/articles/1032250/
#flutter #gamedev #авито #мобильная_разработка #мобильные_игры #dart
-
Как я сделал на Flutter игру для разработчиков
Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито . В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025. Однажды у меня под рукой оказался датасет из иконок различных фреймворков и языков программирования. Так я решил разработать приложение, где нужно как можно быстрее находить и выбирать иконки языков программирования среди случайных иконок. До этого я не занимался разработкой и публикацией мобильных игр и приложений, но решил пройти весь путь с нуля. Статью разделим на две части: в первой расскажу как создавал первую версию игры и с какими трудностями столкнулся, а во второй — как мы готовили игру к конференции.
https://habr.com/ru/companies/avito/articles/1032250/
#flutter #gamedev #авито #мобильная_разработка #мобильные_игры #dart
-
Как я сделал на Flutter игру для разработчиков
Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито . В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025. Однажды у меня под рукой оказался датасет из иконок различных фреймворков и языков программирования. Так я решил разработать приложение, где нужно как можно быстрее находить и выбирать иконки языков программирования среди случайных иконок. До этого я не занимался разработкой и публикацией мобильных игр и приложений, но решил пройти весь путь с нуля. Статью разделим на две части: в первой расскажу как создавал первую версию игры и с какими трудностями столкнулся, а во второй — как мы готовили игру к конференции.
https://habr.com/ru/companies/avito/articles/1032250/
#flutter #gamedev #авито #мобильная_разработка #мобильные_игры #dart
-
Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а
Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки. Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер. Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому. Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.
https://habr.com/ru/articles/1033930/
#webrtc #react_native #livekit #callkit #voip_push_notifications #trickle_ice #мобильная_разработка #звонки #мессенджер
-
Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а
Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки. Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер. Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому. Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.
https://habr.com/ru/articles/1033930/
#webrtc #react_native #livekit #callkit #voip_push_notifications #trickle_ice #мобильная_разработка #звонки #мессенджер
-
Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а
Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки. Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер. Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому. Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.
https://habr.com/ru/articles/1033930/
#webrtc #react_native #livekit #callkit #voip_push_notifications #trickle_ice #мобильная_разработка #звонки #мессенджер
-
Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а
Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки. Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер. Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому. Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.
https://habr.com/ru/articles/1033930/
#webrtc #react_native #livekit #callkit #voip_push_notifications #trickle_ice #мобильная_разработка #звонки #мессенджер
-
Как я сделал трёхуровневый кэш сообщений в мессенджере на React Native — и что узнал по дороге
Я делаю мессенджер ONEMIX на React Native. К моменту, когда я начал писать этот пост, в нём уже больше десятка экранов, групповые WebRTC-звонки через LiveKit, E2E на Double Ratchet + Sealed Sender, push-нотификации с cold-start навигацией и десктоп-версия на Electron. Но самым важным куском, который определяет ощущение от приложения, оказался не звук и не видео. А то, насколько быстро открывается чат. Если вы хоть раз делали список сообщений на React Native, вы знаете эту боль: открыл чат — пустой экран на 200–800 мс, потом подгрузка, потом скачок при докрутке наверх. В Telegram такого не бывает: открыл — мгновенно увидел последние сообщения, прокрутил наверх — никаких пустот, история идёт сплошной лентой. Я разбирался с этим несколько месяцев. В итоге пришёл к трёхуровневой архитектуре кэша, которую и хочу разобрать. Это не теория — это код, который сейчас работает в продакшне. Покажу как реализовано, какие были тупики и какие решения оказались критичными.
https://habr.com/ru/articles/1033502/
#react_native #sqlite #кэширование #expo #мессенджер #drizzle_orm #мобильная_разработка #производительность #архитектура #telegram
-
Как я сделал трёхуровневый кэш сообщений в мессенджере на React Native — и что узнал по дороге
Я делаю мессенджер ONEMIX на React Native. К моменту, когда я начал писать этот пост, в нём уже больше десятка экранов, групповые WebRTC-звонки через LiveKit, E2E на Double Ratchet + Sealed Sender, push-нотификации с cold-start навигацией и десктоп-версия на Electron. Но самым важным куском, который определяет ощущение от приложения, оказался не звук и не видео. А то, насколько быстро открывается чат. Если вы хоть раз делали список сообщений на React Native, вы знаете эту боль: открыл чат — пустой экран на 200–800 мс, потом подгрузка, потом скачок при докрутке наверх. В Telegram такого не бывает: открыл — мгновенно увидел последние сообщения, прокрутил наверх — никаких пустот, история идёт сплошной лентой. Я разбирался с этим несколько месяцев. В итоге пришёл к трёхуровневой архитектуре кэша, которую и хочу разобрать. Это не теория — это код, который сейчас работает в продакшне. Покажу как реализовано, какие были тупики и какие решения оказались критичными.
https://habr.com/ru/articles/1033502/
#react_native #sqlite #кэширование #expo #мессенджер #drizzle_orm #мобильная_разработка #производительность #архитектура #telegram
-
Как я сделал трёхуровневый кэш сообщений в мессенджере на React Native — и что узнал по дороге
Я делаю мессенджер ONEMIX на React Native. К моменту, когда я начал писать этот пост, в нём уже больше десятка экранов, групповые WebRTC-звонки через LiveKit, E2E на Double Ratchet + Sealed Sender, push-нотификации с cold-start навигацией и десктоп-версия на Electron. Но самым важным куском, который определяет ощущение от приложения, оказался не звук и не видео. А то, насколько быстро открывается чат. Если вы хоть раз делали список сообщений на React Native, вы знаете эту боль: открыл чат — пустой экран на 200–800 мс, потом подгрузка, потом скачок при докрутке наверх. В Telegram такого не бывает: открыл — мгновенно увидел последние сообщения, прокрутил наверх — никаких пустот, история идёт сплошной лентой. Я разбирался с этим несколько месяцев. В итоге пришёл к трёхуровневой архитектуре кэша, которую и хочу разобрать. Это не теория — это код, который сейчас работает в продакшне. Покажу как реализовано, какие были тупики и какие решения оказались критичными.
https://habr.com/ru/articles/1033502/
#react_native #sqlite #кэширование #expo #мессенджер #drizzle_orm #мобильная_разработка #производительность #архитектура #telegram
-
Как я сделал трёхуровневый кэш сообщений в мессенджере на React Native — и что узнал по дороге
Я делаю мессенджер ONEMIX на React Native. К моменту, когда я начал писать этот пост, в нём уже больше десятка экранов, групповые WebRTC-звонки через LiveKit, E2E на Double Ratchet + Sealed Sender, push-нотификации с cold-start навигацией и десктоп-версия на Electron. Но самым важным куском, который определяет ощущение от приложения, оказался не звук и не видео. А то, насколько быстро открывается чат. Если вы хоть раз делали список сообщений на React Native, вы знаете эту боль: открыл чат — пустой экран на 200–800 мс, потом подгрузка, потом скачок при докрутке наверх. В Telegram такого не бывает: открыл — мгновенно увидел последние сообщения, прокрутил наверх — никаких пустот, история идёт сплошной лентой. Я разбирался с этим несколько месяцев. В итоге пришёл к трёхуровневой архитектуре кэша, которую и хочу разобрать. Это не теория — это код, который сейчас работает в продакшне. Покажу как реализовано, какие были тупики и какие решения оказались критичными.
https://habr.com/ru/articles/1033502/
#react_native #sqlite #кэширование #expo #мессенджер #drizzle_orm #мобильная_разработка #производительность #архитектура #telegram
-
200 OK по протоколу, но не OK для клиента: автоматизация контроля совместимости API и приложения
Выпустить релиз — часы работы команды. Упасть на старте — 1 секунда. Узнать об этом не из отзывов пользователей — бесценно. Серверные тесты проходят, эндпоинт отвечает 200 OK, но мобильный клиент падает на первом же ответе API. Типичный сценарий: в user.id приходит null , у status появляется новое значение или меняется вложенная структура — и ответ API расходится с клиентскими моделями. Чтобы ловить такие расхождения до релиза, мы встроили в пайплайн контроль совместимости API и приложения. Этот слой решает две задачи: не даёт серверным изменениям ломать текущий клиент и проверяет совместимость предстоящего релиза с текущим бэкендом. При расхождении пайплайн останавливается на этапе проверки api, до build/archive/sign/publish. Я Алексей Матвеев, директор по мобильным технологиям в «Первой Форме». В статье расскажу, как мы задали архитектуру решения и делегировали ИИ рутинные задачи. В CI/CD мы проверяем ответы API по DTO и YAML-контрактам, а для сценариев изменения состояния сверяем «до/после». Итог сразу уходит в CI-лог и тред задачи.
https://habr.com/ru/companies/1forma/articles/1031610/
#мобильная_разработка #api_тестирование #cicd #devops #ai #llm #bpmсистемы #автоматизация #корпоративные_приложения
-
200 OK по протоколу, но не OK для клиента: автоматизация контроля совместимости API и приложения
Выпустить релиз — часы работы команды. Упасть на старте — 1 секунда. Узнать об этом не из отзывов пользователей — бесценно. Серверные тесты проходят, эндпоинт отвечает 200 OK, но мобильный клиент падает на первом же ответе API. Типичный сценарий: в user.id приходит null , у status появляется новое значение или меняется вложенная структура — и ответ API расходится с клиентскими моделями. Чтобы ловить такие расхождения до релиза, мы встроили в пайплайн контроль совместимости API и приложения. Этот слой решает две задачи: не даёт серверным изменениям ломать текущий клиент и проверяет совместимость предстоящего релиза с текущим бэкендом. При расхождении пайплайн останавливается на этапе проверки api, до build/archive/sign/publish. Я Алексей Матвеев, директор по мобильным технологиям в «Первой Форме». В статье расскажу, как мы задали архитектуру решения и делегировали ИИ рутинные задачи. В CI/CD мы проверяем ответы API по DTO и YAML-контрактам, а для сценариев изменения состояния сверяем «до/после». Итог сразу уходит в CI-лог и тред задачи.
https://habr.com/ru/companies/1forma/articles/1031610/
#мобильная_разработка #api_тестирование #cicd #devops #ai #llm #bpmсистемы #автоматизация #корпоративные_приложения
-
200 OK по протоколу, но не OK для клиента: автоматизация контроля совместимости API и приложения
Выпустить релиз — часы работы команды. Упасть на старте — 1 секунда. Узнать об этом не из отзывов пользователей — бесценно. Серверные тесты проходят, эндпоинт отвечает 200 OK, но мобильный клиент падает на первом же ответе API. Типичный сценарий: в user.id приходит null , у status появляется новое значение или меняется вложенная структура — и ответ API расходится с клиентскими моделями. Чтобы ловить такие расхождения до релиза, мы встроили в пайплайн контроль совместимости API и приложения. Этот слой решает две задачи: не даёт серверным изменениям ломать текущий клиент и проверяет совместимость предстоящего релиза с текущим бэкендом. При расхождении пайплайн останавливается на этапе проверки api, до build/archive/sign/publish. Я Алексей Матвеев, директор по мобильным технологиям в «Первой Форме». В статье расскажу, как мы задали архитектуру решения и делегировали ИИ рутинные задачи. В CI/CD мы проверяем ответы API по DTO и YAML-контрактам, а для сценариев изменения состояния сверяем «до/после». Итог сразу уходит в CI-лог и тред задачи.
https://habr.com/ru/companies/1forma/articles/1031610/
#мобильная_разработка #api_тестирование #cicd #devops #ai #llm #bpmсистемы #автоматизация #корпоративные_приложения
-
200 OK по протоколу, но не OK для клиента: автоматизация контроля совместимости API и приложения
Выпустить релиз — часы работы команды. Упасть на старте — 1 секунда. Узнать об этом не из отзывов пользователей — бесценно. Серверные тесты проходят, эндпоинт отвечает 200 OK, но мобильный клиент падает на первом же ответе API. Типичный сценарий: в user.id приходит null , у status появляется новое значение или меняется вложенная структура — и ответ API расходится с клиентскими моделями. Чтобы ловить такие расхождения до релиза, мы встроили в пайплайн контроль совместимости API и приложения. Этот слой решает две задачи: не даёт серверным изменениям ломать текущий клиент и проверяет совместимость предстоящего релиза с текущим бэкендом. При расхождении пайплайн останавливается на этапе проверки api, до build/archive/sign/publish. Я Алексей Матвеев, директор по мобильным технологиям в «Первой Форме». В статье расскажу, как мы задали архитектуру решения и делегировали ИИ рутинные задачи. В CI/CD мы проверяем ответы API по DTO и YAML-контрактам, а для сценариев изменения состояния сверяем «до/после». Итог сразу уходит в CI-лог и тред задачи.
https://habr.com/ru/companies/1forma/articles/1031610/
#мобильная_разработка #api_тестирование #cicd #devops #ai #llm #bpmсистемы #автоматизация #корпоративные_приложения
-
Simplphoto для iPhone объединяет ручную камеру, stop motion и коллажи
Разработка iOS-приложения для ручной съёмки на iPhone: ISO, выдержка, фокус, RAW, stop motion и попытка ограничить вычислительную обработку снимков. Описываю принцип работы приложения.
https://habr.com/ru/articles/1031606/
#iOS #swift #мобильная_разработка #мобильная_разработка_ios #iPhone #камера #фотография #мобильное_приложение
-
Simplphoto для iPhone объединяет ручную камеру, stop motion и коллажи
Разработка iOS-приложения для ручной съёмки на iPhone: ISO, выдержка, фокус, RAW, stop motion и попытка ограничить вычислительную обработку снимков. Описываю принцип работы приложения.
https://habr.com/ru/articles/1031606/
#iOS #swift #мобильная_разработка #мобильная_разработка_ios #iPhone #камера #фотография #мобильное_приложение
-
Simplphoto для iPhone объединяет ручную камеру, stop motion и коллажи
Разработка iOS-приложения для ручной съёмки на iPhone: ISO, выдержка, фокус, RAW, stop motion и попытка ограничить вычислительную обработку снимков. Описываю принцип работы приложения.
https://habr.com/ru/articles/1031606/
#iOS #swift #мобильная_разработка #мобильная_разработка_ios #iPhone #камера #фотография #мобильное_приложение
-
Simplphoto для iPhone объединяет ручную камеру, stop motion и коллажи
Разработка iOS-приложения для ручной съёмки на iPhone: ISO, выдержка, фокус, RAW, stop motion и попытка ограничить вычислительную обработку снимков. Описываю принцип работы приложения.
https://habr.com/ru/articles/1031606/
#iOS #swift #мобильная_разработка #мобильная_разработка_ios #iPhone #камера #фотография #мобильное_приложение
-
Вредные советы для Flutter-разработчика
Назидательная статья, написанная в стихах и вдохновленная детскими книгами. Посвящается всем ошибкам, которые я совершал на работе — большим и маленьким.
-
Вредные советы для Flutter-разработчика
Назидательная статья, написанная в стихах и вдохновленная детскими книгами. Посвящается всем ошибкам, которые я совершал на работе — большим и маленьким.
-
Вредные советы для Flutter-разработчика
Назидательная статья, написанная в стихах и вдохновленная детскими книгами. Посвящается всем ошибкам, которые я совершал на работе — большим и маленьким.
-
Вредные советы для Flutter-разработчика
Назидательная статья, написанная в стихах и вдохновленная детскими книгами. Посвящается всем ошибкам, которые я совершал на работе — большим и маленьким.
-
Пишем логический калькулятор, лёжа на диване: как Termux и Си заменяют IDE, когда лень вставать
Говорят, для программирования на Си нужен стол, стул, мощный ПК и Linux. У меня другой стек: диван, планшет на Андроиде и Termux. Но иногда мой монитор помещается в карман — это смартфон. В этой статье я расскажу, как небольшая лень привела к созданию пяти версий логического калькулятора и почему мобильный кодинг — это не только боль, но и своеобразная свобода. Противостояние против индустрии Идея родилась внезапно. Захотелось проверить одну логическую схему, но вставать и идти к компьютеру было выше моих сил. Так началось моё «преступление» против канонов профессиональной разработки. Инструментарий Чтобы превратить диван в рабочее место, мне понадобился стандартный набор для Termux: <cut />
https://habr.com/ru/articles/1027400/
#C #Termux #Android #Программирование #Логика #Консоль #DIY #Мобильная_разработка
-
Пишем логический калькулятор, лёжа на диване: как Termux и Си заменяют IDE, когда лень вставать
Говорят, для программирования на Си нужен стол, стул, мощный ПК и Linux. У меня другой стек: диван, планшет на Андроиде и Termux. Но иногда мой монитор помещается в карман — это смартфон. В этой статье я расскажу, как небольшая лень привела к созданию пяти версий логического калькулятора и почему мобильный кодинг — это не только боль, но и своеобразная свобода. Противостояние против индустрии Идея родилась внезапно. Захотелось проверить одну логическую схему, но вставать и идти к компьютеру было выше моих сил. Так началось моё «преступление» против канонов профессиональной разработки. Инструментарий Чтобы превратить диван в рабочее место, мне понадобился стандартный набор для Termux: <cut />
https://habr.com/ru/articles/1027400/
#C #Termux #Android #Программирование #Логика #Консоль #DIY #Мобильная_разработка