{"id":2048,"date":"2020-12-31T19:10:00","date_gmt":"2021-01-01T01:10:00","guid":{"rendered":"\/?p=2048"},"modified":"2024-04-05T16:10:37","modified_gmt":"2024-04-05T22:10:37","slug":"introduccion-desarrollo-guiado-especificacion-tdd","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/introduccion-desarrollo-guiado-especificacion-tdd\/","title":{"rendered":"Introducci\u00f3n a desarrollo guiado por especificaci\u00f3n TDD"},"content":{"rendered":"<p>En realidad <strong>TDD<\/strong> significa <strong>Desarrollo guiado por pruebas<\/strong>, del ingl\u00e9s <strong>Test Driven Development<\/strong>. Lamentablemente es un nombre que no le hace justicia, lo que realmente gu\u00eda al desarrollo siguiendo esta pr\u00e1ctica, son las especificaciones o comportamientos.<\/p>\n\n\n\n<p>Ya s\u00e9, ya s\u00e9, para la gente que sabe que es BDD seguro se pregunta, \u00bfGuiado por comportamiento?, \u00bfEso no es BDD?, pero el contenido de esta publicaci\u00f3n clarificar\u00e1 la estrecha relaci\u00f3n entre TDD y BDD. Mostraremos una perspectiva en la que en esencia, son lo mismo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Origen de TDD en la vida<\/h2>\n\n\n\n<p>Una de las caracter\u00edsticas 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:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p><em>Un cazador ense\u00f1a 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\u00e1neo, pero ese es un tiro muy dif\u00edcil. Le dice que el tiro m\u00e1s facil es  &#8220;Apuntar a las rayas que la cebra tiene en el pecho&#8221;.  Mientras el padre dibuja las rayas en el tronco de un \u00e1rbol<\/em> (<strong>simplicidad<\/strong>).<\/p><p><em>\u2013 Sigue practicando el tiro a una distancia de 20 pasos hasta que claves la lanza correctamente\u201d, luego -\u201cNo espera, sost\u00e9n la lanza as\u00ed\u201d, m\u00e1s tarde \u2013 \u201cSi, as\u00ed est\u00e1 mejor, continua as\u00ed\u201d \u2026 \u2013 \u201cAhora, p\u00eddele a tu t\u00edo que te ense\u00f1e c\u00f3mo hacer que la cebra se acerque a una distancia de 10 pasos<\/em>&#8221; (<strong>iterativo e incremental, lotes peque\u00f1os, ciclo de retroalimentacion<\/strong>) <\/p><cite><strong>Bob Allen de <\/strong><a href=\"http:\/\/codecraftsmansaturdays.blogspot.com\/\"><strong>codecraftsmansaturdays<\/strong><\/a><\/cite><\/blockquote>\n\n\n\n<p>El objetivo del padre y del hijo es que este \u00faltimo pueda cazar una cebra (<strong>enfoque<\/strong>).&nbsp;<\/p>\n\n\n\n<p>Lo ideal es clavar la cebra justo debajo de su oreja. Esto es una tarea dif\u00edcil para el hijo, entonces utilizando un proceso <strong>iterativo e incremental<\/strong>, se empieza con el paso m\u00e1s f\u00e1cil hasta ahora conocido. El paso es apuntar al pecho de la cebra a una distancia de 20 pasos (<strong>simplicidad<\/strong>).<\/p>\n\n\n\n<p>Despu\u00e9s 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 (<strong>lotes peque\u00f1os, iteraciones y vamos incrementando hasta la meta<\/strong>). Aunque no se menciona la raz\u00f3n, podemos suponer que, el padre se quiere asegurar que el hijo pueda clavar la cebra en el primer tiro<\/p>\n\n\n\n<p>Ahora bien, de momento se cumple el objetivo (<strong>enfoque<\/strong>), cazar a una cebra, por lo que el padre y el hijo pueden detenerse ah\u00ed. Conforme se empieza a trabajar en la soluci\u00f3n, muchas veces esta es mucho m\u00e1s simple de lo que se pensaba en el inicio.<\/p>\n\n\n\n<p>El punto es que este proceso iterativo e incremental permite ahorrarnos tiempo, dinero y esfuerzo implementando una soluci\u00f3n mucho m\u00e1s simple. Y si te preguntas cu\u00e1l es la soluci\u00f3n complicada, esa es la de <em>&#8220;clavarla justo debajo de la oreja&#8221;<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TDD est\u00e1 basado en principios \u00e1giles y el manifiesto<\/h2>\n\n\n\n<p>Todo este proceso natural e inconsciente sobre como clavar a una cebra, descrito en la secci\u00f3n anterior, gira alrededor de <a href=\"https:\/\/pensemosweb.com\/en\/como-surgio-el-desarrollo-agil-principios-fundamentales\/\">principios \u00e1giles.<\/a> Y estos principios a su vez se relacionan fuertemente con el manifiesto \u00e1gil.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Simplicidad<\/strong>, el arte de maximizar el trabajo no realizado, es esencial.<ol><li>Algunos conocer\u00e1n los principios KISS y YAGNI en programaci\u00f3n.<\/li><li>As\u00ed tambi\u00e9n algunos habr\u00e1n escuchado NO DESPERDICIAR de Lean manufacturing<\/li><li>LOTES PEQUE\u00d1OS en cada iteraci\u00f3n, de Lean Manufacturing<\/li><\/ol><\/li><li><strong>Ciclo de retroalimentaci\u00f3n<\/strong><\/li><li><strong>Proceso iterativo e incremental<\/strong><\/li><\/ol>\n\n\n\n<p>Estos son los m\u00e1s importantes desde mi punto de vista y tal vez los que m\u00e1s podemos notar en el d\u00eda a d\u00eda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Origen de TDD en programaci\u00f3n<\/h2>\n\n\n\n<p>Para darte una idea del origen real de TDD, voy a citar varias fuentes.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><em>No ten\u00edamos manuales para ENIAC. Aprendimos a programar estudiando los diagramas de bloques l\u00f3gicos. Que bendici\u00f3n. Desde el principio supe c\u00f3mo funcionaban las computadoras. Nos ganamos el respeto de los ingenieros desde el principio porque realmente sab\u00edamos lo que est\u00e1bamos haciendo y pudimos depurar mejor que ellos porque ten\u00edamos nuestros <strong>programas de prueba<\/strong> y nuestro conocimiento de la computadora.<\/em><\/p><cite><em>Betty Jean Jennings Bartik, ENIAC programmer 1946<\/em><\/cite><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><em>El primer ataque al problema puede realizarse antes de comenzar la codificaci\u00f3n. Para determinar completamente la precisi\u00f3n de las respuestas, es necesario tener un caso de verificaci\u00f3n calculado a mano con el cual comparar las respuestas que luego ser\u00e1n calculadas por la m\u00e1quina. <\/em><\/p><p><em>Esto significa que las m\u00e1quinas de programas almacenados realmente nunca se utilizan para un problema de una sola vez. Siempre debe haber un elemento de iteraci\u00f3n para que valga la pena. Los c\u00e1lculos manuales se pueden realizar en cualquier momento durante la programaci\u00f3n. Sin embargo, con frecuencia las computadoras son operadas por expertos en computaci\u00f3n para preparar los problemas como un servicio para ingenieros o cient\u00edficos. <\/em><\/p><p><em>En estos casos, es muy deseable que el &#8220;cliente&#8221; prepare el caso de verificaci\u00f3n, en gran parte porque tal procedimiento puede se\u00f1alar errores l\u00f3gicos y malentendidos entre el programador y el cliente. Si el cliente va a preparar la soluci\u00f3n de prueba, lo mejor para \u00e9l es comenzar mucho antes del problema real, ya que para cualquier problema importante se necesitar\u00e1n varios d\u00edas o semanas para calcular la prueba<\/em><\/p><cite><em>Digital Computer Programming<\/em>, D.D. McCracken, 1957<\/cite><\/blockquote>\n\n\n\n<p>Otro dato, de la \u00e9poca de <strong>John Von Neumann, <\/strong>en una entrevista realizada a <strong>Gerald. M. Weingberg por Michael Bolton<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><em>Jerry: No llam\u00e1bamos a esas cosas por esos nombres en ese entonces, pero si miras mi primer libro (<a href=\"http:\/\/www.amazon.com\/Computer-Programming-Fundamentals-Herbert-Leeds\/dp\/0070369941\">Computer Programming Fundamentals<\/a>, Leeds &amp; Weinberg, first edition 1961 \u2014MB) y muchos otros desde entonces, ver\u00e1s que siempre fue as\u00ed como pensabamos que era la \u00fanica forma l\u00f3gica de hacer las cosas. Lo aprend\u00ed de Bernie Dimsdale, quien lo aprendi\u00f3 de von Neumann.<\/em><\/p><p><em>\u2026 luego me encontr\u00e9 con Bernie (en 1957), quien me mostr\u00f3 c\u00f3mo la gente verdaderamente inteligente hac\u00eda las cosas. Mi ego estaba un poco en shock al principio, pero luego me di cuenta de que si von Neumann hac\u00eda las cosas de esta manera, yo deber\u00eda hacerlo.<\/em><\/p><p><em><strong>John von Neumann<\/strong> fue mucho m\u00e1s inteligente de lo que yo ser\u00e9 jam\u00e1s, o de lo que la mayor\u00eda de la gente ser\u00e1, esto significa es que debemos aprender de \u00e9l \u2026<\/em><\/p><cite>Geral M. Weinberg<\/cite><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><em>La descripci\u00f3n original de TDD estaba en un<a href=\"http:\/\/homepages.cs.ncl.ac.uk\/brian.randell\/NATO\/nato1968.PDF\" target=\"_blank\" rel=\"noreferrer noopener\"> libro antiguo<\/a> sobre programaci\u00f3n. El libro dec\u00eda,  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.<\/em><\/p><p><em>Despu\u00e9s de escribir el primer marco xUnit en Smalltalk, record\u00e9 haber le\u00eddo esto y lo prob\u00e9. Ese fue el origen de TDD para m\u00ed. Al describir TDD a programadores mayores, a menudo escucho: \u201cPor supuesto. \u00bfDe qu\u00e9 otra manera podr\u00edas programar? &#8221; Por lo tanto, me refiero a mi papel como &#8220;redescubrir&#8221; TDD.<\/em><\/p><cite><em>Kent Beck<\/em><\/cite><\/blockquote>\n\n\n\n<p>Si analizamos un poco estos \u00faltimos datos, en esa \u00e9poca 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\u00e9s de una falla ya sea por el tiempo de \u201cejecuci\u00f3n\u201d o porque las m\u00e1quinas de esa \u00e9poca simplemente no eran tan sofisticadas como las de hoy en d\u00eda.<\/p>\n\n\n\n<p>Todo esto nos indica la importancia de las pruebas y as\u00ed no retrasar el tiempo necesario para que la soluci\u00f3n funcione correctamente y con menos esfuerzo, en la actualidad no ha cambiado mucho, eso s\u00ed, tenemos otros problemas, adem\u00e1s el software que se desarrolla hoy en d\u00eda tiene mayor escala y las funcionalidades son m\u00e1s sofisticadas. <\/p>\n\n\n\n<p>Otro punto que nos ense\u00f1an estos datos, es que la comunicaci\u00f3n entre los involucrados desde un principio es importante para evitar errores l\u00f3gicos y malentendidos entre el cliente y el programador. Aqu\u00ed los clientes tambi\u00e9n pueden ser&nbsp; usuarios, personas de UX y product owners.<\/p>\n\n\n\n<p>Lo descrito por Kent Beck es muy interesante, programadores m\u00e1s viejos est\u00e1n de acuerdo en que no existe una mejor manera de programar que la de escribir las pruebas primero.<\/p>\n\n\n\n<p>En conclusi\u00f3n, estos datos nos abre los ojos a que las pruebas siempre han sido parte del proceso de dise\u00f1o y codificaci\u00f3n. Y que se hacen lo m\u00e1s antes posible (test-first programming)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OK, \u00bfQu\u00e9 es TDD?<\/h2>\n\n\n\n<p>Es una disciplina que te permite eliminar el miedo a modificar el c\u00f3digo de un software, lo que resulta en la limpieza constante del c\u00f3digo, 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.<\/p>\n\n\n\n<p>TDD es una pr\u00e1ctica \u00e1gil, por consiguiente basada en principios \u00e1giles que nos permite tener una gu\u00eda en el desarrollo de software para nunca perder el enfoque.<\/p>\n\n\n\n<p>TDD se basa en la mentalidad de prevenir defectos en lugar de resolverlos despu\u00e9s, es obvio que no se puede prevenir todos los casos, pero si un gran n\u00famero con un conjunto de pruebas bien hechas.<\/p>\n\n\n\n<p>Hist\u00f3ricamente hablando, ha probado ser en la gran mayor\u00eda 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 <strong>especificaci\u00f3n<\/strong>, la describe mejor, algo as\u00ed como <strong>SDD<\/strong>, Specification Driven Development.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Red-Green-Refactor<\/h3>\n\n\n\n<p>En la pr\u00e1ctica, consiste en tres pasos segun Kent Beck:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li><strong>RED<\/strong>. Escribe una peque\u00f1a prueba que no funcione, tal vez ni siquiera compile al principio<\/li><li><strong>GREEN<\/strong>. Haz que la prueba funcione r\u00e1pidamente, cometiendo los pecados necesarios en el proceso.<\/li><li><strong>REFACTOR<\/strong>. Elimina todo el c\u00f3digo duplicado creado<\/li><\/ol>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/7HH35zybwP2bjjmCKWZd1_yd2bV6xw889zQwljLKr3gBwiwkaHYYioAC2aKQHO9e9HNNEdznFD7yWVN4mchqyvtjK6a9hFBTqhfYfuukfzN1aP1Yxor0cUl_9by5uPyNj43LVNV7\" width=\"502\" height=\"333\"><\/p>\n\n\n\n<p>Ahora bien, cu\u00e1les son los beneficios principales:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ciclo de retroalimentaci\u00f3n y comunicaci\u00f3n<\/li><li>Crear calidad, no medirla<\/li><li>Herramienta de dise\u00f1o<\/li><li>Elimina el miedo a cambiar o mejorar el c\u00f3digo<\/li><li>Documentaci\u00f3n precisa<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TDD como ciclo de retroalimentaci\u00f3n y comunicaci\u00f3n<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><em>Las organizaciones que dise\u00f1an sistemas (en el sentido amplio) est\u00e1n limitadas a producir dise\u00f1os que son copias de las estructuras de comunicaci\u00f3n de dichas organizaciones.<\/em><\/p><cite><em>Melvin E. Conway, 1968<\/em><\/cite><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Individuos e interacciones sobre procesos y herramientas<\/p><cite>Manifiesto \u00e1gil<\/cite><\/blockquote>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/fNo65nWu0esaD9nQNUOQ23y4Vxn2d6CwCf813xLn7DbbqIDJN2HyAOT1GIgMW8TwrMNy-OVqa3TvVRU7ZXJuif-SAPfdnTUQ4uHCTDwhB2mvpm3U9DmBpaU_D5sGR56J_ForQO_S\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p>Un ciclo de retroalimentaci\u00f3n es muy importante para todo lo que hacemos, entre m\u00e1s pronto tengamos retroalimentaci\u00f3n, m\u00e1s pronto podemos reaccionar y corregir nuestras acciones.<\/p>\n\n\n\n<p>Cualquier metodolog\u00eda, framework o proceso \u00e1gil tiene como uno de sus elementos principales uno o varios ciclos de retroalimentaci\u00f3n. Por ejemplo, en <a href=\"https:\/\/pensemosweb.com\/en\/scrum-importante-creacion-productos-servicios-valores-empirismo-pilares\/\">scrum<\/a>, cada iteraci\u00f3n llamada sprint es un <a href=\"https:\/\/pensemosweb.com\/en\/como-surgio-el-desarrollo-agil-principios-fundamentales\/\">ciclo de retroalimentaci\u00f3n<\/a>, las retroespectivas es claramente otro. Todos los d\u00edas el daily es un ciclo retroalimentaci\u00f3n. Cada release es un ciclo retroalimentaci\u00f3n.<\/p>\n\n\n\n<p>Estos ciclos de retroalimentaci\u00f3n nos permiten tener una excelente comunicaci\u00f3n y de forma constante.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TDD es lo mismo que BDD<\/h3>\n\n\n\n<p>Pero hablando en <strong>conjunto<\/strong>, desde el punto de vista t\u00e9cnico y de negocio, trasladado al c\u00f3digo, el cual es el que nos permite cumplir con el comportamiento deseado de una determinada aplicaci\u00f3n, \u00bfExiste alg\u00fan ciclo de retroalimentaci\u00f3n? \u00bfQu\u00e9 nos permita corregir errores lo m\u00e1s pronto posible?<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Respuesta ante el cambio sobre seguir un plan<\/p><cite>Manifiesto \u00e1gil<\/cite><\/blockquote>\n\n\n\n<p>Claro que s\u00ed, existen dos pr\u00e1cticas muy \u00fatiles para esto, una se llama BDD y la otra TDD, estas pr\u00e1cticas responden dos preguntas muy importantes:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u00bf<strong>Estamos construyendo el software correcto?<\/strong>, \u00bfEl que el usuario final necesita?<\/li><li>\u00bf<strong>Estamos construyendo correctamente el software<\/strong>, \u00bfCon la suficiente flexibilidad que permita adaptarse a las nuevas necesidades de los usuarios?<\/li><\/ol>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/dMY9sQdPixcE51dpNFJcTh5z-RoBvbWJES9-ZFUZQSftVzcXbqCEvnnqozh5btZ5JDIZMYbgBbn4JzdzllUBnytri3Z1-d4dETckvqljgGsPoqgcn6zEsiNcDUfyqtuQJsDIrdCC\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p>Aunque BDD y TDD parecen que son dos cosas diferentes, en realidad son lo mismo, TDD se empez\u00f3 a utilizar primero, de hecho se creaban pruebas de aceptaci\u00f3n, de integraci\u00f3n y unitarios usando TDD. Luego, apareci\u00f3 ATDD y BDD (con ayuda de DDD) como extensiones de TDD.<\/p>\n\n\n\n<p>En realidad BDD aporta a TDD:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>La mejora en la retroalimentaci\u00f3n y comunicaci\u00f3n entre todo el equipo, programadores y no programadores<\/li><li>Comportamientos documentados con mayor claridad y precisi\u00f3n<\/li><\/ol>\n\n\n\n<p>Lo que escribimos en c\u00f3digo de prueba son el reflejo de las especificaciones, el objetivo primordial de las pruebas no es verificar exactamente que una clase o m\u00e9todo se ejecute correctamente, sino c\u00f3mo se comporta seg\u00fan el deseo impl\u00edcito de los usuarios finales, y este deseo impl\u00edcito se plasma expl\u00edcitamente en las especificaciones creadas antes de empezar escribir c\u00f3digo de programaci\u00f3n.&nbsp;<\/p>\n\n\n\n<p>Lo anterior es muy importante porque nos da el objetivo y el foco correcto a nuestro desarrollo.&nbsp; Esta idea la podemos decir de las siguientes formas, <strong>desarrollo guiado por<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Especificaci\u00f3n.<\/li><li>El dominio<\/li><li>Comportamiento<\/li><li>Pruebas, la definici\u00f3n m\u00e1s conocida y que lamentablemente genera m\u00e1s confusi\u00f3n.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TDD para crear calidad, no para medirla<\/h2>\n\n\n\n<p>La palabra Testing (Prueba) en el mundo de QA (Quality assurance), quiere decir probar despu\u00e9s de que el software est\u00e1 desarrollado, probar y probar hasta comprobar que el software no tiene defectos. Debido a esto,<strong> las pruebas de QA son<\/strong> <strong>una forma de medir la calidad de un producto, pero no es una forma de construir un producto con calidad.<\/strong><\/p>\n\n\n\n<p>El ciclo de retroalimentaci\u00f3n que nos da el escribir y terminar una funcionalidad y luego probar es ineficiente porque la retroalimentaci\u00f3n se obtiene muy tarde. Es posible trabajar en algo equivocado por minutos, horas y hasta d\u00edas, a veces ese trabajo tiene que ser desechado o m\u00ednimo con muchos cambios.<\/p>\n\n\n\n<p>Cuando la retroalimentaci\u00f3n se retrasa mucho tiempo, por ejemplo, despu\u00e9s 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\u00e1s gastos, porque una vez reportado por QA se debe de encontrar la fuente del defecto y replicarlo, luego entender el problema, entender el c\u00f3digo relacionado y adem\u00e1s el tiempo que se tome corregirlo. Y otra vez QA prueba y reporta si el bug ha sido arreglado o no.<\/p>\n\n\n\n<p>De nuevo el principio de Lean manufacturing sobre trabajar sobre cosas simples y peque\u00f1as, no esperar a encontrar errores o mitigarlos hasta el final de la cadena de producci\u00f3n, sino en cada peque\u00f1a etapa del proceso tener uno o m\u00e1s ciclos completos de retroalimentaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ayuda a devops<\/h3>\n\n\n\n<p>Esto \u00faltimo va de la mano con la integraci\u00f3n continua y despliegue continuo, si las pruebas fallan, no se puede establecer una integraci\u00f3n y mucho menos un despliegue a producci\u00f3n.<\/p>\n\n\n\n<p>Dado que un ciclo de retroalimentaci\u00f3n temprana sucede en varios niveles del software, las incidencias aparecen antes de una integraci\u00f3n y tambi\u00e9n mucho antes de un despliegue. <\/p>\n\n\n\n<p>Claro que nunca se podr\u00e1 mitigar todas los bugs o incidencias, pero por supuesto que se puede disminuir en una gran proporci\u00f3n, esto de igual manera resulta en reducci\u00f3n de costos, tiempo y esfuerzo.<\/p>\n\n\n\n<p>El ambiente en los equipos se vuelve productivo, mejora la comunicaci\u00f3n y seguridad en que de verdad se est\u00e1 entregando un producto de calidad, esto <strong>produce estimaciones m\u00e1s precisas, seguras, y honestas<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TDD como herramienta de dise\u00f1o<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Colaboraci\u00f3n con el cliente sobre negociaci\u00f3n contractual<\/p><cite>Manifiesto \u00e1gil<\/cite><\/blockquote>\n\n\n\n<p>Al escribir las pruebas primero (test-first programming) nos enfocamos en que el c\u00f3digo de producci\u00f3n sea accesible desde el c\u00f3digo de pruebas y sea f\u00e1cil de probar. Esto quiere decir que desde un inicio nos preocupamos por el dise\u00f1o y la arquitectura de nuestro c\u00f3digo de producci\u00f3n, porque para que nuestro c\u00f3digo de producci\u00f3n sea accesible y f\u00e1cil de probar debe estar desacoplado.<\/p>\n\n\n\n<p>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\u00e9n 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).<\/p>\n\n\n\n<p>Cada una de nuestras pruebas deben ejecutarse independientemente de las otras, en&nbsp; nuestro esfuerzo de hacer que las pruebas se ejecuten independientemente, mejoramos el dise\u00f1o 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\u00e1n c\u00f3digo de producci\u00f3n) deben ser lo bastante flexibles de tal manera que permitan ser sustituidas, invocadas y verificadas f\u00e1cilmente. Esto permite crear un software con alta cohesi\u00f3n y bajo acoplamiento, es decir, con un buen dise\u00f1o y una buena arquitectura.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Nuestros dise\u00f1os deben consistir en muchos componentes altamente cohesivos y d\u00e9bilmente acoplados, solo para facilitar las pruebas.<\/p><cite>Kent Beck<\/cite><\/blockquote>\n\n\n\n<p>El c\u00f3digo de pruebas debe desarrollarse con la m\u00e1s alta calidad posible, deben ser f\u00e1cil de entender y f\u00e1cil de ejecutar de manera independiente, y al enfocarnos en este aspecto, el c\u00f3digo de producci\u00f3n creado tambi\u00e9n resulta de la m\u00e1s alta calidad posible. Sin perder de vista que esto sucede paso a pasito, en un proceso enfocado a la simplicidad, iterativo e incremental.<\/p>\n\n\n\n<p>El resultado de un buen dise\u00f1o, tambi\u00e9n resulta en que las modificaciones de c\u00f3digo se hacen mucho m\u00e1s r\u00e1pido, y esto quiere decir que no necesitas quedarte horas extras programando, tendr\u00e1s m\u00e1s tiempo personal, que puedes compartir con tu familia, hijos, con tu pareja (o amante), etc\u00e9tera.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TDD<strong> elimina el miedo a modificar el c\u00f3digo<\/strong><\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\u00bfPor qu\u00e9 la mayor\u00eda de los programadores tienen miedo de hacer cambios a su c\u00f3digo? \u00a1Tienen miedo de romper el c\u00f3digo! \u00bfPor qu\u00e9 tienen miedo de romper el c\u00f3digo? Porque no tienen pruebas.<\/p><cite>Robert C. Martin, <a href=\"https:\/\/www.goodreads.com\/work\/quotes\/15186027\" target=\"_blank\" rel=\"noreferrer noopener\">The Clean Coder: A Code of Conduct for Professional Programmers<\/a><\/cite><\/blockquote>\n\n\n\n<p>Las pruebas son m\u00e1s importantes que el c\u00f3digo de producci\u00f3n porque permiten que el sistema se vuelva flexible, de otra manera el miedo a la modificaci\u00f3n del c\u00f3digo crece, porque se teme romper la funcionalidad, y entonces el software ya no es adaptable, poco a poco, entre m\u00e1s evoluciona, menos flexible se vuelve por miedo a realizar modificaciones que rompan el producto. <\/p>\n\n\n\n<p>\u00bfNo te ha pasado en alg\u00fan proyecto, donde necesitas hacer unas modificaciones al c\u00f3digo, y existen partes que mejor ni las tocas por miedo de romper alguna funcionalidad?, porque realmente no est\u00e1s seguro de lo que esa parte del c\u00f3digo hace y no tienes un conjunto de pruebas que respalde tus cambios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u00bfQu\u00e9 es c\u00f3digo legacy?<\/strong><\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Codigo que los programadores tienen miedo cambiar<\/p><cite>Eli Lopia CEO de typemock<\/cite><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>C\u00f3digo sin pruebas<\/p><cite>Michael C. Feather<\/cite><\/blockquote>\n\n\n\n<p>TDD permite mitigar el miedo de modificar tu c\u00f3digo o el de otra persona. \u00bfC\u00f3mo puedes tener seguridad de que las funcionalidades que desarrollas tienen la calidad suficiente para decir que est\u00e1 <strong>terminado<\/strong>? Sin un conjunto de pruebas no tienes esa seguridad, y como ya hemos comentado antes, esperar retroalimentaci\u00f3n hasta el ciclo de pruebas de un equipo de QA, es demasiado tarde.<\/p>\n\n\n\n<p>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\u00e1s realizando las modificaciones.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Individuos e interacciones sobre procesos y herramientas<\/p><cite>Manifiesto \u00e1gil<\/cite><\/blockquote>\n\n\n\n<p> Segun Ken Beck el miedo tiene los siguientes efectos, te hace:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Inseguro sobre el c\u00f3digo que escribes<\/li><li>Querer comunicar menos<\/li><li>T\u00edmido a la retroalimentaci\u00f3n<\/li><li>Gru\u00f1\u00f3n<\/li><\/ul>\n\n\n\n<p>Ning\u00fan efecto de arriba es de ayuda a la hora de programar y menos cuando nos enfrentamos a un problema complicado. As\u00ed que Kent Beck recomienda los siguientes puntos usando TDD:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>En lugar de dudar de tu c\u00f3digo, <strong>empieza a aprender cosas concretas lo m\u00e1s r\u00e1pido posible.<\/strong> Paso a pasito, lotes peque\u00f1os y de manera iterativa e incremental con el ciclo red-green-refactor.<\/li><li>En lugar de quedarte callado, <strong>comun\u00edcate m\u00e1s claramente<\/strong>. Al usar TDD aumentas la calidad y por consiguiente est\u00e1s dispuesto a comunicar dudas o problemas que enfrentas a la ahora de programar<\/li><li>En lugar de evitar retroalimentaci\u00f3n, <strong>busca ayuda, y retroalimentaci\u00f3n concreta.<\/strong><\/li><li>(Sobre lo gru\u00f1\u00f3n, estas por tu cuenta). Pero con m\u00e1s seguridad en tu c\u00f3digo, menos problemas y m\u00e1s tiempo personal, seguro que tu nivel de gru\u00f1\u00f3n bajar\u00e1.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TDD como documentaci\u00f3n precisa<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Software funcionando sobre documentaci\u00f3n extensiva<\/p><cite>Manifiesto \u00e1gil<\/cite><\/blockquote>\n\n\n\n<p>Para tener una documentaci\u00f3n detallada es necesario mucho tiempo y esfuerzo porque la documentaci\u00f3n 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\u00f3n. Es muy dif\u00edcil mantener sincronizada la documentaci\u00f3n con el verdadero funcionamiento (con el c\u00f3digo), con el tiempo la documentaci\u00f3n miente sobre la funcionalidad, la \u00fanica fuente de verdad es el c\u00f3digo,&nbsp;<strong>el c\u00f3digo no miente<\/strong>.<\/p>\n\n\n\n<p>La mejor documentaci\u00f3n e instrucciones de como funciona una pieza del sistema se encuentran en las\u00a0<strong>personas<\/strong>\u00a0y el\u00a0<strong>c\u00f3digo<\/strong>\u00a0que ellas crean. E<em>s de valor inigualable poner \u00e9nfasis en la excelencia t\u00e9cnica y al buen dise\u00f1o para mejorar la agilidad<\/em>, es decir, c\u00f3digo limpio, bien dise\u00f1ado 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\u00f1o y a la calidad de la misma, lo que por supuesto te ahorra much\u00edsimo tiempo. Claro que esto no se puede lograr sin las personas, sin su disciplina y auto organizaci\u00f3n.<\/p>\n\n\n\n<p>Para ponerlo m\u00e1s claro, cuando tienes la disciplina de hacer TDD, cada una de las pruebas que creas, describe perfectamente como cada funci\u00f3n o m\u00e9todo, clase y\/o componente se utiliza, de una manera tan precisa que si algo va mal cuando se est\u00e1 modificando, al menos una de las pruebas fallara casi al instante.<\/p>\n\n\n\n<p>Cuando realizas pruebas de m\u00e9todos y funciones, tienes que describir que par\u00e1metros reciben y que resultados regresan \u00bfQu\u00e9 m\u00e1s documentaci\u00f3n necesitas? Tampoco digo que nunca se haga documentaci\u00f3n, claro que si, pero es una inversi\u00f3n de tiempo, dinero y esfuerzo, que puedes disminuir considerablemente y que puedes posponer hasta las etapas m\u00e1s estables del producto, cuando se sabe que su funcionalidad cambiar\u00e1 poco o en intervalos m\u00e1s largos de tiempo.<\/p>\n\n\n\n<p>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\u00f3digo y lo probamos. Y ser\u00eda estupendo que la funcionalidad del c\u00f3digo est\u00e9 descrita detalladamente a trav\u00e9s de un conjunto de pruebas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<p><a href=\"https:\/\/arialdomartini.wordpress.com\/2012\/07\/20\/you-wont-believe-how-old-tdd-is\/\">https:\/\/arialdomartini.wordpress.com\/2012\/07\/20\/you-wont-believe-how-old-tdd-is\/<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/homepages.cs.ncl.ac.uk\/brian.randell\/NATO\/nato1968.PDF\">http:\/\/homepages.cs.ncl.ac.uk\/brian.randell\/NATO\/nato1968.PDF<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.developsense.com\/blog\/2011\/01\/jerry-weinberg-interview-from-2008\/\">https:\/\/www.developsense.com\/blog\/2011\/01\/jerry-weinberg-interview-from-2008\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/associationforsoftwaretesting.org\/2014\/11\/02\/how-to-sell-tdd-to-x\/\">https:\/\/associationforsoftwaretesting.org\/2014\/11\/02\/how-to-sell-tdd-to-x\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.computerworld.com\/article\/2470893\/jean-bartik--last-of-the-original-eniac-programmers--86.html\">https:\/\/www.computerworld.com\/article\/2470893\/jean-bartik&#8211;last-of-the-original-eniac-programmers&#8211;86.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/ENIAC\">https:\/\/en.wikipedia.org\/wiki\/ENIAC<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/es.wikipedia.org\/wiki\/Jean_Jennings_Bartik\">https:\/\/es.wikipedia.org\/wiki\/Jean_Jennings_Bartik<\/a><\/p>\n\n\n\n<p><a href=\"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:\/\/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<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/agileforall.com\/history-of-tdd-as-told-in-quotes\/\">https:\/\/agileforall.com\/history-of-tdd-as-told-in-quotes\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/amzn.to\/3pIsAGj\" target=\"_blank\" rel=\"noreferrer noopener sponsored nofollow\">Test-Driven development: by example<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>En realidad TDD significa Desarrollo guiado por pruebas, del ingl\u00e9s Test Driven Development. Lamentablemente es un nombre que no le hace justicia, lo que realmente gu\u00eda al desarrollo siguiendo esta pr\u00e1ctica, son las especificaciones o comportamientos. Ya s\u00e9, ya s\u00e9, para la gente que sabe que es BDD seguro se pregunta, \u00bfGuiado por comportamiento?, \u00bfEso [&hellip;]<\/p>","protected":false},"author":2,"featured_media":3724,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[21],"tags":[39],"class_list":["post-2048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agilidad","tag-agilidad"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/comments?post=2048"}],"version-history":[{"count":1,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2048\/revisions"}],"predecessor-version":[{"id":3585,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2048\/revisions\/3585"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3724"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=2048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=2048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=2048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}