This presentation explains how to design software using modular abstractions such as "Layer" or "Service". We discuss how to apply "top-down" as well as "test-driven" design techniques to implement a modular architecture. Learn why testability at the module level without having to assemble the whole system is one of the most important attributes of a module. We discuss how to design the dynamic behavior of an interface and how to level dependencies to reduce coupling between modules. At the end of this workshop you will understand why software architects needs a unit of modularity that goes beyond object.