Learn Kotlin by doing — the language behind modern Android and much server-side JVM work. Concise syntax and type inference, null safety that kills the billion-dollar mistake, functions and lambdas, classes and the data/sealed/object types that make Kotlin expressive, the collections functional toolkit, and coroutines with Flow for asynchronous code that reads like sequential code.
Before you start
Any prior programming experience helps — if Kotlin is your first language, the Python course teaches the fundamentals gently; if you know Java, Kotlin will feel like a lighter version of it.
Kotlin Basics
Values and variables, type inference, string templates, and control flow as expressions. The concise foundations that make Kotlin feel lighter than Java while running on the same JVM.
Null Safety
Kotlin bakes null handling into the type system, so the NullPointerException that plagues Java becomes a compile-time concern. Learn nullable types and the operators — ?., ?:, !! — that handle them safely.
Functions & Lambdas
Functions are first-class in Kotlin. Learn default and named arguments, single-expression functions, lambdas and higher-order functions, and extension functions — the feature that lets you add methods to any type.
Classes, Data & Sealed Types
Kotlin’s object model is concise and expressive — primary constructors, data classes that generate boilerplate for you, object singletons, and sealed classes that make illegal states unrepresentable.
Inheritance & Interfaces
Share behavior across types. Kotlin classes are final by default — you opt into inheritance with open, define contracts with abstract classes and interfaces, and control access with visibility modifiers.
Generics, Delegates & Type Aliases
Write code that works over many types without giving up type safety. Generics and variance, property delegation (lazy, observable), and type aliases for readable signatures.
Collections & Functional Style
Kotlin’s collections plus its functional operators — map, filter, reduce, groupBy — let you transform data declaratively in readable chains instead of manual loops. Plus sequences for large or lazy pipelines.
Exceptions & Type Casts
Handle failure and narrow types safely. try/catch/finally (and try as an expression), throwing and defining exceptions, and the is / as / as? operators with smart casts that make casting safe.
Files & I/O
Read and write files on the JVM with Kotlin’s concise extensions — readText and writeText for the simple cases, line-by-line processing for large files, and use for guaranteed resource cleanup.
Coroutines & Flow
Coroutines let you write asynchronous code that reads like sequential code — no callbacks. Learn suspend functions, launching concurrent work, structured concurrency, and Flow for streams of async values.