#phpirstaid - replanteamiento de diseño de software
TRANSCRIPT
Replanteamiento de diseño de
Software
#PhpirstAid
#scbcn15 // #PhpirstAid
¡Bienvenidos!Soy Javier Ferrer González
@JavierCane en Twitter
Desarrollador web en @uvinum_es
Gañán en @CodelyTV
#scbcn15 // #PhpirstAid
Agenda
Contexto Objetivos
Plan de acción Conclusiones
Problemas
#scbcn15 // #PhpirstAid
Agenda
Exploración Objetivos del paciente
Tratamiento Diagnóstico final
Síntomas
#scbcn15 // #PhpirstAid
Exploración1
Uvinum: Marketplace bebidas alcohólicas
#scbcn15 // #PhpirstAid
El pacienteESTÁ VIVO
151.000.000Peticiones mensuales de media
#scbcn15 // #PhpirstAid
Oficina
Web disponible en 14 países
#scbcn15 // #PhpirstAid
5Años en activo
2M €Inversión total en 3 rondas
6 / 22Desarrolladores / Empleados totales
#scbcn15 // #PhpirstAid
Objetivos del paciente2
#scbcn15 // #PhpirstAid
1. Aumentar tolerancia a cambios (Ejemplo API)
Place your screen
shot
here
“
#scbcn15 // #PhpirstAid
Walking on water and developing software from a specification are easy if both are frozen
-Edward V. Berard
“
#scbcn15 // #PhpirstAid
Las especificaciones CAMBIAN
-Sabiduría popular
“
#scbcn15 // #PhpirstAid
Las especificaciones LAS CAMBIAMOS
#scbcn15 // #PhpirstAid
2. Permitir una correcta implementación de test
#scbcn15 // #PhpirstAid
Pirámide de test
#scbcn15 // #PhpirstAid
Software testing ice-cream cone anti-pattern
#scbcn15 // #PhpirstAid
3. Evitar muerte por deuda técnica (velocidad de desarrollo)
#scbcn15 // #PhpirstAid
Muerte por deuda técnica
#scbcn15 // #PhpirstAid
Deuda técnica
#scbcn15 // #PhpirstAid
Complejidad accidental vs. Complejidad esencial
Complejidad esencial
Complejidad accidentalC
omp
leji
dad
sis
tem
a
Tiempo
#scbcn15 // #PhpirstAid
4. Sentir motivación por cómo hacemos lo que hacemos(Software Craftsmanship)
#scbcn15 // #PhpirstAid
Síntomas3
#scbcn15 // #PhpirstAid
1ª visita~Finales 2014
#scbcn15 // #PhpirstAid
Síntomas
■ Falta de test■ Código altamente acoplado
■ Al framework (clases Controller y Model)■ A librerías externas■ A implementaciones concretas
■ Falta de modelado del dominio■ “Modelos” obesos■ Controladores obesos■ Código de difícil lectura
#scbcn15 // #PhpirstAid
■ Falta de test => Reticencia al cambio/descontrol■ Alto acoplamiento => Poca cambiabilidad
Síntomas
#scbcn15 // #PhpirstAid
Tratamiento4
#scbcn15 // #PhpirstAid
Tratamiento por etapas
Diseño“alto nivel” Procesos
Transferencia conocimiento
Replanteamiento diseño “bajo nivel”
#scbcn15 // #PhpirstAid
■ OOP■ Clean Code■ Code Smells■ Refactoring■ Principios SOLID■ Object calisthenics
Etapa diseño a “bajo nivel”
■ Composition Over Inheritance
■ Tell don’t ask■ Ley de Demeter■ DRY■ YAGNI■ …
#scbcn15 // #PhpirstAid
Clean Code - Naming
Clean Code Refactoring - Antes
#scbcn15 // #PhpirstAid
Clean Code Refactoring - Después
■ Naming■ Guard clause■ Extract method■ Introduce
explanatory variable
Diseño “alto nivel” -> Domain-Driven Design
#scbcn15 // #PhpirstAid
Arquitectura Hexagonal
#scbcn15 // #PhpirstAid
Arquitectura Hexagonal
■ Ports & Adapters■ Programación contra contratos / DIP FTW
■ Separación en capas■ Cambiabilidad
■ Regla de dependencia de fuera hacia dentro■ Bajo acoplamiento
#scbcn15 // #PhpirstAid
■ Hexagonal Architecture, @fideloper
■ Hexagonal Architecture with PHP, @buenosvinos
■ Repo■ Application Services vs. Infrastructure Services vs. Domain
Services, @BenNadel
Takeaways
Capas Arquitectura Hexagonal
DDD - Agregados
DDD - Agregados - Clientes
DDD - Value Objects
#scbcn15 // #PhpirstAid
Usando agregados y demás para listados
■ 1 Query por AR■ Agregados pequeños
=> Muchas queries■ MUCHAS:■ No vale cache■ Complejidad
#scbcn15 // #PhpirstAid
Usando agregados y demás para listados
#scbcn15 // #PhpirstAid
Usando Write Model para listados
#scbcn15 // #PhpirstAid
DDD - Read Model
■ Ataca a la misma BBDD (progresivo)■ Permite violar restricciones del Write Model (WM)
para optimizar rendimiento■ No usa el dominio del WM para evitar pervertirlo■ Basado en DTOs
DDD - Read Model
#scbcn15 // #PhpirstAid
Takeaways
■ Validation in DDD, @eulerfx
■ Read-models as a Tactical Pattern in DDD, @eulerfx
#scbcn15 // #PhpirstAid
Read Model Composer
■ Finalidad: Agilizar desarrollo Read Model■ Reutilizar DTOs y “repositorios dependientes”■ Tradeoff que decidimos asumir :)
Read Model Composer Builder - Uso
#scbcn15 // #PhpirstAid
Read Model
Composer
Builder -
Implementació
n
Read Model Composer Builder - Implementación
#scbcn15 // #PhpirstAid
Read Model Composer Builder - Definición servicio
#scbcn15 // #PhpirstAid
Read Model Composer Builder - Implementación Projector
RM Composer Builder - Implementación Projector
#scbcn15 // #PhpirstAid
Read Model Composer Builder - Implementación Projector
RM Composer Builder - Implementación Joiner
#scbcn15 // #PhpirstAid
RM Composer Builder - Diagrama de clases
Procesos -> Composer + CI
“
#scbcn15 // #PhpirstAid
Sólo conseguiremos anular la reticencia al cambio con procesos que no generen
fricción innecesaria
#scbcn15 // #PhpirstAid
Elementos introducidos
■ Actualización PHP 5.6■ Composer■ Continuous Deployment: Push a master => deploy
■ Único repositorio■ GitHub■ Capistrano
Transferencia conocimiento -> Rethinking Code
#scbcn15 // #PhpirstAid
Cómo implicar al equipo
#scbcn15 // #PhpirstAid
Sesiones Rethinking Code
■ Semanalmente■ 2 - 3 horas■ Equipo arquitectura■ Informales■ Casos prácticos
#scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Diseño “a bajo nivel”
1. Controllers menos Controllers2. SOLIDificando Verticomm3. Code Smells4. Refactoring, Clean Code & Tips5. Composition over Inheritance & Design Patterns6. Shotgun Surgery, DTOs & DIC
#scbcn15 // #PhpirstAid
Hablar de SOLID en un entorno legacy
#scbcn15 // #PhpirstAid
Takeaways
■ The SOLID Principles, @Tutsplus■ Code Smells & Refactorings, @RefactoringGuru■ Design Patterns, SourceMaking■ Screencasts de SOLID, @CodelyTV■ Ejemplos de código propio (involucrar, motivación)
#scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Diseño “a alto nivel” (1/2)
7. Teoría Hexagonal Architecture8. Workshop Hexagonal Architecture9. DDD Building Blocks - Value Objects
10. DDD Building Blocks - Values Objects Workshop11. DDD Building Blocks - Entities & Aggregates12. DDD Building Blocks - Entities & Aggregates Workshop
#scbcn15 // #PhpirstAid
■ The Two Sides of Domain-Driven Design (DDD), @eulerfx
■ Repo Symfony MPWAR Edition, @Eloipoch y @SergiGP
■ Domain-Driven Design in PHP, @buenosvinos @theUniC y @KeyvanAkbary
■ Implementing Domain-Driven Design, @VaughnVernon
■ Ejercicios con contexto propio (acercar)
Takeaways
#scbcn15 // #PhpirstAid
13. Dominio vs. Aplicación vs. Infraestructura y DI14. Use Read Model, stay legen...dary, y lo otro ya tal15. Read Model Workshop16. Pedidos conjuntos17. Event Driven Development
Sesiones Rethinking Code - Diseño “a alto nivel” (2/2)
#scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Testing
18. First tests exercises19. TDD with legos20. Setting up phpunit,
asserts and testing types21. …
#scbcn15 // #PhpirstAid
■ TDD and Refactoring with LEGO, Bryan Beecham
Takeaways
#scbcn15 // #PhpirstAid
Diagnóstico final5
#scbcn15 // #PhpirstAid
■ Equipo arquitectura■ Composer■ SOLID■ Dependency Injector Container■ Arquitectura Hexagonal
■ Lógica desacoplada del framework■ Eventos
Puntos de inflexión
#scbcn15 // #PhpirstAid
Errores cometidos
■ Gestión inicial del equipo de arquitectura■ Cuello de botella a la hora de resolver dudas
■ Intentar encajar Write Model en Read Model■ Subestimar impacto■ Subestimar Bounded Contexts
“
#scbcn15 // #PhpirstAid
Si tu aplicación no es compleja, no te líes con DDD.Tira por CRUD y no hay problema.
-Dicho popular
#scbcn15 // #PhpirstAid
¿Existen las “aplicaciones” complejas?
“
#scbcn15 // #PhpirstAid
Una aplicación compleja tendrá partes donde NO merecerá la pena aplicar DDD
#scbcn15 // #PhpirstAid
Pasito a Pasito Driven Development (PPDD)
#scbcn15 // #PhpirstAid
Trabajo futuro
■ TDD (in progress)■ BDD
#scbcn15 // #PhpirstAid
Agradecimientos7
#scbcn15 // #PhpirstAid
Equipo técnico Uvinum
@Obokaman@PabloRos @EduFabra@_googol @Madu2789
#scbcn15 // #PhpirstAid
¡Gracias!¿Preguntas? ¿Comentarios?
Contacto
■ @JavierCane
■ Codely.TV
#scbcn15 // #PhpirstAid
■ SlidesCarnival Plantilla presentación■ Fideloper Imágenes Arquitectura Hexagonal■ Giphy GIFs Zoidberg■ WallpapersWide Wallpaper Zoidberg■ Arlo Belshee The 7 stages of naming■ Watirmelon Testing ice-cream cone anti-pattern■ Cañita Brava “El que avisa traiciona”
Créditos imágenes