#PhpirstAid - Replanteamiento de diseño de software

Post on 15-Apr-2017

2.312 views 2 download

Transcript of #PhpirstAid - Replanteamiento de diseño de software

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

“El que avisa traiciona”

#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

Primer diagnóstico: “Borchenoso”

#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

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

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

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

¡Gracias!¿Preguntas? ¿Comentarios?

Contacto

■ @JavierCane

■ javier.mailserio@gmail.com

■ 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