martes, 12 de agosto de 2014

Ingeniería del Software Libre

Introducción a la Ingeniería del Software Tradicional

En 1968, F.L. Bauer definió a la Ingeniería del Software como: “la disciplina que tiene el propósito de diseñar, crear y mantener el software por medio de la aplicación de tecnologías y prácticas de las ciencias de la computación, administración de proyectos, ingeniería, dominio de aplicaciones, diseño de interfaces, administración de componentes digitales y otros campos”
La ingeniería del software se relaciona con la aplicación de los principios de ingeniería de la concepción, desarrollo y verificación y depuración de sistemas de software.
Esta disciplina está de acuerdo con identificar, definir, realizar y verificar las características requeridas del software resultante. Esas características del software pueden incluir, la funcionalidad, la confiabilidad, la mantenibilidad, la disponibilidad, la testeabilidad, la facilidad de uso, la portabilidad y demás atributos. La Ingeniería del Software direcciona dichas características por medio de diseños preparados y especificaciones técnicas que, si se implementan de forma correcta, darán como resultado un software que puede ser verificado para cumplir con dichos requerimientos.
La Ingeniería del software también se relaciona con las características del proceso de desarrollo de software. En este particular, toma en cuenta características tales como el costo de desarrollo, la duración de desarrollo y los riesgos en el desarrollo de software. 
A pesar de que la ingeniería del software ha conseguido indudablemente notables éxitos, también es cierto que ha sucumbido a lo que se ha venido a llamar la "crisis del software". Prueba de ello es que a día de hoy todavía sigue sin ser posible cuantificar con exactitud los plazos, costos, recursos humanos y técnicas que lleven a un desarrollo exitoso del software, tal y como otras ramas de la ingeniería en otros campos sí han sido capaces de hacer. El enfoque sistemático y cuantificable ha tenido siempre como barreras las propias de las formas en las que el software se ha desarrollado y distribuido

Y es aquí donde el software libre brinda ventajas en la ingeniería del software. El software libre tiene un gran auge en cuanto a uso, aceptación y desarrollo. La implantación de Internet junto con las características de las licencias que invitan a todo el mundo a formar parte del equipo de desarrollo, han propiciado que no sólo podamos contar con el código fuente, sino tomar medidas de los repositorios de versiones gracias a los cuales podemos ver la evolución, etc.


Ingeniería del software libre

Este nuevo enfoque de la ingeniería del software se puede considerar compatible e incluso complementario a la Ingeniería de software tradicional. Mediante el análisis del software libre se ganan una serie de factores que difícilmente ha podido conseguir la ingeniería del software tradicional.

El primero de ellos es la vertiente temporal que se añade al análisis. Mediante un análisis temporal continuo podemos medir lo que sucede en el mundo del software libre.

Por otro lado, el análisis de software libre no plantea problemas de granularidad. La ingeniería del software se ha basado con frecuencia en el análisis de unos pocos proyectos de software debido en gran parte a la facilidad de acumular experiencias en entornos corporativos propios. 


Paradigmas de la Ingeniería del Software

Un paradigma es un modelo para comprender la realidad, que nos permite relacionarnos con el mundo circundante y tener un sentido de identidad dentro de lo que percibimos que es el “mundo real”.

Un paradigma de programación es un modelo básico de diseño y desarrollo de programas, que permite producir programas con una directriz específica, tales como: estructura modular, fuerte cohesión, alta rentabilidad, etc. (Olivares, 2011).

En términos generales se puede decir que un paradigma de programación es un modelo básico de diseño y desarrollo de programas, que permite producir programas con una directriz específica, tales como: estructura modular, fuerte cohesión, alta rentabilidad, etc.

El paradigma a utilizarse en cada caso de desarrollo se selecciona por los ingenieros de software según la naturaleza del proyecto y la aplicación, los controles y las entregas que se requieren, la complejidad del proyecto y los recursos disponibles.

La ingeniería de software tiene varios modelos o paradigmas de desarrollo en los cuales se puede apoyar para la realización de software, algunos de ellos son:
• Programación Procedimental: En este paradigma de programación, la atención se centra en el procesamiento, es decir, en las acciones necesarias para resolver un determinado problema. 

Los lenguajes soportan este paradigma mediante la definición de subprogramas (procedimientos y funciones) para la realización de dichas acciones, y el suministro de utilidades para el intercambio de información entre subprogramas (paso por valor, paso por referencia).

• Programación Modular: Acá la programación se define como la suma de dos tareas: el diseño del algoritmo y el diseño de las estructuras de datos: 

Programa = Algoritmo + Estructura de Datos

La programación modular tiene diversas acepciones en función del concepto de módulo y de la tarea en la que se enfatice: 

* Énfasis en el procesamiento algorítmico: 
    - Módulo como algoritmo autocontenido, es decir, un subprograma. 
    - Módulo como agrupación de subprogramas relacionados lógicamente entre sí 
        - Agrupación de un programa principal y los subprogramas necesarios: módulo de programa. 
         - Agrupación de diferentes subalgoritmos diseñados bajo un ámbito de aplicación común: biblioteca. 

* Énfasis en los datos: 
    - Módulo como agrupación de una estructura de datos y las operaciones que la gestionan. 
           - Accesibilidad. Tipos transparentes. 
           - Ocultación. Tipos Abstractos de Datos 
           - Herencia y Polimorfismo. Orientación a Objetos

• Abstracción de Datos (TADs): la abstracción de datos es a la utilización de datos lo que la abstracción procedimental a la utilización de subprogramas. 

La abstracción de datos proporciona la definición de un concepto y las operaciones aplicables, sin especificar la implementación concreta del mismo. Cuando un tipo de datos se define de esta forma decimos que estamos definiendo un Tipo Abstracto de Datos (TAD). 

De esta manera, cuando se manejan TADs, aparecen tres niveles: 

   • Nivel de utilización. Se definen variables del TAD definido y se les aplican las operaciones establecidas. 
   • Nivel de especificación. Se define el concepto y las operaciones que se le aplican, junto con las condiciones bajo las cuales se aplican. Este nivel constituye el interfaz del TAD. 
   • Nivel de implementación. Se implementa el tipo concreto y los subprogramas que soportan las operaciones especificadas. 

• Orientación a Objetos: La orientación a objetos proporciona un nivel más de reutilización y mayor flexibilidad en el diseño de programas, mediante los conceptos de herencia y polimorfismo. En OO se utilizan los términos de Clases (como abstracciones de objetos) y objetos (ejemplos de una clase).


·  • Programación Genérica: es una técnica que define algoritmos reusables, implementados como entidades de primer nivel (clases) e independientes de los datos sobre los que opera.

Normalmente los algoritmos genéricos son utilizados sobre agregados de elementos (pilas, colas, listas, conjuntos).



 Programación Orientada a Aspectos: es un paradigma de programación relativamente reciente cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de incumbencias. El principal objetivo de la POA es la separación de las funcionalidades dentro del sistema:

*         Por un lado funcionalidades comunes utilizadas a lo largo de la aplicación.
*         Por otro lado, las funcionalidades impropias de cada módulo. Cada funcionalidad común se encapsulará en una entidad.

Paradigma de Desarrollo Ágil: Es un paradigma basado en procesos ágiles. Estos intentan evitar los tediosos caminos de las metodologías tradicionales enfocándose en las personas y los resultados. Usa un enfoque basado en el Valor para construir software, colaborando con el cliente e incorporando los cambios continuamente.

Metodologías de Desarrollo de Software
Una metodología de desarrollo de software es un conjunto de pasos y procedimientos que deben seguirse para desarrollar software. Una metodología está compuesta por:

  •          Cómo dividir un proyecto en etapas.
  •          Qué tareas se llevan a cabo en cada etapa.
  •          Qué restricciones deben aplicarse.
  •          Qué técnicas y herramientas se emplean.
  •       Cómo se controla y gestiona un proyecto.


Existen tres tipos de metodologías de Desarrollo de software, las ágiles, las tradicionales o duras y las híbridas que combinan los beneficios de las dos anteriores.

A continuación un cuadro comparativo entre las metodologías ágiles y las tradicionales:



Algunas de las metodologías ágiles son:
·         eXtreme Programming (XP)
·         Agile Unified Process (AUP)
·         Feature Driven Development (FDD)
·         Scrum
adicionales:
·         Rational Unified Process (RUP)
·         Métrica (V3)

Modelos de desarrollo de Software
Los modelos de desarrollo de software son una representación abstracta de una manera en particular. Representan un enfoque común. Puede ser modificado y adaptado de acuerdo a las necesidades del software en proceso de desarrollo. Los modelos más comunes son:

Modelo Espiral

Es un modelo meta del ciclo de vida del software donde el esfuerzo del desarrollo es iterativo, tan pronto culmina un esfuerzo del desarrollo por ahí mismo comienza otro; además en cada ejecución del desarrollo se sigue cuatro pasos principales:

  1. Determinar o fijar los objetivos: En este paso se definen los objetivos específicos para posteriormente identifica las limitaciones del proceso y del sistema de software, además se diseña una planificación detallada de gestión y se identifican los riesgos.
  2. Análisis del riesgo: En este paso se efectúa un análisis detallado para cada uno de los riesgos identificados del proyecto, se definen los pasos a seguir para reducir los riesgos y luego del análisis de estos riesgos se planean estrategias alternativas.
  3. Desarrollar, verificar y validar: En este tercer paso, después del análisis de riesgo, se eligen un paradigma para el desarrollo del sistema de software y se lo desarrolla.
  4. Planificar: En este paso del proyecto se revisa y se toma la decisión si se debe continuar con un ciclo posterior al de la espiral. Si se decide continuar, se desarrollan los planes para la siguiente fase del proyecto.



Modelo en cascada

Es el enfoque metodológico que ordena rigurosamente las etapas del proceso para el desarrollo de software, de tal forma que el inicio de cada etapa debe esperar a la finalización de la etapa anterior.
Las etapas de su ciclo de vida son las siguientes:


  • Análisis de requisitos.
  • Diseño del Sistema.
  • Diseño del Programa.
  • Codificación.
  • Pruebas.
  • Implantación.
  • Mantenimiento.

De esta forma, cualquier error de diseño detectado en la etapa de prueba conduce necesariamente al rediseño y nueva programación del código afectado, aumentando los costos del desarrollo.



Modelo iterativo e incremental
En un desarrollo iterativo e incremental el proyecto se planifica en diversos llamados iteraciones.
Las iteraciones se pueden entender como miniproyectos: en todas las iteraciones se repite un proceso de trabajo similar para proporcionar un resultado completo sobre producto final, de manera que el cliente pueda obtener los beneficios del proyecto de forma incremental. Para ello, cada requisito se debe completar en una única iteración: el equipo debe realizar todas las tareas necesarias para completarlo (incluyendo pruebas y documentación) y que esté preparado para ser entregado al cliente con el mínimo esfuerzo necesario. De esta manera no se deja para el final del proyecto ninguna actividad arriesgada relacionada con la entrega de requisitos.
En cada iteración el equipo evoluciona el producto (hace una entrega incremental) a partir de los resultados completados en las iteraciones anteriores, añadiendo nuevos objetivos/requisitos o mejorando los que ya fueron completados.




Cuadro comparativo de los modelos de software

Modelo
Ventajas
Descripción
Modelo de Cascada
Este enfoque metodológico que ordena rigurosamente las etapas del ciclo de vida del software, de forma tal que el inicio de cada etapa debe esperar a la finalización de la inmediatamente anterior.
·         Ingeniería y análisis del Sistema 
·         Análisis de los Requisitos 
·         Diseño 
·         Codificación 
·         Prueba 
·         Mantenimiento
Modelo Iterativo e Incremental
Los modelos iterativos e incrementales disminuyen riesgos y nos ayudan a tener un mejor desarrollo de software ya que estos modelos se basan en la retroalimentación por lo que nos ayudan a tener una mejor arquitectura del software.
El modelo incremental: este modelo mantiene la función anterior y aumenta otra, ya que puede ser que el primer incremento no hubiera tenido todos los requerimientos que necesitaba el proyecto.
El modelo iterativo: Este modelo en cambio mejora cada versión es decir mejora la función que tiene la versión.
Modelo Espiral
Es un modelo evolutivo que conjuga la naturaleza iterativa del modelo MCP con los aspectos controlados y sistemáticos del Modelo Cascada. Proporciona potencial para desarrollo rápido de versiones incrementales. En el modelo Espiral el software se construye en una serie de versiones incremental.
           Región 1
           Región 2
           Región 3
           Región 4
           Región 5
           Región 6


Modelado de Software
Al momento de crear modelos como abstracciones de sistema o de entidades del mundo real es importante contar con herramientas que permitan crearlos, abordarlos y simplificar la complejidad de los sistemas.
Para modelar software se utiliza el Lenguaje de Modelado unificado UML que es un lenguaje para especificar, construir, visualizar y documentar los artefactos de un sistema de software orientado a objetos (OO).
UML ofrece vocabulario y reglas para crear y leer modelos bien formados que constituyen los planos de un sistema software.
UML es independiente del Proceso de desarrollo. Un uso óptimo se consigue en procesos dirigidos por casos de uso, centrados en la arquitectura, iterativos e incrementales (Proceso Unificado de Desarrollo (RUP)). Además, cubre las diferentes vistas de la arquitectura de un sistema mientras evoluciona a través del ciclo de vida de desarrollo del software.
A continuación los diferentes tipos de diagramas presentes en UML:




Modelos de Calidad en el desarrollo de software
Son diferentes iniciativas que las empresas desarrolladoras de software toman en cuenta para completar culminar sus proyectos de desarrollo con grandes ganancias con respecto a costos, plazo y nivel de calidad.
Consisten en mejorar los procesos de desarrollo de software de tal modo los proyectos sean más predecibles (tiempo y costes), se reduzcan los riesgos en los desarrollo (con el consiguiente ahorro de costes), etc.

Existen numerosas iniciativas, siendo las más importantes:

  • Norma ISO 9000: son un conjunto de normas cuyo ámbito es la gestión de la calidad, del conjunto la norma más destacada es la ISO/IEC 9001, que trata los requisitos del sistema de gestión de la calidad. Es una norma de carácter general (aplica a cualquier tipo de organización, tecnológica o no), y por tanto no trata específicamente el ciclo de vida de un sistema de información o los servicios que este presta. Por el carácter generalista de la norma, existe una guía, la ISO/IEC 90003, para aplicar la 9001 al software.

  • Norma ISO 15504: Son un conjunto de normas cuyo ámbito es evaluar y mejorar la capacidad y madurez de los procesos. En principio no es específica para el software, pero se usa normal y principalmente junto con la ISO/IEC 12207 (que contiene buenas prácticas, a nivel procesos, para el desarrollo y mantenimiento software), en la evaluación y mejora de la calidad del proceso de desarrollo y mantenimiento de software.

  • El Capability Maturity Model (CMMI): es un modelo de calidad del software que clasifica las empresas en niveles de madurez. Estos niveles sirven para conocer la madurez de los procesos que se realizan para producir software. Los niveles de funcionalidad practica de CMMI son: 




No hay comentarios:

Publicar un comentario