This document provides an overview of Kotlin coroutines through examples. It begins with examples of synchronous and asynchronous programming approaches and their drawbacks. Coroutines are then introduced as a better solution that allows writing asynchronous code in a synchronous-looking way using suspend functions and other features. Key benefits of coroutines include avoiding callback hell and enabling easy control of thread dispatch. Examples are provided of using coroutines for tasks like interleaving reading and processing of data from a file. Under the hood, coroutines implement asynchronous behavior using state machines and continuation passing.