"Demystifying development techniques" por @eturino

56
Demystifying Development Techniques @eturino Eduardo Turiño

description

Presentación realizada en el #webcat Barcelona de Febrero 2014 Autor: Eduardo Turiño (@eturino)

Transcript of "Demystifying development techniques" por @eturino

Page 1: "Demystifying development techniques" por @eturino

Demystifying Development Techniques

@eturino Eduardo Turiño

Page 2: "Demystifying development techniques" por @eturino

¡muerte a los puristas!el “otro título”

Page 3: "Demystifying development techniques" por @eturino

las metodologías son sólo herramientas

Page 4: "Demystifying development techniques" por @eturino

menos errores más velocidad más constancia

Page 5: "Demystifying development techniques" por @eturino

mejorar en cada paso lo que más moleste

Page 6: "Demystifying development techniques" por @eturino

• nivel de Proyecto (Scrum, Kanban…)

• nivel de Desarrollo!

• nivel de Productividad (GTD, Pomodoro…)

Page 7: "Demystifying development techniques" por @eturino

el camino

1. tradicional

2. tests automáticos

3. Test-First

1 643 52

4. TDD

5. BDD

6. completando BDD

Page 8: "Demystifying development techniques" por @eturino

objetivos del desarrollo de software

1. hace lo que tiene que hacer y no otra cosa!

2. funciona sin fallos!

3. no rompe lo que ya funcionaba!

4. fácil de adaptar a nuevas funcionalidades

Page 9: "Demystifying development techniques" por @eturino

tradicional¿cómo se hace normalmente?

643 51 2

Page 10: "Demystifying development techniques" por @eturino

tradicional

• planificación y estudio de requisitos

• desarrollo: diseño e implementación

• pruebas: QA (Quality Assurance)

Page 11: "Demystifying development techniques" por @eturino

pruebas (QA)

• “hace lo que tiene que hacer y no otra cosa”: Pruebas de Aceptación

• “funciona sin fallos”:Pruebas de Exploración

• “no rompe lo que ya funcionaba”: Pruebas de Regresión

Page 12: "Demystifying development techniques" por @eturino

lo que más molesta del enfoque tradicional

demasiadas pruebas

(no se hacen)

Page 13: "Demystifying development techniques" por @eturino

tests automáticosautomatizando las pruebas manuales

1 643 52

Page 14: "Demystifying development techniques" por @eturino

tipos de tests

de Aceptación: comprueba funcionalidad

de Regresión: nos alerta si hemos roto algo anterior

Unitarios: componente (aislado) funciona bien

Page 15: "Demystifying development techniques" por @eturino

cuidado

sustituyen a pruebas manuales:

probar comportamiento

Page 16: "Demystifying development techniques" por @eturino

lo que más molesta de los tests automáticos

• poca motivación para hacerlos

• “¿y cómo pruebo yo esto?”

Page 17: "Demystifying development techniques" por @eturino

Test-Firstprobando lo que aún no hemos desarrollado

1 64 532

Page 18: "Demystifying development techniques" por @eturino

primero el test !

después el código de producción

Page 19: "Demystifying development techniques" por @eturino

ventajas de Test-First

• mayor motivación

• sensación de seguridad: menos fallos tontos

• código más sencillo y fácil de probar

Page 20: "Demystifying development techniques" por @eturino

lo que se echa en falta de Test-First

no nos sirve de guía

Page 21: "Demystifying development techniques" por @eturino

TDDTest Driven Development

1 652 43

Page 22: "Demystifying development techniques" por @eturino

los tests como guía del desarrollo

Page 23: "Demystifying development techniques" por @eturino

TDD

• el objetivo es el código de producción, los tests son una herramienta para ese objetivo

• que los tests sirvan como pruebas es secundario

• se basa en repetición de un ciclo básico

Page 24: "Demystifying development techniques" por @eturino

ciclo básico de TDD

1. escribir un nuevo test y verificar que falla

2. implementar lo mínimo para que:

A. cambie el mensaje del error

B. pase el test

3. repetir el punto 2 hasta que pase el test

4. refactorizar, sin cambiar comportamiento

Page 25: "Demystifying development techniques" por @eturino

Red - Green - RefactorGreen

Red Refactor

Page 26: "Demystifying development techniques" por @eturino

Red - Green - RefactorGreen

Red Refactor

⇧ funcionalidad ⇧ diseño

seguimos

Page 27: "Demystifying development techniques" por @eturino

bases de TDD

• tests concisos

• se prueba nuestro código público

• antes de iniciar algo nuevo, dejar en verde

• Diseño Emergente: al escribir test y refactorizar

Page 28: "Demystifying development techniques" por @eturino

temas a mejorar de TDD

frágil y tedioso muchos test unitarios

Page 29: "Demystifying development techniques" por @eturino

BDDBehaviour Driven Development

!o TDD “bien hecho”

1 62 53 4

Page 30: "Demystifying development techniques" por @eturino

comportamiento, comunicación,

y tests de aceptación

Page 31: "Demystifying development techniques" por @eturino

BDD a grandes rasgos

• usar lenguaje de dominio, no técnico

• escribir tests de aceptación con los clientes (expertos de dominio)

• ciclo de desarrollo usando un doble anillo RGR

Page 32: "Demystifying development techniques" por @eturino

doble anillo de BDD

1. se empieza con un ciclo RGR de un test de aceptación (Anillo Exterior)

2. se va desarrollando hasta que el mensaje de error ya no nos es útil para seguir (outside in)

3. se baja a hacer un test unitario y se continúa con ese ciclo RGR (Anillo Interior)

4. anillo Interior refactorizado: se sube al Anillo Exterior

5. repetir 2-4 hasta que el Anillo Exterior esté completado

Page 33: "Demystifying development techniques" por @eturino

doble anillo

Rf

R

Rf

R G

G

Aceptación

Unitario

Page 34: "Demystifying development techniques" por @eturino

qué se consigue con BDD

• mejor comunicación con clientes y stakeholders

• menos frágil: tests de aceptación y sólo los unitarios necesarios

• más natural y rápido

Page 35: "Demystifying development techniques" por @eturino

limitaciones de BDD

• sólo probamos el caso feliz

• cuando el test es muy difícil de programar

• cuando se tiene muy claro

• cuando los tests unitarios se rompen

• cuando no se tiene ni idea de por dónde tirar

Page 36: "Demystifying development techniques" por @eturino

¿y ahora?

Page 37: "Demystifying development techniques" por @eturino

completamos con otras técnicas

Page 38: "Demystifying development techniques" por @eturino

solucionando “probar sólo el caso feliz”

1 2 3 4 5 6

Page 39: "Demystifying development techniques" por @eturino

tests unitarios extra

• tras un ciclo RGR y antes del siguiente

• ¿cómo debería comportarse el sistema ante esta situación?

• es diseño

• ok si el test empieza en Verde lugar de Rojo.

Page 40: "Demystifying development techniques" por @eturino

solucionando “test difícil de programar”

1 2 3 4 5 6

Page 41: "Demystifying development techniques" por @eturino

solucionando “test muy difícil”

sustituye por prueba manual

Page 42: "Demystifying development techniques" por @eturino

solucionando “cuando es muy fácil”

1 2 3 4 5 6

Page 43: "Demystifying development techniques" por @eturino

solucionando “cuando es muy fácil”

pasos largos

Page 44: "Demystifying development techniques" por @eturino

solucionando “tests se rompen”

1 2 3 4 65

Page 45: "Demystifying development techniques" por @eturino

solucionando “tests se rompen”

arreglarlos o tirarlos

Page 46: "Demystifying development techniques" por @eturino

solucionando “cuando es muy difícil”

1 2 3 4 65

Page 47: "Demystifying development techniques" por @eturino

solucionando “cuando es muy difícil”

REPLs y Spikes

Page 48: "Demystifying development techniques" por @eturino

REPL• Read Eval Print Loop

• consola de javascript, irb/pry…

• ir ejecutando lo que se programa en el momento

• muy bueno para pruebas, bugfixing, y para “¿cómo se usaba esto?”

• REPL Driven Development

Page 49: "Demystifying development techniques" por @eturino

Spike

experimento rápido para:

A. disminuir riesgo técnico

B. pruebas de concepto

Page 50: "Demystifying development techniques" por @eturino

Spike

cuando se termina:

• si es muy horrible:se tira

• si se puede refactorizar y “no está tan mal”:se usa y se le añade un test de regresión

Page 51: "Demystifying development techniques" por @eturino

concluyendo…

Page 52: "Demystifying development techniques" por @eturino

mi proceso al principio

• diseño y desarrollo tradicional

• pruebas al final (bastante escasas), apoyado por un buen equipo de QA

Page 53: "Demystifying development techniques" por @eturino

mi proceso ahora• por defecto:

BDD con Outside-In

• “¿cómo era esto?” y “¿cómo se usaba tal?”:REPLs!

• “ni idea” o “peligroso”: Spikes!

• “trillado”: Pasos largos!

• “test difícil”:Prueba manual

Page 54: "Demystifying development techniques" por @eturino

¿qué he ganado?

• muchos menos errores

• más constante

• más seguro

• más rápido

Page 55: "Demystifying development techniques" por @eturino

buscando las mejores herramientas

para cada ocasión

Page 56: "Demystifying development techniques" por @eturino

el objetivo es el software !

complementar tu metodología con otras técnicas

está bien