Роман Елизаров про 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…
👍3
Возможности 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
👍2
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
👍6
Через два дня — живой разбор 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
👍6
Секреты 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
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
❤2👍2
Ищете эффективные инструменты для создания 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
👍2
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
👍3
Контракты в Kotlin или как заключить сделку с совестью
Всем привет, меня зовут Иван, я Android-разработчик и сегодня мы с вами поговорим об контрактах. Предвосхищая вопрос попробую сразу дать все ответы:
Контракты - это давний эксперимент языка Kotlin, какой смысл обозревать их сейчас, когда уже столько написано?
Нормальной статьи на русском языке я не обнаружил;
Я решил выбрать эту тему, так как мы сталкиваемся с контрактами в нашей повседневности, при этом не осознавая, как именно работает та или иная вещь;
Это моя первая проба пера и мне хотелось начать с чего-нибудь достаточно легкого, но при этом интересного.
https://habr.com/ru/articles/910924/
✍️ @kotlin_lib
Всем привет, меня зовут Иван, я Android-разработчик и сегодня мы с вами поговорим об контрактах. Предвосхищая вопрос попробую сразу дать все ответы:
Контракты - это давний эксперимент языка Kotlin, какой смысл обозревать их сейчас, когда уже столько написано?
Нормальной статьи на русском языке я не обнаружил;
Я решил выбрать эту тему, так как мы сталкиваемся с контрактами в нашей повседневности, при этом не осознавая, как именно работает та или иная вещь;
Это моя первая проба пера и мне хотелось начать с чего-нибудь достаточно легкого, но при этом интересного.
https://habr.com/ru/articles/910924/
✍️ @kotlin_lib
👍3
📚 Курс «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
👍6🤣2
Заезжаем в 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
⚡1🔥1🍾1
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
👍3❤1
Почему не стоит использовать
🔸 В
🔸 Но
🔸 Из-за этого два объекта с одинаковыми массивами будут не равны:
🔸 Такая «ссылочная» проверка приводит к проблемам с коллекциями (
✅ Решение: вместо
Тогда
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
👍3
🧩 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
👍5🥱5
Не хотите поговорить о 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
👍3
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
👍3