Acerca de arc42
arc42, La plantilla de documentación para arquitectura de sistemas y de software.
Por Dr. Gernot Starke, Dr. Peter Hruschka y otros contribuyentes.
Revisión de la plantilla: 7.0 ES (basada en asciidoc), Enero 2017
© Reconocemos que este documento utiliza material de la plantilla de arquitectura arc42, https://www.arc42.org. Creada por Dr. Peter Hruschka y Dr. Gernot Starke.
1. Introducción y Metas
Nuestro equipo de desarrollo ha sido contratado por la empresa HappySW para la creación de una aplicación de preguntas y respuestas similar al programa de RTVE "Saber y Ganar". Nuestro objetivo para este proyecto será:
-
Crear una aplicación web con preguntas creadas automáticamente, haciendo así un juego mucho más dinámico y actualizado.
-
Los usuarios podrán crear su propia cuenta para acceder al historial de sus partidas.
1.1. Vista de Requisitos
A continuación se muestran los requisitos de alto nivel para el desarrollo del juego.
Requisito | Descripción |
---|---|
Creación de usuarios |
Para acceder al juego, el usuario tendrá que estar registrado en la aplicación. |
Historial |
Un usuario registrado podrá consultar los resultados de sus anteriores partidas a través de un historial. |
Preguntas creadas automáticamente |
A partir de los datos de Wikidata se crearán las preguntas del juego, asi como sus respuestas. |
Condiciones de juego |
Habrá un tiempo limitado de respuesta para cada pregunta |
Acceso a información por parte del Sistema |
El sistema tendrá acceso a la información de los usuarios, además de las preguntas generadas. |
Para información más detallada, se puede consultar el documento completo proporcionado por la empresa aquí .
1.2. Metas de Calidad
Atributo de calidad | Descripción |
---|---|
Usabilidad |
La interfaz de usuario será sencilla de entender y de usar |
Adaptabilidad |
La aplicación se podrá usar en distintos dispositivos |
Disponibilidad |
La aplicación estará disponible y funcionando la mayoría del tiempo |
Seguridad |
Los datos personales del usuario serán guardados de manera segura |
1.3. Partes interesadas (Stakeholders)
Rol | Contacto con la aplicación | Expectativas |
---|---|---|
Usuarios |
Interaccionan directamente con la aplicación |
Esperamos que el usuario considere nuestra aplicación divertida, accesible y usable. Además de que las preguntas les parezcan interesantes y no repetitivas |
Equipo de desarrollo |
Son las personas encargadas de realizar el proyecto |
Crear una aplicación sólida y mantenible en el tiempo, aprendiendo nuevas tecnologías |
RTVE |
Es la empresa contratante |
Espera obtener una versión online experimental de un concurso de preguntas y respuestas similar a “Saber y Ganar” |
HappySw |
Es la empresa de desarrollo de software |
Que el equipo de desarrollo realice un producto de buena calidad para que la empresa contratante este satisfecha con el producto final |
Profesores Arquitectura del Software |
Personas encargadas de evaluar el proyecto |
Esperan que el equipo de desarrollo cumpla con los requisitos obligatorios en la aplicación final |
2. Restricciones de la Arquitectura
2.1. Restricciones técnicas
Restricción | Explicación |
---|---|
API Wikidata |
Las preguntas y soluciones a estas deben ser generadas a través de la API de Wikidata, que permite acceder a toda la información alojada en ella. Sin embargo, esta información puede ser poco fiable debido a que es de acceso público y puede ser modificada por cualquiera. También se debe tener en cuenta la estructura de Wikidata a la hora de acceder a los datos, ya que se basa en entidades y relaciones, además del tiempo de acceso a esta API la cual puede ralentizar el juego. |
Desplegar la aplicación en un servidor |
La aplicación se debe desplegar en un servidor y que esta sea accesible desde un navegador. En este caso, para desplegar la aplicación se usa una máquina virtual creada en Azure, lo que puede suponer un problema si no se usa cuidadosamente ya que se puede agotar el crédito gratuito. |
GitHub |
Todo el código de la aplicación se alojará en GitHub y se usarán ramas para ejecutar cualquier tipo de cambio significativo a la aplicación. Los commits deben tener nombres explicativos y podría haber conflictos en los merge. |
Pruebas |
Se crearán pruebas de distintos tipos. La aplicación debe pasar estas pruebas para asegurar su funcionamiento, el fallo de alguna de las pruebas bloqueará el despliegue. |
2.2. Restricciones de organización
Restricción | Explicación |
---|---|
Equipos de 4-6 personas |
El trabajo será repartido entre 4-6 miembros del grupo. Estos deberán coordinarse para llevar a cabo el trabajo en conjunto. |
Actas e Issues |
Todas las decisiones y trabajo hecho se debe ver reflejado en el GitHub del grupo. Cada semana se deben hacer actas donde se tomen decisiones y se reparta el trabajo, que se verá reflejado en los issues. |
Evaluaciones intermedias |
Cada 3 semanas el proyecto será evaluado y se tomarán nota de los avances y correcciones que se deben hacer para la siguiente evaluación |
2.3. Restricciones políticas
Restricción | Explicación |
---|---|
Documentación en formato Arc42 |
La documentación debe seguir la estructura Arc42. |
3. Alcance y Contexto del Sistema
3.1. Contexto de Negocio
Socio de Comunicación |
Entrada |
Salida |
Usuario |
- |
Uso del juego |
Base de Datos |
Guarda información relevante de la aplicación (usuarios, preguntas base) |
Envía la información requerida a la aplicación |
API Wikidata |
Recibe una consulta relacionada con la pregunta a construir |
Envía los datos que la aplicación ha pedido para la pregunta |
3.2. Contexto Técnico
Tecnologías utilizadas |
Descripción de uso |
Azure Cloud |
Utilizado para el despliegue de la aplicación |
MongoDB |
Base de datos NoSQL para guardar la información de la aplicación, como los usuarios y las preguntas base |
Navegadores |
Permiten al usuario acceder a la aplicación una vez desplegada |
React, JavaScript, HTML, CSS |
Lenguajes utilizados para la creación del juego |
4. Estrategia de solución
4.1. Decisiones Tecnológicas
-
Microsoft Azure: es una plataforma de computación en la nube que ofrece servicios de infraestructura, plataforma y software como servicio, para poder administrar servicios en línea.
-
MongoDB: es un sistema de bases de datos NoSQL, es decir, una base de datos orientada a documentos. Este almacena datos con formato similar JSON, que no tienen que cumplir con una estructura predefinida.
-
JavaScript: es un lenguaje de programación interpretado, dialecto del estándar ECMAScript. Se utiliza para crear páginas web dinámicas.
-
React: es una biblioteca de JavaScript para construir interfaces de usuario.
-
WikiData: es una base de datos libre, colaborativa y multilingüe, que sirve como una base de datos secundaria y que recopila datos estructurados para dar soporte a Wikipedia, Wikimedia Commons…
-
Docker: se utiliza para hacer el despliegue de la aplicación.
-
Bootstrap: es un framework de código abierto para el diseño de sitios y aplicaciones web.
4.2. Motivaciones
Hemos escogido TypeScript por su mayor parecido a Java, ya que nuestro equipo en su mayoría lo domina. En cuanto React nos basemos en que fácilmente se puede crear interfaces. El resto de tecnologías son las más óptimas y las preestablecidas, en el proyecto. Realmente estamos a la espera de los resultados de estas decisiones, ya que en su mayoría son tecnologías desconocidas para el equipo.
-
Microsoft Azure: la universidad nos proporciona crédito para Azure, por lo que no tendremos que pagar por el servicio y es una plataforma que ya conocemos por otras asignaturas del grado.
-
MongoDB: el formato de los datos de MongoDB nos facilita mucho el guardado de datos en la aplicación
-
JavaScript: aunque no lo dominamos completamente, es un lenguaje que nos era familiar y muy usado en el desarrollo web, además combinamos su uso con la biblioteca de React.
-
React: esta biblioteca facilita el uso de los componentes de la aplicación y, además el proyecto inicial lo usaba por lo que no se ha tenido que construir la aplicación desde cero.
-
WikiData: su uso es un requisito obligatorio de esta aplicación pero su sistema de consultas SPARQL ha resultado muy útil a la hora de obtener las preguntas de forma dinámica y actualizada para el juego.
-
Docker: ya configurado en el proyecto inicial por lo que pudimos crear contenedores de forma sencilla.
-
Bootstrap: permite crear la interfaz de usuario de forma más sencilla y con diseños más agradables al cliente.
4.3. Decisiones sobre cómo alcanzar los objetivos clave de calidad
-
Usabilidad: Será una aplicación sencilla, sin demasiados distractores y con los enlaces necesarios para el funcionamiento correcto del juego únicamente. Se tratará de que resulte intuitiva y fácil de usar.
-
Seguridad: Se configurarán los endpoints para que un usuario no autentificado pueda acceder a partes restringidas de la aplicación. Además los usuarios serán guardados con su contraseña encriptada.
-
Disponibilidad: El uso de Azure nos garantiza un 99,9% de disponibilidad, aunque hay que restar la dependencia que tenemos con otros servicios como Wikidata o MongoDB, de todas maneras se tratará de que la aplicación tenga la mayor disponibilidad posible.
-
Utilizaremos el patrón MVC(Modelo, Vista, Controlador): Facilita la modularidad, la reutilización y el mantenimiento del código, provocando una aplicación eficiente.
4.4. Decisiones organizativas:
-
Las tareas se reparten teniendo en cuenta las habilidades de cada uno de los integrantes del equipo y su disponibilidad.
-
Los miembros del equipo mantenemos comunicación más directa a través de WhatsApp y Discord para las dudas que surjan u otras decisiones que haya que tomar en conjunto.
-
Si un miembro del equipo tiene problemas con su tarea, entre los integrantes del grupo se resolverá.
-
Durante el laboratorio de la asignatura, se realizarán reuniones en las que se expondrá el trabajo realizado y si alguno ha tenido algún problema con su tarea.
-
Si algún miembro decide abandonar el proyecto, se repartirán sus tareas pendientes entre los miembros restantes.
5. Vista de Bloques
5.1. Sistema General de Caja Blanca
Nombre | Descripción |
---|---|
Wikidata |
Para formular las preguntas se extraerá información de WikiData a través de su API. |
Base de datos |
Se guarda información importante, como los datos de los usuarios y sus historiales. |
Users |
Permite a los usuarios registrarse e identificarse, además de iniciar la aplicación. |
Cliente |
Accede a la aplicación y interactúa con ella a través de la interfaz de usuario. |
5.2. Sistema general de caja negra
Nombre | Descripción |
---|---|
Aplicación |
Toda la aplicación se encapsula aquí. |
5.2.1. <Caja Negra 1>
Nombre | Descripción |
---|---|
Vista |
Toda la parte gráfica de la aplicación y que se comunica con el usuario. Se comunica con el controlador a base de eventos producidos por el usuario. |
Modelo |
Lleva a cabo todos los cálculos necesarios para el funcionamiento de la aplicación. También se comunica con los sistemas para conseguir la información necesaria. |
Controlador |
Comunica la vista y el modelo. Es el encargado de controlar el flujo de la aplicación. |
6. Vista de Ejecución
6.1. Registrar usuario
Un usuario se registra para poder jugar.
6.2. Iniciar sesión
Un usuario que ya está registrado, inicia sesión con su usuario y contraseña para jugar.
6.3. Ver historial
Un usuario quiere ver su historial del juego.
6.4. Jugar y generación de preguntas
Un usuario procede a jugar, se generan las preguntas y a continuación iniciará el juego.
7. Vista de Despliegue
7.1. Nivel de infraestructura 1
- Motivación
-
Debido a los diferentes requisitos especificados para esta aplicación se ha decido seguir la estructura descrita más abajo. Se han escogido las herramientas de acuerdo a los medios disponibles ya que no se dispone de presupuesto para este proyecto y, además, algunas de ellas, como Azure, ya eran conocidas por el equipo por lo que es más sencillo su uso.
- Características de Calidad/Rendimiento
-
Para una disponibilidad de la aplicación a los clientes desde un navegador de forma sencilla, se ha decido usar un servicio en la nube como Azure.
- Mapeo de los Bloques de Construcción a Infraestructura
-
A continuación se muestra el diagrama de despliegue de esta aplicación:
7.2. Nivel de Infraestructura 2
En el siguiente diagrama se ve más a fondo el despliegue de nuestra aplicación, así como los distintos componentes que forman el proyecto. Además se puede ver el uso de docker como forma de contenedor para después desplegarlo en Azure Cloud.
8. Conceptos Transversales (Cross-cutting)
Modelo de la aplicación:
clase Usuario { username: String password: String createdAt: String } clase Record { username: String correctQuestions: int totalQuestions: int totalTime: int doneAt: Date } clase Pregunta { pregunta: String correcta: String incorrectas: Array<String>(3) }
8.1. Arquitectura principal
Hemos decidido utilizar una arquitectura de microservicios, dividiendo la aplicación en módulos. Estos módulos a su vez, se estructurarán con el patrón MVC.
8.2. Reglas de implementación
Como es un proyecto en equipo creemos que la colaboración es lo más importante, por eso hemos decidido comentar lo máximo posible nuestro propio código para que sea entendible por otras personas/compañeros de equipo.
8.3. Interfaz de usuario.
Queremos crear una aplicación accesible para todos los usuarios, que sea simple de entender y de jugar, que lo máximo que tengas que pensar sean las preguntas del juego.
8.4. Privacidad
Los usuarios se tienen que autenticar para poder utilizar la aplicación, además sus contraseñas están encriptadas.
9. Decisiones de Diseño
Problema | Decisión | Explicación |
---|---|---|
Base de datos |
Usar MongoDB |
Usaremos MongoDB porque ya está implementado en el sistema de login de usuarios. |
Frontend |
React |
Usaremos React para crear las interfaces de usuario debido a su facilidad de uso. |
BackEnd |
Node.js |
Escogimos Node.js debido a su compatibilidad. |
Arquitectura |
MVC |
El modelo MVC nos permite separar las capas para mantener el código ordenado, mantenible y es familiar para los integrantes del grupo. |
Arquitectura |
Microservicios |
El modelo de microservicios se ajusta muy bien a las necesidades de la aplicación. |
10. Requerimientos de Calidad
10.1. Árbol de Calidad
10.2. Escenarios de calidad
Descripción |
Atributo de calidad |
Escenario |
La aplicación tendrá una interfaz de usuario sencilla, con botones que indiquen que es cada cosa, y colores que harán que se entienda mejor |
Usabilidad |
El usuario quiere utilizar la aplicación con facilidad |
La aplicación podrá ser usada en distintos dispositivos |
Adaptabilidad |
Un usuario podrá usar la aplicación en móvil, tablet u ordenador |
La aplicación estará disponible el 95% del tiempo. |
Disponibilidad |
Un usuario accede a la aplicación a las 6 de la tarde y esta estará disponible |
Los datos de cada usuario estarán guardados de forma segura |
Seguridad |
El usuario quiere que solo él pueda acceder a sus datos |
11. Riesgos y deuda técnica
11.1. Riesgos
Riesgo | Explicación |
---|---|
Trabajo en equipo |
La falta de coordinación y comunicación puede llevar a malos resultados en el trabajo. Tampoco tenemos experiencia trabajando en una aplicación desde 0. |
Abandono de miembros del equipo |
Si uno o más miembros abandonan el equipo de desarrollo, la carga de trabajo para el resto se incrementará y, por tanto, aumentará la probabilidad de errores y deuda técnica por falta de tiempo. |
Falta de experiencia con WikiData |
No estamos muy familiarizados con WikiData y su estructura. Tenemos que aprender a hacer queries a la API de WikiData. |
Desconocimiento de algunas tecnologías utilizadas como NodeJS o React |
Hasta el desarrollo de esta aplicación no habíamos trabajado con estas tecnologías y, por tanto, pueden ocasionar errores o retrasos durante el aprendizaje de las mismas. |
11.2. Deuda Técnica
Se ha ocasionado deuda técnica en el proyecto debido en gran medida a la falta de tiempo y al abandono de 4 miembros del equipo, 2 de ellos nunca se presentaron y los otros 2 abandonaron la asignatura durante el desarrollo. A continuación se indican las principales decisiones tomadas que han ocasionado deuda técnica en este proyecto:
Deuda Técnica | Explicación |
---|---|
Pruebas de carga |
No se han podido realizar pruebas de carga ya que por los factores anteriormente indicados, decidimos priorizar las pruebas unitarias y las de end to end frente a las de carga. |
Requisitos opcionales |
Se ha priorizado aquellos requisitos obligatorios frente a los opcionales, pudiendo realizar solo uno de estos. |
Rendimiento de las preguntas |
Nos gustaría haber tenido el rendimiento como atributo de calidad pero debido al abandono de varios miembros del grupo se decidió dar prioridad a terminar el proyecto completo, que a mejorar otros aspectos como el rendimiento. |
12. Pruebas realizadas
A continuación se recogen los diferentes tipos de pruebas realizados para garantizar el correcto funcionamiento de la aplicación y cumplir con el límite de coverage del 80% que se requería para el proyecto.
12.1. Pruebas Unitarias
Se han realizado un total de 43 pruebas unitarias repartidas entre los servicios y componentes de la aplicación. Se ha utilizado la librería Jest para realizar estas pruebas, además de otras más especializadas dependiendo del test como la librería de testing de React para los componentes o Axios para simular las llamadas a los endpoints.
Con estos test se ha conseguido cubrir un 90'9% del código presente en la aplicación, proporcionando una alta fiabilidad del correcto funcionamiento de la misma. A continuación se muestra el resumen proporcionado por SonarCloud sobre la calidad de nuestro código:
12.2. Pruebas E2E (End to End)
Se han realizado 5 pruebas E2E a las funciones más importantes de la aplicación: Login, register, Game y Record. Estas pruebas se han realizado utilizando las librerías de Puppeteer y Jest-Cucumber, las cuales nos permiten probar su funcionalidad utilizando Chromium.
13. Glosario
Término | Definición |
---|---|
GitHub |
Plataforma de desarrollo colaborativo. Todo el código del equipo, su trabajo realizado y sus reuniones se documentan aquí. |
MongoDB |
Es un sistema de base de datos NoSQL, orientado a documentos. La base de datos de nuestra aplicación esta hecha con MongoDB. |
MVC |
Modelo de arquitectura de software. Las aplicaciones que siguen este modelo se dividen en 3 capas, Modelo, Vista y Controlador. |
Node.js |
Es un entorno en tiempo de ejecución para la capa del servidor basado en JavaScript. La usaremos para gran parte de el back-end de la aplicación. |
Query |
Conjunto de palabras o frase que se utiliza cómo término de búsqueda. Usaremos queries para conseguir información de la base de datos o de WikiData. |
React |
Biblioteca JavaScript diseñada para crear interfaces de usuario. La usaremos para hacer el front-end de la aplicación. |
WikiData |
Base de conocimientos con una gran cantidad de datos. Extraeremos datos de WikiData a través de la API que nos proporciona. Construiremos las preguntas con estos datos. |