Kotlin Programming Course

Whether you want to use Kotlin to create mobile apps, desktop apps, or web services, it all starts with having a solid grasp of the Kotlin language itself! This course teaches Kotlin with vivid examples, stories, and illustrations that make the concepts stick!

 

Learn the Easy Way

Grow your understanding one step at a time, with each lesson building upon earlier lessons.

Craft a Solid Mental Model

See how all the pieces fit together, from fundamentals to advanced concepts.

Code with Confidence

Learn a wide range of language features and start writing idiomatic Kotlin code.

Learn Kotlin Programming the Easy Way

Ready to start learning Kotlin?

There's a lot of fantastic content from the Kotlin community - I know, as I've been actively writing and creating videos about Kotlin for the better part of a decade. But learning the language by piecing together bits of information from lots of small articles and videos can be a discouraging experience, because it's difficult to form a full picture.

If you want to become a confident Kotlin developer, you're gonna need a solid foundation of understanding. You'll need a carefully-crafted, guided path to learning the language, where each step builds upon the concepts that came before it.

And that's what you just found!

This course is designed to take you from the fundamentals of the language to the point where you're confident and productive with it.

To unlock your potential as a Kotlin developer, you'll need to know about the most important concepts and features of the language. And if you want those concepts to really "stick", you'll need to experience them with memorable examples and illustrations that you can easily call to mind.

Yes, you can grasp even the tougher concepts, like generic variance and coroutines. Because once you've got the right perspective on them, they simply make sense.

So... no more piecing together solutions from snippets online. No more crossing your fingers in hopes that AI won't steer you wrong. It's time to learn Kotlin - the easy way - and become the Kotlin developer that you're ready to be!

Enrollment Opening Again Soon

This course is currently only available to those who signed up for early access, but we'll open it up for enrollment again soon!

What's covered in this course?

This course is in early access, with new lessons arriving weekly, from February-April 2026. 

It's estimated that the course will include around 10 hours of content. Below is the list of lessons planned for this course.

Variables, Expressions, and Types

✅ Mutable and read-only variables
✅ Expressions and statements
✅ Types and type inference
✅ Common built-in types

Functions

✅ Writing functions and function calls
✅ Using type inference with functions
✅ Positional and named arguments
✅ Default arguments
✅ Expression bodies and block bodies
✅ String interpolation

Conditionals

✅ Using the when expression
✅ How to put conditions in the right order
✅ Using a subject with a when
✅ Using the if expression
âś… Using when and if as statements

Classes, Objects, and Packages

✅ Creating our own types with classes
✅ Adding properties and functions
✅ Instantiating and using objects
âś… Creating single-instance objects
✅ Organizing code into packages
✅ Importing elements from other packages
✅ Wildcard imports and named imports

Enum Classes

✅ Limiting the range of values
✅ Creating and using enum classes
✅ Using enum classes with when expressions
✅ Adding properties and functions
✅ Using built-in properties of enum classes

Nulls and Null Safety

✅ Present and absent values
✅ Nullable and non-nullable types
âś… Nulls at compile time and runtime

✅ How to use conditionals with nullable types
✅ Using the not-null assertion operator
✅ Providing defaults with the elvis operator
âś… Calling functions with the safe-call operator

Lambdas and Function References

✅ How to indicate the type of a function
âś… How to use function references
✅ How to write and call lambdas
✅ Using lambdas with higher-order functions
âś… How to use the implicit it parameter
✅ Using multiple-line lambdas

Collections: Lists and Sets

✅ Creating a simple list of values
✅ How to work with mutable lists
✅ How to copy read-only lists with changes
✅ How to get elements out of a list
✅ Creating loops with collection operators
✅ Transforming lists with collection operators
âś… Chaining collection operators together
✅ How operator order affects performance
✅ Using sets for distinct elements

Collections: Maps

✅ Associating values with the Pair class
✅ Maps, entries, keys, and values
✅ Creating mutable and read-only maps

✅ Looking up values by keys
✅ Modifying the contents of a map
âś… How to perform operations on a map
✅ How to create default values in a map
✅ How to gracefully convert a list to a map
✅ How to group elements from a list

Receivers and Extensions

✅ Standalone functions vs. object functions
✅ Explicit receivers and member functions
✅ Receiver types and receiver parameters
✅ Extension functions and implicit receivers
✅ Nullable receiver types

✅ Extension properties

Scopes and Scope Functions

✅ Scopes and visibility of code elements
✅ Statement scopes vs declaration scopes
âś… The five scope functions
✅ How to choose the right scope function
âś… Shadowing and how it affects receivers
✅ How to use scope functions for null checks

Interfaces

âś… Subtypes and supertypes
✅ Subtypes and substitution
✅ Casting types with smart casts
✅ Casting types with safe and unsafe casts
âś… How to implement multiple interfaces
✅ How to inherit from an interface
✅ How to create a default implementation

Class Delegation

✅ Manually delegating to an object
✅ How to use Kotlin's class delegation
✅ Overriding individual functions
âś… How to resolve conflicts in delegates
✅ Delegation for general and specific types

Abstract and Open Classes

✅ What abstract classes are
✅ How to inherit from superclasses
✅ Interfaces vs. implementation
✅ Overriding functions and properties
✅ Abstract vs. open members
✅ Visibility modifiers on getters and setters
✅ Class hierarchies and the Any type

Data Classes and Destructuring

✅ Reference equality and value equality
✅ Overriding functions from the Any type
✅ How to create and use a data class
✅ How to use the copy() function
✅ Using destructuring assignments
✅ How to destructure non-data classes
✅ Limitations of data classes

Sealed Types

✅ How to use the sealed modifier
✅ Exhaustively matching types with when
✅ Limitations of sealed types
✅ When to use sealed types vs. enum classes

Handling Runtime Exceptions

âś… Understanding the call stack
âś… How to read the stack trace
✅ Throwing and catching exceptions
âś… Using try-catch as an expression
âś… Using finally to make sure work happens
âś… How to use runCatching()

Generic Types

âś… How to declare and use a generic type
âś… How to use type parameter constraints
âś… Using generic interfaces and superclasses
âś… How to declare and use generic functions
âś… Generics in the standard library
âś… The trade-offs of using generics

Generic Variance

âś… Covariance and contravariance
âś… Using the in and out variance modifiers
âś… How to create declaration-site variance
âś… How to create use-site variance
âś… Collection types and variance modifiers

Coroutine Essentials

✅ The essence of coroutines
✅ Using coroutines for concurrency
✅ Using coroutines for parallel work
✅ Using withContext() with dispatchers
✅ Structured concurrency and cancellation
✅ Structured concurrency and exceptions

Register Today 

Registration is open from Monday, June 16 until Friday, June 20, and space is limited.

Hey, I'm Dave!

I've been coding professionally for over 25 years, and in that time, I’ve seen programming concepts explained both brilliantly and… well, not so brilliantly. What’s always stuck with me is how much storytelling and visuals can help - making complex ideas feel relatable and easier to understand.

Over the years, I’ve found that I love teaching through creative means, whether it’s illustrations, metaphors, or storytelling that helps the concepts stick.

I'm the author of Kotlin: An Illustrated Guide, a book designed to take you from beginner to confident Kotlin developer. You can catch my videos on YouTube to get a feel for my teaching style. And while you're there, join me for The TypeAlias Show livestream, where we cover all the latest things happening in the Kotlin and Android worlds.

Register Today 

Registration is open from Monday, June 16 until Friday, June 20, and space is limited.

Questions & Answers