Внезапно сменил работу
Кажется, буквально только что прогремела моя статья о собеседованиях, феерично завершившаяся попаданием в 2ГИС. Восемь месяцев — чертовски маленький срок. Никогда не занимался «джобхоппингом», так что и сейчас не открывал резюме, не искал работу, готовился к аттестации. Встроился в процессы, накупил корпоративного мерча, подружился с коллегами и стал регулярно ездить в офис (который при мне перенесли в другое здание и расширили). Уже прям ассоциировал себя с 2ГИС.
Но внезапно мне сделали очень заманчивое предложение. Такое, от которого невозможно отказаться. Позвали в расширяющуюся финтех-компанию архитектором на новые продукты. Очень грустно уходить из 2ГИС, но я бы себя не простил, если бы не воспользовался открывшейся возможностью.
Сегодня на теперь уже старом месте работы было exit-интервью. Кстати, хорошая практика — компания обращает внимание на особенности в статистике увольнений. Задавали вопросы о том, что было хорошо, а что можно улучшить.
Вообще впечатления от 2ГИС самые тёплые. Из плюсов я бы выделил развитую корпоративную культуру и приятную атмосферу работы (не в последнюю очередь благодаря коллегам). Я с удовольствием читал внутренний новостной портал, ходил на презентации фич и самопрезентации новичков, участвовал в местных квизах. Прям сильный косяк вышел только с хакатоном, я вам об этом писал, но там скорее всего просто конкретные организаторы лажанули.
Одна из самых крутых киллер-фич 2ГИС, как работодателя — упрощённое взятие выходных и отпусков. По большей части не нужно никаких специальных согласований, если ты внезапно повёз ребёнка к врачу, или сам устал и хочешь денёк отоспаться.
Однако, в других местах отсутствие формализма порождает сложности. В Росатоме, например, процессы движения задач по жизненному циклу были зарегламентированы сильнее: нельзя передать что-то в разработку без аналитики, постановщик задачи сам следит за её статусами, задача целиком переназначается всегда на текущего одного ответственного человека (на стадии разработки на программиста, на стадии тестирования на тестировщика и т.д.). В 2ГИС иногда задачи приходили от бизнеса с необходимостью самостоятельно ходить по людям и уточнять, что на самом деле хотели. Делалось это как бы для экономии на аналитиках, что лично мне кажется большим заблуждением: бизнес таким образом платил за время более дорогого программиста, который ещё и выполнял работу аналитика дольше, потому что специализируется на другом. В итоге то, что казалось экономией, в моём понимании было скорее увеличением расходов и сроков. То же самое касалось, например, архитектуры и техдолга (но это типичная проблема подавляющего большинства бизнесов — техдолг вообще никто не умеет считать и оценивать).
Я бы сказал так: 2ГИС как бы вырос из стартапа и стал практически бигтехом, особенно после покупки Сбером. Если не бигтехом, то энтерпрайзом точно. Но в итоге оставил часть недостатков стартапа (экономия на «второстепенных» вещах, отсутствие регламентов) и получил часть недостатков энтерпрайза (слабое влияние сотрудников на конечный продукт, очень затянутое планирование и согласование новых задач, заметное количество легаси).
С другой стороны в той же мере присутствуют одновременно плюсы стартапа (простые организационные процессы, неформальная атмосфера) и плюсы энтерпрайза (стабильная компания с офисами, конкурентными зарплатами, рыночным белым оформлением, айти брендом и корпоративной культурой).
Если вы дисциплинированы, компетентны и не боитесь некоторых трудностей, то я однозначно готов советовать работу в 2ГИС. Сейчас идёт набор разработчиков на C#, Go, дата-саентистов, присоединяйтесь :) Уровни мидл и сеньор.
#dev@clockstackwheels#life@clockstackwheels
🤖Credential Manager теперь умеет отдавать верифицированный email без OTP
Google начала выпускать криптографически верифицированные email credentials прямо на Android-устройства. Получить их можно через Credential Manager API, который реализует стандарт W3C Digital Credentials API.
Механика простая: пользователь тапает "Sign up" или фокусируется на поле ввода email, появляется нативный bottom sheet с описанием запрашиваемых данных, один тап на "Agree and continue" - и приложение получает верифицированный адрес мгновенно. Никакого перехода в почту, никаких кодов.
Три сценария, где это применимо:
👉 Регистрация - вместе с получением email сразу инициировать создание passkey
👉 Восстановление аккаунта - больше не нужно искать письмо с recovery кодом в спаме
👉 Step-up аутентификация - для подтверждения чувствительных действий без OTP
‼️ВАЖНО: верифицируется только email. Имя, фамилия, фото профиля доступны, но не верифицированы. Поддерживаются только личные аккаунты.
#Android#AndroidDev
🤖Google выпустила Android CLI — новую командную строку для Android-разработки, которая умеет работать не только с человеком, но и с AI-агентами: Gemini CLI, Claude Code, Codex, Antigravity и любыми другими.
По замерам Google, в агентных сценариях CLI тратит на 70% меньше токенов на setup проекта и окружения и выполняет типовые задачи в 3 раза быстрее, чем когда агент разбирается через стандартные инструменты. Цифры от вендора, но механика понятная: один вызов android create вместо длинной цепочки команд.
Основные команды:
👉android sdk install — ставит только нужные компоненты SDK
👉android create — создание проекта из официальных шаблонов с актуальной архитектурой
👉android emulator и android run — работа с виртуальными девайсами и запуск приложения
👉android skills — подключение SKILL.md инструкций для агента: Navigation 3, edge-to-edge, миграция AGP 9, XML в Compose, анализ R8
👉android docs — доступ к актуальной документации Android, Firebase и Kotlin в обход устаревшего training cutoff модели
👉android update — обновление самого CLI
Установка
curl -fsSL https://dl.google.com/android/cli/latest/darwin_arm64/install.sh | bash
CLI пригодится не только с агентами: Google прямо позиционирует его для CI и скриптовой автоматизации.
Похоже, Google серьёзно перестраивает базовый тулинг под реальность, где рядом с разработчиком всегда есть агент. Пошёл пробовать в своих проектах.
🔗Анонс Android Developers Blog
#Android#AndroidDev
🤖 Google объявила о полноценной поддержке внешних дисплеев в Android (также нужна поддержка со стороны устройства)
Я попробовал подключить Pixel 9 Pro к внешнему 4K монитору по Type-C. Итог - зернистость такая, что пользоваться невозможно. В настройках выбрать выше FullHD не дает (возможно, ограничение моего устройства). Приложения можно растягивать как угодно, что порой приводит к проблемам их отображения и они не перестраиваются полностью. Начало хорошее, но очень много работы с разработчиками по адаптации под больши экраны и ресайз на лету.
Google дала множества библиотек и руководств по адаптации под большие экраны, а также как работать с несколькими дисплеями.
🔗 Источник - Android Developers Blog
#Android#AndroidDev
🤖Почему разработчик не контролирует, как выглядят уведомления в системной панели
Когда разработчик использует NotificationCompat.Builder для создания уведомлений из Android приложения, может показаться, что прямого контроля на внешний вид нету 🤯 На самом деле формируется не визуальный компонент, а объект данных, который описывает что есть в уведомление.
Этот объект — это просто структура, сериализуемая через Parcelable. Он передаётся в системный процесс через Binder — механизм межпроцессного взаимодействия в Android. А вот принимать и интерпретировать этот объект будет специальное системное приложение — SystemUI.
Уведомления отображаются не Android сам по себе, а конкретное приложение, которое называется com.android.systemui. И это приложение полностью отвечает за то, как будет выглядеть уведомление. Оно решает, какие поля отобразить, где их разместить, какой стиль применить, как будет выглядеть кнопка, будут ли видны иконки — и многое другое. Часть из данных может игнорироваться.
Вот почему одно и то же уведомление может выглядеть совершенно по-разному на разных устройствах и версиях ОС. Один и тот же вызов setContentTitle("Новость") может дать совершенно разный результат на Pixel с чистым Android и на Xiaomi с MIUI. Более того, даже RemoteViews, которые позволяют задавать кастомные layout’ы для уведомлений, могут игнорироваться или ограничиваться прошивками производителей.
Именно по этой причине я не люблю когда в уведомления вставляют Custom View, который выбивается из стиля и часто портит визуал системы и поведение. Мечтаю чтобы его поскорее запретили в Android. Пожалуйста, хотя бы в Android 17 🙏
Запомните ‼️ Уведомление в Android — это не UI объект, это контракт между приложением и SystemUI, который интерпретируется, а не исполняется дословно. Поэтому пишите уведомления так, чтобы они были понятны системе, а красоту UI вы можете контролировать только внутри вашего приложения.
#android#androiddev
Пример App Widget из Tier 1
👉 Персонализированы (работают с Material You)
👉 Используют всё доступное место
👉 Следуют лучшим практикам размещения компонентов
👉 Полезные для пользователя
#android#androiddev
📱В Android Emulator добавили нативную коммуникацию между эмуляторами
Раньше чтобы два эмулятора увидели друг друга по сети, надо было руками прописывать port forwarding. Каждый эмулятор жил в своей изолированной виртуальной песоцнице. Теперь новый сетевой стек поднимает общий виртуальную сеть для всех запущенных инстансов на одной машине — до 4 эмуляторов одновременно. Wi-Fi Direct и Network Service Discovery (NSD) работают из коробки, ничего настраивать не нужно.
Это вписывается в то, что Google активно делает последние пару лет: передача звонков между устройствами, кросс-девайсные сессии, Wear OS, Android Auto, XR-очки. Весь этот функционал раньше можно было нормально проверить только на реальных девайсах. Теперь это можно делать прямо в эмуляторе.
Для использования надо Andorid Emulator версии 36.5 или новее
🔗 Источник - android-developers.googleblog.com
#AndroidDev#AndroidStudio
🚀 Вышел Jetpack Paging 3.5.0 где добавили возможность получения данных как StateFlow
// В ViewModel
val pager = Pager(pagingConfig, pagingSourceFactory)
val pagerFlow: Flow<ItemSnapshotList> = pager.flow.asState()
// Пример в Compose
val snapshotFlow = viewModel.pagerFlow.collectAsStateWithLifecycle(initialList)
val snapshot = itemsFlow.value
LazyColumn {
items(items = snapshot.items) { ... }
}
Также появилась возможность явно вызвать загрузку новых страниц через методы append() и prepend(), а также refresh() и retry()
LazyColumn {
item {
LaunchedEffect(viewModel) { viewModel.prepend() }
}
items(snapshot.items) { item -> Text("Item: $item") }
item {
LaunchedEffect(viewModel) { viewModel.append() }
}
}
Кажется, что сделали жизнь проще, но мой опыт с Paging всегда упирался в проблемы кэширования и удобной работы в Data слое. Всегда считал эту библиотеку архитектурно неудачной и ждал когда же ее переделают полностью.
#Android#Jetpack#AndroidDev
🚀Jetpack Ink 1.0 стабильна! Библиотека для работы с рукописным вводом и графикой
Google выпустил стабильную версию Jetpack Ink 1.0 — библиотеку для создания продвинутых функций рукописного ввода (inking) и рисования в Android-приложениях.
Это многомодульная библиотека, которая обрабатывает цифровые штрихи (strokes) от ввода (стилус или палец) до их показа. Она предоставляет все необходимые инструменты для создания реалистичного и отзывчивого опыта письма или рисования.
👨💻 Кому будет полезна?
👉 Разработчикам приложений для заметок, скетчей, цифровых подписей.
👉 Образовательным приложениям, требующим аннотирования документов или изображений.
👉 Любому продукту, где нужен реалистичный, выразительный пользовательский ввод поверх контента.
Библиотека берет на себя сложности обработки графики, физики мазков и обработки жестов, позволяя легко добавить профессиональные функции рисования.
#Jetpack#AndroidDev#Android
🤖 Отлаживайте фоновые задачи в Android Studio как профи: Background Task Inspector для WokrManager
Работаете с WorkManager? Тогда вам точно пригодится встроенный в Android Studio инструмент — Background Task Inspector. Это ваш главный помощник для визуального мониторинга и отладки фоновых задач.
Что вы видите в инспекторе:
- Все WorkManager задачи в одном месте
- Текущие статусы: Running, Enqueued, Failed, Succeeded
- Детальную информацию о каждом воркере
Особенно мощно инструмент работает с цепочками задач:
// Например, у вас есть такая цепочка:
val workA = OneTimeWorkRequestBuilder<CleanupWorker>().build()
val workB = OneTimeWorkRequestBuilder<WaterColorFilterWorker>().build()
val workC = OneTimeWorkRequestBuilder<BlurEffectFilterColor>().build()
workManager
.beginWith(workA)
.then(workB)
.then(workC)
.enqueue()
Визуализация графа выполнения покажет:
- Какая задача завершилась успешно (Succeeded)
- Какая упала (Failed) и почему
- Как это повлияло на последующие задачи
Типичный сценарий отладки:
Видите статус «Enqueued»? Значит задача в очереди, но не запускается. Возможные причины:
- Ограничения не выполняются (нет сети, не заряжается устройство)
- Предыдущая задача в цепочке не завершилась
- Достигнут лимит параллельных задач
Преимущества использования:
- Экономия времени на логирование и отладку
- Наглядное представление сложных цепочек задач
- Быстрая диагностика проблем с выполнением фоновых операций
Инструмент уже ждет вас в Android Studio → View → Tool Windows → App Inspection → Background Task Inspector.
#AndroidStudio#Android#AndroidDev
🤖Android 16 QPR2 вышел — первый минорный релиз SDK с новыми API!
Google выпустил Android 16 QPR2 — первое минорное обновление платформы, которое приносит новые функции без ломающих изменений.
🔧Новый подход к версиям SDK
Теперь можно проверять минорные обновления через новые поля в Build:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA &&
Build.VERSION.SDK_INT_FULL >= Build.VERSION_CODES_FULL.BAKLAVA_1) {
// API из QPR2
}
Ключевые изменения:
👉Расширенная темная тема — система автоматически инвертирует интерфейс для доступности
👉Пользовательские формы иконок — пользователи могут менять форму всех иконок
👉Интерактивный шеринг — обновление контента в реальном времени в превью шаринга
👉Новый сборщик мусора — снижает нагрузку на CPU
Каждую фичу разберем подробнее в следующих постах! Подписывайте на @android_broadcast, чтобы не пропустить
#Android16#AndroidDev#Android
🤖 Пример работы расширенной темной темы с Compose приложением. Тут придется темную делать сам, так как настройка не повлияла
#android16#android#androiddev