Está en la página 1de 105

Visión General de la

Ingeniería Web.
3. Software
Luis Fernández Muñoz
https://www.linkedin.com/in/luisfernandezmunyoz
setillofm@gmail.com
http://blogs.upm.es/garabatossoftware
miw.etsisi.upm.es https://twitter.com/garabatSoftware
3. Software 2

INDICE
1. Naturaleza del Software
2. Fundamentos del Software
3. Economía del Software
4. Crisis del Software
5. Complejidad del Software
6. Disciplinas del Software
7. Calidad del Software
8. Metodologías de Desarrollo del Software
3. Software 3
Índice

3.1. Naturaleza del Software


1. Definición de Software
2. Definición de Sistema Complejos
3. Atributos de Sistemas Complejos
3. Software > 1. Naturaleza del Software 4
Índice

3.1.1. Definición del Software


 Software “es la información que se suministra el
desarrollador a la computadora para que manipule la
información que suministra el usuario” [Cox]
 Esta información la suministra el desarrollador mediante:
▫ Programas en lenguajes de programación (Java, C/C++, …),
▫ Scripts para la creación de las tablas de las bases de datos y su
población (SQL) o generación de páginas dinámicas en aplicaciones
Web (JSP, PHP, …),
▫ Presentaciones en lenguajes de formato para aplicaciones Web
(HTML, CSS, …)
▫ Datos de configuración en diversos formatos (texto libre, XML, …)
▫ Multimedia en formatos de imagen, sonido o video para iconos o
pantallas de presentación (*.png, *.waw, *.mpeg, …)
▫ …
3. Software > 1. Naturaleza del Software 5
Índice

3.1.2. Definición de Sistemas Complejos


 Un Sistema es un conjunto de componentes interactuando o
interdependientes formando un todo integrado. Cada
sistema está delimitado por sus límites espacio/temporales e
influenciado por su entorno, descrito por su estructura y
propósito y expresado en su funcionamiento
 Un Sistema Complejo es aquel cuya complejida excede la
capacidad intelectual humana.
3. Software > 1. Naturaleza del Software 6
Índice

3.1.3. Atributos de Sistemas Complejos


 Atributos:
▫ Estructura jerárquica
▫ Elementos primitivos
relativos
▫ Separación de asuntos
▫ Patrones comunes
▫ Formas intermedias
estables
3. Software > 1. Naturaleza del Software 7
Índice

3.1.3. Atributos de Sistemas Complejos


 Estructura jerárquica. Frecuentemente, la complejidad
adquiere una forma jerárquica donde el sistema complejo
está compuesto de subsistemas interrelacionados que a su
vez tienen sus propios subsistemas y así hasta que se alcanza
algún elemento del más bajo nivel. No solo son sistemas
complejos jerárquicos sino que los niveles de su jerarquía
representan los diferentes niveles de abstracción cada uno
construido sobre otro y cada uno comprensible por sí mismo.
En cada nivel de abstracción, encontramos una colección de
elementos que colaboran para proveer servicios a niveles
superiores
3. Software > 1. Naturaleza del Software 8
Índice

3.1.3. Atributos de Sistemas Complejos


 Elementos primitivos relativos. La elección de qué
componentes en un sistema son primitivos es relativamente
arbritraria y mayormente está a discrección del observador
del sistema
 Separación de asuntos. Las intra-conexiones de
componentes son más fuertes que las inter-conexiones de
componentes. Este hecho tiene el efecto de separar los
componentes con dinámica de alta frecuencia (involucrando
la interacción entre componentes) de los de dinámica de baja
frecuencia. En términos sencillos, hay una clara separación
de asuntos entre las partes de diferentes niveles de
abstracción
3. Software > 1. Naturaleza del Software 9
Índice

3.1.3. Atributos de Sistemas Complejos


 Patrones comunes. Los sistemas jerárquicos se componen
generalmente de sólo unos pocos tipos diferentes de
subsistemas en varias combinaciones y órdenes. Nos
encontramos con una gran similitud en la forma de
mecanismos compartidos unificando esta vasta jerarquía
 Formas intermedias estables. Un sistema complejo que
funciona invariablemente se encuentra que ha evolucionado
a partir de un sistema sencillo que funcionó. Un sistema
complejo diseñado desde cero no funciona y no puede ser
remendado para hacer que funcione. Usted tiene que
comenzar de nuevo, a partir de un sistema sencillo de trabajo
3. software 10
Índice

3.2. Fundamentos del Software


1. Introducción
2. Abstracción
3. Encapsulación
4. Modularidad
5. Jerarquía
6. Conclusión
3. Software > 2. Fundamentos del Software 11
Índice

3.2.1. Introducción
 “La observación general es que el principal enemigo de la fiabilidad, y tal
vez de la calidad del software en general, es la complejidad”. [Meyer]
 Ley de Conservación de la Complejidad dice que cada aplicación
tiene una cantidad de complejidad que no puede ser eliminada u
oculatada [Tesler, 87].
 Cuanto más complejo sea un sistema, más abierto está al colapso
total. Gran parte de la complejidad que se tiene que dominar es la
complejidad arbitraria. [Booch]
 Como afirma Descartes, "El descubrimiento de un orden no es tarea
fácil. . . . sin embargo, una vez que el orden ha sido descubierto no hay
dificultad alguna en reconocerlo".
 La historia del software disfruta de cuatro mecanismos que
facilitan enormemente nuestra comprensión de sistemas
complejos:
▫ Abstracción
▫ Encapsulación
▫ Modularidad
▫ Jerarquía
3. Software > 2. Fundamentos del Software 12
Índice

3.2.2. Abstracción
 Definiciones:
▫ La abstracción es "una descripción simplificada, o especificación, de un
sistema que hace hincapié en algunos de los detalles o propiedades mientras
que suprime otros del sistema. Una buena abstracción es la que hace hincapié
en los detalles que son importantes para el lector o usuario y suprime detalles
que son, al menos por ahora, de distracción“ [Shaw]
▫ La “abstracción surge de un reconocimiento de similitudes entre ciertos
objetos, situaciones o procesos en el mundo real, y la decisión de concentrarse
en estas similitudes e ignorar por el momento, las diferencias” [Dahl,
Dijkstra y Hoare]
▫ La abstracción es “proceso mental de extracción de las características
esenciales de algo, ignorando los detalles superfluos” [Booch]

Para hacer frente a la complejidad, nos abstraemos de ella!!!


3. Software > 2. Fundamentos del Software 13
Índice

3.2.2. Abstracción
 Implicaciones:
▫ Una abstracción denota las características esenciales de un objeto que lo
distinguen de todos los otros tipos de objetos y por lo tanto proporciona
límites conceptuales nítidamente definidos, en relación con la perspectiva
del espectador.
▫ Una abstracción se centra en la visión exterior de un objeto y sirve para
separar el comportamiento esencial de un objeto de su implantación
▫ La abstracción es eminentemente subjetiva, dependiendo del interés del
observador
▫ Nos esforzamos para construir abstracciones de las entidades porque son
directamente paralelos al vocabulario del dominio de un determinado
problema.
 Ejemplos:
▫ Mundo real: un autobús de un pasajero o un mecánico, un ordenador,, …
▫ Software orientado a procesos: factorial, mostrar menú, ordenar, …
▫ Software orientado a objetos: una fecha, un intervalo, un gestor de
comunicaciones, un colección de datos, …
3. Software > 2. Fundamentos del Software 14
Índice

3.2.3. Encapsulación
 Definiciones:
▫ “La encapsulación es proceso por el que se ocultan los detalles del soporte de
las características esenciales de una abstracción” [Booch]. Hacer notar que
en ninguno de los casos no se trata de ocultar la información en sí
misma sino de ocultar los detalles del soporte de dicha información.
▫ La encapsulación se logra con mayor frecuencia a través de
ocultación de información, que es el proceso de ocultar todos los
secretos de un objeto que no contribuyen a sus características
esenciales.
▫ La encapsulación proporciona barreras explícitas entre las diferentes
abstracciones y por lo tanto conduce a una clara separación de
asuntos. El beneficio inmediato será la posibilidad de cambiar los
soportes de las características de una abstracción sin afectar a todos
los elementos que dependan de esas características porque ni los
conocen, ni los mencionan.
▫ Principio de Encapsulación: todo aquello que no sea necesario dar a
conocer, no se debe dar a conocer
3. Software > 2. Fundamentos del Software 15
Índice

3.2.3. Encapsulación
 Implicaciones:
 Una vez realizada cierta abstracción hay que “trasladarlas” al
lenguaje de programación. Esto conlleva decidir entre diversas
estructuras de datos (estáticas o dinámicas, en memoria principal o
secundaria, etc.) y/o diversos algoritmos (¿con variables auxiliares o
no? ¿recursivo o iterativo?, etc.), siendo diversas las alternativas que
recogen dichas características esenciales. Una vez que se selecciona
una implantación, debe ser tratado como un secreto de la abstracción
y oculta a la mayoría de los clientes. En la práctica, esto significa que
cada clase debe tener dos partes:
• La interfaz de una clase capta sólo su vista exterior, que abarca
nuestra abstracción del comportamiento común a todas las
instancias de la clase. La interfaz de una clase es el único lugar
donde establecemos todas los suposiciones que un cliente puede
hacer sobre cualquier instancia de la clase
• La implementación de una clase comprende la representación de
la abstracción, así como los mecanismos para conseguir el
comportamiento deseado. La implementación encapsula detalles
sobre los qué ningún cliente puede hacer suposiciones.
3. Software > 2. Fundamentos del Software 16
Índice

3.2.3. Encapsulación
 Implicaciones:
 La abstracción de un objeto debe preceder a las decisiones acerca de
su implantación.
 Ninguna parte de un sistema complejo debe depender de los detalles
internos de cualquier otra parte. Mientras que la abstracción ayuda a
las personas a pensar en lo que están haciendo, la encapsulación
permite hacer cambios fiables en el programa con un esfuerzo
limitado.
 Ejemplos:
▫ Mundo real: un autobús, un ordenador, una universidad, …
▫ Software orientado a procesos: factorial, mostrar menú, ordenar, …
▫ Software orientado a objetos: una fecha, un intervalo, un gestor de
comunicaciones, un colección de datos, …
3. Software > 2. Fundamentos del Software 17
Índice

3.2.4. Modularidad
 Definiciones:
▫ “La modularidad es el proceso de descomposición de un sistema en un
conjunto de piezas poco acoplados y cohesivos” [Booch, 96]
• El acoplamiento “[...] es la medida de fuerza de la asociación establecida
por una conexión ente un módulo -elemento- y otro. El acoplamiento
fuerte complica un sistema porque los módulos son más difíciles de
comprender, cambiar o corregir por sí mismos si están muy
interrelacionados con otros módulos” [Booch, 96]. Por tanto, hay que
minimizar las dependencias entre módulos
• “La cohesión mide el grado de conectividad entre los elementos de un solo
módulo.” [Booch, 96] Por tanto, un módulo cohesivo debe tener
significado propio por sí mismo agrupando abstracciones
lógicamente relacionadas
3. Software > 2. Fundamentos del Software 18
Índice

3.2.4. Modularidad
 Implicaciones:
▫ La técnica de manejar la complejidad ha sido conocida desde la
antigüedad: divide et impera (divide y vencerás).
▫ Al diseñar un sistema de software complejo, es esencial para
descomponer en partes más pequeñas y más pequeñas, cada una de
las cuales podemos entonces refinar independientemente. De esta
manera, satisfacemos la restricción muy real que existe sobre la
capacidad del canal de la cognición humana: para entender cualquier
nivel dado de un sistema, sólo necesitamos comprender algunas
partes (en lugar de todas las partes) a la vez.
▫ Al dividir un programa crean una serie de límites documentados bien
definidos dentro del programa, los cuales son de gran valor en la
comprensión del programa
▫ “la descomposición inteligente se dirige directamente a la complejidad
inherente del software al obligar a una división del espacio de estados de un
sistema” [Parnas]
3. Software > 2. Fundamentos del Software 19
Índice

3.2.4. Modularidad
 Implicaciones:
▫ Debería ser posible cambiar la implementación de otros módulos sin
el conocimiento de la aplicación de otros módulos y sin afectar el
comportamiento de los otros módulos
▫ El bajo acoplamiento de un modulo se basa en la abstracción que
limita su interfaz a lo esencial y en la encapsulación que oculta todos
los detalles necesarios para su implantación pero innecesarios para
otros módulos que se relacionen con éste
 Ejempos:
▫ Mundo real: un autobús, un ordenador, una universidad, …
▫ Software orientado a procesos: factorial, mostrar menú, ordenar, …
▫ Software orientado a objetos: una fecha, un intervalo, un gestor de
comunicaciones, un colección de datos, …
3. Software > 2. Fundamentos del Software 20
Índice

3.2.5. Jerarquía
 Definiciones:
▫ “Jerarquía es una clasificación u ordenamiento de las abstracciones ”
[Booch]
▫ La jerarquización es el proceso de estructuración por el que se
produce una organización de un conjunto de elementos en grados o
niveles de responsabilidad, de clasificación o de composición, …
entre otros

Univesidad Profesores

Facultades Rectorado Titulares Asociados

Departamentos Dirección Interinos Funcionarios


3. Software > 2. Fundamentos del Software 21
Índice

3.2.5. Jerarquía
 Implicaciónes:
▫ La abstracción es una buena cosa pero en todos los casos, excepto las
aplicaciones más triviales, podemos encontrar muchas más
abstracciones diferentes de lo que podemos comprender a la vez. La
encapsulación ayuda a gestionar esta complejidad al ocultar el
interior de la vista de nuestras abstracciones. La modularidad ayuda
también, por que nos da una manera de agrupar abstracciones
relacionados lógicamente. Aún así, esto no es suficiente. Un conjunto
de abstracciones a menudo forma una jerarquía, y mediante la
identificación de estas jerarquías en nuestro diseño se simplifica
enormemente nuestra comprensión del problema.
▫ La identificación de las jerarquías dentro de un sistema de software
complejo a menudo no es fácil. Una vez que se exponen esas
jerarquías, la estructura de un sistema complejo se vuelve muy simple
y obtenemos la comprensión de la misma.
3. Software > 2. Fundamentos del Software 22
Índice

3.2.5. Jerarquía
 Implicaciónes:
▫ Si no revelamos la estructura de clases de un sistema, tendríamos que
multiplicar nuestro conocimiento sobre las propiedades de cada parte
individual. Con la inclusión de la estructura de clases, captamos estas
propiedades comunes en un solo lugar.
▫ La estructura de clases y la estructura de objetos no son
completamente independientes; más bien, cada objeto en la
estructura de objetos representa una instancia específica de una clase.
Por lo general hay muchos más objetos que clases de objetos dentro
de un sistema complejo. Al mostrar la "parte de", así como la
jerarquía "es un", exponemos de forma explícita la redundancia del
sistema considerado.
▫ Existen dos jerarquías ortogonales del sistema: la estructura de clases
y la estructura de objetos. Cada jerarquía está en capas, con clases
más abstractas y objetos construidos sobre otros más primitivos. La
clase u objeto que se elija como primitivo está en relación con el
problema en cuestión. Mirando dentro de cualquier nivel dado revela
otro nivel de complejidad. Especialmente entre las partes de la
estructura del objeto, existe una estrecha colaboración entre los
objetos de ese mismo nivel de abstracción.
3. Software > 2. Fundamentos del Software 23
Índice

3.2.5. Jerarquía
 Implicaciónes:
▫ La mayoría de los sistemas interesantes no incorporan una única
jerarquía; en cambio, nos encontramos con que muchas jerarquías
diferentes suelen estar presentes dentro del mismo sistema complejo.
En nuestra experiencia, hemos encontrado que es esencial para ver un
sistema desde ambas perspectivas, estudiando su jerarquía "es un"
(clasificación), así como su jerarquía "parte de“ (composición)
▫ “Nuestra experiencia es que los sistemas de software complejos más exitosos
son aquellos cuyos diseños incluyen explícitamente las estructuras de clases
y objetos bien diseñadas y encarnan los cinco atributos de sistemas complejos
descritos en la sección anterior. […] Muy raramente nos encontramos con
sistemas de software que se entregan a tiempo, que están dentro del
presupuesto y que cumplen con sus requisitos, a menos que estén diseñados
con estos factores en mente” [Booch]
3. Software > 2. Fundamentos del Software 24
Índice

3.2.6. Conclusión
 Software es un conjunto de clases/módulos relacionándose
por herencia, composición, … o interdependientes formando
una aplicación. Cada aplicación está delimitada por su
entorno tecnologíco-comercial, descrito por su arquitectura
del software y requisitos y expresado en su ejecución
 Software de una aplicación media (~100.000 líneas de
código) tiene una complejida excede la capacidad intelectual
humana
 Software es un sistema complejo con:
▫ Estructura jerárquica gracias a sus jerarquías de herencia,
composición, …
▫ Elementos primitivos relativos gracias a sus tipos primitivos
dependiendo del lenguaje (enteros, cadena de caracteres?, fechas?, …)
y los definidos por el usuario
▫ Separación de asuntos gracias a la encapsulación y modularidad
▫ Patrones comunes gracias al paso de mensajes con argumentos
▫ Formas intermedias estables gracias a las metodologías iterativas
3. Software 25
Índice

3.3. Economía del Software


1. Introducción
2. Variable Ámbito
3. Variable Tiempo
4. Variable Coste
5. Variable Calidad
6. Variables correlacionadas
3. Software > 3. Economía del Software 26
Índice

3.3.1. Introducción
 Cuatro variables: Ámbito
▫ Coste,
▫ Tiempo
▫ Ámbito (funcionalidad/
requisitos) y
Calidad
▫ Calidad Coste Tiempo

 No hay una relación sencilla entre las cuatro variables. Por


ejemplo, no puedes obtener software más rápido, gastando
más dinero:
“nueve mujeres no pueden tener un bebé en un mes”
“dieciocho mujeres aún no pueden tener un bebé en un mes”
[Brooks]
3. Software > 3. Economía del Software 27
Índice

3.3.2. Variable Ámbito


 Es la más importante a tener en cuenta
 Menos ámbito hace posible entregar mejor calidad (mientras
el problema del cliente esté todavía resuelto). También
permite entregar más rápido y barato.
3. Software > 3. Economía del Software 28
Índice

3.3.2. Variable Ámbito


 Una de las principales cuestiones acerca del ámbito es que es
una variable que varía mucho.
▫ Los requisitos nunca están claros al principio. Los clientes no pueden
decirnos exactamente lo que ellos quieren. El desarrollo de una pieza
de software cambia sus propios requisitos. Tan pronto como el cliente
ve la primera versión, ellos aprenden lo que quieren para la segunda
versión … o lo que realmente querían en la primera. Y esto es un
aprendizaje valioso, porque no hay posibilidades de especulación.
Este aprendizaje solamente puede venir de la experiencia. Pero los
clientes no pueden estar solos. Ellos necesitan gente que pueda
programar, no como guías, sino como compañeros.
▫ Los programadores y el personal del negocio no tienen más que una
idea vaga sobre lo que tiene valor en el software que se está
desarrollando. Una de las decisiones más importantes en la gestión
del proyecto es la eliminación del ámbito. Si se gestiona activamente
el ámbito, se puede proporcionar a los directores de proyecto y
clientes control sobre el coste, calidad y tiempo.
3. Software > 3. Economía del Software 29
Índice

3.3.2. Variable Ámbito


 Si el tiempo está limitado a la fecha de lanzamiento de
una versión, hay siempre algo que podemos diferir a la
siguiente versión.
▫ No intentando hacer demasiado, mantenemos nuestra capacidad de
producir la calidad requerida en un tiempo determinado.
▫ Si dejas fuera importante funcionalidad al final de cada ciclo de
versión, el cliente quedará disgustado. Para evitar esto, se utilizan
dos estrategias:
• Consigue mucha práctica haciendo estimaciones y realimentando
los resultados reales. Mejores estimaciones reducen la
probabilidad de que tengas que dejar fuera funcionalidad
• Implementa en primer lugar los requisitos más importantes del
cliente, de tal manera que si se deja después alguna
funcionalidad, es menos importante que la funcionalidad que ya
está incorporada al sistema
3. Software > 3. Economía del Software 30
Índice

3.3.3. Variable Tiempo


 Las restricciones de controlar proyectos controlando el
tiempo, generalmente vienen de fuera, de las manos del
cliente
 Disponer de más tiempo para la entrega puede mejorar
la calidad e incrementar el ámbito.
▫ Ya que la realimentación desde los sistema en producción es de
mayor calidad que cualquier otra clase de realimentación, dar a un
proyecto demasiado tiempo será perjudicial.
 Si damos a un proyecto poco tiempo, la calidad sufre,
con el ámbito.
▫ “Si la mayoría de los proyectos de tu organización son obsesivamente cortos,
proyectos conducidos por el calendario, hay algo muy, muy malo. Cambios
radicales en la organización del proceso de desarrollo software son necesarios,
antes de que la compañía o su gente se arruine” [Booch, Object Solutions]
3. Software > 3. Economía del Software 31
Índice

3.3.4. Variable Coste


 Mucho dinero puede engrasar la maquinaria un poco, pero
demasiado dinero pronto crea más problemas que resuelve.
Mayores costes a menudo alimentan objetivos tangenciales,
como estatus o prestigio (“tengo un proyecto de 150
personas – respira profundamente”)
 Por otra parte, si damos a un proyecto muy poco dinero, no
seremos capaces de resolver el problema del negocio del
cliente
 Dentro del rango de inversión que pueda sensatamente
hacerse, gastando más dinero puedes aumentar el ámbito, o
puedes intentar de forma más deliberada aumentar la
calidad, o puedes (hasta cierto punto) reducir el tiempo de
salida al mercado. También puede reducir las desavenencias:
máquinas más rápidas, más especialistas técnicos, mejores
oficinas.
3. Software > 3. Economía del Software 32
Índice

3.3.4. Variable Coste


 No puedes gastar solo en calidad o ámbito. De hecho, al
comienzo de un proyecto, no puedes gastar mucho. La
inversión tiene que comenzar siendo pequeña y crecer con el
tiempo. Después de un tiempo, se puede de forma
productiva gastar más y más dinero.
 Todas las restricciones sobre el coste pueden volver locos a
los directores de proyecto. Especialmente si están sujetos a
un proceso de presupuesto anual, ellos están tan
acostumbrados a considerarlo todo desde la perspectiva del
coste y cometerán grandes errores al ignorar las restricciones
sobre cuánto control te proporciona el coste
3. Software > 3. Economía del Software 33
Índice

3.3.5. Variable Calidad


 Hay una extraña relación entre la calidad interna (que miden
los programadores) y externa (que mide el cliente). Sacrificar
temporalmente la calidad interna para reducir el tiempo de
salida al mercado del producto, con la esperanza que la
calidad externa no se vea muy dañada es tentador a corto
plazo. Y puedes con frecuencia hacerlo impunemente
generando una confusión en cuestión de semanas o meses.
Al fin y al cabo, los problemas de calidad interna te alcanzan
a ti y hacen que tu software sea prohibitivamente caro de
mantener.
 A menudo, al insistir en la mejora de la calidad puedes hacer
que el proyecto esté listo en menos tiempo, o puedes
conseguir hacer más en un una cantidad de tiempo dada. Se
trabaja mejor si no se desmoraliza al producir software
basura.
3. Software > 3. Economía del Software 34
Índice

3.3.6. Variables correlacionadas


“La forma de hacer en este modelo del juego del desarrollo del
software es que las fuerzas externas (clientes, directores de
proyecto) eligen los valores de tres variables cualquiera. El equipo
de desarrollo determina el valor resultante de la cuarta variable

Algunos directores de proyecto y clientes creen que pueden


escoger el valor de las cuatro variables. Cuando esto suceda, la
calidad siempre desaparecerá, ya que nadie hace bien el trabajo
cuando está sujeto a una fuerte presión. También, probablemente,
el tiempo estará fuera de control”

[Beck, 1999]
3. Software 35
Índice

3.4. Crisis del Software


1. Justificación de la Crisis del Software
2. Estadísticas de Proyectos
3. Causas de la Crisis del Software
3. Software > 4. Crisis del Software 36
Índice

3.4.1. Justificación de la Crisis del Software


 Nuestra incapacidad para dominar la complejidad
desprende los resultados de los proyectos software que
llegan tarde, por encima del presupuesto y deficientes en los
requisitos establecidos.
 “La complejidad del software es una propiedad esencial, no
un accidente. Por esencial queremos decir que podemos dominar
esta complejidad, pero nunca podemos hacer que se vaya. [...] A
menudo llamamos esta condición la crisis del software, pero,
francamente, una enfermedad que se ha llevado a los largo de este
tiempo debe ser llamado normalidad". [Brooks]
3. Software > 4. Crisis del Software 37
Índice

3.4.2. Estadísticas de Proyectos


 Estadísticas de Standish Group sobre 50.000 proyectos:

Incluyendo accidentes que conllevaron a la muerte de tres personas en la máquina de


radioterapia Therac-25 que emitió una sobredosis masiva de radiación u otros con
pérdidas multimillonarias
3. Software > 4. Crisis del Software 38
Índice

3.4.3. Causas de la Crisis del Software


 Estadísticas de Standish Group sobre 50.000 proyectos:
1. Falta del involucración del usuario 12.8%
2. Requerimientos y especificaciones poco claras 12.3%
3. Cambio de requerimientos y especificaciones 11.8%
4. Poco apoyo de las gerencias involucradas 7.5%
5. Tecnología deficiente 7.0%
6. Falta de recursos 6.4%
7. Expectativas poco realistas 5.9%
8. Objetivos poco claros 5.3%
9. Tiempos poco realistas 4.3%
10. Nuevas tecnologías 3.7%
11. Otros 23.0%
3. Software 39
Índice

3.5. Complejidad del Software


1. La complejidad del dominio
del problema
2. Las limitaciones de la
capacidad humana
3. La posible flexibilidad a
través del software
4. El comportamiento de los
sistemas discretos
5. La dificultad de gestionar el
proceso de desarrollo
3. Software > 5. Complejidad del Software 40
Índice

3.5.1. La complejidad del dominio del problema


 Los problemas que tratamos de resolver en el software a
menudo implican elementos de complejidad ineludible, en
las que encontramos una gran variedad requisitos que
compiten, incluso contradictorios. Una complicación
adicional es que los requisitos de un sistema de software a
menudo cambian durante su desarrollo:

Ley del Cambio Continuo:


Un programa que se usa en un ámbito del mundo real, necesariamente debe cambiar
o convertirse cada vez en menos útil
Ley de la Complejidad Creciente:
Debido a que los programas cambian por evolución, su estructura se convierte en
más compleja a menos que se hagan esfuerzos activos para evitar este fenómeno
[Lehman y Belady]
3. Software > 5. Complejidad del Software 41
Índice

3.5.2. Las limitaciones de la capacidad humana


 Experimentos realizados por los psicólogos, tales como las
de Miller, sugieren que el número máximo de piezas de
información que un individuo puede comprender al mismo
tiempo es del orden de siete, más o menos dos. Esta
capacidad de canal parece estar relacionada con la capacidad
de la memoria a corto plazo.
 Simon, además, señala que la velocidad de procesamiento es
un factor limitante: la mente toma unos cinco segundos para
aceptar una nueva pieza de información.
3. Software > 5. Complejidad del Software 42
Índice

3.5.3. La posible flexibilidad a través del software


 Mientras que la industria de la construcción tiene códigos y
estándares para la calidad de las materias primas de
construcción uniforme, existen pocos de esos estándares en
la industria del software. Como resultado, el desarrollo de
software sigue siendo una empresa de trabajo intensivo.
3. Software > 5. Complejidad del Software 43
Índice

3.5.4. El comportamiento de los sistemas discretos


 Dentro de una aplicación grande, puede haber cientos o
incluso miles de variables, así como más de un hilo de
control. Toda la colección de estas variables, sus valores
actuales y su dirección actual y la pila de llamadas de cada
proceso dentro del sistema constituyen el estado actual de la
aplicación.
 Por desgracia, es absolutamente imposible para una sola
persona realizar un seguimiento de todos estos detalles a la
vez.
 Este es el problema de la caracterización del
comportamiento de los sistemas discretos
3. Software > 5. Complejidad del Software 44
Índice

3.5.5. La dificultad de gestionar el proceso de desarrollo


 La gran cantidad de requisitos de un sistema a veces es
inevitable y nos obliga a escribir una gran cantidad de
software nuevo o volver a utilizar el software existente en
formas novedosas.
▫ Hace tan sólo unas décadas, los programas en lenguaje ensamblador
de sólo unos pocos miles de líneas de código subrayaron los límites
de nuestras capacidades de ingeniería de software.
▫ Hoy en día, no es raro encontrar sistemas entregados cuyo tamaño se
mide en cientos de miles o incluso millones de líneas de código (y
todo eso en un lenguaje de programación de alto nivel).
3. Software 45
Índice

3.6. Disciplinas del Software


1. Introducción
2. Disciplina de Requisitos
3. Disciplina de Análisis
4. Disciplina de Diseño
5. Disciplina de Programación
6. Disciplina de Pruebas
7. Ecosistema de Desarrollo
8. Conclusiones
3. Software > 6. Disciplinas del Software 46
Índice

3.6.1. Introducción
 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]

El software es sagrado
[Booch]
[… y requiere de un ritual]
3. Software > 6. Disciplinas del Software 47
Índice

3.6.2. Disciplina de Requisitos


 La disciplina de requisitos es el flujo de trabajo,
incluyendo actividades, trabajadores y documentos,
cuyo propósito principal es dirigir el desarrollo hacia el
sistema correcto al describir los requisitos del sistema
así que pueda alcanzarse un acuerdo entre los clientes,
usuarios y desarrolladores sobre lo que el sistema
debería hacer:
▫ Establecer y mantener el acuerdo entre los clientes y otros
interesados (stakecholders – gerencia, marketing, usuarios, …)
sobre lo que el sistema debería hacer
▫ Proveer a los desarrolladores del sistema con una mejor
comprensión de los requisitos del sistema
▫ Definir los límites del sistema
▫ Proveer las bases para planificar los aspectos técnicos del
desarrollo
▫ Proveer las bases para estimar los costes y tiempos para
desarrollar el sistema
3. Software > 6. Disciplinas del Software 48
Índice

3.6.3. Disciplina de Análisis


 La disciplina de análisis es el flujo de trabajo, incluyendo
trabajadores, actividades y documentos, cuyo principal
objetivo es analizar los requisitos a través de su
refinamiento y estructura para realizar una compresión
más precisa de los requisitos, una descripción de los
requisitos que es fácil de mantener y ayuda a estructurar el
sistema:
▫ Dar una especificación más precisa de los requisitos obtenidos en la
captura de requisitos
▫ Describir usando el lenguaje de los desarrolladores y poder
introducir más formalismo y ser utilizado para razonar sobre el
funcionamiento interno del sistema
▫ Estructurar los requisitos de manera que facilite su comprensión,
cambiándolos y, en general, mantenerlos
▫ Acercase al diseño, aunque sea un modelo en sí mismo, y es por tanto
un elemento esencial cuando el sistema está conformado en diseño e
implementación
3. Software > 6. Disciplinas del Software 49
Índice

3.6.3. Disciplina de Análisis


 Comparativa entre requisitos y análisis:
 Requisitos:  Análisis:
▫ Descrito usando el ▫ Descrito usando el lenguaje
lenguaje del cliente de los desarrolladores
▫ Visión externa del sistema ▫ Visión interna del sistema
▫ Estructurado por ▫ Estructurado por clases
requisitos, da estructura a estereotipadas y paquetes,
la vista externa da estructura a la vista
▫ Usado principalmente interna
como contrato entre los ▫ Usado principalmente por
clientes y los desarrolladores para
desarrolladores sobre lo comprender qué forma
que el sistema debería debería tener el sistema (p.ej.
hacer diseño e implementación)
3. Software > 6. Disciplinas del Software 50
Índice

3.6.3. Disciplina de Análisis


 Comparativa entre requisitos y análisis:
 Requisitos:  Análisis:
▫ Contiene muchas ▫ No debería contener
redundancia, redundancias,
inconsistencias, .. entre inconsistencias, … entre los
los requisitos requisitos
▫ Captura la funcionalidad ▫ Esboza cómo realizar la
del sistema, incluyendo funcionalidad en el sistema,
funcionalidad incluyendo la
arquitectónica funcionalidad
significativa arquitectónica significativa;
funciona como un primer
corte del diseño
3. Software > 6. Disciplinas del Software 51
Índice

3.6.4. Disciplina de Diseño


 La disciplina de diseño es el flujo de trabajo, incluyendo
actividades, trabajadores y documentos, cuyo principal
propósito es desarrollar enfocados en los requisitos no
funcionales y en el dominio de la solución para preparar
para la implementación y pruebas del sistema:
▫ Adquirir una comprensión profunda sobre los aspectos de los
requisitos no funcionales y limitaciones relacionadas con:
• los lenguajes de programación,
• la reutilización de componentes,
• sistemas operativos,
• tecnologías de distribución y concurrencia,
• tecnologías de bases de datos,
• tecnologías de interfaz de usuario,
• tecnologías de gestión de transacciones,
• y así sucesivamente
3. Software > 6. Disciplinas del Software 52
Índice

3.6.4. Disciplina de Diseño


▫ Crear una entrada apropiada como punto de partida para las
disciplinas posteriores mediante la captura de los requisitos
correspondientes a los distintos subsistemas, interfaces y clases
▫ Capacitar para la descomposición del trabajo de implementación en
piezas más manejables gestionados por diferentes equipos de
desarrollo, posiblemente al mismo tiempo
▫ Captura las interfaces principales entre los subsistemas del ciclo de
vida del software. Esto es útil cuando razonamos sobre la
arquitectura y cuando usamos las interfaces como instrumentos de
sincronización entre los diferentes equipos de desarrollo
▫ Capacitar para visualizar y razonar sobre el diseño utilizando una
notación común
▫ Crear una abstracción sin fisuras de la implementación del sistema,
en el sentido de que la aplicación es un refinamiento sencillo del
diseño mediante la cumplimentación de la "carne", pero sin cambiar
la estructura. Esto permite el uso de técnicas como la generación de
código e ingeniería directa e inversa entre el diseño y la
implementación
3. Software > 6. Disciplinas del Software 53
Índice

3.6.4. Disciplina de Diseño


 Comparativa entre análisis y diseño:
 Análisis:  Diseño:
▫ Modelo conceptual ▫ Modelo físico porque es un
porque es una abstracción esbozo de la
del sistema y evita implementación
cuestiones de ▫ Más formal
implementación ▫ No es genérico sino
▫ Menos formal específico para una
▫ Diseño genérico, aplicable implementación
a varios diseños concretos ▫ Cualquier número de
▫ Tres estereotipos estereotipos físicos en las
conceptuales en las clases: clases, dependiendo del
modelo, vista, controlador lenguaje de
implementación
3. Software > 6. Disciplinas del Software 54
Índice

3.6.4. Disciplina de Diseño


 Comparativa entre análisis y diseño:
 Análisis:  Diseño:
▫ Menos costoso para el ▫ Más costoso para el
desarrollo (1:5 frente al desarrollo (5:1 frente al
diseño) análisis)
▫ Pocas capas arquitectónicas ▫ Muchas capas
▫ Puede no ser mantenido a arquitectónicas
través de todo el ciclo de ▫ Debería ser mantenido a
vida del software través de todo el ciclo de
▫ Principalmente creado en vida del software
trabajo de campo, talleres y ▫ Principalmente creado por
similares “programación visual”
(ingeniería directa e
inversa)
3. Software > 6. Disciplinas del Software 55
Índice

3.6.4. Disciplina de Diseño


 Comparativa entre análisis y diseño:
 Análisis:  Diseño:
▫ Define la estructura que ▫ Dar forma al sistema
es la entrada esencial mientras intenta preservar
para dar forma al la estructura definida por el
sistema, incluyendo la modelo de análisis
creación del modelo de ▫ Enfatiza en la solución
diseño conceptual que cubra los
▫ Enfatiza la investigación requisitos más que en su
del problema y sus implementación
requisitos ▫ Hazlo correctamente
▫ Haz lo correcto
3. Software > 6. Disciplinas del Software 56
Índice

3.6.5. Disciplina de Programación


 La disciplina de implementación es el flujo de trabajo,
incluyendo actividades, trabajadores y documentación, cuyo
principal propósito es implementar el sistema en términos
de componentes, p.ej. código, scripts, ficheros binarios,
código ejecutables:
 Definir la organización del código en términos de subsistemas de
implementación organizados en capas
 Implementar las clases y objetos en términos de componentes
 Probar el desarrollo de componentes como unidades
 Integrar en un sistema ejecutable el resultado producido por
implementadores individuales o equipos
3. Software > 6. Disciplinas del Software 57
Índice

3.6.6. Disciplina de Pruebas


 La disciplina de pruebas es el flujo de trabajo, incluyendo
actividades, trabajadores y documentación, cuyo principal
propósito es comprobar el resultado de la implementación
al probar cada versión, incluyendo internas e intermedias,
y versiones finales del sistema a entregar:
 Encontrar y documentar fallos en el producto software: defectos,
problemas, …
 Avisar a la gestión sobre la calidad del software percibida
 Evaluar las asunciones hechas en el diseño y especificación de
requisitos a través de demostraciones concretas
 Validar que el software trabaja como fue diseñado
 Validar que los requisitos son implementados apropiadamente
3. Software > 6. Disciplinas del Software 58
Índice

3.6.7. Ecosistema de Desarrollo


 La complejidad del software justifica la necesidad de
herramientas que aceleren su producción, controlen su
calidad y monitoricen su gestión a lo largo de todas las
disciplinas de la ingeniería del software
 El ecosistema es un conjunto de servicios integrados
orientados al desarrollo de software y su objetivo es mejorar
la coordinación y el trabajo realizado por el equipo de
desarrollo.
 Para la disciplina de requisitos se requiere un entorno colaborativo
con editores, historial, autoría, respaldos, … donde los
especificadores de requisitos (casos de uso / historias de usuario)
puedan escribir y el resto del equipo de desarrollo
(analistas/diseñadores, programadores, probadores y desplegadores)
puedan leer dichos requisitos centralizados: Wiki de GitHub
3. Software > 6. Disciplinas del Software 59
Índice

3.6.7. Ecosistema de Desarrollo


 Para la disciplina de análisis y diseño se requiere de una herramienta
CASE (Computer Aided Software Engineering) que facilite la edición de
diagramas de análisis y diseño (diagramas de casos de uso, clases,
objetos, paquetes, secuencia, colaboración, estados y actividades,
implementación y despliegue) junto con su trazabilidad: MagicDraw
 Para la disciplina de análisis y diseño se requiere de una herramienta
de métricas del software que determine automáticamente el grado de
bondad de los componentes de la arquitectura del software:
SonarQube
 Para la disciplina de programación se requiere un entorno de
desarrollo integrado para la edición, compilación, ejecución, … del
código en desarrollo en la máquina local: Eclipse
 Para la disciplina de programación se requiere ayudas para el
cumplimiento de las reglas de estilo (formato, identificadores, …)
dadas en la arquitectura del software: Eclipse, Checkstyle, PMD,
FindBugs y Sonarqube
3. Software > 6. Disciplinas del Software 60
Índice

3.6.7. Ecosistema de Desarrollo


 Para la disciplina de programación se requiere, en el contexto de
metodologías ágiles, ayudas para automatizar en lo posible la
refactorización del código (renombrado de identificadores, nombrar
constantes, mover métodos, …): Eclipse
 Para la disciplina de programación se requiere un sistema de registro
para gestionar (escritura, destino, avisos, …) los mensajes de trazas,
depuración, errores, …) durante la ejecución: Log4j
 Para la disciplina de programación se requiere de un sistema de
control de versiones del repositorio de código común del proyecto
para facilitar la gestión (actualizaciones, vuelta atrás, mezclas, …) de
la rama de desarrollo, la rama de entregas, la rama de producción:
GitHub
 Para la disciplina de pruebas se requiere un sistema para la gestión
de pruebas que facilite la edición, ejecución, evaluación, … de la
pruebas: Junit, Selenium, …
3. Software > 6. Disciplinas del Software 61
Índice

3.6.7. Ecosistema de Desarrollo


 Para la disciplina de pruebas se requiere de un sistema de
integración continua para comprobar que el código y las pruebas
funcionan tras cualquier cambio: Travis
 Para la disciplina de pruebas se requiere un sistema de cobertura de
pruebas que facilite la misión y estrategias de pruebas: SonarQube
 Para la disciplina de despliegue se requiere un gestor de proyectos
para la automatización, en lo posible, de la construcción de
entregables (compilación, pruebas, reglas de estilo, empaquetado,
…): Maven
 Para la disciplina de gestión de proyectos se requiere una
herramienta para gestión de tickets que permitan la asignación de
tareas con su tiempo estimado y real, finalización por parte del
asignado y cierre tras la comprobación por el emisor de la tarea:
Tickets de GitHub
3. Software > 6. Disciplinas del Software 62
Índice

3.6.8. Conclusiones
 Problemas por la Complejidad  Soluciones de la
del Software: Ingeniería del Software:
La complejidad del dominio del
Requisitos
problema
Las limitaciones de la capacidad
humana para el tratamiento de la Análisis y Diseño
complejidad

La posible flexibilidad a través del Calidad y Reusabilidad: Métricas,


software Patrones, Antipatrones, Estilos de
Arquitectura, Frameworks, …
Los problemas de la caracterización del
comportamiento de los sistemas Pruebas Automáticas e Integración
discretos Continua

La dificultad de gestionar el proceso de Metodologías iterativas pesadas vs


desarrollo ligeras
3. Software 63
Índice

3.7. Calidad del Software


1. Calidad del Software
2. Calidad del Software de Bajo Nivel
3. Calidad del Software de Medio Nivel
4. Calidad del Software de Alto Nivel
5. Métricas de Calidad del Software
6. Reusabilidad del Software
7. Conclusiones
3. Software > 7. Calidad del Software 64
Índice

3.7.1. Calidad del Software


 Factores de la Calidad del Software:
▫ Corrección: ¿Hace lo que se le pide?
▫ Fiabilidad: ¿Lo hace de forma fiable todo el tiempo?
▫ Eficiencia: ¿Qué recursos hardware y software necesito?
▫ Integridad: ¿Puedo controlar su uso?
▫ Usabilidad: ¿Es fácil y cómodo de manejar?
▫ Facilidad de mantenimiento: ¿Puedo localizar los fallos?
▫ Flexibilidad: ¿Puedo añadir nuevas opciones?
▫ Facilidad de prueba: ¿Puedo probar todas las opciones?
▫ Portabilidad: ¿Podré usarlo en otra máquina?
▫ Reusabilidad: ¿Podré utilizar alguna parte del software en otra
aplicación?
▫ Inter-operatividad: ¿Podrá comunicarse con otras aplicaciones o
sistemas informáticos?
… todos, en mayor o menor medida, dependen del diseño
3. Software > 7. Calidad del Software 65
Índice

3.7.1. Calidad del Software


 “El diseño de software orientado a objetos es difícil, y el diseño de
software orientado a objetos reutilizable es aún más difícil. […] Su
diseño debe ser específico para el problema en cuestión, pero
también suficiente para abordar los problemas y las necesidades
futuras en general. También quiere evitar rediseñar, o al menos
minimizarlo” [Gamma et al]
 Aspectos a tener en cuenta:
▫ Determinar objetos y clases con responsabilidades correctas
▫ Determinar el interfaz correcto de cada clase
▫ Determinar la granularidad de métodos, clases y paquetes
▫ Determinar las jerarquías de herencia
▫ Determinar las dependencias entre las clases y paquetes
3. Software > 7. Calidad del Software 66
Índice

3.7.1. Calidad del Software


 Signos de un Mal
Diseño:
▫ Rigidez vs Flexibilidad,
para la adaptación al
cambio
▫ Fragilidad vs Robustez,
sin propagación de
errores
▫ Viscosidad vs Claridad,
para la legibilidad
▫ Inmovilidad vs
Movilidad, para la
reusabilidad
3. Software > 7. Calidad del Software 67
Índice

3.7.1. Calidad del Software


 Signos de un Mal Diseño:
▫ Rigidez es la tendencia del software que es difícil de cambiar, incluso
en formas simples. Cada cambio provoca una cascada de cambios
posteriores en los módulos dependientes. Lo que comienza como un
simple cambio de dos días a un módulo se convierte en un maratón
de varias semanas de cambios en el módulo después de otros
módulos según los ingenieros persiguen el hilo del cambio a través
de la aplicación.
▫ Cuando el software se comporta de esta manera, los gerentes temen
que permitirá a los ingenieros no solucionar problemas críticos. Esta
resistencia se deriva del hecho de que ellos no saben, con
confiabilidad, cuando terminarán. Si los gerentes insisten, los
ingenieros se perderán en este tipo de problemas, que pueden
desaparecer durante largos periodos de tiempo.
▫ Cuando los miedos del gerente son tan agudos que se niegan a
permitir cambios en el software, la rigidez oficial se instala. Por lo
tanto, lo que comienza como una deficiencia de diseño, termina
siendo una política de gestión adversa.
3. Software > 7. Calidad del Software 68
Índice

3.7.1. Calidad del Software


 Signos de un Mal Diseño:
▫ Fragilidad. En estrecha relación con la rigidez está la fragilidad.
Fragilidad es la tendencia del software para estropearse en muchos
lugares cada vez que se cambia. A menudo, el error se produce en
las zonas que no tienen ninguna relación conceptual con el área que
se ha cambiado..
▫ Según empeora la fragilidad, la probabilidad de error aumenta con el
tiempo, asintóticamente acercándose 1. Este tipo de software es
imposible de mantener. Cada solución hace que sea peor, la
introducción de más problemas que soluciones.
▫ Tales errores llenan las sensaciones de los gerentes de malos
presagios. Cada vez que autorizan una solución, temen que el
software va a estropearse de alguna manera inesperada. Este tipo de
software hace que los gerentes y los clientes sospechen que los
desarrolladores han perdido el control de su software. La
desconfianza reina, y la credibilidad se pierde.
3. Software > 7. Calidad del Software 69
Índice

3.7.1. Calidad del Software


 Signos de un Mal Diseño:
▫ Viscosidad viene en dos formas: viscosidad del diseño, y la
viscosidad del entorno.
▫ La viscosidad del diseño se produce cuando nos enfrentamos a un
cambio, los ingenieros suelen encontrar más de una manera de hacer
el cambio. Algunas de las formas conservan el diseño, otros no lo
hacen, es decir, son atajos. Cuando preservar el diseño es más difícil
que emplear los atajos, a continuación, la viscosidad del diseño es
alta. Es fácil de hacer las cosas mal, pero difícil de hacer lo correcto.
▫ La viscosidad del entorno se produce cuando el entorno de
desarrollo es lento e ineficiente. Por ejemplo, si los tiempos de
compilación son muy largos, los ingenieros tendrán la tentación de
hacer cambios que no obligan a grandes re-compilaciones, a pesar
de que esos cambios no son óptimos desde el punto de vista del
diseño. Si el sistema de control de código fuente requiere horas para
comprobar tan sólo unos pocos archivos, consecuentemente, los
ingenieros tendrán la tentación de hacer cambios que requieren el
menor número de subidas (commits) como sea posible,
independientemente de si el diseño se conserva.
3. Software > 7. Calidad del Software 70
Índice

3.7.1. Calidad del Software


 Signos de un Mal Diseño:
▫ La inmovilidad es la imposibilidad de volver a utilizar el software
de otros proyectos o de partes del mismo proyecto.
▫ A menudo sucede que un ingeniero descubrirá que necesita un
módulo que es similar a uno que escribió otro ingeniero. Sin
embargo, también sucede a menudo que el módulo en cuestión tiene
demasiado equipaje del que depende.
▫ Después de mucho trabajo, los ingenieros descubren que el trabajo y
el riesgo requerido para separar las partes deseables del software de
las partes no deseadas son demasiado grandes como para tolerarlo. Y
así, el software es simplemente reescrito en lugar de reutilizado.
3. Software > 7. Calidad del Software 71
Índice

3.7.1. Calidad del Software


 Causas de un mal
diseño:
▫ Cambio de los requisitos
▫ Mala Gestión de
Dependencias
3. Software > 7. Calidad del Software 72
Índice

3.7.1. Calidad del Software


 Causas de un Mal Diseño:
▫ Cambio de los requisitos (Ley del Cambio Continuo [Lehman y
Belady]):
• Los requisitos han ido cambiando de forma que el diseño inicial
no anticipó. A menudo, estos cambios deben hacerse
rápidamente, y pueden ser hechos por los ingenieros que no están
familiarizados con la filosofía de diseño original. Así que, aunque
el cambio en el diseño funciona, viola de alguna manera el diseño
original. Poco a poco, a medida que los cambios siguen llegando,
estas violaciones se acumulan hasta que la podredumbre se
asienta. Ley de Complejidad Creciente [Lehman y Belady]
3. Software > 7. Calidad del Software 73
Índice

3.7.1. Calidad del Software


 Causas de un Mal Diseño:
▫ Cambio de los requisitos (Ley del Cambio Continuo [Lehman y
Belady]):
• Sin embargo, no podemos culpar a la deriva de los requisitos por
la degradación del diseño. Nosotros, como ingenieros de
software, sabemos muy bien que las necesidades cambian. De
hecho, la mayoría de nosotros nos damos cuenta de que el
documento de requisitos es el documento más volátil en el
proyecto. Si nuestros diseños están fallando debido a la lluvia
constante de cambios en los requisitos, son nuestros diseños los
que están fallando. Tenemos que encontrar alguna manera una
manera de hacer nuestros diseños resistentes a tales cambios y
protegerlos de la descomposición.
3. Software > 7. Calidad del Software 74
Índice

3.7.1. Calidad del Software


 Causas de un Mal Diseño:
▫ Mala Gestión de Dependencias.
• Los cambios que introducen dependencias nuevas y no
planificadas.
• Cada uno de los cuatro síntomas mencionados anteriormente son,
ya sea directamente o indirectamente, causados por indebidas
dependencias entre los módulos del software. Es la arquitectura
de dependencias la que se está degradando y con ella la
capacidad del software para ser mantenido.
• Con el fin de evitar la degradación de la arquitectura de
dependencias, las dependencias entre módulos en una aplicación
deben ser gestionadas. Esta gestión consiste en la creación de
cortafuegos de dependencias. A través de cortafuegos, las
dependencias no se propagan.
3. Software > 7. Calidad del Software 75
Índice

3.7.2. Calidad del Software de Bajo Nivel


 Código sucio (Smell Code – código
maloliente, hediondez del código) de
Beck, K. y Fowler, M. en 1999.
▫ Código sucio es cualquier síntoma en el código
fuente de un programa que posiblemente indica
un problema más profundo. Las hediondeces
del código usualmente no son errores de
programación, no son técnicamente incorrectos
y en realidad no impiden que el programa
funcione correctamente. En cambio, indican
deficiencias en el diseño que puede ralentizar el
desarrollo o aumentan el riesgo de errores o
fallos en el futuro.
3. Software > 7. Calidad del Software 76
Índice

3.7.2. Calidad del Software de Bajo Nivel


 Código Limpio (Clean Code) de Martin,
R. en 2008
▫ “El código limpio se puede leer y mejorar por un
desarrollador que no sea su autor original.
Tiene pruebas de unidad y de aceptación. Tiene
nombres significativos. Proporciona una forma en
lugar de muchas maneras para hacer una cosa.
Tiene dependencias mínimas, que se definen
explícitamente, y proporciona una API clara y
mínima. El código se debe saber leer y escribir ya
que dependiendo del lenguaje, no toda la
información necesaria se puede expresar con
claridad en el código solo” [Thomas, D. -
Eclipse]
▫ “Código limpio es simple y directo. Código
limpio se lee como una buena prosa escrita. Código
limpio nunca oscurece la intención del diseñador,
sino que está lleno de abstracciones nítidas y líneas
sencillas de control” [Booch, G. - RUP]
3. Software > 7. Calidad del Software 77
Índice

3.7.2. Calidad del Software de Bajo Nivel


 Ambas propuestas han recuperado las Guías y/o Reglas de
Estilo, Modismos, … al centro de atención como punto de
partida para un buen diseño. Su ámbito suele reducirse a
reglas postivas (Clena Code)/negativas (Smell Code) de
sentencias, atributos, métodos y clases pero no suelen afectar
a paquetes o arquitecturas.

El estilo de codificación y la legibilidad establecen los precedentes que


afectan a la mantenibilidad y extensibilidad mucho después de que el
código original se haya cambiado
[Martin, R]
3. Software > 7. Calidad del Software 78
Índice

3.7.3. Calidad del Software de Medio Nivel


 Patrones Generales de Software para Asignación de
Responsablidades (GRASP – General Responsibility
Assignment Software Patterns / captar) de Larman, C. en 2005:
▫ Patrón Experto en información
▫ Patrón Alta cohesión
▫ Patrón Bajo acoplamiento
▫ Patrón Controlador
▫ Patrón Creador
▫ Patrón Polimorfismo
▫ Patrón Fabricación pura
▫ Patrón Indirección
▫ Patrón Variaciones Protegidas
Válidos para el análisis o diseño preliminar afectando a clases o
pequeñas colecciones de clases
3. Software > 7. Calidad del Software 79
Índice

3.7.3. Calidad del Software de Medio Nivel


 Principios de Diseño Orientado a
Objetos (SOLID) por Martin, R. en
1995:
▫ Principio de Única Responsabilidad (SRP
- The Single Responsibility Principle)
▫ Principio Abierto/Cerrado (OCP - The
Open Closed Principle)
▫ Prinicipio de Sustitución de Liskov (LSP -
The Liskov Substitution Principle)
▫ Principio de Separación de Interfaces
(ISP - The Interface Segregation Principle)
▫ Principio de Inversión de Dependencias
(DIP - The Dependency Inversion Principle)
Válidos para el diseño detallado afectando a
clases o pequeñas colecciones de clases y
sus relaciones de dependencia
3. Software > 7. Calidad del Software 80
Índice

3.7.3. Calidad del Software de Medio Nivel


 Patrones de Diseño por Gamma et
al en 1994:
▫ “Cada patrón describe un problema que
ocurre una y otra vez en nuestro entorno y
luego describe el núcleo de la solución a ese
problema, de tal manera que se puede
utilizar esta solución un millón de veces,
sin tener que hacerlo de la misma manera
dos veces” [Alexander]
Válidos para el diseño de colecciones de
clases que colaboran y sus dependencias
en un contexto muy particular
3. Software > 7. Calidad del Software 81
Índice

3.7.3. Calidad del Software de Medio Nivel


 Antipatrones (Antipatterns) por
Brown, W et al en 1998:
▫ Antipatrones proporcionan experiencia del
mundo real en el reconocimiento de los
problemas recurrentes en la industria del
software y proporcionar un remedio detallado
para los predicamentos más comunes.
Válidos para clases o colecciones de clases en
un contexto particular
3. Software > 7. Calidad del Software 82
Índice

3.7.3. Calidad del Software de Medio Nivel


 Comparativa entre Patrones y Antipatrones
3. Software > 7. Calidad del Software 83
Índice

3.7.4. Calidad del Software de Alto Nivel


 Arquitectura del Software es el conjunto de decisiones
significativas sobre la organización del sistema software, la
selección de elementos estructurales en los que el sistema
está compuesto y los interfaces entre ellos, junto con sus
comportamientos especificados como colaboraciones de
estos elementos, la composición de estos elementos
estructurales y de comportamiento en subsistemas más
grandes progresivamente [Booch, G] y …

“parábola del ciego y el elefante”


3. Software > 7. Calidad del Software 84
Índice

3.7.4. Calidad del Software de Alto Nivel


 Arquitectura del Software … y el estilo arquitectónico que
guía esta organización dado por [Booch, G]:
▫ Restricciones no funcionales (rendimiento, plataforma, …)
▫ Tecnologías (protocolos, bases de datos, …)
▫ Reusabilidad (diccionarios de datos, API’s, …)
▫ Economía (sistemas heredados, frameworks, …)
▫ Compromisos de uso (disponibilidad, amigabilidad, …)
▫ Flexibilidad al cambio (patrones de software, cortafuegos, …)
▫ y aspectos estéticos (C2, CMMI, …)

compartir una estructura de alto nivel y


mecanismos clave similares
3. Software > 7. Calidad del Software 85
Índice

3.7.4. Calidad del Software de Alto Nivel


 Principios de Paquetes de Martin, R.
en 1996 establece:
▫ Principio de Equivalencia entre Entrega y
Reusabilidad
▫ Principio del Cierre Común
▫ Principio de la Reusabilidad Común
▫ Principio de Dependencias Acíclicas
▫ Principio de Dependencias Estables
▫ Principio de Abstracciones Estables
3. Software > 7. Calidad del Software 86
Índice

3.7.4. Calidad del Software de Alto Nivel


 Estilos arquietectónicos y Patrones de
Arquitectura del Software por Fowler,
M. et al en 2002
▫ “Presento mi percepción de las partes
principales de una aplicación empresarial y de
las decisiones que me gustaría tomar para poder
hacerlo bien desde el principio. El patrón
arquitectónico que más me gusta es el de capas,
[…]. Algunos de los patrones en este libro
razonablemente se puede llamar arquitectónicos,
ya que representan las decisiones importantes
sobre estas partes; otros son más sobre el diseño
y ayudan a realizar la arquitectura”
3. Software > 7. Calidad del Software 87
Índice

3.7.4. Calidad del Software de Alto Nivel


 Antipatrones (Antipatterns) por
Brown, W et al en 1998:
▫ Antipatrones proporcionan experiencia del
mundo real en el reconocimiento de los
problemas recurrentes en la industria del
software y proporcionar un remedio detallado
para los predicamentos más comunes
▫ Los siguientes antipatrones centran en
algunos problemas y errores comunes en la
creación, implementación y gestión de la
arquitectura
3. Software > 7. Calidad del Software 88
Índice

3.7.5. Métricas de Calidad del Software


 Una aplicación practica de las métricas orientadas a objetos
(OO), es predecir que clases tienen una alta probabilidad
de contener defectos.
▫ Esto tiende a ser significativo dado que, se cree que las métricas OO
son indicadores de complejidad psicológica y, las clases que son más
complejas son más probables que contengan defectos.
▫ Recientemente se ha propuesto una teoría cognitiva la cual sugiere
que existe un efecto de umbral para varias métricas OO. Esto significa
que las clases OO son fáciles de entender, mientras su complejidad
este por debajo del valor de umbral. Por encima del valor de umbral,
su comprensión decrece, llevando a una probabilidad de fallas
incremental.
▫ Acorde a esta teoría, esto sucede debido a que la memoria humana a
corto plazo colapsa. Si esta teoría se confirma, proveería un
mecanismo que podría explicar la introducción de fallas en sistemas
OO, y proveería también una guía practica de cómo diseñar sistemas
OO
3. Software > 7. Calidad del Software 89
Índice

3.7.6. Reusablidad del Software


 “Reusabilidad a menudo se promociona como el propósito de los
objetos. Creemos que la reusabilidad está sobrevalorada (sólo tiene
que utilizar).
 Sin embargo, no podemos negar que gran parte de nuestra
habilidad de programación se basa en las clases de la biblioteca,
para que nadie pueda decir que nos hemos olvidado de nuestros
algoritmos de ordenación” [Fowler]
3. Software > 7. Calidad del Software 90
Índice

3.7.6. Reusablidad del Software


 Tipos:
▫ Reusabilidad del Código: es utilizar
código ya escrito, documentado y
probado en nuevos contextos
(aplicaciones). Ej.: Bibliotecas
▫ Reusabilidad del Diseño: es utilizar
diseños ya documentados y probados
en nuevos contextos (aplicaciones).
Ej.: Patrones
▫ Reusabilidad del Código/Diseño: es
utilizar código ya escrito
documentado y probado en nuevos
contextos (aplicaciones) e impone
diseños ya documentados y probados
en dichos contextos (aplicaciones).
Ej.: Frameworks (Bibliotecas)
3. Software > 7. Calidad del Software 91
Índice

3.7.7. Resumen
 Calidad del Software de  Calidad del Software de
soluciones positivas: soluciones negativas:
▫ Principios. Ej.: Simplicidad, … ▫ Prohibiciones. Ej.: Duplicidad,

▫ Código Limpio. Ej.: Nombres ▫ Código Sucio. Ej.: Acrónimos
significativos, … de nombres, …
▫ Patrones: Soluciones buenas a ▫ Antipatrones: Soluciones malas
problemas recurrentes, … a problemas recurrentes, …
3. Software > 7. Calidad del Software 92
Índice

3.7.7. Resumen
3. Software 93
Índice

3.8. Metodologías de Desarrollo del Software


1. Introducción
2. Metodología en Cascada
3. Metodologías Iterativas e Incrementales
4. Metodologías RUP vs Scrum+XP
3. Software > 8. Metodologías de Desarrollo del Software 94
Índice

3.8.1. Introducción
 Proceso de Desarrollo Software: el conjunto total de
actividades necesarias para transformar los requerimientos
del cliente en un conjunto consistente de artefactos que
representan un producto software y, en un momento
posterior, para transformar los cambios de estos
requerimientos en una nueva versión del producto software.
▫ La diferencia entre una metodologías y otras radica en el orden,
grado y técnicas en que se acometen las actividades de las distintas
disciplinas de la ingeniería del software
3. Software > 8. Metodologías de Desarrollo del Software 95
Índice

3.8.2. Metodología en Cascada


 La versión original fue propuesta por Royce, W. W. en 1970
y posteriormente revisada por Boehm, B. en 1980 y
Sommerville, I. en 1985.
 Etapas:

 El inicio de cada etapa debe esperar a la finalización de la


etapa anterior. Ante la detección de un error en una etapa se
requiere la retroalimentación de fases anteriores
3. Software > 8. Metodologías de Desarrollo del Software 96
Índice

3.8.2. Metodología en Cascada


 Ventajas:
▫ Son modelos fáciles de implementar y entender. Son modelos
conocidos y utilizados con frecuencia.
▫ Promueven una metodología de trabajo efectiva: definir antes que
diseñar, diseñar antes que codificar
▫ Si el 90% o más de los requisitos de tu sistema se espera que sean
estables a lo largo de la vida del proyecto, entonces aplicar una
política dirigida por los requisitos es una oportunidad apropiada de
dar razonablemente una solución óptima. [Booch – Object Solutions]
 Desventajas:
▫ 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
▫ Otros grados menores de estabilidad en los requisitos requieren un
enfoque de desarrollo diferente para dar un valor tolerable del coste
total [Booch – Object Solutions]
3. Software > 8. Metodologías de Desarrollo del Software 97
Índice

3.8.3. Metodologías Iterativas


 Definiciones:
▫ Iteración: Un conjunto distinto de actividades llevado a cabo de
acuerdo con un plan dedicado (iteración) y criterios de evaluación
que se traduce en una entrega, ya sea interna o externa.
▫ Incremento: Una parte del sistema pequeña y manejable, por lo
general, la diferencia entre dos construcciones sucesivas.
• Cada iteración se traducirá en al menos una nueva
construcción y, por lo tanto, se añadirá un incremento en el
sistema.

Planificar de un poco.
Especificar, diseñar e implementar un poco.
Integrar, probar y ejecutar un poco en cada iteración
[Booch]
3. Software > 8. Metodologías de Desarrollo del Software 98
Índice

3.8.3. Metodologías Iterativas


 Definiciones:
▫ Entrega. Un conjunto de artefactos (documentos y posiblemente una
construcción ejecutable) relativamente complete y consistente
entregada a usuarios externos o internos
• Entrega interna. Una entrega no expuesta a los clientes y usuarios
pero sí internamente solo para el proyecto y sus miembros
• Entrega externa. Una entrega expuesta a clientes y usuarios
externos al proyectos y sus miembros.

Releases

Inception Elaboration Construction Transition

Preliminary Architect. Architect. Devel. Devel. Devel. Transition Transition


Iteration Iteration Iteration Iteration Iteration Iteration Iteration Iteration
3. Software > 8. Metodologías de Desarrollo del Software 99
Índice

3.8.3. Metodologías Iterativas


 Desventajas:
▫ Dificultad para gestionar a los miembros del equipo de desarrollo en
un iteración cerrada o dificultad para gestionar a los miembros del
equipo de desarrollo con varias iteraciones abiertas en paralelo
 Ventajas:
▫ Permite la participación del usuario desde fechas tempranas del
proyecto para corregir las desviaciones de sus necesidades
▫ Permite elevar el ánimo del equipo de desarrollo con las entregas
externas que superan las pruebas de aceptación
▫ Errores de programación, diseño, … se localizan con facilidad en el
incremento producido en la iteración vigente
3. Software > 8. Metodologías de Desarrollo del Software 100
Índice

3.8.3. Metodologías Iterativas


 Estadísticas de Standish Group sobre 50.000 proyectos:
 Falta del involucración del usuario 12.8%
 Requerimientos y especificaciones poco claras 12.3%
 Cambio de requerimientos y especificaciones 11.8%
? Poco apoyo de las gerencias involucradas 7.5%
? Tecnología deficiente 7.0%
? Falta de recursos 6.4%
 Expectativas poco realistas 5.9%
 Objetivos poco claros 5.3%
 Tiempos poco realistas 4.3%
? Nuevas tecnologías 3.7%
? Otros 23.0%
3. Software > 8. Metodologías de Desarrollo del Software 101
Índice

3.8.4. Metodologías RUP vs Scrum+XP


 RUP (Rational Unified Process):
▫ DO {
• Requisitar
• Analizar
• Diseñar
• Programar
• Probar
• Desplegar
▫ } WHILE (finProyecto)
3. Software > 8. Metodologías de Desarrollo del Software 102
Índice

3.8.4. Metodologías RUP vs Scrum+XP


 Scrum+XP (eXtreming programming):
▫ DO {
• Requisitar-Analizar Sprint Planning Meeting
• Probar-Diseñar Test Driven Development
• Programar-Rediseñar (Refactoring)
• Desplegar Continuous Integration
▫ } WHILE (finProyecto)
3. Software > 8. Metodologías de Desarrollo del Software 103
Índice

3.8.4. Metodologías RUP vs Scrum+XP


 RUP:  Scrum+XP:
▫ Gestión de documentación de ▫ Poca documentación porque la
requisitos, análisis y diseño: mejor documentación es el
pesadas código: ligeras
▫ Con estimaciones del tiempo y ▫ Sin estimaciones del tiempo ni
coste del proyecto entero coste del proyecto entero
▫ Planificación a largo plazo y ▫ Planificación de la iteración
revisiones del plan en cada actual pero sin previsión a largo
iteración plazo
▫ Entrevistas con el cliente ▫ Entrevistas con el cliente
durante las primeras iteraciones durante todo el proyecto, cliente
y en cada entrega in situ parte del proyecto
▫ Desarrollo priorizado por ▫ Desarrollo priorizado por el
riesgos técnicos, políticos, … valor de retorno al cliente
▫ Roles especializados por ▫ Desarrolladores
desarrollador multidisciplinares
▫ Diseño de la Arquitectura ▫ Arquitectura emergente según
propuesta previa al desarrollo se re-diseña (TDD y refactoring)
3. Software > 8. Metodologías de Desarrollo del Software 104
Índice

3.8.4. Metodologías RUP vs Scrum+XP


 Arquitectura del Software:
▫ RUP

▫ XP+Scrum
3. Software > 8. Metodologías de Desarrollo del Software 105
Índice

3.8.4. Metodologías RUP vs Scrum+XP


 Arquitectura del Software :
▫ Top-down

▫ Bottom-up

También podría gustarte