Keep I/O, logging, state changes, and Java interop effects explicit at the edges while preserving a pure, testable core.
Side effects are not evil. They are how programs do anything useful: read a request, write to a database, log, send a message, call a Java API. The problem is when side effects are mixed into your core logic so you cannot test, reuse, or reason about it.
Write a pure core that calculates values, and an impure shell that performs I/O.
This section teaches patterns for keeping effects explicit without making the code feel abstract.