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
BOM-зависимости в Android

Управление зависимостями влияет на стабильность проекта. Разные версии библиотек могут конфликтовать, вызывая ошибки сборки. BOM (Bill of Materials) решает эту проблему, автоматически подбирая совместимые зависимости.

Как работает
• Прописывается в version catalog.
• Артефакт -bom подключается в dependencies через platform(...).
• Зависимости подключаются без явного указания версии (весь список библиотек автоматически не добавится).
• Отдельные версии указываются вручную – BOM их не переопределит.
• Для тестов BOM подключается через testImplementation(platform(...)) и androidTestImplementation(platform(...)).

Спецификаии BOM
stable (-bom) включает последние стабильные версии каждой библиотеки.
beta (-bom-beta) включает бета-, релиз-кандидаты (RC) или стабильные версии каждой библиотеки.
alpha (-bom-alpha) включает альфа-, бета-, RC- или стабильные версии каждой библиотеки.

Версия определяются добавлением суффикса -alpha и -beta к имени артефакта. У стабильной версии его нет.

Какие библиотеки имеют BOM-версию
Посмотреть список можно на специальной странице в каталоге артефактов Maven. Среди них:
Compose
Firebase
Kotlin
Coroutines
Koin
Koin Annotations
Okhttp
JUnit 5
Mockito

Если нажать на номер версии и отмотать до вкладки Managed Dependencies, можно увидеть список всех зависимостей, входящих в BOM.
7311
Какую Activity использовать в Android

В Android четыре часто используемых класса активити:
• Activity
• ComponentActivity
• FragmentActivity
• AppCompatActivity

По иерархии идут последовательно. Activity – базовый класс. ComponentActivity наследует androidx.core.app.ComponentActivity, который нельзя использовать в коде. Добавлен гуглом как промежуточный слой между android.app.Activity и androidx.activity.ComponentActivity, чтобы менять код без поломок. Далее идут FragmentActivity и AppCompatActivity.

Activity
Базовый класс для создания активити в Android.
• Управляет жизненным циклом.
• Отображает UI (setContentView, findViewById).
• Обрабатывает действия пользователя (onBackPressed).
• Запускает другие компоненты через Intent, получает результаты.
• Сохраняет и восстанавливает состояние (onSaveInstanceState, onRestoreInstanceState).
• Настраивает окно и тему (getWindow, setTheme).
• Получает доступ к ресурсам и конфигурации (getResources, onConfigurationChanged).

ComponentActivity
Добавляет поддержку компонентов AndroidX.
• Поддерживает LifecycleOwner, подписывается на изменения (LifecycleObserver).
• Сохраняет и восстанавливает состояние (SavedStateRegistry).
• Управляет ViewModel (getViewModelStore).
• Регистрирует обработчик кнопки «Назад» (OnBackPressedDispatcher).
• Отображает контент под SystemBars (enableEdgeToEdge).
• Получает результаты активити и пермишенов (registerForActivityResult).
• Устанавливает UI для Compose (setContent).

FragmentActivity
Работает с фрагментами.
• Управляет фрагментами (getSupportFragmentManager).
• Вызывает onAttachFragment, когда фрагмент присоединяется к активити.
• Передаёт результаты пермишенов во фрагменты (onRequestPermissionsResult).
• Обрабатывает результаты активити внутри фрагментов (onActivityResult).
• Сохраняет состояние фрагментов при изменении конфигурации.
• Поддерживает BiometricPrompt для биометрической аутентификации.

AppCompatActivity
Добавляет поддержку обратной совместимости.
• Управляет ActionBar и Toolbar, обрабатывает кнопку «Назад» (onSupportNavigateUp).
• Поддерживает обратную совместимость (AppCompatDelegate), позволяя использовать ActionBar, темы и стили MaterialComponents на старых андроидах (до API 21).
• Автоматически переключает тему (DayNight), подстраиваясь под настройки устройства или время суток.
• Меняет локаль приложения без перезапуска (setApplicationLocales).

Что использовать
• ComponentActivity – если UI на Compose.
• FragmentActivity – если UI на фрагментах.
• AppCompatActivity – если UI на фрагментах, меняется тема и нужна обратная совместимость.
• Activity – если не используются MaterialComponents, UI самописный, код на плюсах.
1633
🐗 Решения 30 задач с CodeRun

Теперь в роадмапе будут складироваться решения алгоритмических задач в сервисе CodeRun от Яндекса. Это онлайн-тренажер с задачами по направлениям: фронтенд, бэкенд, аналитика данных, машинное обучение и мобильная разработка.

Как и на LeetCode, задачи делятся на три уровня сложности, содержат условие и ограничения по времени и памяти. Но сложность здесь значительно выше – ориентирована на олимпиадников.

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

Система ведёт две категории решений: отправленные и верные. Каждое решение проверяется на десятках тестов и может неожиданно провалиться, например, на 95-м. Ошибку при этом не указывают – догадайся сам. Поэтому важно учитывать любые возможные форматы входных данных.

Средний элемент
Самый дешевый путь
Вывести маршрут максимальной стоимости
Ход конём
Поиск в глубину
Компоненты связности
Списывание
Топологическая сортировка
Поиск цикла
Длина кратчайшего пути
Блохи
Значение логического выражения
Гистограмма и прямоугольник
Гоблины и шаманы
Тупики
Разложение в сумму кубов
Расстояние по Левенштейну
Космический мусорщик
Распил брусьев
Площадь комнаты
Откуда достижима первая вершина
Самое частое слово
Номер появления слова
Словарь синонимов
Злые свинки
Черепахи
Инопланетный геном
OpenCalculator
Количество слов в тексте
Кубики

#coderun@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
722111
Приложение с нуля

Иногда ты первый разработчик на проекте. Задача – накидать архитектуру будущего приложения. Что показать заказчику и какие подходы котируются?

Репозиторий
• Git как система контроля версий.
• GitFlow как стратегия ведения репозитория.
• GitHub как платформа для хостинга репозитория.
• GitHub Releases для публикации релизов.
• GitHub Issues для отслеживания задач и багов.

Сборка
• Gradle KTS для написания билд-скриптов.
• Gradle Version Catalog для управления зависимостями.
• R8 для оптимизации и минификации кода.
• Build Types – debug для разработки, с логами и отладочными инструментами и release для прода, с оптимизациями и отключёнными логами.
• minSdk – 24 (Android 7.0).
• targetSdk – 35 (Android 15).
• compileSdk – 35 (Android 15).
• Формат сборки – AAB для Google Play. APK для других сторов.
• JVM Toolchain для управления версией JDK.

Архитектура
• MVI как архитектурный паттерн.
• Слоистая архитектура для разделения ответственности (Domain – Data – UI).
• SSOT для обеспечения консистентности данных.
• UDF для управления состоянием данных.

Стек
• Kotlin как основной язык программирования.
• Kotlin Coroutines для работы с асинхронным кодом и параллельными задачами.
• Kotlin Flow для обработки потоков данных.
• Kotlin Serialization для преобразования объектов в форматы JSON и XML.
• Jetpack Compose как UI-фреймворк.
• ViewModel для хранения и управления UI-состоянием.
• Navigation Component для управления навигацией между экранам.
• Hilt для внедрения зависимостей.
• Retrofit для работы с REST API.
• OkHttp для работы с HTTP-запросами и WebSockets.
• Chucker для отслеживания HTTP-запросов и ответов.
• Foreground Service для выполнения длительных или важных задач (камера, локация, музыка, диктофон, звонок, фитнес).
• WorkManager для управления фоновыми задачами.
• DataStore для хранения данных.
• Room для работы с базами данных.
• CameraX для работы с камерой.
• Paging3 для загрузки больших списков с поддержкой пагинации.
• Coil для загрузки и отображения изображений.
• Media3 для работы с мультимедийным контентом (аудио и видео).
• Jetpack Glance для создания виджетов.

Дизайн
• Material3 как дизайн-система.
• Тема приложения – светлая, темная и системная.
• Splash Screen API для отображения заставки.
• Predictive Back Gesture для жеста назад и предварительного просмотра экранов.
• Edge-to-Edge для отображения UI без отступов, когда контент заполняет весь экран, включая области статус-бара и навигации.
• Ориентация экрана – определяется сенсором устройства.
• Display Cutouts – корректная обработка вырезов на экране (под камеру или датчики).
• Adaptive Layouts – макеты, которые автоматически подстраиваются под разные размеры экранов на телефонах, планшетах и десктопах.
• Локализация – en (английский) + язык пользовательской базы, например ru.

Тестирование
• Unit-тесты для бизнес-логики – JUnit, Mockito, Kotest.
• UI-тесты для пользовательского интерфейса – Espresso, Robolectric.
• Android Profiler для мониторинга производительности, памяти, сети и CPU.
• Benchmarking для измерения производительности приложения или его компонентов.
• LeakCanary для обнаружения утечек памяти.

Стиль кода
• Detekt как статический анализатор для нахождения ошибок и улучшения стиля кода.

Мониторинг и аналитика
• Huawei Mobile Services как набор облачных сервисов для устройств Huawei.
• Google Mobile Services как набор облачных сервисов для большинства устройств.
• Firebase Analytics для анализа поведения пользователей.
• Firebase Crashlytics для мониторинга и анализа сбоев в приложении.
• Firebase Cloud Messaging для отправки уведомлений.
• Firebase App Distribution для распространения предварительных версий приложения среди тестировщиков.

Непрерывная интеграция и доставка
• GitHub Actions для автоматизации сборки, деплоя и выпуска.
12311
This media is not supported in your browser
VIEW IN TELEGRAM
Какой же классный получился подгон у эппла на 14 февраля
3211
Как совмещать 2 дейли

Возможное пересечение созвонов – частая причина отказа от многоработничества. Я несколько лет отработал в двух конторах и в один год у меня наложились 250 звонков. Работодателей об этом не извещал. Расскажу как это выглядело на практике.

Дейли – это созвон команды. Проходит каждый день, что понятно из названия. Помогает синхронизироваться: кто чем занят, какие блокеры, нужна ли помощь. Обычно разработчики трудятся в Agile-командах пять дней в неделю с утра и до вечера. Даже в Новосибирске пляшут по московскому часовому поясу, поэтому дейли проходит утром в интервале 9:00-12:30. Распространенные слоты – 11:00, 11:30 и 12:00. Чем больше команда, тем дольше дейли. Четверо укладываются в пять минут, двадцати может не хватить и получаса. Сократить время дейли – распространённая цель команд.

Итак. Два дейлика проходят в 11:00 по будням. Созвон без камеры. Для звонков используют Zoom, Google Meet, Microsoft Teams, Slack или аналогичные сервисы. Доступно отключение микрофона и источника вывода звука.

Какие форматы встречались
• Классический. Поочередный опрос каждого: «что делал вчера, что будешь делать сегодня». Порядок иногда играет на руку. Если опрашивают по алфавиту, Яковлев отвечает последним. Или опрашивают по расположению имен в Jira. Либо сначала фронтендеров, потом бэкендеров. Постепенно проявляется закономерность – я размьючиваю микрофон в 11:15.
• Проектный. Опрашивают тех, кто участвует в проектах, которые в работе. Молчишь каждый второй созвон.
• Проблемный. Сначала обсуждаются блокеры, потом текущие задачи. В этом случае свои проблемы лучше порешать в течение рабочего дня, чтобы не отвлекаться на звонке.

Подключаться на звонки нужно с двух устройств – два компа, комп + телефон. Чтобы мозг не плавило, лучше не использовать две пары наушников. На первом устройстве выводим звук через динамики, на втором через один наушник. Мозг человека не поддерживает многозадачность, но может быстро переключаться между тасками. Так проще оставаться в контексте каждого дейли.

Когда очередь отвечать на первом дейли – размьючиваем микрофон и говорим. Когда отвечаем на втором дейли – убавляем динамик на первом. Это единственное слабое место процесса. Мы выпадаем из контекста приглушенного звонка. Но на практике значимые детали редко упускаются.

Дергают одновременно на двух дейли
И такое случается. Второй рот в этот момент не отрастет. Выбираем приоритетный звонок, а второй оставляем на мьюте. После спича (лучше краткого) появляемся на втором дейли, если встреча еще идет, и просим повторить вопрос. Жалуемся на медленный интернет, разрядившиеся наушники, клятого курьера.

Дальше проще
Первые пару недель сложно. Как известно, мозг нейропластичен и неизбежно адаптируется к новым обстоятельствам. Сначала следишь за микрофонами, потом скатываешься в полнейший рассос. У меня созвоны сопровождались приготовлением завтрака, просмотром ютуба и разговорами с сожителями.

Награда
В 2 раза больше опыта, денег и стресса. Нарабатывается скилл планирования и приоритизации задач.

Легче проблему предотвратить, чем решать. Пересекающиеся созвоны – не приговор, но как же проще, когда они разнесены по времени.
1129521
Как Android-разработчику использовать ChatGPT

ChatGPT предоставляет такую же абстракцию над высокоуровневыми языками программирования, как те над ассемблером. Формулировка запросов на естественном языке не только повышает уровень взаимодействия человека и компьютера, но и упрощает его.

Кормить ли ИИ кодовой базой проекта – вопрос дискуссионный, каждый решает сам. Но даже исключая бизнес-состовляющую, остаются задачи, которые можно делегировать нейросетям:

🐗Анализ ошибок билд-системы
Ошибки Gradle, минификации и процессоров аннотаций (Dagger, Retrofit) возникают постоянно и по миллиону причин. ChatGPT найдет решение: сходит в issues на гитхаб, проанализирует форумы, разберет логи, прочитает релизноуты и документацию. Достаточно скопировать ему логкат.

🐗Рисовать на канвасе, анимировать, делать виджеты
ChatGPT напишет код для отрисовки любой загогулины: от восьмиконечной звезды до лепестковой диаграммы. Добавит пульсацию, волны, скачки, пружины, морфинг и другие эффекты. Подберет цвета, которые сочетаются. Создаст виджет из ограниченного набора компонентов (Glance).

🐗Правила для линтеров
ChatGPT поможет настроить кастомные правила для Detekt и Lint. Пропишет инспекции для нейминга, сложности функций, глубины вложенности, устаревших API и утечек памяти.

🐗Документация и комментарии в коде
ChatGPT опишет сложный участок кода, функциональность класса или метода. Сгенерирует API-документацию. Предложит улучшения, чтобы текст стал понятнее.

🐗Решение алгоритмических задач
Методы решения алгоритмов давно известны: бинарный поиск, с возвратом, в ширину, в глубину, боком и с подскоком. ChatGPT в курсе и выдает оптимальный по памяти и времени код.

🐗Перевод строковых ресурсов
Плохие новости – у DeepL открылся денежный чакр. Хорошие – ChatGPT тоже отлично переводит. Без проблем локализует строки в strings.xml на другие языки.

🐗Автоматическое тестирование
ChatGPT силен в написании юнит и интеграционных тестов. Проверяет бизнес-логику и UI, предлагает шаблоны, использует JUnit, Espresso и Compose UI Test. Помогает протестировать большие участки кода.

🐗Написание SQL-запросов для Room
ChatGPT составляет сложные SQL-запросы, работает с таблицами и отношениями, умеет описывать миграции.

🐗Конвертация кода между Java, Kotlin и Swift
ChatGPT переводит код между языками, сохраняя логику и стиль. Полезно при смене стека или написании кроссплатформенных приложений.

🐗Написание GitHub Actions и GitLab-CI скриптов
ChatGPT напишет скрипты для автоматизации сборки, тестирования и деплоя Android-приложения. Сгенерирует .yml, настроит кэш Gradle, запустит тесты, опубликует сборку в Google Play. Сократит время на рутину и сбережет бесплатные минуты и гигабайты.

🐗Разбор кода, рефакторинг, оптимизация
ChatGPT объяснит, что делает конкретный кусок кода. Упростит его, улучшит читаемость и оптимизирует производительность. Сократит дублирование и адаптирует под бестпрактисы.

🐗Контент в заданном формате
ChatGPT напишет код для подключения артефактов в libs. Сгруппирует их в бандлы и добавит в модули.

Что делать людям

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

Чем больше у человека знаний, тем проще ему использовать нейросети. Опытный барсеточник с большей вероятностью увидит ошибки в сгенерированном коде. Это называется «проклятие эксперта»: ИИ полезен разбирающимся в теме, но запутает тех, кто только учится. Поэтому не прекращай расти над собой, какими бы умными не становились нейронки.
Please open Telegram to view this post
VIEW IN TELEGRAM
14922111
This media is not supported in the widget
VIEW IN TELEGRAM
28661
Android | Михаил Белый
This media is not supported in the widget
VIEW IN TELEGRAM
10531
Android | Михаил Белый
Поздравляю победителей!

Мои любимые опции премиума:

📍10 чатов в закрепах.
⚡️Дополнительные бусты.
📝Длинные посты с обложкой.
🔗Длинное био со ссылками.
ℹ️Расшифровка голосовых.
🤖Кастомные эмодзи и реакции.

Не обошлось без приключений на моем микроблогерском тракте. Как оказалось, после старта гива его сразу репостят в каналы-агрегаторы, которые волшебным образом (telegram api?) умеют узнавать о проводимых розыгрышах в публичных каналах. Каналы объединяют в папки. После этого на тебя подписываются сотни ботов (813 за 4 дня).

Но не на того напали 👊. Так как я считаю гивы кэшбэком за лояльность, боты своевременно получили поджопник и были кикнуты.

В любом случае весело, скоро повторим!
Please open Telegram to view this post
VIEW IN TELEGRAM
93311
🐗 Как стать Senior Android Developer – подробное исследование

Решил потратить свои лимиты на глубокие ресерчи. Тема сегодняшнего исследования: как миддлу стать синьором. Основано на данных из 30 источников.

TLDR 11 слов:
Уволиться из текущей компании и уйти в другую на грейд выше.

6840 слов:

Исследование разбирает путь от миддла до синьора, включая ключевые технические навыки, софты и карьерные возможности. Для роста важно глубоко знать Kotlin, Coroutines, Jetpack Compose. Разбираться в MVVM, MVI и Clean Architecture. Уметь работать с CI/CD и тестированием. Помимо технической экспертизы, сеньора отличает лидерство, коммуникация и понимание бизнеса. Он не просто пишет код, а решает сложные задачи, улучшает процессы и наставляет команду.

После Senior можно развиваться в техническую или управленческую сторону – стать архитектором, Principal Engineer или Team Lead. Чтобы ускорить рост, важно брать ответственность, участвовать в архитектурных решениях и активно помогать команде. Дополнительный рост дают менторство, выступления на конференциях и постоянное обучение. Сильные Android-разработчики остаются востребованными. Эксперты с широким взглядом на продукт особенно ценятся.

Главное – мыслить системно, проявлять инициативу и прокачивать как технические, так и софтовые навыки. Senior – это не просто опыт, а способность видеть картину в целом и решать стратегические задачи.

🐗 ЧИТАТЬ В NOTION

🐗 Слушать:

#deepresearch@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
8421
🐗 Решения 49 задач с CodeRun

В роадмап добавлено еще 49 решений задач с CodeRun – теперь их там 79. Всего в сервисе 571 задача, это в 6 раз меньше, чем на LeetCode. Есть вероятность закрыть их все.

Кафе
НОП с восстановлением ответа
Путь в графе
Путь спелеолога
Пересадки
Конвейер
Значение арифметического выражения
Поврежденный XML
Минимум на отрезке
Коммерческий калькулятор
Машинки
НВП с восстановлением ответа
Количество треугольников
Увлекательная игра
Два коня
Числа
Полиглоты
Пересечение множеств
Количество различных чисел
Треугольник Максима
Сапёр
Наибольшее произведение трех чисел
Наибольшее произведение двух чисел
Больше своих соседей
Ближайшее число
Определить вид последовательности
Возрастает ли список?
Узник замка Иф
Детали
Уравнение с корнем
Телефонные номера
Треугольник
Кондиционер
Клавиатура
Продажи
Банковские счета
Расшифровка письменности Майя
Дополнительная проверка на списывание
Стильная одежда
Сумма номеров
Туризм
Город Че
Красота превыше всего
Счет в гипершаках
Подстрока
Робот
Двоичный поиск
Приближенный двоичный поиск
Дипломы

#coderun@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
8431
🐗🐗 Обновление карьерного роадмапа

• Добавлены новые вопросы с собеседований.
• Отдельная страница для Material3.
• Новая страница HeadHunter.
• Новая страница Deep Research.
• Новая страница WearOS Samples.
• Новая страница XR Samples.

🐗 Getting Started
Добавлен курс по Jetpack Compose.
Добавлены примеры проектов в Android Studio.

🐗 Live Coding
Добавлена 1 новая задача из Сбера.

🐗 HeadHunter
Ответы для тестов по Git, Java, SQL, ООП, OKR, Scrum, Agile и English.

🐗 Computer Science
Добавлен плейлист по основам программирования.

🐗 Algorithms
Добавлены решения 91 задачи с LeetCode.
Добавлены решения 79 задач с CodeRun.

🐗 DevOps
Сервис Buildkite.
Сервис AppMetrica.

🐗 Java
Добавлено описание массивов.

🐗 Kotlin
Экранирование идентификаторов.
Trailing comma.
Описание buildString.
Описание кейворда set.
Collections. Описание Array, MutableIterable, Collection, MutableCollection, buildList, buildSet, buildMap.
Coroutines. Описание suspendCancellableCoroutine и CompletableDeferred, пример кода для Deferred.
Flow. Описание методов distinctUntilChanged, onStart, onCompletion, merge, mapLatest, withIndex, scan, runningReduce, runningFold.
Channels. Описание actor.

🐗 Android
Manifest. Описание всех параметров Application, <meta-data/>, <property/>, <uses-library/>, <uses-feature/>, <uses-permission/>, tools:node.
SDK. Описание аннотации CheckSdkIntAtLeast.
Activity. Описание ComponentActivity, FragmentActivity и AppCompatActivity.
Network. Описание формата JSON.
Build. Описание R8 Missing Rules.
UI. Описание strings.xml, синтаксис форматирования, нумерованные аргументы, экранирование символов.

🐗 Compose
Описание LocalActivity.
Описание модификатора Modifier.composed.
Описание аннотации NonRestartableComposable.

🐗 Gradle
Описание метода exclude для исключения зависимостей.
Описание свойства android.nonFinalResIds.
Описание свойства packaging.
Описание свойства networkTimeout.

🐗 Studio
Обновилось описание хоткеев.

🐗 Samples
Добавлено 5 Android-проектов.
Добавлено 3 WearOS-проекта.
Добавлен 1 XR-проект.
Добавлено 8 KMP-проектов.

🐗 ОТКРЫТЬ В NOTION

#roadmap@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
125532211
🐗 Обновление эмодзипака

Добавлено 32 новых эмодзи.
Теперь их ровно 800.

🐗 Shazam

🐗 Apache Airflow

🐗 Apache Flink

🐗 Apache Nifi

🐗 Apache Spark

🐗 Jetbrains Junie

🐗 Grok

🐗 Data ai

🐗 Neural Love

🐗 DeepSeek

🐗 League of Legends

🐗 Perl

🐗 Lisp

🐗 Crystal

🐗 PureScript

🐗 MATLAB

🐗 Nim

🐗 Svelte

🐗 DBeaver

🐗 CodeImage

🐗 Autodesk

🐗 VLC

🐗 Bluetooth

🐗 Geekbench

🐗 Snapdragon

🐗 Debezium

🐗 Zebra Technologies

🐗 Beamery

🐗 OpenCV

🐗 OpenXR

🐗 Helm

🐗 Prometheus

Все паки: первыйвторойтретийчетвертыйпятый

Сайт и миниапп с названиями, поиском и фильтрами

#emoji@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
9422
🐗 Как Android-разработчику сохранять баланс и не выгорать на работе – подробное исследование

Внутри:
• Как удалёнка усиливает чувство изоляции и перегрузки.
• Как совмещать работу и личные проекты без вреда для кукухи.
• Что делать, если уже выгорел.

Приведены реальные истории инженеров и практические советы по восстановлению продуктивности и баланса. Использованы научные исследования и экспертные мнения.

🐗 ЧИТАТЬ В NOTION

🐗 Слушать:

#deepresearch@foundout
Please open Telegram to view this post
VIEW IN TELEGRAM
7511