Ingeniería del Software

INTRODUCCIÓN

La ingeniería del software, según la definición de la IEEE en 1993, es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación y mantenimiento del software. La ingeniería del software ofrece métodos o técnicas para desarrollar y mantener software de calidad que resuelven problemas de todo tipo, y trata áreas muy diversas de la informática y de las ciencias computacionales.

ORÍGEN

El concepto de ingeniería del software surgió en 1968, tras una conferencia en Garmisch (Alemania) que tuvo como objetivo resolver los problemas de la crisis del software. El término crisis del software se usó desde finales de 1960 hasta mediados de 1980 para describir los frecuentes problemas que aparecían durante el proceso de desarrollo de nuevo software. Tras la aparición de nuevo hardware basado en circuitos integrados, comenzaron a desarrollarse sistemas y aplicaciones mucho más complejos que hasta entonces no era posible construir puesto que el hardware disponible no lo permitía. Estos nuevos proyectos de desarrollo de software, en la mayoría de ocasiones, no se terminaban a tiempo, lo cual también provocaba que el presupuesto final del software excediera de aquel que se había pactado. Algunos de estos proyectos eran tan críticos (sistemas de control de aeropuertos, equipos para medicina, etc) que sus implicaciones iban más allá de las pérdidas millonarias que causaban. Además, en muchos casos el software no daba respuesta a las verdaderas necesidades del cliente o había que ser un usuario experto para poder utilizarlo, todo ello sumado a que el mantenimiento de los productos era complejo y muy costoso.
The software crisis

El software no se producía como el hardware, que tenía un proceso de fabricación definido y dividido en fases. El resultado eran productos de pésima calidad en los que se habían invertido mucho tiempo y dinero pero que o bien no llegaban a terminarse o bien a la larga no daban el resultado que se esperaba. Se detectó que los métodos de desarrollo de software informales que hasta entonces habían bastado para proyectos pequeños no eran suficientes para los nuevos y grandes proyectos, y que se necesitaban profesionales especializados en esta nueva disciplina que fueran capaces de lidiar con la creciente complejidad de los nuevos sistemas.

Una de las primeras y más conocidas referencias a los conceptos crisis el software e ingeniería del software fue hecha por Edsger Dijkstra, durante la presentación de 1972 titulada “The Humble Programmer” en la Association for Computing Machinery, cuando se le hizo entrega de un Premio Turing.

“NO SILVER BULLET”

Durante décadas, resolver la crisis del software desencadenó en que compañías e investigadores produjeran más y más herramientas software. Cada nueva tecnología o práctica que apareció entre 1970 y 1990 fue tratada como una “bala de plata” (en inglés, silver bullet) que solucionaría la crisis del software.

En 1986, Fred Brooks publicó el artículo No Silver Bullet, argumentando que ninguna tecnología o práctica por sí misma podría mejorar en un diez por ciento la productividad en los siguientes diez años. El debate sobre las balas de plata continuó durante la siguiente década, dando lugar a numerosas interpretaciones sobre el artículo de Brooks.

Los defensores de lenguajes como Ada, o de los procesos software continuaron apostando por que su tecnología sería la que solucionaría la crisis. Sin embargo, hubo gente que interpretó el hecho de que no se encontrara una solución única y efectiva al cien por cien como un fracaso de la ingeniería del software.

Si bien es cierto que la búsqueda de una única solución no funcionó, también había que ser consciente de que tampoco existían balas de plata en ninguna otra profesión. Así, con el transcurso de los años, casi todo el mundo aceptó que no se encontraría ninguna bala de plata, pero se tomó esto como una prueba de que la ingeniería del software finalmente había madurado y que los proyectos debían tener éxito gracias al trabajo duro y al esfuerzo. El campo de la ingeniería del software es demasiado complejo y diverso para que una única solución resuelva todos los problemas, pero el conjunto de todas las prácticas que surgieron y de las que surgen hoy en día son las que, bien aplicadas, permiten que la ingeniería del software desarrolle productos de calidad.

EVOLUCIÓN DE LA INGENIERÍA DEL SOFTWARE

Con el transcurso de los años se han desarrollado recursos que conforman la ingeniería del software, es decir, herramientas y técnicas de especificación, diseño e implementación del software: la programación estructurada, la programación orientada a objetos, las herramientas CASE, la documentación, los estándares, CORBA, los servicios web, el lenguaje UML, etc.

En combinación con las herramientas, también se han hecho esfuerzos por incorporar los métodos formales al desarrollo de software, argumentando que si se probaba formalmente que los productos software hacían lo que se les requería, la industria del software sería tan predecible como lo son otras ramas de la ingeniería.
Evolucion
La utilización de determinados recursos depende de la magnitud del proyecto, de la empresa a cargo, la experiencia de los desarrolladores, el presupuesto con el que se cuenta, etc.

La ingeniería del software comprende:

  • Proceso de desarrollo de software (especificación, implementación y diseño, etc…).
  • Metodologías para el desarrollo de software (RUP, patrones, framework…).
  • Herramientas de desarrollo de software.

PROCESO SOFTWARE

El proceso de ingeniería de software se define como “un conjunto de etapas parcialmente ordenadas con la intención de lograr un objetivo, en este caso, la obtención de un producto de software de calidad”. El proceso de desarrollo de software “es aquel en que las necesidades del usuario son traducidas en requerimientos de software, estos requerimientos transformados en diseño y el diseño implementado en código, el código es probado, documentado y certificado para su uso operativo”. Concretamente “define quién está haciendo qué, cuándo hacerlo y cómo alcanzar un cierto objetivo” [Jacobson 1998].

El proceso de desarrollo de software requiere por un lado un conjunto de conceptos, una metodología y un lenguaje propio. A este proceso también se le llama el ciclo de vida del software, que comprende las etapas por las que pasa un proyecto software desde que es concebido, hasta que está listo para usarse.

Hay cuatro actividades fundamentales comunes a todo proceso software:

  • Especificación: usuarios e ingenieros definen el software a producir y las restricciones en su funcionalidad.
  • Desarrollo: fase en la cual el software se diseña y se programa.
  • Validación: el software debe ser probado para asegurar que cumple con las necesidades del cliente.
  • Evolución: el software debe poder ser modificado para adaptarse a cambios en el mercado y en las necesidades de los usuarios.

Cada producto software necesita un proceso diferente. Por tanto, estas etapas genéricas deben organizarse de diferente manera y en diferentes niveles según el tipo de software para el que se aplique el proceso. Un uso inapropiado del proceso software puede reducir la calidad o la usabilidad del producto a ser desarrollado, e incluso incrementar los costes de desarrollo.

Los enfoques más generales son los siguientes:

    • Modelo en cascada: ordena rigurosamente las etapas del ciclo de vida del software, de tal forma que el inicio de cada etapa debe esperar a la finalización de la inmediatamente anterior. La primera descripción formal la realizó en 1970 Winston W. Royce, en uno de sus artículos.

Modelo en cascada

    • Prototipado: pertenece a los modelos de desarrollo evolutivo. El prototipo debe ser construido en poco tiempo, usando los programas adecuados y no se deben utilizar muchos recursos, pues a partir de que éste sea aprobado se puede iniciar el verdadero desarrollo del software.
    • Incremental e iterativo: Divide la funcionalidad del sistema en partes. En cada incremento, una parte de la funcionalidad es desarrollada, desde el análisis hasta las pruebas.

Modelo iterativo incremental

    • Espiral: Combinación de procesos en cascada y prototipado. Fue definido por Barry Boehm en 1986 en el artículo “A Spiral Model of Software Development and Enhancement”.

Modelo en espiral

  • RAD (Rapid Application Development): emplea técnicas iterativas y de prototipado. Lo introdujo James Martin en 1991.
  • RUP (Rationa Unified Process): El Rational Unified Process en inglés es un proceso de desarrollo de software iterativo y junto con el Lenguaje Unificado de Modelado (UML), constituye la metodología estándar más utilizada para el análisis, implementación y documentación de sistemas orientados a objetos.
    El RUP no es un sistema con pasos firmemente establecidos, sino un conjunto de metodologías adaptables al contexto y necesidades de cada organización.
    En 1987, Ivar Jacobson fundó la compañía Objectory AB, que desarrolló Objetory, un método de desarrollo orientado a objetos, extensión de lo que se conocía como aproximación Ericsson. En 1995, Rational Software compró Objectory AB, y en los siguientes años desarrollaron y lanzaron el estándar UML (Unified Modeling Language), así como el Rational Unified Process (RUP), que aunaba los esfuerzos y la experiencia de todas las compañías adquiridas por Rational Software. En diciembre de 2002, IBM adquirió Rational Software.

MÉTODOS

Un método de ingeniería de software es un enfoque estructurado para desarrollar software cuyo objetivo es facilitar la producción de productos software de alta calidad a un coste razonable. Indican cómo construir técnicamente el software. Los métodos abarcan un amplio espectro de tareas que incluyen: planificación y estimación de proyectos, análisis de los requerimientos del sistema y del software, diseño de procedimientos algorítmicos, codificación, prueba y mantenimiento.

Los métodos de la ingeniería de software introducen frecuentemente una notación especial orientada al lenguaje o gráfica y a un conjunto de criterios para la calidad del software.

A lo largo de los años se han ido desarrollando una gran cantidad de metodologías para desarrollar software, a menudo vinculadas a algún tipo de organización, que además desarrolla, apoya el uso y promueve la metodología. La metodología es a menudo documentada en algún tipo de documentación formal.

Algunas de las metodologías más conocidas se explican a continuación.

Programación estructurada

Técnica en la cual  la estructura de un programa tan solo emplea tres estructuras lógicas de control: secuencia, selección e iteración. La programación estructurada se basa en el teorema del programa estructurado demostrado por Böhm-Jacopini, el cual establece que cualquier programa con una entrada y una salida exclusivamente es equivalente a un programa que contiene solamente las estructuras lógicas mencionadas anteriormente.

Esta nueva forma de programar que dio lugar a programas fiables y eficientes, que además estaban escritos de manera que facilitaba su comprensión posterior.

Programación orientada a objetos o POO

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado en 1967 para hacer simulaciones de eventos discretos, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Simula introdujo la noción de clases e instancias como parte de un paradigma de programación explícito. Las ideas de Simula 67 influenciaron muchos lenguajes posteriores, incluyendo Smalltalk, CLOS, Object Pascal, C++…

Smalltalk fue desarrollado en Xerox PARC por Alan Kay, entre otros, en la década de los 70. Smalltalk introdujo el término POO para representar el uso de objetos y mensajes como la base de la computación. Smalltalk fue diseñado para ser un sistema completamente dinámico en el cual las clases se podrían crear y modificar en tiempo de ejecución en lugar de estáticamente.

La programación orientada a objetos fue el estilo de programación dominante a principio y mediados de los años noventa, en gran parte debido a la influencia de lenguajes como C++. Su predominio fue consolidado gracias al auge de las interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.

Las características de orientación a objetos han sido agregadas a muchos lenguajes a lo largo de los años, incluyendo Ada, BASIC, Fortran, Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del código.

Así como la programación procedural introdujo técnicas de mejora como la programación estructurada, los métodos modernos de diseño de software orientados a objetos incluyen mejoras como el uso de patrones de diseño o lenguajes de modelado como UML.

Extreme Programming

Enfoque formulado por Kent Beck en 1999, que se diferencia de las metodologías tradicionales principalmente en que pone más énfasis en la adaptabilidad que en la previsibilidad. Sus defensores consideran que ser capaz de adaptarse a los cambios de requisitos en cualquier punto de la vida del proyecto es una aproximación mejor y más realista que definir todos los requisitos al comienzo e invertir esfuerzos después en controlar los cambios.

HERRAMIENTAS

Suministran un soporte automático o semiautomático para los métodos. Cuando se integran las herramientas de forma que la información creada por una herramienta pueda ser usada por otra, se establece un sistema para el soporte del desarrollo del software llamado ingeniería de software asistido por computadora (Computer Aided Software Engineering o CASE).

Ya en los años 70 un proyecto llamado ISDOS (Information System Design and Optimization System) diseñó un lenguaje, y por lo tanto un producto, que analizaba la relación existente entre los requisitos de un problema y las necesidades que éstos generaban, el lenguaje en cuestión se denominaba PSL (Problem Statement Language) y la aplicación que ayudaba a buscar las necesidades de los diseñadores PSA (Problem Statement Analyzer). PSL se empleaba para expresar requisitos de un sistema mediante un lenguaje formal. El lenguaje se expresaba empleando objetos y relaciones entre ellos. Una vez compilado y sin errores, el fichero generado era recibido por la aplicación PSA, que generaba una base de datos con la información obtenida y permitía manipular el contenido y generar informes, entre otras cosas.

Aunque ésos son los inicios de las herramientas informáticas que ayudan a crear nuevos proyectos informáticos, la primera herramienta CASE fue Excelerator que salió a la luz en el año 1984 y trabajaba bajo una plataforma PC.

Las herramientas CASE alcanzaron su techo a principios de los años 90. En la época en la que IBM había conseguido una alianza con la empresa de software AD/Cycle para trabajar con sus mainframes, estos dos gigantes trabajaban con herramientas CASE que abarcaban todo el ciclo de vida del software. Pero poco a poco los mainframes han ido siendo menos utilizados y actualmente el mercado de las Big CASE ha muerto completamente abriendo el mercado de diversas herramientas más específicas para cada fase del ciclo de vida del software. Por ejemplo, algunas herramientas CASE son MagicDraw (diseño), ArchE (arquitectura) o MetaEdit (desarrollo).

Aunque no es fácil y no existe una forma única de clasificarlas, las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes parámetros:

  1. Las plataformas que soportan.
  2. Las fases del ciclo de vida del desarrollo de sistemas que cubren.
  3. La arquitectura de las aplicaciones que producen.
  4. Su funcionalidad.

La siguiente clasificación es la más habitual basada en las fases del ciclo de desarrollo que cubren:

  • Upper CASE (U-CASE), herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo, usando, entre otros diagramas UML.
  • Middle CASE (M-CASE), herramientas para automatizar tareas en el análisis y diseño de la aplicación.
  • Lower CASE (L-CASE), herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas. Además automatizan la documentación completa de la aplicación.

TENDENCIA ACTUAL

Las direcciones en las que evoluciona la ingeniería del software hoy en día pueden agruparse de la siguiente manera:

  • Metodologías ágiles: métodos de desarrollo de software basados en procesos iterativos e incrementales, donde los requisitos y soluciones evolucionan durante la colaboración.
    Metodologías como Scrum (1995), Extreme Programming (1999) o DSDM (1995) fueron evolucionando hasta que en Febrero del 2001 se publicó “Manifesto for Agile Software Development” para definir la aproximación ahora conocida como metodologías ágiles.
  • Experimentación: es una rama de la ingeniería del software interesada en realizar experimentos sobre software, recolectar datos y deducir leyes y teorías de los mismos.
  • Desarrollo dirigido por modelos: primero se desarrollan modelos textuales  gráficos del software a construir, y posteriormente se construye el software.
  • Líneas de productos software, en lugar de productos individuales.

A lo largo de los años han surgido numerosas organizaciones y estándares que apoyan la ingeniería del software y que dan más fuerza y potencia a este ámbito. Por ejemplo, el Software Engineering Institute (http://www.sei.cmu.edu/index.cfm), la IEEE Computer Society (http://www.computer.org/portal/web/guest/home), o documentos como el Software Engineering Body of Knowledge (SWEBOK).

En 2006, Money Magazine and Salary.com determine que la ingeniería del software era el mejor trabajo en América en términos de crecimiento, remuneración, nivel de estrés, flexibilidad horaria, creatividad, entorno de trabajo y capacidad de ascenso.

A su vez, la conferencia Future of Software Engineering (FOSE) del 2000 documentó el estado de la ingeniería del software y redactó una lista con varios problemas para ser solucionados durante la próxima década.

Hoy en día, contamos con carreras universitarias, másteres, y una gran oferta formativa para profesionales del software. A pesar de ser una disciplina joven y que sigue evolucionando, los resultados de todos los esfuerzos y métodos desarrollados con el paso de los años, así como de la experiencia, permiten desarrollar productos de calidad al nivel de cualquier otra ingeniería.

REFERENCIAS

http://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html

http://aprendeenlinea.udea.edu.co/lms/moodle/mod/resource/view.php?id=14273

http://www.experiencefestival.com/a/History_of_software_engineering_-_1985_to_present_No_silver_bullet/id/5134751

http://es.wikipedia.org/wiki/Herramienta_CASE

http://es.wikipedia.org/wiki/Metodolog%C3%ADa_de_desarrollo_de_software

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos

http://es.wikipedia.org/wiki/Extreme_Programming

http://es.wikipedia.org/wiki/Rational_Unified_Process#Un_poco_de_historia

http://media.wiley.com/product_data/excerpt/94/08186760/0818676094.pdf

http://en.wikipedia.org/wiki/History_of_software_engineering

http://www.dagstuhl.de/Reports/96/9635.pdf

Patricia Pons Tomás

Publicado en Historia Etiquetado con: , ,