Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.86K subscribers
1.45K photos
68 videos
52 files
4.2K links
Все самое полезное для мобильного разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
Docker vs Server

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

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

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

Что предпочитаете вы? Голосуйте и пишите своё мнение в комментариях 💬

❤️ — Docker
👍 
традиционные серверы
🤝 гибрид

🐸 Библиотека мобильного разработчика 

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🥱1🤝1
Когда нужно использовать crossinline, а когда noinline в Kotlin

Модификаторы crossinline и noinline используются для управления поведением лямбда-выражений, переданных в качестве параметров функций. Они позволяют указывать, может ли лямбда-выражение содержать операторы return.

Модификатор crossinline используется для указания того, что лямбда-выражение не может содержать операторы return, даже если функция, принимающая лямбда-выражение, инлайновая.

Модификатор noinline, с другой стороны, указывает на то, что лямбда-выражение может быть сохранено как объект функции, а не выполнено внутри вызывающей функции. Это может быть полезно в случае, когда вы хотите использовать лямбда-выражение где-то ещё, например, как параметр для другой функции.

ВЫВОД: crossinline должен использоваться только тогда, когда вы уверены в том, что оператор return не будет использоваться внутри лямбда-выражения. Если лямбда-выражение должно содержать оператор return, то следует использовать ключевое слово noinline вместо crossinline.

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
📱 Топ вакансий для мобильных разработчиков за неделю

Flutter-разработчик — от 250 000 ₽, удалёнка

iOS-разработчик — от 200 000 ₽, удалёнка

Junior iOS Developer — от 100 000 до 150 000 ₽, удалёнка

Android-разработчик (Карты) — от 230 000 до 450 000 ₽, гибрид (Москва)

Android разработчик — от 250 000 ₽, удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Mobile jobs

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤫 5 лучших шаблонов Jetpack Compose

Рассмотрим 5 самых важных шаблонов, которые помогут сделать ваш код Compose чище, удобнее в поддержке и масштабируемее.

1️⃣ Подъем состояния

Шаблон: перемещение состояния вверх к родительскому composable и передача его вниз.

@Composable
fun Counter(count: Int, onIncrement: () -> Unit) {
Button(onClick = onIncrement) {
Text("Clicked $count times")
}
}


Зачем: делает ваш пользовательский интерфейс stateless и упрощает тестирование. Меньше побочных эффектов = меньше отладки = больше сна.

2️⃣ Однонаправленный поток данных (UDF)

Паттерн: данные текут вниз, события текут вверх.

• ViewModel предоставляет состояние
• Композабл объекты отслеживают состояние
• События пользовательского интерфейса всплывают через колбеки

Думайте об этом как о родительском контроле: вы даёте инструкции, и хаос (то есть события) находит путь обратно.

3️⃣ Слотовые API

Паттерн: принимает содержимое в качестве параметров (как дочерние элементы в React).

@Composable
fun FancyCard(content: @Composable () -> Unit) {
Card {
content()
}
}


Способствует повторному использованию. Ваши проекты будут вам благодарны, и ваши коллеги тоже, возможно, тоже.

4️⃣ Интеграция ViewModel + StateFlow

Предоставьте доступ к состоянию с помощью StateFlow и соберите его в Composable.

val uiState by viewModel.stateFlow.collectAsState()


Избегайте LiveData, если только вы не создаёте музей Compose.

5️⃣ Stateless vs Stateful композабл

Разделите ваши композабл:

• Stateless: только пользовательский интерфейс
• Stateful: управление логикой

@Composable
fun PasswordInputField(password: String, onChange: (String) -> Unit) { /*...*/ }


Более чёткое разделение, более удобный предварительный просмотр и меньше сюрпризов.

Что бы вы добавили в этот список? Пишите в комментариях 💬

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2🌚1
🤖💻😎 Вайб-кодинг: что это и как к нему относятся IT-специалисты и работодатели

97% программистов уже пробовали ИИ для написания кода. Но где грань между продуктивной помощью и потерей контроля над продуктом? Упрощает ли вайб-кодинг жизнь джунам или затрудняет их развитие? И главное — как к такому подходу относятся айтишники и их работодатели?

👉 Читать статью

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🥱1
📺 Работа с телевизионными каналами на Android TV

При создании приложения под Android TV у вас наверняка могут возникнуть вопросы: как получить доступ к списку телевизионных каналов и как организовать у себя трансляцию?

В этом материале автор ответит на них и расскажет про взаимодействие с телевизором с помощью Android TV Input Framework (TIF), а также получение через него списка доступных каналов. По сути это первый шаг к созданию полноценного TV-приложения.

👉 Читать статью

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⚙️ Реактивное программирование в мобильной разработке

Запутались в RxJava, Coroutines или Combine? Этот промпт поможет разобраться с реактивными подходами.

📝 Промпт

Сравни реактивные подходы для мобильной разработки (RxJava/Kotlin Flow/Swift Combine):

1. Кривая обучения для каждого решения
2. Производительность и потребление памяти
3. Интеграция с существующей кодовой базой
4. Поддержка мультиплатформенной разработки (KMM)
5. Лучшие практики тестирования

Приведи примеры:

1. Работа с сетевые запросами
2. Обработка пользовательских событий
3. Комбинирование нескольких потоков данных


💡 Cовет: Добавьте Explain like I'm a junior developer для простых объяснений

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
☎️ Простая минификация Json тел запросов / ответов с Kotlin Serialization

Недавно в рамках одного из проектов на стеке KMP, Ktor и Kotlin Serialization команда разработчиков решила провести эксперимент, чтобы определить возможность и целесообразность минификации тел запросов и ответов в формате Json.

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

Несмотря на наивность подхода, команде удалось добиться сокращения среднего размера Json-данных (после всех внутренних оптимизаций) на 15–20%.

👉 Читать статью

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
Proglib Academy — это место, где вы превращаете теорию в практику. Здесь ваши знания становятся проектами для портфолио, а вы — более уверенным специалистом.

Выберите курс, который поможет сделать следующий шаг ⬇️

🚀 Для тех, кто начинает путь в IT:

Основы IT для непрограммистов
Программирование на Python (обновлённый)
Frontend-разработчик с нуля: HTML, CSS, JavaScript

🧠 Для будущих и настоящих Data Scientist'ов:

ML для старта в Data Science (начинается в сентябре)
Базовые модели ML и приложения
Математика для Data Science
AI-агенты для DS-специалистов (скоро второй поток)

🛠️ Для опытных разработчиков, готовых к росту:

Алгоритмы и структуры данных
Архитектуры и шаблоны проектирования

Независимо от вашей цели, у нас есть курс, который поможет её достичь. Переходите в Proglib Academy, выбирайте свой путь и инвестируйте в навыки, которые всегда будут в цене!
⚠️ 5 незаметных ловушек Swift

Вот 10 ловушек Swift, которые кажутся безобидными — пока не настигнут вас.

1️⃣ Бездумное использование DispatchQueue.main.async

Да, вам нужно обновлять пользовательский интерфейс в основном потоке. Но если вы слепо обернете все в DispatchQueue.main.async, вы рискуете столкнуться с условиями гонки или задержками обновлений.

DispatchQueue.main.async {
self.label.text = "Updated"
}


Используйте это только в том случае, если вы уверены, что уже не находитесь в главном потоке.

2️⃣ Путаница между типами значений и ссылок

Структуры (такие как User) копируются при присваивании. Классы совместно используются по ссылке.

struct User {
var name: String
}

var a = User(name: "Abhinav")
var b = a
b.name = "Singh"

print(a.name) // Still "Abhinav"


Знайте, когда вам нужна неизменяемость (структура) и когда — общее состояние (класс). Их смешивание приводит к неприятным ошибкам.

3️⃣ Неправильное использование Codable

Codable в Swift — это замечательно… до тех пор, пока не изменится структура JSON и декодирование без предупреждения не завершится с ошибкой.

struct User: Codable {
let id: Int
let name: String
}


Если бэкэнд отправит user_id вместо id, декодирование завершится сбоем.

Используйте CodingKeys явно, когда поля различаются:

enum CodingKeys: String, CodingKey {
case id = "user_id"
case name
}


4️⃣ Неправильное использование @Published в SwiftUI/Combine

Простое добавление @Published не вызывает обновление пользовательского интерфейса вне основного потока или если обновление происходит косвенно.

@Published var name: String = ""

DispatchQueue.global().async {
self.name = "New" // No UI update
}
Всегда обновляйте свойства @Published в главном потоке:

DispatchQueue.main.async {
self.name = "New"
}


5️⃣ Путаница между Any и AnyObject

Они кажутся похожими, но на самом деле это не так. Any означает любой тип. AnyObject означает любой тип класса.

func handle(data: Any) { ... }         // Can be Int, String, Class, etc.
func handleObject(data: AnyObject) { ... } // Only class instances


Будьте точны в том, что вы используете. Использование Any может привести к путанице при преобразовании типов во время выполнения.

Какие ловушки чаще вам встречаются? Пишите в комментариях 💬

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
💰 Сколько ты стоишь как разработчик? 3 способа не прогадать с зарплатой

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

👉 Читать статью

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
3
💻 Топ вакансий для мобильных разработчиков за неделю

iOS разработчик — удалёнка

Senior Android Developer — от 270 000 ₽, удалёнка

Middle/Middle+ iOS Developer — 160 000 —‍ 250 000 ₽, удалёнка

Flutter-разработчик (Умные бьюти-решения) — от 250 000 ₽, гибрид (Москва)

iOS-разработчик — от 250 000 ₽, удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Mobile jobs

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2