Мобильная разработка #1
3.89K subscribers
788 photos
85 videos
32 files
1.25K links
Всё о создании приложений под Android и iOS в одном месте.

🔹 Инструменты, библиотеки и ресурсы для ускорения работы.
🔹 Статьи и гайды для разработчиков любого уровня.
🔹 Тренды мобильной разработки и новости индустрии.

Реклама @evgenycarter
Download Telegram
🧟‍♂️ Зомби в вашем коде: Почему приложение «пухнет» со временем

Бывало такое? Вы открыли экран, закрыли его, а память не освободилась. Сделали так 10 раз и приложение упало.
Поздравляю, у вас Memory Leak (Утечка памяти).

Это происходит, когда объект (например, тяжелая Activity или ViewController) уже не нужен пользователю, но сборщик мусора (GC) не может его удалить, потому что кто-то другой всё еще держит на него ссылку.

Главные причины утечек (Checklist):

🛑 Android:

1. Static Context: Никогда не сохраняйте Context или View в статические переменные!
Плохо: companion object { var myView: TextView? = null } - это удержит всю Activity в памяти навсегда.


2. Забытые слушатели: Если вы подписались на синглтон (LocationManager.addListener(this)), но забыли отписаться в onDestroy - Activity останется жить вечно.
3. Внутренние классы: Анонимные классы (например, Handler или AsyncTask) неявно хранят ссылку на внешний класс.

🛑 iOS:

1. Retain Cycles (Циклы сильных ссылок):
Объект А держит Б, а Б держит А. Они никогда не удалятся.
Классика: Вы передали self внутрь замыкания (closure), которое сохранено в свойстве этого же класса.
Лечение: Всегда используйте [weak self] внутри клоужеров, если есть риск цикла.



🛠 Инструменты для поиска (Без них вы слепы):

🐤 Android - LeakCanary:
Библиотека от Square. Must-have в любом debug-билде.
Она автоматически следит за Activity/Fragment. Если происходит утечка, она присылает уведомление (буквально кричит), дампит память и показывает красивое дерево ссылок: кто именно держит ваш объект.

📊 iOS - Memory Graph Debugger:
В Xcode есть встроенная кнопка (три шарика, соединенных линиями) в нижней панели дебага.
Нажимаете её во время работы приложения - и Xcode показывает граф всех объектов в памяти. Ищите фиолетовые восклицательные знаки (⚠️) - это утечки.

💡 Совет: Утечки памяти коварны тем, что на мощном телефоне разработчика они незаметны. А у пользователя на старом Android с 3 ГБ RAM приложение вылетит через 5 минут. Проверяйте память хотя бы раз в спринт.

А вы используете [weak self] везде «на всякий случай» или только там, где нужно? 👇

#memory #performance #leaks #leakcanary #ios #android #middle #optimization

👉 @developer_mobila
👍41
🎭 Искусство обмана: Зачем нужны Mock-объекты (и почему без них тесты - мусор)

Представьте: вы пишете тест для экрана Логина.
Вы нажимаете «Войти» в коде теста -> идет запрос на реальный сервер -> сервер отвечает 200 OK -> тест проходит.

На следующий день у вас пропал интернет. Или бэкенд упал. Или Вася с бэкенда поменял JSON.
Ваш тест упал 🔴.
Но ваш код Логина не менялся и работает правильно!

Это Flaky Test (Хрупкий тест). Он проверяет не вашу логику, а погоду на Марсе (доступность сервера).

🛡 Решение: Mocking (Мокирование)

В Unit-тестах мы должны тестировать классы в изоляции.
Ваш ViewModel / Presenter не должен знать, что существует настоящий сервер или база данных. Ему нужно подсунуть «куклу» (Mock).

Как это работает (на пальцах):

1. У вас есть интерфейс AuthRepository.
2. В реальном приложении вы используете NetworkAuthRepository (который ходит в сеть).
3. В тесте вы создаете Mock этого репозитория.

Что умеет Mock:
Вы говорите ему: "Слушай, когда у тебя вызовут метод login("admin", "123"), не ходи ни в какую сеть. Просто верни мне Success мгновенно" (или Error, если хотите проверить обработку ошибок).

🛠 Инструменты Мидла:

🤖 Android (Kotlin):
Забудьте про Mockito (он из мира Java). Используйте MockK.


// Создаем мок
val repository = mockk<AuthRepository>()

// Обучаем его (Stubbing)
coEvery { repository.login(any(), any()) } returns Result.Success(User("Max"))

// Тестируем ViewModel
viewModel.onLoginClicked()

// Проверяем, что метод был вызван (Verification)
coVerify { repository.login("admin", "pass") }



🍏 iOS (Swift):
В Swift часто пишут моки вручную (создают класс MockAuthRepo, реализующий протокол), так как рефлексия ограничена.
Либо используют генераторы: Sourcery или Cuckoo.
Суть та же:


class MockAuthRepo: AuthRepository {
var loginResult: Result<User, Error>?

func login(...) {
return loginResult! // Возвращаем то, что настроили заранее
}
}



💡 Главная мысль:
Unit-тесты должны работать без интернета, без эмулятора и выполняться за миллисекунды. Если ваш тест идет 5 секунд - это не Unit-тест.

А какой процент покрытия кода тестами (Code Coverage) в вашем проекте? (Если 0% - не стесняйтесь, ставьте 🌚) 👇

#testing #unit #mockk #android #ios #quality #middle

👉 @developer_mobila
👍1
Подводные камни миграции на Swift 6, о которых стоит знать

Swift 6 вводит более строгие проверки изоляции конкурентности и поддерживает поэтапную миграцию, модуль за модулем. Хотя рекомендуемая Apple стратегия выглядит мягкой, на практике вы можете столкнуться со скрытыми сбоями во время выполнения, особенно когда в проекте одновременно сосуществуют модули на Swift 5 и Swift 6.

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

https://www.hughlee.page/en/posts/swift-6-migration-pitfalls/

#ios

👉 @developer_mobila
👍1
🚀 Хватит собирать билды руками: Введение в CI/CD

Знакомая боль: вы закончили крутую фичу, и QA просит тестовую сборку. Вы переключаете ветку, жмете "Build APK" (или "Archive" в Xcode) и... идете гулять на 20 минут. Ноутбук гудит как турбина самолета, интерфейс тормозит, работать невозможно.
А потом тестировщик пишет: "Слушай, а ты версию (versionCode) забыл поднять, оно не ставится поверх старого". 🤦‍♂️

Сборка релизов руками со своего компьютера - это огромная трата времени и источник человеческих ошибок (забыли сменить конфиг с Debug на Release, выбрали не тот сертификат).

Взрослые команды используют CI/CD (Continuous Integration / Continuous Deployment).

⚙️ Как это выглядит у Мидлов:
Вы просто делаете git push или сливаете Pull Request в ветку develop. ВСЁ. Ваша работа закончена.
Дальше начинается магия:

1. В облаке просыпается виртуальный сервер.
2. Он скачивает свежий код.
3. Запускает линтеры и Unit-тесты (о которых мы говорили раньше). Если они упали - сборка отменяется, а вам в Slack/Telegram прилетает по шапке.
4. Если всё зелено — сервер сам увеличивает номер версии, собирает приложение и подписывает его нужным ключом.
5. Готовый файл (APK/IPA) автоматически улетает в Firebase App Distribution, TestFlight или прямо в чатик QA.

🛠 Что нужно знать мобильному разработчику (Инструменты):

Fastlane: Это абсолютный мастхэв индустрии (работает и для iOS, и для Android). Это инструмент, который превращает клики мышкой по настройкам в простой код. Он умеет всё: от сборки до автоматического создания скриншотов для App Store / Google Play.

GitHub Actions / GitLab CI / Bitrise: Это те самые «облачные серверы» (Runner'ы), которые будут выполнять ваши команды из Fastlane каждый раз, когда вы пушите код.

💡 Правило чистой среды:
Главный плюс CI/CD - код собирается на «чистой» машине. Это навсегда убивает отмазку -А у меня локально всё собирается и работает!". Если код не собрался на CI - значит, он сломан.


#cicd #automation #fastlane #android #ios #middle #githubactions

👉 @developer_mobila
👍1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
👎4💩1
👩‍💻 Открытый урок «Знакомство с Kotlin: пишем первый код»

🗓 5 марта в 20:00 МСК

🆓 Бесплатно. Урок в рамках старта курса «Kotlin Developer. Basic» от Otus.

Программа вебинара:
Разберем три ключевых преимущества Kotlin: безопасность null, лаконичность и совместимость.
Напишем небольшой, но полезный фрагмент, который решает понятную задачу.
Ответим на главный вопрос: почему Kotlin — это не просто «улучшенная Java», а другой подход к разработке.


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


🔗 Ссылка на регистрацию: https://vk.cc/cUZHBX


Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📶 Что видит пользователь, когда заходит в лифт? (Или почему ваш лоадер всех бесит)

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

Подход Джуна (Прямая труба):
Запрос в сеть -> Показ лоадера на весь экран -> Ошибка тайм-аута -> Пустой белый экран.
А если пользователь случайно повернет телефон (сменит ориентацию) - лоадер появится снова, потому что Activity пересоздалась и запрос полетел заново. Это боль.

Подход Мидла (Single Source of Truth - SSOT):
Открыл приложение -> Мгновенно увидел вчерашние данные из кэша -> В фоне пошел незаметный запрос в сеть -> Лента плавно обновилась свежими данными.

Как это работает (Паттерн SSOT):
Запомните золотое правило: UI никогда не должен получать данные напрямую из сети!

Единственным источником «правды» для экрана должна быть ваша локальная База Данных (БД).

1. Ваш ViewModel / Presenter просто подписывается на изменения в БД.
2. Когда нужно обновить данные, Repository идет в сеть.
3. Скачанные из сети данные сохраняются в Базу Данных.
4. База данных отправляет сигнал в UI: "Эй, у меня новые данные, перерисуйся!".

🛠 Чем пользуются профи:

🤖 Android:
Связка Room + Flow (или LiveData).
Вы пишете в DAO: fun getNews(): Flow<List<News>>. UI начинает слушать этот Flow. Как только метод из сети сделает insert(newItems) в базу, Room сам протолкнет новые данные в Flow, и UI обновится. Магия!

🍏 iOS:
Современный SwiftData (или старая добрая CoreData) + макрос @Query (в SwiftUI) или Combine.
Принцип тот же: UI биндится к хранилищу. Вы просто обновляете контекст базы, а списки на экране разъезжаются и анимируются сами.

💡 Совет:
Такой подход не только спасает от отсутствия интернета, но и решает проблему пагинации, поиска и шаринга данных между разными экранами (ведь все они смотрят в одну базу).

#architecture #offlinefirst #ssot #android #ios #middle #caching

👉 @developer_mobila
2👍1
🚀 Как прогнать 37 000 тестов за 12 минут вместо 3 часов?

В крупных проектах unit-тесты со временем превращаются в «тыкву»: их становится так много, что CI не выдерживает, а локальный запуск превращается в утопию. Ребята из Альфа-Банка столкнулись именно с этим в своем Android-приложении (800+ модулей) и поделились крутым кейсом оптимизации.

В чем была проблема?

1. Инициализация моков. Оказалось, что mockk<Activity>() может занимать больше 1 секунды из-за генерации байт-кода на лету. Второго такого «золотого» вызова нет (кешируется), но...

2. Gradle и изоляция. Gradle запускает тесты каждого модуля в отдельном JVM-процессе. Итог: кеш байт-кода не шерится, и в каждом модуле мы снова и снова тратим секунды на тяжелые моки.

3. Утечки в MockK. Метод clearAllMocks() со временем работает всё медленнее из-за раздувания внутренней карты объектов.

Что сделали:
Отказались от стандартного распараллеливания Gradle по модулям. Вместо этого написали кастомную таску, которая собирает все тесты в единый classpath.
Ручное дробление. Все тесты разбили на 10 чанков (по количеству ядер/воркеров) и запустили их в 10 долгоживущих JVM-процессах.
Чистка рефлексией. Пофиксили деградацию MockK, принудительно очищая внутренние мапы библиотеки через рефлексию.

Результат:
Время прогона упало с 180 минут до 12 минут. На пулл-реквестах с учетом импакт-анализа тесты теперь пролетают вообще за минуту.

Минусы подхода:
Снижается изоляция. Если кто-то забыл сделать unmockkStatic, это может «отстрелить» в совершенно другом тесте, который попал в тот же процесс.

Подробный разбор с примерами кода и ссылкой на черновики Gradle-плагина читайте в статье: https://habr.com/ru/companies/alfa/articles/993352/

#Android #Gradle #Testing #Performance #Architecture

👉 @developer_mobila
👍2😱1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌

https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌

https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
👎3👍1😁1🤬1
🍔 Приложение на диете: Как не заставлять пользователя удалять фото ради вашего кода

Знакомая ситуация: вы сделали простенькое приложение со списком задач, собираете релиз, а маркетплейс показывает размер - 80 МБ. Пользователь, стоя на улице с мобильным интернетом, видит эту цифру и думает: "Да ну его, скачаю потом (никогда)".

Почему приложения «толстеют»?
Новички обожают тащить огромные библиотеки ради одной функции. Подключили гигантский фреймворк ради красивой анимации кнопки? Добавили 15 шрифтов и картинки в формате PNG без сжатия? Поздравляю, у вас ожирение.

Взрослые проекты борются за каждый мегабайт. И главное оружие здесь - Minification & Shrinking (Минификация и удаление неиспользуемого).

🛠 Как худеют приложения:

🤖 Android (R8 / ProGuard):
В файле build.gradle у сеньоров всегда написано:

buildTypes {
release {
minifyEnabled true // Включает обфускацию и удаление мертвого кода
shrinkResources true // Удаляет неиспользуемые картинки и XML
}
}

Что это делает?

1. Shrinking: R8 анализирует ваш код. Если вы импортировали огромную библиотеку, но используете из нее один метод - R8 просто вырежет остальные 99% библиотеки из финального APK.

2. Obfuscation (Обфускация): R8 переименовывает ваши красивые классы NetworkUserRepository в a.b.c. Это не только уменьшает вес файла, но и усложняет жизнь хакерам (Reverse Engineering).

💥 Обряд посвящения:
Каждый разработчик хоть раз в жизни ловил краш на Релизе, потому что R8 переименовал классы для работы с сетью (JSON модели), и парсер сошел с ума. Решение: аннотация @Keep над data-классами.

🍏 iOS (App Thinning & Dead Code Stripping):
Apple делает много магии под капотом:

1. Dead Code Stripping: Компилятор LLVM автоматически вырезает функции и классы, которые нигде не вызываются (включается в Build Settings).

2. App Slicing: Когда пользователь скачивает приложение, App Store отдает ему не весь ваш бинарник со всеми картинками мира, а только те ресурсы, которые нужны для его конкретного устройства (например, только картинки @3x для iPhone 15 Pro, вырезая старые @2x). Главное - хранить всё в Assets.xcassets.

💡 Золотое правило:
Прогоняйте все растровые картинки через сервисы сжатия (TinyPNG), а лучше - переходите на вектор (SVG / PDF / ImageVectors). Вектор весит килобайты и идеально скейлится на любые экраны.

#appsize #optimization #proguard #r8 #android #ios #middle #performance

👉 @developer_mobila
👍21
TUIkit — UI-фреймворк для терминалов

Фреймворк, похожий на SwiftUI, для создания пользовательских терминальных интерфейсов на Swift: без ncurses, без зависимостей от C, только чистый Swift.

TUIkit позволяет создавать приложения, используя тот же декларативный синтаксис, который вы уже знаете из SwiftUI. Определяйте свой пользовательский интерфейс с помощью View, создавайте представления с помощью VStack, HStack и ZStack, стилизуйте текст с помощью модификаторов, таких как .bold() и .foregroundColor(.red), и запускайте все это в терминале.

https://github.com/phranck/TUIkit

👉 @developer_mobila
👍2
🧠 ИИ-ассистенты помогают писать код, но часто делают это неправильно. Подсказки могут ломать архитектуру проекта, предлагать неверные решения или генерировать код, который трудно поддерживать.

🗓 25 марта в 20:00 МСК разберём, почему ИИ-ассистенты ошибаются при генерации кода, как структура проекта влияет на качество подсказок и какие принципы помогают писать ИИ-дружелюбный код.

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

➡️Открытый урок проходит в преддверии старта курса «Flutter-разработчик». Принять участие: https://vk.cc/cVBlt8

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🧹 Синдром страуса: Зачем вы прячете баги под ковер?

Хуже падающего приложения (Crash) может быть только приложение, которое «незаметно сломалось».

Пользователь жмет кнопку «Оплатить», а ничего не происходит. Лоадер покрутился и исчез. Приложение не упало, но функция не работает. Почему?
Потому что в коде написано это:


try {
api.buyPremium()
} catch (e: Exception) {
// TODO: обработать ошибку потом
print(e.message)
}


Подход Джуна: Поймать ошибку, чтобы приложение не скрашилось, вывести её в консоль (print или Log.e) и забыть. Но секрет в том, что консоль на телефоне реального пользователя никто не читает! Ошибка исчезает в пустоте.

Подход Мидла (Fail gracefully, log loudly):
Приложение должно мягко обработать ошибку для пользователя (показать красивый Снекбар «Упс, что-то пошло не так»), но при этом громко заорать об этом разработчикам.

🛠 Инструменты (Что должно быть в каждом проекте):

🔥 Firebase Crashlytics / Sentry:
Это не только для фатальных крашей! У них есть суперсила - Non-Fatal Exceptions (Нефатальные ошибки).
Вместо пустого print, вы пишете:
FirebaseCrashlytics.getInstance().recordException(e)
Теперь каждое такое «тихое» падение сети или парсинга JSON прилетит вам на дашборд с аналитикой: у скольких пользователей это случилось, на каких моделях телефонов и версиях ОС.

🍞 Хлебные крошки (Breadcrumbs):
Представьте, что к вам прилетел краш: NullPointerException на строке 42. Как его воспроизвести?
Сеньоры добавляют логирование действий до ошибки:
Crashlytics.log("User opened Cart") -> Crashlytics.log("Clicked Checkout") -> Crash!
Теперь вместе с краш-репортом вы получаете историю шагов пользователя. Баг фиксится за 5 минут вместо 5 часов гадания на кофейной гуще.

💡 Правило хорошего тона:
В Debug-сборке приложение должно падать с треском при любой неконсистентности данных (чтобы тестировщик или вы сразу это заметили). А в Release-сборке - пытаться выжить, но молча отправлять отчет вам на сервер.

Признавайтесь, много у вас в проекте забытых TODO внутри catch? 👇

#crashlytics #firebase #sentry #debugging #errors #android #ios #middle

👉 @developer_mobila
👍2👏1
iOS network frameworks и HTTP TCP Server внутри приложения

Привет. В iOS разработке работа с сетью является одной из ключевых задач. Для этого существует целый арсенал инструментов: от высокоуровневого URLSession до работы с низкоуровневыми BSD сокетами.

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

https://habr.com/ru/articles/991366/

👉 @developer_mobila
👍1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌

https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌

https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
🤮4💩3👎1
💳 Кредитная карта в коде: Почему за техдолг придется платить с процентами?

В начале карьеры кажется: «Главное работает, а код... ну, потом причешу». Вы копипастите кусок из StackOverflow, зашиваете константы прямо в Activity и пропускаете тесты, чтобы успеть к релизу.
Поздравляю, вы только что взяли кредит у своего будущего.

Технический долг - это цена, которую вы платите за быстрые и некачественные решения.

Как это выглядит (Симптомы):

1. Страх перемен: Вы боитесь тронуть старый класс DataHelper, потому что всё приложение может развалиться.

2. Эффект бабочки: Фиксите баг в одном месте - вылетает два новых в другом.

3. Onboarding-катастрофа: Новый разработчик в команде неделю не может понять, как работает экран корзины.


📈 Проценты по кредиту:
Если долг не отдавать (не рефакторить), «проценты» растут. Скорость разработки падает. То, что раньше занимало 2 часа, теперь занимает 2 дня, потому что 90% времени уходит на борьбу с «костылями».

🛡 Как выходить из долговой ямы (Стратегии Мидла):

1. Правило Бойскаута: Оставляйте код чище, чем он был до вас. Зашли поправить мелкий баг? Заодно переименуйте кривую переменную или вынесите магическую строку в константу. По чуть-чуть, каждый день.

2. Технический бэклог: Не прячьте техдолг в // TODO. Заводите реальные задачи в Jira/Trello. Если проблема не записана - её не существует.

3. Правило 20%: Договоритесь с менеджером, что 20% времени спринта уходит на стабилизацию и рефакторинг.
Аргумент для бизнеса: «Если мы не сделаем это сейчас, через полгода добавление новой кнопки будет стоить нам в 3 раза дороже».

4. Code Review: Это ваш фильтр. Не пропускайте «грязный» код коллег (и свой тоже) только потому, что «нужно срочно».

💡Техдолг это нормально, если он осознанный. Иногда реально нужно выкатиться «вчера», чтобы проверить гипотезу. Но плохой разработчик забывает о долге, а хороший - планирует его выплату.

#cleanarch #techdebt #refactoring #quality #development #middle #management

👉 @developer_mobila
👍3
Что ЯНДЕКС ЖДЁТ от СТАЖЁРОВ? Разбор задания

Проверяются не только технические навыки, но и способность:
• анализировать чужой код
• аргументировать решения
• четко выражать мысли

TimeCode:
00:00 - Что? Для кого? Для чего?
00:50 - Исходный код
01:22 - Выбор стратегии
02:47 - Подготовительные действия
03:19 - Product Service
03:45 - 1.Class to Struct
04:24 - Decodable
05:22 - 2. Snake_case to CamelCase
06:45 - Код для работы проекта
09:12 - 3. final class
11:09 - 4. extension UITableViewDataSource
12:46 - 5. Инкапсуляция / private
14:20 - 6. Setup TableView
15:41 - private Products
17:19 - 7. super.viewDidLoad
19:30 - 8. Delegate / DataSource
22:01 - Код для работы проекта
22:35 - 9. Register UITableViewCell
24:16 - 10. dequeueReusableCell
25:57 - 11. Oneliner return
27:00 - 12. DispatchQueue.main.async
28:49 - 13. Protocol / Dependency Injection (DI)
34:44 - Код для работы проекта
36:11 - RetainCycle часть 1
42:36 - RetainCycle часть 2
44:49 - Опросы / Проверка знаний
45:29 - RetainCycle часть 3
47:58 - RetainCycle часть 4
49:22 - 14. Handle error
51:58 - 15. fetchRequest
52:40 - Итог

https://www.youtube.com/watch?v=vfBoSiAPv7M

👉 @developer_mobila
👍1😁1
🪦 Кладбище «Hello World»: Почему вы не дописываете свои проекты?

У каждого из нас есть папка Dev/Projects, где лежат десятки папок: MySuperApp, NewBankApp, FitnessTracker_v2. Внутри - пара сверстанных экранов и пустой репозиторий.

Почему мы бросаем идеи на полпути? Потому что относимся к пет-проекту как к работе, а не как к продукту.

Типичный цикл провала:
1. Загорелся идеей.
2. Решил использовать все самые новые и сложные технологии сразу (просто чтобы выучить).
3. Потратил 2 недели на настройку архитектуры и DI.
4. Устал, стало скучно, забросил.

🚀 Как попасть в 5% разработчиков, которые доводят проект до Стора:

1. Принцип MVP (Minimal Viable Product):
Ваше приложение должно решать ОДНУ задачу. Сделайте её за выходные. Не нужно делать «соцсеть для любителей кактусов» с чатами, видеозвонками и ИИ. Сделайте ленту с фото кактусов. Всё.

2. Выбирайте ОДНУ новую технологию:
Если вы хотите выучить Compose или SwiftUI - пишите на них, но остальной стек (сеть, БД) берите максимально знакомый. Если менять всё сразу, вы утонете в багах окружения.

3. Готово лучше, чем идеально:
На пет-проектах мы часто страдаем «перфекционизмом кода». Переписываем один и тот же экран по три раза, потому что «вышла новая версия библиотеки». Стоп. Сначала релиз - потом рефакторинг.

4. Считайте время в часах, а не в днях:
Выделите себе 4 часа в субботу. Поставьте конкретную задачу: «Сделать экран настроек». Если задача не выполнена - выделите еще 2 часа завтра. Маленькие победы кормят ваш дофамин.

💡 Зачем это вообще нужно?
Релизнутый проект в App Store или Google Play, даже самый простой, стоит десяти курсов на Udemy. Это показывает работодателю, что вы умеете не только писать код по ТЗ, но и доводить продукт до конца.

А сколько «трупов» в вашей папке проектов прямо сейчас? Признавайтесь 👇

#petproject #career #motivation #android #ios #middle #startup

👉 @developer_mobila
👍1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌

https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌

https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
🤡3👎2👍1💩1
Android-разработчики, держите полезный кейс про сериализацию, на котором легко поймать неочевидный краш.

В Альфа-Банке разобрали ситуацию, когда payload: Any в модели экрана объявлен как Serializable, а внутри в какой-то момент прилетает Intent. Итог - падение с NotSerializableException, потому что Intent поддерживает Parcelable, но не Serializable.

Что предлагают:
• хранить рядом с объектом маркер типа сериализации;
• при записи в Parcel динамически выбирать Parcelable или Serializable;
• при чтении восстанавливать объект через соответствующий механизм.

Самое интересное - проблема не только в выборе способа сериализации, но и в classLoader.
Если читать обобщённый Parcelable “в лоб”, можно уехать в BootClassLoader, где нет классов приложения, и десериализация сломается. Решение - в таких местах использовать contextClassLoader приложения. То же касается и Serializable.

Полезный материал для тех, кто:
• поддерживает legacy Android-код;
• постепенно мигрирует на Parcelable;
• хочет лучше понимать, что происходит под капотом SDK.


https://habr.com/ru/companies/alfa/articles/1013158/

👉 @developer_mobila
👍1