Introducción a desarrollo guiado por especificación TDD

Introducción a desarrollo guiado por especificación TDD

En realidad TDD significa Desarrollo guiado por pruebas, del inglés Test Driven Development. Lamentablemente es un nombre que no le hace justicia, lo que realmente guía al desarrollo siguiendo esta práctica, son las especificaciones o comportamientos.

Ya sé, ya sé, para la gente que sabe que es BDD seguro se pregunta, ¿Guiado por comportamiento?, ¿Eso no es BDD?, pero el contenido de esta publicación clarificará la estrecha relación entre TDD y BDD. Mostraremos una perspectiva en la que en esencia, son lo mismo.

Origen de TDD en la vida

Una de las características principales y de hecho el primer paso cuando se aplica desarrollo guiado por pruebas es el entender bien el problema a resolver. Es por eso que se escriben las pruebas primero, esta idea ha existido desde que el ser humano hace cualquier tipo de trabajo, ejemplo:

Un cazador enseña a su hijo como cazar una cebra y le indica que el mejor lugar para clavarla es justo debajo de la oreja, donde puede atravesar su cráneo, pero ese es un tiro muy difícil. Le dice que el tiro más facil es “Apuntar a las rayas que la cebra tiene en el pecho”. Mientras el padre dibuja las rayas en el tronco de un árbol (simplicidad).

– Sigue practicando el tiro a una distancia de 20 pasos hasta que claves la lanza correctamente”, luego -“No espera, sostén la lanza así”, más tarde – “Si, así está mejor, continua así” … – “Ahora, pídele a tu tío que te enseñe cómo hacer que la cebra se acerque a una distancia de 10 pasos” (iterativo e incremental, lotes pequeños, ciclo de retroalimentacion)

Bob Allen de codecraftsmansaturdays

El objetivo del padre y del hijo es que este último pueda cazar una cebra (enfoque). 

Lo ideal es clavar la cebra justo debajo de su oreja. Esto es una tarea difícil para el hijo, entonces utilizando un proceso iterativo e incremental, se empieza con el paso más fácil hasta ahora conocido. El paso es apuntar al pecho de la cebra a una distancia de 20 pasos (simplicidad).

Después surge otro inconveniente, sostener la lanza correctamente, por eso se trabaja en ello. Posteriormente surge otra cosa, hacer que la cebra se acerque hasta 10 pasos de distancia (lotes pequeños, iteraciones y vamos incrementando hasta la meta). Aunque no se menciona la razón, podemos suponer que, el padre se quiere asegurar que el hijo pueda clavar la cebra en el primer tiro

Ahora bien, de momento se cumple el objetivo (enfoque), cazar a una cebra, por lo que el padre y el hijo pueden detenerse ahí. Conforme se empieza a trabajar en la solución, muchas veces esta es mucho más simple de lo que se pensaba en el inicio.

El punto es que este proceso iterativo e incremental permite ahorrarnos tiempo, dinero y esfuerzo implementando una solución mucho más simple. Y si te preguntas cuál es la solución complicada, esa es la de “clavarla justo debajo de la oreja”.

TDD está basado en principios ágiles y el manifiesto

Todo este proceso natural e inconsciente sobre como clavar a una cebra, descrito en la sección anterior, gira alrededor de principios ágiles. Y estos principios a su vez se relacionan fuertemente con el manifiesto ágil.

  1. Simplicidad, el arte de maximizar el trabajo no realizado, es esencial.
    1. Algunos conocerán los principios KISS y YAGNI en programación.
    2. Así también algunos habrán escuchado NO DESPERDICIAR de Lean manufacturing
    3. LOTES PEQUEÑOS en cada iteración, de Lean Manufacturing
  2. Ciclo de retroalimentación
  3. Proceso iterativo e incremental

Estos son los más importantes desde mi punto de vista y tal vez los que más podemos notar en el día a día.

Origen de TDD en programación

Para darte una idea del origen real de TDD, voy a citar varias fuentes.

No teníamos manuales para ENIAC. Aprendimos a programar estudiando los diagramas de bloques lógicos. Que bendición. Desde el principio supe cómo funcionaban las computadoras. Nos ganamos el respeto de los ingenieros desde el principio porque realmente sabíamos lo que estábamos haciendo y pudimos depurar mejor que ellos porque teníamos nuestros programas de prueba y nuestro conocimiento de la computadora.

Betty Jean Jennings Bartik, ENIAC programmer 1946

El primer ataque al problema puede realizarse antes de comenzar la codificación. Para determinar completamente la precisión de las respuestas, es necesario tener un caso de verificación calculado a mano con el cual comparar las respuestas que luego serán calculadas por la máquina.

Esto significa que las máquinas de programas almacenados realmente nunca se utilizan para un problema de una sola vez. Siempre debe haber un elemento de iteración para que valga la pena. Los cálculos manuales se pueden realizar en cualquier momento durante la programación. Sin embargo, con frecuencia las computadoras son operadas por expertos en computación para preparar los problemas como un servicio para ingenieros o científicos.

En estos casos, es muy deseable que el “cliente” prepare el caso de verificación, en gran parte porque tal procedimiento puede señalar errores lógicos y malentendidos entre el programador y el cliente. Si el cliente va a preparar la solución de prueba, lo mejor para él es comenzar mucho antes del problema real, ya que para cualquier problema importante se necesitarán varios días o semanas para calcular la prueba

Digital Computer Programming, D.D. McCracken, 1957

Otro dato, de la época de John Von Neumann, en una entrevista realizada a Gerald. M. Weingberg por Michael Bolton

Jerry: No llamábamos a esas cosas por esos nombres en ese entonces, pero si miras mi primer libro (Computer Programming Fundamentals, Leeds & Weinberg, first edition 1961 —MB) y muchos otros desde entonces, verás que siempre fue así como pensabamos que era la única forma lógica de hacer las cosas. Lo aprendí de Bernie Dimsdale, quien lo aprendió de von Neumann.

… luego me encontré con Bernie (en 1957), quien me mostró cómo la gente verdaderamente inteligente hacía las cosas. Mi ego estaba un poco en shock al principio, pero luego me di cuenta de que si von Neumann hacía las cosas de esta manera, yo debería hacerlo.

John von Neumann fue mucho más inteligente de lo que yo seré jamás, o de lo que la mayoría de la gente será, esto significa es que debemos aprender de él …

Geral M. Weinberg

La descripción original de TDD estaba en un libro antiguo sobre programación. El libro decía, tome la cinta de entrada, escriba manualmente lo que espera en la cinta de salida, luego programe hasta que la cinta de salida real coincida con la salida esperada.

Después de escribir el primer marco xUnit en Smalltalk, recordé haber leído esto y lo probé. Ese fue el origen de TDD para mí. Al describir TDD a programadores mayores, a menudo escucho: “Por supuesto. ¿De qué otra manera podrías programar? ” Por lo tanto, me refiero a mi papel como “redescubrir” TDD.

Kent Beck

Si analizamos un poco estos últimos datos, en esa época se necesitaban ejecutar pruebas y resolver el problema en papel antes de correr el programa en la computadora porque era muy tardado volver a ejecutar el programa después de una falla ya sea por el tiempo de “ejecución” o porque las máquinas de esa época simplemente no eran tan sofisticadas como las de hoy en día.

Todo esto nos indica la importancia de las pruebas y así no retrasar el tiempo necesario para que la solución funcione correctamente y con menos esfuerzo, en la actualidad no ha cambiado mucho, eso sí, tenemos otros problemas, además el software que se desarrolla hoy en día tiene mayor escala y las funcionalidades son más sofisticadas.

Otro punto que nos enseñan estos datos, es que la comunicación entre los involucrados desde un principio es importante para evitar errores lógicos y malentendidos entre el cliente y el programador. Aquí los clientes también pueden ser  usuarios, personas de UX y product owners.

Lo descrito por Kent Beck es muy interesante, programadores más viejos están de acuerdo en que no existe una mejor manera de programar que la de escribir las pruebas primero.

En conclusión, estos datos nos abre los ojos a que las pruebas siempre han sido parte del proceso de diseño y codificación. Y que se hacen lo más antes posible (test-first programming)

OK, ¿Qué es TDD?

Es una disciplina que te permite eliminar el miedo a modificar el código de un software, lo que resulta en la limpieza constante del código, por lo que se asegura que el software escale de manera fluida, sin retrasos y dolores de cabeza. Permitiendo tener un software lo suficientemente flexible para poder adaptarse a cualquier cambio.

TDD es una práctica ágil, por consiguiente basada en principios ágiles que nos permite tener una guía en el desarrollo de software para nunca perder el enfoque.

TDD se basa en la mentalidad de prevenir defectos en lugar de resolverlos después, es obvio que no se puede prevenir todos los casos, pero si un gran número con un conjunto de pruebas bien hechas.

Históricamente hablando, ha probado ser en la gran mayoría de los casos, la mejor manera de crear productos de calidad. Significa Desarrollo guiado por pruebas (Test Driven Development), pero como mencionamos antes, la palabra especificación, la describe mejor, algo así como SDD, Specification Driven Development.

Red-Green-Refactor

En la práctica, consiste en tres pasos segun Kent Beck:

  1. RED. Escribe una pequeña prueba que no funcione, tal vez ni siquiera compile al principio
  2. GREEN. Haz que la prueba funcione rápidamente, cometiendo los pecados necesarios en el proceso.
  3. REFACTOR. Elimina todo el código duplicado creado

Ahora bien, cuáles son los beneficios principales:

  • Ciclo de retroalimentación y comunicación
  • Crear calidad, no medirla
  • Herramienta de diseño
  • Elimina el miedo a cambiar o mejorar el código
  • Documentación precisa

TDD como ciclo de retroalimentación y comunicación

Las organizaciones que diseñan sistemas (en el sentido amplio) están limitadas a producir diseños que son copias de las estructuras de comunicación de dichas organizaciones.

Melvin E. Conway, 1968

Individuos e interacciones sobre procesos y herramientas

Manifiesto ágil

Un ciclo de retroalimentación es muy importante para todo lo que hacemos, entre más pronto tengamos retroalimentación, más pronto podemos reaccionar y corregir nuestras acciones.

Cualquier metodología, framework o proceso ágil tiene como uno de sus elementos principales uno o varios ciclos de retroalimentación. Por ejemplo, en scrum, cada iteración llamada sprint es un ciclo de retroalimentación, las retroespectivas es claramente otro. Todos los días el daily es un ciclo retroalimentación. Cada release es un ciclo retroalimentación.

Estos ciclos de retroalimentación nos permiten tener una excelente comunicación y de forma constante.

TDD es lo mismo que BDD

Pero hablando en conjunto, desde el punto de vista técnico y de negocio, trasladado al código, el cual es el que nos permite cumplir con el comportamiento deseado de una determinada aplicación, ¿Existe algún ciclo de retroalimentación? ¿Qué nos permita corregir errores lo más pronto posible?

Respuesta ante el cambio sobre seguir un plan

Manifiesto ágil

Claro que sí, existen dos prácticas muy útiles para esto, una se llama BDD y la otra TDD, estas prácticas responden dos preguntas muy importantes:

  1. ¿Estamos construyendo el software correcto?, ¿El que el usuario final necesita?
  2. ¿Estamos construyendo correctamente el software, ¿Con la suficiente flexibilidad que permita adaptarse a las nuevas necesidades de los usuarios?

Aunque BDD y TDD parecen que son dos cosas diferentes, en realidad son lo mismo, TDD se empezó a utilizar primero, de hecho se creaban pruebas de aceptación, de integración y unitarios usando TDD. Luego, apareció ATDD y BDD (con ayuda de DDD) como extensiones de TDD.

En realidad BDD aporta a TDD:

  1. La mejora en la retroalimentación y comunicación entre todo el equipo, programadores y no programadores
  2. Comportamientos documentados con mayor claridad y precisión

Lo que escribimos en código de prueba son el reflejo de las especificaciones, el objetivo primordial de las pruebas no es verificar exactamente que una clase o método se ejecute correctamente, sino cómo se comporta según el deseo implícito de los usuarios finales, y este deseo implícito se plasma explícitamente en las especificaciones creadas antes de empezar escribir código de programación. 

Lo anterior es muy importante porque nos da el objetivo y el foco correcto a nuestro desarrollo.  Esta idea la podemos decir de las siguientes formas, desarrollo guiado por:

  • Especificación.
  • El dominio
  • Comportamiento
  • Pruebas, la definición más conocida y que lamentablemente genera más confusión.

TDD para crear calidad, no para medirla

La palabra Testing (Prueba) en el mundo de QA (Quality assurance), quiere decir probar después de que el software está desarrollado, probar y probar hasta comprobar que el software no tiene defectos. Debido a esto, las pruebas de QA son una forma de medir la calidad de un producto, pero no es una forma de construir un producto con calidad.

El ciclo de retroalimentación que nos da el escribir y terminar una funcionalidad y luego probar es ineficiente porque la retroalimentación se obtiene muy tarde. Es posible trabajar en algo equivocado por minutos, horas y hasta días, a veces ese trabajo tiene que ser desechado o mínimo con muchos cambios.

Cuando la retroalimentación se retrasa mucho tiempo, por ejemplo, después de un ciclo de pruebas por parte de QA, el desarrollador encargado no tiene el contexto o no lo recuerda bien. Y esto genera más gastos, porque una vez reportado por QA se debe de encontrar la fuente del defecto y replicarlo, luego entender el problema, entender el código relacionado y además el tiempo que se tome corregirlo. Y otra vez QA prueba y reporta si el bug ha sido arreglado o no.

De nuevo el principio de Lean manufacturing sobre trabajar sobre cosas simples y pequeñas, no esperar a encontrar errores o mitigarlos hasta el final de la cadena de producción, sino en cada pequeña etapa del proceso tener uno o más ciclos completos de retroalimentación.

Ayuda a devops

Esto último va de la mano con la integración continua y despliegue continuo, si las pruebas fallan, no se puede establecer una integración y mucho menos un despliegue a producción.

Dado que un ciclo de retroalimentación temprana sucede en varios niveles del software, las incidencias aparecen antes de una integración y también mucho antes de un despliegue.

Claro que nunca se podrá mitigar todas los bugs o incidencias, pero por supuesto que se puede disminuir en una gran proporción, esto de igual manera resulta en reducción de costos, tiempo y esfuerzo.

El ambiente en los equipos se vuelve productivo, mejora la comunicación y seguridad en que de verdad se está entregando un producto de calidad, esto produce estimaciones más precisas, seguras, y honestas.

TDD como herramienta de diseño

Colaboración con el cliente sobre negociación contractual

Manifiesto ágil

Al escribir las pruebas primero (test-first programming) nos enfocamos en que el código de producción sea accesible desde el código de pruebas y sea fácil de probar. Esto quiere decir que desde un inicio nos preocupamos por el diseño y la arquitectura de nuestro código de producción, porque para que nuestro código de producción sea accesible y fácil de probar debe estar desacoplado.

Al escribir las pruebas, nuestra perspectiva de programador cambia, ahora pensamos en como otros programadores van a usar la API de nuestra funcionalidad antes de crearla, también desde la perspectiva de negocio porque cuando escribimos nuestras pruebas, a menudo nuevas dudas surgen que debemos indagar con personas que no son necesariamente programadores (muchas veces con cliente y usuarios).

Cada una de nuestras pruebas deben ejecutarse independientemente de las otras, en  nuestro esfuerzo de hacer que las pruebas se ejecuten independientemente, mejoramos el diseño del software, por ejemplo, una prueba unitaria corre dentro de un ambiente que no es real, se ejecuta sobre lo que llamamos test fixtures y sus dependencias (muchas de las cuales serán código de producción) deben ser lo bastante flexibles de tal manera que permitan ser sustituidas, invocadas y verificadas fácilmente. Esto permite crear un software con alta cohesión y bajo acoplamiento, es decir, con un buen diseño y una buena arquitectura.

Nuestros diseños deben consistir en muchos componentes altamente cohesivos y débilmente acoplados, solo para facilitar las pruebas.

Kent Beck

El código de pruebas debe desarrollarse con la más alta calidad posible, deben ser fácil de entender y fácil de ejecutar de manera independiente, y al enfocarnos en este aspecto, el código de producción creado también resulta de la más alta calidad posible. Sin perder de vista que esto sucede paso a pasito, en un proceso enfocado a la simplicidad, iterativo e incremental.

El resultado de un buen diseño, también resulta en que las modificaciones de código se hacen mucho más rápido, y esto quiere decir que no necesitas quedarte horas extras programando, tendrás más tiempo personal, que puedes compartir con tu familia, hijos, con tu pareja (o amante), etcétera.

TDD elimina el miedo a modificar el código

¿Por qué la mayoría de los programadores tienen miedo de hacer cambios a su código? ¡Tienen miedo de romper el código! ¿Por qué tienen miedo de romper el código? Porque no tienen pruebas.

Robert C. Martin, The Clean Coder: A Code of Conduct for Professional Programmers

Las pruebas son más importantes que el código de producción porque permiten que el sistema se vuelva flexible, de otra manera el miedo a la modificación del código crece, porque se teme romper la funcionalidad, y entonces el software ya no es adaptable, poco a poco, entre más evoluciona, menos flexible se vuelve por miedo a realizar modificaciones que rompan el producto.

¿No te ha pasado en algún proyecto, donde necesitas hacer unas modificaciones al código, y existen partes que mejor ni las tocas por miedo de romper alguna funcionalidad?, porque realmente no estás seguro de lo que esa parte del código hace y no tienes un conjunto de pruebas que respalde tus cambios.

¿Qué es código legacy?

Codigo que los programadores tienen miedo cambiar

Eli Lopia CEO de typemock

Código sin pruebas

Michael C. Feather

TDD permite mitigar el miedo de modificar tu código o el de otra persona. ¿Cómo puedes tener seguridad de que las funcionalidades que desarrollas tienen la calidad suficiente para decir que está terminado? Sin un conjunto de pruebas no tienes esa seguridad, y como ya hemos comentado antes, esperar retroalimentación hasta el ciclo de pruebas de un equipo de QA, es demasiado tarde.

Cuando se tiene un buen conjunto de pruebas, no tienes miedo de hacer los cambios necesarios, porque si rompes algo, las pruebas te lo advierten casi en tiempo real mientras estás realizando las modificaciones.

Individuos e interacciones sobre procesos y herramientas

Manifiesto ágil

Segun Ken Beck el miedo tiene los siguientes efectos, te hace:

  • Inseguro sobre el código que escribes
  • Querer comunicar menos
  • Tímido a la retroalimentación
  • Gruñón

Ningún efecto de arriba es de ayuda a la hora de programar y menos cuando nos enfrentamos a un problema complicado. Así que Kent Beck recomienda los siguientes puntos usando TDD:

  • En lugar de dudar de tu código, empieza a aprender cosas concretas lo más rápido posible. Paso a pasito, lotes pequeños y de manera iterativa e incremental con el ciclo red-green-refactor.
  • En lugar de quedarte callado, comunícate más claramente. Al usar TDD aumentas la calidad y por consiguiente estás dispuesto a comunicar dudas o problemas que enfrentas a la ahora de programar
  • En lugar de evitar retroalimentación, busca ayuda, y retroalimentación concreta.
  • (Sobre lo gruñón, estas por tu cuenta). Pero con más seguridad en tu código, menos problemas y más tiempo personal, seguro que tu nivel de gruñón bajará.

TDD como documentación precisa

Software funcionando sobre documentación extensiva

Manifiesto ágil

Para tener una documentación detallada es necesario mucho tiempo y esfuerzo porque la documentación siempre cambia conforme se le agregan nuevas funcionalidades o se modifican las ya existentes. Entonces ese tiempo y esfuerzo mejor se invierte en obtener software funcionando que puede ser presentado al cliente y obtener retroalimentación. Es muy difícil mantener sincronizada la documentación con el verdadero funcionamiento (con el código), con el tiempo la documentación miente sobre la funcionalidad, la única fuente de verdad es el código, el código no miente.

La mejor documentación e instrucciones de como funciona una pieza del sistema se encuentran en las personas y el código que ellas crean. Es de valor inigualable poner énfasis en la excelencia técnica y al buen diseño para mejorar la agilidad, es decir, código limpio, bien diseñado y utilizando TDD y BDD. De esta forma no necesitas llegar al detalle de alguna pieza del sistema, simplemente la usas con seguridad del resultado debido al buen diseño y a la calidad de la misma, lo que por supuesto te ahorra muchísimo tiempo. Claro que esto no se puede lograr sin las personas, sin su disciplina y auto organización.

Para ponerlo más claro, cuando tienes la disciplina de hacer TDD, cada una de las pruebas que creas, describe perfectamente como cada función o método, clase y/o componente se utiliza, de una manera tan precisa que si algo va mal cuando se está modificando, al menos una de las pruebas fallara casi al instante.

Cuando realizas pruebas de métodos y funciones, tienes que describir que parámetros reciben y que resultados regresan ¿Qué más documentación necesitas? Tampoco digo que nunca se haga documentación, claro que si, pero es una inversión de tiempo, dinero y esfuerzo, que puedes disminuir considerablemente y que puedes posponer hasta las etapas más estables del producto, cuando se sabe que su funcionalidad cambiará poco o en intervalos más largos de tiempo.

Al final, como programadores, siempre nos aseguramos o solo confiamos al 100% sobre como funciona cualquier API de software hasta que le echamos un ojo al código y lo probamos. Y sería estupendo que la funcionalidad del código esté descrita detalladamente a través de un conjunto de pruebas.

References

https://arialdomartini.wordpress.com/2012/07/20/you-wont-believe-how-old-tdd-is/

http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF

https://www.developsense.com/blog/2011/01/jerry-weinberg-interview-from-2008/

https://associationforsoftwaretesting.org/2014/11/02/how-to-sell-tdd-to-x/

https://www.computerworld.com/article/2470893/jean-bartik–last-of-the-original-eniac-programmers–86.html

https://en.wikipedia.org/wiki/ENIAC

https://es.wikipedia.org/wiki/Jean_Jennings_Bartik

https://www.quora.com/Why-does-Kent-Beck-refer-to-the-rediscovery-of-test-driven-development-Whats-the-history-of-test-driven-development-before-Kent-Becks-rediscovery

https://agileforall.com/history-of-tdd-as-told-in-quotes/

Test-Driven development: by example

Paradigma de programación en JavaScript

JavaScript programming paradigm

What is a programming paradigm?

The model or map of how we see the real world, that is a paradigm, it is a way of seeing and doing things. Following this logic, a programming paradigm is nothing more than a way of viewing and creating programming code.

Paradigms are powerful because they create the glasses or lenses through which we see the world.

Stephen R. Covey

There are three main programming paradigms used today and in JavaScript they have always existed since its first version.

  • Structured programming paradigm
  • Object-oriented
  • Functional

Now, if we stick to the phrase of Stephen R. Covey, that paradigms create the lenses through which we see the world. Let's imagine that the three previous paradigms, each, are a pair of glasses that we put on when programming and that we can change those glasses according to our visual needs (for programming or problem solving).

Structured programming paradigm

Origin

In 1954 the FORTRAN programming language appeared, then in 1958 ALGOL and in 1959 COBOL. Time after Edsger Wybe Dijkstra in 1968 discover the structured programming paradigm, we say “discover” because they didn't actually invent it. Although this programming paradigm was formalized some time after the appearance of these programming languages, it was possible to do structured programming in them.

Dijkstra He recognized that programming was difficult, and programmers don't do it very well, which I totally agree with. A program of any complexity has many details for the human brain. In fact, the Neuroscience tells us that the focused mind It can only work with four pieces of data at a time, at most. For this reason, if one small detail is neglected, we create programs that seem to work well, but fail in ways you never imagine.

Evidence

Dijkstra's solution was to use tests, only these tests used a lot of mathematics, which was quite difficult to implement. During his research he found that certain uses of GOTO made it difficult to decompose a large program into smaller pieces, it could not be applied “divide and conquer”, necessary to create reasonable evidence.

Sequence, selection and iteration

Patrones de la programación estructurada
Patterns of structured programming

Böhm and Jacopini They proved two years earlier that all programs can be built by just three structures: sequence, selection and iteration. Dijkstra already knew these three structures and discovered that these are the ones necessary to make any part of the program tested. This is where the structured programming paradigm is formalized.

Edsger tells us that it is bad practice to use GOTO and suggests better using the following control structures:

  • If, then, else (selection)
  • do, while, until (iteration or repetition)

Decomposition of small units easy to test

Nowadays most programming languages use structured programming, JavaScript uses this type of programming. The simplest example is if conditions.

const EDAD_MINIMA = 18;
if (edad >= EDAD_MINIMA) {
	// hacer algo porque es mayor que 18
} else {
	// Hacer otra cosa en caso contraio
}

And if we isolate it in a function, we have a decomposition of functionalities or units that can be tested more easily. In the next section we will see the importance of having a completely probable unit

const EDAD_MINIMA = 18;
functions esMayorEdad(edad) {
  if (edad >= EDAD_MINIMA) {
     return true;
  } else {
     return false;
  }
}

With this condition we have direct control of what can happen if the age is greater than or equal to 18, and also in the event that the age is younger.

Let's not be so strict either, surely the GOTO ruling has its merits and perhaps it was very efficient in some cases, but I think that to avoid misuses that probably caused disasters, Dijkstra recommended to stop using GOTO.

Test, divide and conquer

Structured programming allows us to apply the “divide and conquer” philosophy, because we allows you to create small unit tests, until the entire program is covered. The mathematical solution of Wybe Dijkstra It was never built, precisely because of its difficulty in implementation. And unfortunately today there are still programmers who do not believe that formal tests are useful for create high quality software.

And I say create, because verify correct operation after create, is nothing more than a simple measurement and the opportunity to reduce time and money is lost.

Scientific method, experiments and impiricism

Método científico, experimentos y pruebas
Scientific method, experiments and tests, by ThisIsEngineering Raeng on unsplash

The good news is that the mathematical method is not the only way to verify our code, we also have the scientific method. Which cannot prove that things are absolutely correct from a mathematical point of view. What we can do is create experiments and obtain enough results to verify that our theories work. Since our theories work on these experiments, then we conclude that they are “correct” enough for our validation purposes.

If the theory is easily validated as false, then it is time to modify or change it. This is the scientific method and this is how tests are currently done:

First we establish our theory (write the test), then we build the experiments (write production code) and finally we verify (run the test) and repeat this cycle until we have enough evidence.

Doesn't this sound like a current agile practice called TDD?

Tests show the presence, not the absence, of defects

Edsger Wybe Dijkstra said “Testing shows the presence, not the absence, of defects.” That is, a program can be proven wrong by testing, but it cannot be proven correct. All we can do with our tests is validate that our program works well enough for our goals. But we can never be one hundred percent sure of the absence of defects.

If we can never be one hundred percent sure that our code is correct, even with its tests, what makes us think that without tests we deliver a program with sufficient validity to affirm that no negligence is consciously committed?

direct control

lto structured programming teaches us about direct control, that is, controlling the sequential flow of operations through the control structures, without neglecting the recommendation of Wybe Dijkstra about GOTO. This recommendation also applies to statements that drastically change the normal flow of operations, for example a break within a cycle for nested, that break It breaks direct control because it abruptly complicates the understanding of the algorithm. Let's not be purists either, there will surely be cases where you need these sentences, but in the first instance, try to avoid them.

In conclusion, the structured programming paradigm teaches us:

The direct, clear and explicit control of what a piece of code does

Object-oriented programming paradigm

Arised from functions?

The object-oriented programming paradigm was discovered in 1966 by Ole Johan Dahl and Kristen Nygaard when they were developing simula 67. Two years before structured programming and its adoption by the programming community was some time later. In 1967 it was launched Simulates 67, Simulates It was the first object-oriented programming language, it basically added classes and objects to ALGOL, initially Simula was going to be a kind of extension of ALGOL.

During the development of Simula, it was observed that the execution of an ALGOL function requires certain data, which could be moved to a tree structure. This tree structure is a Heap.

The heap allowed you to declare local variables of the function that can exist even after the function returns a value. Doesn't this last sound like what closure is in JavaScript?

The parent function becomes a constructor, the local variables become the properties, and the child (nested) functions become its methods. In fact, this pattern is still widely used by Javascript to create modules and use functional inheritance. This also describes how classes work in Javascript, behind are functions.

Spread of polymorphism

All this helped a lot to implement polymorphism in object-oriented programming languages. Ole Johan Dahl and Kristen Nygaard invented the notation:

object.function(parametro)

The execution of function that belongs to object, but more importantly, we pass a message through parameters from the first part of the code to the second part located in a different object.

Molecular biology and message passing

Paso de mensajes entre células
Passing messages between cells, Image modified from “Signaling molecules and cellular receptors: Figure 1,” by OpenStax College, Biology (CC BY 3.0).

Some time later it was created Smalltalk, a much more sophisticated and modern object-oriented programming language, in charge of this project was Alan Kay. This person is credited with the formal definition of object-oriented programming.

The main influence on Alan Kay's object-oriented programming was biology, he has a degree in biology. Although it is obvious that it was influenced by Simula, the influence of LISP (functional programming language) is not so obvious.

From the beginning he thought of objects as interconnected cells in a network, from which they could communicate through messages.

Alan Kay commented:

I'm sorry I coined the term a long time ago. Objects for programming because it made people focus on the least important part. The big idea is “Sending messages“.

Alan Kay

My English is bad so you can check the original text here.

Better object composition over class inheritance

Smalltalk It also allowed the creation of Self, created at Xerox Parc and later migrated to Sun Microsystems Labs. It is said that Self It is an evolution of smalltalk.

In this programming language the idea of prototypes, eliminating the use of classes to create objects, this language uses the objects themselves to allow one object to reuse the functionalities of another.

Self It is a fast language and is generally known for its great performance, self It did a good job on garbage collection systems and also used a virtual machine to manage its execution and memory.

The virtual machine Java HotSpot It could be created thanks to Self. Lars Bak one of Self's latest contributors, he was in charge of creating the V8 Javascript engine. Due to the influence of Self we have today the engine of JavaScript V8, which uses it node.js, mongoDB and Google Chrome internally.

Self followed one of the book's recommendations Design Patterns: Elements of Reusable Object-Oriented Software, long before it came out, published this recommendation:

Better composition of objects to class inheritance.

Design Patterns: Elements of Reusable Object-Oriented Software

Example

Currently Javascript uses prototypes for code reuse, you could say that it uses composition, instead of inheritance. Let's look at an example:

const person = {
    greet () {
      return 'Hola'
    }
};
// se crea un programador con el prototipo igual al objeto persona
const programmer = object.create(persona);
programmer.programar  = () => 'if true';
const saludo = programmer.greet();
const codigo = programmer.programar();
console.log(saludo); // 'Hola'
console.log(codigo); // 'if true'

The object programmer It is based on the prototype of `person`. It doesn't inherit, it just directly reuses the functionality of `person`.

JavaScript emerged shortly after JAVA, in the same year. JavaScript took influences from Self, and in turn Self was influenced by smalltalk.

The syntax of current classes in Javascript is nothing more than a facade, well a little more accurately they are an evolution of the constructor functions, but internally, their basis are functions and prototypes.

Communication with message passing

As we already saw, the origin of object-oriented programming has its origins in functions, and the main idea has always been communication between objects through message passing. We can say that Object-oriented programming tells us of message passing as a key piece for the communication of objects, for example, when a method of one object invokes the method of another.

object.function(parametro);

In conclusion, the object-oriented programming paradigm teaches us:

Message passing for communication between objects

Functional programming paradigm

lambda calculation

Image taken from https://www.slideshare.net/FASTPresentations/introduction-to-lambda-calculus-using-smalltalk-by-facundo-javier-gelatti

Functional programming is the oldest programming paradigm, in fact its discovery was long before computer programming, it was discovered in 1936 by Alonzo Church, when I invented the lambda calculus, based on the same problem to be solved by your student Alan Turing.

As a curious fact, the symbol of the lambda calculus is:

λ

The first language based on functional programming was LISP, created by John McCarthy. As we saw previously, Alan Kay also took influence from LISP to create Smalltalk, with this we can see that the programming paradigms can be united and their relationship between them arises from the idea of how to solve problems more efficiently, they are not fighting, nor Separated, they seek the same goal and somehow evolve together.

The basis of the lambda calculus is immutability, We will review this concept later.

Similarities with OO and structured paradigms

As we saw in the structured programming paradigm, we can decompose our programs into smaller units called procedures or functions. Since functional programming is the oldest paradigm, we can say that the structured programming paradigm also relies on functional programming.

Now, if we analyze the notation a little object.function(x) that we saw in the object-oriented programming paradigm section, is not very different from function(object, parameters), these two lines below are the same, the fundamental idea is the passing of messages, as Alan Kay tells us.

object.function(parametro);
function(objeto, parametro);

Smalltalk uses the “The Actor Model”, which says that actors communicate with each other through messages.

On the other hand we have LISP, which has a “Function dispatcher model” What we currently call functional language, these models are identical, because what functions and methods do is send messages between actors.

An example of this is when a function calls another function or when an object's method is invoked, what happens is that actors exist and they communicate with each other through messages.

Message passing again

So we can emphasize that the main idea of OOP is the sending of messages and that it is not very different from functional programming, in fact according to what we already established in the previous sections, OOP was born from a functional base. And here it is important to highlight what he said Alan Kay Co-creator of SmallTalk:

I'm sorry I coined the term a long time ago. Objects for programming because it made people focus on the least important part. The big idea is “Sending messages“.

Alan Kay

From the communication models between Smalltalk and LISP messages, it was created scheme.

scheme has the goodness to use tail recursion and closure to obtain a functional language, closure allows access to the variables of an external function even when it has already returned a value. This is the same principle that gave rise to object-oriented programming by Ole Johan Dahl and Kristen Nygaard. Do you remember the closure question in Javascript?

Javascript uses closure a lot in its functional programming paradigm. JavaScript took influences from scheme, at the same time scheme was influenced by LISP.

No side effects

The basis of the lambda calculus is immutability, therefore, lImmutability is also the basis of the functional programming paradigm.

We as functional programmers must follow this principle and limit object mutations as much as possible to avoid side effects.

I repeat, the main idea of functional programming is immutability, which allows you to create your programs with fewer errors by not producing side effects that are difficult to control.

As an example, suppose we have an object person and we want to “change” the name, the most obvious thing would be to modify the name property directly, but what happens if that object is used elsewhere and the name is expected to be “Jaime”, that is why instead of changing the name property , we only create a new person object with a different name, without modifying the original.

functions cambiarNombre(name, person) {
  return {
    name: name,
    edad: person.edad
  }
}
const James = { name: 'Jaime', edad: 30 };
const juan = cambiarNombre('Juan', jaime);
console.log(jaime); // { nombre: 'Jaime', edad: 30 }
console.log(juan); // { nombre: 'Juan', edad: 30 }

Here you will find more details about the fundamental principles of functional programming:

Introduction to functional programming

Finally, the functional programming paradigm teaches us:

No side effects, for clear expression and less prone to errors

Conclusion

It is important to note that if the three programming paradigms were implemented between 1958 with LISP (functional programming) and Simula (object-oriented programming) in 1966, and the discovery of the structured programming paradigm in 1968, in only a period of 10 For years there has been innovation in programming paradigms, and new paradigms have not really emerged, unless they are based on these three main ones.

Right now more than 60 years have passed, which tells us the importance and firmness they have despite the time that has passed.

  • Functional programming paradigm (1958, already implemented in a programming language for computers, remember that it was discovered in 1936)
  • Object Oriented (1966)
  • Structured (1968)

The implementation of these three paradigms from the beginning within JavaScript has made this programming language the global success it is today. And it proves to us the value of combining paradigms when writing our programs.

JavaScript is a multi-paradigm programming language, so you can combine the paradigms to create much more efficient and expressive code using:

  • The direct, clear and explicit control of what a piece of code does
  • Message passing for communication between objects
  • No side effects, for clear expression and less prone to errors

References

https://en.wikipedia.org/wiki/Structured_programming

https://en.wikipedia.org/wiki/Structured_program_theorem

http://wiki.c2.com/?AlanKayOnMessaging

https://www.slideshare.net/FASTPresentations/introduction-to-lambda-calculus-using-smalltalk-by-facundo-javier-gelatti

Clean architecture book

Todo sobre programación en parejas. Pair programming

Todo sobre programación en parejas. Pair programming

¿Qué es la programación en parejas?

Programación en pareja
Programación en pareja, tomada de https://miro.medium.com/max/700/1*sBJhFwmpfbftanqzxOeK_w.jpeg

La programación en parejas es una práctica ágil donde dos personas trabajan en una sola computadora para resolver un problema. La programación en pareja abre un canal de comunicación y retroalimentación inmediata entre dos personas, para analizar, diseñar, probar y crear una solución utilizando código de programación.

¿Cuántas veces no hemos necesitado ayuda para resolver un problema?

¿Para lavar los trastes? – Oye, dejaste jabón en esa parte, – El plato tiene una manchita ahí.

También cuando manejamos un automóvil, nuestro copiloto nos dice:

  • Dobla a la derecha, este camino es más corto.
  • ¡Aguas de este lado viene carro! ¡Ahí hay un bache!

Aquí es donde otra persona y dos ojos más entran en acción.

Las grandes cosas vienen en parejas

Parejas de inventores, músicos, pintores y emprendedores
Parejas de inventores, músicos, pintores y emprendedores

De izquierda a derecha y de arriba hacia abajo:

Origen de la programación en parejas

Año 0

Desde un inicio, desde que existe la interacción social, siempre se busca simplificar las tareas y hacerlas con la mejor calidad posible.  Como vemos en la sección anterior, el trabajo en pareja siempre ha existido y da muy buenos resultados.

Un cazador enseña a su hijo como cazar una cebra y le indica que el mejor lugar para clavarla es justo debajo de la oreja, donde puede atravesar su cráneo, pero ese es un tiro muy difícil. El tiro más fácil es – “Apuntar a las rayas que la cebra tiene en el pecho” (mientras dibuja las rayas en el tronco de un árbol).

– “Sigue practicando el tiro a una distancia de 20 pasos hasta que claves la lanza correctamente”, luego -“No espera, sostén la lanza así”, más tarde – “Si, así está mejor, continua así” … – “Ahora, pídele a tu tío que te enseñe cómo hacer que la cebra se acerque a una distancia de 10 pasos”

Bob Allen de codecraftsmansaturdays

Programadoras de ENIAC, 1946

Betty Jean Jennings Bartik y Frances Bilas Spence usando ENIAC
Betty Jean Jennings Bartik y Frances Bilas Spence usando ENIAC

Betty Snyder y yo, desde el principio, éramos una pareja. Y creo que el mejor diseño y todas esas cosas son hechas en pareja porque mutuamente se puede criticar, identificar errores y usar las mejores ideas de ambos.

Betty Jean Jennings Bartik, ENIAC programmer 1946

Jean Bartik formó parte de las ahora justamente reconocidas primeras programadoras de ENIAC, donde según fuentes también practicaban “Test First development”.

Frederick Phillips Brook, 1953

Fred Brook, autor del libro The Mythical Man-Month: Essays on Software Engineering del año 1975, un libro sobre ingeniería de software y administración de proyectos. También conocido por la ley de Brook, la cual empezó a definirla cuando trabajaba para IBM en el desarrollo del sistema operativo OS/360. En este libro él menciona lo siguiente:

Agregar mano de obra a un proyecto de software retrasado, lo retrasa aún más.

Frederick Phillips Brook

Brook le escribió a Laurie Williams:

Compañero de posgrado Bill Wright y yo probamos por primera vez la programación en parejas cuando era un estudiante graduado (1953 -1956). Produjimos 1.500 líneas de código libre de defectos; se ejecutó correctamente en el primer intento.

Frederick Phillips Brook

Richard P. Gabriel en 1972

1972-1973,  Dick Gabriel hace programación en pareja con Jonl White, usando Lisp como lenguaje de programación.  Después como encargado del desarrollo de Common Lisp, programación en parejas fue una de las prácticas principales.

Dynamic Duos, 1978-1988

Larry Constantine, pionero en la ingeniera de software, con más de 200 publicaciones y 22 libros. Reporto en su visita a Whitesmiths Inc. que en cada terminal  había dos programadores trabajando. Le llamó “Dynamic Duo”, Whitesmiths creó el primer compilador comercial del lenguaje de programación C.

Patron organizativo “Developing in pairs“, 1995

James Coplien publico el patrón organizativo “Developing in pairs” basado en las investigaciones de Pasteur Project en Bells Labs en el libro Pattern Languages of Program Design, y dijo:

“Las personas a veces sienten que pueden resolver un problema solo si tienen ayuda. Algunos problemas son más grandes que los de cualquier individuo”. La solución propuesta del patrón organizacional es “emparejar diseñadores compatibles para trabajar juntos; …

James Coplien

El proyecto Pasteur extrajo muestras empíricas de 50 organizaciones de desarrollo de software altamente efectivas, usando técnicas de análisis y recopilación de datos similares a las usadas por sociólogos y antropólogos.

Extreme Programming, Kent Beck 1998

Finalmente Kent Beck, unos de los firmantes del manifiesto ágil, creador de programación extrema y de sus propias palabras, el “redescubridor de TDD” en 1998 agregó “pair programming” como una de las prácticas de Extreme Programming.

Beneficios de programación en parejas

Todos los beneficios de más abajo se resumen en los tres principales aquí listados, que desde el punto de vista de negocio, son el objetivo de implementar cualquier práctica ágil.

  1. Disminuir los tiempos
  2. Reducir el Estrés
  3. Aumentar el Dinero o las ganancias

Además estos beneficios son el resultado de aplicar los siguientes principios ágiles:

  • Individuos e interacciones sobre procesos y herramientas.
  • Respuesta ante el cambio sobre seguir un plan.
  • Software funcionando sobre documentación extensiva.

Canal de comunicación y colaboración

Se abren muchos canales de comunicación (más si se rotan las parejas) que estimulan la colaboración. Si combinamos diferentes perspectivas, ideas, conocimiento técnico y conocimiento del negocio, entonces el resultado es una solución superior,  una solución más simple y más sólida. Sin mencionar que el tiempo en llegar a una solución se reduce considerablemente.

Muchísimas veces ni siquiera tenemos que esperar a que nuestra prueba falle o esperar a debuguear para notar un error, nuestro compañero con su lindo cerebro y sus dos ojos nos lo puede indicar de inmediato.

Incluso ni siquiera tenemos que recordar la especificación del problema a resolver (por eso de la pérdida de enfoque), porque tenemos otra mente que nos lo recuerda.

Code Review Continuo

Cuando se está programando en pares se obtiene retroalimentación inmediata de nuestro compañero, vamos a llamarle “code review instantáneo”. Así que actuamos ante ese cambio de idea, perspectiva, mejora, error cometido, cualquier cosa que nos ayude a resolver el problema o mejorar la solución.

  • Te falta un punto y coma.
  • ¿No te falto definir la variable que contiene los datos de tu parámetro?
  • Ahí debe ser un string no la referencia al método

Son frases que he escuchado mucho antes de ejecutar la verificación de la prueba, el feedback o review lo obtengo aún mucho más rápido que la prueba automatizada. Esto en realidad es un ciclo de retroalimentación más eficiente.

Esparcir el conocimiento técnico y de negocio

  1. Transferencia de conocimiento, siempre existe algo que aprender del compañero, tanto del entendimiento del problema y el negocio, como técnicamente.
  2. Esparcimiento y homologación del estándar y estilo de programación definido por el proyecto.
  3. Si un integrante del equipo se va, no importa, todos los demás tienen contexto y el conocimiento adecuado.
    1. Mucho menos tiempo descubriendo lo que hizo el excompañero
  4. Los nuevos integrantes del equipo obtienen el conocimiento y el contexto rápidamente de los compañeros con más tiempo en el proyecto, preguntando y haciendo programación en parejas.

Aumento en la calidad del producto

Si solo armas lo primero que piensas, nunca tendrás tiempo para pensar en una segunda cosa mejor.

Kent Beck
  1. Diferentes perspectivas que ayudan a encontrar una solución mucho más simple. Esto significa menos tiempo desarrollando, las soluciones simples son mucho más sustentables, es más fácil comprenderlas, implementarlas en otros lugares/casos, modificarlas y mejorarlas. Siguiendo el principio ágil de “Simplicidad, el arte de maximizar el trabajo no realizado”.
  2. Combinación de ideas y creatividad para mejorar la solución. Casi siempre el desarrollo de cualquier cosa que usa dos mentes, resulta en un diseño superior. Y este punto se relaciona mucho con el siguiente principio ágil. “La excelencia técnica y el buen diseño, mejoran la agilidad”.
  3. Utilizar cada pieza del sistema como una verdadera caja negra, debido a un diseño superior creado por dos mentes, porque es simple y de mayor calidad, nos ahorra tiempo revisando los cables detrás de una funcionalidad. Nos permite enfocarnos en el problema y no como funcionan las piezas necesarias.
  4. Disminuye la necesidad de documentación en etapas tempranas de desarrollo. Por que el conocimiento se esparce, la documentación pierde sentido en etapas tempranas, una documentación solo funciona cuando se tiene una versión muy estable de una pieza de software, no queremos perder el tiempo en modificar la documentación cada vez que cambiamos algo en el código.
    1. Lo recomendado es invertir ese tiempo en tener un conjunto de pruebas automatizadas y claramente diseñadas, enfocándose en transmitir de manera transparente los requerimientos, que sean fácilmente entendidos en la primera lectura. No necesitamos documentación que nos dé una especificación desactualizada o errónea. Al hacer pruebas y mejor aún, “test-first developement” en pareja, aumenta considerablemente la calidad.

Ahorra tiempo, mayor velocidad

En lugar de pasar una hora atorado haciendo una tarea individual, en pareja muchas veces lo resuelven en cinco minutos. ¿Nunca te ha pasado que estás atorado durante dos horas, luego te vas a dar una vuelta, regresas y en menos de cinco minutos encuentras la solución? Pues en pareja no necesitas esperar esas dos hora e irte a dar una vuelta, tu compañero podría tener la solución o conversándolo con él en conjunto cristalizan una aún mejor.

El tiempo que te sobra lo ocupas para todavía hacer más.

Debido al beneficio de esparcir el conocimiento, aceleramos el nivel técnico y de negocio de los nuevos integrantes.

Por el aumento de calidad ya explicada, las integraciones son más rápidas, se resuelven, es más rápido modificar funcionalidades e implementar nuevas por la simplicidad de las mismas.

Reduce el Estrés

Entre menos tiempo pases trabajando tendrás menos estrés y una mente fresca y creativa (comprobado científicamente). Por lo cual tus tareas las resolverás más rápido, con ganas y con orgullo. Tendrás más tiempo después de tus horas de trabajo para estar con la familia, con la novia o esposa, o simplemente hacer tus cosas personales

Ahorra dinero

Es bueno para el negocio, entregas más rápidas, iteraciones con mayor alcance y por supuesto mejor retorno de inversión por la calidad del software y la flexibilidad de adaptarse a las nuevas necesidades del usuario final (por el diseño superior creado en pareja).

¿Como hacer programación en parejas?

Existen varias formas de usar la programación en parejas, los más usados y simples son:

  • Driver y navigator
  • Ping Pong

Driver y navigator

  • Se tiene dos perspectivas en cuanto al código.
  • He driver es la persona que controla la computadora y escribe el código, el navigator sentado a su lado observa el proceso desde otra perspectiva, revisando cada línea de código mientras el driver escribe, al mismo tiempo que apoya al driver dándole dirección y desbloqueándolo.
  • Una persona se encarga de la táctica (driver) y la otra de la estrategia (navigator).

Es importante cambiar los roles continuamente, así mitigamos el aburrimiento y cambiamos de perspectiva para tener ideas frescas.

He navigator puede anotar sus ideas para no cortarle la inspiración al driver, estas ideas se pueden mencionar cuando el driver termine de escribir el código que tenía en su mente.

Neurociencia, dos modos de pensamiento

Según la neurociencia, la programación en parejas une dos tipos de pensamientos. El driver trabaja en un modo de pensamiento enfocado, mientras que el navigator trabaja con un modo de pensamiento difuso.

Porque ahora tenemos dos mentes, podemos separar estas dos perspectivas y utilizarlas al mismo tiempo.

Ejemplo de esto es lo que ya comentamos, cuando estás atorado con un problema por dos horas, te vas a dar una vuelta, tomar café o algo y regresas, te sientas enfrente de tu computadora y en cinco minutos lo resuelves.

Ping pong

  • El primer developer escribe la próxima prueba
  • El segundo developer hace pasar la prueba y escribe la próxima prueba
  • El primer developer hace pasar la prueba

Después de que alguno de los programadores hace pasar la prueba, ambos hacen el refactor utilizando driver y navigator.

Esta es una técnica bastante sencilla y útil para cambiar frecuentemente entre driver y navigator, así ambos programadores practican ambos modos de pensamiento. Fomenta la creatividad y el uso de prácticas ágiles como TDD y BDD.

¿Cuánto cuesta hacer programación en parejas?

Uno puede pensar que el costo de hacer programación en parejas es el doble debido a que dos personas trabajan para completar una sola tarea, pero no es así, según estudios realizados by Laurie Williams en el año 1999 en la universidad de Utah, haciendo programación en parejas solo aumentó un 15% de tiempo para completar la tarea.

Ese 15% de tiempo gastado fue recuperado en un código con 15% menos defectos. 

Según este estudio el código generado individualmente es 15 veces más costoso debido al mayor esfuerzo de arreglar los defectos. Luego si ese defecto se filtra a producción, entonces el costo es 60 veces más.

¿Por qué es más costoso el desarrollo con programadores individuales? Porque el diseño individual es inferior a un diseño creado por dos personas. Dos cabezas son mejor que una.

Este resultado se alinea con la filosofía de prevención de incidencias y que entre más tiempo pasa en encontrar el defecto, es más costoso porque primero se tiene que volver a replicar, entender el problema, entender el código relacionado y además el tiempo gastado en la solución. ¿Qué pasa si es un defecto que se detecta después de un año? ¿Qué pasa si la persona con más conocimiento del contexto ya no está en el proyecto o no está disponible?

¿Y si tenemos un equipo distribuido? ¿Cómo hacemos programación en pareja?

En la actualidad existen muchas aplicaciones de videollamadas para compartir pantallas, IDEs con extensiones o plugins y hasta aplicaciones para compartir el control de tú maquina que te permiten tener una colaboración en tiempo real sobre el código en cuestión.

Compartir pantalla:

Compartir código estilo google docs:

Compartir la máquina completa

¿Quién hace programación en pareja?

Empresas que hacen programación en parejas

  • Google
  • Spotify
  • Shopify
  • Thoughtworks
  • IBM
  • Microsoft
  • Atlassian

Programadores que hacen programación en parejas

Jeff Dean y Sanjay Ghemawat. Super reconocidos en google porque salvaron a la empresa de morir, arreglaron el enorme crawler de google que había parado de funcionar en el año 2000. Han creado juntos en google a mapReduce, BigTable y Spanner. Y muchas cosas más fuera de google.

Kent Beck (Co-creador principal de extreme programming) y Erich Gamma (co-autor del libro Design Patterns: Elements of Reusable Object-Oriented Software). Juntos crearon JUNIT el principal framework de automatización de pruebas para Java y también para Kotlin.

Alistair Cuckborn. Creador de la familia de métodos Crystal clear y Heart of agile

Ron Jeffries. Firmante del manifiesto ágil y co-creador de extreme programming

Ward Cunningham. Firmante del manifiesto ágil y co-creador de extreme programming

Martin Fowler. Firmante del manifiesto ágil y autor del libro Refactoring: Improving the Design of Existing Code

Robert C. Martin. Firmante del manifiesto ágil y conocido por acuñar los principios de diseño SOLID

Michael Feathers. Autor del libro Working Effectively with Legacy Code

No todo es color de rosa en la práctica

¿Cuándo no hacer programación en parejas?

  • Si la tarea es demasiada sencilla o algo repetitivo.
  • Cuando ninguno tiene mucho conocimiento del problema y/o código a modificar.
    • Mejor ambos se asignan tareas de investigación para retroalimentarse después y compartir ese nuevo conocimiento.
  • Cuando uno de los pares ya pasó mucho tiempo haciendo programación en parejas. Continuar haciéndolo por mucho tiempo es demasiado desgaste mental.

¿Cuánto tiempo hacer programación en parejas?

Definitivamente no 8 horas al día, mucho tiempo haciendo programación en parejas es muy cansado, según fuentes lo recomendado es de 1.5 a 4 horas diarias.

¿Qué tan a menudo cambiar de pareja?

Cada vez que se sienta la necesidad según el problema a resolver. Se recomienda cambiar de pareja diariamente para esparcir el conocimiento técnico y de negocio, pero si alguien aún no entiende un concepto con su pareja actual, entonces no debería cambiar de pareja hasta que tenga sólido ese concepto.

Recomendaciones de interacción social

Super importante tener como base siempre estos tres principios humanos latentes en cada momento para las interacciones sociales.

  • Respeto, de hecho un valor de scrum y extreme programming.
  • Honestidad, alineado con la transparencia del empirismo de scrum y el coraje en extreme programming.
  • Justicia, es justo pensar en el bienestar de todas las personas involucradas. Da el coraje (otro valor de scrum y XP) de hacer programación en pareja y buscar acuerdos mutuos. Al mismo tiempo te hace pensar en lo más justos para ambos, como pareja.

Las personas importan

Piensa en tu compañero, lo más importante son las personas, actua de la forma mas justa posible para entablar comunicacion y acuerdos.

También ponte en los zapatos de los usuarios finales, ¿Querrías tener problemas si fueras tú el que usa la aplicación? Esto ayuda a tener una mente positiva y darnos el coraje de hacer pair programming por el bien de todos. Genera Compromiso and justicia hacia los involucrados.

Tres hábitos para la comunicación y no estancarse.

  1. Piensa en ganar/ganar. A veces puede haber conflictos de ideas, piense en lo más importante, las personas, todos pueden salir ganando, en lugar de perder mucho tiempo debatiendo ¿Por qué no prueban ambas ideas? Paso a paso se darán cuenta de lo mejor para el problema o muchas veces son una combinación de las dos posturas.
  2. Procura primero comprender y después ser comprendido.
    1. Cuando se debaten ideas debemos entender profundamente la otra idea, escuchar con la verdadera intención de comprender. Un buen doctor primero hace un diagnóstico antes de dar una receta.
    2. Ahora tu turno de exponer tu idea.
  3. Sinergizar. Encontrar la solución juntos, tu idea en combinación con la mía genera una mejor, 1 + 1 = 3, 4 o 5, de esas dos ideas sale una tercera, una superior.

Reitero, si el debate sobre las ideas se está alargando, es mejor elegir un término medio y empezar a tirar código, conforme avancen verán por cuál idea se inclinan más.

Planifica

Tengan un horario de sesiones, con el objetivo de no solaparse con reuniones importantes. Con tu familia establece acuerdos y horarios para que tampoco te interrumpan a menos que de verdad sea algo importante.

Por ejemplo, si tu hijo quiere que juegues con él en el momento de la sesión de pair programming, aunque de verdad yo creo que jugar con tu hijo es más importante que trabajar, también podrías establecer con tu hijo los horarios de juego para que no se solapen con los horarios de trabajo.

Sin distracciones

Sin distracciones mientras se hace pair programming, respeta el tiempo de tu compañero y mantente enfocado en lo que están haciendo juntos, no leas emails, no veas mensajes de WhatsApp o de Facebook, trata de no hacer llamadas. Así eres justo con el tiempo de la otra persona.

Pomodoro

Es bueno tomar breaks cada veinticinco minutos o más dependiendo como se sientan y utilizar de cinco a diez minutos como recompensa para ahora si hacer lo que quieran, como revisar Facebook o el WhatsApp. Esto disminuye la fatiga y mantiene las ideas frescas porque constantemente te recompensas y le dices a tu cerebro que los próximos veinticinco minutos valen la pena.

Apertura

Mucho, mucho respeto a las ideas de tu compañero, no importa si tienes más experiencia o menos, recuerda que diferentes ideas y perspectivas nos llevan a mejores soluciones. El genio John Von Neumman pedía constantemente a sus compañeros que revisaran su trabajo.

Piensa en la crítica como algo que te ayude a mejorar.

Elimina el condicionamiento social

Normalmente se tiene la idea de que equivocarse es malo, de que no saber es herejía, al contrario, ser vulnerable en estos aspectos ayuda mucho a mejorar como individuo, como equipo y a mejorar el producto. Y todo el mundo debe estar consciente de esto, a no juzgar y abrazar las diferencias, las cuales son muy importantes a la hora de innovar porque diferentes perspectivas siempre nos permite construir una mejor forma de ver las cosas, lo que lleva a generar mejoras ideas y aumentar la creatividad.

La importancia de Celebrar

Celebren juntos después de terminar con una tarea, vayan a tomar un café, coman algo, jueguen un videojuego, que sé yo, el chiste que celebren. Esto promueve un mini team building y entrenan a su cerebro para no cansarse y tener pensamientos positivos para continuar. Ayuda al estrés.

De programación en parejas a Mob programming

Es una práctica ágil moderna que extiende la idea de pair programming  a todo el equipo,  donde se puede incluir todo tipo de involucrado en el producto. Desde programadores, administradores de base de datos, gente de diseño y experiencia de usuario, product owners, project managers, hasta clientes y usuarios.

Toda la gente brillante trabajando en lo mismo, al mismo tiempo, en el mismo espacio, en la misma computadora

Woody Zuill 

Mob Programming es integración continua para ideas.

Joshua Kerievsky

References

Foto principal por Alvaro Reyes of Unsplash

https://spectrum.ieee.org/tech-talk/tech-history/dawn-of-electronics/untold-history-of-ai-invisible-woman-programmed-americas-first-electronic-computer

https://www.computerhistory.org/revolution/birth-of-the-computer/4/78/2258

https://www.oreilly.com/library/view/making-software/9780596808310/ch17s01.html

https://collaboration.csc.ncsu.edu/laurie/Papers/XPSardinia.PDF

https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge

Powers of Two: Finding the Essence of Innovation in Creative Pairs

Collaborative Circles: Friendship Dynamics and Creative Work

Pair Programming Illuminated

El manifiesto ágil

El manifiesto ágil

El amor, la masa rocosa

El corazón ágil y el manifiesto ágil. Siempre he pensado que las cosas simples son las mejores de implementar, permiten avanzar y aprender. Y tal vez el manifiesto ágil no es tan claro y fácil de entender. Además muy a menudo las metodologías, técnicas y frameworks complican las cosas, o simplemente uno como estudiante de ellas pierde el enfoque principal.

La base del manifiesto ágil son principios humanos, los cuales funcionan como la masa rocosa en la que se edifica el castillo de la agilidad.

Para cualquier aprendizaje es necesario tener un base sólida, una esencia. La masa rocosa en la que se pueda edificar un castillo. No la masa de arena en la que se construya una casa y a la primera llovizna se derrumbe.

Y te preguntarás, ¿Cuál es mi masa rocosa, fuerte, sólida, que me hará conseguir lo que quiera? Como por ejemplo un producto exitoso y la felicidad de mis compañeros o empleados.

Es muy sencillo, necesitamos mantener las cosas simples (principio ágil), y tu masa rocosa son los principios humanos universales, estos principios nacen de algo lamentablemente despreciado en algunos entornos laborales, tu masa rocosa es el amor. El cual tiene una relación muy estrecha con el manifiesto ágil.

Si, ya sé lo que estás pensando, que soy demasiado cursi, pero piensa por un instante. Cuando amas lo que haces, con gusto estás dispuesto a hacer las cosas lo mejor posible. A colaborar con tus compañeros para resolver problemas y no dudas en ayudar en cualquier problema que se les presente.

Justicia, respeto y honestidad

Si tienes amor en tu corazón, respetaras a los demás, respetaras su valioso tiempo, su individualidad, pensaras en ser justo, trataras de ponerte en los zapatos de ellos y entenderlos, esto aumentara la comunicación y por ende la colaboración para lograr objetivos compartidos. Serás transparente y honesto con el cliente, usuarios y toda persona relacionada con el producto y tu organización, siempre pensando en un beneficio mutuo.

Del amor surge tres principios universales, justicia, respeto and honestidad, principios que arraigados en un equipo permitirá la creación de productos brillantemente mágicos, de enorme satisfacción para todos los desarrolladores, usuarios, clientes, socios e inversionistas.

Principios que se vuelven valores y cultura en pequeñas y grandes empresas, locales e internacionales. Con personas de cualquier nacionalidad, raza, creencia religiosa, color, género, etcétera, etcétera.

Estos principios universales humanos, justicia, respeto y honestidad, son la masa rocosa para poder crear cualquier tipo de producto utilizando agilidad.

No todo es color de rosa

No todo es color de rosa, por supuesto que habrá muchas inconformidades y conflictos. Aun así, estos tres principios te ayudaran a resolver esas inconformidades y conflictos buscando un equilibrio y el beneficio mutuo.

Este equilibrio y beneficio mutuo claro que puede romper relaciones laborales en el caso de que sea necesario. Una ruptura en que las partes involucradas acuerdan que es lo mejor para todos, con una planificación adecuada y justa.

No te preocupes, si lo piensas no es más que sentido común, si ayudas a alguien con su problema, seguro que le dará ánimos de ayudarte con los tuyos. Y esto genera un ciclo infinito de buenas intenciones entre todos los integrantes de un equipo y de toda una organización.

La masa rocosa y el Manifiesto Ágil

De hecho el manifiesto ágil, si lo analizamos, se puede decir que está basado en estos tres principios fundamentales. Usando la analogía de construcción de un castillo. Primero tenemos una masa rocosa, luego arriba de esta existen los pilares fuertes que forman la estructura del castillo, estos pilares son el manifiesto ágil.

Un ejemplo grandísimo sobre estos principios humanos y donde se refleja su influencia, está en lista de los valores de scrum and extreme programming, todos los valores están relacionados con estos tres principios, incluso el de respeto destaca con una relación muy directa.

ScrumExtreme programming
Coraje
Enfoque
Compromiso
Respeto
Apertura
Simplicidad
Comunicación
Retroalimentación
Coraje
Respeto
Valores

¿Qué es ágil?

La capacidad de crear y responder al cambio con el fin de tener éxito en un ambiente incierto y turbulento

agileallieance.org

Manifiesto Ágil

Estamos descubriendo mejores formas de desarrollar software haciéndolo y ayudando a otras personas a hacerlo. A través de este trabajo hemos llegado a valorar:

Individuos e interacciones sobre procesos y herramientas.

Software funcionando sobre documentación extensiva.

Colaboración con el cliente sobre negociación contractual.

Respuesta ante el cambio sobre seguir un plan

Es decir, aunque valoramos los elementos de la derecha, valoramos más los elementos de la izquierda.

https://agilemanifesto.org/

El desarrollo Ágil se ha vuelto demasiado decorado. Desechemos esas decoraciones por un minuto y regresemos al corazón ágil.

Dr. Alistair Cockburn, uno de los autores del manifiesto ágil

Me gusta mucho esta frase del Dr. Alistar Cockburn, porque vuelve a lo que es realmente importante, a no complicarse las cosas. De hecho actualmente existen dos nuevos conceptos que toman este concepto de simplificar la agilidad.

El enfoque de esta publicación es un paso aún más adentro, a la raíz de las relaciones interpersonales. Para utilizar esa masa rocosa y edificar fuertes prácticas ágiles. Esto lo vamos a reflejar en cada uno de los puntos del manifiesto ágil.

Entonces, a continuación voy a explicar desde mi punto de vista lo que los autores nos quieren comunicar y como se relaciona con la masa rocosa que ya hemos planteado.

Individuos e interacciones sobre procesos y herramientas.

Individuos e interacciones
Individuos e interacciones

Primero los individuos que crean empresas y generan calidad

Todos somos personas y seres humanos, por lo que las personas es el factor más importante para el éxito de cualquier proyecto. La comunicación efectiva, la motivación y principios compartidos para lograr un objetivo superior determinarán la calidad del producto final.

Ok, ok, ¿Por qué es muy, muy importante un individuo? Pues porque son las personas las que crean el producto o software, y son estas mismas las que forman a las empresas. Sin mencionar que los clientes y usuarios también son personas.

Como dijo Alistair Cockburn, uno de los creadores de este manifiesto ágil:

El proceso y la tecnología son un efecto de segundo orden en el resultado de un proyecto. El efecto de primer orden son las personas.

Alistair Cockburn

Los procesos, patrones de diseño, patrones de trabajo y las prácticas de desarrollo de software y desarrollo ágil son importantes, pero son las personas las que harán que funcionen.

Las personas no son piezas reemplazables

Las personas no son piezas reemplazables

Kent Beck

Las personas no son como piezas de un software o proceso, no son piezas reemplazables en una organización, un individuo no es algo lineal, es muy complejo y existen muchas variables que determinan su comportamiento, su desempeño, su moral y por consiguiente su productividad.

Si un líder ve y trata a su equipo como piezas reemplazables sumamente lineales, y no trata de ver a su equipo como individuos, esto baja la moral (productividad). Las personas buenas siempre buscan un mejor lugar donde estar.

El líder termina cosechando lo que siembra, piezas reemplazables sumamente lineales que no ayudan a la productividad, o al menos no se desempeñan con su máximo potencial. Esto provoca perdidas de tiempo, esfuerzo y dinero a las organizaciones.

Otra forma más fuerte de perder recursos en las organizaciones, es si el individuo decide irse de su equipo. Imagínense el tiempo en conseguir y capacitar al reemplazo, mientras el reemplazo está listo, el esfuerzo necesario de los demás personas del equipo aumenta porque al inicio es como no tener al compañero que se fue.

Gastos por renuncia de un integrante del equipo

Además estas mismas personas del equipo actual, seguro deben contribuir invirtiendo tiempo en la capacitación del reemplazo. Existe un gran retraso y desembolso económico a causa de la renuncia de una persona.

Un proyecto exitoso se logra con un equipo satisfecho, contento y dispuesto a colaborar entre ellos para lograr un objetivo en común y superior, los cuales se autoorganizan para ser mucho más productivos.

Las organizaciones que se encomiendan a formar equipos de este tipo, obtienen una enorme ventaja competitiva sobre aquellas que tratan a las personas como simples piezas lineales que forman parte de un proceso.

Al tratar a las personas como lo que son, con justicia, con respeto, y siendo honestos con ellas, se puede lograr lo imposible.

Software funcionando about documentación extensiva

Software funcionando
Software funcionando

Para tener una documentación detallada es necesario mucho tiempo y esfuerzo porque la documentación siempre cambia conforme se le agregan nuevas funcionalidades o se modifican las ya existentes. Entonces ese tiempo y esfuerzo mejor se invierte en obtener software funcionando que puede ser presentado al cliente y obtener retroalimentación. Es muy difícil mantener sincronizada la documentación con el verdadero funcionamiento (con el código), con el tiempo la documentación miente sobre la funcionalidad, la única fuente de verdad es el código.

La mejor documentación son las personas y el código

¿Cómo se entrena un nuevo integrante?, o ¿Cómo una persona recuerda lo que hizo hace un día, una semana o hace un año?, o ¿Cómo otro integrante del equipo utiliza un componente, un módulo, una clase o una función sin perder todo un día tratando de comprender?

La mejor documentación e instrucciones de como funciona una pieza del sistema se encuentran en las personas y el código que ellas crean.

Es de valor inigualable poner énfasis en la excelencia técnica y al buen diseño para mejorar la agilidad, es decir, código limpio, bien diseñado y utilizando prácticas ágiles como BDD y TDD para que cualquier integrante lo pueda entender, aumentar nuevas funcionalidades y modificar existentes con gran facilidad.

Incluso para que la misma persona o personas que lo crearon puedan recordar cada detalle minúsculo. De hecho a veces no necesitas llegar al detalle, simplemente utilizas la pieza del sistema con seguridad del resultado debido al buen diseño y a la calidad de la misma, lo que por supuesto te ahorra muchísimo tiempo. Claro que esto no se puede lograr sin las personas, sin su disciplina y auto organización.

Si existe documentación

No es que no exista documentación, pero se puede posponer, o ser poca y enfocado en las cosas que no cambiaran mucho. En etapas tempranas del desarrollo sería una pérdida de tiempo documentar algo que tendrá constantes cambios y mejoras. El momento ideal para una documentación es cuando se escriben las especificaciones con BDD y TDD. El segundo momento ideal es cuando se tiene una versión estable.

¿Entonces como logramos que nuevos miembros del equipo entiendan los detalles del producto o software?

Ya habíamos establecido la respuesta, se logra gracias a las personas y el código que ellas crean. Porque se trabaja muy de cerca con cada individuo del equipo, transfiriendo el conocimiento de manera práctica, ayudandose mutuamente a resolver sus dudas, sus problemas.

Por dar ejemplo. Se puede aplicar pair programming, trabajar para lograr la confianza de que son parte del equipo y pueden comunicarse con toda honestidad.

Si en el peor de los casos un miembro del equipo se va, mínimo el conocimiento se transfirió a todos los demás integrantes de manera empírica y rápida, estos integrantes seguirán transfiriendo el conocimiento a las personas nuevas.

Y ¿Qué pasa si todos los integrantes del equipo se van? Bueno aquí tenemos un problema más grande, porque entonces no se están aplicando los principios humanos de justicia, respeto y honestidad, y no se está aplicando el primer punto del manifiesto ágil, individuos e interacciones sobre procesos y herramientas.

Colaboración con el cliente about negociación contractual

Colaboración con el cliente
Colaboración con el cliente

Es muy importante involucrar al cliente en todo el ciclo del desarrollo de tal manera que los requisitos se recolecten progresivamente, evolucionen y se adapten según la retroalimentación del usuario final y de los demás involucrados. Diferentes puntos de vista y perspectivas mejoran la cálida del producto en cada iteración.

Aquí tenemos una oportunidad muy importante de poner en práctica los tres principios universales humanos en relación con el cliente, necesitamos ser justos, respetuosos and honestos en todas y cada una de las interacciones con el cliente y su negocio.

Siempre existirá incertidumbre

No se recomienda crear contratos detallados que especifiquen lo que el software va a hacer, lo que se va a cobrar por ello, y un calendario de entregas. Eso es demasiado fijo y nunca, nunca se cumplen las expectativas porque un desarrollo ágil se adecúa a los ambientes inciertos y turbulentos implícitos dentro de la creación de software.

Por mucho que se sepa del negocio y de la tecnología, siempre habrá una variable desconocida de la cual se debe aprender. Esta variable desconocida hará cambiar todo lo detalladamente planeado con anticipación.

Un contrato fijo nunca va a funcionar, debe ser algo flexible que se adapta conforme a los usuarios cambian y necesitan, debido a esto un contrato que indique los requerimientos fijos, sin intervención del cliente y usuarios, es seguro que será un fracaso.

Buscar beneficio mutuo, lo primero son las personas

Más sin embargo tener un acuerdo con el cliente donde se establezcan lineamientos buscando el beneficio mutuo. Indicando por ejemplo que los pagos se estarán haciendo conforme a lo que se vaya entregando. Donde se acuerde que el cliente estará involucrado todo el tiempo en el desarrollo para que apruebe las funcionalidades en cada iteración. Esto es algo mucho más justo y honesto, respetando el tiempo y el dinero del cliente, así como sus sueños.

Este punto del manifiesto tiene mucha relación con el primero, hasta me atrevería a decir, que este es una subrama del primero. Porque los clientes son individuos y entre más nos preocupemos por las interacciones con ellos, más rápido entregaremos un producto de valor, que indudablemente mejorara las actividades que benefician al cliente, al equipo que desarrolla el producto, y en general todos los involucrados

Respuesta ante el cambio sobre seguir un plan

El producto final siempre tiene una relación estrecha con el ambiente real y con personas (usuarios finales, desarrolladores y demás), todo a nuestro alrededor y las personas se encuentran en constante cambio, es imposible seguir un plan y que funcione completamente, pero si es ágil y efectivo tener la capacidad de responder al cambio dentro de un ambiente de incertidumbre.

No puedes planificar a detalle todo lo que se va a realizar en el proceso de la creación de un producto, tampoco es que no se hagan planes, si se hacen, pero con el conocimiento que seguro cambiaran en algún momento, muchas técnicas ágiles recomiendan hacer planificaciones muy detalladas en plazos cortos de tiempo, un poco de detalle a plazos medianos y muy, pero muy poco detalle para plazos largos. Aun así todo es incierto y debido a esta incertidumbre es que se debe de generar la capacidad de responder a cualquier cambio, esta capacidad la debe tener tanto el producto como las personas que lo crean.

Todos los integrantes del proyecto deben tener la suficiente flexibilidad para adaptarse a las necesidades que surjan en el ambiente, esto incluye la comunicación, la manera de trabajar y hasta las habilidades que estén dispuestos a aprender, en frameworks como scrum le llaman equipos multidisciplinarios.

12 principios ágiles

En cuanto al producto, bueno, utilizare un ejemplo del área de software donde tengo más conocimientos. Aunque no voy a explicar los 12 principios del movimiento ágil, este último punto del manifiesto, comparte una estrecha relación con los siguientes principios, y realmente son ejemplos que nos permiten responder al cambio:

La mayor prioridad es satisfacer al cliente con la entrega temprana y continua de software con valor.

Aceptamos que los requisitos cambien, incluso en etapas tardías del desarrollo. Los procesos ágiles aprovechan el cambio para proporcionar ventaja competitiva al cliente.

Los procesos ágiles promueven el desarrollo sostenido. Los promotores, desarrolladores y usuarios debemos mantener un ritmo constante de forma indefinida.

La atención continua a la excelencia técnica y al buen diseño mejora la agilidad.

La simplicidad, o el arte de maximizar la cantidad de trabajo no realizado, es esencial.

Las mejores arquitecturas, requisitos y diseños emergen de equipos auto-organizados.

¿Qué es un software con valor?

Todos los principios anteriores giran alrededor de la construcción de un software de valor, pero, ¿Qué es un software con valor? ¿Será un software que funcione? Bueno, creo que sí, al menos en parte, pero el software o cualquier tipo de sistema tiene dos tipos de valores, por desgracia muy a menudo le ponemos más atención al tipo que es secundario y que realmente surge del valor principal. Déjame explicártelo más a detalle en los siguientes párrafos.

Normalmente un sistema tiene valor si funciona y resuelve un determinado problema para los usuarios y clientes, ¿En verdad es este valor lo más importante? Yo no lo creo y menos en los ambientes cambiantes e inciertos para lo que estos productos se crean, la primera solución, la primera versión de un sistema por supuesto que resuelve algo, pero no a la perfección, y no ser perfecto esta bien, los desarrollos ágiles son iterativos e incrementales, aprendiendo y satisfaciendo las necesidades de los usuarios y clientes en paralelo y progresivamente. Además las piezas o componentes de un producto también van mejorando y también se lleva un control de sus versiones.

Los clientes realmente no saben exactamente como debe ser su producto, tienen idea, eso es claro, pero conforme van probando su producto y obteniendo retroalimentación van modificando sus ideas y hasta puede que la idea de un producto de un giro de 360 grados, esto es porque no se sabe el verdadero valor de un producto hasta probarlo con usuarios, además la gente cambia, la sociedad cambia, así es, repito, el mundo es un ambiente incierto y turbulento al que debemos ser capaces de adaptarnos.

El software debe ser flexible

A lo que quiero llegar es que un software debe ser lo suficientemente flexible, lo suficientemente sustentable para poder adaptarse al cambio con gran facilidad. El valor primordial de un software es que en cualquier momento pueda adaptarse a las necesidades de los usuarios. Y con esto viene en segunda posición que funcione.

Lo anterior tiene una razón, aunque la función tenga valor para los clientes y usuarios, si es muy difícil adaptar el producto a las nuevas necesidades del ambiente o peor aún, adaptar el producto a las funcionalidades que ya se tenían pensadas, entonces estamos perdiendo valor. Un software con valor debe tener la capacidad de agregar y cambiar funcionalidades a una velocidad sustentable, sin retrasos y de lo más fácil posible, esto es de enorme worth para nuestros clientes y usuarios finales.

Si dejamos a los clientes sin nuevas actualizaciones por mucho tiempo, entonces ya deja de tener valor y los usuarios dejan de usar el producto, porque las nuevas necesidades precisamente son otras diferentes a las que actualmente el software proporciona. Sin mencionar el caso de que el producto tenga demasiados fallos y entonces estos fallos provoquen dificultad al cambio.

Conclusion

Para que la adaptabilidad fluya en un equipo debemos estar conscientes de que habrá muchos cambios y amar la incertidumbre, pues es como de verdad se aprende de lo que es prioritario o necesario hacer. A aceptar los fallos tempranamente con honestidad, respeto and justicia hacia todos los involucrados para entregar continuamente un producto profesional, que evoluciona y mejora con el tiempo, nunca se estanca y nunca pone en peligro su negoció. Se aprovecha al máximo los recursos, respetando el tiempo y el recurso económico de todos.

Estos principios humanos de honestidad, respeto y justicia, rigen el manifiesto ágil, es tan importante que dos de sus puntos tiene una relación directa. Hablamos de:

  • Individuos e interacciones sobre procesos y herramientas
  • Colaboración con el cliente sobre negociación contractual

Los otros dos aunque no tienen una relación directa, sí que indirectamente todo lo que hacemos se trata sobre las personas y las relaciones que tenemos con ellas.

¿Cómo surgió el desarrollo ágil? Principios fundamentales

¿Cómo surgió el desarrollo ágil? Principios fundamentales

Principios fundamentales

Aunque probablemente el cambio de desarrollo tradicional a desarrollo ágil empezó mucho antes de los acontecimientos que voy a mencionar, estos son los más importantes que marcaron la base para lo que hoy en día llamamos agilidad, como todo buen cambio, no sucedió de la noche a la mañana, fue un proceso lento, como un cambio de paradigma, el cual la sociedad de la administración de proyectos y software empezaron poco a poco a interiorizar o al menos a utilizar.

En cuanto a los métodos, puede haber un millón y algo más, pero los principios son pocos. El hombre que capta los principios puede seleccionar con éxito sus propios métodos. El hombre que prueba métodos, ignorando principios, seguramente tendrá problemas.

Ralph Waldo Emerson

Es importante mencionar que a pesar de que el movimiento ágil se relaciona mucho con del desarrollo de software, realmente no tiene que ver específicamente con esta industria, más bien sus raíces son en las personas mismas, por lo que se aplica a todas las áreas que te puedas imaginar donde existan personas, es decir, en todo.

El desarrollo ágil es un cambio cultural, lleno de principios y valores humanos, que todos y cada uno de los integrantes de un equipo y de una empresa deben tener arraigado muy en su ser, para que de esta manera sucedan cosas mágicas, como la creación de productos que llenan de enorme satisfacción al usuario y los clientes, velocidad de producción, reducción de costos, proyectos exitosos, empleados felices y en general el beneficio de todos los involucrados, tanto internos como externos, directos o indirectos.

Total Quality Management (TQM)

El primer cambio significativo con dirección al desarrollo ágil sucede durante la segunda guerra mundial donde Williams Edwards Deming les enseño control estadístico de los procesos a los ingenieros estadounidenses con el fin de mejorar los materiales de guerra, aun así, parece que los estadounidenses no le prestaron mucho interés, probablemente debido a la guerra. Después de esto en 1950, Deming se trasladó a Japón, en la época donde la industria y economía de este país estaba en crisis, esta vez si pudo transmitir exitosamente sus conocimientos y filosofía de la calidad de los productos y servicios. Los japoneses lo escucharon y estuvieron dispuestos a cambiar la cultura de trabajo.

Al implementar los principios de la metodología de Deming, los japoneses convirtieron totalmente su economía e industria posicionándose como lideres mundiales en ámbitos como tecnología, industria manufacturera y comunicaciones

De hecho la metodología TQM que creo Deming fue la base para el nacimiento del movimiento ágil, los principios más importantes de TQM son los siguientes:

  1. Mejorar la calidad resulta en reducción de costos, reducción del costo de los defectos, reducción de soporte al cliente y menos llamadas de los mismos en relación con defectos.
  2. Mejora continua en todos las partes del sistema y las personas.
  3. Orgullo del trabajo que hace una persona, es la clave principal para obtener la calidad necesaria de un producto/servicio, que los empleados disfruten su trabajo y con orgullo.
  4. Plan – Do – Check – Act (PDCA) – Ciclo de desarrollo para poder probar y obtener retroalimentación sobre soluciones de problemas y creación de sistemas complejos.

Del punto uno y dos, Deming fomentó lo siguiente:

Mejorando la calidad, automáticamente, mejora la productividad.

Williams Edward Deming

En la actualidad, existe un principio ágil muy relacionado con lo que dijo el señor Deming:

La atención continua a la excelencia técnica y al buen diseño mejora la Agilidad.

Principio ágil

Del punto tres tenemos su relación con el principio actual

Los proyectos se desarrollan en torno a individuos motivados. Hay que darles el entorno y el apoyo que necesitan, y confiarles la ejecución del trabajo.

Principio ágil

Si analizamos los primeros tres puntos de TQM y en concreto el tercer punto, podemos concluir que al preocuparnos por las personas obtendremos calidad y una mejora continua tanto en los sistemas y procesos como en las personas mismas, por que al final de todo, los individuos son el recurso que genera productos/servicios y forman empresas.

En el manifiesto Ágil que veremos en otra publicación, el primer elemento de manifiesto y el más importante dice así:

Individuos e interacciones sobre procesos y herramientas.

Del manifiesto ágil

Como podemos ver el desarrollo ágil no es realmente algo nuevo, siempre se ha estado buscando mejores maneras de trabajar.

Sobre el último punto, el ciclo PDCA se parece mucho a lo que se utiliza actualmente en Lean, Lean startup, Lean thinking, Design thinking, RAD, DSDM, Extreme programming, Scrum, Crystal clear y demás metodologías estilo ágiles. El objetivo es obtener retroalimentación inmediatamente para aprender y mitigar errores o direcciones equivocadas.

Este ciclo PDCA nos permite responder al cambio, con lo cual se ejerce un principio fundamental del manifiesto ágil:

Respuesta al cambio sobre seguir un plan

Del Manifiesto ágil

Ahora veamos los diagramas de algunos de los ciclos de retroalimentación que tiene las metodologías ágiles:

Design Thinking Ciclo de retroalimentación
Design Thinking Ciclo de retroalimentación
Ciclo Construir, Medir, Aprender
Lean Startup ciclo de retroalimentación
Scrum ciclo de retroalimentación
Scrum ciclo de retroalimentación
Extreme Programming
Extreme Programming
DSDM ciclo de retroalimentación
DSDM ciclo de retroalimentación

¿Qué tal, todos estos ciclos son muy parecidos verdad?

Toyota Production System (TPS)

Este sistema desarrollado entre 1948 y 1975, y presentado formalmente en los 80´s fue inspirado en los trabajos de Henry Ford y también en TQM debido a que sus inicios datan de la misma época cuando Edwards Deming fue a Japón a transmitir sus conocimientos de Gestión de calidad Total (TQM) y en esos tiempos Taichii Ohno estaba trabajando para Toyota Motors Company. Como todo buen diseño, no solo de una fuente surgen las inspiraciones y las ideas, pero podemos notar la influencia y evolución de TQM en TPS.

Este sistema fue el precursor de Lean Manufacturing y demás metodologías Lean de la actualidad. Los principios en los que se basa TPS son los siguientes:

  • Mejora continua, tomando como base a las personas, mejorando su ambiente laboral, su aprendizaje, su creatividad e ideas para que de esta manera mejoren en todo lo que hacen incluyendo los procesos, herramientas y métodos utilizados en toda la empresa.
  • Respeto por las personas. Aquí de nuevo otra constante clave del éxito de este sistema, el respeto por las personas. Aunque también el enfoque es en la mejora continua, esto nunca se lograría sin el respeto, ¿Qué es el respeto? Para mí, y esto ya lo escribí en otro post cursi sobre agilidad (¿Qué es Scrum? ¿Por qué es importante en la creación de productos y/o servicios? Valores, empirismo y pilares) es el amor por otra persona, aunque no intenso, es la naturaleza del ser humano preocuparse por los demás, un sentimiento latente en mayor o menor medida, todos somos diferentes, y lamentablemente algunos de nosotros lo tenemos muy escondido, pero ahí esta, un principio natural que genera un ciclo infinito de buenas intenciones.

A través del principio de mejora continúa y respeto por las personas, TPS propone lo siguiente:

La eliminación de desperdicios (Muda), los cuales son provocados por la sobrecarga de trabajo y estrés de los empleados, máquinas, procesos, etc (Muri), también por inconsistencias y variaciones no previstas que causan un desequilibrio en la producción (Mura). Con Muri y Mura podemos destacar de nuevo la importancia de las personas para el éxito de este método. TPS define 7 tipos de desperdicios, solo los voy a mencionar:

  1. Desperdicio por sobreproducción
  2. Desperdicio por Tiempo de espera
  3. Desperdicio por transporte
  4. Desperdicio por procesos
  5. Desperdicio por inventario
  6. Desperdicio por movimientos
  7. Desperdicio por defectos

Lotes pequeños. La mejor manera de encontrar errores, aprender de ellos y mitigar sus efectos negativos lo más pronto posible es por tareas/procesos pequeños y simples mucho más fáciles de manejar y entender.

Kanban. Para eliminar el desperdicio, Taiichi utilizó un tablero con tarjetas (Kanban) donde se puede visualizar lo que se tiene que hacer, lo que sé está haciendo, lo que se terminó y si una tarea necesita de materiales o de la finalización de otra tarea para continuar.

Pruebas constantes. Siempre probando con lotes pequeños para encontrar errores y mitigarlos inmediatamente. En cada lote pequeño es más fácil hacer pruebas, actualmente en agilidad se utilizan las pruebas unitarias y funcionales de un lote pequeño de elementos del sistema que entregan valor para los usuarios/clientes en periodos cortos de tiempo.

Estos últimos puntos están muy relacionados con el siguiente principio ágil:

Entregamos software funcional frecuentemente, entre dos semanas y dos meses, con preferencia al periodo de tiempo más corto posible.

Principio ágil

Todo lo anterior permite que Toyota se encuentre actualmente como una de las tres mejores compañías de autos, con un 70% de satisfacción de sus empleados. ¿Que compañía logra eso? el enfoque de respeto hacia las personas ha hecho de Toyota lo que hoy en día es.

¿El modelo en cascada propuso algunas practicas de lo que hoy llamamos desarrollo ágil?

¿Qué? ¿Cómo?  y seguro pensaras algo así, “A mí me enseñaron que el ciclo del modelo en cascada era secuencial, no te creo”. Bueno a mí también me enseñaron lo mismo, pero investigando resulta que hay un mal entendido global de lo que propuso Winston Royce acerca del modelo en cascada y la prueba que encontré esta here, por si quieres abrir los ojos por ti mismo.

Expliquemos lo que propuso Winston Royce en su documento del año 1970, si, como he estado explicando, siempre ha existido una tendencia hacia el desarrollo ágil. Winston Royce presento el siguiente diagrama:

Model en cascada

Pero inmediatamente aclaró que este modelo era muy riesgoso y propenso al fracaso. ¿Entonces por que demonios lo empezamos a utilizar? No lo sé, pero en mi caso, lamentablemente fue lo que me enseñaron en la universidad, cuando en esa época ya existían mejores métodos para el desarrollo de software como XP y Scrum que se establecieron formalmente a los mediados de los 90’s. Winston Royce propuso cinco mejoras al método de cascada, son los siguientes:

  1. El diseño del sistema debe ser primero
  2. Documentar el diseño
  3. Hacerlo dos veces
  4. Planear, controlar y monitorear pruebas
  5. Involucrar al cliente

Aunque las dos primeras mejoras se podría decir que no son ágiles, los ultimas tres mejoras claramente tienen su merito ágil. Aun así el método que propone Winston Royce no es secuencial, sino más bien iterativo e incremental, bueno, tampoco no tan iterativo e incremental como actualmente lo es el desarrollo ágil pero era un gran comienzo. Veamos ahora el diagrama con las cinco mejoras de Royce:

Modelo cascada ágil
Modelo cascada ágil

No explicare a detalle las cinco mejoras, pero las describiré brevemente y su relación con los principios fundamentales del desarrollo ágil. Antes de eso si se fijan de lado derecho existe otro ciclo de retroalimentación que va desde pruebas, desarrollo y requerimientos, por lo que totalmente lineal waterfall nunca lo fue.

  1. El diseño del sistema debe ser primero, esto actualmente siempre se hace solo que en ciclos pequeños e incrementales sobre todo el sistema, también en escala aún más pequeña al realizar las pruebas unitarias o funcionales se piensa inmediatamente primero en el diseño de la funcionalidad antes de escribir código para poder crear la prueba.
  2. Documentar el diseño. En las metodologías ágiles de hecho se realiza documentación solo que muchas veces no están en documentos, sino en las pruebas unitarias y funcionales, es decir, en lugares donde no se podrá mentir, en la fuente, el código. Pero esto último es otro tema, lo de mayor prioridad es tener un software funcionando, aun así la documentación también se hace por ciclos iterativos e incrementales.
  3. Hacerlo dos veces. Royce empieza a recomendar ciclos iterativos e incrementales al sugerir realizar dos veces la creación del sistema. Actualmente en desarrollo ágil no solo se realiza dos veces, sino muchas veces en periodos cortos del mismo día, en horas y hasta en minutos, también siendo iterativo e incremental,
  4. Planear, controlar y monitorear pruebas. En metodologías ágiles se utilizan las pruebas para obtener retroalimentación lo más pronto posible y hacer los arreglos necesarios, aunque el modelo de Royce a mi parecer no implementa las pruebas tan seguido como en las metodologías ágiles actuales, mínimo lo hace dos veces durante una iteración.
  5. Involucrar al cliente.  Este es el más importante para mí porque hace mucho hincapié sobre las interacciones de las personas. En el manifiesto ágil de la actualidad tenemos lo siguiente:

Colaboración con el cliente sobre negociación contractual

Del manifiesto ágil

Métodos iterativos e incrementales

En el ámbito de la creación de software, mucha antes de la creación del famoso manifiesto ágil, metodologías y frameworks tradicionales que se utilizaban para crear productos o proyectos no estaban funcionando, existía un porcentaje muy alto de fracaso.

El porcentaje alto de fracasos fue influido por la mala implementación del modelo en cascada de Winston Royce. Entonces varias personas empezaron a preguntarse si habría mejores maneras de desarrollar software, es aquí donde empezaron a crear sus propias métodos ágiles, empezaron a surgir metodologías como:

Rapid Application Development (RAD) – 70s – 80s

Como vemos en este ciclo de retroalimentación, existen iteraciones en las fases de diseño y construcción.

RAD ciclo de retroalimentación

Dynamic software development method (DSDM) – 80s

En el ciclo de retroalimentación de esta metodología, incluye iteraciones en la factibilidad y fundación, es decir, los requerimientos, además de poder hacer iteraciones en las fases diseño y construcción.

DSDM ciclo de retroalimentación

Extreme Programing (XP) – Mediados de los 90s, Kent Beck, Ward Cunningham, Ron Jeffries

Este es un mejor ciclo de retroalimentacion en comparacion con los anteriores, en todo momento se hacen iteraciones, en todos los niveles, además:

  • Mucho uso de TDD, continuamente durante todas las etapas
  • Pruebas de aceptación y unitarias
  • Origen de los Dailys o stand up meetings
  • También las famosas historias de usuario.
Extreme progamming ciclo de retroalimentación

Scrum – A mediados de los 90s – Ken Schwaber, Jeff Sutherland

Bueno este es el más conocido de todos y el más usado actualmente, para mas detalles sobre este framework te dejo los siguentes enlaces:

https://www.pensemosweb.com/scrum-importante-creacion-productos-servicios-valores-empirismo-pilares/

https://www.scrum.org/

Scrum ciclos de retroalimentación

Aunque estos frameworks ya habían empezado con el desarrollo ágil, era necesario definir ciertos principios comunes para mejorar el entendimiento y la rápida adopción de estas nuevas formas de crear software.

En el 2001, 17 desarrolladores de software se reunieron en Snowbird, Utah para analizar sobre los métodos de desarrollo de software ágil que estas 17 personas estaban utilizando, DSDM, Extreme Programming, Scrum y crystal clear. El resultado fue el Manifiesto ágil y los 12 principios ágiles.

¿Por que es de suma importancia el manifiesto y los 12 principios ágiles?

Es importante entender que más adelante podría surgir un nuevo framework ágil con una mejor manera de hacer las cosas y que probablemente deberíamos de adoptar, pero el manifiesto y los principios ágiles seguirán siendo la base primordial que si se comprende bien y se interiorizan, cualquier equipo u organización podra utilizar el framework o método que más le convenga en determinadas circunstancias o proyectos.

Es como la creación de código y piezas de un sistema computacional, no importa el lenguaje de programación, librería o frameworks de desarrollo, si no las bases de lógica, patrones y principios de diseño y arquitectura, los que harán entender cualquier nuevo lenguaje o framework que pudiera salir en el futuro.

Hablando un poco más sobre las prácticas utilizadas en los frameworks ágiles, estás prácticas están subordinadas por los principios, es decir, en un proyecto, se utilizarán las prácticas más acordes a las circunstancias del problema que se quiere solucionar. Por la tanto es importante comprender el porque se ejecuta una práctica, o sea, que practica me dará mejores resultados y agilidad basándome en los principios y factores específicos del problema.

¿Qué es ágil?

La capacidad de crear y responder al cambio con el fin de tener éxito en un ambiente incierto y turbulento

agilealliance.org

Manifiesto Ágil

Estamos descubriendo mejores formas de desarrollar software haciéndolo y ayudando a otras personas a hacerlo. A través de este trabajo hemos llegado a valorar:

Individuos e interacciones sobre procesos y herramientas.

Software funcionando sobre documentación exhaustiva.

Colaboración con el cliente sobre negociación de contratos.

Respuesta ante el cambio sobre seguir un plan

Es decir, aunque valoramos los elementos de la derecha, valoramos más los elementos de la izquierda.

En esta publicación explico a detalle la razón y como aplicar el manifiesto ágil:

https://www.pensemosweb.com/el-corazon-agil-manifiesto/

12 Principios ágiles

Aquí están los 12 principios ágiles tomados de la fuente oficial, en otra publicación veremos a detalle cada uno de estos y como se aplica en un proyecto real.

Nuestra mayor prioridad es satisfacer al cliente mediante la entrega temprana y continua de software con valor.

Aceptamos que los requisitos cambien, incluso en etapas tardías del desarrollo. Los procesos Ágiles aprovechan el cambio para proporcionar ventaja competitiva al cliente.

Entregamos software funcional frecuentemente, entre dos semanas y dos meses, con preferencia al periodo de tiempo más corto posible.

Los responsables de negocio y los desarrolladores trabajamos juntos de forma cotidiana durante todo el proyecto.

Los proyectos se desarrollan en torno a individuos motivados. Hay que darles el entorno y el apoyo que necesitan, y confiarles la ejecución del trabajo. 

El método más eficiente y efectivo de comunicar información al equipo de desarrollo y entre sus miembros es la conversación cara a cara.

El software funcionando es la medida principal de progreso.

Los procesos Ágiles promueven el desarrollo sostenible. Los promotores, desarrolladores y usuarios debemos ser capaces de mantener un ritmo constante de forma indefinida.

La atención continua a la excelencia técnica y al buen diseño mejora la Agilidad.

La simplicidad, o el arte de maximizar la cantidad de trabajo no realizado, es esencial.

Las mejores arquitecturas, requisitos y diseños emergen de equipos auto-organizados.

A intervalos regulares el equipo reflexiona sobre cómo ser más efectivo para a continuación ajustar y perfeccionar su comportamiento en consecuencia.

Pruebas ágiles o Agile testing. Equipo feliz, clientes contentos

Pruebas ágiles o Agile testing. Equipo feliz, clientes contentos

¿Qué es ágil?

Antes que nada, recordemos el significado de Ágil.

La capacidad de crear y responder al cambio con el fin de tener éxito en un ambiente incierto y turbulentoagileallieance.org

agileallieance.org

Aceptamos que los requisitos cambien, incluso en etapas tardías del desarrollo. Los procesos Ágiles aprovechan el cambio para proporcionar ventaja competitiva al cliente.

Uno de los 12 principios de “Agile Manifiesto”

Con este enfoque, un producto que se crea usando metodologías ágiles debe ser adaptable, es decir, responder al cambio en un ambiente turbulento. Esta respuesta al cambio nos permite crear productos que sean sustentables. Más abajo se describe a que nos referimos como sustentable.

¿Qué son las pruebas ágiles?

Pruebas ágiles son técnicas esenciales en el desarrollo de software que implementan los principios y prácticas ágiles.

Una de las prácticas ágiles para implementar el principio de adaptación al cambio son las pruebas ágiles.

La atención continua a la excelencia técnica y al buen diseño mejora la Agilidad.

Uno de los 12 principios del “Agile Manifiesto”

Las pruebas ágiles mejoran la agilidad porque nos permite crear un producto con un mejor diseño, más entendible y en general de mejor calidad. Esto promueve un fácil mantenimiento y la adaptabilidad en una ambiente súper cambiante. Lo que nos lleva a menores costos financieros.

Cuando hablamos de pruebas ágiles hablamos de varias técnicas y de diferentes tipos de pruebas, como pueden ser TDD, BDD, las pruebas unitarias, funcionales, de integración, de rendimiento, de usabilidad, etc.

¿Qué significa sustentable o sostenible?

Se refiere a algo que está en condiciones de conservarse o reproducirse por sus propias características, sin necesidad de intervención o apoyo externo.

Los procesos Ágiles promueven el desarrollo sostenible. Los promotores, desarrolladores y usuarios debemos ser capaces de mantener un ritmo constante de forma indefinida.

Uno de los 12 principios de “Agile Manifiesto”

Siempre deberíamos preguntarnos a nosotros mismos si estamos creando productos sustentables, que se adapten al cambio fácilmente.

Características de las pruebas ágiles

Como ya hemos descrito hasta este punto, existen muchos principios que se relacionan muchísimo con el uso de pruebas ágiles. Hago hincapié, las pruebas ágiles se basan en principios ágiles.

Nuestra mayor prioridad es satisfacer al cliente mediante la entrega temprana y continua de software con valor.

Uno de los 12 principios del “Agile Manifiesto”

Es una ilusión, nos engañamos a nosotros mismos, cumplir con la fecha de entrega dejando de lado la calidad. Tirando las buenas prácticas como Desarrollo guiado por pruebas (TDD ) o Desarrollo guiado por comportamiento (BDD), y creando código en el último minuto. Eso no es desarrollo ágil, aunque se pudiera obtener velocidad a corto plazo, el costo a mediano y largo plazo es muy grande para el negocio y/o stakeholders. ¿Eso es la descripción de un software con verdadero valor para nuestros clientes?

Entregamos software funcional frecuentemente, entre dos semanas y dos meses, con preferencia al periodo de tiempo más corto posible.

Uno de los 12 principios del “Agile Manifiesto”

El software funcionando es la medida principal de progreso.

Uno de los 12 principios del “Agile Manifiesto”

Guían al desarrollo a través de especificaciones claras

TDD and BDD son técnicas ágiles, pero si nos fijamos en sus definiciones, la frase principal es “Desarrollo guiado por“, así es, no se trata de pruebas, se trata del desarrollo y las pruebas son una parte que integra al todo, las pruebas forman parte del desarrollo. Y aunque técnicamente son pruebas, realmente son especificaciones de como debe funcionar el software.

Existe un hecho importante y que se nos olvida a la hora de indicar que una funcionalidad está terminada, si las pruebas no están terminadas y las pruebas son parte del desarrollo, entonces la funcionalidad tampoco puede estar terminada.

¿Cómo podemos entregar software funcional y como podemos decir que estamos progresando si en realidad no estamos entregando ninguna funcionalidad “Terminada” a nuestros clientes?

De hecho creo que TDD es una mala definición, no debería tener la palabra prueba (Test). BDD es una evolución de TDD para tener una perspectiva más hacia el cliente y el negocio, precisamente es una mejora en el nombre, más centrado en darle un verdadero valor a un software.

Relación con Individuos y colaboración

A veces perdemos el enfoque dentro de una metodología o framework ágil, nos centramos mucho en los procesos y las herramientas, cuando siempre debemos darle prioridad a los individuos (las personas) y las interacciones sociales que se producen. Estos individuos son los que genera las especificaciones del software.

Olvidamos de las prácticas de colaboración y de las prácticas de desarrollo técnico que nos permiten establecer la calidad, la arquitectura y las soluciones que se generan en equipo, que le dan la cualidad sustentable a un producto.

Los proyectos se desarrollan en torno a individuos motivados. Hay que darles el entorno y el apoyo que necesitan, y confiarles la ejecución del trabajo. 

Uno de los 12 principios de “Agile Manifiesto”

Un equipo de desarrolladores es más productivo si se encuentra creando nuevas funcionalidades en lugar de estar arreglando bugs que pudieron mitigarse antes y que por la complejidad y madurez del sistema es muy difícil de resolver actualmente. Si, el estrés del programador es un factor clave.

Relación con pilares de scrum

Reitero que las pruebas ágiles se basan en principios ágiles, lo podemos ver en el proceso empírico de scrum y sus tres pilares:

  • Transparencia
  • Inspección
  • Adaptación

Los responsables de negocio y los desarrolladores trabajamos juntos de forma cotidiana durante todo el proyecto.

Uno de los 12 principios de “Agile Manifiesto”

Necesitamos la transparencia con todo el equipo a la hora de definir las especificaciones que se traducen en pruebas, de esa manera todos obtienen un mejor entendimiento sobre la parte lógica del negocio y la parte técnica de la implementación.

La inspección nos permite aprender de manera rápida usando las pruebas para definir y fallar tempranamente con la ayuda de todo el equipo. De modo que se obtiene un ciclo de Retroalimentación muy pequeño obteniendo información y dirección lo más pronto posible.

Luego de que aprendimos de todos y de nuestros errores, se adaptan las pruebas para cumplir con las necesidades del cliente y entregar un producto de calidad probado correctamente. Ahorrándonos mucho esfuerzo y dinero, porque el coste de arreglar bugs en etapas maduras de un producto es muy costoso en comparación con mitigarlos desde el principio con pruebas pequeñas.

Todos se involucran en las especificaciones

En scrum, un equipo multidisciplinario es más eficiente que un equipo dividido por habilidades específicas. Una división muy común y que disminuye considerablemente la agilidad de un equipo es la fuerte división de manual testers, programadores y automation testers.

Aunque posiblemente cada uno de los integrantes tenga mayor habilidad en una área, es importante que sean flexibles y se adapten a las necesidades del proyecto.

Es necesario que también la perspectiva del negocio, para que aporten significativamente a la creación de las pruebas ágiles, por poner un ejemplo, un Product Owner tiene el mayor entendimiento sobre lo que es de mucho valor para el cliente.

Todo el equipo se involucra en las pruebas para fomentar el entendimiento global desde un enfoque centrado en el cliente, y esto genera un aumento en la creatividad de las soluciones.

Al estar todos involucrados en las pruebas, se elimina un cuello de botella significativo porque se acelera la definición y la creación de las mismas. Es más rápido terminar una tarea entre varias personas que si lo hiciera una sola.

Incorporan muchas prácticas ágiles

Además de las características ya mencionadas, las pruebas ágiles permiten incorporar técnicas de gran productividad en el desarrollo de software como:

  • TDD, Test Driven development
  • BDD, Behavior Driven Development
  • Pair programming
  • Mob programming
  • Example mapping

Listado de características

Existen muchas cualidades buenas en las pruebas ágiles, pero listemos las características principales:

  • Se basan en principios y prácticas ágiles.
  • Las pruebas forman parte del desarrollo, formando un todo integral, no es algo que esté separado.
  • Acelera la retroalimentación para poder realizar las adaptaciones necesarias lo más pronto posible.
  • Se acelera el proceso de definición, creación y terminación de las pruebas.
  • Todo el equipo se involucra en las pruebas para fomentar el entendimiento global desde un enfoque centrado en el cliente, y esto genera un aumento en la creatividad de las soluciones.
  • Permite incorporar prácticas ágiles para aumentar la agilidad y productividad.
  • Menos estrés y desarrolladores felices, mayor productividad y mayor calidad.
  • Ahorran tiempo y dinero.

La matriz de pruebas ágiles

Las pruebas ágiles nos proporcionan la certeza de que con el aprendizaje actual estamos resolviendo un determinado problema con la solución correcta y la implementación y/o construcción sé está realizando correctamente.

Las pruebas ágiles maximizan el valor de la solución y minimizan los riesgos, esto se consigue fallando inmediatamente de manera segura para aprender y adaptarse rápidamente.

Con esto último tenemos cuatro aspectos fundamentales a la hora de hacer pruebas:

  • Perspectiva tecnológica
  • Perspectiva de negocio
  • Soporte y guía al desarrollo
  • Crítica del producto

Cuadrantes en relación con los cuatro aspectos

Esos cuatro aspectos anteriores se representan en los siguientes cuadrantes:

Matriz de agile testing

¿Cuáles son las actividades que hacemos diariamente para contestar las siguientes preguntas?

  • ¿Estamos construyendo el producto correcto?, Perspectiva de negocio.
  • ¿Estamos construyendo el producto correctamente?, Perspectiva tecnológica.
  • ¿Cómo guiamos el desarrollo para asegurarnos que el producto es correcto y que se está construyendo correctamente?, Soporte y guía al desarrollo.
  • ¿Cómo obtenemos crítica del cliente que nos ayude a construir el producto correcto de manera correcta?, Crítica del producto.

Describiendo cada cuadrante

El cuadrante 1 proporciona una guía y soporte al programador desde la perspectiva tecnológica. Se crean pruebas unitarias y de componentes, estas pruebas se construyen antes y después de escribir código, nos indica que las partes más pequeñas funcionan como deberían. Aquí se puede utilizar BDD con un enfoque más inclinado a las unidades o piezas del software de manera aislada.

El cuadrante 2 proporciona igual una guía y soporte al programador, pero desde la perspectiva del negocio. Se utilizan pruebas funcionales para User stories y features de tal forma que se validan como el Product Owner las definió y como el usuario final las necesita. Aquí se utiliza mucho BDD (Behavior driven development) para automatizar las pruebas. Y si no existe otra opción, se pueden hacer pruebas manuales.

El cuadrante 3 proporciona crítica del cliente desde la perspectiva de negocio. Son pruebas a nivel del sistema completo, sé válida que el sistema cumple con las expectativas de funcionalidad y usabilidad. Se realizan en su mayoría manualmente porque involucran al usuario y a los testers dentro de un ambiente real o simulado.

El cuadrante 4 proporciona crítica del cliente desde la perspectiva tecnológica. Son pruebas para asegurar la calidad del sistema completo en términos de velocidad de carga, rendimiento, seguridad y escalabilidad. En general pruebas no funcionales que se realizan mediante herramientas y automatización.

Divide y vencerás. Pruebas pequeñas y automatizadas

Las pruebas ágiles generan un producto de alta calidad. Para que esto sea posible es necesario tener una filosofía de prevención de bugs en lugar de buscarlos. Es obvio que existe el error humano, siempre existirán bugs, pero la pregunta principal es ¿Pudimos haber evitado este bug?

Las técnicas como TDD y BDD son muy útiles porque su filosofía es “test-first”, es decir, antes de escribir cualquier línea de código primero crea tus pruebas para entender con mayor claridad el negocio, el cliente y por consiguiente los requerimientos. De esta manera se reduce el tiempo en que se recibe la retroalimentación por las dudas que surgen al momento de escribir las pruebas.

El diseño es superior (más si se realiza en equipo) y se puede refactorizar las funcionalidades rápidamente, eliminando futuros bugs, esto puede suceder varias veces en un mismo día.

Obtener retroalimentación diaria y adaptarse cada minuto o cada hora, es menos costoso y más ágil que hacerlo cada mes o cada semana con pruebas mucho más grandes. Es por eso que las pruebas que nos dan retroalimentación más rápida, son en las que más se deben invertir, normalmente estos tipos de pruebas son las pruebas relativamente pequeñas como unitarias, funcionales y de integración que se pueden automatizar.

Es importante disminuir el uso de pruebas manuales porque son mucho más lentas que las pruebas automatizadas. No estoy diciendo que las pruebas manuales deben desaparecer. Al final son necesarias, pero podemos ahorrarles mucho tiempo a los testers manuales para que reporten bugs que solo se puedan identificar realizando una prueba manual.

Así podemos disminuir las pruebas manuales en la medida de lo posible porque representan un costo mayor que las pruebas automatizadas.

Conclusion

Pasamos mucho tiempo trabajando, tal vez demasiado, creo que más de la mitad de nuestra vida adulta. Pero me he dado cuenta de algo importante, lo he percibido en mi mismo y también en mis compañeros de trabajo. Todos, en algún momento nos la pasamos mal y no estamos contentos, esto produce estrés y nuestra productividad individual empieza a disminuir, lo que sé traduce en disminución de la productividad de todo el equipo.

Las pruebas ágiles y el desarrollo ágil en general ayudan mitigar este problema. Creo firmemente que soy más productivo y hago mejor mi trabajo cuando estoy feliz haciéndolo, aún más si estoy consciente de entregar productos de alto valor para los clientes.

Tampoco estoy diciendo que todo es negro, pero sin duda las pruebas ágiles contribuyen en gran medida a tener un equipo contento, clientes felices y negocios sustentables, ahorrando tiempo, dinero y esfuerzo en el camino.

en_USEN