Android | Михаил Белый
309 subscribers
272 photos
32 videos
127 links
Авторская песочница о карьере в IT в роли Mobile Dev (Android, Kotlin, Multiplatform) и разных вещах, которые мне интересны.

Посты каждый день в 5 вечера.

Автор: @michaelbel

Забустить: t.me/boost/foundout

Задонатить: boosty.to/michaelbel
Download Telegram
Для примера возьмем двух стахановцев: Аркадия и Арсения. Эти двое из ларца лутают по 300k/мес, планируют в 2024 отпуск на 14 дней и отработали 12 месяцев до месяца в котором будет отпуск.

👋 Аркадий решает продлить новогодний опохмел и выбирает даты отпуска:
15.01.202428.01.2024.
Из этих 2 недель: 10 – рабочие дни, 4 – выходные.
Всего в январе 17 рабочих дней. Аркадий отработает только 7 из них.
За предыдущие 12 месяцев доход Аркадия составил:
3 600 000₽ (300 000₽ * 12).
Средний дневной заработок Аркадия:
10 238₽ (3 600 000₽ / 12 / 29.3).
29.3 – это в среднем дней в месяце.
ЗП Аркадия за январь составит:
123 530₽ (300 000₽ / 17 * 7).
Отпускные Аркадия за январь:
143 332₽ (10 238₽ * 14).
Совокупный доход за январь:
266 862₽ (123 530₽ + 143 332₽).
У Арсения будет 300 000₽.

🏝 Арсений собрался в отпуск на тропический остров и выбирает даты:
15.07.202428.07.2024.
В июле целых 23 рабочих дня, из которых Арсений отработает 13.
Доход за год, средний дневной заработок и размер отпускных будет таким же как у Аркадия.
ЗП Арсения за июль составит:
169 565₽ (300 000₽ / 23 * 13).
Совокупный доход за июль:
312 897₽ (169 565₽ + 143 332₽).
У Аркадия будет 300 000₽.

Таким образом наши джентльмены сходили в одинаковый по продолжительности отпуск, но с разницей в 46k деревянных. Этот пример показывает, что иногда можно обнаружить на балансе приятную неожиданность, если плохо спланировать отпуск или будущие расходы. Есть много критериев определения точки безубыточности, если хочется упороться – заходи в калькулятор отпускных. Там можно указать предыдущие отпуска, больничные, командировки и простои.

Про что не забыть когда увольняешься?
Перерабатывать зарплату в выполненную работу надоело, решаешь сойти на берег. Не всегда получается отгулять все дни отпусков, они накапливаются несгораемой суммой. За них тебе положена компенсация, вообще за все время – хоть за 5 лет, хоть за 25. Компенсация платится деньгами. Отказать в ней не имеют права. За каждый отработанный месяц положены 2.33 дня оплачиваемого отпуска.

И самое главное: отпуск – это не способ заработать на компенсациях, а реализация твоего права на отдых. С любимой работы нужно уметь уходить домой.

#rest@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
631
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
621
Технический скрининг

Как-то раз, когда я был джун и глуп и не видал больших цифр в офферах, звонит мне рекрутер и спрашивает:
– Михаил, можем ли мы извне получить доступ к приватной переменной класса?
– Конечно можем!
– Эмм… нет не можем.
– Можем через рефлексию!
– Кажется, нам пора закругляться, до свидания!


class Bank {
private val money = "$300"
}

fun main() = runBlocking {
val money = Bank::class
.memberProperties
.first { it.name == "money" }
.apply { isAccessible = true }
.get(Bank()) as String
println(money)
}

Пальцем щелк и деньги в банк

Зачем нужен скрининг?
Техсобес – событие энергозатратное. Чтобы каждый залетный птиц с наскока туда не проскочил бизнес придумал фильтровать таких смелых и умелых еще на дальних подступах. Время и ресурсы сокращаются, флоу найма улучшается. Чтобы добраться до технической секции и показать, что мурку могешь, нужно сначала созвониться с эйчаром, послушать рассказ о компании/вакансии, позадавать свои вопросы. И иногда пройти технический скрининг – первичную проверку на харды в сжатом тайминге.

Какие вопросы задают?
Не суть важно, если уже подготовился к техсобесу. Будут вопросы базового уровня сложности, на которые есть очевидные и быстрые правильные ответы. Ответы должны показать подходишь ли ты на открытую позицию или нет. Совсем неготовые дисквалифицируются из воронки найма, остальные двигаются дальше.

Примеры:
🐗 Модификаторы доступа в котлине
🐗 Типы исключений в котлине
🐗 Parcelable vs Serializable
🐗 Hot Flow vs Cold Flow
🐗 FlatMap vs ConcatMap

Как правильно действовать?
Перейти с автомата на ручной режим. Выключить синдром отличника. Помнить что у тебя и рекрутера одна цель – пристроить тебя на рабочее место. Не теряться если попался незнакомый вопрос. Профессионально и дружелюбно объяснять сложные концепции простыми словами. В слишком объемных ответах нет смысла, не развивать тему и не офтопить. Если совсем все плохо – записать вопросы, узнать ответы и идти на следующий собес.
Please open Telegram to view this post
VIEW IN TELEGRAM
62211
Примеры open-source проектов

Нет лучшего способа преисполниться в андроид-разработке, чем покопаться в чужих исходниках. Всегда полезно посмотреть как пишут код взрослые дяди и утащить себе проверенные методики. Здесь не будет примеров, которые давно не обновлялись и соответственно не запустятся после клонирования.

🐗 github.com/android/nowinandroid
Полнофункциональное приложение от гугла. Создано с использованием Kotlin, Compose и Material3. Постоянно обновляется и представляет собой агрегатор новостей об андроид-разработке разложенных по топикам. Про организацию модулей в проекте рассказано здесь. Используется рекомендуемая архитектура с UDF, о ней подробнее здесь. Код покрыт unit и ui тестами, производительность мониторится с помощью бенчмарков.

🐗 github.com/android/sunflower
Еще одно приложение от корпорации добра. Справочник для садоводства. Иллюстрирует лучшие практики по переезду с Android View (Material2) на Jetpack Compose (Material3). О миграции рассказано здесь. Код полностью покрыт тестами, есть бенчмарки, показано как работать с ассетами и предварительно заполнять Room.

🐗 github.com/chrisbanes/tivi
Приложение для отслеживания сериалов от бывшего разработчика из гугла. В проект тащятся новейшие версии библиотек, сейчас в процессе переезда на KMP. Показано как управлять зависимостями с помощью buildSrc. Полностью на Kotlin, Compose, Coroutines, Room, Lifecycle, Navigation и Hilt.

🐗 github.com/RetroMusicPlayer/RetroMusicPlayer
Руководство как скрафтить музыкальный плеер в системе View с дизайном Materia3. Под капотом продвинутая стилизация, синхронизация текстов песен, анимации, виджеты, плейлисты, поддержка Chromecast и Android Auto.

🐗 github.com/libre-tube/LibreTube
Альтернативный клиент YouTube с кучей настроек. Никакого Compose - UI на activities и fragments.

🐗 github.com/JunkFood02/Seal
Стильный и простой в использовании аудио/видео загрузчик. Есть настройка палитры Material3 из приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
7221
🐗 github.com/andrikeev/Flow
Неофициальный клиент рутрекера. Сделан по красоте – чистая архитектура, код разложен по core и feature модулям, реализации отделены от интерфейсов.

🐗 github.com/T8RIN/ImageToolbox
Продвинутый пикча-эдитор. Покажет, что можно и нельзя делать с изображениями.

🐗 github.com/JetBrains/compose-multiplatform
Сэмплы от JetBrains для погружения в KMP. Есть, например, приложение для просмотра изображений и приложение для обмена сообщениями. Для UI используется Compose Multiplatform, показано как его встраивать в интерфейс SwiftUI. Работающие аппки для Android, iOS, Desktop и Web.

🐗 github.com/joreilly/PeopleInSpace
Вываливает список людей, которые сейчас в космосе. А также положение МКС. Демонстрация множества различных платформ, на которых работает Kotlin Multiplatform. Включает клиенты на SwiftUI (iOS, watchOS, macOS), Compose (Android + Tablets, Wear OS, Desktop, Wasm, iOS) и серверную часть на Ktor. Есть виджеты для iOS и Android. Проект специально сделан минималистичным, чтобы помочь тебе быстрее вкатиться в KMP.

🐗 github.com/msasikanth/twine
Мультиплатформенное приложение для чтения RSS-лент. Внутри стандартно Kotlin Multiplatform, Coroutines, Compose Multiplatform, Ktor, SQLDelight, Decompose и Kotlin-inject. Нужны JDK 20 и канареечная студия для запуска.

🐗 github.com/JoelKanyi/FocusBloom
Приложение для продуктивности и управления временем. Юзеры могут планировать задачи и получать отчеты об их выполнении. Мультиплатформа – есть реализации для Android/iOS/Desktop.

🐗 github.com/xxfast/NYTimes-KMP
Мультиплатформенная версия приложения New York Times на Compose. Позволяет юзеру просматривать статьи. Для Android/Wear/iOS/Desktop/Web.

🐗 github.com/TheChance101/beep-beep
BeepBeep – платформа для доставки еды и заказа такси, призванная продемонстрировать возможности Kotlin. Включает мобильные приложение для пользователей, приложения для управления рестораном, приложения для водителей, для доставщиков – все это для iOS и Android на Compose Multiplatform. Есть приложение с дашбордами для Mac/Linux/Windows, приложение для поддержки. Есть несколько микросервисов на Kotlin с Ktor для поддержки всего этого. Можешь забацать свой Uber!

🔤🔤
🐗 github.com/DrKLO/Telegram
Не рекомендуется как ориентир. Но будет полезно посмотреть какой радикальной бывает разработка продукта, когда он претендует на звание лучшего в нише. Анимации, работа с памятью и с видео, минимум внешних зависимостей, все кастомное и самописное, создание ui из кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
8221
Потоптал берег Балтийского моря на косе, название которой не выговорю.

Морской ветер ебошит с такой силой, что уши закладывает. Ничего не слышно кроме шума волн, еще и песком по лицу хлещет. Ощущения прекрасные! Сразу забываешь о своих работах и заботах. Плюс поорать можно. Рекомендую.
8322
🐗🐗 КАРЬЕРНАЯ КАРТА

➡️➡️➡️

Привет! Сделал роадмап для подготовки к собесам на Senior Android Developer. Все это добро хостится в Notion и пока включает следующие разделы:

Job Interview: Вопросы с собесов, что отвечать, что спрашивать, ссылки на моки, System Design, как проектировать, алгоритмы и задачки из бигтехов, примеры задач на лайв-кодинг, софты, все что надо знать про HashMap.

Kotlin: все про язык, разобраны все ключевые слова и операторы, вопросы с собесов, коллекции, дженерики, корутины, мультиплатформа, 50 примеров использования операторов Flow.

Java: GC, Thread, Concurrent, RxJava.

Compose: аннотации, функции компоновки, сайд-эффекты, примеры кода, кейсы использования.

Android Platform: SDK, Сервисы, Concurrent, Android-коллекции, класс View, Activity, Intent, что нового в релизах, Network, UI и дизайн, архитектура и паттерны проектирования, сборка и Gradle-скрипты, Layouts, DI, тестирование.

Android Jetpack: Hilt, ViewModel, Room, WorkManager, LiveData, ViewBinding.

Android Studio: как настроить, какие хоткеи использовать.

Git: команды, кейсы, Github actions, управление репозиторием.

Samples: фреймворки которые надо затащить, примеры open-sourcе библиотек.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
144331
Android | Михаил Белый pinned a photo
🐗 Kotlin 2.0

Перетащил свой проект на Kotlin 2.0.0 и компилятор K2. Также пришлось переехать на новый плагин Compose от JetBrains. Прошло гладко, гайд по миграции здесь.

Все библиотечки совместились и нормально работают. Отвалился только мультиплатформенный Coil3, потому что его не обновляют с февраля. Какой прирост по скоростям, стало ли быстрее собираться – я хз. Меня это перестало заботить, когда я с камней intel перешел на arm. Могу только сказать, что люблю все новое. Так что ждем новую версию котлина, обещают что-то интересное!
Please open Telegram to view this post
VIEW IN TELEGRAM
7221
Как меня развели мошенники с авито на 40 000₽

Интернет переполнен историями как бабка-пенсионерка на десятом десятке лет по звонку мошенников перевела им все свои похоронные мильены. Все мы дружно с таких историй кекаем, делая поправку на возраст. С молодыми нами такого бы не произошло. Зумеры не курят, потому что боятся поднять трубку.

В далеком 2k19 моей основной мобилой был какой-то самсунг. В один день, меня не спросясь, он упал в лужу, когда я шел домой с пьянки. Высушить его в рисе не получилось. Было принято решение покупать Google Pixel 4 – лучший на свете смартфон на андроиде. К тому же я – андроид-разраб. Будет на чем с кайфом приложеньки тестить.

Для контекста, тогда пиксели официально в рф не продавались (как и сейчас). Купить его можно было только у разных инициативных граждан на авито и может быть через какие-то стремные сервисы доставок из сша. Сегодня ими завален весь маркет с озоном, доставят к завтраку за 15 минут.

Я, родившийся и выросший в интернете, с технологиями на ты, на незнакомые номера не отвечающий, по подворотням не шатающийся, открываю авито. Внимательнейшим образом, по отзывам и прочим тоглам выбираю подходящий девайс. Начинается чат с продавцом. Так мол и так, есть в наличии, готовы отправить через боксберри, оплата авито-доставкой. Удобненько, думаю я. Да и боксберри для меня не пустые звуки, уже юзал их неделей ранее, соглашаюсь.

Стартует процесс оплаты. Продавец кидает в чат скриншот (как потом оказалось фейк), что на стороне авито-доставки какие-то траблы и нужно оплатить прямо в боксберри. Я уже капаю слюнями на свой новый девайс и перехожу по ссылке на поддельный, но такой знакомый интерфейс боксберри. Недолго думая или скорее вообще не думая вбиваю данные карты, подтверждаю смс и оплачиваю. Обычно далее тебя перенаправляет в личный кабинет боксберри, где видно статус заказа. Ничего подобного не происходит.

В этот момент приходит осознание: заскамили. В голове начинают перебираться варианты как сделать undo. Первое – написал в поддержку банка, отменить перевод. Банки в этом плане абсолютно беспомощные, перевод был авторизован, чего ты от нас хочешь? Продавец с авито на радостях кидает вторую ссылку, говорит платеж не прошел, вбей-ка данные карты еще раз, чтобы вернуть деньги. Второе – пишу в поддержку авито. Авито еще беспомощнее банка, разводят руками и советуют обратиться в полицию. Решил уже ничего не придумывать и полностью снять с себя ответственность – написал заяву в МВД с теми данными что были у меня и авито: профиль продавца, куски каких-то реквизитов по адресу в екб, поддельный сайт.

Следующие полгода мне на почту регулярно падали пдфки как мое дело кочевало от одного следователя к другому. Пока в какой-то момент оно не утонуло навсегда в пыльных архивах.

40k остаются самой крупной суммой, которую я терял в моменте. Половина зп на тот момент. Пришлось купить сяоми (топ за свои деньги). И хотя бывают в жизни огорчения, я принял решение – ни секунды не буду переживать. И успешно не вспоминал об этом до текущего поста. Потом я вовсе перешел на айфон, а пиксель уже седьмой, мне подарили на др. Довольный как минипиг гоняю цвет кнопочек туда-сюда. Это и правда лучший андроид-смартфон.

Какие выводы:

🐗 Все, что касается денег не должно сопровождаться спешкой. Все, кто торопят тебя принять решение в моменте и быстрее с ними расстаться – мошенники. За продуктами не ходи голодным – накупишь херни. И тому подобное.
🐗 Надо обложиться гарантиями со всех сторон. Не стоит отправлять видеокарту авито-доставкой покупателю в село под архангельском. Получишь обратно кирпич в коробке. Стоит покупать товары на озоне с возможностью возврата в течении 60 дней. Я так вернул 4 скамьи подряд, потому что каждый раз привозили паль.
🐗 Не парься. Как пишут в пабликах ВК: масштаб личности определяется величиной проблемы которая может вывести тебя из себя. Не плоди проблемы. У тебя ровно одна забота в жизни – обеспечить приток бабок в карман. Все остальное – развлечения и расходы.

Удачных покупочек!
Please open Telegram to view this post
VIEW IN TELEGRAM
11221
Хоткеи, без которых невозможно работать

🐗 В Android Studio.

Double Shift

Поиск по всем названиям классов и файлов в проекте.

Command + Shift + F

Поиск по коду внутри классов и файлов.

Command + Shift + K

Открыть окно пушинга коммитов в удаленный репозиторий.

Command + Shift + Minus

Свернуть класс.

Command + Shift + Plus

Развернуть класс.

Command + Option + L

Форматировать отступы по табуляции (спасение от юзающих 2 пробела вместо 4).

Command + Shift + /

Закомментить/разкомментить выделенный кусок кода.

Command + D

Дублировать строку.

Fn + Control + Space

Вывалить список доступных операторов.

Fn + F2

Перенести курсор на следующую ошибку в файле.

Fn + F4

Открыть выделенный файл из вкладки Commit в редакторе (если просто 2 раза тапнуть мышью – откроется commit diff).

Fn + Shift + F6

Переименовать выделенное название сигнатуры везде.

Option + Enter

Импортировать сигнатуру на которой сейчас курсор (чтобы не светилась красненьким).

Option + I

Имплементировать методы в текущий класс (например указали интерфейс – теперь нужно переопределить его методы).

Option + O

Переопределить методы в класс.

Option + →

Перенести курсор к следующему слову в строке.

Option + Cursor

Активировать мультикурсор (чтобы редактировать сразу несколько строк).

Пожалуй и хватит. Для всего остального можно использовать мыша.
Please open Telegram to view this post
VIEW IN TELEGRAM
10321
Недавно сбылась моя мечта – посмотрел на диких кабанчиков. Первого хрюнделя увидел в минском зоопарке (кстати топ, такая эко-деревня на окраине города). Второго, более дикого – в Беловежской пуще. Там они тусуют в огромных вольерах посреди леса. Кабан подошел близко и начал активно копать грунт.

Следующая мечта – попасть на пиг-айленд. Я знаю, что такие острова есть в Таиланде и на Карибах. Одичавшие свиньи там совершенно не боятся людей.
922
🐗 Custom Emoji

Наформашлёпил собственный эмодзи-пак для этого канала. Всегда любил векторную графику, если бы не зияющая творческая дыра внутри меня – попробовал бы себя в дизайне.

Чтобы иконки не плясали как кривой забор, было решено сделать их одноразмерными. Вписал SVG-логотипы в квадрат 100х100px (ограничение телеги) со скруглением 24px.

Оказалось, делать свои статические иконки проще, чем искать нужные на просторах телеграма. Все что требуется – экспортировать иконки из фигмы и загрузить их в бота @Stickers. Принимаются форматы .png и .webp.

Можно добавлять новые эмодзи, удалять или заменять старые, менять их порядок, смотреть статистику. Доступно юзерам с премиум подпиской.

Я пока не раскурил как повысить качество иконок. В тексте незаметно, но если приближать, то немного шакалит. Покопаться в исходниках и вдохновиться можно в 🐗 Figma.

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
50821
На что в Android-разработке кладется болт

🐗 Landscape. Про сохранение состояния в бандл спрашивают на каждом собесе. При этом альбомной ориентации нет примерно ни у кого. Хардкодим флаг в манифесте и забываем про этот геморрой навсегда. Почему? Потому что дорого и долго. Плюс пол дня на разработку каждого экрана. Еще и дизайнер напрягается. Сюда же поддержка планшетов, складных устройств и мультиокон.

🐗 Animations. Анимации радуют глаз, но как же нелегко их делать в системе View. В этом плане переход на Compose внушает оптимизм.

🐗 Accessibility. У людей с ограниченными возможностями отсутствует мощное лобби их интересов. Поэтому делаем везде content_description = null. Адаптивные цвета и шрифты также в топку. Хотя вся инфраструктура давно готова.

🐗 UI-Tests. Иногда (довольно часто) в приложениях полностью отсутствуют Unit-тесты, что уж говорить про тестирование пользовательского интерфейса. Проще и понятнее вложиться в команду тестировщиков и написание тест-кейсов. UI так частно меняется, что тесты за ним не поспевают. Они начинают сыпаться и закономерно отключаются.

🐗 AAB. App Bundle – прекрасная штука. Но не очень полезная, когда интернет безлимитный, а выкладываться приходится не в один Google Play, а в сто разных маркетов. К тому же не все компании готовы аутсорсить свои ключи гуглу.

🐗 Notification Channels. Потенциальная киллер-фича Android, если бы все разработчики использовали ее правильно. Но тогда половину бизнесов пришлось бы закрывать из-за невозможности слать юзерам рекламу и рекомендации в пушах.

🐗 Widgets. А также AppShortcuts и бабблы для бесед. Во-первых, не каждому приложению это вообще нужно. А во-вторых, долго делать, сложно поддерживать, особо не разгуляться по функционалу.

🐗 Deep Links. Можно так настроить диплинки, что будет открываться нужный экран на любую ссылку и подсылку. Можно с сайта гнать юзера в стор, после установки сразу гнать на нужный экран. Но можно и без этого спокойно прожить.

🐗 Optimize battery. В идеальном мире пользователь включает экономию батареи и все приложения послушно перестают кушать зарядку в фоне. Как оно в реальной жизни объяснять не нужно. Гугл даже сделал флаг в манифесте для особо прожорливых приложений, и все дружно себе его включили, чтоб не обделили. Про задохликов на Android Go, по-моему, вообще никто не слышал, нечего и упарываться.

Вот и получился списочек того, что можно не изучать в первую очередь.
Please open Telegram to view this post
VIEW IN TELEGRAM
9211