Роман Елизаров про Kotlin, корутины и работу в Jetbrains / ЧТУК
00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42 Tracing GC в Kotlin
00:36:49 "Что революционного в корутинах?"
00:45:24 Почему Котлин популярный в мобилке
00:48:16 Менеджмент
00:57:19 История и перспективы Kotlin
01:02:45 Уход из JetBrains и олимпиадное программирование
01:11:36 Яндекс
01:15:11 Новое поколение разработчиков
01:21:16 "Современные айти технологии устойчивы"
01:24:23 "Своя" разработка и Open Source
01:35:12 ИИ в разработке
01:51:55 Вопросы подписчиков
02:00:11 Всем пока
https://www.youtube.com/watch?v=PlykPBtsL8E
✍️ @kotlin_lib
00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42 Tracing GC в Kotlin
00:36:49 "Что революционного в корутинах?"
00:45:24 Почему Котлин популярный в мобилке
00:48:16 Менеджмент
00:57:19 История и перспективы Kotlin
01:02:45 Уход из JetBrains и олимпиадное программирование
01:11:36 Яндекс
01:15:11 Новое поколение разработчиков
01:21:16 "Современные айти технологии устойчивы"
01:24:23 "Своя" разработка и Open Source
01:35:12 ИИ в разработке
01:51:55 Вопросы подписчиков
02:00:11 Всем пока
https://www.youtube.com/watch?v=PlykPBtsL8E
✍️ @kotlin_lib
YouTube
Роман Елизаров про Kotlin, корутины и работу в Jetbrains / ЧТУК
Вступай в клуб элитных разработчиков и узнавай секреты профессии тут👇
https://boosty.to/mobiledev/purchase/2228998
00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42…
https://boosty.to/mobiledev/purchase/2228998
00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42…
Возможности Kotlin для создания DSL на примере JsonBuilder
Приглашаем на открытый урок.
🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
Что вас ждёт:
✔️ рассмотрим общую теорию о DSL: назначение, особенности, практика;
✔️ попрактикуемся в создании DSL на примере JsonBuilder;
✔️ рассмотрим возможности Kotlin, полезные для создания DSL.
🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5
👉 Регистрация на вебинар: https://vk.cc/cLUeee
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Приглашаем на открытый урок.
🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
Что вас ждёт:
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблемы масштабируемости Kotlin Multiplatform на крупном проекте
Я начал заниматься нативной разработкой под Android в 2015 году, а в 2017 меня вдохновили два новых мультиплатформенных фреймворка: Flutter и Kotlin Multiplatform. Хотя KMP было сложнее собирать и использовать по сравнению с Flutter, с самого начала я верил, что у него больше потенциала.
В основном потому, что он использует родной язык и практики Android, предлагая при этом максимально тонкий подход к мультиплатформенности.
С тех пор я продолжал следить за его развитием, экспериментируя с новыми возможностями в своих open-source проектах, таких как Coffegram.
Когда KMP стал стабильным, я начал искать возможность применить его в реальном проекте. Здесь я опишу свой опыт работы с ним в одном крупном проекте.
https://proandroiddev.com/kotlin-multiplatform-scalability-challenges-on-a-large-project-b3140e12da9d
✍️ @kotlin_lib
Я начал заниматься нативной разработкой под Android в 2015 году, а в 2017 меня вдохновили два новых мультиплатформенных фреймворка: Flutter и Kotlin Multiplatform. Хотя KMP было сложнее собирать и использовать по сравнению с Flutter, с самого начала я верил, что у него больше потенциала.
В основном потому, что он использует родной язык и практики Android, предлагая при этом максимально тонкий подход к мультиплатформенности.
С тех пор я продолжал следить за его развитием, экспериментируя с новыми возможностями в своих open-source проектах, таких как Coffegram.
Когда KMP стал стабильным, я начал искать возможность применить его в реальном проекте. Здесь я опишу свой опыт работы с ним в одном крупном проекте.
https://proandroiddev.com/kotlin-multiplatform-scalability-challenges-on-a-large-project-b3140e12da9d
✍️ @kotlin_lib
BikeShare — шаринг велосипедов на Kotlin Multiplatform
BikeShare — проект Kotlin Multiplatform с Jetpack Compose и SwiftUI на основе CityBikes API. Поддерживает iOS, Android, десктопы, веб. Для сборки нужна Android Studio Arctic Fox и Xcode 13.2.
https://github.com/joreilly/BikeShare
✍️ @kotlin_lib
BikeShare — проект Kotlin Multiplatform с Jetpack Compose и SwiftUI на основе CityBikes API. Поддерживает iOS, Android, десктопы, веб. Для сборки нужна Android Studio Arctic Fox и Xcode 13.2.
https://github.com/joreilly/BikeShare
✍️ @kotlin_lib
Через два дня — живой разбор AI в Flutter
⏰ 20 мая, 20:00 МСК. Бесплатный вебинар «Интеллект внутри: делаем умные Flutter‑приложения с ML и AI».
Почему стоит подключиться:
— увидите, как запустить нейросети офлайн без серверных счетов;
— разберётесь, чем MediaPipe лучше готовых SDK для жестов;
— научитесь подключать LLM‑подсказки к любому экрану приложения;
— получите скидку на курс «Flutter Mobile Developer».
Код пишем в прямом эфире вместе с Дмитрием Золотовым (Yandex).
Не откладывайте — регистрация закроется при наборе группы.
→ Забронировать место
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⏰ 20 мая, 20:00 МСК. Бесплатный вебинар «Интеллект внутри: делаем умные Flutter‑приложения с ML и AI».
Почему стоит подключиться:
— увидите, как запустить нейросети офлайн без серверных счетов;
— разберётесь, чем MediaPipe лучше готовых SDK для жестов;
— научитесь подключать LLM‑подсказки к любому экрану приложения;
— получите скидку на курс «Flutter Mobile Developer».
Код пишем в прямом эфире вместе с Дмитрием Золотовым (Yandex).
Не откладывайте — регистрация закроется при наборе группы.
→ Забронировать место
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Video Player App — приложение для просмотра видео на MVVM и Kotlin
Пример приложения для Android, написанный на Kotlin и Jetpack Compose, поддерживающий различное расположение навигации в зависимости от размера экрана. Media 3 Exoplayer реализован на основе single activity архитектуры. Он полностью функционален и поддерживает функцию «картинка в картинке».
Еще в приложении используется MVVM, корутины и Flow, Dagger Hilt, Material 3, динамический лейаут с Windows Size Class, Gradle Kotlin DSL, базовые профили.
https://github.com/ryanw-mobile/video-player-app
✍️ @kotlin_lib
Пример приложения для Android, написанный на Kotlin и Jetpack Compose, поддерживающий различное расположение навигации в зависимости от размера экрана. Media 3 Exoplayer реализован на основе single activity архитектуры. Он полностью функционален и поддерживает функцию «картинка в картинке».
Еще в приложении используется MVVM, корутины и Flow, Dagger Hilt, Material 3, динамический лейаут с Windows Size Class, Gradle Kotlin DSL, базовые профили.
https://github.com/ryanw-mobile/video-player-app
✍️ @kotlin_lib
Секреты Kotlin: 7 мощных фич, которые ежедневно используют топ-1% разработчиков
🔹1.
Когда тебе нужно выполнить несколько операций с переменной, которая может быть
🔹2.
Эти функции позволяют элегантно фильтровать значения:
🔹3. Расширения для sealed классов и enum
Расширения можно использовать, чтобы "добавить" поведение к sealed классам или enum'ам:
🔹4. Smart cast с кастомными проверками
Можно создавать собственные методы-проверки с smart cast внутри:
Лучше использовать:
🔹5.
Тип
🔹6. Рефлексия через
В Kotlin можно получить ссылку на класс:
🔹7. Деструктуризация для data классов и пар
Kotlin позволяет удобно "распаковывать" объекты:
Эти фичи не просто украшения синтаксиса — они помогают писать чище, безопаснее и выразительнее. Изучи их и попробуй внедрить в свою повседневную разработку.
https://proandroiddev.com/kotlin-secrets-7-powerful-features-the-top-1-of-developers-use-daily-161e16e2464d
✍️ @kotlin_lib
🔹1.
run
для безопасной работы с nullКогда тебе нужно выполнить несколько операций с переменной, которая может быть
null
, вместо длинного if
лучше использовать run
:
val user: User? = getUser()
user?.run {
println(name)
println(email)
}
🔹2.
takeIf
и takeUnless
Эти функции позволяют элегантно фильтровать значения:
val input = readLine()
val number = input?.toIntOrNull()?.takeIf { it > 0 }
// number будет null, если условие не выполнено
🔹3. Расширения для sealed классов и enum
Расширения можно использовать, чтобы "добавить" поведение к sealed классам или enum'ам:
sealed class Result
object Success : Result()
object Error : Result()
fun Result.log() = when (this) {
Success -> println("Успех")
Error -> println("Ошибка")
}
🔹4. Smart cast с кастомными проверками
Можно создавать собственные методы-проверки с smart cast внутри:
fun Any.isString(): Boolean = this is String
val value: Any = "Hello"
if (value.isString()) {
println((value as String).length) // не очень
}
Лучше использовать:
if (value is String) {
println(value.length) // безопаснее
}
🔹5.
Nothing
как маркер "никогда не возвращается"Тип
Nothing
указывает, что функция либо кидает исключение, либо бесконечна:
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
🔹6. Рефлексия через
::class
В Kotlin можно получить ссылку на класс:
fun <T : Any> printClassName(value: T) {
println(value::class.simpleName)
}
🔹7. Деструктуризация для data классов и пар
Kotlin позволяет удобно "распаковывать" объекты:
data class User(val name: String, val email: String)
val user = User("Oleg", "email@example.com")
val (name, email) = user
Эти фичи не просто украшения синтаксиса — они помогают писать чище, безопаснее и выразительнее. Изучи их и попробуй внедрить в свою повседневную разработку.
https://proandroiddev.com/kotlin-secrets-7-powerful-features-the-top-1-of-developers-use-daily-161e16e2464d
✍️ @kotlin_lib
5 фишек Kotlin, которые должен освоить каждый Android-разработчик
Kotlin — мощный и выразительный язык, который помогает писать чистый и лаконичный код. Ниже — пять возможностей, которыми стоит овладеть каждому Android-разработчику.
1. Расширения функций (Extension Functions)
Расширения позволяют добавлять функции к существующим классам без необходимости наследования. Это особенно полезно для повышения читаемости кода.
Теперь можно использовать эту функцию так:
2. Инлайновые функции (Inline Functions)
Инлайновые функции — это способ уменьшить накладные расходы на вызов лямбда-выражений. Часто применяются с
3. Объекты-одиночки (Object Declarations / Singletons)
В Kotlin ключевое слово
4. Sealed классы
5. Корутины (Coroutines)
Корутины позволяют писать асинхронный код, который выглядит как синхронный. Это облегчает работу с потоками и упрощает логику.
Овладение этими фичами сделает твой код более читаемым, безопасным и мощным. Kotlin действительно раскрывается, когда используешь его возможности по максимуму.
https://artemasoyan.medium.com/5-kotlin-features-every-android-developer-should-master-6ebe8e4e1abd
✍️ @kotlin_lib
Kotlin — мощный и выразительный язык, который помогает писать чистый и лаконичный код. Ниже — пять возможностей, которыми стоит овладеть каждому Android-разработчику.
1. Расширения функций (Extension Functions)
Расширения позволяют добавлять функции к существующим классам без необходимости наследования. Это особенно полезно для повышения читаемости кода.
fun String.capitalizeFirstLetter(): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}
Теперь можно использовать эту функцию так:
val name = "john"
println(name.capitalizeFirstLetter()) // John
2. Инлайновые функции (Inline Functions)
Инлайновые функции — это способ уменьшить накладные расходы на вызов лямбда-выражений. Часто применяются с
higher-order
функциями.
inline fun <T> measureTime(block: () -> T): T {
val start = System.currentTimeMillis()
val result = block()
println("Заняло времени: ${System.currentTimeMillis() - start} мс")
return result
}
3. Объекты-одиночки (Object Declarations / Singletons)
В Kotlin ключевое слово
object
позволяет создавать синглтоны — это удобно, например, для хранения глобальных зависимостей.
object NetworkManager {
fun makeRequest(endpoint: String) {
// логика запроса
}
}
4. Sealed классы
Sealed
классы дают возможность моделировать ограниченные иерархии. Это особенно полезно в when
выражениях без необходимости писать else
.
sealed class Result {
object Click Me Load More : Result()
data class Success(val data: String) : Result()
data class Error(val error: Throwable) : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Click Me Load More -> println("Загрузка...")
is Result.Success -> println("Успех: ${result.data}")
is Result.Error -> println("Ошибка: ${result.error}")
}
}
5. Корутины (Coroutines)
Корутины позволяют писать асинхронный код, который выглядит как синхронный. Это облегчает работу с потоками и упрощает логику.
suspend fun fetchData(): String {
delay(1000)
return "Данные получены"
}
fun main() = runBlocking {
val result = fetchData()
println(result)
}
Овладение этими фичами сделает твой код более читаемым, безопасным и мощным. Kotlin действительно раскрывается, когда используешь его возможности по максимуму.
https://artemasoyan.medium.com/5-kotlin-features-every-android-developer-should-master-6ebe8e4e1abd
✍️ @kotlin_lib
Ищете эффективные инструменты для создания DSL?
Узнайте, как Kotlin может упростить разработку с помощью JsonBuilder!
Приглашаем на открытый урок.
🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
На открытом уроке вы разберете, как Kotlin позволяет создавать DSL (Domain-Specific Languages), оптимизируя процесс разработки. Мы покажем теорию и практику создания DSL на примере JsonBuilder.
Вы не только научитесь создавать собственные DSL, но и освоите замыкания и extension-методы Kotlin, которые дадут вам дополнительные преимущества при написании чистого и гибкого кода.
🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5
👉 Регистрация на вебинар: https://vk.cc/cM6Wwm
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Узнайте, как Kotlin может упростить разработку с помощью JsonBuilder!
Приглашаем на открытый урок.
🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
На открытом уроке вы разберете, как Kotlin позволяет создавать DSL (Domain-Specific Languages), оптимизируя процесс разработки. Мы покажем теорию и практику создания DSL на примере JsonBuilder.
Вы не только научитесь создавать собственные DSL, но и освоите замыкания и extension-методы Kotlin, которые дадут вам дополнительные преимущества при написании чистого и гибкого кода.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Konfeature — библиотека на Kotlin для работы с удалённой конфигурацией фич
Работа с удалённой конфигурацией стала стандартной частью процесса разработки почти любого приложения. В зависимости от сложности могут потребоваться:
* удобный синтаксис для объявления элементов конфигурации
* возможность разделять конфигурацию по разным файлам для разных фич
* возможность использовать локальную конфигурацию на этапе активной разработки фич
* поддержка нескольких источников данных для удалённой конфигурации
* возможность просматривать список всех конфигураций и изменять их значения в целях отладки
* логирование значения и его источника при обращении к конфигурации, а также не‐критичных ошибок
Мы постарались учесть все эти требования при разработке Konfeature.
Установка
Использование
FeatureConfig
Определяет набор элементов конфигурации с помощью делегатов:
*
*
Регистрация конфигурации:
FeatureSource
Абстракция источника значений:
Пример для FirebaseRemoteConfig:
Добавление источника:
SourceSelectionStrategy
Позволяет гибко выбирать, из каких источников запрашивать значение:
Предопределённые стратегии:
*
*
*
https://github.com/RedMadRobot/Konfeature
✍️ @kotlin_lib
Работа с удалённой конфигурацией стала стандартной частью процесса разработки почти любого приложения. В зависимости от сложности могут потребоваться:
* удобный синтаксис для объявления элементов конфигурации
* возможность разделять конфигурацию по разным файлам для разных фич
* возможность использовать локальную конфигурацию на этапе активной разработки фич
* поддержка нескольких источников данных для удалённой конфигурации
* возможность просматривать список всех конфигураций и изменять их значения в целях отладки
* логирование значения и его источника при обращении к конфигурации, а также не‐критичных ошибок
Мы постарались учесть все эти требования при разработке Konfeature.
Установка
repositories {
mavenCentral()
}
dependencies {
implementation("com.redmadrobot.konfeature:konfeature:<версия>")
}
Использование
FeatureConfig
Определяет набор элементов конфигурации с помощью делегатов:
*
by toggle(...)
— для Boolean
*
by value(...)
— для остальных типов
class ProfileFeatureConfig : FeatureConfig(
name = "profile_feature_config",
description = "Конфигурация фич для профиля"
) {
val isProfileFeatureEnabled: Boolean by toggle(
key = "profile_feature",
description = "показывать точку входа в профиль",
defaultValue = false,
)
val profileFeatureTitle: String by value(
key = "profile_feature_title",
description = "заголовок кнопки профиля",
defaultValue = "Feature number nine",
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
val profileButtonAppearDuration: Long by value(
key = "profile_button_appear_duration",
description = "длительность появления кнопки профиля в мс",
defaultValue = 200,
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
}
Регистрация конфигурации:
val profileFeatureConfig = ProfileFeatureConfig()
val konfeatureInstance = konfeature {
register(profileFeatureConfig)
}
FeatureSource
Абстракция источника значений:
interface FeatureSource {
val name: String
fun get(key: String): Any?
}
Пример для FirebaseRemoteConfig:
class FirebaseFeatureSource(
private val remoteConfig: FirebaseRemoteConfig
) : FeatureSource {
override val name: String = "FirebaseRemoteConfig"
override fun get(key: String): Any? {
return remoteConfig
.getValue(key)
.takeIf { source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE }
?.let { value ->
value.getOrNull { asBoolean() }
?: value.getOrNull { asString() }
?: value.getOrNull { asLong() }
?: value.getOrNull { asDouble() }
}
}
private fun FirebaseRemoteConfigValue.getOrNull(getter: FirebaseRemoteConfigValue.() -> Any?): Any? {
return try {
getter()
} catch (error: IllegalArgumentException) {
null
}
}
}
Добавление источника:
val konfeatureInstance = konfeature {
addSource(FirebaseFeatureSource(remoteConfig))
register(profileFeatureConfig)
}
SourceSelectionStrategy
Позволяет гибко выбирать, из каких источников запрашивать значение:
public interface SourceSelectionStrategy {
fun select(names: Set<String>): Set<String>
companion object {
val None: SourceSelectionStrategy = SourceSelectionStrategy { emptySet() }
val Any: SourceSelectionStrategy = SourceSelectionStrategy { it }
fun anyOf(vararg sources: String): SourceSelectionStrategy = SourceSelectionStrategy { sources.toSet() }
}
}
Предопределённые стратегии:
*
None
— всегда использовать только defaultValue
*
Any
— разрешает брать значения из любого источника*
anyOf("Source1", …)
— только из указанных источниковhttps://github.com/RedMadRobot/Konfeature
✍️ @kotlin_lib
Контракты в Kotlin или как заключить сделку с совестью
Всем привет, меня зовут Иван, я Android-разработчик и сегодня мы с вами поговорим об контрактах. Предвосхищая вопрос попробую сразу дать все ответы:
Контракты - это давний эксперимент языка Kotlin, какой смысл обозревать их сейчас, когда уже столько написано?
Нормальной статьи на русском языке я не обнаружил;
Я решил выбрать эту тему, так как мы сталкиваемся с контрактами в нашей повседневности, при этом не осознавая, как именно работает та или иная вещь;
Это моя первая проба пера и мне хотелось начать с чего-нибудь достаточно легкого, но при этом интересного.
https://habr.com/ru/articles/910924/
✍️ @kotlin_lib
Всем привет, меня зовут Иван, я Android-разработчик и сегодня мы с вами поговорим об контрактах. Предвосхищая вопрос попробую сразу дать все ответы:
Контракты - это давний эксперимент языка Kotlin, какой смысл обозревать их сейчас, когда уже столько написано?
Нормальной статьи на русском языке я не обнаружил;
Я решил выбрать эту тему, так как мы сталкиваемся с контрактами в нашей повседневности, при этом не осознавая, как именно работает та или иная вещь;
Это моя первая проба пера и мне хотелось начать с чего-нибудь достаточно легкого, но при этом интересного.
https://habr.com/ru/articles/910924/
✍️ @kotlin_lib
📚 Курс «Kotlin Backend Developer. Professional» — всё, что нужно для создания гибких и производительных приложений.
Что вы освоите:
Почему выбирают нас?
Не упустите шанс!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Не используй use в Kotlin
Многие считают, что
В Java 7 для этого появилась конструкция try-with-resources, которая аккуратно складывает все исключения, а в Kotlin
Поэтому лучше явно закрывать ресурсы в
https://medium.com/@wn8yura/dont-use-use-in-kotlin-1005c9b6b9d4
✍️ @kotlin_lib
Многие считают, что
use
— это идеальный способ управления ресурсами в Kotlin, так как он автоматически закрывает ресурс после использования. Однако стоит быть осторожнее. Когда в блоке use
выбрасывается исключение, ресурс всё равно закроется, но если при закрытии произойдёт ещё одно исключение, то оно может затереть исходное, и ты потеряешь важную информацию о причине ошибки.В Java 7 для этого появилась конструкция try-with-resources, которая аккуратно складывает все исключения, а в Kotlin
use
реализован иначе. Например, если внутри блока работы с файлом что-то пошло не так, а потом и при закрытии возникла ошибка — ты увидишь только вторую, а первая просто исчезнет.Поэтому лучше явно закрывать ресурсы в
finally
, либо использовать Java-подход, если тебе важно не терять исключения.https://medium.com/@wn8yura/dont-use-use-in-kotlin-1005c9b6b9d4
✍️ @kotlin_lib
Заезжаем в Kotlin Multiplatform. Но какой ценой?
Этот доклад - текстовая версия моего выступления с осеннего Мобиуса 2024 года. Обязательно приложу видео с выступлением после выхода. А вот и оно.
О чем поговорим в статье:
Пройдем путь от идеи Kotlin Multiplatform до её реализации в цифрах.
Обсудим, сколько стоило внедрить Kotlin Multiplatform в продукты и к чему это привело.
Проведём ретроспективу: стоило ли это делать вообще и стоит ли инвестировать в эту технологию дальше. А также разберём, сколько это будет стоить в перспективе.
https://habr.com/ru/articles/887574/
✍️ @kotlin_lib
Этот доклад - текстовая версия моего выступления с осеннего Мобиуса 2024 года. Обязательно приложу видео с выступлением после выхода. А вот и оно.
О чем поговорим в статье:
Пройдем путь от идеи Kotlin Multiplatform до её реализации в цифрах.
Обсудим, сколько стоило внедрить Kotlin Multiplatform в продукты и к чему это привело.
Проведём ретроспективу: стоило ли это делать вообще и стоит ли инвестировать в эту технологию дальше. А также разберём, сколько это будет стоить в перспективе.
https://habr.com/ru/articles/887574/
✍️ @kotlin_lib
Не знаешь на кого пойти учиться ?💥
🛑 Пройди бесплатные онлайн-курсы
🛑 Узнай о самых востребованных профессиях
🛑 Получи уникальную возможность поступить в «Алабуга Политех» после 9 или 11 класса
ПРОЙДИ КУРС ПРЯМО СЕЙЧАС!
ПРОЙДИ КУРС ПРЯМО СЕЙЧАС!
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Наглядный пример, когда не следовать best practices for coroutines от Google
Александр Таганов
Александр показал реальный пример из практики Т-Банка, когда следование best practices for coroutines ведет к проблемам. Объяснил, почему это происходит. Показад, чем еще занимается
00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher
источник
✍️ @kotlin_lib
Александр Таганов
Александр показал реальный пример из практики Т-Банка, когда следование best practices for coroutines ведет к проблемам. Объяснил, почему это происходит. Показад, чем еще занимается
main dispatcher
. И рассказал, как избежать подобных проблем00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher
источник
✍️ @kotlin_lib
Почему не стоит использовать
🔸 В
🔸 Но
🔸 Из-за этого два объекта с одинаковыми массивами будут не равны:
🔸 Такая «ссылочная» проверка приводит к проблемам с коллекциями (
✅ Решение: вместо
Тогда
https://proandroiddev.com/avoid-using-array-in-the-data-class-constructor-in-kotlin-ebc308e46a95
✍️ @kotlin_lib
Array
в data class
Kotlin:🔸 В
data class
методы equals()
и hashCode()
генерируются автоматически на основе полей.🔸 Но
Array
в Kotlin (и Java) сравнивает не содержимое, а ссылки на объекты.🔸 Из-за этого два объекта с одинаковыми массивами будут не равны:
data class Person(val name: String, val friends: Array<String>)
val p1 = Person("Mike", arrayOf("Mary", "John", "Tom"))
val p2 = Person("Mike", arrayOf("Mary", "John", "Tom"))
println(p1 == p2) // false!
🔸 Такая «ссылочная» проверка приводит к проблемам с коллекциями (
HashSet
, HashMap
) и к «невидимым» багам: дубликаты, неверные кеш-промахи и т. д.✅ Решение: вместо
Array
используйте коллекции, которые сравнивают содержимое:
data class Person(val name: String, val friends: List<String>)
Тогда
equals()
проверит элементы списка по значению, и Person("Mike", listOf("Mary","John","Tom")) == Person("Mike", listOf("Mary","John","Tom"))
вернёт true
.https://proandroiddev.com/avoid-using-array-in-the-data-class-constructor-in-kotlin-ebc308e46a95
✍️ @kotlin_lib
🧩 Ktorfit — это библиотека, вдохновлённая Retrofit, для HTTP-клиентов на Ktor.
Она позволяет описывать HTTP-запросы с помощью аннотаций прямо в интерфейсах, как в Retrofit. Ktorfit использует KSP (Kotlin Symbol Processing) для генерации кода, поэтому не требует рефлексии и работает быстро.
🔧 Пример использования
Ktorfit создаёт реализацию интерфейса, которую можно использовать вот так:
📦 Особенности:
* Поддержка всех стандартных аннотаций:
* Полная интеграция с
* Генерация кода через KSP — высокая производительность
* Нет зависимости от Android
* Поддержка Kotlin Multiplatform
https://github.com/Foso/Ktorfit
✍️ @kotlin_lib
Она позволяет описывать HTTP-запросы с помощью аннотаций прямо в интерфейсах, как в Retrofit. Ktorfit использует KSP (Kotlin Symbol Processing) для генерации кода, поэтому не требует рефлексии и работает быстро.
🔧 Пример использования
@HttpApi
interface GitHubApi {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<Repo>
}
Ktorfit создаёт реализацию интерфейса, которую можно использовать вот так:
val ktorfit = Ktorfit.Builder()
.baseUrl("https://api.github.com/")
.httpClient(HttpClient())
.build()
val api = ktorfit.create<GitHubApi>()
val repos = api.listRepos("Foso")
📦 Особенности:
* Поддержка всех стандартных аннотаций:
@GET
, @POST
, @Query
, @Path
, @Header
, и др.* Полная интеграция с
Ktor HttpClient
* Генерация кода через KSP — высокая производительность
* Нет зависимости от Android
* Поддержка Kotlin Multiplatform
https://github.com/Foso/Ktorfit
✍️ @kotlin_lib
Не хотите поговорить о Kotlin Contracts?
За время собеседований я заметил одну любопытную вещь: даже опытные котлиноводы частенько не в курсе такой мощной фичи, как Kotlin Contracts.
Этой серией статей я хочу простым человеческим языком показать, зачем нужны Contracts, как их использовать на практике и как они работают внутри.
Какую проблему решают Kotlin Contracts?
Все мы любим Kotlin за умные проверки типов. Например, напишешь так:
И всё работает!
Но стоит вынести ту же проверку в отдельную функцию:
В чём подвох?
https://habr.com/ru/companies/alfa/articles/916536/
✍️ @kotlin_lib
За время собеседований я заметил одну любопытную вещь: даже опытные котлиноводы частенько не в курсе такой мощной фичи, как Kotlin Contracts.
Этой серией статей я хочу простым человеческим языком показать, зачем нужны Contracts, как их использовать на практике и как они работают внутри.
Какую проблему решают Kotlin Contracts?
Все мы любим Kotlin за умные проверки типов. Например, напишешь так:
fun foo(x: Any) {
if (x is List<*>) {
x.size // Всё ок, компилятор молодец!
}
}
И всё работает!
Но стоит вынести ту же проверку в отдельную функцию:
fun isList(x: Any): Boolean = x is List<*>
fun foo(x: Any) {
if (isList(x)) {
x.size // Ошибка: "Unresolved reference: size"
}
}
В чём подвох?
https://habr.com/ru/companies/alfa/articles/916536/
✍️ @kotlin_lib
Media is too big
VIEW IN TELEGRAM
Klibs.io — the dream of creating a Kotlin Package Index
Ignat Beresnev
So you want to build a Kotlin package index.. What is a package anyway, is it the same as an artifact? What makes a project a library then? And why is it an index and not a repository?
источник
✍️ @kotlin_lib
Ignat Beresnev
So you want to build a Kotlin package index.. What is a package anyway, is it the same as an artifact? What makes a project a library then? And why is it an index and not a repository?
источник
✍️ @kotlin_lib