When systems become too large to be developed by a small team, the system needs to be split into smaller pieces. While this splitting can be done organically, it is much wiser to conciously create a system architecture. Such an architecture should promote coherence between the parts of the system. Also, the architecture should enable consistency in the development effort while allowing for concurrent development. In this talk we will explore the reasons for creating an architecture, the essential ingredients of an architecture, ways of describing an architecture, and discuss approaches for creating one.