Мобильное Чтиво
1.6K subscribers
271 photos
43 videos
153 links
Очень серьезный канал про мобильную разработку. Веду канал я — @maxkachinkin
Download Telegram
👀 Собес в Google в 2024: что реально спрашивают и как пройти 👀

Нет, я не проходил собеседование в Google пока. Но я недавно наткнулся на статью, как разработчик в 2024 году прошёл собес в Google и получил оффер. Это на фоне того, что в бигтехах — Google, Meta, Amazon — массовые увольнения.

Вот вам мой супер краткий пересказ статьи, что кандидата спрашивали и что надо знать, чтобы пройти:

📞 Телефонный скрининг: обсуждают опыт, проекты, и как вы понимаете структуры данных и алгоритмы.

🖥️ Три технических раунда (45 минут каждый):

- Алгоритмы, деревья, динамическое программирование. Так что учите динамическое программирование!
- Задачи уровня LeetCode Medium и Hard.
- Пишем код по OOP, SOLID стандартам — чистый код важен. Хотя тут мне не совсем понятно, про что она. На сколько SOLID код мне надо писать, чтобы сделать поиск по дереву? Тут вопросики.

🧠 Googlyness: проверка на командность и решение конфликтов. Отвечайте по методу STAR (Situation, Task, Action, Result).

🤝 Team Matching: выбираете команду, обсуждаете проекты, цели, и насколько вы подходите команде.

Вывод: всё по-старому, готовьтесь по алгоритмам и будьте вежливы на командных раундах. 😎

Кто из вас проходил собеседования в Бигтехи? Есть что добавить? 💬 Я кстати, как-то проходил собесы в Facebook, но потом они объявили свои layoffs на середине пути :)

P.S. 🎟️ Остался один день розыгрыша бесплатного билета на Подлодку! Смотрите пост в закрепе!

#собеседование #google #бигтех
👍113
This media is not supported in your browser
VIEW IN TELEGRAM
🔥14
🔢 Как инкрементить build number в GitHub Actions 🔢

Сегодня стартанула Podlodka Android Crew 12, и я решил каждый день делать пост — инсайт дня, или “что больше всего запомнилось за первый день”. Вот мой первый инсайт!

Сегодня на докладе Никиты Куликова из Flipper Devices меня поразила простая, но элегантная штука — как инкрементировать версию в GitHub Actions. 💡

Ведь, если задуматься, чтобы инкрементить версию, нам нужно персистентное хранилище. Какие есть варианты?

- Просто положить число в репозиторий? Не, это мега неудобно, как с этим вообще потом работать? 🤦‍♂️
- Можно, конечно, заморочиться и поднять свой сервис с базой данных и автоматизацией, но это уже слишком громоздко и явно не для тех, кто хочет по-быстрому. ⏱️
- Можешь использовать номер прогона в GHA? Ну, это тоже гемор, особенно когда номера прыгают туда-сюда по разным воркфлоу. 💥

Так вот, как можно сделать по-легкому? Теги! 🎯
Теги — это как бесплатное персистентное хранилище, встроенное в гит. Никита показал экшн build-tag-number — это не единственный вариант, но суть в том, что мы используем хранилище тегов, чтобы хранить наш последний номер билда! 📦

С одной стороны, да, выглядит как костыль. 🩼 Но с другой — это реально быстрый и удобный способ, когда надо всё сделать и без лишних сложностей.

Может и костыль, но зато рабочий! 😎

А как вы инкрементите версию? Пишите в комментах! 💬

#podlodka #githubactions
🔥10👍2😐1
🛠️ Detekt: как обычные правила отличаются от правил с type resolution 🛠️

Неделя Podlodka Android Crew 12 в самом разгаре, и как я и обещал, каждый день рассказываю интересную вещь с каждого дня.

Сегодня Гриша Шимичев раскрыл тему detekt (картинка - это слайд из его доклада). И самое важное, что надо знать — что у detekt есть два типа правил:

1. Обычные правила.
2. Правила с type resolution (это где detekt реально понимает, какие типы у тебя в коде).

🤔 Что это значит?
Смотри на картинку. Слева у нас обычное правило, которое ловит "магические числа". Всё понятно, типы тут особо не важны — это просто чистая проверка кода. Справа — пример с type resolution: здесь detekt уже проверяет более глубокие вещи, как ненужные операторы !!. И тут уже важно знать тип переменной. Если тип не nullable, detekt подскажет, что этот !! не нужен.

Как запустить detekt с type resolution?

Если вы используете Gradle таску, то:
./gradlew detektMain
Если cli:
detekt --classpath build/classes/kotlin/main --jvm-target 1.8

Короче, если хотите углубиться в статический анализ кода и написать свои кастомные правилн, то скорее всего без type resolution не обойтись. 🔧

А вы запускаете detekt с type resolution или без? 💬

#podlodka #android #detekt #статическийанализ
🔥7👍4
🚀 3 CI/CD инструмента, которые тебе пригодятся 🚀

Очередной день Podlodka Android Crew 12, а это значит — новый инсайт дня от меня!

Сегодня мне зашёл круглый стол про CI/CD, где мы пообщались с Сергеем Боиштяном, Андреем Берюховым и Алексеем Хайминовым. Было много интересного, но я решил поделиться тремя инструментами, которые вам точно пригодятся в работе:

1. Dependency Analysis Gradle Plugin
Плагин для Gradle, который анализирует зависимости в проекте. Он помогает находить неиспользуемые зависимости и неправильно настроенные зависимости (например, когда вы путаете api, implementation и compileOnly). Плюс, он следит за "здоровьем сборки" и помогает чистить проект от лишнего мусора. 📦 Для меня самое ценное — это проверка корректности зависимостей!

2. Danger
CI-инструмент, который автоматизирует код ревью. Он проверяет ваши pull requests на наличие изменений в Changelog, ссылки на таски в Trello/JIRA, описательные лейблы и многое другое. Настраиваешь правила под свою команду, и Danger становится вашим помощником в CI. 🕵️‍♂️ Я сам не пробовал этот инструмен. Кто пробовал, напишите, как вам?

3. Talaiot
Библиотека для Gradle, которая отслеживает время сборки и выполняемых задач, чтобы найти узкие места и улучшить производительность сборок. Поддерживает разные интеграции с системами для сбора метрик. 📊 Кароче, очень полезная штука!

Каждый из этих инструментов может реально упростить жизнь и ускорить разработку!

А какие еще CI/CD инструменты используете вы? Напишите любые, мне очень интересно! 💬

#podlodka #CICD #android
🔥8👍2🤩2
🔥 Как нашаблонить кучу файлов за 5 минут 🔥

Очередной день Podlodka Android Crew 12, и вот мой инсайт дня.

Сегодня Евгений Мельцайкин показал, как с помощью плагина Geminio автоматизировать создание файлов, когда у вас сложная архитектура и куча файлов, разложенная по папочкам 📂

Чтобы не писать по 10-15 файлов вручную под каждую новую фичу, можно настроить шаблоны. Вот как это работает:

Настройка конфига
Создаем файл geminio_config.yaml и указываем путь до папки с шаблонами. Теперь Geminio подтянет их в меню Android Studio.

Использование шаблонов
Шаблоны доступны через меню Generate и New в Android Studio. Выбираем шаблон и создаём сразу несколько файлов за раз.

Рецепты шаблонов
В каждом шаблоне прописаны "рецепты" — инструкции, какие файлы создавать, куда их класть и какие зависимости подключать. Можно настроить шаблоны как для файлов, так и для модулей.

Если у вас сложная архитектура, слои, Clean, MVI с кучей сущностей, Decompose, UDF и другие модные слова, то этот плагин сэкономит кучу времени. 💻

Пробовали Geminio? Или вы шаблоните чем-то другим? Напишите в комментах!

#podlodka #android #template
👍11🔥31
Сервис автоматизации — это не страшно

Закрываем Podlodka Android Crew 12 постом о самом интересном сегодня!

Сегодня выступал Миша Левченко с докладом про сервисы автоматизации. И вот что самое главное надо знать:

- Не боимся писать сервисы автоматизации — это проще, чем кажется! 🚀

- Пишем на Kotlin. Мы, Android-разработчики, вполне можем сами написать такой сервис на Kotlin.

- Берем Ktor и не паримся. Заходим на Ktor генератор, выбираем, что нужно, и получаем готовый шаблон проекта. 🔧

- Для планирования задач можно юзать Quartz — отличный вариант для cron задач. 📅

И вишенка на торте — Миша зафичерил меня в своем докладе, как видно на картинке! 🎉

А как у вас с автоматизацией? Свой сервис уже написали? 😏

#podlodka #android #automation #Ktor #Kotlin
🔥7👍1
🔥 Kotlin 2 и прощате, Backing properties!

Всегда раздражало, что в Kotlin считалось нормальным делать backing properties, пишешь 2 проперти вместо 1. Выглядело как недодизайн. Но теперь в Kotlin 2 это решено! 🎉
Наглядный пример есть в посте от Android Good Reads.
👍5🤩3
Forwarded from Android Good Reads (Anton Kondratiuk)
Одна из причин перейти на Kotlin 2.0 это уменьшение количества кода ради кода. ExplicitBackingFields, как хороший пример

class SomeViewModel {
val city: StateFlow<String>
field = MutableStateFlow("")

fun updateCity(newCity: String) {
city.value = newCity // обрабатывается как MutableStateFlow
}
}

fun outside(vm: SomeViewModel) {
vm.city // обрабатывается как StateFlow, вызов геттера
}
👍17🔥11👏1
🚀💻 Из джуна в сеньоры за полгода: миф или реальность?

🔥 С таким заголовком будет проходить дискуссия на канале AI4Dev через 15 минут, в которой меня пригласили быть участником!

Если есть время — заходите или смотрите потом в записи.

Мне самому интересно, куда зайдёт дискуссия! 🤔

Как бы вы ответили на этот вопрос из заголовка?

#talk #youtube
😁7🔥2🤡1
This media is not supported in your browser
VIEW IN TELEGRAM
🎨 Главное — чтобы было красиво!

Тесты, шместы, архитектура — это всё прекрасно. Но в итоге главное — чтобы было красиво! Я вот вспомнил одну нашу фичу, где надо было сделать кастомный контрол типа табов, которые плавно анимировались, центрировались на выбранном, а потом обратно схлопывались. Всё на Compose, конечно. 💻

И что вы думаете? Контентные паддинги в LazyRow не помогли, игры с отступами тоже. Даже использование horizontalScroll не дало результата. Пришлось думать дальше. 🤔

А как в итоге сделали? Ну, это можно назвать костылём (или нормальным решением, если вам так больше нравится). Добавили "фейковые" элементы в начале и в конце списка и анимировали их размер. 🙃

Используем LazyRow и делаем первый и последний item просто прозрачные Spacer, чтобы создать видимость отступов. Плавно и красиво анимируем их ширину, и всё! 💫 На самом деле не совсем всё: это тянет за собой много всего, чтобы учитывать эти элементы по-особенному (чтобы не кликались, не анимировались, не участвовали в выборе и т.д.).

Как заметили в комментариях, это создает дополнительные рекомпозиции 🫣, что не может радовать. Такой трейдофф решили взять. Но в итоге всё выглядит плавно, аккуратно, ну и просто красиво! 🌟

В комментах я добавлю скриншот кода и видосик — там видно, как это анимируется и центрируется. 🎥

А у вас какие были проблемы из-за красоты? Поделитесь! 😎

#android #compose #ui #lazyrow
👍15💯4🥰1
⚙️ Kotlin in GitHub Actions ⚙️

Совсем скоро Мобиус 2024 Autumn, и я там выступаю с докладом Kotlin in GitHub Actions. Расширяем горизонты KMP. 😎

Я расскажу, как написать свой кастомный GitHub Action на Kotlin/JS: что для этого нужно, как всё работает и какие подводные камни могут встретиться.

Если вы никогда не писали кастомный GitHub Action на Kotlin/JS, но вдруг захотели до моего доклада, то, уверен, потратите прилично времени, чтобы разобраться. 🕵️‍♂️

А после моего выступления вы точно сделаете это намного быстрее! 🧠

А вы писали когда-нибудь на Kotlin/JS?

#android #kmp #kotlinjs
🔥11👍3
🤩 Билет на Mobius! 🤩

Я разыгрываю билет на Mobius 2024 Autumn!

Условия участия просты: написать сообщение под этим постом, какой доклад вам больше всего хочется послушать!

Чтобы выиграть не обязательно писать, что мой доклад Kotlin in GitHub Actions самый интересный 😅 Победит чистый рандом! 🎰

Билет может быть как онлайн, так и оффлайн, как вы захотите.

Итоги подвожу в четверг 10 октября! 📅

#mobius
🔥9👍4😁1
“Смотрим” на Compose через <clinit>

Я хочу вам рассказать про 2 метода: <init> и <clinit>. 👇

<init> — это метод-конструктор. Каждый раз, когда мы создаем новый объект через new, JVM вызывает этот метод, чтобы инициализировать объект и его поля. 📦

<clinit> — это статический инициализатор класса. Этот метод вызывается, когда класс впервые загружается в память. И да, это происходит только один раз при первой загрузке класса. 🔄

Когда и кем вызывается?

JVM автоматически вызывает <clinit> при первой загрузке класса в память.
А вот <init> вызывается каждый раз, когда вы создаете новый экземпляр класса.

Теперь к интересному! 💡

Смотрите на картинку. Здесь показан запуск Compose-экрана, когда он открывается впервые в приложении, и до этого никакие Compose-функции не были вызваны.

На диаграмме чётко видно, как активно срабатывают <clinit> методы. Это часть подсвечена. Это как раз и есть свидетельство того, что Compose — это unbundled library. Я как-то рассказывал про это на Mobius, но эта картинка показывает это наглядно.

А вот при повторном запуске? Никаких <clinit> уже нет. 🎯

Да, конечно, тут не только классы Compose, но если порыться в методах, то большинство из них типо такие:
androidx.compose.foundation.layout.RowKt.<clinit>
androidx.compose.foundation.layout.ColumnKt.<clinit>


Вывод: При первой загрузке Compose через класс-лоадер загружается больше количество классов. 🚀

P.S. Не забывайте, в закрепе розыгрыш БЕСПЛАТНОГО билета на Mobius! 🎁

#android #compose #kotlin #jvm
👍8🔥6
📜 Ваш любимый логгер! 📜

Мы в своих Android-проектах давно логируем через SLF4J/Logback Android. Да, да, это тот самый проверенный временем логгер.

🎯 У него есть плюсы: Надежный (не считая истории с CVE-2023-6481, но там речь про классический, а не android), стабильный, с хорошей поддержкой форматов логирования. Работает без сюрпризов, настройки для форматирования и фильтрации логов. В общем по функционалу всё нравится.
Но есть главный минус: Увы, только для Android. Не подходит для KMP, да и по гибкости проигрывает более свежим решениям.

Я понимаю, что SLF4J/Logback — это не самый гибкий и современный подход, особенно если ваши проекты уже идут в стороны Kotlin Multiplatform.

А как у вас с логированием дела обстоят? 😎

- Logback Android, как у нас?
- Может быть Timber?
- Или уже думаете о будущем и логируете с помощью 🦸‍♂️Napier или 🐸Kermit?
- Или, может, у вас есть свой подход?

Поделитесь, очень интересно узнать! 👀

P.S. Не забывай! В закрепе БЕСПЛАТНЫЙ билет на 🟢Mobius🟢! 🎁 Успейте до четверга!

#android #kmp #logging
5🤓1
🔥 Топ ожидаемых докладов 🔥

Недавно я запустил конкурс на бесплатный билет на Mobius (у вас еще остался 1 день, завтра днем крутану рандомайзер 🎰), и я попросил написать, какие доклады вы ждете больше всего. Кто-то написал 1 доклад, кто-то несколько. Я учел и посчитал все упоминания.

🎤 И вот самые ожидаемые доклады по версии подписчиков Мобильное чтиво:

Первое место разделили:

🥇 Не два байта переслать: эмуляция бесконтактных карт на мобильных устройствах
Павел Васильев, Positive Technologies

🥇Что не так с мобильными сервисами в Android и iOS
Кирилл Розов, Android Broadcast

🥇Kotlin in GitHub Actions. Расширяем горизонты KMP
Максим Качинкин, Dodo Engineering
Эти доклады набрали по 5 голосов.

Могу предположить, что мой доклад упоминали, потому что я веду этот канал 😏. Поэтому вот доклады, которые на 2м месте — они набрали по 4 голоса. Тоже очень ожидаемые!

Второе место:

🥈 Compose и SwiftUI: найди 10 отличий
Алексей Панов, Контур

🥈 Опасности в Android: уязвимости и защитные меры
Юлия Стекачева, Райффайзен Банк

🥈 Предпринимательство для инженера: как запустить свою компанию
Евгений Мацюк, MarathonLabs

🥈 Суперапп с чистого листа
Сергей Балалаев, Ozon

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

Я жду вот эти 2:

🚀 Заезжаем в KMP. Но какой ценой?
Денис Александров, Яндекс 360

🚀 Последнее слово в Android-навигации
Данил Колесников, Дзен

#Mobius2024 #Android
5👍2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🔥15👍1😁1
🤣 Пятничный мем 🤣

Сегодня выступил на Mobius на online дне. Про само выступление напишу потом. Сегодня просто легкий пятничный пост.

Как я готовился к выступлению с визуальной части. Есть 3 момента:

- Мне нравится рассказывать стоя. Так я чувствую себя более динамично и бодро. 💪
- Хочется, чтобы фон был красивый. 🎨
- У меня нет стола с регулировкой высоты, поэтому приходится что-то придумывать. 🤔

Для этого я нашел стену, обустроил её как надо (бахнул на телек красивую картинку), а чтобы встать рядом с ней стоя, пришлось соорудить конструкцию из того, что попалось под руку (включая коробку из-под обуви). И, конечно, надо поставить кружку воды, мобилу и прочее. 📱☕️

И получился мем:
Frontend - Backend 😄

#mobius #meme #пятница
😁29🔥6👍4🤣41
📅 Как проходит мой рабочий день 🏃‍♂️

Вышла статья из рубрики “День с экспертом” на SkillFactory Media. Там я рассказываю про свой типичный рабочий день.

Из интересного и про мобильную разработку я рассказываю, что:
• у нас есть правило на короткие PRы 📝
• мы работаем по Trunk-Based Development 🌳
• я люблю парное программирование, но удается применять его редко 👨‍💻👩‍💻
• подставка под ноут — это маст 📦
• каждый день кормлю уличных котов 🙂

Заголовок и тон статьи может вызвать подозрение на тупые понты или что я собрался продавать мастер-классы “Эффективная эффективность: успевайте всё как я”. Знайте, такого намерения не было. 😅

💬 Мне интересно, а что у вас любимое в вашем рабочем дне? Или наоборот, что вас бесит?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2🍌2😁1🙈1
🇦🇲 Увидимся на DevFest в Ереване 🇦🇲

В это воскресенье, 20 октября, в Ереване пройдет DevFest Armenia 2024!

Я буду выступать там (да, оффлайн) с докладом:
Compose as an Unbundled Library: What It Means for Your App.

Подписчики этого канала знают, что на эту тему я делал посты здесь и ни раз. Вот теперь расскажу целиком вслух:
🐣 Что значит unbundled library
📏 Как замерять UI перфоманс
⏱️ Как можно оптимизировать Compose, если все-таки столкнулись с долгой первой загрузкой

Если вдруг кто есть в Ереване, го на DevFest, пообщаемся!

#devfest #yerevan #compose
🔥122👍1