Software Design Methodology From Principles to Architectural Styles