Construye lo más simple que funcione. Resiste la tentación de sobre-diseñar.
XP tiene un mantra: Haz lo más simple que posiblemente pueda funcionar.
Esto no se trata de ser flojo o escribir código descuidado. El código simple a menudo es más difícil de escribir que el código complejo. Requiere:
El código simple es:
El código complejo es:
Lo Simple Es Difícil
"Habría escrito una carta más corta, pero no tuve tiempo." —Blaise Pascal. El código simple requiere más reflexión, no menos.
YAGNI es el principio de que solo debes construir lo que necesitas ahora mismo.
No agregues:
¿Por qué? Porque:
La apuesta de XP: Si necesitas algo después, puedes agregarlo después. Con TDD, refactorización e IC, el cambio es económico. Así que no pagues por el futuro antes de tener que hacerlo.
Esta es una idea radical. La ingeniería de software tradicional dice anticipar el cambio y diseñar para la flexibilidad. XP dice esperar hasta que realmente lo necesites.
El equipo necesita enviar correos. Implementan el envío vía SMTP. Después, necesitan enviar vía SendGrid. Refactorizan. Costo total: menos que construir una abstracción de correo conectable desde el principio.
El equipo necesita enviar correos. Construyen una interfaz genérica 'MessageProvider' con abstracciones conectables 'MessageTransport' y 'MessageFormatter'. Solo usan SMTP con un formato. Las abstracciones ralentizan cada cambio.
Kent Beck definió el diseño simple como código que:
1. Pasa todas las pruebas El código funciona. Esto no es negociable. Un diseño hermoso que no funciona no vale nada.
2. Revela intención El código es fácil de entender. Buenos nombres, estructura clara, organización legible. Alguien nuevo puede tomarlo y entender qué hace.
3. No tiene duplicación (DRY) Cada pieza de conocimiento se expresa una y solo una vez. La duplicación crea carga de mantenimiento y riesgo de errores.
4. Tiene los elementos mínimos Sin clases, métodos, variables o abstracciones extra. Todo lo que existe tiene una razón para existir.
Las reglas están en orden de prioridad. Pasar las pruebas supera todo. Pero una vez que las pruebas pasan, favorece la claridad sobre DRY. Y solo agrega elementos que sirvan a las primeras tres reglas.
El diseño simple no significa sin diseño. Significa diseño incremental—evolucionar el diseño a medida que aprendes.
El proceso:
Por esto XP enfatiza tanto la refactorización. Si no puedes cambiar el código de forma segura, no puedes hacer diseño incremental. Estás atrapado con lo que construiste primero.
El Diseño Grande por Adelantado (BUFD) falla porque:
El diseño incremental tiene éxito porque:
Cuando sientas la tentación de agregar una abstracción, pregunta: "¿Necesito esto ahora, o estoy adivinando?" Si estás adivinando, espera.
El diseño simple no significa evitar toda complejidad. A veces la complejidad es necesaria.
Agrega complejidad cuando:
No agregues complejidad por:
La diferencia está entre complejidad esencial (inherente al problema) y complejidad accidental (introducida por tu solución). XP minimiza la complejidad accidental al negarse a construir para requisitos imaginarios.
Cuando sí necesites una abstracción, déjala emerger de eliminar duplicación. La "Regla de Tres" es útil: no abstraigas hasta que veas el mismo patrón tres veces. Para entonces entiendes las variaciones reales, no las imaginadas.