== Software architecture topics ==
=== Software architecture description ===
{{main|Software architecture description}}
Software architecture description involves the principles and practices of modeling and representing architectures, using mechanisms such as architecture description languages, architecture viewpoints, and architecture frameworks.
=== Architecture description languages ===
{{main|Architecture description language}}
An architecture description language (ADL) is any means of expression used to describe a software architecture ([[ISO/IEC 42010|ISO/IEC/IEEE 42010]]).
Many special-purpose ADLs have been developed since the 1990s, including [[Architecture analysis and design language|AADL]] (SAE standard), [[Wright (ADL)|Wright]] (developed by Carnegie Mellon), [[Acme (ADL)|Acme]] (developed by Carnegie Mellon), xADL (developed by UCI), [[Darwin (ADL)|Darwin]] (developed by [[Imperial College London]]), DAOP-ADL (developed by University of Málaga), SBC-ADL (developed by [[National Sun Yat-Sen University]]), and [[ByADL (ADL)|ByADL]] (University of L'Aquila, Italy).
=== Architecture viewpoints ===
{{main|View model}}
[[File:4+1 Architectural View Model.svg|thumb|264px|[[4+1 architectural view model]].]]
Software architecture descriptions are commonly organized into [[view model|views]], which are analogous to the different types of [[blueprint]]s made in building [[architecture]]. Each view addresses a set of system concerns, following the conventions of its ''viewpoint'', where a viewpoint is a specification that describes the notations, modeling, and analysis techniques to use in a view that expresses the architecture in question from the perspective of a given set of stakeholders and their concerns ([[ISO/IEC 42010|ISO/IEC/IEEE 42010]]). The viewpoint specifies not only the concerns framed (i.e., to be addressed) but the presentation, model kinds used, conventions used and any consistency (correspondence) rules to keep a view consistent with other views.
=== Architecture frameworks ===
{{main|Architecture framework}}
An architecture framework captures the "conventions, principles and practices for the description of architectures established within a specific ___domain of application and/or community of stakeholders" ([[ISO/IEC 42010|ISO/IEC/IEEE 42010]]). A framework is usually implemented in terms of one or more viewpoints or ADLs.
=== Architectural styles and patterns ===
An [[architectural pattern]] is a general, reusable solution to a commonly occurring problem in software architecture within a given context.
Architectural patterns are often documented as software [[Software design pattern|design patterns]].
Following traditional building architecture, a 'software architectural style' is a specific method of construction, characterized by the features that make it notable" ([[architectural style]]).
{{cquote|''An architectural style defines: a family of systems in terms of a pattern of structural organization; a vocabulary of components and connectors, with constraints on how they can be combined.''<ref name=SG>{{cite book |last1=Shaw |first1=Mary |last2=Garlan |first2=David |date=1996 |title=Software architecture: perspectives on an emerging discipline |publisher=Prentice Hall |isbn=978-0-13-182957-2}}</ref>}}
{{cquote|''Architectural styles are reusable 'packages' of design decisions and constraints that are applied to an architecture to induce chosen desirable qualities.''<ref>[http://www.isr.uci.edu/architecture/styles.html UCI Software Architecture Research – UCI Software Architecture Research: Architectural Styles]. Isr.uci.edu. Retrieved on 2013-07-21.</ref>}}
There are many recognized architectural patterns and styles, among them:
* [[Blackboard (design pattern)|Blackboard]]
* [[Broker pattern]]
* [[Client–server model|Client-server]] (2-tier, [[Three-tier (computing)|3-tier]], [[n-tier|''n''-tier]], [[cloud computing]] exhibit this style)
* [[Software componentry|Component-based]]
* [[Database-centric architecture|Data-centric]]
* [[Event-driven architecture|Event-driven]] (or [[implicit invocation]])
* [[Interpreter pattern]]
* [[Abstraction (computer science)#Layered architecture|Layered]] (or [[multilayered architecture]])
* [[Master–slave (technology)|Master–slave]]
* [[Microservices|Microservices architecture]]
* [[Model–view–controller|Model-view-controller]]
* [[Monolithic application]]
* [[Peer-to-peer]] (P2P)
* [[Pipes and filters]]
* [[Plug-in (computing)|Plug-ins]]
* [[Reactive architecture]]
* [[Representational state transfer]] (REST)
* [[Rule-based system|Rule-based]]
* [[Service-oriented architecture|Service-oriented]]
* [[Shared nothing architecture]]
* [[Space-based architecture]]
* Serverless architecture
Some treat architectural patterns and architectural styles as the same,<ref name=MSDN>[http://msdn.microsoft.com/en-us/library/ee658117.aspx Chapter 3: Architectural Patterns and Styles]. Msdn.microsoft.com. Retrieved on 2013-07-21.</ref> some treat styles as specializations of patterns. What they have in common is both patterns and styles are idioms for architects to use, they "provide a common language"<ref name=MSDN/> or "vocabulary"<ref name=SG/> with which to describe classes of systems.
=== Software architecture and agile development ===
{{main|Agile development}}
There are also concerns that software architecture leads to too much [[big design up front]], especially among proponents of [[agile software development]]. A number of methods have been developed to balance the trade-offs of up-front design and agility,<ref name="Boehm2004">{{cite book |title=Balancing Agility and Discipline |last1=Boehm|first1=Barry|last2=Turner|first2=Richard|year=2004|publisher=Addison-Wesley|isbn=978-0-321-18612-6}}</ref> including the agile method [[dynamic systems development method|DSDM]] which mandates a "Foundations" phase during which "just enough" architectural foundations are laid. ''[[IEEE Software]]'' devoted a special issue to the interaction between agility and architecture.
|