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:
- 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.
- 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.
- 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.
- 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