Software architecture is the high-level structure of a software system.
The structure must support the functionality required of the system. Thus, the dynamic behavior of the system must be taken into account when designing the architecture. These likely include performance, security and reliability requirements associated with current functionality, as well as flexibility or extensibility requirements associated with accommodating future functionality at a reasonable cost of change. These requirements may conflict, and tradeoffs among alternatives are an essential part of designing an architecture. At the architectural level, all implementation details are hidden.