Software Architecture & Design Patterns