Software architecture refers to the high-level structures of a software system and the discipline of designing these structures. It involves making fundamental choices about components, interactions, and properties that are difficult to change later. Documenting software architecture facilitates communication between stakeholders and allows reuse of design elements. It provides an abstract understanding of a complex system before implementation to enable analysis, reuse, risk management, and cost reduction. The concepts of software architecture have developed since the 1960s with increased research in the 1990s focusing on styles, documentation, and formal methods.