Introducción a la ingeniería del software

Índice
- Introducción
- Objetivos
- 1.¿Qué es la ingeniería del software?
- 2.Organización de la ingeniería del software
- 2.1.Organización del desarrollo, operación y mantenimiento
- 2.2.Organización de los proyectos de desarrollo
- 2.3.Actividades de la ingeniería del software
- 2.4.Roles en la ingeniería del software
- 2.4.1.El jefe de proyectos
- 2.4.2.Los expertos del dominio
- 2.4.3.El analista funcional
- 2.4.4.El arquitecto
- 2.4.5.El analista orgánico o analista técnico
- 2.4.6.Los programadores
- 2.4.7.El experto de calidad (probador)
- 2.4.8.El encargado del despliegue
- 2.4.9.El responsable de producto
- 2.4.10.Otros roles
- 3.Métodos de desarrollo de software
- 4.Técnicas y herramientas de la ingeniería del software
- 5.Estándares de la ingeniería del software
- Resumen
- Actividades
- Ejercicios de autoevaluación
- Solucionario
- Glosario
- Bibliografía
Introducción
Objetivos
-
Entender qué es la ingeniería del software y situarla en contexto.
-
Entender las peculiaridades de la ingeniería del software comparada con otras ingenierías.
-
Saber identificar los diferentes roles y actividades que participan en un proyecto de desarrollo de software.
-
Conocer algunos de los métodos de desarrollo más utilizados.
-
Conocer algunas de las técnicas propias de la ingeniería del software.
-
Conocer los principales estándares de la ingeniería del software.
1.¿Qué es la ingeniería del software?
1.1.Software y hardware
1.2.El desarrollo de software
mov ax, num1 mov bx, num2 cmp ax, bx jg num2MasGrande ;num1>num2 jmp final num2MasGrande: ;num2>=num1 final:
if (num1>num2) { //num1 > num2 } else { //num2 >= num1 }
if (num1>num2) { //num1 > num2 } else { //num2 >= num1 }
1.3.El ámbito de la ingeniería del software
-
Software de sistemas. Son programas escritos para dar servicio a otros programas, como los sistemas operativos o los compiladores. Este tipo de programas suelen interactuar directamente con el hardware, de manera que sus usuarios no son los usuarios finales que usan el ordenador, sino otros programadores.
-
Software de aplicación. Son programas independientes que resuelven una necesidad específica, normalmente de una organización, como por ejemplo el software de gestión de ventas de una organización concreta. Pueden ser desarrollados a medida (para un único cliente) o como software de propósito general (se intentan cubrir las necesidades de varios clientes y es habitual que éstos utilicen sólo un subconjunto de la funcionalidad total).
-
Software científico y de ingeniería. Muy enfocados al cálculo y a la simulación, se caracterizan por la utilización de algoritmos y modelos matemáticos complejos.
-
Software empotrado. Es el software que forma parte de un aparato, desde el control de un horno hasta el ordenador de a bordo de un automóvil. Se caracteriza por las limitaciones en cuanto a recursos computacionales y por estar muy adaptado al producto concreto que controla.
-
Software de líneas de productos. Es software diseñado para proporcionar una capacidad específica pero orientado a una gran variedad de clientes. Puede estar enfocado a un mercado muy limitado (como la gestión de inventarios) o muy amplio (como una hoja de cálculo).
-
Aplicaciones web. Las aplicaciones web, independientemente de que sean un paquete o a medida, tienen una serie de características que las hacen diferentes del resto del software. Se caracterizan por unificar fuentes de datos y diferentes servicios en entornos altamente distribuidos.
-
Software de inteligencia artificial. Estos programas usan técnicas, herramientas y algoritmos muy diferentes del resto de los sistemas y, por lo tanto, tienen una problemática propia. Pertenecen a esta categoría los sistemas expertos, las redes neuronales y el software de reconocimiento del habla.
1.4.¿Qué es la ingeniería del software?
1.5.Historia de la ingeniería del software
1.6.La ingeniería del software comparada con las otras ingenierías
-
Por un lado, las nuevas posibilidades tecnológicas hacen que cambie totalmente la naturaleza de los productos que estamos desarrollando; por ejemplo, la aparición de las interfaces gráficas en los años ochenta, la consolidación del acceso a Internet en los años noventa o la popularización del acceso a Internet desde el móvil en la primera década del siglo XXI dieron lugar a nuevos tipos de productos y a nuevas necesidades prácticamente inimaginables diez años atrás.
-
Por otro lado, el aumento de la potencia de cálculo de los ordenadores también ha provocado cambios fundamentales en las herramientas que se usan para desarrollar software, tanto a escala de lenguajes y paradigmas de programación (estructurados, orientados a objetos, dinámicos, etc.), como de las propias herramientas (entornos de desarrollo, herramientas CASE, etc.).
2.Organización de la ingeniería del software
2.1.Organización del desarrollo, operación y mantenimiento
2.2.Organización de los proyectos de desarrollo
-
Qué tareas y en qué orden se deben llevar a cabo.
-
Qué roles deben tener las diferentes personas que participan en el desarrollo, cuál es la responsabilidad de cada rol y qué tareas deben llevar a cabo.

-
Qué artefactos (documentos, programas, etc.) deben usarse como punto de partida para cada tarea y qué se debe generar como resultado.
2.3.Actividades de la ingeniería del software
2.3.1.Gestión del proyecto
-
Estudio de viabilidad. Antes de empezar propiamente el proyecto, habrá que detectar una necesidad en la organización que lo encarga y elaborar un estudio de alternativas y costes para decidir si el proyecto de desarrollo es o no la mejor opción para satisfacer las necesidades mencionadas. Para hacerlo, habrá que anticipar el coste del proyecto (qué recursos se deben invertir para el desarrollo) y cuánto tiempo será necesario para desarrollarlo.
-
Estimación. Tal y como hemos dicho antes, hay que hacer una valoración del coste del proyecto, del tiempo necesario para llevarlo a cabo y de la relación entre recursos y tiempos: ¿cómo se modifica la estimación de tiempo si añadimos o quitamos recursos? Esta relación no suele ser lineal. El ejemplo clásico es que, mientras que una mujer puede gestar una criatura en nueve meses, nueve mujeres no la pueden gestar en un mes.
-
Definir claramente los objetivos del proyecto, que determinarán su éxito o fracaso. Por ejemplo, un proyecto puede fracasar porque, una vez iniciado, se descubra que es imposible cumplir sus objetivos con los recursos o el tiempo disponible (y, por lo tanto, sea necesario cancelar el proyecto).
-
Formar el equipo de desarrollo teniendo en cuenta la estimación de recursos hecha inicialmente. Este equipo puede estar formado por personas con dedicación completa al proyecto o con dedicación parcial. Cada vez más, es más habitual que estos equipos tengan, además de los desarrolladores, personas que representan a los stakeholders.
-
Establecer hitos que nos permitan llevar a cabo las actividades de seguimiento y control del proyecto para verificar su buen funcionamiento.
-
Identificar riesgos que puedan poner en peligro el éxito del proyecto. No sólo desde el punto de vista tecnológico (la obligación de utilizar tecnologías nuevas y poco probadas, etc.), sino desde el de todos (falta de apoyo por parte de la organización, problemas legales, etc.).

2.3.2.Identificación y gestión de los requisitos
-
Diferencias respecto a la información con la que trabajan las diferentes partes. Los stakeholders tienen información sobre el producto que los desarrolladores no tienen, mientras que los desarrolladores tienen información sobre la tecnología que los stakeholders no poseen. Esto puede condicionar la visión del problema que tienen unos y otros y puede afectar negativamente a la transferencia de información.
-
Limitaciones del canal utilizado. Cualquier canal de comunicación impone limitaciones. Por ejemplo, si la comunicación es escrita, se pierde el lenguaje no verbal, mientras que, si es verbal, se pierde la posibilidad de revisión que da la documentación escrita.
-
Limitaciones del lenguaje utilizado. El lenguaje natural es propenso a la ambigüedad, razón por la que se han desarrollado los lenguajes formales de especificación; estos lenguajes, sin embargo, suelen ser menos expresivos que el lenguaje natural. Además, sólo sirven para la comunicación si todas las partes los entienden correctamente.
-
Dificultad de definir el mejor sistema posible. Otro problema asociado a esta actividad es conseguir que los stakeholders comuniquen exactamente los requisitos del mejor sistema posible, dado que es habitual que, al describir el sistema que quieren, estén condicionados por el conocimiento que tienen sobre sistemas parecidos o, sencillamente, que no se les ocurran algunas posibilidades.
2.3.3.Modelización
2.3.4.Construcción y pruebas
2.3.5.Calidad
2.3.6.Mantenimiento y reingeniería
2.3.7.Actividades desde el punto de vista del ciclo de vida del proyecto
-
Tareas de iniciación. Son aquellas relativas a la toma de la decisión de si se empezará o no el proyecto (o la nueva fase del proyecto). Por ejemplo, una organización se puede plantear, como alternativa a un desarrollo, la adquisición de un producto ya desarrollado. Como resultado de las actividades de iniciación, obtendremos la definición del alcance del proyecto (lo que se hará y lo que no se hará como parte del proyecto) y la valoración de la duración (límite temporal) del proyecto y del coste (recursos humanos y materiales que habrá que invertir para llevar a cabo el proyecto).
-
Tareas de planificación. Ayudan a organizar el trabajo, definiendo qué tareas habrá que llevar a cabo y en qué orden. Por ejemplo, se puede decidir planificar el proyecto en función de los riesgos (llevar a cabo primero las tareas que pueden poner en peligro la viabilidad del proyecto), por funcionalidades (desarrollar una funcionalidad de manera completa antes de trabajar en las otras) o por tipos de actividades (primero hacer todas las tareas de un tipo, después pasar a las del tipo siguiente, etc.).
-
Tareas de ejecución. Son aquellas destinadas a completar el trabajo requerido para desarrollar el producto. Por ejemplo, escribir los programas.
-
Tareas de seguimiento y control. Son las destinadas a observar la ejecución del proyecto para detectar los posibles problemas y adoptar las acciones correctivas que sean necesarias. También nos ayudan a validar la planificación (por ejemplo, validando que la estimación inicial de coste y tiempo era correcta).
-
Tareas de cierre. Una vez finalizado el proyecto, hay que cerrarlo adecuadamente. Por ejemplo, habrá que realizar la aceptación del producto (que consiste en determinar que, efectivamente, el producto satisface los objetivos establecidos), resolver el contrato si se ha contratado una organización externa para hacer el desarrollo o traspasar el software al equipo de operaciones.
2.4.Roles en la ingeniería del software
2.4.1.El jefe de proyectos
2.4.2.Los expertos del dominio
2.4.3.El analista funcional
2.4.4.El arquitecto
2.4.5.El analista orgánico o analista técnico
2.4.6.Los programadores
2.4.7.El experto de calidad (probador)
2.4.8.El encargado del despliegue
2.4.9.El responsable de producto
2.4.10.Otros roles
3.Métodos de desarrollo de software
3.1.Historia de los métodos de desarrollo
-
Jidoka: evitar producir productos defectuosos parando, si es necesario, la línea de producción y
-
la producción just-in-time: producir sólo aquellos productos que son necesarios en la fase siguiente y no acumular excedentes.
-
La prevalencia de modas pasajeras más típicas de la industria de la moda que de una disciplina de la ingeniería.
-
La carencia de una base teórica sólida y ampliamente aceptada.
-
El enorme número de métodos y variantes de métodos, con diferencias pobremente comprendidas y magnificadas artificialmente.
-
La carencia de evaluación y validación experimental creíble.
-
La separación entre la práctica en la industria y la búsqueda científica".
3.2.Clasificación de los métodos de desarrollo
-
riesgo
-
valor de negocio
-
duración (menos de tres meses, de tres a seis meses, más de seis meses, etc.)
-
complejidad
-
tecnología utilizada
-
número de departamentos afectados
-
coste
|
Solución conocida
|
Solución poco conocida
|
---|---|---|
Objetivo claro
|
1
|
2
|
Objetivo poco claro
|
3
|
4
|
-
los que siguen el ciclo de vida en cascada (adecuado para los proyectos de tipo 1) por un lado,
-
los métodos iterativos e incrementales y
-
los ágiles, por el otro lado (más adecuados para los de tipo 2).
3.2.1.Ciclo de vida clásico o en cascada
-
Requisitos. Definir qué debe ser el producto que hay que desarrollar. Dado que el ciclo de vida en cascada es poco flexible a los cambios, esta etapa es crítica para el éxito del proyecto, pues un defecto en los requisitos se propagaría por el resto de las etapas y amplificaría los efectos nocivos. Para evitar este problema, los diferentes métodos dispondrán de herramientas como las revisiones de requisitos o los lenguajes formales de especificación como el OCL (4) .
-
Análisis y diseño. Definir cómo debe ser el producto tanto desde el punto de vista externo como interno. El análisis da un punto de vista externo documentando mediante modelos sobre qué hace el sistema, mientras que el diseño da el punto de vista interno documentando cómo obra (qué componentes forman parte de él, cómo se relacionan entre ellos, etc.).
-
Implementación. Escribir el código, los manuales y generar el producto ejecutable. Este código se debe escribir según las indicaciones efectuadas en la fase de análisis y diseño.
-
Pruebas. Se verifica que el producto desarrollado se corresponda con los requisitos. En este punto se muestra el producto a los usuarios finales para que validen el resultado.
-
Mantenimiento. Se pone el sistema a disposición de todos los usuarios y se corrigen los defectos que se vayan encontrando.

3.2.2.Ciclo de vida iterativo e incremental
-
Acelera la retroalimentación. Dado que cada iteración cubre todas las actividades del desarrollo (requisitos, análisis, implementación y pruebas), tenemos información sobre todos los ámbitos del producto desde el principio y, por ejemplo, si la arquitectura que hemos definido no se puede implementar, lo veremos al principio y no al final del proyecto. También nos permite obtener información empírica basada en el producto real, dado que la parte que está desarrollada es ya definitiva.
-
En todo momento se tiene un producto operativo. Como se van añadiendo funcionalidades a un producto operativo, en cualquier momento se puede decidir usar el sistema desarrollado, lo que permite acelerar el regreso de la inversión o, incluso, finalizar el proyecto antes de consumir todos los recursos asignados si se llega a un punto en el que el producto es "suficiente bueno".


3.2.3.Desarrollo lean y ágil
-
Individuos e interacciones sobre procesos y herramientas.
-
Software funcionando sobre documentación extensiva.
-
Colaboración con el cliente sobre negociación contractual.
-
Respuesta ante el cambio sobre seguir un plan.
3.3.Ejemplos de métodos de desarrollo
3.3.1.Métrica 3
-
planificación de sistemas de información (PSI)
-
desarrollo de sistemas de información (DSI)
-
estudio de viabilidad del sistema (EVS)
-
análisis del sistema de información (ASI)
-
diseño del sistema de información (DSI)
-
construcción del sistema de información (CSI)
-
implantación y aceptación del sistema (IAS)
-
-
mantenimiento de sistemas de información (MSI)








3.3.2.Proceso unificado
Fases del proyecto

Actividades
-
Modelización de negocio (business modelling). Esta actividad intenta solucionar el problema de comunicación entre los expertos en el dominio y los especialistas en tecnología que, habitualmente, usan lenguajes diferentes. Se generan los casos de uso "de negocio" (business use cases), que describen los procesos principales de la organización y que servirán como lenguaje común para todos los implicados en el proceso de desarrollo. Esta actividad es muy importante, ya que es la que nos asegurará que los desarrolladores entiendan cuál es la ensambladura del producto que están desarrollando dentro del contexto de la organización para la que lo están desarrollando.
-
Requisitos (requirements). Describir qué debe hacer el sistema (y que no debe hacer). El modelo que se usa para describir la funcionalidad del sistema es el denominado modelo de casos de uso, que consiste en describir escenarios de uso del sistema mediante una secuencia de acontecimientos (el usuario hace X, el sistema hace Y, etc.).
-
Análisis y diseño (analysis & design). Describir cómo se implementará el sistema. Se crean modelos detallados de los componentes que formarán el sistema. Estos modelos sirven como guía para los implementadores a la hora de escribir el código fuente de los programas. Estos modelos han de estar relacionados con los casos de uso y deben permitir introducir cambios en el supuesto de que los requisitos funcionales cambien.
-
Implementación (implementation). Definir la organización del código, escribirlo y verificar que cada componente cumple los requisitos de manera unitaria (es decir, de manera aislada del resto de los componentes) y generar un sistema ejecutable. El proceso también prevé la reutilización de componentes que existan previamente.
-
Pruebas (test). Verificar la interacción entre los objetos y componentes que forman el sistema. Dado que las pruebas se ejecutan durante todas las iteraciones, es más fácil detectar errores antes de que se propaguen por el sistema. Las pruebas han de incluir la fiabilidad, la funcionalidad y el rendimiento.
-
Deployment. Producir las entregas del sistema y entregarlas a los usuarios finales. Incluye las tareas relativas a la gestión de la configuración y de las versiones y, sobre todo, tiene lugar durante la fase de transición.

Roles
-
Stakeholder. Cualquier persona que tenga un interés en el resultado final del proyecto.
-
Jefe de proyecto. Encargado de la planificación y de coordinar la interacción entre los stakehoders. También es responsable de mantener a los miembros del equipo centrados en conseguir cumplir los objetivos del proyecto.
-
Analista. Recoge la información de los stakeholders a modo de requisitos, los clasifica y los prioriza. Es el que, en la clasificación que hemos hecho en el subapartado 2.4, hemos denominado analista funcional.
-
Arquitecto. Define la arquitectura del software, lo que incluye tomar las decisiones clave que afectan a todo el diseño y a la implementación del sistema.
-
Desarrollador. Desarrolla una parte del sistema, lo que incluye diseñarla de acuerdo con la arquitectura, prototipar (si es necesario) la interfaz gráfica de usuario, implementarla y probarla tanto aislada del resto del sistema como integrada con el resto de los componentes. Este rol incluye los roles de analista orgánico y programador, tal y como los hemos definido en el subapartado 2.4.
-
Experto en pruebas. Identifica, define, implementa y lleva a cabo las pruebas aportando un punto de vista complementario al del desarrollador. Lo más habitual es que trabaje sobre el sistema construido y no sobre componentes aislados.
3.3.3.Scrum
Roles
-
Scrum Master. Es responsable de asegurar que el equipo sigue los valores, las prácticas y las reglas de Scrum. También se encarga de eliminar los impedimentos que el equipo se pueda encontrar dentro de la organización.
-
Product owner. Es la persona responsable de velar por los intereses de todos los stakeholders y llevar el proyecto a buen término. Es, por lo tanto, el encargado de decidir qué se implementa y qué es más prioritario.
-
Team. El resto de los miembros del equipo son los desarrolladores. No se especializan, sino que todos deben tener, en mayor o menor medida, habilidades en todas las actividades implicadas. Los miembros del equipo deciden ellos mismos cómo se organizan el trabajo y nadie (ni siquiera el Scrum Master) les puede decir cómo lo deben hacer.
Artefactos
-
Product backlog. Es la lista de requisitos pendientes de implementar en el producto. Cada entrada (normalmente una "historia de usuario") tiene asociada una estimación del valor que aporta a la organización y también del coste de su desarrollo.
-
Sprint backlog. El backlog para una iteración concreta (Scrum denomina sprint a las iteraciones); más detallada que el product backlog y en la que cada historia de usuario se descompone en tareas de entre cuatro y dieciséis horas de duración.
-
Release burndown chart. Gráfico que muestra el progreso actual del equipo en función del número de historias de usuario que faltan por implementar.
-
Sprint burndown. El burndown para una iteración concreta, en la que el progreso se puede medir en tareas finalizadas aunque no sean historias de usuario completas.
Prácticas

-
Sprint planning meeting. Reunión que se organiza antes de empezar un sprint y en la que se deciden qué historias de usuario se implementarán en este sprint. Por lo tanto, se crea el sprint backlog.
-
Daily scrum. Reunión diaria en la que todos los miembros del equipo responden a tres preguntas: qué hicieron ayer, qué piensan hacer hoy y qué impedimentos se han encontrado que les han impedido avanzar. La finalidad de esta reunión es que todos los miembros del equipo estén enterados de lo que está haciendo el resto de los miembros y que así se identifiquen oportunidades de ayudarse unos a otros.
-
Sprint review meeting. Al finalizar un sprint se revisa el trabajo realizado y se enseña a quien esté interesado el resultado implementado (la demo).
-
Sprint retrospective. Sirve para reflexionar sobre lo que haya pasado durante el sprint y para identificar oportunidades de mejora en el proceso de desarrollo.
4.Técnicas y herramientas de la ingeniería del software
4.1.Técnicas basadas en la reutilización
-
Oportunidad. Dado que debemos desarrollar menos software, éste se puede desarrollar con más rapidez y, por lo tanto, tenerlo terminado antes.
-
Disminución de los costes. Puesto que el componente es compartido, el coste de su desarrollo y mantenimiento también puede ser compartido.
-
Fiabilidad. Los componentes reutilizados ya han sido probados y utilizados y, por lo tanto, podemos confiar en su buen funcionamiento, dado que, si tienen errores, algún otro los puede haber encontrado antes.
-
Eficiencia. El desarrollador del componente reutilizable se puede especializar en un problema muy concreto (el que resuelve el componente) y, por lo tanto, encontrar las soluciones más eficientes.
4.1.1.Desarrollo orientado a objetos

4.1.2.Bastimentos
4.1.3.Componentes
4.1.4.Desarrollo orientado a servicios
4.1.5.Patrones
-
Reutilizar las soluciones y aprovechar la experiencia previa de otras personas que han dedicado más esfuerzo a entender los contextos, las soluciones y las consecuencias de lo que nosotros queremos o podemos dedicar.
-
Beneficiarnos del conocimiento y la experiencia de estas personas mediante un enfoque metódico.
-
Comunicar y transmitir nuestra experiencia a otras personas (si definimos otros nuevos).
-
Establecer un vocabulario común para mejorar y agilizar la comunicación.
-
Encapsular conocimiento detallado sobre un tipo de problema y sus soluciones, asignándole un nombre para que podamos hacer referencia a él fácilmente.
-
No tener la necesidad de reinventar una solución al problema.
-
El nombre nos permite hacer referencia al patrón cuando documentamos nuestro diseño o cuando lo comentamos con otros desarrolladores. También nos permite aumentar el nivel de abstracción del proceso de diseño, dado que podemos pensar en la solución al problema como un todo.
-
El problema nos indica qué resuelve el patrón. Este problema podría ser un problema concreto o la identificación de una estructura problemática (por ejemplo, una estructura de clases poco flexible).
-
La solución describe los elementos que forman parte del patrón, así como sus relaciones, responsabilidades y colaboraciones. La solución no es una estructura concreta, sino que, como hemos indicado anteriormente, actúa como una plantilla que podemos aplicar a nuestro problema. Algunos patrones presentan varias variantes de una misma solución.
-
Las consecuencias son los resultados y los compromisos derivados de la aplicación del patrón. Es muy importante que las tengamos en cuenta a la hora de evaluar nuestro diseño, dado que es lo que nos permite entender realmente el coste y los beneficios de la aplicación del patrón.
-
Nombre: estado (también conocido como objetos por estados).
-
Problema: el comportamiento de un objeto depende de su estado y debe cambiar su comportamiento en tiempo de ejecución en función de éste. Las operaciones tienen sentencias condicionales largas que dependen del estado del objeto. A menudo varias operaciones tienen las mismas estructuras condicionales (es decir, prevén las mismas condiciones, dado que dependen de los posibles estados del objeto).
-
Solución: introducir una nueva clase que representa el estado con una subclase para cada estado que tenga un comportamiento diferente. Cada rama de las estructuras condicionales se corresponderá ahora con una de las subclases del estado. Esto nos permite tratar el estado del objeto como un objeto en sí mismo que puede cambiar independientemente del resto de los objetos.
-
Consecuencias: localiza el comportamiento específico del estado, divide el comportamiento de los diferentes estados y hace explícitas las transiciones entre estados.
4.1.6.Líneas de producto
4.2.Técnicas basadas en la abstracción
4.2.1.Arquitectura dirigida por modelos

4.2.2.Lenguajes específicos del dominio
4.3.Herramientas de apoyo a la ingeniería del software (CASE)
-
Herramientas de gestión del proceso. Ayudan a la definición, modelización, ejecución o gestión del proceso del propio desarrollo.
-
Herramientas de gestión de proyectos. Herramientas que ayudan en tareas de gestión del proyecto, como la valoración, la planificación o el análisis del riesgo.
-
Herramientas de gestión de requisitos. Herramientas de apoyo para la recogida, documentación, gestión y validación de requisitos. Pueden ser genéricas, en las que los requisitos se documentan textualmente, o específicas, como las basadas en historias de usuario o en casos de uso.
-
Herramientas de modelización. Herramientas que facilitan la creación de modelos. En el caso específico de UML, permiten la creación de diagramas UML y validan en mayor o menor grado la corrección de la sintaxis utilizada.
-
Herramientas de ingeniería inversa. Se trata de herramientas que permiten analizar un software existente para poder empezar a aplicar los principios de ingeniería del software; normalmente elaboran modelos de análisis y diseño, por ejemplo, en UML, a partir del código, de una base de datos existente, etc.
-
Entorno integrado de desarrollo. Herramientas para la codificación del software, pero también para el diseño, la ejecución de pruebas y la depuración.
-
Herramientas de construcción del software. Herramientas que construyen el ejecutable final a partir de los varios archivos de código fuente. Realizan la compilación de los archivos, pero también el empaquetamiento en el formato adecuado para la entrega.
-
Herramientas de pruebas. Herramientas para la definición de una estrategia de pruebas y para el seguimiento a lo largo del proyecto. Pueden ayudar en la definición de la prueba, la ejecución, la gestión de las pruebas y de los resultados obtenidos, etc.
-
Herramientas de desarrollo de interfaces gráficas de usuario. Son herramientas que permiten desarrollar las interfaces gráficas de usuario de manera gráfica, de tal manera que, en lugar de la necesidad de programar el 100% de la interfaz, el desarrollador puede arrastrar componentes a las pantallas de manera visual y programar sólo el comportamiento dinámico.
-
Herramientas de medida de métricas. Herramientas que permiten medir una serie de métricas de manera automatizada para darnos criterios objetivos, que a su vez nos permiten valorar la calidad del software desarrollado en cuanto a arquitectura, diseño, código, pruebas, etc.
-
Herramientas de gestión de la configuración y del cambio. Herramientas que gestionan el cambio del software a lo largo de su vida. Pueden gestionar las distintas versiones que se van creando de cada artefacto, las distintas versiones del producto final, la integración de las nuevas versiones de cada parte del producto final, etc.
5.Estándares de la ingeniería del software
5.1.Lenguaje unificado de modelización (UML)
5.2.Software engineering body of knowledge (SWEBOK)
-
Promover una visión consistente de lo que es la ingeniería del software a escala mundial.
-
Clarificar la situación (y las fronteras) de la ingeniería del software hacia otras disciplinas como las ciencias de la computación (computer science), la gestión de proyectos, la ingeniería de computadores (computer engineering) y las matemáticas.
-
Caracterizar los contenidos de la disciplina de la ingeniería del software.
-
Proporcionar un acceso organizado al cuerpo de conocimiento de la ingeniería del software.
5.3.Capability maturity model integration (CMMI)
-
Gestión de servicios (CMMI-SVC), destinado a proveedores de servicios con el fin de ayudarlos a reducir costes, mejorar la calidad y la predictibilidad. Incluye buenas prácticas sobre qué servicios se deben ofrecer, asegurarse de que se está en condiciones de ofrecer un servicio y establecer acuerdos y actividades relacionadas, en general, con la provisión de servicios
-
Adquisición (CMM-ACQ), enfocado a ayudar a organizaciones que contratan proveedores de productos o servicios para mejorar las relaciones con los proveedores, los procesos de contratación y de control, así como la adecuación del producto o servicio adquirido a las necesidades de la organización.
-
Desarrollo (CMMI-DEV), dirigido a organizaciones que desarrollan software y que quieran mejorar la satisfacción de los clientes, la calidad del producto obtenido y el propio proceso de desarrollo.
5.4.Project management body of knowledge (PMBOK)
-
gestión de la integración
-
gestión del alcance
-
gestión del tiempo
-
gestión de la calidad
-
gestión de los costes
-
gestión del riesgo
-
gestión de recursos humanos
-
gestión de la comunicación
-
gestión de las compras y adquisiciones
Resumen
Actividades
-
El núcleo del SO Linux
-
Un gestor de ventanas en un entorno de escritorio (por ejemplo, MetaCity)
-
Un paquete ofimático, como OpenOffice
-
El software de planificación de recursos empresariales SAP
-
Un sistema de gestión del correo electrónico vía web (como Hotmail)
-
La aplicación de campus virtual de la UOC
-
El software Mathematica
-
AutoCAD
-
El software que gestiona el GPS de un coche
-
El software de reconocimiento del habla
-
Estudiar el producto ofrecido por la compañía X para ver si satisface nuestras necesidades o si, por el contrario, deberemos buscar otro producto o hacer un desarrollo a medida.
-
Determinar si podemos acabar el proyecto en una fecha concreta si María deja el proyecto.
-
Establecer el calendario de reuniones de seguimiento del proyecto.
-
Estudiar cómo nos afecta la LOPD.
-
Crear un modelo de la interfaz de usuario para mostrar a los usuarios finales cómo será la aplicación.
-
Crear un diagrama UML con el modelo conceptual del dominio.
-
Determinar y documentar qué volumen máximo de usuarios debe soportar el sistema que hay que desarrollar.
-
Detectar cuáles son las necesidades de los administradores del sistema.
-
Elaborar un prototipo de la interfaz gráfica de usuario para probar diferentes combinaciones de colores y diferentes disposiciones de la información.
-
Diseñar un componente del sistema.
-
Comprobar que el sistema soporta el volumen máximo de usuarios que se determinó.
-
Verificar que se ha seguido el proceso de desarrollo tal y como está definido.
-
Recoger información sobre el número de requisitos implementados cada semana.
-
Corregir un error en un sistema ya en producción.
-
Desarrollar una aplicación para sustituir la hoja de cálculo en la que apuntamos las vacaciones.
-
Desarrollar un sistema de comercio electrónico que permita incrementar las ventas en línea.
-
Evaluar OpenOffice como alternativa a las herramientas ofimáticas que se están usando actualmente en nuestra organización.
-
Identificar qué sistemas actuales nuestros podemos sustituir por aplicaciones de software libre.
-
Desarrollar una aplicación que incorpore datos de unos ficheros en un formato conocido y documentado y los guarde en una base de datos existente.
-
Desarrollar una aplicación para automatizar el proceso de compra de mercancías a proveedores en una organización en la que, actualmente, todo el proceso es manual.
Requisito
|
Análisis y diseño
|
Implementación
|
Pruebas
|
---|---|---|---|
a
|
1
|
1
|
1
|
b
|
3
|
5
|
2
|
c
|
2
|
4
|
1
|
d
|
1
|
3
|
1
|
e
|
2
|
1
|
2
|
f
|
1
|
3
|
2
|
g
|
1
|
1
|
1
|
-
Una vez aclarada la funcionalidad en una conversación con el cliente, observamos que el coste de documentarla e implementarla es más o menos el doble de implementarla directamente y decidimos no documentarla.
-
El cliente debe firmar el documento de requisitos antes de empezar el desarrollo para asegurarnos de que lo ha entendido bien y que no habrá que introducir cambios.
-
Los desarrolladores deben rellenar un informe al final del día en el que indiquen, además de sus horas de trabajo, cuántas han dedicado a cada una de las tareas.
-
El jefe de proyectos no asigna tareas a los desarrolladores, sino que éstos se presentan voluntarios.
-
El cliente debe estar disponible en todo momento para resolver dudas a los desarrolladores (y no sólo al jefe de proyecto).
-
Se ha planificado en detalle y se ha documentado en un diagrama de Gantt todo el trabajo de los próximos seis meses.
-
Existe un proceso de gestión del cambio que permite introducir cambios en los requisitos una vez iniciado el desarrollo.
-
Todas las personas implicadas en el desarrollo del proyecto trabajan en la misma sala.
-
Toda la comunicación entre desarrolladores se debe llevar a cabo por medio de un foro para que quede registrada y se pueda reutilizar más adelante.
-
A la hora de medir el avance del proyecto no se tiene en cuenta la funcionalidad que está a medio implementar. Por ejemplo, si tenemos la especificación y el análisis de una funcionalidad pero no la hemos acabado de diseñar e implementar, consideramos que el avance es 0 y no el 50%. Por lo tanto, consideramos que el avance de una funcionalidad es SÍ/NO y no un porcentaje.
Ejercicios de autoevaluación
Solucionario
-
Software de sistemas
-
Software de sistemas
-
Software de aplicación, línea de productos
-
Software de aplicación, línea de productos
-
Aplicación web
-
Aplicación web
-
Software científico/de ingeniería
-
Software de ingeniería
-
Software empotrado (también podría formar parte de una línea de productos)
-
Inteligencia artificial
-
El principal argumento a favor es el gran número de proyectos de desarrollo de software que se han llevado a cabo a lo largo de los años aplicando la ingeniería al desarrollo del software y el modo como se ha mejorado respecto a la situación anterior. En el subapartado 1.5, hablamos de Chaos Report de los años 1995 y 2010 y de cómo se ha doblado en quince años el número de proyectos que se consideran 100% exitosos.
-
Otro argumento a favor es que el enfoque sistemático (que, como acabamos de señalar, es viable) nos permite aplicar el conocimiento de las otras ingenierías al desarrollo del software. Es el caso, por ejemplo, de los principios del método de producción de Toyota, que se han trasladado al mundo del desarrollo de software y que se denomina desarrollo lean.
-
Por un lado, Tom DeMarcos nos dice, en el artículo "Software Engineering: An Idea Whose Time Has Come and Gone?", publicado en la revista IEEE Software, en el número de julio/agosto del 2009, que si bien la ingeniería se centra en el control del proceso, éste no debería ser el aspecto más importante que considerar a la hora de pensar en el modo como desarrollamos el software, sino que nos deberíamos centrar en el modo como el software transforma el mundo en el que vivimos o la organización para la que lo desarrollamos.
-
Por otro lado, otro argumento en contra del enfoque de ingeniería es aquel que considera que el impacto de las personas en el proceso de desarrollo de software (su habilidad, cómo se relacionan y el modo como se comunican, su estado de ánimo, su motivación, etc.) es tan grande que ningún método, por muy definido que esté, puede convertir el desarrollo de software en un proceso repetible.
-
Se suelen realizar en equipo.
-
El nivel de experiencia y la habilidad natural de los participantes influyen mucho en el resultado final.
-
Se debe conseguir un objetivo con un tiempo y unos recursos limitados.
-
En el alpinismo cada ascensión empieza de cero, mientras que la ingeniería del software puede aprovechar parte del trabajo que ya está hecho en otros proyectos y, por lo tanto, debemos intentar tener en cuenta los futuros desarrollos durante el proyecto.
-
El alpinismo tiene un final claro y a corto plazo: o bien el momento de llegar a la cumbre o bien el momento de volver. La ingeniería del software, en cambio, debe tener en cuenta el mantenimiento futuro del sistema y su operación.
-
En el alpinismo no es habitual cambiar de miembros del equipo durante la ascensión, mientras que, a lo largo de la vida del software, es habitual que se produzcan cambios.
-
Gestión del proyecto
-
Gestión del proyecto
-
Gestión del proyecto
-
Gestión del proyecto, requisitos
-
Modelización
-
Modelización
-
Requisitos
-
Requisitos
-
Requisitos
-
Construcción y pruebas
-
Construcción y pruebas
-
Calidad
-
Calidad
-
Mantenimiento
-
1 (Objetivo claro y solución conocida)
-
2 (Objetivo claro y solución no conocida)
-
1 (Objetivo claro y solución conocida)
-
3 (Objetivo poco claro y solución no conocida)
-
1 (Objetivo claro y solución conocida)
-
2 (Objetivo claro y solución no conocida)
-
No sigue los principios del manifiesto ágil porque este, aunque dice que preferimos software funcionando sobre documentación exhaustiva, también dice que reconoce el valor de los ítems a la derecha y, por lo tanto, no hacer ninguna documentación no va en contra de esta última frase.
-
No cumple el principio "Colaboración con el cliente por encima de negociación del contrato".
-
En este caso, dependerá de cuánto tiempo deben dedicar los desarrolladores a rellenar el informe, dado que, en función de esto, se puede considerar que no se cumple el principio "Individuos e interacciones por encima de procesos y herramientas".
-
Sí que cumple el principio "Individuos e interacciones por encima de procesos y herramientas".
-
Sí que cumple el principio de "Colaboración con el cliente por encima de negociación del contrato".
-
No cumple el principio "Responder al cambio por encima del seguimiento de un plan".
-
Sí que cumple el principio "Responder al cambio por encima del seguimiento de un plan".
-
Sí que cumple el principio "Individuos e interacciones antes de procesos y herramientas".
-
No cumple el principio "Individuos e interacciones antes de procesos y herramientas".
-
Sí que cumple el principio "Software que funciona antes de la documentación exhaustiva".
-
identificar y dar una visión general de los requisitos
-
detallar los requisitos globales del sistema
-
detallar los casos de uso
-
desarrollar la visión tecnológica
-
Las métricas deben medir cosas medibles.
-
Las métricas se deben tomar en el nivel adecuado y en la unidad adecuada.
-
Sólo tiene sentido medir si se quiere actuar sobre el resultado.
Glosario
- abstracción f
- La abstracción consiste en identificar los aspectos relevantes de un problema, de manera que nos podamos concentrar sólo en ellos.
- actividad f
- Conjunto de tareas que llevan a cabo las personas que desempeñan un determinado rol.
- análisis m
- El análisis de un sistema informático documenta cómo debe ser el producto que hay que desarrollar desde un punto de vista externo (es decir, sin considerar cómo está hecho por dentro). Normalmente, esta documentación se basa en modelos.
- artefacto m
- Objeto producido por el trabajo del ser humano. En el contexto de la ingeniería del software, cada uno de los documentos, modelos, programas, etc., que se generan como resultado del trabajo del ingeniero.
- ciclo de vida m
- El ciclo de vida de un proceso define cuáles son las diferentes etapas por las que
va pasando un proceso a lo largo de su vida. En la ingeniería del software usamos
este término para clasificar los métodos en familias según el tipo de ciclo de vida.
Ved ciclo de vida en cascada, ciclo de vida iterativo y ciclo de vida incremental - ciclo de vida en cascada m
- Ciclo de vida secuencial que consta de las etapas siguientes: requisitos, análisis y diseño, implementación, pruebas y mantenimiento. A pesar de haber varias variantes del ciclo de vida en cascada, lo que las caracteriza a todas es su naturaleza secuencial.
- ciclo de vida incremental m
- Un ciclo de vida es incremental cuando el producto que hay que desarrollar se crea intermediando pequeños incrementos de funcionalidad completa que se van agregando al producto desarrollado.
- ciclo de vida iterativo m
- Un ciclo de vida es iterativo si organiza el desarrollo en iteraciones de tiempo determinado. La principal ventaja del ciclo de vida iterativo es que permite establecer puntos de control regulares (al final de cada iteración) durante el desarrollo.
- computer aided software engineering
- Término que se usa normalmente para referirse a las herramientas cuya finalidad es
ayudar el ingeniero de software a aplicar los principios de ingeniería en el desarrollo
de software.
Sigla CASE - construcción del software f
- Actividad cuya finalidad es la obtención del producto ejecutable. Esto incluye, entre otras funciones, la creación del código fuente, la creación de los archivos ejecutables o la gestión de la configuración.
- desarrollo ágil m
- El desarrollo ágil consiste en aplicar los cuatro principios del Manifiesto ágil al desarrollo de software. También se conoce como desarrollo ágil el conjunto de métodos de desarrollo que comparten los principios mencionados.
- desarrollo lean m
- El desarrollo lean intenta aplicar las técnicas de manufactura lean al desarrollo de software. Estas técnicas se derivan, originariamente, del sistema de producción Toyota (TPS).
- desarrollo de software m
- Acto de producir o crear software.
- diseño de software m
- El diseño de software documenta la estructura y el comportamiento interno de un sistema informático.
- gestión del proyecto f
- Todo aquello que no sea la ejecución del proyecto. Su objetivo principal es asegurar el éxito del proyecto.
- hardware m
- Conjunto de instrucciones codificadas y de datos que son la expresión completa de un procedimiento, y en particular de un algoritmo, ejecutable por un sistema informático.
- implementación (como actividad del desarrollo) f
- Creación del código fuente.
- implementación (como parte de la ocultación de información) f
- Parte interna de un objeto o un sistema; incluye todo aquello que no es visible a quienes lo usan.
- ingeniería f
- Aplicación de un enfoque sistemático, disciplinado y cuantificable a las estructuras, las máquinas, los productos, los sistemas o los procesos para obtener un resultado esperado.
- ingeniería del software f
- Aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, la operación y el mantenimiento del software; es decir, la aplicación de la ingeniería al software.
- interfaz (como parte de la ocultación de información) f
- Parte externa de un objeto o un sistema; incluye todo aquello sí que es visible a quienes lo usan.
- mantenimiento del software m
- Comprende la modificación posterior al desarrollo del producto de software para corregir los errores o adaptarlo a nuevas necesidades.
- método m
- Definición de las características del proceso o procedimiento disciplinado utilizado en la ingeniería de un producto o en la prestación de un servicio.
- metodología f
- Ciencia que estudia los métodos. Conjunto de los métodos de una disciplina.
- modelización f
- Actividad que consiste en la creación de modelos del sistema que hay que desarrollar: estos modelos facilitarán la comprensión de los requisitos y el diseño del sistema.
- ocultación de información f
- La ocultación de información consiste en esconder los detalles sobre la estructura interna de un módulo, de manera que podamos definir claramente qué aspectos de los objetos son visibles públicamente (y, por lo tanto, utilizables por los reutilizadores) y cuáles no.
- operación del software f
- La operación del software consiste en ejecutar el producto de software dentro de su entorno en ejecución para llevar a cabo su función.
- procedimiento m
- Ved proceso
- proceso m
- Manera de descomponer una acción progresiva.
- programación f
- Normalmente, se denomina programación a la creación del código fuente.
- requisito m
- Los requisitos expresan las necesidades y restricciones que afectan a un producto de software que contribuye a la solución de un problema del mundo real.
- sistema de información m
- Cualquier combinación de tecnología de la información y actividades humanas que utilizan esta tecnología para dar apoyo a la operación, gestión o toma de decisiones.
- software m
- Conjunto de programas. Más formalmente, conjunto de programas de computación, procedimientos, reglas, documentación y datos asociados que forman parte de las operaciones de un sistema de cómputo.
- tarea f
- Como parte de la ejecución de un proceso, cada tarea debe ser llevada a cabo por una persona con un rol concreto para crear unos artefactos de salida a partir de unos artefactos de entrada.
- unified modeling language m
- Lenguaje unificado de modelización. Es un estándar publicado por el OMG que define
la notación aceptada universalmente para la creación de modelos del software.
Sigla UML