SlideShare una empresa de Scribd logo
Modificando el
software de manera
progresiva
Jaime Perera
@jaimeperera
http://martinfowler.com/bliki/DesignStaminaHypothesis.html
Sin diseño
http://ronjeffries.com/xprog/articles/refactoring-not-on-the-backlog/
Refactor de golpe
http://ronjeffries.com/xprog/articles/refactoring-not-on-the-backlog/
Refactoring progresivo
http://ronjeffries.com/xprog/articles/refactoring-not-on-the-backlog/
Estrategias para el
cambio progresivo
Puntos en común:
● Tests
● Limitando el rojo
● Baby steps
Narrow change
Reduce el número de lugares donde necesitas hacer un cambio antes de hacerlo
Ejemplo de cliente de order:
public void processCustomerOrders(String customer) {
for (Order order : orders) {
if (order.customer.equals(customer)) {
order.process();
};
}
}
…. y n clientes más
public void processCustomerOrders(String customer) {
for (Order order : orders) {
if (order.customer.equals(customer)) {
order.process();
};
}
}
class Order {
String customer;
….
}
public void processCustomerOrders(String customer) {
for (Order order : orders) {
if (order.customer.equals(customer)) {
order.process();
};
}
}
class Order {
String customer;
String getCustomer() {
return customer;
}
}
public void processCustomerOrders(String customer) {
for (Order order : orders) {
if (order.getCustomer().equals(customer)) {
order.process();
};
}
}
class Order {
String customer;
String getCustomer() {
return customer;
}
}
public void processCustomerOrders(String customer) {
for (Order order : orders) {
if (order.getCustomer().equals(customer)) {
order.process();
};
}
}
class Order {
Customer customer;
String getCustomer() {
return customer.getName();
}
}
Parallel change
1. Desarrolla en paralelo la nueva manera de hacer algo sin tocar la antigua.
2. Después cambia progresivamente de la antigua a la nueva.
3. Cuando el código antiguo ya no lo necesite nadie, lo puedes borrar.
Dos enfoques de cambios paralelos:
● Ocurren manera transparente para el cliente (sin cambios en interface)
● Afectan visiblemente a los clientes (cambios en interface)
Parallel change: sin cambios de interface
The Limited Red Society
by Joshua Kerievsky
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(start) && receipt.getDate().before(end) ) {
result += receipt.getTotal();
}
}
}
… con n-clientes
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
DateRange dateRange = new DateRange(start, end);
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(start) && receipt.getDate().before(end) ) {
result += receipt.getTotal();
}
}
}
… sin cambios en los clientes
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
DateRange dateRange = new DateRange(start, end);
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(date.getStart()) && receipt.getDate().before(date.getEnd())) {
result += receipt.getTotal();
}
}
}
… sin cambios en los clientes
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
DateRange dateRange = new DateRange(start, end);
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(date.getStart()) && receipt.getDate().before(date.getEnd())) {
result += receipt.getTotal();
}
}
}
… sin cambios en los clientes
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
DateRange dateRange = new DateRange(start, end);
return getFlowBetween(dateRange);
}
double getFlowBetween(DateRange dateRange) {
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(date.getStart()) && receipt.getDate().before(date.getEnd())) {
result += receipt.getTotal();
}
}
} … cambiamos los clientes uno a uno y una vez estén todos ...
Parallel change: con cambios de
interfacedouble getFlowBetween(Date start, Date end) {
DateRange dateRange = new DateRange(start, end);
return getFlowBetween(dateRange);
}
double getFlowBetween(DateRange dateRange) {
double result = 0;
for (Receipt receipt : receipts) {
if (receipt.getDate().after(date.getStart()) && receipt.getDate().before(date.getEnd())) {
result += receipt.getTotal();
}
}
}
Evolved target
Cuando sabes dónde quieres llegar en tu diseño, haz pequeños refactorings que
vayan evolucionando hacia el objetivo.
Branch by Abstraction
http://martinfowler.com/bliki/BranchByAbstraction.html
Branch by Abstraction
Branch by Abstraction
Branch by Abstraction
Branch by Abstraction
Cambios en servicios
● Problema con cambios en servicios que tiene ya clientes
● Código de clientes que no lo puedes tocar (retrocompatibilidad):
○ Clientes externos
○ Aplicaciones móviles nativas
● Código que puedes cambiar pero con costo grande:
○ otros equipos
○ muchos clientes
Ejemplo: API REST
/api/homes?hasMultimedia=true
/api/homes?hasPhotos=true&hasVideos=true
● Posible solución: versionado -> cambio de versión casi a diario
/v1/api/homes?hasMultimedia=true
/v2/api/homes?hasPhotos=true&hasVideos=true
Ejemplo: API REST
/api/homes?hasMultimedia=true
/api/homes?hasPhotos=true&hasVideos=true
● Mejor solución: cambio dentro de la misma versión manteniendo la
retrocompatibilidad
Ejemplo: API REST
/api/homes?hasMultimedia=true
/api/homes?hasPhotos=true&hasVideos=true
● Mejor solución: cambio dentro de la misma versión manteniendo la
retrocompatibilidad
/api/homes?hasMultimedia=true
/api/homes?hasPhotos=true&hasVideos=true
Breaking the monolith
Para sacar de una aplicación un servicio:
1. Separar código del nuevo servicio en paquete
2. Separar las tablas a las que se acceden
3. Separar el código al nuevo servicio
Breaking the monolith
Breaking the monolith
Breaking the monolith
Breaking the monolith
Breaking the monolith
¿Cómo empezar?
● Ahora mismo: planteárselo
● Mañana: Testing
● En 1 hora: Limited Red Society de Joshua Kerievsky
● Con un poco de tiempo: Refactoring de Martin Fowler

Más contenido relacionado

Similar a Modificando el software de manera progresiva

Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
SolidQ
 
CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018
Germán Küber
 
Detección de cambios para el desarrollo de WareHouse
Detección de cambios para el desarrollo de WareHouseDetección de cambios para el desarrollo de WareHouse
Detección de cambios para el desarrollo de WareHouse
Freddy Angarita
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
peterpunk
 
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
Paula Alvarez
 
cream code with objective-c
cream code with objective-ccream code with objective-c
cream code with objective-c
idealistaimasd
 
Proceso de un proyecto web
Proceso de un proyecto webProceso de un proyecto web
Proceso de un proyecto web
jonaland
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
Álvaro Alonso González
 
No más plugins
No más pluginsNo más plugins
No más plugins
wpperu
 
Oracle 12c Transaction Guard and Application Continuity
Oracle 12c Transaction Guard and Application ContinuityOracle 12c Transaction Guard and Application Continuity
Oracle 12c Transaction Guard and Application Continuity
Julio
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdades
Enrique Catala Bañuls
 
Arquitectura de un sistema financiero complejo
Arquitectura de un sistema financiero complejoArquitectura de un sistema financiero complejo
Arquitectura de un sistema financiero complejo
Gabriel Omar Cotelli
 
Todomir
TodomirTodomir
Todomir
Arturo Guzman
 
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - ControlDesarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
Dharma Consulting
 
Html5 para móviles, las reglas no escritas
Html5 para móviles, las reglas no escritasHtml5 para móviles, las reglas no escritas
Html5 para móviles, las reglas no escritas
Carlos Toxtli
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
Gabriela Bosetti
 
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Atenea tech
 
Pagos electrónicos
Pagos electrónicosPagos electrónicos
Pagos electrónicos
René Olivo
 
Ajax Huancayo
Ajax HuancayoAjax Huancayo
Ajax Huancayo
Jonathan Lara Vasquez
 
Jupama App
Jupama AppJupama App
Jupama App
Coduxe
 

Similar a Modificando el software de manera progresiva (20)

Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
 
CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018
 
Detección de cambios para el desarrollo de WareHouse
Detección de cambios para el desarrollo de WareHouseDetección de cambios para el desarrollo de WareHouse
Detección de cambios para el desarrollo de WareHouse
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13SEOnderground 2022 | Migraciones web: el verdadero viernes 13
SEOnderground 2022 | Migraciones web: el verdadero viernes 13
 
cream code with objective-c
cream code with objective-ccream code with objective-c
cream code with objective-c
 
Proceso de un proyecto web
Proceso de un proyecto webProceso de un proyecto web
Proceso de un proyecto web
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
 
No más plugins
No más pluginsNo más plugins
No más plugins
 
Oracle 12c Transaction Guard and Application Continuity
Oracle 12c Transaction Guard and Application ContinuityOracle 12c Transaction Guard and Application Continuity
Oracle 12c Transaction Guard and Application Continuity
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdades
 
Arquitectura de un sistema financiero complejo
Arquitectura de un sistema financiero complejoArquitectura de un sistema financiero complejo
Arquitectura de un sistema financiero complejo
 
Todomir
TodomirTodomir
Todomir
 
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - ControlDesarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
Desarrollo de un nuevo Software para Operadores de Comercio Exterior - Control
 
Html5 para móviles, las reglas no escritas
Html5 para móviles, las reglas no escritasHtml5 para móviles, las reglas no escritas
Html5 para móviles, las reglas no escritas
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
 
Pagos electrónicos
Pagos electrónicosPagos electrónicos
Pagos electrónicos
 
Ajax Huancayo
Ajax HuancayoAjax Huancayo
Ajax Huancayo
 
Jupama App
Jupama AppJupama App
Jupama App
 

Último

herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
eliersin13
 
Buscador de Eventos y Fiestas en España - Buscafiesta
Buscador de Eventos y Fiestas en España - BuscafiestaBuscador de Eventos y Fiestas en España - Buscafiesta
Buscador de Eventos y Fiestas en España - Buscafiesta
holabuscafiesta
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
PaulDelgadoSoto
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 

Último (8)

herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
 
Buscador de Eventos y Fiestas en España - Buscafiesta
Buscador de Eventos y Fiestas en España - BuscafiestaBuscador de Eventos y Fiestas en España - Buscafiesta
Buscador de Eventos y Fiestas en España - Buscafiesta
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 

Modificando el software de manera progresiva