Table Of ContentRediseño de la Arquitectura del
Software y Reimplementación del
Marketplace Uvinum
Memoria del TFG
Alumno: Javier Ferrer
Ponente FIB-UPC: Cristina Gómez
Director empresa: Pablo Ros
26 de octubre de 2015
Agradecimientos
Este trabajo representa una de las mejores oportunidades que se
me han presentado a nivel de reto profesional. Refleja todo lo que he
ido incubando durante estos años gracias a lo que me han aportado
todas las personas que han contribuido a mi conocimiento y forma de
entender esta profesión. Es por esto por lo que lo he disfrutado tanto.
Simplemente me gustaría dar las gracias y hacer explícito mi
respeto a todas las personas que me han permitido descubrir este
mundo tal y como lo he hecho. Por fin tengo algo en lo que materializar
el agradecimiento por todos estos años. Va por vosotros.
2
Tabla de contenido
AGRADECIMIENTOS ........................................... 2
RESUMEN / ABSTRACT ..................................... 10
1. INTRODUCCIÓN ...................................... 12
1.1. El TFG ............................................................................ 13
1.2. Uvinum .......................................................................... 14
1.3. El equipo ....................................................................... 14
2. DESCRIPCIÓN GENERAL .......................... 16
2.1. Conseguir un sistema más mantenible ........................... 16
2.2. Permitir la correcta implementación de test ................... 20
2.3. Automatización y modernización de sistemas ................ 23
2.4. Etapas del proyecto ........................................................ 24
2.4.1. Estudio de los requisitos de Uvinum ....................... 24
2.4.2. Evaluación de la arquitectura actual ........................ 25
2.4.3. Estado del arte ........................................................ 26
2.4.4. Propuesta de rediseño ............................................ 26
2.4.5. Evaluación rediseño propuesto ................................ 27
2.4.6. Plan de formación ................................................... 27
3. METODOLOGÍA Y PLANIFICACIÓN .......... 28
3.1. Metodología ................................................................... 28
3.2. Calendario ..................................................................... 30
3
3.3. Recursos ........................................................................ 30
3.3.1. Personal .................................................................. 30
3.3.2. Materiales ............................................................... 31
3.4. Descripción de las tareas ............................................... 32
3.4.1. Concienciación de principios SOLID ........................ 32
3.4.2. Detectar Code Smells y aplicar Refactorings ............ 33
3.4.3. DDD táctico ............................................................ 33
3.4.4. Código testeable ..................................................... 33
3.4.5. Modernización de sistemas y reducción de fricción en
el desarrollo 34
3.4.6. Análisis estático de calidad del software ................. 34
3.4.7. Deploy orientado a Continuous Deployment ........... 34
3.4.8. Transferencia de conocimiento dentro del equipo ... 35
3.5. Posibles desviaciones ..................................................... 35
3.6. Diagrama de Gantt ......................................................... 35
3.6.1. Concienciación de principios SOLID ........................ 36
3.6.2. Detectar Code Smells y aplicar Refactorings ............ 36
3.6.3. DDD táctico ............................................................ 37
3.6.4. Código testeable ..................................................... 37
3.6.5. Modernización de sistemas y reducción de fricción en
el desarrollo 37
3.6.6. Análisis estático de calidad del software ................. 37
3.6.7. Sistema de Deploy orientado a Continuous Deployment
38
3.6.8. Gantt global ............................................................ 38
4. COSTES ................................................... 39
4.1. Consideraciones iniciales ............................................... 39
4.2. Identificación y estimación de costes ............................. 39
4.2.1. Costes directos ....................................................... 39
4.2.2. Costes indirectos .................................................... 41
4
4.2.3. Contingencia .......................................................... 42
4.2.4. Imprevistos ............................................................. 42
4.2.5. Presupuesto final .................................................... 43
4.3. Control de gestión ......................................................... 43
5. ESTUDIO DE LOS REQUISITOS DE
UVINUM 45
5.1. Requisitos funcionales ................................................... 45
5.1.1. Manager ................................................................. 45
5.1.2. Manager para afiliados ............................................ 51
5.1.3. Uvinum ................................................................... 55
5.2. Requisitos no funcionales .............................................. 64
5.2.1. Facilidad de descubrimiento ................................... 64
5.2.2. Requisito de calidad de reusabilidad ....................... 66
6. EVALUACIÓN ARQUITECTURA ACTUAL .... 67
6.1. Arquitectura física ......................................................... 67
6.1.1. Peticiones web ........................................................ 68
6.1.2. Peticiones a estáticos .............................................. 70
6.2. Arquitectura lógica ........................................................ 72
6.2.1. Proyectos de la aplicación ....................................... 72
6.2.2. Separación en capas MVC ....................................... 73
6.2.3. Principales problemas ............................................. 84
7. ESTADO DEL ARTE ................................... 92
7.1. Diseño ........................................................................... 92
7.1.1. Principios SOLID ...................................................... 93
7.1.2. Code Smells y Refactorings ..................................... 97
7.1.3. Composition over Inheritance ................................. 98
7.1.4. Tell don’t ask .......................................................... 99
5
7.1.5. Contenedor de inyección de dependencias ............ 100
7.2. DDD táctico ................................................................. 101
7.2.1. Arquitectura Hexagonal ........................................ 102
7.2.2. Building Blocks ..................................................... 108
7.2.3. Eventos de dominio .............................................. 114
7.2.4. Read Model ........................................................... 116
7.2.5. Bounded Contexts ................................................ 117
7.3. Cómo soluciona los principales problemas ................... 118
7.3.1. Objetivos a alcanzar (capítulo 2) ........................... 119
7.3.2. Principales problemas de la arquitectura de software
actual (capítulo 6) ..................................................................... 119
7.3.3. Estado del arte analizado (capítulo 7) .................... 119
7.3.4. Relación de problemas y estado del arte ............... 120
8. PRINCIPIOS SOLID ............................... 122
8.1. Propuesta de rediseño ................................................. 123
8.1.1. MediaUploader y MediaPurguer ............................. 123
8.2. Evaluación de la propuesta ........................................... 128
8.3. Formación ................................................................... 129
9. CODE SMELLS Y REFACTORINGS ........... 130
9.1. Propuesta de rediseño ................................................. 130
9.2. Evaluación de la propuesta ........................................... 134
9.3. Formación ................................................................... 134
10. DDD TÁCTICO ..................................... 136
10.1. Propuesta de rediseño ................................................. 136
10.1.1. Arquitectura hexagonal ....................................... 136
10.1.2. Building Blocks ................................................... 145
10.1.3. Read Model ......................................................... 149
6
10.1.4. Eventos de dominio ............................................ 156
10.2. Evaluación de la propuesta ........................................... 157
10.2.1. Beneficios obtenidos ........................................... 157
10.2.2. Desviación de tiempos ........................................ 158
10.3. Formación ................................................................... 159
11. CÓDIGO TESTEABLE ............................ 161
11.1. Propuesta de rediseño ................................................. 161
11.2. Evaluación de la propuesta ........................................... 162
11.3. Formación ................................................................... 162
12. GESTIÓN DEL PROYECTO .................... 164
12.1. Desviaciones producidas .............................................. 164
12.2. Coordinación del equipo .............................................. 165
12.3. Sostenibilidad y compromiso social ............................. 165
12.3.1. Económicamente ................................................. 166
12.3.2. Intangibles .......................................................... 167
12.3.3. Conclusión .......................................................... 167
12.4. Social ........................................................................... 168
12.5. Ambiental .................................................................... 168
13. CONCLUSIONES .................................. 169
13.1. Lecciones aprendidas ................................................... 169
13.1.1. Gestión de equipos ............................................. 169
13.1.2. Planificación ....................................................... 170
13.1.3. Experiencia extrapolable ..................................... 170
13.1.4. A nivel técnico .................................................... 171
13.2. Resultado obtenido ...................................................... 172
13.2.1. Mejora continua .................................................. 172
13.2.2. Testeabilidad ...................................................... 172
13.2.3. Conclusión final .................................................. 173
7
13.3. Trabajo futuro ............................................................. 174
13.4. Justificación de competencias ...................................... 175
13.4.1. Asignaturas relacionadas .................................... 175
13.4.2. Adecuación a la especialidad de ingeniería del
software 177
13.4.3. Competencias técnicas a cubrir ........................... 178
14. REFERENCIAS ..................................... 180
15. TABLA DE FIGURAS ............................. 195
8
9
Resumen / Abstract
Este es un Trabajo Final de Grado (TFG) llevado a cabo en una
empresa real, Verticomm Network S.L. El proyecto consiste en el
rediseño de la arquitectura de software de Uvinum, el software
desarrollado por la empresa. La finalidad de este proyecto es obtener
una arquitectura de Uvinum con un menor coste de mantenimiento, una
mayor modularidad, y que permita una correcta implementación de test.
Para conseguir estos objetivos, el rediseño consistirá en la
evaluación y transformación del sistema de software, pasando del
estudio del sistema actual (altamente acoplado) a la definición de una
arquitectura basada en la Arquitectura Hexagonal y los principios de
diseño de software SOLID.
El éxito del proyecto se supedita a dos factores principales: Que la
nueva arquitectura propuesta sea viable de llevar a cabo en el contexto
de la empresa, y que nadie del equipo técnico se quede atrás en el
proceso de transformación.
--
This is a Degree Final Project accomplished in a real company,
Verticomm Network S.L. The project consists in redesigning the
software architecture of "Uvinum", the system developed by the
company. The purpose of this project is to get an architecture with a
lower maintenance cost, a higher modularity and the possibility of a
proper tests implementation.
In order to achieve these goals, the rethinking process will include
an analysis and transformation of the current system. This process will
go from the study of the current system status (highly coupled) to the
definition of an architecture based on the Hexagonal Architecture and
the SOLID principles.
10
Description:conceptos del Diseño Dirigido por el Dominio (Domain-Driven Design,. DDD [17]) que hemos decidido aplicar en nuestra nueva arquitectura. 2.4.4.