SlideShare ist ein Scribd-Unternehmen logo
1 von 85
Downloaden Sie, um offline zu lesen
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 paciente
ESTÁ VIVO
151.000.000
Peticiones mensuales de media
#scbcn15 // #PhpirstAid
Oficina
Web disponible en 14 países
#scbcn15 // #PhpirstAid
5
Años en activo
2M €
Inversión total en 3 rondas
6 / 22
Desarrolladores / Empleados totales
#scbcn15 // #PhpirstAid
Objetivos del paciente2
#scbcn15 // #PhpirstAid
1. Aumentar tolerancia a cambios (Ejemplo API)
Placeyourscreenshot
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 accidental
Complejidadsistema
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
#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
Compos
er
Builder
-
Implem
entació
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 Controllers
2. SOLIDificando Verticomm
3. Code Smells
4. Refactoring, Clean Code & Tips
5. Composition over Inheritance & Design Patterns
6. 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 Architecture
8. Workshop Hexagonal Architecture
9. DDD Building Blocks - Value Objects
10. DDD Building Blocks - Values Objects Workshop
11. DDD Building Blocks - Entities & Aggregates
12. 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 DI
14. Use Read Model, stay legen...dary, y lo otro ya tal
15. Read Model Workshop
16. Pedidos conjuntos
17. Event Driven Development
Sesiones Rethinking Code - Diseño “a alto nivel” (2/2)
#scbcn15 // #PhpirstAid
Sesiones Rethinking Code - Testing
18. First tests exercises
19. TDD with legos
20. Setting up phpunit,
asserts and testing types
21. …
#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
■ 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

Weitere ähnliche Inhalte

Was ist angesagt?

Critica propositiva a una planeación
Critica propositiva a una planeaciónCritica propositiva a una planeación
Critica propositiva a una planeación
Blanca Garcia Ochoa
 
Reglas básicas para preparar presentaciones de alto impacto
Reglas básicas para preparar presentaciones de alto impactoReglas básicas para preparar presentaciones de alto impacto
Reglas básicas para preparar presentaciones de alto impacto
patrimoni
 

Was ist angesagt? (10)

SOLID - ¿Cómo lo aplico a mi código?
SOLID - ¿Cómo lo aplico a mi código?SOLID - ¿Cómo lo aplico a mi código?
SOLID - ¿Cómo lo aplico a mi código?
 
Critica propositiva a una planeación
Critica propositiva a una planeaciónCritica propositiva a una planeación
Critica propositiva a una planeación
 
Hexagonal architecture - message-oriented software design
Hexagonal architecture  - message-oriented software designHexagonal architecture  - message-oriented software design
Hexagonal architecture - message-oriented software design
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdf
 
8. Event Storming (P. Rayner).pdf
8. Event Storming (P. Rayner).pdf8. Event Storming (P. Rayner).pdf
8. Event Storming (P. Rayner).pdf
 
Event storming
Event storming Event storming
Event storming
 
Monografía - Problema de las Jarras
Monografía  - Problema de las JarrasMonografía  - Problema de las Jarras
Monografía - Problema de las Jarras
 
Reglas básicas para preparar presentaciones de alto impacto
Reglas básicas para preparar presentaciones de alto impactoReglas básicas para preparar presentaciones de alto impacto
Reglas básicas para preparar presentaciones de alto impacto
 
Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014
 
iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...
iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...
iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...
 

Andere mochten auch

Repensar la estrategia
Repensar la estrategiaRepensar la estrategia
Repensar la estrategia
gsgallego
 
Arquitectura dirigida por eventos
Arquitectura dirigida por eventosArquitectura dirigida por eventos
Arquitectura dirigida por eventos
Ludwing Rubio
 
Arquitectura dirigida a eventos
Arquitectura dirigida a eventosArquitectura dirigida a eventos
Arquitectura dirigida a eventos
rehoscript
 
Plan de negocios trabajo ya terminado
Plan de negocios trabajo ya terminadoPlan de negocios trabajo ya terminado
Plan de negocios trabajo ya terminado
caterineleyva123
 

Andere mochten auch (20)

Planteamiento Estratégico Porque muchas veces se Fracasa
Planteamiento Estratégico Porque muchas veces se FracasaPlanteamiento Estratégico Porque muchas veces se Fracasa
Planteamiento Estratégico Porque muchas veces se Fracasa
 
El Planeamiento 2
El Planeamiento 2El Planeamiento 2
El Planeamiento 2
 
Comunicación y Salud: Un Nuevo Planteamiento Estratégico
Comunicación y Salud: Un Nuevo Planteamiento EstratégicoComunicación y Salud: Un Nuevo Planteamiento Estratégico
Comunicación y Salud: Un Nuevo Planteamiento Estratégico
 
Repensar la estrategia
Repensar la estrategiaRepensar la estrategia
Repensar la estrategia
 
Plan estratégico para replantear la arquitectura de marca
Plan estratégico para replantear la arquitectura de marcaPlan estratégico para replantear la arquitectura de marca
Plan estratégico para replantear la arquitectura de marca
 
Event Programing & Driven Mediator Pattern
Event Programing & Driven Mediator PatternEvent Programing & Driven Mediator Pattern
Event Programing & Driven Mediator Pattern
 
Arquitectura para artesanos
Arquitectura para artesanosArquitectura para artesanos
Arquitectura para artesanos
 
Arquitectura dirigida por eventos
Arquitectura dirigida por eventosArquitectura dirigida por eventos
Arquitectura dirigida por eventos
 
Software craftsmanship coaching
Software craftsmanship coachingSoftware craftsmanship coaching
Software craftsmanship coaching
 
Plan De Negocios
Plan De NegociosPlan De Negocios
Plan De Negocios
 
Plan de marketing
Plan de marketingPlan de marketing
Plan de marketing
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)
 
Arquitectura dirigida a eventos
Arquitectura dirigida a eventosArquitectura dirigida a eventos
Arquitectura dirigida a eventos
 
Plan de Negocio Empresarial
Plan de Negocio EmpresarialPlan de Negocio Empresarial
Plan de Negocio Empresarial
 
Hexagonal architecture message-oriented software design
Hexagonal architecture   message-oriented software designHexagonal architecture   message-oriented software design
Hexagonal architecture message-oriented software design
 
Plan de negocios trabajo ya terminado
Plan de negocios trabajo ya terminadoPlan de negocios trabajo ya terminado
Plan de negocios trabajo ya terminado
 
COMO ELABORAR UN PLAN DE NEGOCIO
COMO ELABORAR UN PLAN DE NEGOCIOCOMO ELABORAR UN PLAN DE NEGOCIO
COMO ELABORAR UN PLAN DE NEGOCIO
 
Planeación Estratégica
Planeación EstratégicaPlaneación Estratégica
Planeación Estratégica
 
Pasos del Planeamiento Estratégico
Pasos del Planeamiento EstratégicoPasos del Planeamiento Estratégico
Pasos del Planeamiento Estratégico
 
Plan De Negocios
Plan De NegociosPlan De Negocios
Plan De Negocios
 

Ähnlich wie #PhpirstAid - Replanteamiento de diseño de software

Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo frameworkDesarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
Santiago Bustelo
 
Desarrollo tecnologias software_libre_open_source
Desarrollo tecnologias software_libre_open_sourceDesarrollo tecnologias software_libre_open_source
Desarrollo tecnologias software_libre_open_source
Mario IC
 
Personalinformatico jaenes
Personalinformatico jaenesPersonalinformatico jaenes
Personalinformatico jaenes
DavidJaenes
 

Ähnlich wie #PhpirstAid - Replanteamiento de diseño de software (20)

Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo frameworkDesarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
Desarrollo y testeo modular de interfaces HTML5 / MVC - Congo framework
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0
 
Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020
 
Arquitectura de web components - Plain Concepts Web Day
Arquitectura de web components - Plain Concepts Web DayArquitectura de web components - Plain Concepts Web Day
Arquitectura de web components - Plain Concepts Web Day
 
Cream code & front performance
Cream code & front performanceCream code & front performance
Cream code & front performance
 
Desarrollo tecnologias software_libre_open_source
Desarrollo tecnologias software_libre_open_sourceDesarrollo tecnologias software_libre_open_source
Desarrollo tecnologias software_libre_open_source
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Curso Php
Curso PhpCurso Php
Curso Php
 
Dev ops infraestructura agil con open source
Dev ops   infraestructura agil con open sourceDev ops   infraestructura agil con open source
Dev ops infraestructura agil con open source
 
DevOps con Visual Studio Team Services
DevOps con Visual Studio Team ServicesDevOps con Visual Studio Team Services
DevOps con Visual Studio Team Services
 
Personalinformatico jaenes
Personalinformatico jaenesPersonalinformatico jaenes
Personalinformatico jaenes
 
ASPgems 2018
ASPgems 2018 ASPgems 2018
ASPgems 2018
 
Pucela testingdays testing_en_php
Pucela testingdays testing_en_phpPucela testingdays testing_en_php
Pucela testingdays testing_en_php
 
Uso de tecnologías modernas en joomla
Uso de tecnologías modernas en joomlaUso de tecnologías modernas en joomla
Uso de tecnologías modernas en joomla
 
Charla C++
Charla C++Charla C++
Charla C++
 
Los reinos de finizens - Nuestro stark tecnológico
Los reinos de finizens - Nuestro stark tecnológicoLos reinos de finizens - Nuestro stark tecnológico
Los reinos de finizens - Nuestro stark tecnológico
 
Working with a design system
Working with a design systemWorking with a design system
Working with a design system
 
APCSIS - Escuela de Código.pptx
APCSIS - Escuela de Código.pptxAPCSIS - Escuela de Código.pptx
APCSIS - Escuela de Código.pptx
 
Entrega contínua en la práctica
Entrega contínua en la prácticaEntrega contínua en la práctica
Entrega contínua en la práctica
 
Herramientas para desarrollar rápidamente
Herramientas para desarrollar rápidamenteHerramientas para desarrollar rápidamente
Herramientas para desarrollar rápidamente
 

Mehr von Javier Ferrer González

Mehr von Javier Ferrer González (8)

We broke up with the monolith, and started dating #eventSourcing - #symfonyCat
We broke up with the monolith, and started dating #eventSourcing - #symfonyCatWe broke up with the monolith, and started dating #eventSourcing - #symfonyCat
We broke up with the monolith, and started dating #eventSourcing - #symfonyCat
 
Redescubre la programación - #MPWAR - #OpenDayLaSalle
Redescubre la programación - #MPWAR - #OpenDayLaSalleRedescubre la programación - #MPWAR - #OpenDayLaSalle
Redescubre la programación - #MPWAR - #OpenDayLaSalle
 
Informática en El Mundo Real - Sesión de orientación
Informática en El Mundo Real - Sesión de orientaciónInformática en El Mundo Real - Sesión de orientación
Informática en El Mundo Real - Sesión de orientación
 
#SpyFiles - Análisis de #FinFisher y los Conflictos Políticos del Malware-as-...
#SpyFiles - Análisis de #FinFisher y los Conflictos Políticos del Malware-as-...#SpyFiles - Análisis de #FinFisher y los Conflictos Políticos del Malware-as-...
#SpyFiles - Análisis de #FinFisher y los Conflictos Políticos del Malware-as-...
 
Gestión proyecto DroidClic android app
Gestión proyecto DroidClic android appGestión proyecto DroidClic android app
Gestión proyecto DroidClic android app
 
Introducción a Ruby on rails
Introducción a Ruby on railsIntroducción a Ruby on rails
Introducción a Ruby on rails
 
Introducción a CoffeeScript
Introducción a CoffeeScriptIntroducción a CoffeeScript
Introducción a CoffeeScript
 
Charla IES Marianao
Charla IES MarianaoCharla IES Marianao
Charla IES Marianao
 

#PhpirstAid - Replanteamiento de diseño de software