Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
- Telegram Web
Telegram Web
Роман Елизаров про 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
Возможности Kotlin для создания DSL на примере JsonBuilder

Приглашаем на открытый урок.

🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

Что вас ждёт:
✔️ рассмотрим общую теорию о DSL: назначение, особенности, практика;
✔️ попрактикуемся в создании DSL на примере JsonBuilder;
✔️ рассмотрим возможности Kotlin, полезные для создания DSL.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cLUeee

Реклама. ООО «Отус онлайн-образование», ОГРН 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
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
Через два дня — живой разбор AI в Flutter

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
Секреты Kotlin: 7 мощных фич, которые ежедневно используют топ-1% разработчиков

🔹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)

Расширения позволяют добавлять функции к существующим классам без необходимости наследования. Это особенно полезно для повышения читаемости кода.


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
Please open Telegram to view this post
VIEW IN TELEGRAM
Konfeature — библиотека на Kotlin для работы с удалённой конфигурацией фич

Работа с удалённой конфигурацией стала стандартной частью процесса разработки почти любого приложения. В зависимости от сложности могут потребоваться:

* удобный синтаксис для объявления элементов конфигурации
* возможность разделять конфигурацию по разным файлам для разных фич
* возможность использовать локальную конфигурацию на этапе активной разработки фич
* поддержка нескольких источников данных для удалённой конфигурации
* возможность просматривать список всех конфигураций и изменять их значения в целях отладки
* логирование значения и его источника при обращении к конфигурации, а также не‐критичных ошибок

Мы постарались учесть все эти требования при разработке 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
⌨️ Kotlin: ключ к современным backend-решениям!

📚 Курс «Kotlin Backend Developer. Professional» — всё, что нужно для создания гибких и производительных приложений.

Что вы освоите:

✔️ Работу с Kotlin Multiplatform для JS, JVM, Android, iOS.
✔️ Spring, Ktor, RabbitMQ, Kafka, Postgres.
✔️ Создание архитектуры: монолиты, микросервисы и бессерверные решения.
✔️Реальные кейсы: разработка стартапа с нуля.

Почему выбирают нас?

✔️ Живые лекции от экспертов топовых компаний.
✔️ Диплом OTUS, который признают крупные работодатели.
✔️ Практика, которая готовит к сложным проектам.

🎁 Дарим промокод, который дает скидку на обучение - Kotlin5

Не упустите шанс!

👉 Пройдите тестирование и получите скидку: https://vk.cc/cMkZGW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Не используй use в Kotlin

Многие считают, что 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
Не знаешь на кого пойти учиться ?💥

🛑Пройди бесплатные онлайн-курсы

🛑Узнай о самых востребованных профессиях

🛑Получи уникальную возможность поступить в «Алабуга Политех» после 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 ведет к проблемам. Объяснил, почему это происходит. Показад, чем еще занимается main dispatcher. И рассказал, как избежать подобных проблем

00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher

источник

✍️ @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) для генерации кода, поэтому не требует рефлексии и работает быстро.

🔧 Пример использования


@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 за умные проверки типов. Например, напишешь так:


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
2025/07/05 17:49:26
Back to Top
HTML Embed Code: