miércoles, 21 de septiembre de 2016

La ingeniería de software es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación y mantenimiento de software,1 y el estudio de estos enfoques, es decir, la aplicación de la ingeniería al software.2 Integra matemáticas, ciencias de la computación y prácticas cuyos orígenes se encuentran en la ingeniería.3
Se citan las definiciones más reconocidas, formuladas por prestigiosos autores:
  • Ingeniería de software es el estudio de los principios y metodologías para el desarrollo y mantenimiento de sistemas software (Zelkovitz, 1978).
  • Ingeniería de software es la aplicación práctica del conocimiento científico al diseño y construcción de programas de computadora y a la documentación asociada requerida para desarrollar, operar y mantenerlos. Se conoce también como desarrollo de software o producción de software (Bohem, 1976).
  • La ingeniería de software trata del establecimiento de los principios y métodos de la ingeniería a fin de obtener software de modo rentable, que sea fiable y trabaje en máquinas reales (Bauer, 1972).
  • La ingeniería de software es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación, y mantenimiento del software.1
En 2004, la U. S. Bureau of Labor Statistics (Oficina de Estadísticas del Trabajo de Estados Unidos) contó 760 840 ingenieros de software de computadora.4 El término "ingeniero de software", sin embargo, se utiliza de manera genérica en el ambiente empresarial, y no todos los que se desempeñan en el puesto de ingeniero de software poseen realmente títulos de ingeniería de universidades reconocidas.
Algunos autores consideran que "desarrollo de software" es un término más apropiado que "ingeniería de software" para el proceso de crear software. Personas como Pete McBreen (autor de "Software Craftmanship") cree que el término IS implica niveles de rigor y prueba de procesos que no son apropiados para todo tipo de desarrollo de software.
Indistintamente se utilizan los términos "ingeniería de software" o "ingeniería del software"; aunque menos común también se suele referenciar como "ingeniería en software".5 6 7 En Hispanoamérica los términos más comúnmente usados son los dos primeros.
La creación del software es un proceso intrínsecamente creativo y la ingeniería del software trata de sistematizar este proceso con el fin de acotar el riesgo del fracaso en la consecución del objetivo, por medio de diversas técnicas que se han demostrado adecuadas sobre la base de la experiencia previa.
La IS se puede considerar como la ingeniería aplicada al software, esto es, por medios sistematizados y con herramientas preestablecidas, la aplicación de ellos de la manera más eficiente para la obtención de resultados óptimos; objetivos que siempre busca la ingeniería. No es sólo de la resolución de problemas, sino más bien teniendo en cuenta las diferentes soluciones, elegir la más apropiada.
Todo el mundo que haya tenido que escribir alguna vez un programa de tamaño medio (o incluso pequeño) estará de acuerdo en que la producción de software es algo, cuando menos, complicado. Pero para decidir de una forma rigurosa si podemos calificarlo como "complejo", recurriremos a la definición de Sáez Vacas (ver capítulo "Marcos Conceptuales"). Tras la revisión de esta definición, podemos concluir que el software se ajusta a ella al menos en los siguientes aspectos:


a. "Dificultad de comprensión". Por lo pronto podemos decir sin temor a equivocarnos que el software es normalmente algo difícil de entender. Cuando nos encontramos ante un listado, sólo tras un cuidadoso examen podemos deducir qué es lo que hace el programa correspondiente. Y aún así, esta deducción suele ser aproximada. Lo que verdaderamente sucede en la ejecución sólo podemos saberlo con certeza después, precisamente, de esta ejecución. Si el lector ha tenido que descifrar alguna vez un código escrito por otro programador, o incluso uno suyo, pero desarrollado hace algún tiempo, comprenderá sin duda de qué estamos hablando. La evolución de los lenguajes de programación, por ejemplo, está fuertemente marcada por el intento de conseguir listados más legibles. Por ejemplo Ada, el lenguaje promovido por el Departamento de Defensa de los Estados Unidos, ha sido diseñado buscando de forma especial el facilitar la comprensión del código. La idea es que un programador diferente del original pueda entender un listado con relativa facilidad, y no le sea difícil hacerse una idea exacta de cómo se comportará el programa correspondiente al ejecutarse. Así suele decirse que Ada es un lenguaje mucho más fácil de leer que de escribir.


b. "Requiere una gran cantidad de información y tiempo, y el esfuerzo coordinado de personas y maquinaria". En efecto, cualquier proyecto informático de mediana entidad requiere de un equipo de profesionales (analistas, programadores, etc.) que se ocupe de definirlo, desarrollarlo, probarlo, mantenerlo e incluso quizás, modificarlo, durante toda su vida útil. La gestión del software es un problema hasta la fecha no resuelto en su totalidad, aunque se han propuesto varias técnicas para afrontarlo. Por otra parte, las herramientas CASE (ingeniería software asistida por ordenador) se están desarrollando a gran velocidad, y no por capricho. Para manejar toda la información generada en el proceso de producción de un programa, se hace necesario el contar con estas herramientas. Si no, el problema llega a ser, sencillamente, inabordable. Para hacernos una idea de lo que supone el tiempo en el proceso de desarrollo, basta recordar los repetidos retrasos que a menudo ha sufrido la aparición de populares programas para pc. Son muy conocidos, por ejemplo, los casos del dBase IV y de la nueva versión del Lotus 123. Y es que el tiempo de desarrollo no sólo suele ser largo, sino que también es muy difícil de predecir.


c. "Efectos positivos y negativos simultáneos". Prácticamente todo el software que se utiliza tiene errores, unos más evidentes y otros menos, unos más peligrosos y otros más G M T.I. Medidas de la complejidad del software 3 Complejidad y Tecnologías de la Información (Tecnologías de la información) benignos, unos conocidos y otros desconocidos (hasta que aparecen, claro, causando normalmente algún perjuicio). Así pues, los programas de que se dispone hacen normalmente lo que se espera de ellos, excepto en el caso de que se encuentren con un error de programación. Los errores no son más que comportamientos no deseados del programa bajo ciertas condiciones que, por alguna razón, pasaron desapercibidas en las etapas de diseño y codificación. Y cuando estas condiciones aparecen, los efectos pueden ser desastrosos. Por ejemplo, a finales de 1.988 alguien utilizó defectos en algunos programas de comunicaciones y de correo electrónico ampliamente extendidos para construir un programa que se "reprodujo", sin permiso (y durante cierto tiempo, sin conocimiento) de los usuarios, por gran parte de la red DARPA, en Estados Unidos. Así los programas de comunicaciones que, en principio, producen efectos positivos, produjeron también el efecto negativo de disminuir la seguridad del sistema.


d. "Comportamiento impredecible". Normalmente, lo más que podemos asegurar de un programa es que ha sido probado bajo muchas condiciones, y que durante esas pruebas no ha presentado comportamientos "extraños". Pero nada más. De hecho, la del software es la única ingeniería que vende sus productos sin garantía, en el sentido de que es común la venta "tal cual", sin garantizar un determinado comportamiento del sistema informático. Los estudios sobre fiabilidad y verificación constituyen un campo donde la investigación es muy activa, aunque hasta el momento no ha deparado resultados espectaculares (véase el capítulo sobre el desarrollo del software).

Factores de calidad y productividad


Se definen cinco factores importantes que inciden en la productividad del software:

· Factores humanos: El tamaño y la experiencia de la organización de desarrollo. 
· Factores del problema: La complejidad del problema que se debe resolver y el número de cambios en las restricciones o los requisitos del diseño. 
· Factores del proceso: Técnicas del análisis y diseño qué se utilizan, lenguajes y herramientas CASE y técnicas de revisión. 
· Factores del producto: Fiabilidad y rendimiento del sistema basado en computadora. 
· Factores del recurso: Disponibilidad de herramientas CASE, y recursos (hardware y software).

Factores que influyen sobre la calidad y productividad

El objetivo primordial de la ingeniería del software es producir un sistema, aplicación o producto de alta calidad. Para lograr este objetivo, los ingenieros de software deben aplicar métodos efectivos junto con herramientas modernas dentro del contexto de un proceso maduro de desarrollo del software. Además, un buen ingeniero del software (y buenos gestores de la ingeniería del software) deben medir si la alta calidad se va a llevar a cabo.

La calidad de un sistema, aplicación o producto es tan bueno como los requisitos que describen el problema, el diseño que modela la solución, el código que conduce a un programa ejecutable y las pruebas que ejercitan el software para detectar errores. Un buen ingeniero del software utiliza mediciones que evalúan la calidad del análisis y los modelos de diseño, el código fuente y los casos de prueba que se han creado al aplicar la ingeniería del software.

En las dos décadas pasadas, se definieron un juego de factores de calidad como los primeros pasos hacia el desarrollo de la calidad del software.
Estos factores evalúan el software desde tres puntos de vista distintos:

· Operación del producto (utilizándolo). 
· Revisión del producto (cambiándolo). 
· Transición del producto (modificándolo para que funcione en un entorno diferente)

Los atributos que proporcionan una indicación de la calidad del software siguen siendo los mismos.

Medida de la calidad: Aunque hay muchas medidas de la calidad de software, la corrección, facilidad de mantenimiento integral y facilidad de uso proporcionan indicadores útiles para el equipo del proyecto.

Corrección: Un programa debe operar correctamente o proporcionará poco valor a sus usuarios. La corrección es el grado en el que el software lleva a cabo su función requerida. 

Facilidad de mantenimiento: El mantenimiento del software cuenta con más esfuerzo que cualquier otra actividad de ingeniería del software. La facilidad de mantenimiento es la facilidad con la que se puede corregir un programa si se encuentra un error, se puede adaptar si su entorno cambia, o mejorar si el cliente desea un cambio de requisitos.
No hay forma de medir directamente la facilidad de mantenimiento

Integridad: En esta época de intrusos informáticos y de virus, la integridad del software ha llegado a tener mucha importancia. Este atributo mide la habilidad de un sistema para resistir ataques (tanto accidentales como intencionados) contra su seguridad. El ataque se puede realizar en cualquiera de los tres componentes del software: programas, datos y documentos.
Para medir la integridad, se tienen que definir dos atributos adicionales: amenaza y seguridad.
Amenaza es la probabilidad de que ocurra un ataque de cualquier tipo.
La seguridad es la probabilidad de que se pueda repeler el ataque. 

· Facilidad de uso: Si un programa no es «amigable con el usuario», frecuentemente está abocado al fracaso, incluso aunque las funciones que realice sean valiosas. La facilidad de uso es un intento de cuantificar «lo amigable que puede ser con el usuario» y se puede medir en función de cuatro características:
· Habilidad intelectual y/o física requerida para aprender el sistema. 
· El tiempo requerido para llegar a ser moderadamente eficiente en el uso del sistema. 
· Aumento neto en productividad. 
· Valoración subjetiva (a veces obtenida mediante un cuestionario) de la disposición de los usuarios hacia el sistema