85
Replanteamiento de diseño de Software

#PhpirstAid - Replanteamiento de diseño de software

Embed Size (px)

Citation preview

Page 1: #PhpirstAid - Replanteamiento de diseño de software

Replanteamiento de diseño de

Software

Page 2: #PhpirstAid - Replanteamiento de diseño de software

#PhpirstAid

Page 3: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

¡Bienvenidos!Soy Javier Ferrer González

@JavierCane en Twitter

Desarrollador web en @uvinum_es

Gañán en @CodelyTV

Page 4: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Agenda

Contexto Objetivos

Plan de acción Conclusiones

Problemas

Page 5: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Agenda

Exploración Objetivos del paciente

Tratamiento Diagnóstico final

Síntomas

Page 6: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Exploración1

Page 7: #PhpirstAid - Replanteamiento de diseño de software

Uvinum: Marketplace bebidas alcohólicas

Page 8: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

El pacienteESTÁ VIVO

Page 9: #PhpirstAid - Replanteamiento de diseño de software

151.000.000Peticiones mensuales de media

Page 10: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Oficina

Web disponible en 14 países

Page 11: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

5Años en activo

2M €Inversión total en 3 rondas

6 / 22Desarrolladores / Empleados totales

Page 12: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Objetivos del paciente2

Page 13: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

1. Aumentar tolerancia a cambios (Ejemplo API)

Place your screen

shot

here

Page 14: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Walking on water and developing software from a specification are easy if both are frozen

-Edward V. Berard

Page 15: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Las especificaciones CAMBIAN

-Sabiduría popular

Page 16: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Las especificaciones LAS CAMBIAMOS

Page 17: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

2. Permitir una correcta implementación de test

Page 18: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Pirámide de test

Page 19: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Software testing ice-cream cone anti-pattern

Page 20: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

3. Evitar muerte por deuda técnica (velocidad de desarrollo)

Page 21: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Muerte por deuda técnica

Page 22: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Deuda técnica

Page 23: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Complejidad accidental vs. Complejidad esencial

Complejidad esencial

Complejidad accidentalC

omp

leji

dad

sis

tem

a

Tiempo

Page 24: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

4. Sentir motivación por cómo hacemos lo que hacemos(Software Craftsmanship)

Page 25: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Síntomas3

Page 26: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

1ª visita~Finales 2014

Page 27: #PhpirstAid - Replanteamiento de diseño de software
Page 28: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

“El que avisa traiciona”

Page 29: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 30: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

■ Falta de test => Reticencia al cambio/descontrol■ Alto acoplamiento => Poca cambiabilidad

Síntomas

Page 31: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Primer diagnóstico: “Borchenoso”

Page 32: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Tratamiento4

Page 33: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Tratamiento por etapas

Diseño“alto nivel” Procesos

Transferencia conocimiento

Replanteamiento diseño “bajo nivel”

Page 34: #PhpirstAid - Replanteamiento de diseño de software

#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■ …

Page 35: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Clean Code - Naming

Page 36: #PhpirstAid - Replanteamiento de diseño de software

Clean Code Refactoring - Antes

Page 37: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Clean Code Refactoring - Después

■ Naming■ Guard clause■ Extract method■ Introduce

explanatory variable

Page 38: #PhpirstAid - Replanteamiento de diseño de software

Diseño “alto nivel” -> Domain-Driven Design

Page 39: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Arquitectura Hexagonal

Page 40: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 42: #PhpirstAid - Replanteamiento de diseño de software

Capas Arquitectura Hexagonal

Page 43: #PhpirstAid - Replanteamiento de diseño de software

DDD - Agregados

Page 44: #PhpirstAid - Replanteamiento de diseño de software

DDD - Agregados - Clientes

Page 45: #PhpirstAid - Replanteamiento de diseño de software

DDD - Value Objects

Page 46: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Usando agregados y demás para listados

■ 1 Query por AR■ Agregados pequeños

=> Muchas queries■ MUCHAS:■ No vale cache■ Complejidad

Page 47: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Usando agregados y demás para listados

Page 48: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Usando Write Model para listados

Page 49: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 50: #PhpirstAid - Replanteamiento de diseño de software

DDD - Read Model

Page 52: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Read Model Composer

■ Finalidad: Agilizar desarrollo Read Model■ Reutilizar DTOs y “repositorios dependientes”■ Tradeoff que decidimos asumir :)

Page 53: #PhpirstAid - Replanteamiento de diseño de software

Read Model Composer Builder - Uso

Page 54: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Read Model

Composer

Builder -

Implementació

n

Read Model Composer Builder - Implementación

Page 55: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Read Model Composer Builder - Definición servicio

Page 56: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Read Model Composer Builder - Implementación Projector

RM Composer Builder - Implementación Projector

Page 57: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Read Model Composer Builder - Implementación Projector

RM Composer Builder - Implementación Joiner

Page 58: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

RM Composer Builder - Diagrama de clases

Page 59: #PhpirstAid - Replanteamiento de diseño de software

Procesos -> Composer + CI

Page 60: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Sólo conseguiremos anular la reticencia al cambio con procesos que no generen

fricción innecesaria

Page 61: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Elementos introducidos

■ Actualización PHP 5.6■ Composer■ Continuous Deployment: Push a master => deploy

■ Único repositorio■ GitHub■ Capistrano

Page 62: #PhpirstAid - Replanteamiento de diseño de software

Transferencia conocimiento -> Rethinking Code

Page 63: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Cómo implicar al equipo

Page 64: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Sesiones Rethinking Code

■ Semanalmente■ 2 - 3 horas■ Equipo arquitectura■ Informales■ Casos prácticos

Page 65: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 67: #PhpirstAid - Replanteamiento de diseño de software
Page 68: #PhpirstAid - Replanteamiento de diseño de software

#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)

Page 69: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 70: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 71: #PhpirstAid - Replanteamiento de diseño de software

#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)

Page 72: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Sesiones Rethinking Code - Testing

18. First tests exercises19. TDD with legos20. Setting up phpunit,

asserts and testing types21. …

Page 73: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

■ TDD and Refactoring with LEGO, Bryan Beecham

Takeaways

Page 74: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Diagnóstico final5

Page 75: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

■ Equipo arquitectura■ Composer■ SOLID■ Dependency Injector Container■ Arquitectura Hexagonal

■ Lógica desacoplada del framework■ Eventos

Puntos de inflexión

Page 76: #PhpirstAid - Replanteamiento de diseño de software

#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

Page 77: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Si tu aplicación no es compleja, no te líes con DDD.Tira por CRUD y no hay problema.

-Dicho popular

Page 78: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

¿Existen las “aplicaciones” complejas?

Page 79: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Una aplicación compleja tendrá partes donde NO merecerá la pena aplicar DDD

Page 80: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Pasito a Pasito Driven Development (PPDD)

Page 81: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Trabajo futuro

■ TDD (in progress)■ BDD

Page 82: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

Agradecimientos7

Page 84: #PhpirstAid - Replanteamiento de diseño de software

#scbcn15 // #PhpirstAid

¡Gracias!¿Preguntas? ¿Comentarios?

Contacto

■ @JavierCane

[email protected]

■ Codely.TV

Page 85: #PhpirstAid - Replanteamiento de diseño de software

#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