Resumen IIS
Resumen IIS
Resumen IIS
Resumen IIS
Contenido
Introducción – capítulo 1 .............................................................................................................. 4
Procesos de software – capítulo 2 ................................................................................................ 4
Actividades del proceso de software ........................................................................................ 5
Cambios ..................................................................................................................................... 6
Mejora de procesos................................................................................................................... 7
Metodologías ágiles – capítulo 3................................................................................................... 8
Windows XP............................................................................................................................... 8
Historias de usuario ............................................................................................................... 8
Refactorización ...................................................................................................................... 8
Desarrollo dirigido por pruebas ............................................................................................ 9
Pair programming...................................................................................................................... 9
Scrum....................................................................................................................................... 10
Escalamiento ........................................................................................................................... 11
Ingeniería de requisitos ............................................................................................................... 14
Clase 1 – capítulo 4 (+ Wiegers) .............................................................................................. 14
Requerimientos funcionales y no funcionales .................................................................... 14
Procesos de ingeniería de requerimientos ......................................................................... 16
Técnicas para obtención de requisitos................................................................................ 16
Clase 2 – capítulo 4.3 y 5 ......................................................................................................... 17
Escenarios, casos de uso e historias de usuario .................................................................. 17
Clase 3 (ya no sé qué capítulo porque las ppt están en cualquier orden) .............................. 18
Clase 4 ..................................................................................................................................... 19
Modelos de contexto .......................................................................................................... 19
Modelos de interacción....................................................................................................... 20
Modelos estructurales ........................................................................................................ 20
Modelos de comportamiento ............................................................................................. 20
Documento de requerimientos de software....................................................................... 21
Validación de requerimientos ............................................................................................. 21
Diseño de software ..................................................................................................................... 22
Clase 1 - capítulo 7 .................................................................................................................. 22
2
Introducción – capítulo 1
El software profesional se hace para ser usado por alguien que no es el desarrollador y
normalmente se hace en equipos. Es mantenido y cambiado durante su vida. A este tipo de
software se orienta la ingeniería de software, pues las técnicas que usa son irrelevantes para el
software personal. El software incluye no sólo un programa, sino también documentación,
librerías y otras cosas.
La computación, a diferencia de la ingeniería de software, se enfoca en la parte teórica, y ésta
última es parte de la ingeniería de sistemas. El 40% del costo del software es testing.
En los productos genéricos, la especificación la controla la compañía, mientras que en los
personalizados la controla el cliente, y se debe trabajar con ella. En la actualidad, cada vez se
mezclan más estas especificaciones, partiendo de un software genérico y adaptándolo.
La calidad de software incluye el comportamiento, estructura y organización de los
componentes.
Los ingenieros trabajan con restricciones, y no siempre existe un método que puedan aplicar
para resolver un problema. Tienen que dar un resultado de la calidad requerida en tiempo y
bajo el presupuesto, así que no pueden hacer todo perfectamente.
La ingeniería de sistemas involucra varias cosas como hardware y proceso de diseño, además
del software.
El software debe cambiar al ritmo de la sociedad, y algunos métodos viejos son demasiado
lentos.
Los sistemas de recolección de datos suelen encontrarse en un entorno hostil, como dentro de
un motor o en una ubicación remota.
El software de negocios se corre en servidores Web para disminuir costos de actualización y
por la interfaz de usuario. Productos basados en la web ven al software como un servicio. Esto,
más el cloud computing, lleva a que el software de negocio esté muy distribuido y reuse
componentes. Además, se hace de forma incremental.
El Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) con la ACM produjo un código de ética
y práctica profesional.
Los procesos han evolucionado. Para sistemas críticos, se necesita un proceso muy
estructurado con registros detallados (cascada), mientras que para sistemas de negocios
cambiantes es mejor un proceso ágil y flexible.
En el modelo intercalado, cada versión le agrega funcionalidad al sistema. La integración se usa
para sistemas de negocios.
El modelo en cascada es un proceso dirigido por plan. Cada fase da como resultado
documentación, y no debería arrancar hasta terminada la anterior, pero en el desarrollo de
software hay retroalimentación entre las partes. Si hay cambios, hay que cambiar la
documentación de las fases anteriores, lo que lleva a retrasos. Para evitarlo, se puede congelar
la especificación de requerimientos, pero esto lleva a que los problemas se ignoren o haya que
encontrar una forma de arreglarlos durante la programación, lo que puede empeorar la
estructura del sistema.
El modelo cascada es preferible para sistemas embebidos en hardware, ya que éste es
incambiante; sistemas críticos donde se necesita toda la documentación de especificación y
diseño para comenzar la implementación; y sistemas grandes siendo desarrollados por varias
compañías a la vez. Hay una variante de este modelo, llamada desarrollo formal de sistema,
que hace un modelo matemático de una especificación, pero sólo se usa en sistemas críticos.
El modelo de desarrollo incremental se basa en la idea de desarrollar una implementación
inicial, obtener información del usuario, y hacer varias versiones del sistema hasta que se
obtiene el deseado. Es el más común hoy en día, y puede ser dirigido por plan, ágil, o por lo
general, una mezcla de ambos. En el primero, los incrementos se identifican antes de arrancar.
Es un mejor modelo para software cuyos requerimientos probablemente cambien durante el
desarrollo, como es el caso de la mayoría de productos. Los incrementos iniciales tienen las
funcionalidades más importantes o urgentes, permitiendo una temprana evaluación del
sistema por parte del cliente para ver si cumple los requerimientos.
Los problemas del desarrollo incremental se agudizan para sistemas grandes y complejos, pues
hay que definir las responsabilidades de cada uno antes de empezar. No es necesario que el
cliente vea cada incremento.
Cambios
Un prototipo se debe desarrollar de forma rápida e iterativa para que los costos sean
controlados y se pueda experimentar con él de forma temprana. Los prototipos les permiten a
los potenciales usuarios ver si el sistema les sirve, e incluso puede revelar nuevos
requerimientos o errores.
funcionalidades. No es aplicable para los mismos casos que el modelo en cascada sí lo es; en
estos casos, son mejores los prototipos.
Mejora de procesos
El enfoque de madurez de procesos busca mejorar la calidad del producto y que el proceso sea
predecible. Por otro lado, el enfoque ágil sostiene que los mejores procesos son los que tienen
menores costos generales. El primero se basa en desarrollo dirigido por planes y tiene mayores
costos, mientras que el segundo disminuye la formalidad y documentación, enfocándose en el
código.
El análisis de procesos se puede hacer con características como velocidad y robustez. En el
primer ciclo de cambios hay que recoger información del proceso para poder mejorar. Es una
actividad a largo plazo y continua, dados los cambios del mercado. La madurez de los procesos
refleja la administración y medidas de los mismos, así como el uso de buenas prácticas de
ingeniería de software por parte de la compañía.
En el nivel inicial del modelo de madurez de procesos, los objetivos del área están satisfechos.
En el nivel gestionado, además debe haber documentación de los objetivos, y monitorear los
procesos. En el nivel definido, se estandarizan los procesos, y se obtienen medidas para el
futuro. En el nivel gestionado cuantitativamente, se usan medidas cuantitativas para controlar
subprocesos. En el nivel de optimización, se usan las medidas obtenidas para mejorar los
procesos.
Las dificultades de aplicar este modelo por sus costos en modelos ágiles resultan en que sólo
compañías grandes lo usan.
8
En los métodos ágiles, no hay especificación del sistema y la documentación del diseño es
mínima. Los requerimientos de usuario se plantean de forma genérica. Los clientes pueden
sugerir cambios para cada versión. Se hacen incrementos pequeños, donde se hacen nuevos
sistemas para los clientes cada dos o tres semanas. La razón de este involucramiento es para
obtener retroalimentación rápidamente. La comunicación es informal para minimizar la
cantidad de documentación. El diseño e implementación son las actividades centrales, y otras
actividades como el testing se incorporan a las mismas.
Los requerimientos y el diseño se desarrollan juntos. De todos modos, es posible generar
documentación con metodologías ágiles, si así se decidiera. Estas metodologías funcionan bien
cuando es posible tener buena comunicación entre el cliente y los desarrolladores, y al no
haber varios equipos involucrados, la comunicación informal funciona.
Windows XP
En XP, los requerimientos se expresan como historias de usuario, que se implementan
directamente como tareas. Los programadores trabajan de a pares y hacen tests para cada
tarea antes de escribir el código. Los requerimientos se basan en las historias de usuario. El
cliente debe definir las pruebas de aceptación.
A continuación se detallan algunas prácticas de XP.
Historias de usuario
Una historia de usuario es una posibilidad de uso que puede sucederle a un usuario. Esto se
discute entre el cliente y los desarrolladores para generar una “tarjeta de historia” que
describe una historia que contiene las necesidades del cliente. Luego se desarrolla ese uso en
un futuro incremento. Esta es la forma de incorporar los requerimientos al desarrollo.
Las tarjetas de historia se separan en tareas y se estima el esfuerzo y recursos necesarios,
hablando con el cliente para refinar los requerimientos. Luego el cliente elige qué historias son
prioritarias para implementar, aquellas que pueden ser útiles inmediatamente. Se debe
identificar funcionalidades que se pueden implementar en dos semanas, que es el tiempo
hasta el siguiente incremento.
Con los cambios de requerimientos, pueden cambiar o eliminarse historias no implementadas.
Si hay cambios, el cliente debe elegir si éstos tienen prioridad sobre cosas nuevas. Las historias
de usuario facilitan a los mismos sugerir requerimientos, pues les son más comprensibles. Sin
embargo, no son completas. No se sabe si se necesitan más requerimientos, o si se tiene toda
la información de una actividad.
Refactorización
Diseñar para facilitar los cambios suele ser una pérdida de esfuerzo. Para facilitarlos, XP
sugiere que el código debe ser refactorizado. La refactorización significa buscar mejoras al
programa e implementarlas inmediatamente, aún si no son necesarias. Los cambios suelen
degradar la estructura del sistema, y la refactorización evita esto al mejorar la estructura y la
legibilidad.
9
Algunos ejemplos son eliminar código duplicado o reemplazar código similar por llamadas a
una librería. Los IDEs incluyen herramientas para esto. En principio, con la refactorización el
sistema debería ser fácil de entender y cambiar. En la práctica, no siempre hay tiempo para
refactorizar, o hay que hacer algún cambio que requiere cambiar la estructura del sistema.
Al escribir las pruebas antes del código, se pueden hacer mientras se escribe el código y
encontrar problemas. Escribir pruebas define una interfaz y una especificación del
comportamiento de la funcionalidad en cuestión. Hay menos problemas de malos entendidos
de requerimientos o interfaz, y una clara relación entre los primeros y el código que los
implementa, gracias a las tareas. Las personas que implementan las mismas deben entender
bien la especificación para hacer pruebas, por lo que ambigüedades y omisiones se deben
aclarar antes de empezar. Además, evita que el desarrollador se adelante al tester, lo que
puede llevar a la omisión de pruebas para mantener el calendario.
Cada tarea genera tests unitarios que verifican la implementación de la misma. El cliente ayuda
a desarrollar pruebas de aceptación (que el sistema haga lo que necesita). La automatización
de tests es fundamental. Las pruebas se escriben como componentes ejecutables antes de
implementar las tareas, y estas pruebas individualmente simulan una entrada y verifican que la
salida sea correcta. Hay frameworks para esto (por ejemplo Junit). Esta automatización lleva a
que exista un conjunto de pruebas que pueden ser ejecutadas fácilmente al introducir nuevas
funcionalidades al sistema.
Como es lógico, este tipo de desarrollo conlleva la escritura de gran cantidad de pruebas. Sin
embargo, es difícil verificar que sean completas. Los programadores suelen omitir algunas
porque no les gusta el testeo, y algunas pruebas son difíciles de hacer incrementalmente. Por
eso es necesario revisar las pruebas y hacer más cuando el sistema ya ha sido desarrollado.
Pair programming
La pareja de programadores se sienta en la misma computadora para hacer el software. Pero
no siempre son los mismos, sino que van rotando. Esto tiene algunas ventajas: apoya la idea de
propiedad colectiva del software, haciendo que todos sean responsables de los problemas; es
una forma de inspección informal al haber dos personas, que ayuda a encontrar errores sin los
problemas de tiempo de las inspecciones formales; y alienta a la refactorización, pues otros se
benefician inmediatamente de dicho proceso (normalmente los programadores son reacios a
refactorizar porque no se ven los beneficios).
La eficiencia del pair programming aún es cuestionada, dado que dos individuos trabajando
juntos en un período de tiempo producen la mitad de código que si trabajaran separados.
10
Estudios sobre el tema han dado resultados mixtos. En general, la ventaja es que se comparte
conocimiento, lo que reduce los riesgos para el proyecto cuando algún miembro del equipo se
va.
Scrum
La planificación informal y falta de documentación de los métodos ágiles colisionan con la
necesidad de visibilidad de las grandes empresas, que necesitan saber qué está sucediendo. El
desarrollo ágil también requiere gestión para hacer el mejor uso de tiempo y recursos posible.
Para dar un framework para esto se desarrolló el Scrum, que permite dar algo de visibilidad. Es
un método ágil por seguir los principios necesarios, pero no se enfoca en las prácticas, por lo
que puede incorporarse con otras.
Los términos usados en Scrum son:
El proceso o ciclo de sprint del Scrum comienza con el product backlog: la lista de cosas en las
que hay que trabajar, que no son sólo funcionalidades del sistema (pruebas, arquitectura,
documentación). Puede tener distintos niveles de especificidad, lo cual depende del product
owner. Cada ciclo de sprint dura un tiempo fijo, y al principio de cada uno el PO define cuáles
son los elementos del backlog que tienen prioridad ese ciclo. Si no se completan, no se
11
extiende el tiempo. Luego el equipo elige qué elementos de la lista creen que pueden hacer
ese sprint, y estiman el tiempo que les tomará. Para esto, consideran la velocidad lograda en
sprints anteriores. Se hace un backlog para ese sprint particular: qué tareas tienen que hacer.
Al final de cada sprint, hay una reunión de evaluación con todo el equipo, donde se ve cómo se
puede mejorar la forma en que trabajaron y dan datos del producto para hacer el product
backlog del siguiente sprint. El ScrumMaster suele tener que dar reportes a sus superiores, y
pueden tener que gestionar proyectos.
Hoy en día, muchas empresas tienen equipos distribuidos donde los miembros están por todo
el mundo. Se ha desarrollado, entonces, el Scrum distribuido para estos casos. Incluye
comunicación por chat o videoconferencias, un IDE común y ambiente de integración.
Escalamiento
La necesidad de obtener software más rápidamente se aplica a sistemas y empresas grandes, y
por eso se ha intentado evolucionar los métodos ágiles para usarlos en estas circunstancias.
Suele ser necesario escalar hacia arriba y hacia afuera al mismo tiempo, pues software grande
se encarga a empresas grandes. Los métodos ágiles no aportan tanta productividad y
disminución de los efectos en estos casos.
Cuando se hace un contrato, normalmente la documentación de los requerimientos es parte
del mismo, pero esto no existe en los métodos ágiles. En consecuencia, el cliente paga por el
tiempo que toma hacer el sistema y no por los requerimientos solicitados. Esto puede llevar a
disputas sobre quién debe pagar si el sistema se demora.
En la práctica, la documentación formal del sistema no suele ser actualizada, y por eso los
promotores de métodos ágiles sostienen que es innecesaria, y que con código legible y de
calidad es suficiente para que el sistema se pueda mantener. Sin embargo, los requerimientos
de sistema le dicen al ingeniero qué debe hacer el sistema, y sin el mismo el mantenimiento se
hace más difícil. Esto es peor si no se puede garantizar la continuidad del equipo.
Es importante mantener al cliente involucrado, que puede perder interés cuando el sistema
está hecho y no tener interés en el mantenimiento. Si el equipo de desarrollo no se mantiene,
se pierde el conocimiento implícito que sus miembros tenían del sistema y para el cual no
necesitaban documentación. Esto hace que sea difícil para nuevos miembros entender qué
hace el sistema. Es, además, difícil que el equipo de mantenimiento sea continuo, pues a los
programadores no les agrada hacer estas tareas y se van a nuevos proyectos.
Para escalar métodos ágiles, es fundamental integrarlos con enfoques dirigidos por planes,
sobre todo en grandes compañías. Los principios de metodologías ágiles no siempre se pueden
llevar a cabo. Para decidir el balance, hay que hacerse preguntas de carácter técnico, humano
y profesional.
Los sistemas grandes tienen varios aspectos que requieren planeación y documentación.
Cuanto más grande y complejo sea el sistema, más necesario es dirigirse por planes. Además,
si tienen larga vida o están sujetos a regulaciones, requieren documentación.
Los métodos ágiles ponen mucha confianza en el equipo para que se comunique, coopere, y en
las habilidades de cada individuo, pero esto no siempre es así, por lo que se puede requerir
planeación. Los métodos ágiles requieren más habilidad que los de planes, donde el individuo
12
simplemente convierte el diseño en código, y si se tiene gente con poca habilidad, puede ser
necesario poner a los mejores en diseño. Si el equipo está distribuido, es necesario hacer
documentación para comunicarse. Finalmente, los métodos ágiles requieren ciertas
tecnologías para visualizar el diseño y programación. Si no se tienen, se requiere
documentación.
Las organizaciones tienen procedimientos, y puede que los administradores no acepten la falta
de documentación y formalidad. Se puede usar planes para los requerimientos, pero luego
hacer el sistema con métodos ágiles. También sucede que la cultura de un lugar está
acostumbrada a la documentación del enfoque por planes.
Los factores que influencian esta decisión, entonces, son:
Los métodos ágiles tienen que evolucionar para sistemas grandes, ya que son mucho más
complejos que sistemas pequeños o productos de software. Esto se debe a seis factores de los
sistemas grandes:
1. Son sistemas de sistemas, y cada sistema es hecho por un equipo diferente y apartado
del resto. Esto significa que la mayoría no ve el sistema completo, sino sólo su parte.
2. Son sistemas brownfield, es decir, incluyen e interactúan con varios sistemas
existentes. Muchos de los requisitos del sistema se ocupan de esta interacción, y no
dan mucha posibilidad de flexibilidad o desarrollo incremental.
3. Cuando hay varios sistemas integrando uno solo, parte importante del desarrollo es la
configuración de sistema, que tampoco se presta para el desarrollo incremental.
4. Suelen estar limitados por regulaciones y reglas externas que pueden requerir ciertos
tipos de documentación de sistema.
5. Tienen un largo tiempo de procuración y desarrollo, lo cual hace difícil mantener un
equipo de personas que sepan del sistema todo ese tiempo, pues se van.
6. Suelen tener muchas personas interesadas con diferentes objetivos, y es
prácticamente imposible involucrarlos a todos en el desarrollo.
factores como desarrollo distribuido y regulaciones. Para esto puede ser necesario modificar
las prácticas de la etapa anterior y agregar prácticas dirigidas por planes al proceso.
Para escalar metodologías ágiles hay que tener en cuenta lo siguiente:
1. Un enfoque completamente incremental es imposible; hay que trabajar en los
requerimientos antes de empezar para identificar las diferentes partes del sistema. Sin
embargo, no tiene por qué hacerse en detalle.
2. No puede haber un único product owner o representante del cliente. Varias personas
deben involucrarse en distintas partes del sistema, y comunicarse durante el
desarrollo.
3. No puede enfocarse sólo en el código. Tiene que haber documentación del sistema y
su arquitectura, el diseño y aspectos críticos.
4. Deben diseñarse y usarse métodos de comunicación entre equipos: llamadas,
videoconferencias, emails, según la frecuencia de la comunicación.
5. La integración continua (hacer todo el sistema cada vez que hay algún cambio) es
imposible si tiene muchas partes, pero es importante hacer versiones regularmente.
Para desarrollo a gran escala, existe el multi-team Scrum, cuyas claves son:
1. Repetición de roles: cada equipo tiene un ScrumMaster y un Product Owner para su
componente, y puede haber uno principal para todo el sistema.
2. Arquitectos de producto: cada equipo elige un arquitecto, quienes trabajan juntos
para diseñar y elaborar la arquitectura general del sistema.
3. Alineación de versiones: las fechas para las nuevas versiones de cada equipo se
alinean para tener un sistema completo.
4. Scrum de Scrums: hay un Scrum de Scrums diario donde representantes de cada
equipo se juntan a hablar del progreso y planear el trabajo.
Puede ser difícil introducir metodologías ágiles en organizaciones grandes por varias razones:
Administradores de proyectos sin experiencia en estos métodos pueden no querer
tomar el riesgo de un nuevo enfoque, al no saber cómo va a afectar sus proyectos.
Las organizaciones grandes suelen tener procedimientos y estándares de calidad que
todos los proyectos deben seguir y, por naturaleza, son incompatibles con los métodos
ágiles.
Los métodos ágiles funcionan mejor con gente muy habilidosa, pero en organizaciones
grandes hay muchos niveles de habilidad, y los menos habilidosos pueden ser menos
efectivos en procesos ágiles.
Resistencia cultural a métodos ágiles.
La administración de los cambios, por ejemplo, entra en conflicto con la refactorización, ya que
la primera requiere que los desarrolladores pidan autorización para hacer un cambio, a
diferencia de la segunda. El testing puede derivarse a un equipo externo, lo que entra en
conflicto con el desarrollo por pruebas. Es difícil introducir estos cambios, pues son culturales,
y lo mejor es hacerlos de a poco, comenzando con un grupo.
14
Ingeniería de requisitos
Es importante considerar los requisitos a alto nivel antes de comenzar su ingeniería en detalle.
De este modo, se pueden comprender para luego ver si es posible hacer el sistema.
De este modo, se puede verificar que los requerimientos no funcionales se cumplan. Puede ser
muy costoso. Este tipo de requisito puede interactuar e incluso entrar en conflicto con otros,
de cualquier tipo.
16
La etnografía es útil para entender sistemas existentes, pero no siempre ayuda a la innovación.
Si bien revela detalles críticos que ninguna otra técnica logra, se enfoca mucho en el usuario y
por lo tanto no encuentra requerimientos de mayor alcance. Por eso se combina con otros
métodos.
Las historias de usuario dan una idea precisa de las necesidades del usuario. Los casos de uso
van más allá y describen cómo se imagina el usuario interactuando con el sistema.
Los casos de uso permiten al usuario tener una mejor idea de qué esperar, revelar
ambigüedades, designar las funcionalidades necesarias y definir prioridades y objetos
importantes.
Clase 3 (ya no sé qué capítulo porque las ppt están en cualquier orden)
En su especificación, los requerimientos deberían ser claros, no ambiguos, fáciles de entender,
completos y consistentes, cosa que es casi imposible en la práctica. Los interesados entienden
los requerimientos de forma diferente. Los requerimientos de sistema explican cómo el
sistema va a hacer sus funciones.
Crear un formato estándar hace que las omisiones sean menos probables y ayudar a verificar
los requisitos. Al incluir una explicación de un requisito, se debe incluir quién lo sugirió, pues
esa persona será a quien se le hagan consultas del mismo.
Al usar una notación estructurada, la especificación es menos variable, y los requerimientos se
organizan más efectivamente. Las tablas, por otro lado, muestran cómo se da la computación,
cómo cambia el estado del sistema, cómo interactúan los usuarios con el sistema y cómo se
hacen las acciones.
Dos objetivos principales de escribir requerimientos son: que cualquiera que los lea llegue a la
misma interpretación que otro, y que la misma sea lo que el autor quiso comunicar. Hay que
ser claro y conciso, y evitar escribir cosas de la forma A/B. No ser ambiguo a la hora de
especificar valores límite, y usar tablas o árboles de decisión para representar lógica compleja
y asegurarse de que se consideran todos los casos.
19
Clase 4
Los modelos se usan durante el proceso de ingeniería de requerimientos para derivar los
requerimientos detallados del sistema, durante el proceso de diseño para describir el sistema
a implementar, y luego de la implementación para documentar la estructura y operación del
sistema.
Un modelo de sistema no es una representación completa, sino que deja detalles fuera para
ayudar a su comprensión; es una abstracción, que tiene los detalles más importantes (la
representación tiene todo). La notación gráfica de estos modelos es flexible.
Modelos de contexto
Para definir los límites del sistema, hay que trabajar con los stakeholders. Cuando el rango de
usuarios es muy diverso, hay distintas necesidades que satisfacer. En este caso, puede no
definirse el límite, sino definir un sistema configurable para adaptarlo a las distintas
necesidades. La definición del límite es muy subjetiva, pues puede involucrar aspectos no
técnicos, como sociales o de la organización.
Luego de esta etapa, se define el contexto y las dependencias de un sistema respecto de su
entorno. Los modelos de contexto suelen mostrar que el entorno incluye otros sistemas
automatizados. Las relaciones con estos sistemas son importantes, ya que pueden afectar al
sistema en cuestión según sus características, que pueden variar. Por esto, además de los
modelos de contexto se usan otros modelos, como modelos de proceso de negocios.
Un diagrama de actividades UML muestra las actividades y flujo de control de un proceso. El
comienzo se representa con un círculo, el final con un círculo adentro de otro y las actividades
con rectángulos de puntas redondeadas. Se pueden incluir objetos. Las flechas muestran el
flujo de trabajo de una actividad a otra, y una barra muestra coordinación de actividades. Si
varias actividades llegan a una barra, todas deben terminar para poder seguir. Si varias flechas
salen de una barra, pueden hacerse las actividades paralelamente. Las flechas pueden tener
guardas.
20
Modelos de interacción
Los modelos de caso de uso y diagramas de secuencia tienen diferentes niveles de detalle y
pueden ser usados en conjunto.
Los diagramas de secuencia pueden modelar las interacciones entre los objetos. Los
rectángulos en las líneas indican el momento en que ese objeto está involucrado en la
computación, y se leen de arriba hacia abajo. En las flechas se indican llamadas a los objetos,
parámetros y retorno. Por lo general no es necesario incluir todas las interacciones, pues
algunas dependerán de la implementación.
Modelos estructurales
Los modelos estructurales pueden ser de toda la arquitectura o modelos detallados de los
objetos y sus relaciones. Cada clase puede necesitar saber algo de una clase asociada. En la
implementación, los objetos representan datos que son manipulados por el sistema. Los
diagramas incluyen multiplicidades.
UML se parece mucho a un MER: las clases son entidades, los atributos atributos de clase, y las
relaciones asociaciones. Para mostrar sólo las asociaciones, es mejor obviar los atributos. Se
pueden generalizar clases (como la categorización de un MER), con la ventaja de reusar
información y facilitar los cambios. También existe la agregación, una asociación donde un
objeto está compuesto de otros.
Modelos de comportamiento
Muchos sistemas de negocios son sistemas de procesamiento de datos, principalmente
manejados por datos. En cambio, los sistemas de tiempo real son manejados por eventos. Los
modelos dirigidos por datos muestran toda la secuencia de acciones desde la entrada hasta la
salida, por lo que pueden ser usados en el análisis de requerimientos.
Los diagramas de flujo de datos son simples e intuitivos, por lo que los stakeholders los
entienden. En ellos, las actividades se representan como rectángulos redondeados o círculos, y
los datos como rectángulos comunes (objetos).
Validación de requerimientos
Se superpone con la obtención y análisis, pues busca problemas con los requerimientos. Es una
actividad crítica, pues los errores en requerimientos implican retrabajo (cambiar diseño,
implementación, volver a probar, todo lo cual implica costos). Si al desarrollar pruebas para los
requerimientos, estas son muy difíciles, es probable que implementar el requerimiento
también lo sea.
Es difícil encontrar todos los problemas, y probar que el sistema cumple los requerimientos.
Hay que planear la obtención de los requerimientos, teniendo en cuenta lo siguiente:
Objetivos: para el proyecto entero y para cada actividad
Estrategia y técnicas planeadas: pueden combinarse (entrevistas, cuestionarios, etc.)
Programación y estimación de recursos: identificar a quiénes participarán en las
actividades, el esfuerzo y tiempo necesarios
Documentos y sistemas necesarios
Producto esperado
Riesgos: factores que pueden impedir completar las actividades
22
Diseño de software
Clase 1 - capítulo 7
El diseño y la implementación están muy relacionados, y se deben tener en cuenta aspectos de
implementación cuando se desarrolla un diseño. Para desarrollar un sistema del concepto al
diseño OO, hay que:
1. Entender y definir el contexto y las interacciones externas con el sistema
2. Diseñar la arquitectura del sistema
3. Identificar los objetos principales del sistema
4. Desarrollar modelos de diseño (cuyo nivel de detalle varía según la necesidad)
5. Especificar interfaces
Los modelos de diseño pueden ser estructurales, que describen la estructura estática del
sistema, o dinámicos, que describen cómo se espera que interactúen los objetos del sistema
en ejecución. Para esto, en UML, se usan los modelos de subsistema (objetos agrupados
coherentemente en subsistemas), secuencia y máquina de estados.
Existen patrones de diseño que se pueden aplicar; describen un problema común y su solución
(template de objetos y relaciones, así como el resultado), de forma que se puedan reusar.
En la implementación, es necesario tener en cuenta el reuso, las distintas versiones de
componentes (administración de configuración) y desarrollo anfitrión-objetivo (probar el
sistema en el equipo objetivo, pues se desarrolla en el anfitrión).
Los patrones de diseño o arquitectura son ejemplos de reuso a nivel abstracto. Los
componentes suelen tener que ser adaptados. Para reusar un sistema entero, se puede
agregar y modificar código o usar la interfaz de configuración del sistema. Reusar un software,
sin embargo, tiene sus costos: el tiempo necesario para encontrar COTS y decidir si satisface
las necesidades, pueden ser caro comprarlos, hay que adaptarlos e integrarlos al sistema.
Clase 2 - capítulo 6
Como parte del proceso de ingeniería de requerimientos, puede plantearse una arquitectura
para asociar funciones del sistema con componentes, lo que puede usarse para discutir los
requerimientos. Hay que analizar el sistema para explicitar la arquitectura, y esto afecta si el
sistema puede cumplir requisitos críticos.
Un modelo de arquitectura es el siguiente (cajas dentro de cajas indican que el componente
tiene subcomponentes, y las flechas representan el pasaje de datos o señales de control):
23
Decisiones de diseño
Hay que preguntarse cómo se estructurará el sistema y qué estrategia se usará para controlar
sus operaciones. Las decisiones en el proceso de diseño deben depender de: performance
(operaciones críticas en pocos componentes), seguridad (estructura en capas con los
elementos más críticos protegidos en las capas interiores), validación (elementos cercanos),
disponibilidad (componentes redundantes en caso de falla) y mantenibilidad (componentes
separados y autónomos).
Patrones de diseño
En una arquitectura de repositorio, por la organización de las herramientas, es eficiente
compartir grandes cantidades de datos, pues no es necesario enviarlos de un componente a
otro. Sin embargo, las herramientas tienen diferentes necesidades, por lo que es necesario un
compromiso, y puede ser necesario tener varias copias de los datos, lo que agrega overead.
Una arquitectura cliente-servidor se compone de: un conjunto de servidores que ofrecen
servicios a otros componentes, un conjunto de clientes que solicitan los servicios, y una red
que permite a los clientes acceder a estos servicios. Los servidores no necesitan conocer la
identidad o cantidad de sus clientes.
24
Clase 3 – capítulos 16 y 17
Ingeniería de software basada en componentes
Los componentes son definidos por sus interfaces, más grandes que objetos individuales, y los
detalles de implementación se ocultan. La ingeniería de software basada en componentes es el
proceso de definir, implementar e integrar estos componentes en sistemas. Es útil para
sistemas de gran escala, con requerimientos de seguridad y performance.
Tiene que haber una separación clara entre la interfaz y la implementación. Los estándares
definen, al menos, cómo especificar las interfaces e integrar los componentes, y permiten que
la operación sea independiente del lenguaje. El middleware maneja la comunicación entre
componentes, problemas de bajo nivel, y otras posibles adiciones. El proceso debe permitir
que los requerimientos evolucionen.
Los servicios estándar reducen la cantidad de código nuevo a desarrollar. Si el componente es
implementable, puede operar solo y no tiene que ser compilado antes de usar. Si es
independiente, no necesita de otros componentes (LO DE LAS PPT ESTÁ MAL). Para que sea
componible, todas las interacciones externas se deben hacer mediante interfaces. El
componente es definido por sus interfaces, que permiten ofrecer servicios. Las interfaces
provistas son la API.
Modelos de componentes
Los estándares permiten asegurarse de que los componentes pueden interoperar, y para que
los proveedores de middleware puedan apoyar la operación del componente. Los metadatos
del componente se refieren al propio componente. Un componente debe ser empaquetado
con todo el software que el mismo no provee. Para adaptarse a cambios, se pueden definir
reglas sobre el reemplazo de componentes. El middleware implementa los servicios comunes a
los componentes y provee interfaces.
Sistemas distribuidos
La administración de este tipo de sistema suele ser difícil, pues hay que lograr acuerdos sobre
las políticas a usar, y suele ser lo que más limita cuánto se puede escalar un sistema. El scaling-
out suele ser más efectivo que el scaling-up, pero sólo si hay concurrencia. Es importante que
un sistema pueda defenderse de intercepción de comunicaciones, interrupción de servicios,
modificaciones o creación de información falsa. Es difícil establecer una política de seguridad
que se pueda aplicar a todos los componentes del sistema, pues distintas organizaciones
pueden ser propietarias.
Idealmente, los requisitos de calidad de servicio se especifican por adelantado y el sistema se
desarrolla para cumplirlos, pero esto no siempre sucede, pues pueden ser contradictorios, y
puede ser costoso mantener una alta calidad en todo momento.
En RPC tanto el que llama como el que es llamado deben estar disponibles y saber cómo
referenciarse el uno al otro, cosa que no sucede en la interacción por mensajes.
Software as a service
Para quienes compran el servicio, el beneficio de esto es que el costo de administrar el
software y arreglar problemas pasa al proveedor, quien tiene que manejar los cambios y el
hardware. Pero como se transfieren datos con un servicio remoto, puede demorar mucho si
éstos son muchos. Tampoco se puede controlar la evolución del software, o puede tener
problemas con leyes locales al cliente.
El desarrollo de servicios es parecido al de otros tipos de software, pero en vez de tener
requerimientos del cliente, el proveedor asume lo que necesitan los usuarios, y luego de
obtener retroalimentación de los mismos sobre el sistema puede cambiar (metodologías ágiles
e incrementales). El Saas es genérico, pero si se quiere hacer para una empresa, hay que tener
en cuenta configurabilidad, muchos dueños y escalabilidad (número desconocido de usuarios).
Cuando muchas personas comparten el software, debe parecer que cada uno de ellos es el
26
único usuario, lo cual crea un problema con el mantenimiento de datos. Se puede aislar a cada
uno en una misma base de datos.
Construcción
Clase 1 – Swebok
El área de construcción de software se relaciona sobre todo con el diseño y la verificación,
pues se hace el primero y se usa como ayuda para desarrollar pruebas. También se producen
elementos de configuración y código.
Algunas técnicas que soportan la construcción para la verificación son estándares de código
que soportan revisiones de código y pruebas unitarias, organizar el código para soportar
pruebas automatizadas, y restringir el uso de estructuras difíciles de entender. El reuso debe
ser sistemático, con un proceso claro y repetible, para mejorar la calidad y costos. Los
estándares permiten lograr objetivos de eficiencia, calidad, y costo. Pueden ser métodos de
comunicación, lenguajes, estándares de código, plataformas o herramientas.
La gestión de la construcción involucra considerar el ciclo de vida a usar, la planificación y la
medición de la misma, para verificar la calidad. En general, la construcción de software es más
que nada hacer código y debuguear, pero también planificación de la construcción, diseño
detallado, pruebas unitarias y de integración, y otras actividades.
Consideraciones prácticas
Son muy importantes en la construcción, debido a las restricciones del mundo real. El diseño
en la construcción es como el diseño en el proceso de software, pero a menor escala
(algoritmos, interfaces). Los lenguajes de construcción, que permiten especificar la solución,
pueden afectar aspectos de calidad de software como rendimiento o seguridad. Estos
incluyen: lenguajes de configuración (elegir de un conjunto de opciones predefinidas para
crear nuevas instalaciones de software), lenguajes toolkit (construir una aplicación a partir de
un toolkit, juego de partes reusables) y lenguajes de scripting (programar aplicaciones).
Un lenguaje de programación puede tener: notación lingüística, que es la más fácil de
entender y usa cadenas de texto para representar las construcciones, similar a una oración;
notación formal, que se basa en definiciones formales o matemáticas, y es menos ambiguo; y
notación visual, que usa interpretación visual (íconos), que puede ser difícil para representar
instrucciones complejas.
En la construcción para el reuso, hay que implementar la variabilidad, encapsularla para que el
software sea fácil de configurar, testearla y describir y publicar el software reusable. La calidad
de construcción puede verse afectada por las fallas. La técnica a usar depende del tipo de
software y de las habilidades del programador, y se centra en el código.
En la integración hay que considerar la planificación la secuencia en la que se hará y el trabajo
hecho sobre los componentes antes de integrarlos, entre otras cosas. La integración “big bang”
no se hace hasta que todos los componentes estén listos. La integración integral tiene varias
ventajas, como mayor facilidad para encontrar errores y monitorear el progreso, y entregar el
producto antes. Se escribe un programa de prueba en partes pequeñas y se van integrando de
a una.
27
Tecnologías de construcción
El diseño de una API debería hacerla fácil de usar y memorizar, lograr código legible, ser fácil
de entender, completa y mantener la compatibilidad hacia atrás. Su uso tiene las implicaciones
de una construcción con reuso. En los tipos genéricos, los tipos no especificados se pasan
como parámetros al ser usados. Se piensa que el diseño por contrato puede mejorar la calidad
de construcción de software, al proveer una especificación precisa de la semántica de una
rutina.
La programación basada en estados usa los grafos de transición de una máquina de estados
en todas las etapas del desarrollo, buscando construir un programa de forma más
automatizada. El código basado en tablas puede ser más fácil de entender y modificar que la
lógica. Se considera qué información guardar y cómo acceder a ella eficientemente. El
procesamiento de entradas basado en gramática involucra la creación de un árbol sintáctico
que se recorre para obtener la expresión y variables de una tabla. Esto se usa como entrada.
El análisis de desempeño busca identificar puntos en el programa que pueden ser mejorados.
La puesta a punto del código implica hacer cambios pequeños en un único elemento que ya es
correcto. Los estándares de plataforma requieren que la plataforma compatible implemente
algún servicio o API.
Verificación y validación
Las pruebas pueden hacerse para obtener información del producto, permitiendo tomar
decisiones. Planearlas y diseñarlas es parte del proceso. Tienen condiciones, y pueden
combinarse una tras otra para crear escenarios. El nivel de una prueba se refiere a si es una
prueba de sistema, de integración o unitaria.
Pruebas de integración
Las pruebas de integración suelen tener problemas con las interfaces, ya sea porque no se
usan bien, no se entienden o hay diferencias en la velocidad de operación. La arquitectura de
sistema determina los componentes y cómo se relacionan entre sí, y el plan de proyecto
determina en qué momento se desarrollan las partes del sistema y cuándo están listas para ser
probadas. Las pruebas top-down y bottom-up tienen ventajas y desventajas opuestas con
respecto al uso y complejidad de stubs y drivers. Ad hoc requiere ambas cosas, lo cual es un
problema, si bien ahorra tiempo. En el esqueleto, se arma el esqueleto al que se le irán
agregando componentes, pero esto lleva tiempo.
Pruebas de sistema
Las pruebas de sistema se ejecutan desde el punto de vista del usuario final, y consideran
interacciones de todos los componentes (que pueden no haber sido contempladas en las
pruebas de integración).
Pruebas de aceptación
Las pruebas de aceptación contractuales se basan en contratos donde se definen los criterios
de aceptación, que se usan para las pruebas. Se hace en software específico para el cliente. Las
pruebas de aceptación del usuario se hacen porque el cliente y el usuario final pueden ser
diferentes, y los usuarios tienen diferentes expectativas del software. Las pruebas de
aceptación operacionales se hacen con los administradores del sistema.
Las pruebas de campo se hacen cuando el software debe correr en muchos entornos
diferentes y no se puede probar en todos. De este modo se pueden buscar problemas con
ciertos entornos. El alpha/beta testing consiste en enviar versiones previas y estables a clientes
para que las prueben y reporten problemas. El dogfood testing consiste en que otros
miembros de la compañía desarrolladora lo prueben.
29
Una anomalía es una inconsistencia que puede llevar a una falla pero no necesariamente, por
ejemplo leer una variable no definida (de datos), o saltos fuera de un loop (de control). El
análisis estático permite obtener métricas para la calidad.
En las pruebas dinámicas es importante la trazabilidad de los casos de prueba, pues se pueden
tener muchos. Los tipos de estas pruebas son los siguientes.
Hay varios tipos de pruebas basadas en la lógica. En los grafos de causa-efecto, se tiene en
cuenta las dependencias entre entradas. Cada causa es una condición compuesta por valores
de entrada. Las condiciones se conectan con operadores lógicos, por lo que cada una, y su
causa, puede ser verdadera o falsa. Los efectos son similares, y se transforman en una tabla de
30
decisiones de la cual se sacan los casos de prueba. Para esto se elige un efecto, se ve qué
combinaciones de causas lo provocan y cuáles no, se incluyen en la tabla en una columna y se
eliminan repeticiones. Cada columna es un caso de prueba.
El pairwise testing se usa para examinar interacciones desconocidas entre parámetros que son,
en principio, independientes, buscando interacciones destructivas. Partiendo de las clases de
equivalencia, para cada una se elige un valor representativo y se combina con el representante
de cada una de las otras clases.
No hay un proceso estándar de evolución; puede ser formal o informal, dependiendo del tipo
de sistema. Si hay documentación, la misma debería ser actualizada junto con el sistema.
Luego de una reparación de emergencia, se debería refactorizar el código para mejorarlo.
Técnicas ágiles como desarrollo basado en planes son útiles para hacer cambios en el sistema,
pero pueden tener que ser modificados para mantener un programa. No se puede involucrar a
los usuarios en el equipo porque puede haber muchos stakeholders, o puede tener que
interrumpirse un ciclo para hacer una reparación de emergencia.
Los sistemas de bajo valor empresarial y alta calidad no aportan mucho al negocio, pero no son
caros de mantener. Se puede seguir usando siempre que los cambios no se vuelvan muy
costosos, en cuyo caso hay que desecharlo. El entorno es importante porque los cambios en él
afectan al sistema. Hay que evaluar interoperabilidad, confiabilidad de proveedores, entre
otros. En cuanto a la aplicación, se puede evaluar facilidad de comprensión, documentación,
rendimiento, entre otros.
Puede no ser necesario hacer todos los pasos del proceso de reingeniería. Tiene sus
limitaciones prácticas (no se puede cambiar de paradigma, por ejemplo). La refactorización es
efectiva para reducir los costos de mantenimiento si se hace durante el desarrollo, pero si se
toma un programa con una estructura muy degradada, puede ser casi imposible refactorizar
sólo el código. Puede ser necesario refactorizar el diseño, lo que es más caro y complejo.
32
Un sistema VC distribuido es Git. Este modelo tiene ciertas ventajas: provee un respaldo,
permite trabajar offline y cada uno puede probar el sistema entero en su máquina. Este tipo de
sistema es fundamental cuando varias personas trabajan sobre un mismo sistema. Se pueden
crear varias ramas a partir del mismo código, luego hay que hacer merge. Para ahorrar espacio
y no tener que almacenar varias copias de lo mismo, se pueden guardar deltas, que son las
diferencias entre una versión y otra.
El tamaño y tipo de software influyen en el proceso de gestión de cambios (por ejemplo: quién
sugiere los cambios, el cliente en software particular), pero todos tienen que comprobar,
calcular costo y verificar los cambios. Hay que verificar que una solicitud de cambio sea válida
(no puede hacerse si ya existe o es inválida). Luego se evalúa el impacto en el resto del sistema
y el costo para ver si vale la pena. Esto lo hace el comité.
Por el tema de las diferentes versiones y de dónde provienen sus componentes, es importante
que haya documentación para poder recrear el sistema. Hay que guardar la versión de todo lo
usado.
33
Gestión de proyectos
Un plan de proyecto incluye la organización del mismo, análisis de riesgo, recursos, división del
trabajo y tiempos, entre otros. Al hacer el plan, hay que tener en cuenta restricciones de
tiempo y recursos. Las estimaciones deben ser realistas, considerando que siempre surgen
problemas, y tener planes de contingencia. Hay que ir revisando el progreso con las metas
logradas. Si hay problemas serios que pueden provocar muchos retrasos, hay que replanificar
el proyecto, que puede implicar una nueva negociación con el cliente, e incluso una
cancelación del proyecto si no se logra un acuerdo.