Enxeñaría de software

miniatura|Un enxeñeiro de software programando para a Fundación Wikimedia.
A **enxeñaría de software** é unha área do coñecemento orientada á especificación, desenvolvemento e mantemento de sistemas de *software* aplicando tecnoloxías e prácticas de ciencia da computación, xestión de proxectos e outras disciplinas, considerando produtividade e calidade.

Actualmente, estas tecnoloxías e prácticas engloban linguaxes de programación, bases de datos, ferramentas, plataformas, bibliotecas, patróns e procesos.

Os fundamentos científicos para a enxeñaría de software comprenden o uso de modelos abstractos e precisos que permiten ao enxeñeiro especificar, proxectar, poñer en funcionamento e manter sistemas de software, avaliando e garantindo as súas calidades. Ademais disto, a enxeñaría de software debe ofrecer mecanismos para planificar e xestionar o proceso de desenvolvemento.

A enxeñaría do software está composta por tres elementos:

* **Os métodos**: que indican como construír tecnicamente o SW, abarcando tarefas como a planificación, estimación de proxectos, análises de requirimentos, deseño de estruturas, codificación, probas e mantemento.
* **As ferramentas**: dan a subministración automática ós métodos. Actualmente existen ferramentas para soportar cada un dos métodos citados anteriormente.
* **Os procedementos**: propoñen, entre outras cousas, a orde en que aplica-los métodos, as entregas requiridas (documentación, informes etc.), os controles que axudan a asegurar a calidade e coordina-los cambios e as directrices que axudan ós xestores do SW a evalua-lo progreso.

## Historia 
A enxeñaría de software (ES) xurdiu a mediados dos anos setenta nunha tentativa de tratar coa crise do software e dar un tratamento de enxeñaría (máis sistemático e controlado) ao desenvolvemento de sistemas de software complexos. Un sistema de software complexo caracterízase por un conxunto de compoñentes abstractos de software (estruturas de datos e algoritmos) encapsulados na forma de procedementos, funcións, módulos, obxectos ou axentes interconectados entre si, compondo a arquitectura do software, que deberán ser executados en sistemas computacionais.

## Definición 
Segundo Fritz Bauer, a enxeñaría de software é "a creación e a utilización de sólidos principios de enxeñaría a fin de obter software de maneira económica, que sexa fiable e que traballe eficientemente en máquinas reais". O propio significado de enxeñaría xa trae os conceptos de creación, construción, análise, desenvolvemento e mantemento.

A enxeñaría de software concéntrase nos aspectos prácticos da produción dun sistema de *software*, mentres que a ciencia da computación estuda os fundamentos teóricos dos aspectos computacionais.

A enxeñaría de sistemas é unha área máis ampla por tratar de todos os aspectos de sistemas baseados en computadores, incluíndo *hardware* e enxeñaría de procesos, ademais do software.

Dito doutro modo, a enxeñaría do software trata sistematicamente tódalas fases do ciclo de vida do software.

## Produción de software 
A produción de software é o conxunto coherente de prácticas que leva a crear software. Normalmente divídese nunhas fases de especificación, deseño de proxecto, desenvolvemento e testaxe, aínda que en función dos proxectos e das metodoloxías estas fases poden ser máis complexas ou mesmo desaparecer. Nos proxectos de software interveñen ferramentas, persoas e métodos.

Hai distintos modelos de produción de software:
* **Modelos secuenciais**, onde cada unha das fases é unha continuación da anterior, e non hai saltos no tempo nin procesos paralelos. Os máis coñecidos son o desenvolvemento en fervenza, en uve ou en dentes de serra.
* **Modelo evolutivo**, onde as fases de especificación, proxecto e desenvolvemento están entrelazadas.
* **Modelo en espiral**, onde o proxecto avanza a través de varios ciclos completos de especificación, proxecto e desenvolvemento.
* **Modelo compoñentizado**, a través de montaxe de compoñentes xa existentes.
* **Formal**, posta en funcionamento a partir de modelo matemático formal.
* **RAD**
* **Cuarta xeración**

### Metodoloxías estándar 
* Rational Unified Proces (RUP).
* Programación extrema (XP).
* Microsoft Solution Framework (MSF).

### Modelos de madurez 
Os modelos de madurez xurdiron para avaliar a calidade dos procesos de software nunha organización (empresa ou institución). O máis coñecido é o *Capability Maturity Model Integration* (CMMI), do Software Engineering Institute (SEI).

## Xestión de proxectos 
A xestión de proxectos ocúpase de entregar o produto de software no prazo e conforme os requisitos establecidos, tendo en conta sempre as limitacións de orzamento e tempo. O obxectivo é "facer o produto apropiado, de xeito correcto, e xestionado de forma axeitada", é dicir, que importa tanto o resultado, como a forma de execución, coma a calidade da metodoloxía da xestión do proxecto.

A xestión de proxectos de software caracterízase, a diferenza da xestión de proxectos noutras industrias, por tratar sobre un produto intanxible, moi flexible e cun proceso de desenvolvemento con baixa estandarización.

Dependendo da metodoloxía que se siga, as **fases** destes proxectos chamaranse de xeitos diferentes, pero habitualmente trátase de:
* **planificación**
* **especificación**
* **deseño e implementación**
* **verificación e validación**, fase en que se testa que o produto traballa correctamente e que o que fai se corresponde co que o cliente necesita que faga, respectivamente, mediante testaxes, prototipos etc.
Dentro da planificación inclúese a **organización do proxecto**, é dicir, a composición e estruturación do equipo, incluíndo a definición de responsabilidades, a **estruturación de tarefas**, a elaboración dun **cronograma**, a **orzamentación** e a **análise de riscos**. Como calquera outro tipo de proxecto, nos proxectos de software a produtividade non é lineal en relación ao tamaño do equipo, e o aumento de produtividade non é inmediato logo do aumento do equipo, por mor dos custos de aprendizaxe. A especialización dos proxectos (linguaxes, metodoloxías) fai que estes custos de aprendizaxe sexan maiores en software ca noutros campos.

Unha vez resolta a planificación, a xestión dun proxecto de software ocúpase da vixilancia da execución do proceso do desenvolvemento do software. Ese proceso pode referirse ao ciclo de vida do produto, desde que se publica ata que se retira do mercado, ou a subprocesos.

A **especificación** é a fase en que se concibe o produto e cando se enuncian os requisitos que debe ter o software. Os requisitos poden ser funcionais (ou non funcionais), de usuario (solicitados polo cliente) ou de sistema (necesarios pola estrutura da programación) etc. É común que o cliente non saiba o que realmente necesita, que as súas necesidades muden ao longo do proceso de desenvolvemento e que haxa problemas na comunicación. Todos eses factores vense agravados pola intanxibilidade do software, e pola imprevisibilidade dos custos de cada requisito.

A fase de **deseño e implementación** é cando se deseña e se desenvolve o software.Inclúe acttividades como o deseño da arquitectura, o deseño das bases de datos e das interfaces gráficas, loxicamente a escriutura do código (a programación), pero tamén a integración das funcionalidades, e mais a documentación.

As fases divídense á súa vez en **actividades**, que son agrupacións de tarefas relacionadas entre si. As **tarefas** son os pasos pequenos e manexables do proxecto, onde se fai o traballo. Algunhas destas tarefas teñen interdependencias, é dicir, que a execución dunha tarefa depende da execución doutra. O resultado dunha tarefa é un "**produto de traballo**", que á súa vez pode ser o input doutra tarefa. Unha tarefa consome un **recurso**, que pode ser tempo, tecnoloxía, coñecemento, cartos ou persoas.

A diminución de calidade para acelerar o desenvolvemento prexudica sempre a produtividade futura.

### Modelaxe 
A abstracción do sistema de software a través de modelos que o describen é un poderoso instrumento para o entendemento e comunicación do produto final a desenvolver.

A maior dificultade nesta actividade está no equilibrio (*tradeoff*) entre simplicidade (favorecendo a comunicación) e a complexidade (favorecendo a precisión) do modelo.

É común a utilización de linguaxes para modelaxe como UML.

### Xestión 
* de Persoal.
* de Produto.
* de Proceso.
* de Proxecto.

## Tecnoloxías e prácticas 
A enxeñaría de software aborda unha serie de prácticas e tecnoloxías, principalmente estudadas pola ciencia da computación, enfocando o seu impacto na produtividade e calidade de software. Destacan o estudo de linguaxe de programación, bancos de datos e paradigmas de programación, como:

* Programación estruturada. 
* Programación funcional.
* Programación orientada a obxectos.
* Compoñentes de Software.
* Programación orientada a aspecto.

### Ferramentas 
Outro punto importante é o uso de ferramentas **CASE** (do inglés *Computer-Aided Software Engineering*). Esa clasificación abrangue toda ferramenta baseada en computadores que auxilian actividades de enxeñaría de software, desde a análise de requisitos e modelaxe ata programación e probas.

Os ambientes de desenvolvemento integrado (**IDEs**) teñen maior importancia e soportan:

* Editor.
* Compilador.
* Depurador (*Debugger*).
* Xeración de código.
* Modelaxe.
* Despregue (*Deployment*).
* Probas automatizadas.
* Refactoración.

## Notas