Building a chat server is a great way to learn the Tokio library because a chat server forces you to think about concurrent IO, which is the core purpose of Tokio. Lily demonstrates how you can spawn background tasks to manage independent network streams, and use tokio::select! to concurrently poll tasks which require a shared state. The lessons learned here can be applied generally to all kinds of asynchronous coding challenges in Rust. From the author of Refactoring to Rust.