💁♂️ На техдолг можно забить
.
.
.
если любите запах горящего прода по утрам
Одно утро началось с "у нас жопка с Intercom" от CTO. Пользователи в поддержке видят чужие сообщения.
Нашли статью, собрались консилиумом. Я читаю — и понимаю: накосячил я.
Хронология фиаско:
— очень давно завёл Account с id "на будущее", оставил TODO (на скрине). Тогда бэк еще не присылал id, поэтому оставил так;
— позже добавил чтение id из JWT, но не для Account;
— когда понадобилось использовать id, в одном месте взял его из JWT, а в другом — из Account.
Бомба взорвалась, когда пользователи с одинаковым именем пришли в саппорт.
Хотфикснули, почистили пользователей.
Вывод: техдолг обычно не взрывается сразу. Он копится и стреляет в самый неожиданный момент. Не копите техдолг.
.
.
.
если любите запах горящего прода по утрам
Одно утро началось с "у нас жопка с Intercom" от CTO. Пользователи в поддержке видят чужие сообщения.
Нашли статью, собрались консилиумом. Я читаю — и понимаю: накосячил я.
Хронология фиаско:
— очень давно завёл Account с id "на будущее", оставил TODO (на скрине). Тогда бэк еще не присылал id, поэтому оставил так;
— позже добавил чтение id из JWT, но не для Account;
— когда понадобилось использовать id, в одном месте взял его из JWT, а в другом — из Account.
Бомба взорвалась, когда пользователи с одинаковым именем пришли в саппорт.
Хотфикснули, почистили пользователей.
Вывод: техдолг обычно не взрывается сразу. Он копится и стреляет в самый неожиданный момент. Не копите техдолг.
👍6😱1
🪛 Архитектура Android-приложений
На Хабре и в других блогах регулярно выходят статьи про архитектуру Android приложений. Особенно часто — про устройство presentation слоя: вью, вью модель, немного затрагивают домен, почти никогда внешние зависимости.
Это любопытно: несмотря на официальные рекомендации Google, сообщество продолжает искать свои решения.
Почему?
Гайдлайны от Google (как и любые другие) дают каркас, но в реальных проектах остаётся много открытых вопросов. Их сложно закрыть одним рецептом: разные ожидания от продукта, окружение, требования по безопасности и UX часто конфликтуют — отсюда новые компромиссные подходы.
Если сказать кратко, любое «плохое» решение в проекте можно оправдать его эволюцией 😆
Пара интересных статей последних месяцев:
• Compose + Koin + Jetpack Navigation: что мы поняли за 2 года
• Демоприложения: как жить, когда у вас 90+ application-модулей
• Разбираем чистую архитектуру в Android: от а до я
• Функциональное программирование в Android. Побочные эффекты и ELM-архитектура
• Архитектура Android. Понятно и подробно
На Хабре и в других блогах регулярно выходят статьи про архитектуру Android приложений. Особенно часто — про устройство presentation слоя: вью, вью модель, немного затрагивают домен, почти никогда внешние зависимости.
Это любопытно: несмотря на официальные рекомендации Google, сообщество продолжает искать свои решения.
Почему?
Гайдлайны от Google (как и любые другие) дают каркас, но в реальных проектах остаётся много открытых вопросов. Их сложно закрыть одним рецептом: разные ожидания от продукта, окружение, требования по безопасности и UX часто конфликтуют — отсюда новые компромиссные подходы.
Если сказать кратко, любое «плохое» решение в проекте можно оправдать его эволюцией 😆
Пара интересных статей последних месяцев:
• Compose + Koin + Jetpack Navigation: что мы поняли за 2 года
• Демоприложения: как жить, когда у вас 90+ application-модулей
• Разбираем чистую архитектуру в Android: от а до я
• Функциональное программирование в Android. Побочные эффекты и ELM-архитектура
• Архитектура Android. Понятно и подробно
👍4
Какую версию студии используете?
Anonymous Poll
86%
Только стабильная версия
3%
Только Canary
11%
Установлено обе версии
Нашел очень интересную статью по тому, как лучше реализовать загрузку данных во вью модели.
Прочитал и закрыл. Снова открыл и снова прочитал. Короче, никак не отпускало. Под её влиянием написал предыдущий пост про статьи по архитектуре.
Поскольку статья была на английском, решил перевести и адаптировать её для Хабра.
Забирайте, может пригодиться в ваших приложениях!
https://habr.com/ru/articles/950494/
Прочитал и закрыл. Снова открыл и снова прочитал. Короче, никак не отпускало. Под её влиянием написал предыдущий пост про статьи по архитектуре.
Поскольку статья была на английском, решил перевести и адаптировать её для Хабра.
Забирайте, может пригодиться в ваших приложениях!
https://habr.com/ru/articles/950494/
Хабр
Загрузка данных во ViewModel: рекомендации и Flow-based архитектура
Дискуссии об архитектуре Android часто перерастают в жаркие споры, вызывая и восторг, и резкую критику. Писать на такие темы непросто, и именно поэтому это стоит делать. Эта статья показывает мой...
❤7🔥4🌚1
🚀 Kotlin 2.2.0: context-sensitive resolution (preview)
В новой версии kotlin можно опускать префиксы типов!
Было:
Стало:
Теперь компилятор понимает из контекста:
— subject в when
— явный return type
— тип переменной
— is / as проверки
— sealed иерархии
— тип параметра
🟢 Как включить:
1️⃣ Добавляем аргумент компилятора
2️⃣ Скачиваем Android Studio 2025.2+. Иначе конструкция будет подсвечиваться как ошибка в IDE
----
🧪 Пока preview, может поменяться. Зато код становится заметно чище.
В новой версии kotlin можно опускать префиксы типов!
Было:
when (payment) {
Payment.Card -> println("💳")
Payment.Cash -> println("💵")
}
Стало:
when (payment) {
Card -> println("💳")
Cash -> println("💵")
}
Теперь компилятор понимает из контекста:
— subject в when
— явный return type
— тип переменной
— is / as проверки
— sealed иерархии
— тип параметра
🟢 Как включить:
1️⃣ Добавляем аргумент компилятора
freeCompilerArgs += "-Xcontext-sensitive-resolution"
2️⃣ Скачиваем Android Studio 2025.2+. Иначе конструкция будет подсвечиваться как ошибка в IDE
----
🧪 Пока preview, может поменяться. Зато код становится заметно чище.
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
👨🎨 Тени в Jetpack Compose
В Compose 1.9 добавили новые тени: модификаторы
Возможно, не все знают (я сам узнал совсем недавно), что привычный
Чем ближе объект к источнику света, тем тень больше "уходит" под объект. Внизу экрана тень вытягивается вниз.
На видео видно как тень меняется при скролле. Чтобы было еще заметнее, сделал её красной
В Compose 1.9 добавили новые тени: модификаторы
dropShadow и innerShadow. До этого уже был shadow. В чем разница?Возможно, не все знают (я сам узнал совсем недавно), что привычный
shadow формирует тень за счет имитации источника света вверху экрана. Тень получается красивая, естественная, но есть нюанс. Чем ближе объект к источнику света, тем тень больше "уходит" под объект. Внизу экрана тень вытягивается вниз.
На видео видно как тень меняется при скролле. Чтобы было еще заметнее, сделал её красной
👀2
💁️️️️️️ Тень от
Это решили добавлением новых модификаторов
Теперь тень можно настраивать по нескольким параметрам:
- radius — размытие по краям, “мягкость” тени
- spread — расширение или сужение тени относительно границ объекта
- offset — смещение тени по осям X и Y
Эти параметры позволяют как бы задать индивидуальный источник света для каждого объекта. Кроме того, значения
Можете сами увидеть разницу
shadow — часто не та, что ожидает дизайнер.Это решили добавлением новых модификаторов
dropShadow и innerShadow. Теперь тень можно настраивать по нескольким параметрам:
- radius — размытие по краям, “мягкость” тени
- spread — расширение или сужение тени относительно границ объекта
- offset — смещение тени по осям X и Y
Эти параметры позволяют как бы задать индивидуальный источник света для каждого объекта. Кроме того, значения
dropShadow и innerShadow теперь близки к тем, что используются в Figma — поэтому повторить дизайн из макета стало проще.Можете сами увидеть разницу
shadow и dropShadow👍2
В анонсе Compose 1.9, как мне кажется, уделили незаслуженно мало внимания новым теням. Поэтому держите годную статью по новому апи и его возможностям:
The Art of Shadows in Jetpack Compose
The Art of Shadows in Jetpack Compose
Medium
The Art of Shadows in Jetpack Compose
Redefining depth without elevation.
✍1❤1
🔪 Material Icons — всё
В релизе Compose от 24 сентября убрали зависимость от библиотеки material-icons-core. Этот артефакт больше не поддерживается и не рекомендуется к использованию, поскольку он:
Это означает, что при обновлении Compose ваш проект скорее всего перестанет собираться, если вы используете пакет androidx.compose.material.icons (например, часто используется Icons)
✅ Новый рекомендуемый способ — Material Symbols. Нужно просто качать иконки с сайта Google Fonts
Обходной путь — добавить зависимость на material-icons-core вручную. Подойдёт в качестве временного решения, если миграция слишком долгая или вам действительно нужны те самые иконки.
В релизе Compose от 24 сентября убрали зависимость от библиотеки material-icons-core. Этот артефакт больше не поддерживается и не рекомендуется к использованию, поскольку он:
содержит устаревшие по внешнему виду и ощущениям иконки и значительно увеличивает время сборки
Это означает, что при обновлении Compose ваш проект скорее всего перестанет собираться, если вы используете пакет androidx.compose.material.icons (например, часто используется Icons)
✅ Новый рекомендуемый способ — Material Symbols. Нужно просто качать иконки с сайта Google Fonts
Обходной путь — добавить зависимость на material-icons-core вручную. Подойдёт в качестве временного решения, если миграция слишком долгая или вам действительно нужны те самые иконки.
Google Fonts
Material Symbols and Icons - Google Fonts
Material Symbols are our newest icons consolidating over 2,500 glyphs in a single font file with a wide range of design variants.
🐳2😢1
Переписка с поддержкой Google 🤩
— REJECT: У вас неправильно заполнена финансовая декларация
— Я бы хотел подать апелляцию. Помогите понять, что не так?
— Ваша апелляция рассмотрена. У вас неправильно заполнена финансовая декларация. Хорошего дня
😹
Справедливости ради, ответили за день, относительно быстро
— REJECT: У вас неправильно заполнена финансовая декларация
— Я бы хотел подать апелляцию. Помогите понять, что не так?
— Ваша апелляция рассмотрена. У вас неправильно заполнена финансовая декларация. Хорошего дня
😹
Справедливости ради, ответили за день, относительно быстро
👏5👍1🎉1
🧯 Обычный апдейт Compose. Минус регистрация. Минус прод. Минус утро.
Всё началось с утреннего “регистрация не работает” от саппорта. Сначала подумал, что какой-то очень специфический случай, но количество обращений очень быстро росло. Запустил приложение у себя и не смог ничего нажать на экране. Я в ступоре, потому что просто нет идей, почему это может не работать.
Всё оказалось довольно интересно и превратилось в небольшое расследование.
Предыстория:
У нас есть KYC Safety шторка (на скрине). Она показывается блокирующе перед KYC.
Мы договорились, что закрыть её можно только по кнопке:
— нет крестика ❌
— не работает системный Back ⬅️
— нельзя свайпнуть вниз 👇
Всё началось с утреннего “регистрация не работает” от саппорта. Сначала подумал, что какой-то очень специфический случай, но количество обращений очень быстро росло. Запустил приложение у себя и не смог ничего нажать на экране. Я в ступоре, потому что просто нет идей, почему это может не работать.
Всё оказалось довольно интересно и превратилось в небольшое расследование.
Предыстория:
У нас есть KYC Safety шторка (на скрине). Она показывается блокирующе перед KYC.
Мы договорились, что закрыть её можно только по кнопке:
— нет крестика ❌
— не работает системный Back ⬅️
— нельзя свайпнуть вниз 👇
Как выглядит код Bottom Sheet для бодрого утра:
Вот эта строка блокирует свайп:
А вот эта — закрытие по Back:
И раньше всё это работало. Но после обновления Compose до BOM 2025.10.00 (а с ним — и Material3 до версии 1.4.0) всё сломалось.
В changelog видно, что Bottom Sheet сильно переработали — улучшили, но, видимо, поменяли логику открытия.
📉 Что изменилось:
Раньше шторка сразу открывалась, а
Теперь же он вызывается сразу при открытии.
А поскольку я возвращаю
Результат:
Шторка не видна, но Window диалога уже оказывается поверх UI и перехватывает все клики 🤯
В итоге экран как будто блокируется, и выйти из этого состояния невозможно 🙃
Про это изменение в changelog — ни слова. Но по описанию апдейта легко представить, где зацепили.
🧯 Починилось так:
Уже на ревью в сторе. Это было бодрое утро!
JazariModalBottomSheet(
onDismissed = onDismissed,
sheetState = rememberModalBottomSheetState(confirmValueChange = { false }),
properties = ModalBottomSheetProperties(shouldDismissOnBackPress = false),
) {
KycSafetyInternal(onButtonClick = { dismiss() })
}
Вот эта строка блокирует свайп:
confirmValueChange = { false }
А вот эта — закрытие по Back:
shouldDismissOnBackPress = false
И раньше всё это работало. Но после обновления Compose до BOM 2025.10.00 (а с ним — и Material3 до версии 1.4.0) всё сломалось.
В changelog видно, что Bottom Sheet сильно переработали — улучшили, но, видимо, поменяли логику открытия.
📉 Что изменилось:
Раньше шторка сразу открывалась, а
confirmValueChange вызывался только при изменении состояния (например, при свайпе).Теперь же он вызывается сразу при открытии.
А поскольку я возвращаю
false, шторка не может показаться из Hidden состояния.Результат:
Шторка не видна, но Window диалога уже оказывается поверх UI и перехватывает все клики 🤯
В итоге экран как будто блокируется, и выйти из этого состояния невозможно 🙃
Про это изменение в changelog — ни слова. Но по описанию апдейта легко представить, где зацепили.
🧯 Починилось так:
sheetState = rememberModalBottomSheetState { it != SheetValue.Hidden }
Уже на ревью в сторе. Это было бодрое утро!
🔥10
🎄 Итоги года и немного личного
Я пропал почти на два месяца — не случайно. Год вышел плотным, местами выматывающим, но очень насыщенным.
Коротко про главное:
— перешёл из Кинопоиска в стартап Jazari — сложный и важный шаг
— Jazari от идеи и прототипов доехал до продакшена
— появились реальные пользователи, деньги, ошибки и ночи с хотфиксами
— было много продуктовых решений, переделок экранов, архитектурных сомнений и техдолга, но и огромное удовольствие от принятых решений
Этот год напомнил:
— лучше попробовать, чем жалеть
— гайдлайны не заменяют реальный опыт
— «редкие кейсы» всегда всплывают (всегда не вовремя)
— паузы нужны, чтобы не выгореть
В следующем году хочу писать регулярнее, но без обязаловки:
про Android, Compose, архитектуру, продукт, факапы и практику.
Спасибо всем, кто читает и делится опытом. Даже при 175 людях это ощущается как живой разговор ❤️
С наступающим!
🎅
Я пропал почти на два месяца — не случайно. Год вышел плотным, местами выматывающим, но очень насыщенным.
Коротко про главное:
— перешёл из Кинопоиска в стартап Jazari — сложный и важный шаг
— Jazari от идеи и прототипов доехал до продакшена
— появились реальные пользователи, деньги, ошибки и ночи с хотфиксами
— было много продуктовых решений, переделок экранов, архитектурных сомнений и техдолга, но и огромное удовольствие от принятых решений
Этот год напомнил:
— лучше попробовать, чем жалеть
— гайдлайны не заменяют реальный опыт
— «редкие кейсы» всегда всплывают (всегда не вовремя)
— паузы нужны, чтобы не выгореть
В следующем году хочу писать регулярнее, но без обязаловки:
про Android, Compose, архитектуру, продукт, факапы и практику.
Спасибо всем, кто читает и делится опытом. Даже при 175 людях это ощущается как живой разговор ❤️
С наступающим!
🎅
🎄12❤3🎉3
🤖 22 января — день Android разработчика!
...но только в Додо Пицце.
Когда-то работал в Додо. Так получилось, что в команде в один момент оказалось аж 4 (четыре!) Android разработчика с днём рождения 22 января. Конечно, были идеи добавить дату рождения В ТРЕБОВАНИЯ ВАКАНСИИ 😁
Одного из них вы даже скорее всего знаете — это Макс, автор канала Мобильное чтиво
Двое других — на фото (сам не ожидал откопать!)
🎂Поздравляю с прошедшим днём рождения себя и этих классных ребят, с которыми работали вместе:
Макс, Елдос, Лёха, успехов вам во всём! 🤟
А что так поздно? Готовил подарок! Об этом сразу следующий пост 👇
...но только в Додо Пицце.
Когда-то работал в Додо. Так получилось, что в команде в один момент оказалось аж 4 (четыре!) Android разработчика с днём рождения 22 января. Конечно, были идеи добавить дату рождения В ТРЕБОВАНИЯ ВАКАНСИИ 😁
Одного из них вы даже скорее всего знаете — это Макс, автор канала Мобильное чтиво
Двое других — на фото (сам не ожидал откопать!)
🎂Поздравляю с прошедшим днём рождения себя и этих классных ребят, с которыми работали вместе:
Макс, Елдос, Лёха, успехов вам во всём! 🤟
А что так поздно? Готовил подарок! Об этом сразу следующий пост 👇
🔥6
Недавно в Jazari делали экран с горизонтальным пейджингом. Нужна была индикация выбранной страницы. Посмотрел на рекомендации Google, посмотрел библиотеки, и всё равно написал своё.
Есть интерсные моменты, поэтому решил устроить стрим с разбором! Приходите пообщаться, послушать, пообсуждать варианты.
В среду будем разбирать Paging Indicator 🔘🟢🔘🔘 https://youtube.com/live/qDNuGDhJUA4
Есть интерсные моменты, поэтому решил устроить стрим с разбором! Приходите пообщаться, послушать, пообсуждать варианты.
В среду будем разбирать Paging Indicator 🔘🟢🔘🔘 https://youtube.com/live/qDNuGDhJUA4
Youtube
- YouTube
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
👍6
Android & Coffee с Васей
Недавно в Jazari делали экран с горизонтальным пейджингом. Нужна была индикация выбранной страницы. Посмотрел на рекомендации Google, посмотрел библиотеки, и всё равно написал своё. Есть интерсные моменты, поэтому решил устроить стрим с разбором! Приходите…
🍿Готовьте попкорн для стрима, посмотрим 2-3 разных библиотеки для Paging Indicator, будем пробовать в реальном времени, смотреть код
Стартуем через полчаса!
Стартуем через полчаса!
👍1
Android & Coffee с Васей
🍿Готовьте попкорн для стрима, посмотрим 2-3 разных библиотеки для Paging Indicator, будем пробовать в реальном времени, смотреть код Стартуем через полчаса!
Стрим откладывается по техническим причинам
Технические причины: 😄
Технические причины: 😄
😁10😢7