No matter how well a software architect designs the system, the reality is that the developers are responsible to the outcome of the project. This is why any developer should understand software architecture! Software architecture is about identifying and defining the building blocks – the software components, and the relationship between those components. Designing large scale, high quality software system is a mix of art and science. In this lecture the participant will learn the nature of the software product; How to capture and understand the functional and non-functional requirements, how to handle the constraints; how to analyze the problem domain and how to find the right solution that captures the current and future needs. This lecture explains the knowledge and tools that the modern architect must have in order to manage a nowadays project complexity. The lecture concludes with a discussion about the modern Micro Services Architecture approach – pros and cons. The complexity of the software product Functional requirements, non-functional requirement and constraints The software analysis phase – methods and tools Software Design: SOLID, (De)Coupling and Cohesion Micro Service Architecture.