Trabajo Fin de Grado: ADIDAS GSD-MP: Portal de Métricas de Desarrollo de Software de ADIDAS GSD
Trabajo Fin de Grado: ADIDAS GSD-MP: Portal de Métricas de Desarrollo de Software de ADIDAS GSD
Trabajo Fin de Grado: ADIDAS GSD-MP: Portal de Métricas de Desarrollo de Software de ADIDAS GSD
Autor
Director
Javier Pelayo Gil
Ponente
Francisco Javier López Pellicer
La calidad de los proyectos iniciales no es muy buena porque no se puso el esfuerzo necesario en
su momento, sin embargo, con los cambios en la dirección en el departamento de IT en los últimos
años, se está poniendo empeño en mejorar su calidad y su mantenibilidad principalmente. Será
imprescindible monitorizar su progreso y que éste siempre vaya en ascenso.
Sobre los proyectos creados recientemente se exige una calidad excepcional. Conociendo los
errores del pasado se intenta no volver a cometerlos, para ello es necesario controlar estos
proyectos exhaustivamente para tener desde el principio un código legible, mantenible y testeado.
El coste de mantener un código de calidad mientras está siendo desarrollado es inferior a
mejorarlo una vez finalizado.
Así mismo, se dispone de distintas empresas externas que proveen desarrolladores que no
trabajan en el mismo espacio geográfico. Adidas busca obtener los mejores y que estén
cualificados para hacer el trabajo que les corresponde. Debido al gran número de personal es
necesario monitorizar su rendimiento así como su evolución dentro de los proyectos.
Actualmente no existe una herramienta unificada de análisis que, en un vistazo, se pueda observar
esta información tan crucial para que Adidas pueda controlar la calidad y mantener la gran
cantidad de código que genera, siendo competitivos frente a otras empresas del mismo ámbito en
el mundo IT.
A destacar de esta organización encontramos dos tipos de grupos, los grupos verticales que se
dedican a proporcionar funcionalidad para un área determinada de negocio y los grupos
horizontales que dan apoyo a todos los grupos.
El TFG se ha realizado dentro de GSD (Global Software Development), un grupo horizontal que da
soporte a los demás, dedicado a desarrollar y mantener software de calidad, tanto aplicaciones
internas de la compañía como aplicaciones core que son las consideradas causantes de un
beneficio directo como la web de ventas.
Adidas tiene una gran cantidad de proyectos software y por tanto, de desarrolladores, superior a
cien, tanto internos como externos. En GSD se captura una gran cantidad de datos sobre la
calidad de este código que puede ser calificada como Big Data a través de herramientas como
Jira [1] (control de tareas), Sonar [2] (análisis de código), y Stash [3] (almacén de repositorios git).
Esta información es crucial para evaluar tanto a programadores internos como a empresas
proveedoras de software externas. Actualmente no existe una herramienta unificada de análisis
que, en un vistazo, se pueda ver el estado de un proyecto y su evolución con respecto al tiempo.
1.3.2 Estilos
Gracias a Bootstrap [7] es posible crear una aplicación multiplataforma, tanto para móvil, tablet y
ordenador, que además nos ofrece estilos básicos.
Este framework posee una gran comunidad que junto a Google ofrece soporte y gran cantidad de
documentación. Ésta es la principal razón por la que se ha utilizado este en vez de ReactJS. Éste
es un framework similar dirigido más concretamente a componentes, tiene un rendimiento
ligeramente mejor que Angulares, ya que no refresca el DOM completo al detectar un cambio, sino
sólo la parte que ha cambiado. Sin embargo, AngularJS es suficiente en cuanto al rendimiento
para los requisitos recibidos.
Para estilar la página web se va a utilizar el preprocesador de código CSS llamado Less. Éste
permite añadir funcionalidades sobre CSS, como la existencia de variables, funciones y otras
técnicas que permiten hacer que el código CSS sea más legible, mantenible y extendible.
Less deriva de Sass, muy parecido a Less, sin embargo, se ha decidido elegir Less por su mayor
sencillez ya que no se van a necesitar estilizaciones complejas, puesto que las librerías de
gráficos se caracterizan por poder personalizarse libremente.
1.3.3 Alojamiento
Para cumplir los objetivos del proyector se busca una librería JavaScript para gráficos estadísticos
que permita mostrar gráficos personalizables de barras, de líneas, de sectores…
Deben ser responsivos en cuanto a la anchura de la pantalla y deben poder actualizarse en tiempo
real (requisito que no viene desde el negocio sin embargo, como decisión personal de diseño, se
decide añadir este requisito).
Tecnología de render: HTML 5 Canvas vs SVG
Existen dos posibles aproximaciones para generar los gráficos o render: el elemento canvas de
HTML5 y el formato SVG.
El elemento Canvas [10] permite dibujar un mapa de bits sobre una superficie, no tiene capas y
no se tiene conocimiento de lo que está dibujado dentro de éste, lo que implica gran dificultad para
interactuar con el gráfico. Es decir, se podría comparar con una imagen plana. Sin embargo, el
elemento canvas es muy potente en animaciones altamente activas y es capaz de dibujar una
gran cantidad de elementos.
SVG [11] es un formato XML de imágenes vectoriales soportado por todos los navegadores
modernos que permite crear gráficos vectoriales bidimensionales, poseen capas y existen en el
DOM, lo que hace que sea fácil escuchar eventos de interacción con las distintas partes del gráfico.
Permite conocer la posición relativa de los elementos y permite manipularlos usando JavaScript y
CSS. Con SVG la generación de gráficos es un poco más lenta debido a su complejidad. El
rendimiento empieza a ser malo cuando hay más de 1000 elementos en la misma pantalla, un
caso de uso que no se espera.
Aunque ambas soluciones son soportadas en los principales exploradores modernos, para cumplir
los objetivos se va a usar gráficos SVG porque son mucho más fáciles de controlar y manipular.
Como no van a existir animaciones de gran nivel de complejidad y el número de objetos no va a
llegar al límite de rendimiento, no habrá problemas de estas características.
Desde la empresa se decidió seguir un enfoque agile [13] frente al enfoque tradicional o desarrollo
en cascada [14]. Para justificar esta elección antes de empezar este proyecto se ha hecho un
estudio sobre los diferentes enfoques metodológicos. Para ello se han de tener en cuenta los
siguientes aspectos:
Los requisitos no están definidos totalmente e irán evolucionando conforme se vayan
consultando a distintos jefes de proyecto de las distintas áreas de Adidas.
En el análisis inicial del proyecto se han documentado algunas métricas deseadas, sin
embargo, la forma de su visualización no lo está.
La REST API, que será accedida a través de la aplicación para obtener los datos, no está
desarrollada ni totalmente documentada, por lo que es posible que el modelo y la
estructura de datos vaya cambiando respecto al tiempo.
Nuevas métricas podrán ser añadidas según nuevos requisitos aparezcan.
El coste en tiempo será fijo, el correspondiente al trabajo fin de grado.
En los siguientes apartados se van a comparar los dos enfoques y analizar cuál de ellos es el más
adecuado para cumplir los aspectos especificados anteriormente.
Esto repercute en uno de los siguientes problemas: si el proyecto estaba mal definido o
insuficientemente documentado se puede entregar algo que no era lo que se había pedido,
sino lo que se creía que se había pedido. Como se puede ver en la Figura 4, si el proyecto estaba
algo mejor definido es posible entregar lo que el cliente aceptaría pero en muy pocos casos o casi
ninguno se podrá entregar lo que el cliente necesita de verdad porque en muchos casos ni
siquiera él lo sabe.
Finalmente, otro de los mayores problemas del desarrollo tradicional es que el proyecto está fijado
desde el principio, el “scope” es invariable y se estima el tiempo y el presupuesto que podrán
variar como podemos ver en la Figura 5. Si durante su desarrollo cambian los requisitos (algo no
contemplado durante el desarrollo tradicional) el esfuerzo que debe realizarse para adaptar el
proyecto será muy grande o incluso inviable al estar planeado y diseñado desde el principio con
los requisitos iniciales.
Posibilitando el cambio de requisitos a lo largo del tiempo, permite al cliente obtener un producto
que se ajuste a sus necesidades. Sin embargo, y como se puede ver en la Figura 8, muchas veces
se toman decisiones de requisitos que luego se desechan por lo que lleva frecuentemente a tomar
un camino más largo, necesitando más tiempo y más recursos. Sin embargo, el resultado es mejor
que en el desarrollo tradicional.
1.4.4 Conclusión:
Siguiendo las ventajas y desventajas explicadas en el anexo 6 de ambos enfoques, debido a que
el tradicional es muy inflexible y los requisitos del cliente, en este caso el departamento Global IT
de Adidas, no están bien definidos y se irán añadiendo durante el desarrollo, se certifica la
elección del enfoque Agile. La metodología utilizada está detallada en el apartado 3.1 donde se
explica qué acciones se han tomado siguiendo el enfoque seleccionado.
2.1 Análisis
En este apartado se va a abordar cuál es el problema a solucionar y los requisitos que obtenemos
desde negocio a través de épicas, especialmente los tipos de métricas.
2.1.1 El problema
Desde la primera iteración se estableció con claridad que el problema a resolver era el diseño e
implementación de una aplicación web pesada que se ejecutaría en un navegador, la cual
ofrecería al usuario mecanismos para conocer el estado de los distintos proyectos desarrollados
en ADIDAS. Para acceder a la información de estos proyectos, esta aplicación se conectaría a una
REST API que obtiene, a través de servicios externos, una serie de métricas de los proyectos.
Esas métricas son las utilizadas por la aplicación para mostrar los distintos gráficos, que permitirán
al usuario obtener una idea general del estado del proyecto e información más detallada en
determinados aspectos.
Se han seleccionado estas métricas pero se pueden añadir más, y en el futuro se espera que se
haga como se explica en el apartado 4.2.
Adidas tiene gran cantidad de proyectos desarrollados por distintos equipos, por lo que su
visualización en métricas uno por uno sería un caos. Para ello, se agrupan en lo que se denomina
área: conjunto de proyectos que siguen una estrategia común o pertenecen a la misma área de
negocio. Sin ir más lejos, el área a la que el proyecto pertenece está formada por dos proyectos,
GMP-backend y GMP-frontend.
Por tanto, los datos a mostrar se realizarán por áreas. El cálculo de code violations, como de todos
los tipos de defects, será aditivo. Sin embargo, todos los datos porcentuales (documented APIs,
unit test coverage y duplications) y code complexity serán ponderados según el número de líneas
Gracias a las épicas recibidas (requisitos desde negocio de las métricas a mostrar) se obtienen
unos requisitos iniciales. Con ellos se ha hecho un diagrama de casos de uso mostrado en el
Anexo 1. Como se ha mencionado con anterioridad, se obtienen requisitos de forma incremental.
Se empezó con Code Violations y Defects, posteriormente se añadieron los requisitos de
Documented APIs, Unit Test Coverage y Duplications. Los últimos requisitos añadidos fueron
Code Complexity y Defects per developer.
Como se puede ver en la Figura 11, la aplicación Web (cuya arquitectura es explicada en detalle
en el apartado 2.2.2) es alojada en un servidor frontend, al cual los usuarios accederán a través de
un explorador de Internet. La aplicación se comunicará con un servidor backend provisto por
Adidas. Este servidor será el encargado de pedir los recursos tanto a Sonar, Jira y a la base de
datos. Esta máquina se convierte en un gateway (un intermediario) para acceder a los recursos de
Sonar, Jira, Stash y de la base de datos. Su principal objetivo es permitir la persistencia de datos
históricos, los cuales, cada día se guardarán de forma periódica en MongoDB.
Sin embargo, ésta no es la versión, debido al proceso iterativo seguido. La evolución de esta
arquitectura está disponible en el anexo 3.
En cada una de las dos vistas hay un módulo para cada tipo de gráfica (que no para cada métrica).
Ya que aquellas métricas que se representen de la misma forma (ej. gráfica de barras) utilizarán el
mismo módulo para su visualización. Cada módulo sigue la misma estructura; un servicio para
lanzar la llamada adecuada a la REST API (en nuestro caso el servidor de Adidas) utilizando
HTTP [20] y otro servicio para formatear esos datos, de forma que sean representables a través
de la librería correspondiente. Más información en el apartado 2.3.1. Una vez se disponen los
datos se entra en el Modelo-Vista-Controlador. Donde el modelo son los datos recibidos, la vista
corresponderá con el template, se mostrará la gráfica y el controlador será el encargado de ejercer
los cambios correspondientes cuando el usuario interactúe con la aplicación.
El bloque de la configuración corresponderá a todo el funcionamiento de configuración. Será
necesario estar autenticado y tener los permisos adecuados para acceder a esta información,
tanto en lectura como en escritura. Una vez confirmada la autenticidad del usuario, éste podrá
acceder utilizando el mismo modelo descrito con anterioridad. En este caso se extiende la
funcionalidad del servicio HTTP permitiendo hacer las operaciones POST y PUT para guardar
nuevas configuraciones y modificar existentes respectivamente.
En esta arquitectura de módulos, éstos se han ido añadiendo de forma incremental, empezando
con el de estado, al que se le fueron introduciendo las distintas gráficas a mostrar. Posteriormente
el de tendencia y finalmente el de configuración. Gracias al este diseño modular esta aplicación es
completamente escalable en cuanto a la implementación. Se pueden añadir cuantos tipos de
gráficas se desee siguiendo la arquitectura previamente descrita.
Dentro de la vista de estado y de tendencia existe el servicio encargado de controlar qué métricas
deben ser mostradas en la correspondiente vista representada en la Figura 13. Para ello se
dispone de varias constantes listando las distintas métricas a representar de cada vista. Gracias a
éstas genera un modelo de datos para su posterior representación. Este modelo es una lista
ordenada por orden de aparición dentro de la vista. El servicio de control será el encargado de
actualizar estos índices en dos pasos:
1. Cuando se hayan recibido lo datos sin procesar. Http-service será el encargado de realizar
está acción.
2. Cuando se hayan procesado los datos obteniendo aquellos que representar. Data-formatter
será el encargado de llevar acabo esta acción.
Posteriormente, estos datos pasarán al Modelo Vista Controlador donde el servicio de control
habrá acabado ya su tarea.
Además, este servicio es el encargado de detectar si ha habido un error durante el proceso de
carga o formateo de datos mostrando el correspondiente mensaje de error de cara al usuario.
También es el encargado de controlar que el spinner de carga desaparezca cuando la
actualización del índice correspondiente haya sido validada en sus dos pasos.
Como se observa en la Figura 14, en cada llamada a la REST API se hará una comprobación si el
punto de acceso ha sido previamente cargado, de lo contrario éste será cargado de un fichero
propio del proyecto de configuración. Aun así, debido a la arquitectura de AngularJS, esta llamada
seguirá siendo $http. Una vez ésta se ha completado se procederá a pedir el recurso a la dirección
correspondiente de la REST API. Como punto negativo a esta modularidad, en la primera llamada
accediendo al servicio backend se perderán unos milisegundos (en torno a 20), que no causarán
un gran impacto en el rendimiento de la aplicación.
Esta funcionalidad nos permite desplegar el servidor en cualquier máquina sin necesidad de
realizar ningún cambio en el código ni en el paquete creado tras el proceso de empaquetado
(explicado en el apartado 2.5).
Una vista es un conjunto de datos representados numéricamente o a través de gráficas. Éstas han
sido diseñadas para distinguir la forma en la que se muestra la información:
De forma general como la vista de áreas y la principal. Con el objetivo de que el usuario
obtenga de un vistazo unas primeras impresiones sobre las áreas.
De forma más concreta como la vista del estado actual y de tendencia. Éstas están
formadas por las mismas métricas representadas a través de gráficas perteneciendo a una
única área.
Para transmitir la información al usuario sobre un área existen cuatro vistas principales:
Esta vista aparece en la parte superior de la página de inicio que se puede apreciar en la Figura
15. Por defecto se ven las cuatro mejores áreas, sin embargo, el usuario tiene la posibilidad de
configurarlo y tener predefinido las que quiere visualizar una vez esté autenticado en la aplicación.
Esta visión general permite al usuario ver la evolución de un área a lo largo de un año. El dato que
se muestra es porcentual, y es introducido por un administrador de la propia área mensualmente.
No es un valor autogenerado derivado de la información obtenida, al menos de momento.
VISTA PRINCIPAL
Como se puede observar en la Figura 15, en la página de inicio se muestra una tabla con los
proyectos disponibles para ver su información. Desde ella será posible acceder a la vista de
estado actual o de tendencia (explicadas más adelante). Además se muestran numéricamente las
distintas métricas existentes con una marca de color indicando el estado actual total.
En primera instancia se diseñó un mock up de cómo esta vista debería ser, como se puede
observar en la Figura 16.
En esta vista se muestran todas las métricas (si existen) en un momento concreto del proyecto.
Así el usuario es capaz de ver el estado concreto de un proyecto. Es posible seleccionar la fecha
en la que se desea verlo.
TENDENCIA DE ÁREA
Al igual que en la vista de estado actual, se diseñó un mock up con la vista de tendencia, como se
observa en la Figura 17.
Se diseñó una primera versión del mapa de navegación que se puede observar en la Figura 19. A
partir de ahí se implementó en la aplicación siguiendo la misma lógica, como se puede ver en el
Anexo 4. Se observa que la navegación se realiza de forma intuitiva, siendo posible desplazarse
entre vistas y fechas de forma que el usuario no necesite un entrenamiento previo para su uso.
Desde negocio, a través de la herramienta Confluence (anexo 15), se especificó como requisito las
métricas a representar, sin embargo la gráfica a mostrar fue diseñada personalmente. En esta fase
se concreta los tipos de gráficas que se van a utilizar para representar las distintas métricas.
Graficas de barras
Velocímetro
Esta gráfica representa las métricas medidas en porcentajes: Documented APIs, Unit Test
Coverage y Duplications. Para representar una métrica en la que el valor a tomar está dentro de
un rango [0-100] se necesita una gráfica acotada, como en este caso es este velocímetro. Permite
transmitir al usuario que hay un valor máximo y mínimo.
El aro exterior transmite en qué estado (o umbral) se encuentra la métrica. Como se puede ver en
la Figura 21, los umbrales de duplicaciones de líneas de códigos son inversos a Unit Test
Coverage, ya que cuantas menos duplicaciones existan en un proyecto es mejor, mientras que
sucede lo contrario con los test unitario y el código documentado, que cuanto más, mejor.
Gráfico de líneas
Para la vista de tendencias se ha utilizado gráficas de líneas, ya que representan una evolución
temporal. Se ha utilizado el mismo tipo de gráfica en todas las métricas para mantener la
consistencia y porque lo que se representa es lo mismo: las variaciones que ha habido de una
métrica a lo largo del tiempo. Para las gráficas de porcentajes los umbrales siempre estarán
acotados entre 0% y 100%.
Es posible desplegar una leyenda para activar y desactivar líneas, permitiendo al usuario ver las
líneas deseadas. Por defecto, la leyenda no está desplegada porque hace que los gráficos sean
más chatos y que se requiera una altura mayor. Sin embargo, cuando el gráfico está maximizado
la leyenda está habilitada por defecto.
Para representar la visión general de área se ha utilizado un gráfico sencillo y minimalista para no
sobrecargar la página principal. Además, es una representación con un único valor que cambia a
lo largo del tiempo por lo que no exige gran complejidad. Se ha utilizado una librería externa que
permite la renderización de este tipo de gráficos.
Como se puede ver en la Figura 23 se utilizará un gráfico circular de sectores para representar el
número de Defects que un desarrollador tiene asignado, así, de un simple vistazo, se puede
observar la carga de trabajo de cada uno.
En la vista de tendencia se podrá ver el número de defectos que resuelve cada desarrollador con
respecto del tiempo y cuándo esos defectos le han sido asignados.
2.2.7 Seguridad
La aplicación no necesitará una seguridad exhaustiva ya que será de uso abierto para todos
aquellos que estén en la red de Adidas. Sin embargo, requiere autentificación porque los
administradores de cada área serán los encargados de realizar modificaciones a éstas, como se
ha explicado en la sección 2.1.3, en la parte de configuración de proyectos.
La autentificación se envía al servidor provisto por Adidas, como el resto de llamadas. Sin
embargo, esta autentificación no se envía allí sino que se redirige al servidor LDAP. Allí se
guardan todas las credenciales de Adidas, y éste será el encargado de garantizar o no el permiso.
No será necesaria la funcionalidad de registrar usuarios ya que solo se pueden usar estas
credenciales. Se habilitará la función de remember me que, utilizando los cookies del navegador,
será posible mantener la sesión abierta durante un periodo determinado de tiempo.
En esta aplicación existe un “mock server”. Es un servidor (en este caso creado con Express,
librería de NodeJS), el cuál simula los recursos que la aplicación recibirá.
Esta funcionalidad permite que el proceso de desarrollo de software del frontend sea
independiente de un servidor backend o de servicios externos como pueden ser Sonar o Jira.
Además, permite forzar fallos y distintos tiempos de respuesta para que la aplicación web soporte
errores inesperados.
Gráficas de barras
Estas gráficas han sido desarrolladas desde cero con D3.js. Una de las mayores dificultades fue
dar un estilo adecuado con el resto de la página web. Esta gráfica ha ido evolucionando y
mejorándose a lo largo del tiempo, como se puede observar comparando la primera versión
mostrada en la Figura 24 con la versión definitiva.
Velocímetro
Al igual que la gráfica anterior, esta gráfica porcentual ha sufrido modificaciones en cuanto a
implementación a lo largo del tiempo. Su desarrollo se puede apreciar en la Figura 26.
Para esta gráfica se utilizó una librería externa (ngRadialGauge [22]) que se personalizó. Se le
añadió un tooltip, se borraron los números y se añadió un círculo central para marcar el estado de
la métrica. En la Figura 26 se puede ver la evolución sufrida del gráfico a lo largo del tiempo.
Una de las principales razones de la evolución de este gráfico fue debido a que la gráfica no era
intuitiva y su comprensión era ambigua. Los umbrales corresponden al círculo interior y el valor
será el círculo exterior. Sin embargo, esta gráfica presentaba ciertos problemas:
Gráfico de líneas
Para estos gráficos, como el de la Figura 28, se ha utilizado la librería angular-nvd3. Ésta permite
la creación de diagramas utilizando un sencillo objeto de configuración. En esa misma figura se
observa el JSON modelo.
Los pasos a seguir para generar una gráfica son comunes. Como se puede ver en la Figura 29,
primero se recibe información desde el servidor, ésta (según su tipo) es formateada desde la
aplicación web de forma que se puede aplicar a los distintos programas y librerías que utilizamos
para su representación. Cada gráfica tiene su propio controlador AngularJS, el cual contiene la
información de éstas y maneja las diversas funcionalidades que tiene cada gráfica (esconder
columnas, mostrar leyenda, ampliar, etc.).
Como se puede ver en la Figura 30 el objeto recibido es un objeto de tipo JSON, un tipo de datos
estándar en las comunicaciones web.
Su estructura es clara. Un campo para comprobar si hay un error y un contenido en el cual, de
forma genérica, se recibe la información principal como campo obligatorio. Como campo opcional
se reciben los umbrales calificativos de esta información. Gracias a la consistencia de esta
información es posible recibir información de distintas métricas y añadir nuevas métricas con
facilidad y sin tener que hacer grandes cambios al tratamiento de datos.
Finalmente se llegó a un acuerdo de versionado de recursos, tanto de direcciones web como de
estructura de información. Así, con un acuerdo previo entre backend y frontend, era posible
acceder a una configuración previa compatible entre ambos.
2.3.3 Seguridad
Para la autentificación de usuarios se utilizará JSON Web Token (JWT [23]), es un estándar
abierto (RFC 7519) que define una forma compacta y contenida de asegurar la transmisión de
información entre distintas partes a través de objetos JSON [24]. Esta información puede ser
verificada y de confianza porque está firmada digitalmente. Estos Tokens se pueden firmar usando
una clave secreta (utilizando un algoritmo HMAC) o con una clave pública/privada utilizando RSA.
Las principales características de JWT son las siguientes:
Compacto: gracias a su pequeño tamaño, JWT puede ser enviado a través de un
parámetro URL, POST o en un header HTTP. Además, su transmisión será más rápida al
ocupar menos.
Auto-contenido: en el JWT está contenida toda la información relevante sobre el usuario,
por lo que evita hacer varias búsquedas dentro de la base de datos.
Se van a utilizar JWTs solamente para la autentificación del usuario (uso más común), aunque
también se pueden utilizar para el intercambio de información. Una vez que el usuario es
autenticado, en cada llamada al backend será incluido un JWT. Así el backend podrá verificar si
ese usuario tiene permisos para realizar la acción requerida. La única acción que requerirá esta
verificación será la actualización de la configuración de un área o la creación de una nueva.
Se puede encontrar más información sobre la estructura de JWT en el anexo 10.
2.4.1 Enfoque
Se puede ver en la pirámide izquierda de la Figura 31 lo que sería el enfoque tradicional, el cual
consiste en un gran porcentaje de pruebas funcionales, en torno al diez por ciento de integración
(los sistemas se acoplan unos con otros correctamente) y apenas test unitarios. Todas estas
pruebas están hechas por personal dedicado esencialmente a la prueba de aplicaciones.
Como se puede ver en la pirámide derecha de la citada figura, el enfoque ideal es aquel en el que
todas las pruebas están automatizadas. Se priorizan los test unitarios sobre los demás. Gracias al
mayor número de éstos, los test funcionales son menos importantes. Los test de integración se
dividen en componentes y APIs, lo que permite abstraerlos en mayor medida.
Como se ha explicado en los apartados 2.4.1 y 2.4.2, se sigue el modelo de la pirámide ideal ya
que, tanto los test unitarios como los funcionales, están automatizados. Sin embargo, no se han
automatizado los test de integración que se han hecho manualmente. Automatizar éstos sería una
funcionalidad requerida para el futuro.
Como prueba de sistema se aplican test unitarios. Es una forma de comprobar el correcto
funcionamiento de un módulo de código. Esto sirve para asegurar que cada uno de los módulos
funcione correctamente por separado.
Los test funcionales son un proceso de control de calidad. Son una caja negra que basa sus casos
de prueba en las especificaciones de software que se deben cumplir. Estos test se realizan
introduciendo al programa una entrada y observando una salida. Describen lo que el sistema hace,
no comprueban la funcionalidad de un método o clase, sino una parte de la funcionalidad del
sistema completo.
Aplicándose a este proyecto consistiría en pulsar un botón y observar que la salida es correcta.
Concretamente, al pulsar en un botón de esconder una columna del gráfico de barras se observa
que, en efecto, desaparece una.
Se pueden automatizar comprobando la salida a través de cambios en el DOM.
Se ha utilizado la herramienta “Protractor” que permite esta automatización tanto generando la
entrada como comprobando la salida. Protractor [26] es un sistema de test para aplicaciones
AngularJS, sin necesitar complejas configuraciones. Ejecuta estos test contra la propia aplicación
en navegadores de internet reales haciendo la misma interacción que un usuario haría utilizando
eventos. Como funcionalidad a destacar, Protractor espera a que el test anterior haya acabado
para empezar el siguiente, permitiendo al usuario no tener que encargarse de programar este
comportamiento.
Gracias a la metodología usada, Scrum (explicada en el apartado 3.1), al final de cada sprint, en la
reunión correspondiente el Project Owner (el cliente) revisa la aplicación en una demostración
comprobando que todos los requisitos son cumplidos. Estas pruebas de aceptación no están
automatizadas pero se hacen periódicamente.
Como se puede ver en las siguientes imágenes y en el anexo 18, esta aplicación Web, a pesar del
gran tamaño de los datos que tiene que cargar, presenta unos tiempos de respuesta más que
aceptables haciendo que su manejo sea ágil.
3.1 Metodología
Scrum es un proceso de administración y control que siguiendo el enfoque Agile, acaba con la
necesidad de tener unos requisitos iniciales completos. Los equipos son capaces de recibir
requisitos a lo largo del tiempo y proveer software de calidad y funcional cada ciertos periodos de
tiempo.
La metodología Scrum permite una colaboración efectiva entre miembros de un equipo en
proyectos software complejos.
Para entender esta metodología vamos a dividirla en tres partes: artefactos, roles, y reuniones.
3.1.1 Artefactos
3.1.2 Roles
3.1.3 Reuniones
Scrum es una metodología en la que se realizan reuniones con bastante frecuencia. Todas estas
reuniones están prefijadas en el tiempo para promover que se aborden los aspectos importantes y
no se entre en materia de implementación.
Debido a la asiduidad de las reuniones es recomendable que el equipo Scrum esté centralizado
geográficamente.
Hay distintos tipos de reuniones cuya sucesión se puede ver en la Figura 38:
Daily scrum: Se realiza diariamente, con una duración aproximada de 15 minutos, una
reunión en la que cada desarrollador comenta al resto qué tareas ha realizado, la tarea que
está en proceso de desarrollo y la próxima tarea que tomará. Son reuniones que se
deberían hacer de pie, ya que favorece la agilidad de éstas y en las que no se deben tomar
decisiones importantes.
En la Figura 39 se observa el ciclo normal de una tarea. Sin embargo, pueden darse otros casos
en los que una tarea sea incluida a mitad de un sprint o salga, ya que éste ha sido estimado de
forma errónea. También se puede dar el caso de la aparición de un bug con prioridad que deberá
introducirse en el sprint.
4.1 Resultados
Como se ha visto a lo largo de esta memoria, se ha realizado una aplicación web cumpliendo con
los requisitos dados por negocio, en este caso el grupo de GSD de Adidas. Gracias a esta
aplicación, se facilita el control de todos los proyectos de este equipo. Además se espera
extenderla a otros grupos de la compañía para controlar sus propios proyectos. La web ya está en
funcionamiento en fase beta donde ha sido introducida en los proyectos más recientes y se ha
incluido de base en aquellos nuevos.
La información mostrada sobre desarrolladores es limitada pero suficiente para observar una
visión general sobre el estado actual de cada uno y su evolución.
Las opiniones recibidas de los jefes de proyecto son positivas ya que las métricas mostradas son
precisas y permiten ver los avances de un proyecto de un vistazo. Además la configuración es
intuitiva ya que tienen amplios conocimientos de Sonar y Jira.
Los desarrolladores también han transmitido su aprobación ya que les permite tener una visión
general del proyecto que durante el desarrollo es difícil tener. Además, gracias a esto, pueden
comprobar de primera mano que los esfuerzos realizados están teniendo sus frutos fomentando la
percepción del trabajo producido.
Próximamente la aplicación será presentada al CEO de la rama de IT, donde se espera que cause
un buen impacto y se impulse su utilización en distintos ámbitos de monitorización, así como
ponerla en grandes pantallas que están distribuidas a lo largo de los departamentos.
Es una aplicación propia de Adidas, sin embargo se puede aplicar a cualquier proyecto software
que use Jira como gestor de tareas y Sonar como medidor de calidad de código. Además no
importa el estado de madurez, ya que la aplicación permitirá acceder a datos antiguos de las
herramientas de métricas.
Se puede observar claramente la aplicación en el apartado de navegación y en el anexo 11 de
gráficas. Se ha puesto detalle en que los estilos queden consistentes unos con otros.
Se empezó, como se puede ver en la Figura 47, accediendo directamente a las APIs expuestas de
Sonar y Jira.
A la primera versión se le añade una base de datos MongoDB para añadir control de usuarios a la
aplicación y así permitir modificaciones en cuanto a proyectos y umbrales.
En la tercera versión se añade el servidor provisto por Adidas. Sólo se diferencia de la última
versión en que Stash no está integrado por el momento.
Enfoque Agile
Ventajas
1. Permite cambios después del planeamiento inicial.
2. Permite añadir funcionalidad para mantener actualizado el producto con respecto al resto
de la industria.
3. Al final de cada “sprint” el proyecto es evaluado. Esto permite al cliente dar su opinión y así
obtener un producto que se ajuste más a sus necesidades.
4. La fase de test en cada “sprint” asegura que los bugs son detectados en un estado
temprano y no afectarán al desarrollo final.
5. El proyecto podría ser lanzado a desarrollo al final de cada “sprint”.
Desventajas
6.7.2 Principios
Los JSON Web Tokens tienen la siguiente estructura: “xxxxx.yyyyy.zzzzz”. Serado por puntos el
header, contenido y firma:
Header: contiene el tipo (JWT) y el algoritmo hash.
iss: Editor
sub: Sujeto
aud: Audiencia
Firma: Se usa para verificar que el emisor del JWT es quién dice ser y para asegurarse
que el mensaje no ha cambiado mientras se estaba enviando. Para crear la firma es
necesario codificar el header, el contenido y junto con una contraseña utilizando el
algoritmo especificado en el header codificarlo.
6.15 Confluence
Es una herramienta web en la que se documentará los requisitos de negocio. En las siguientes
imágenes se pueden ver algunos de los requisitos que se recibieron desde negocio a través de
mock ups.
En la Figura 81 se muestra el mapa de navegación con las distintas ventanas y redirecciones que
la aplicación debe soportar.
En la Figura 84, la Figura 85 y la Figura 86 se muestra el primer análisis de las métricas a mostrar.
Es una guía, no es definiitivo ya que Unit test coverage no fue un gráfico de barras finalmente.