\subsection{Explicación general sobre XP}

El Extreme Programming es la corriente más extendida dentro de las llamadas metodologías ágiles para el desarrollo de software.

Sus características principales son la simplicidad de desarrollo, comunicación entre los desarrolladores y regeneración de código.
El desarrollo se divide en pequeñas partes de manera que se simplifica la creación y el mantenimiento.
Para que se pueda llevar a cabo, es necesario una buena planificación de manera que el trabajo sea dividido y repartido entre los miembros del grupo ecuánimamente.
También es necesario que haya una buena comunicación entre el equipo y que cada miembro tenga informado al resto del grupo de los progresos realizados.


Aunque los autores enfatizan que solo es XP la combinación de todas estas prácticas, hay algunas de ellas, que por estar en el de programación y no tanto en el de gestión, son más conocidas y se usan notablemente en otras metodologías ágiles.
Entre estas prácticas están {\it pair programming}, {\it Refactoring} y {\it Test Driven Developement}.

Las tres prácticas están estrechamente relacionadas entre sí ya que el uso de una implica el uso de las otras.

El {\it pair programming} consiste en desarrollar el software por parejas.
En cada ordenador hay dos desarrolladores, de manera que el código siempre es revisado por un segundo programador.
Los beneficios del uso de esta práctica afectan al diseño, al testeo y al código.

El {\it Test Driven Developement} permite comprobar el funcionamiento satisfactorio del sistema a partir del testeo de código.
La diferencia entre esta práctica  y otras metodologías clásicas es que, con el {\it Test Driven Developement}, primero se crea el test de la funcionalidad a programar y después se crea dicha funcionalidad, mientras que las metodologías clásicas realizan el testeo después de haber programado la funcionalidad.
Uno de los pasos del proceso seguido por el Test Driven es el {\it Refactoring}.
El {\it Refactoring} es un procedimiento a partir del cual se hacen modificaciones de diseño sin alterar la funcionalidad.
El {\it Test Driven Developement} es la práctica necesaria para controlar que, al realizar {\it Refactoring}, no se produzca una regresión funcional.
Aunque se suele refactorizar para mejorar el diseño del código, también se puede usar esta práctica para mejorar la eficiencia del programa y, en este caso, 
mientras el {\it Test Driven Developement} controlaría la progresión funcional del sistema,
con los tests de eficiencia presentados en este proyecto se controlaría la progresión de eficiencia del software.
