wandres.dev
El lenguaje, del null safety a K2

Domina Kotlin
hasta nivel dios

Kotlin como lenguaje: nulabilidad en el sistema de tipos, sealed y exhaustividad, genéricos y varianza, DSLs, corrutinas y Flow por dentro, el compilador K2 y los cuatro backends.

La ruta

40 niveles, de novato a dios

Cada nivel construye sobre el anterior. Sin saltos, sin huecos.

Ontología Nivel 0 · El mapa de Kotlin

La visión aérea del lenguaje: el sistema de tipos y la nulabilidad, las corrutinas, el compilador K2, los cuatro backends y el ecosistema multiplataforma.

Mapa mentalKotlin

El lenguaje Nivel 1 · quince años y un compilador nuevo

De dónde viene Kotlin, qué problema de Java resolvía, la reescritura del compilador con K2, y los objetivos de compilación que hoy soporta.

historiaK2targets

Sintaxis esencial Nivel 2 · todo es una expresión

La base: `val` frente a `var`, inferencia de tipos, `if` y `when` como expresiones, rangos, y por qué apenas hay sentencias en Kotlin.

val/varwhenexpresiones

Funciones Nivel 3 · la unidad de trabajo

Parámetros por defecto y nombrados, funciones de una expresión, funciones locales, `infix`, `vararg` y funciones de nivel superior.

default argsinfixvararg

Null safety Nivel 4 · el sistema de tipos contra el NPE

La nulabilidad en el tipo: `T` frente a `T?`, `?.`, `?:`, `!!`, smart casts, y los platform types que llegan desde Java.

nullableelvisplatform types

Clases y propiedades Nivel 5 · estado con contrato

Constructor primario y secundarios, bloques `init`, propiedades con getter y setter, visibilidad, y por qué en Kotlin no se escriben campos.

constructorpropiedadesvisibilidad

Data classes Nivel 6 · datos sin ceremonia

Qué genera una data class, `equals`/`hashCode`/`toString`/`copy`, el desestructurado posicional y el desestructurado por nombre de 2.3.20.

data classcopydestructuring

Objetos y companion Nivel 7 · singletons en el lenguaje

La palabra clave `object`: singletons, expresiones de objeto, `companion object`, factorías, y su representación real en el bytecode.

objectcompanionsingleton

Sealed y exhaustividad Nivel 8 · modelar el dominio cerrado

Jerarquías cerradas: `sealed class` y `sealed interface`, `when` exhaustivo, y modelar estados imposibles fuera del sistema de tipos.

sealedwhenexhaustivo

Interfaces y delegación Nivel 9 · componer sin heredar

Interfaces con implementación por defecto, resolución de conflictos, y la delegación de implementación con `by` como alternativa a la herencia.

interfacebydelegación

Propiedades delegadas Nivel 10 · interceptar el acceso

`lazy`, `observable`, delegación a un mapa, escribir tu propio delegado, `lateinit`, y los explicit backing fields estables en 2.4.

lazydelegatebacking field

Extensiones Nivel 11 · añadir sin tocar

Funciones y propiedades de extensión: resolución estática, el receptor, el ámbito de importación, y por qué no son inyección de métodos.

extensionreceptorestático

Lambdas Nivel 12 · funciones como valores

Sintaxis de lambda, `it`, el último parámetro fuera de los paréntesis, referencias a función, y los tipos función por dentro.

lambdaitreferencias

Funciones de scope Nivel 13 · let, run, with, apply, also

Las cinco funciones que todo el mundo confunde: qué recibe cada una, qué devuelve, y un criterio claro para elegir sin dudar.

letapplyrun

inline y reified Nivel 14 · el coste de abstraer

Por qué existe `inline`: eliminar la asignación de la lambda; `noinline`, `crossinline`, retornos no locales, y los genéricos `reified`.

inlinereifiedcrossinline

Genéricos y varianza Nivel 15 · in, out y las estrellas

Parámetros de tipo, restricciones, varianza en el sitio de declaración (`in`/`out`) y en el de uso, proyecciones estrella, y el borrado de tipos.

varianzain/outerasure

Colecciones y secuencias Nivel 16 · perezoso frente a ansioso

La jerarquía de solo lectura frente a mutable, los operadores de la stdlib, y cuándo una `Sequence` gana de verdad frente a una lista.

ListSequencelazy

Operadores y convenciones Nivel 17 · sobrecarga por nombre

La sobrecarga de operadores por convención de nombres: `plus`, `get`, `invoke`, `componentN`, `compareTo`, iteradores y rangos propios.

operatorinvokeconvención

DSLs Nivel 18 · lambdas con receptor

El mecanismo detrás de Gradle KTS y Compose: lambdas con receptor, builders con seguridad de tipos, `@DslMarker` y diseñar un DSL usable.

DSLreceiverDslMarker

Contratos y smart casts Nivel 19 · lo que el compilador deduce

Cómo funciona el análisis de flujo que permite el smart cast, por qué falla con propiedades mutables, y los `contracts` de la stdlib.

smart castcontractflujo

Context parameters Nivel 20 · dependencias implícitas

Estables en 2.4: qué problema resuelven, en qué se diferencian de los context receivers que sustituyen, y cómo no abusar de ellos.

context2.4implícito

Errores Nivel 21 · sin excepciones comprobadas

La decisión de eliminar las checked exceptions, `try` como expresión, `Result`, modelar el fallo con sealed classes, y el diseño en las fronteras.

excepcionesResultdiseño

Corrutinas I Nivel 22 · qué es suspender

El corazón del asunto: `suspend` como transformación del compilador, la `Continuation`, el estilo CPS, y por qué una corrutina no es un hilo.

suspendCPSContinuation

Corrutinas II Nivel 23 · concurrencia estructurada

`CoroutineScope`, `Job` y la jerarquía padre-hijo; `launch` frente a `async`, la cancelación cooperativa y la propagación de errores.

scopeJobcancelación

Corrutinas III Nivel 24 · contexto y dispatchers

El `CoroutineContext` como mapa de elementos, los dispatchers y su pool, `withContext`, y el error de creer que el problema es el hilo.

contextdispatcherwithContext

Corrutinas IV Nivel 25 · canales y select

Comunicación entre corrutinas: `Channel` y sus tipos de buffer, productores y consumidores, `select`, y el modelo CSP en Kotlin.

ChannelselectCSP

Flow I Nivel 26 · streams fríos

`Flow` como stream frío: builders, operadores intermedios y terminales, la contrapresión que sale gratis, y el contrato de contexto.

Flowfríooperadores

Flow II Nivel 27 · StateFlow y flujos calientes

`StateFlow` y `SharedFlow`: conflación, réplica, `shareIn` y `stateIn`, y la diferencia real entre un flujo frío y uno caliente.

StateFlowSharedFlowcaliente

El compilador K2 Nivel 28 · frontend, IR y backends

Cómo compila Kotlin hoy: el frontend K2 y su árbol, la representación intermedia común, y por qué la reescritura desbloqueó el resto del ecosistema.

K2IRfrontend

Kotlin/JVM Nivel 29 · la vista desde Java

Cómo se ve tu Kotlin desde Java: nombres, `@JvmStatic`, `@JvmName`, `@JvmOverloads`, nulabilidad en la frontera y las clases sintéticas.

JVMinteropJvmStatic

Value classes Nivel 30 · abstracción sin coste

Las clases de valor y el inline en el runtime: cuándo se elimina el envoltorio y cuándo hay boxing, y su uso para tipos de dominio.

value classboxingruntime

Anotaciones y reflexión Nivel 31 · mirar el propio código

Definir anotaciones y sus targets, la reflexión de Kotlin frente a la de Java, la reflexión ligera, y el coste real de usarla.

anotacionesKClassreflexión

KSP y plugins Nivel 32 · generar en vez de reflexionar

El procesamiento de símbolos con KSP frente al viejo kapt, escribir un procesador, y los plugins de compilador que ya usas sin saberlo.

KSPkaptplugin

Multiplataforma Nivel 33 · expect y actual

El modelo de KMP: source sets y su jerarquía, `expect`/`actual`, qué se comparte de verdad, y el ciclo de compilación multiplataforma.

KMPexpect/actualsource sets

Kotlin/Native Nivel 34 · sin máquina virtual

La compilación nativa: el recolector 2.0 que enterró los objetos congelados, la interoperabilidad con C y Objective-C, y el export a Swift.

NativeGC 2.0Swift export

Wasm y JS Nivel 35 · los otros backends

Kotlin/Wasm con su propio modelo de memoria y compilación incremental, Kotlin/JS y su interoperabilidad, y qué esperar de cada uno.

WasmJSbackends

Testing Nivel 36 · kotlin.test y corrutinas

Tests multiplataforma con `kotlin.test`, testear código suspendido con `runTest` y dispatchers de prueba, y el tiempo virtual.

kotlin.testrunTestTestDispatcher

Diseño de API Nivel 37 · compatibilidad binaria

Escribir una biblioteca: `explicit API mode`, qué rompe la compatibilidad binaria y no la de fuente, `@Deprecated` y las opt-in APIs.

APIbinariaopt-in

Rendimiento Nivel 38 · dónde asigna Kotlin

El coste oculto: lambdas que asignan, boxing de primitivos y nullables, el escape analysis de la JVM, y cómo medir antes de optimizar.

asignaciónboxingmedir

Nivel Dios: Kotlin Nivel 39 · síntesis y el futuro

El modelo mental completo del lenguaje, cómo se decide una nueva característica en el proceso KEEP, leer la fuente del compilador y hacia dónde va.

síntesisKEEPfuturo
196lecciones
40niveles
0→∞de cero a dios

¿Listo para dominar Kotlin?

Empieza por los fundamentos y sube nivel a nivel hasta el dominio total.

Comenzar el camino →