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
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.