This document provides an introduction to software architecture. It discusses how effective software engineering requires an understanding of architectural design. It also outlines some common architectural paradigms and styles, including pipes and filters, data abstraction/object-oriented organization, event-based/implicit invocation, and layered systems. For each style, it describes the key components, connectors, constraints, examples, advantages, and disadvantages. The goal is to help engineers recognize useful system organizations and make principled choices among design alternatives.