know why, but people tend to mess up splitting responsibilities between layers, especially harming the domain model • Indirection – interfaces everywhere! • Potentially heavy • Plays well with DDD – architecture that builds everything on top of a domain model • Directed coupling – the most important code in our application depends on nothing, everything depends on it • Flexibility – from an inner-layer perspective, you can swap out anything in any of the outer layers and things should work just fine • Testability – since your application core does not depend on anything else, it can be easily and quickly tested in isolation