What are Kotlin coroutines and when should you use them?
Assesses fundamental understanding of Kotlin conventions, runtime behavior, and memory/performance considerations.
Hiring managers look for precision, avoidance of ambiguous jargon, and ability to explain trade-offs under real production conditions.
Coroutines are Kotlin's solution for asynchronous and concurrent code. They are lightweight, suspendable computations: a suspend function can pause without blocking a thread, and the compiler turns it into a state machine.
suspend fun loadUser(id: Int): User = withContext(Dispatchers.IO) {
api.fetch(id) // runs on the IO dispatcher
}
fun main() = runBlocking {
val user = loadUser(1)
println(user)
}
Launching: launch for fire-and-forget work within a scope, async when you need a result, and coroutineScope or supervisorScope to structure failure. Dispatchers choose threads: Main for UI, IO for blocking calls, Default for CPU work. Because coroutines are cheap, you can start thousands of them.
Structured concurrency ties children to a parent scope, so they are cancelled and awaited together. Use coroutines for I/O and UI work, and as the modern replacement for callbacks and nested threads.
Candidate Response Strategy & Interview Tips
- Start with a concise one-sentence summary: Deliver a direct, confident answer first before expanding into nuances.
- Demonstrate real-world trade-offs: Discuss where this approach excels and when you would avoid it in production systems.
- Discuss complexity & edge cases: Proactively explain time/space complexity or boundary conditions (null values, scale limits).
- Prepare for interviewer follow-ups: Technical hiring panels frequently probe deeper into concurrency, backward compatibility, or alternative libraries.