# Arquitectura de programari

En els inicis de la informàtica, la programació es considerava un art i es desenvolupava com a tal, a causa de la dificultat que comportava per a la majoria de les persones, però amb el temps s'han anat descobrint i desenvolupant formes i guies generals, sobre la base de les quals es puguin resoldre els problemes. A aquestes, se'ls ha denominat 'Arquitectura de Programari, perquè, a semblança dels plànols d'un edifici o construcció, aquestes indiquen l'estructura, funcionament i interacció entre les parts del programari. En el llibre "An Introduction to Software Architecture", David Garlan i Mary Shaw defineixen que l'Arquitectura és un nivell de disseny que fa focus en aspectes "més enllà dels algorismes i estructures de dades de la computació; el disseny i especificació de l'estructura global del sistema és un nou tipus de problema".

## Arquitectura

* Una Arquitectura de Programari, també denominada Arquitectura lògica, consisteix en un conjunt de patrons i abstraccions coherents que proporcionen el marc de referència necessari per a guiar la construcció del programari per a un sistema d'informació.
* L'Arquitectura de Programari estableix els fonaments perquè analistes, dissenyadors, programadors, etc. treballin en una línia comuna que permeti arribar als objectius del sistema d'informació, cobrint totes les necessitats.
* Una arquitectura de programari se selecciona i dissenya amb base en objectius i restriccions. Els objectius són aquells prefixats per al sistema d'informació, però no solament els de tipus funcional, també altres objectius com la mantenibilitat, auditabilitat, flexibilitat i interacció amb altres sistemes d'informació. Les restriccions són aquelles limitacions derivades de les tecnologies disponibles per a implementar sistemes d'informació. Unes arquitectures són més recomanables d'implementar amb certes tecnologies mentre que altres tecnologies no són aptes per a determinades arquitectures. Per exemple, no és viable emprar una arquitectura de programari de tres capes per a implementar sistemes en temps real.
* L'arquitectura de programari defineix, de manera abstracta, els components que porten a terme alguna tasca de computació, les seves interfícies i la comunicació entre ells. Tota arquitectura ha de ser implementable en una arquitectura física, que consisteix simplement a determinar quina computadora tindrà assignada cada tasca.

## Models o vistes

Tota arquitectura de programari ha de descriure diversos aspectes del programari. Generalment, cadascun d'aquests aspectes es descriu d'una manera més comprensible si s'utilitzen diferents models o vistes. És important destacar que cadascun d'ells constituïx una descripció parcial d'una mateixa arquitectura i és desitjable que existeixi cert solapaments entre ells. Això és així perquè totes les vistes han de ser coherents entre si, evident atès que descriuen la mateixa cosa.
Cada paradigma de desenvolupament exigeix diferent nombre i tipus de vistes o models per a descriure una arquitectura. No obstant això, existeixen almenys tres vistes absolutament fonamentals en qualsevol arquitectura:
* La visió estàtica: descriu quins components té l'arquitectura.
* La visió funcional: descriu què fa cada component.
* La visió dinàmica: descriu com es comporten els components al llarg del temps i com interaccionen entre si.
Les vistes o models d'una arquitectura poden expressar-se mitjançant un o diversos llenguatges. El més obvi és el llenguatge natural, però existeixen altres llenguatges tals com els diagrames d'estat, els diagrames de flux de dades, etc. Aquests llenguatges són apropiats únicament per a un model o vista. Afortunadament existeix cert consens a adoptar UML (Unified Modeling Language, llenguatge unificat de modelatge) com llenguatge únic per a tots els models o vistes. No obstant això, un llenguatge generalista corre el perill de no ser capaç de descriure determinades restriccions d'un sistema d'informació (o expressar-les de manera incomprensible).

## Arquitectures més comunes

Generalment, no és necessari inventar una nova arquitectura de programari per a cada sistema d'informació. L'habitual és adoptar una arquitectura coneguda en funció dels seus avantatges i inconvenients per a cada cas en concret. Així, les arquitectures més universals són:
* Monolítica. On el programari s'estructura en grups funcionals molt acoblats.
* Client-servidor. On el programari reparteix la seva càrrega de còmput en dues parts independents però sense repartiment clar de funcions.
* per capes. Especialització de l'arquitectura client-servidor on la càrrega es divideix en tres parts (o capes) amb un repartiment clar de funcions: una capa per a la presentació (interfície d'usuari), altra per al càlcul (on es troba modelat el negoci) i altra per a l'emmagatzematge (persistència). Una capa solament té relació amb la següent.
Altres arquitectures afins menys conegudes són:
* En pipeline.
* Entre parells.
* En pissarra.
* Orientada a serveis.
* Màquines virtuals.

## Bibliografia

* Booch, Grady. Object-Oriented Analysis and Design. Second Edition. Benjamin/Cummings, Redwood: 1994.
* Jacobson, Ivar, Grady Booch, and James Rumbaugh. El Proceso Unificado de Desarrollo de Software. México: Addison-Wesley, 1999.
* Kruchten, Philippe. "Architectural Blueprints--The 4+1 View Model of Software Architecture". IEEE Software, Institute of Electrical and Electronics Engineers. November 1995, pp. 42-50.
* Larman, Craig. UML y Patrones, Introducción al análisis y diseño orientado a objetos. México: Prentice Hall, 1999.
* Martin, Robert C. "Design Principles and Design Patterns". Objectmentor
* Muller, Pierre-Alain. Modèlisation Object avec UML. Paris: Eyrolles, 1997.
* Wilson, Scott F. Analyzing Requirements and Defining Solution Architectures. Redmond: Microsoft Press, 1999.
* Fernández Aramayo, David Ricardo. Arquitectura de Software. Universidad Tecmilenio, ITESM
* Zapata Sanchez, Andres felipe. Arquitectura de Software www.fi.uba.ar
* Meylin Siguas Villavicencio www.unpmsn.org