La programación extrema ( XP ) es unametodología ágil de desarrollo de software utilizada para implementar sistemas de software . Este artículo detalla las prácticas empleadas en esta metodología. La programación extrema cuenta con 12 prácticas, agrupadas en cuatro áreas, derivadas de las mejores prácticas de la ingeniería de software . [ 1 ]
Retroalimentación a pequeña escala
Programación en parejas
La programación en parejas es un método de programación en el que dos personas trabajan juntas en una misma tarea. Un programador controla la estación de trabajo y se centra principalmente en los detalles de la codificación. El otro programador se enfoca en el panorama general y revisa continuamente el código que produce el primero. Los programadores intercambian roles cada pocos minutos o horas.
Las parejas no son fijas; los programadores cambian de compañero con frecuencia, de modo que todos sepan qué hace cada uno y se familiaricen con el sistema en su conjunto, incluso con las partes que escapan a su dominio. De esta forma, la programación en parejas también puede mejorar la comunicación dentro del equipo. (Esto se relaciona directamente con el concepto de propiedad colectiva).
Juego de planificación
El principal proceso de planificación dentro de la programación extrema se llama Juego de Planificación. El juego es una reunión que se lleva a cabo una vez por iteración, generalmente una vez por semana. El proceso de planificación se divide en dos partes:
- Planificación de lanzamientos : Se centra en determinar qué requisitos se incluyen en cada lanzamiento a corto plazo y cuándo deben entregarse. Tanto los clientes como los desarrolladores participan en este proceso. La planificación de lanzamientos consta de tres fases:
- Fase de exploración: En esta fase, el cliente proporcionará una lista reducida de requisitos de alto valor para el sistema. Estos se plasmarán por escrito en tarjetas de historias de usuario .
- Fase de compromiso: Durante la fase de compromiso, tanto la empresa como los desarrolladores se comprometerán con la funcionalidad que se incluirá y la fecha de la próxima versión.
- Fase de dirección: En la fase de dirección se puede ajustar el plan, añadir nuevos requisitos y/o modificar o eliminar los requisitos existentes.
- Planificación de iteraciones : Esta planificación define las actividades y tareas de los desarrolladores. En este proceso, el cliente no participa. La planificación de iteraciones también consta de tres fases:
- Fase de exploración: En esta fase, el requisito se traducirá en diferentes tareas. Las tareas se registran en fichas de tareas.
- Fase de compromiso: Se asignarán las tareas a los programadores y se estimará el tiempo necesario para completarlas.
- Fase de dirección: Se realizan las tareas y el resultado final se ajusta a la historia de usuario original.
El propósito del Juego de Planificación es guiar el producto hacia su entrega. En lugar de predecir las fechas exactas en que se necesitarán y producirán los entregables, lo cual es difícil, busca "dirigir el proyecto" hacia la entrega mediante un enfoque directo. [ 2 ] El enfoque del Juego de Planificación se utiliza en marcos de desarrollo que van más allá de los sistemas de software. Por ejemplo, lo utilizan equipos en el contexto de la agilidad empresarial . [ 3 ]
Planificación de lanzamientos
Fase de exploración
Se trata de un proceso iterativo de recopilación de requisitos y estimación del impacto laboral de cada uno de ellos.
- Redactar una historia: El área de negocio presenta un problema. Durante una reunión, el equipo de desarrollo intentará definirlo y obtener los requisitos. A partir de este problema, se debe redactar una historia de usuario . El área de negocio se encarga de definir las funciones que espera de una parte del sistema. Es fundamental que el equipo de desarrollo no tenga ninguna influencia en esta historia. La historia se escribe en una ficha de historia de usuario.
- Estimación de una historia: El equipo de desarrollo estima cuánto tiempo llevará implementar el trabajo descrito en la ficha de la historia. También puede crear soluciones preliminares para analizar o resolver el problema. Estas soluciones se utilizan para la estimación y se descartan una vez que todos comprenden claramente el problema. Cabe destacar que esto no necesariamente influye en los requisitos del negocio.
- Dividir una historia: Cada complejidad crítica del diseño debe abordarse antes de comenzar la planificación de la iteración. Si el equipo de desarrollo no puede estimar la historia, debe dividirse y reescribirse.
Cuando la empresa ya no puede plantear más requisitos, se pasa a la fase de compromiso.
Fase de compromiso
Esta fase implica la determinación de costos, beneficios e impacto en el cronograma. Consta de cuatro componentes:
- Ordenar por valor: Business ordena las historias de usuario por valor comercial .
- Ordenar por riesgo: El equipo de desarrollo ordena las historias según el riesgo.
- Velocidad de desarrollo: El desarrollo determina a qué velocidad pueden rendir.
- Seleccionar el alcance: Se seleccionarán las historias de usuario que se completarán en la próxima versión. La fecha de lanzamiento se determinará en función de las historias de usuario.
Ordenar por valor
El área de negocios clasifica las historias de usuario según su valor comercial. Las organizarán en tres grupos:
- Crítico: historias sin las cuales el sistema no puede funcionar o carece de sentido.
- Valor comercial significativo : Historias de usuario no críticas que tienen un valor comercial significativo.
- Sería bueno tener: Historias de usuario que no tengan un valor comercial significativo.
Ordenar por riesgo
Los desarrolladores clasifican las historias de usuario según su riesgo. Además, las categorizan en tres grupos: historias de usuario de bajo, medio y alto riesgo. A continuación, se muestra un ejemplo de cómo se aborda este proceso:
- Determinar el índice de riesgo: Asigne a cada historia de usuario un índice de 0 a 2 en cada uno de los siguientes factores:
- Integridad (¿conocemos todos los detalles de la historia?)
- Completado (0)
- Incompleto (1)
- Desconocido (2)
- Volatilidad (¿es probable que cambie?)
- bajo (0)
- medio (1)
- alto (2)
- Complejidad (¿qué tan difícil es construirlo?)
- simple (0)
- estándar (1)
- complejo (2)
- Integridad (¿conocemos todos los detalles de la historia?)
Se suman todos los índices de una historia de usuario, asignándole un índice de riesgo bajo (0-1 ) , medio (2-4 ) o alto ( 5-6 ).
Fase de dirección
Durante la fase de planificación, los programadores y los responsables de negocio pueden influir en el proceso. Es decir, pueden realizar cambios. Las historias de usuario individuales, o las prioridades relativas de las diferentes historias de usuario, pueden variar; las estimaciones pueden resultar erróneas. Esta es la oportunidad para ajustar el plan en consecuencia.
Planificación de iteraciones
Considerando la velocidad del equipo, se deben planificar los puntos de historia. La duración de la iteración puede ser de 1 a 3 semanas.
Fase de exploración
La fase de exploración de la planificación iterativa consiste en crear tareas y estimar su tiempo de implementación.
- Traduzca el requisito a tareas: Colóquelas en las tarjetas de tareas.
- Combinar/Dividir tareas: Si el programador no puede estimar la tarea porque es demasiado pequeña o demasiado grande, deberá combinarla o dividirla.
- Estimar la tarea: Calcular el tiempo que llevará implementar la tarea.
Fase de compromiso
En la fase de compromiso de la planificación de la iteración, a los programadores se les asignan tareas que hacen referencia a las diferentes historias de usuario.
- Un programador acepta una tarea: Cada programador elige una tarea de la que se responsabiliza.
- El programador estima la tarea: Dado que el programador es ahora responsable de la tarea, debe proporcionar la estimación final de la misma.
- Factor de carga de trabajo: El factor de carga representa la cantidad ideal de tiempo de desarrollo práctico por programador dentro de una iteración. Por ejemplo, en una semana de 40 horas, con 5 horas dedicadas a reuniones, esto no superaría las 35 horas.
- Equilibrio: Una vez asignadas las tareas a todos los programadores del equipo, se compara el tiempo estimado de cada tarea con la carga de trabajo. A continuación, se distribuyen las tareas equitativamente entre los programadores. Si un programador tiene demasiadas tareas asignadas, otros programadores deben asumir algunas de ellas, y viceversa.
Fase de dirección
La implementación de las tareas se lleva a cabo durante la fase de dirección de la iteración.
- Obtener una tarjeta de tarea: El programador recibe la tarjeta de tarea correspondiente a una de las tareas a las que se ha comprometido.
- Busca un compañero: El programador realizará esta tarea junto con otro programador. Esto se analiza con más detalle en la práctica de la programación en parejas .
- Diseñar la tarea: Si es necesario, los programadores diseñarán la funcionalidad de la tarea.
- Implemente la tarea utilizando el desarrollo guiado por pruebas (TDD) (ver más abajo).
- Ejecutar prueba funcional: Se ejecutan las pruebas funcionales (basadas en los requisitos de la historia de usuario y la tarjeta de tarea asociadas).
desarrollo guiado por pruebas
Las pruebas unitarias son pruebas automatizadas que verifican la funcionalidad de partes del código (por ejemplo, clases, métodos). En XP, las pruebas unitarias se escriben antes de codificar el código final. Este enfoque busca estimular al programador a pensar en las condiciones bajo las cuales su código podría fallar. XP establece que el programador ha terminado con una parte del código cuando no puede encontrar ninguna otra condición bajo la cual el código pueda fallar.
El desarrollo guiado por pruebas (TDD) se lleva a cabo mediante un ciclo rápido que recorre los siguientes pasos, cada uno de los cuales dura como máximo unos minutos, preferiblemente mucho menos. Dado que cada historia de usuario suele requerir entre uno y dos días de trabajo, será necesario un gran número de ciclos de este tipo por historia.
- Escribir pruebas unitarias : Los programadores escriben una prueba mínima que debería fallar porque la funcionalidad no se ha implementado completamente en el código de producción.
- Observa cómo falla la nueva prueba: Los programadores verifican que, efectivamente, la prueba falla. Aunque pueda parecer una pérdida de tiempo, este paso es fundamental, ya que confirma que tu suposición sobre el estado del código de producción es correcta. Si la prueba no falla, los programadores deben determinar si existe un error en el código de prueba o si el código de producción sí admite la funcionalidad descrita por la nueva prueba.
- Escribir código: Los programadores escriben el código de producción justo y necesario para que la nueva prueba pase.
- Ejecutar prueba: Las pruebas unitarias se ejecutan para verificar que el nuevo código de producción pasa la nueva prueba y que ninguna otra prueba está fallando.
- Refactorizar : Eliminar cualquier problema de diseño del código , tanto del código de producción como del código de prueba.
Para una versión más intensa del proceso anterior, consulte las Tres reglas de TDD del tío Bob. [ 4 ]
Todo el equipo
En XP, el "cliente" no es quien paga la factura, sino quien realmente usa el sistema. XP establece que el cliente debe estar siempre disponible y responder preguntas. Por ejemplo, el equipo que desarrolla un sistema de administración financiera debe incluir un administrador financiero. El equipo debe contar con todas las habilidades necesarias para entregar el producto de software.
Proceso continuo
Integración continua
El equipo de desarrollo siempre debe trabajar con la última versión del software. Dado que los distintos miembros del equipo pueden tener versiones guardadas localmente con diversas modificaciones y mejoras, deberían intentar subir su versión actual al repositorio de código cada pocas horas o cuando se produzca un fallo importante. La integración continua evitará retrasos posteriores en el ciclo del proyecto, causados por problemas de integración.
Mejora del diseño
Dado que la filosofía XP aboga por programar solo lo necesario en el momento y su implementación de la forma más sencilla posible, en ocasiones esto puede provocar que el sistema se bloquee. Uno de los síntomas es la necesidad de un mantenimiento dual (o múltiple): los cambios funcionales requieren modificaciones en varias copias del mismo código (o de uno similar). Otro síntoma es que los cambios en una parte del código afectan a muchas otras. La filosofía XP indica que, cuando esto ocurre, el sistema está indicando la necesidad de refactorizar el código modificando su arquitectura, haciéndola más simple y genérica.
Pequeños lanzamientos
La entrega del software se realiza mediante lanzamientos frecuentes de funcionalidades reales, lo que genera valor concreto. Estos lanzamientos pequeños ayudan al cliente a tener confianza en el progreso del proyecto. Esto contribuye a mantener la coherencia del equipo, ya que el cliente puede aportar sugerencias basadas en su experiencia real.
Comprensión compartida
Estándar de codificación
Un estándar de codificación es un conjunto de reglas acordadas que todo el equipo de desarrollo se compromete a seguir durante todo el proyecto. El estándar especifica un estilo y formato consistentes para el código fuente , dentro del lenguaje de programación elegido , así como diversas construcciones y patrones de programación que deben evitarse para reducir la probabilidad de defectos. [ 5 ] El estándar de codificación puede ser una convención estándar especificada por el proveedor del lenguaje (por ejemplo, las Convenciones de Código para el Lenguaje de Programación Java, recomendadas por Sun) o definida a medida por el equipo de desarrollo.
Los defensores de la Programación Extrema abogan por un código que se autodocumente en la mayor medida posible. Esto reduce la necesidad de comentarios en el código , que pueden quedar desincronizados con el propio código. [ 6 ]
Propiedad colectiva del código
Diseño sencillo
Los programadores deben adoptar un enfoque de «lo simple es mejor» en el diseño de software. Cada vez que se escribe un nuevo fragmento de código, el autor debe preguntarse: «¿Existe una forma más sencilla de implementar la misma funcionalidad?». Si la respuesta es afirmativa, se debe optar por la opción más sencilla. La refactorización también debe utilizarse para simplificar el código complejo.
Metáfora del sistema
La metáfora del sistema es una historia que todos —clientes, programadores y gerentes— pueden contar sobre cómo funciona el sistema. Es un concepto de nomenclatura para clases y métodos que debería facilitar que un miembro del equipo deduzca la funcionalidad de una clase o método en particular, solo con su nombre. Por ejemplo, un sistema de biblioteca puede crear un objeto loan_records(class)para borrowers(class), y si el objeto se vence, puede realizar una operación make_overdue en un catalogue(class). Para cada clase u operación, la funcionalidad es obvia para todo el equipo.
Bienestar del programador
ritmo sostenible
La idea es que los programadores o desarrolladores de software no trabajen más de 40 horas semanales, y si hay horas extras una semana, la siguiente no debería incluir más. Dado que los ciclos de desarrollo son cortos, con integración continua, y los ciclos completos de desarrollo (lanzamiento) son más frecuentes, los proyectos en XP no siguen el típico ritmo de trabajo intensivo que requieren otros proyectos (que exigen horas extras).
Además, este concepto incluye la idea de que las personas rinden mejor y son más creativas si están bien descansadas.
Un factor clave para lograr un ritmo de trabajo sostenible es la fusión frecuente de código y un código de alta calidad, siempre ejecutable y sometido a pruebas exhaustivas. La constante refactorización fomenta la concentración y la atención de los miembros del equipo. La intensa colaboración dentro del equipo genera la necesidad de recargar energías durante los fines de semana.
El código y los entornos, que han sido sometidos a pruebas exhaustivas, se integran de forma continua y se implementan con frecuencia, también minimizan la frecuencia de problemas e interrupciones inesperadas en la producción, así como el trabajo nocturno y de fin de semana que se requiere en consecuencia.
Véase también
Referencias
- ↑ Beck, K. Programación extrema explicada: Acepta el cambio. 2.ª ed. Addison-Wesley, 2000, págs. 54.
- ↑ Melnik, Grigori; Maurer, Frank (2004). «Introducción a los métodos ágiles: tres años de experiencia». Actas. 30.ª Conferencia Euromicro, 2004. Actas de la 30.ª Conferencia Euromicro. IEEE. págs. 334–341 . CiteSeerX 10.1.1.296.4732 . doi : 10.1109/EURMIC.2004.1333388 . ISBN 0-7695-2199-1.
- ↑ Leybourn, E. (2013). Dirigiendo la organización ágil: un enfoque Lean para la gestión empresarial. Londres: IT Governance Publishing: 146–150.
- ↑ Martin, Robert. "Tres reglas de TDD" .
- ↑ Kolawa, Adam; Huizinga, Dorota (2007). Prevención automatizada de defectos: Mejores prácticas en la gestión de software . Wiley-IEEE Computer Society Press. pág. 75. ISBN 978-0-470-04212-0.
- ↑ "XP-eXtreme Programming" . Archivado del original (PPT) el 17/12/2021 . Consultado el 31/01/2015 .
Enlaces externos
- Prácticas de XP
- Prácticas de Kent Beck XP
- Prácticas de XP de Ron Jeffries
- proceso de desarrollo de software
- Programación extrema