<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pablo Alonso García &#187; Metodologías ágiles</title>
	<atom:link href="http://alonsogarciapablo.com/blog/category/desarrollo-agil/feed/" rel="self" type="application/rss+xml" />
	<link>http://alonsogarciapablo.com/blog</link>
	<description>Desarrollo de software, desarrollo web, metodologías ágiles, internet.</description>
	<lastBuildDate>Wed, 03 Aug 2011 22:52:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>westartup: un evento ágil para desempleados y emprendedores</title>
		<link>http://alonsogarciapablo.com/blog/westartup-un-evento-agil-para-desempleados-y-emprendedores/</link>
		<comments>http://alonsogarciapablo.com/blog/westartup-un-evento-agil-para-desempleados-y-emprendedores/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 11:20:21 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=582</guid>
		<description><![CDATA[westartup es un evento que une a desempleados y emprendedores para impulsar ideas de negocio. El próximo evento se va a celebrar en Gijón, del 6 al 8 de mayo 2011. ¿En qué consiste el evento? El evento consiste en desarrollar dos ideas de negocio, ver su viabilidad y hasta desarrollar prototipos del producto / servicio [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-583" title="westartup" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/04/westartup.png" alt="Logotipo de westartup, evento en Gijón para desempleados" width="232" height="75" /></p>
<p><a rel="external" href="http://www.westartup.org/">westartup</a> es un evento que une a <strong>desempleados y emprendedores</strong> para impulsar ideas de negocio. El <a href="http://www.westartup.org/proximos-eventos/gijon-asturias-6-7-y-8-de-mayo-2011-tu-oportunidad/" rel="external">próximo evento se va a celebrar en Gijón, del 6 al 8 de mayo 2011</a>.</p>
<h2>¿En qué consiste el evento?</h2>
<p>El evento consiste en desarrollar dos ideas de negocio, ver su viabilidad y hasta desarrollar prototipos del producto / servicio de la idea. Tanto si tu idea sale seleccionado como si no trabajarás en un equipo multidisciplinar, de forma ágil y aprendiendo constantemente. Apúntate, es una experiencia única.</p>
<h2>¿Cuanto dura el evento?</h2>
<p>El evento <strong>comienza el viernes 6 de mayo a las 16 horas y finaliza el domingo 8 de mayo</strong> con la cena de fin de westartup, dos días y medio intensos y llenos de experiencias que no te puedes perder.</p>
<h2>¿Cómo es el proceso de Inscripción?</h2>
<p>Se ha de mandar un correo electrónico a la dirección <a href="mailto:tuoportunidad@westartup.org">tuoportunidad@westartup.org</a> para recibir las instrucciones para formalizar la inscripción</p>
<h2>¿Es necesario presentar una idea de negocio para participar?</h2>
<p>No, no hace falta. Los asistentes que no quieran presentar una propuesta son bienvenidos igualmente. Podrán participar en las votaciones de selección de ideas y luego trabajar en la idea que prefieran de las dos ganadoras.</p>
<h2>¿Qué tiene además de novedoso este evento?</h2>
<p><strong>En este evento se va a aplicar Scrum</strong> (metodología ágil) para el desarrollo de las dos ideas de negocio, esto permite disponer ya de una primera beta del plan de empresa el sábado para posteriormente redefinirlo el domingo. Por tanto<strong> los asistentes se benefician además de la experiencia de trabajar en un entorno ágil con una metodología ágil</strong>.</p>
<p>El evento está organizado por la asociación ImpulsaTIC (formada por: Inxeniu Internet Media, Domótica Davinci, Gedpro, Iniciamedia y Cowork Asturias).</p>
<p>Tenéis más información en la página oficial westartup: <a href="http://www.westartup.org/">http://www.westartup.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/westartup-un-evento-agil-para-desempleados-y-emprendedores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprendiendo a escribir código limpio con Clean Code</title>
		<link>http://alonsogarciapablo.com/blog/codigo-limpio-con-clean-code/</link>
		<comments>http://alonsogarciapablo.com/blog/codigo-limpio-con-clean-code/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 18:03:47 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[robert c.martin]]></category>
		<category><![CDATA[uncle bob]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=397</guid>
		<description><![CDATA[Por fín he terminado de leer Clean Code, el famoso libro de Robert C.Martin a.k.a. Uncle Bob, que algunos conoceréis por ser uno de los autores del manifiesto ágil. Después de haberme encontrado con innumerables referencias al libro &#8211; tanto en twitter, como en algunos blogs que sigo habitualmente (que ahora recuerde este de @kinisoftware [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/01/MG_1805.jpg" alt="Portada del libro Clean Code, A Handbook of Agile Software Craftsmanship" title="Portada del libro Clean Code, A Handbook of Agile Software Craftsmanship"  class="aligncenter size-full wp-image-399" /></p>
<p>Por fín he terminado de leer <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="external">Clean Code</a>, el famoso libro de <a href="http://www.objectmentor.com/omTeam/martin_r.html" rel="external">Robert C.Martin a.k.a. Uncle Bob</a>, que algunos conoceréis por ser uno de los autores del <a href="http://agilemanifesto.org/" rel="external">manifiesto ágil</a>. Después de haberme encontrado con innumerables referencias al libro &#8211; tanto en twitter, como en algunos blogs que sigo habitualmente (que ahora recuerde este de <a href="http://kinisoftware.lacoctelera.net/post/2010/12/11/comentando-libro-clean-code" rel="external">@kinisoftware</a> y este de <a href="http://jacegu.eu/libros/clean-code/" rel="external">@jacegu</a>) &#8211; me propuse leerlo como uno de los objetivos para este año.</p>
<p>Escribir código que funciona es una tarea relativamente sencilla. Lo difícil es escribir código que, con el tiempo, no se convierta en un &#8220;chorizo&#8221; imposible de ampliar y/o mantener, y que sea entendible por otros programadores. En Clean Code, Uncle Bob nos explica su visión del buen código: el código limpio.</p>
<p>Resumiendo mucho, un código limpio (y bueno según el autor):
<ul>
<li>Incluye <strong>nombres significativos</strong> en variables, funciones, clases, etc.</li>
<li>Incluye <strong>funciones con responsabilidades bien diferenciadas, los parámetros justos, un nivel de abstracción uniforme</strong>.</li>
<li><strong>No repite código</strong>.</li>
<li>Está <strong>autodocumentado</strong>, por lo que no es necesario usar comentarios.</li>
<li>Está <strong>bien diseñado</strong>. Por ejemplo, hace uso de interfaces en vez de implementaciones concretas.</li>
<li>Tiene bien separado <strong>el manejo de errores para que esto no interfiera en la comprensión del código</strong>.</li>
<li>Se <strong>integra bien con otras aplicaciones</strong>, manteniendo limpias las fronteras y transformando la información externa en objetos de nuestra aplicación.</li>
<li>Está <strong>cubierto al 100% por una batería de tests</strong> que comprueban todos los posibles caminos de ejecución.</li>
<li>Está dividido y organizado en <strong>clases de un tamaño justo con responsabilidades bien definidas</strong>.</li>
<li><strong>Separa claramente la construcción e inicialización del sistema de lo que es la ejecución en sí</strong>.</li>
<li>Crece de una forma sostenible, es decir que <strong>la arquitectura evoluciona incrementalmente</strong> y el código no va degenerando sino todo lo contrario, con cada cambio es más &#8220;fino&#8221; y siempre <strong>cumple las <a href="http://alonsogarciapablo.com/blog/las-4-reglas-de-kent-beck-para-escribir-codigo-simple/">4 reglas de Kent Beck para escribir código limpio</a></strong>.</li>
</ul>
<p>El libro está <strong>repleto de código escrito en Java</strong>. Hay 2 capítulos donde Uncle Bob explica las refactorizaciones de una clase de <a href="http://junit.sourceforge.net/" rel="external">JUnit</a> y la clase <a href="http://www.docjar.com/html/api/org/jfree/date/SerialDate.java.html" rel="external">org.free.date.SerialDate</a>. Estos ejemplos son muy educativos, aunque exigen bastante atención.</p>
<p>En general <strong>no es un libro &#8220;de piscina&#8221; ni &#8220;de váter&#8221;, sino que requiere bastante esfuerzo</strong>: reeler los ejemplos para entenderlos, subrayar y tomar notas, consultar referencias, etc.</p>
<p>Me ha gustado por que no sólo te explica cómo escribir si no que tiene bastantes referencias y conceptos como la <a href="http://en.wikipedia.org/wiki/Law_of_Demeter" rel="external">Ley de Demetrio</a>, <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas" rel="external">Desarrollo guiado por pruebas (TDD)</a> y las reglas F.I.R.S.T., <a href="http://en.wikipedia.org/wiki/Separation_of_concerns" rel="external">Separation of Concerns</a>,<a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" rel="external"> Single Responsability Principle</a> (Principio de Responsabilidad Única), <a href="http://en.wikipedia.org/wiki/Open/closed_principle" rel="external">Open-Closed Principle</a>, <a href="http://martinfowler.com/articles/injection.html" rel="external">Inversion of Control y el patrón Depency Injection</a>,<a href="http://en.wikipedia.org/wiki/Domain-specific_language" rel="external"> Domain Specific Languajes</a>, etc.</p>
<p>También ayuda a ver y compreder algunos patrones de diseño como <a href="http://es.wikipedia.org/wiki/Abstract_Factory_(patr%C3%B3n_de_dise%C3%B1o)" rel="external">Abstract Factory</a> y <a href="http://es.wikipedia.org/wiki/Adapter_(patr%C3%B3n_de_dise%C3%B1o)" rel="external">Adapter (Wrapper)</a>.</p>
<p>El último capítulo incluye una referencia de &#8220;Smells and heuristics&#8221;, que son una <strong>ampliación de los <em>Code Smells</em> del libro de <a href="http://martinfowler.com/books.html#refactoring" rel="external">Refactoring de Martin Fowler</a></strong> y que sirve como muy buen resumen del resto del libro.</p>
<p>Sin duda, <strong>Clean Code puede marcar un antes y un después en tus capacidades de programación si lo estudias con dedicación</strong>.</p>
<p>Y cómo la práctica hace al maestro, ¡ahora toca practicar!</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/codigo-limpio-con-clean-code/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Las 4 reglas de Kent Beck para escribir código simple</title>
		<link>http://alonsogarciapablo.com/blog/las-4-reglas-de-kent-beck-para-escribir-codigo-simple/</link>
		<comments>http://alonsogarciapablo.com/blog/las-4-reglas-de-kent-beck-para-escribir-codigo-simple/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 09:34:17 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[Código simple]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[Kent Beck]]></category>
		<category><![CDATA[YagNi]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=487</guid>
		<description><![CDATA[En sus 4 reglas para escribir código simple, Kent Beck explica que un buen código simple debe cumplir: Pass all tests. Clear, expressive &#038; consistent. Duplicates no behavior or configuration. Minimal methods, classes, &#038; modules Cuya traducción al castellano vendría a ser: Estar bien cubierto y satisfacer las aserciones de una buena batería de tests [...]]]></description>
			<content:encoded><![CDATA[<p>En sus <a href="http://c2.com/cgi/wiki?XpSimplicityRules" rel="external">4 reglas para escribir código simple</a>, Kent Beck explica que un buen código simple debe cumplir:</p>
<ul>
<li>Pass all tests.</li>
<li>Clear, expressive &#038; consistent.</li>
<li>Duplicates no behavior or configuration.</li>
<li>Minimal methods, classes, &#038; modules</li>
</ul>
<p>Cuya traducción al castellano vendría a ser:</p>
<ul>
<li>Estar bien cubierto y satisfacer las aserciones de una buena <a href="http://c2.com/cgi/wiki?UnitTestsTellYouWhenYoureDone" rel="external">batería de tests unitarios</a>.</li>
<li>Expresar las ideas que nosotros como programadores queremos expresar (<a href="http://c2.com/cgi/wiki?SelfDocumentingCode" rel="external">código auto-documentado</a>).</li>
<li>Decir cada cosa una única vez (<a href="http://c2.com/cgi/wiki?DontRepeatYourself" rel="external">DRY -> Don&#8217;t Repeat Yourself</a>).</li>
<li>Evitar tener partes supérfluas: debe ser simple y satisfacer las necesidades actuales, sin pensar en lo que puede pasar en el futuro (<a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt" rel="external">You ain&#8217;t gonna Need it -> YagNi</a>); y <a href="http://c2.com/cgi/wiki?MinimumNumberOfClassesAndMethods" rel="external">tener el mínimo  número de clases y métodos</a> (teniendo en cuenta el Principio de Responsabilidad Única).</li>
</ul>
<p>Me he enterado de la existencia de estas reglas gracias al libro <a href="http://www.informit.com/store/product.aspx?isbn=0132350882" rel="external">Clean Code</a>, que llevo tiempo leyendo y que mucha gente considera de obligada lectura para cualquier desarrollador de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/las-4-reglas-de-kent-beck-para-escribir-codigo-simple/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mi primera code kata resuelta: String Calculator</title>
		<link>http://alonsogarciapablo.com/blog/mi-primera-code-kata-resuelta-string-calculator/</link>
		<comments>http://alonsogarciapablo.com/blog/mi-primera-code-kata-resuelta-string-calculator/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 19:06:11 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Metodologías ágiles]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=406</guid>
		<description><![CDATA[¿Qué es una kata en programación? Una kata (programación) es un ejercicio de programación que pretende mejorar las cualidades de un programador mediante la práctica y resolución repetitiva de problemas. Son ejercicios muy interesantes por dos razones: te obligan a encontrar una solución a un problema; y te permiten contrastar tu solución con las de [...]]]></description>
			<content:encoded><![CDATA[<h3>¿Qué es una kata en programación?</h3>
<p>Una <a href="http://en.wikipedia.org/wiki/Kata_(programming)" rel="external">kata (programación)</a> es un ejercicio de programación que pretende mejorar las cualidades de un programador mediante la práctica y resolución repetitiva de problemas.</p>
<p>Son ejercicios muy interesantes por dos razones:<strong> te obligan a encontrar una solución a un problema</strong>; y te <strong>permiten contrastar tu solución con las de otras personas</strong>, ayudandote a <strong>descubrir nuevas formas de afrontar dicho problema</strong>.</p>
<p>Generalmente se resuelven utilizando <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas" rel="external">desarrollo dirigido por pruebas</a>, es decir, escribiendo primero las pruebas y luego el código, y es interesante resolverlas <a href="http://en.wikipedia.org/wiki/Pair_programming" rel="external">programando en parejas</a>.</p>
<h3>La iniciativa #12meses12katas o #12months12katas</h3>
<p>Hace un tiempo leí en <a href="http://twitter.com/12meses12katas" rel="external">twitter</a> acerca de esta iniciativa, que consiste en resolver una kata cada mes. Si mucha gente se anima, al final de cada mes puedes contrastar tu solución con el resto y aprender mucho. Me gustó tanto que me lo marqué como objetivo para este año.</p>
<p>Fruto de esta idea, <a href="http://kinisoftware.lacoctelera.net/" rel="external">kinisoftware</a> se ha lanzado y ha creado <a href="http://www.12meses12katas.com/">12meses12katas.com</a>, que en breve se convertirá en un punto de encuentro y lugar centralizado donde compartir los enunciados de las katas y las diversas soluciones.</p>
<h3>La kata: <a href="https://github.com/alonsogarciapablo/code_katas/tree/master/StringCalculator" rel="external">String Calculator</a></h3>
<p>La kata consiste en hacer una calculadora que recibe una cadena con un formato específico y realiza la suma de sus operandos. La mayor complicación radica en el parseo de la operación. Yo me decanté por utilizar <a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular" rel="external">expresiones regulares</a>, y fue en la escritura de estas donde invertí más tiempo.</p>
<h3>Mi solución</h3>
<p>Mi solución está implementada con <a href="http://ruby-lang.org/" rel="external">Ruby</a> y <a href="http://rspec.info/" rel="external">RSpec</a>. He de reconocer que he necesitado 3 intentos y que no estoy muy contento con la solución para el caso de diversos delimitadores.</p>
<p>De momento, he colgado la solución en <a href="http://github.com/alonsogarciapablo/code_katas/tree/master/StringCalculator">mi cuenta de GitHub</a> y también la incluyo a continuación.</p>
<p><span id="more-406"></span></p>
<p>Dado que el <a href="http://www.12meses12katas.com/">objetivo de este ejercicio es aprender, cualquier comentario/crítica/observación será muy bien recibido</a> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><script src="https://gist.github.com/792287.js?file=string_calculator_spec.rb"></script></p>
<p><script src="https://gist.github.com/792287.js?file=string_calculator.rb"></script></p>
<p>Si eres desarrollador de software te animaría a que te sumases a la iniciativa.</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/mi-primera-code-kata-resuelta-string-calculator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La métafora de la Deuda Técnica (Technical Debt), por Ward Cunningham</title>
		<link>http://alonsogarciapablo.com/blog/la-metafora-de-la-deuda-tecnica-technical-debt-por-ward-cunningham/</link>
		<comments>http://alonsogarciapablo.com/blog/la-metafora-de-la-deuda-tecnica-technical-debt-por-ward-cunningham/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 15:05:11 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[broken windows]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[deuda técnica]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[Ward Cunningham]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=348</guid>
		<description><![CDATA[Durante el desarrollo de cualquier aplicación informática, puede ocurrir (me atrevería a decir que es habitual) que las nuevas funcionalidades no se implementen de la mejor forma posible. ¿Por qué? Puede haber muchos motivos: inexperiencia de los desarrolladores, plazos demasiado ajustados que no permiten pensar en una solución &#8220;óptima&#8221;, desconocimiento del dominio del problema en [...]]]></description>
			<content:encoded><![CDATA[<p>Durante el desarrollo de cualquier aplicación informática, puede ocurrir (me atrevería a decir que es habitual) que las nuevas funcionalidades no se implementen de la mejor forma posible. ¿Por qué? Puede haber muchos motivos: inexperiencia de los desarrolladores, plazos demasiado ajustados que no permiten pensar en una solución &#8220;óptima&#8221;, desconocimiento del dominio del problema en ese momento, etc. Para explicar <strong>cómo tratar con todas aquellas implementaciones o tareas que en un proyecto quedan sin hacer, o en un estado &#8216;esto ya lo arreglaremos&#8217;</strong>, <a href="http://c2.com/~ward/" rel="external">Ward Cunningham</a> comenzó a utilizar la métafora de la <a href="http://c2.com/cgi/wiki?TechnicalDebt">deuda técnica</a>.</p>
<p>En este video de 4:44, Ward explica la historia y motivaciones de esta metáfora.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/pqeJFYwnkjE?fs=1&amp;hl=es_ES"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/pqeJFYwnkjE?fs=1&amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p><span id="more-348"></span></p>
<p>Ward comenzó a utilizar esta métafora mientras desarrollaba una aplicación relacionada con las finanzas (por eso usó una anología financiera). La idea es que <strong>cuando implementas unas solución de una forma rápida, adquieres una deuda, igual que la deuda que obtienes con un banco cuando este te concede un préstamo</strong>. En el momento ganas en velocidad (tiempo), y si pagas la deuda rápido no habrá problemas. El problema ocurre cuando mantienes esa deuda técnica:<strong> mientras sigas endeudado, seguirás pagando intereses</strong>.
</p>
<p>Hay muchas <strong>tareas en el desarrollo de software que pueden ser objeto de la deuda técnica</strong>, como: <a href="http://es.wikipedia.org/wiki/Refactorizaci%C3%B3n" rel="external">refactorizaciones del código de la aplicación para que sea más limpio y tenga un mejor diseño</a>, documentación (como el Javadoc por ejemplo), implementación de los tests, etc.</p>
<p><strong>Un proyecto donde sólo se desarrollan nuevas funcionalidades y se aumenta continuamente la deuda técnica es muy probable que fracase</strong>, debido a los intereses que hay que pagar: código que sólo los desarrolladores que comenzaron el proyecto son capaces de entender, <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_spaghetti" rel="external">código espagueti</a>; mayores probabilidades de que los desarrolladores estés desmotivados y escriban peor código, etc.
</p>
<p>Por eso, <strong>hay que tomar medidas para saldar periódicamente nuestra deuda técnica</strong> (en aquellos casos en que se haya producido). Por ejemplo: llevar un registro de esas tareas pendientes y reservar tiempo en el futuro próximo para llevarlas a cabo. Según Ward, la aplicación debería reflejar en todo momento la comprensión que los desarrolladores tienen sobre el problema.</p>
<p>En definitiva, y según mi experiencia, coincido con el contenido del vídeo: no es bueno dejar este tipo de cosas para mucho más tarde, porque en la mayoría de ocasiones <strong>&#8220;Later equals never&#8221;</strong>. ¿Cuántas veces, ante un código que funciona has pensado: &#8220;mañana lo reviso y lo refactorizo para que esté más limpio&#8221;; y, tiempo más tarde, ni siquera tú entendías lo que hace? Seguro que sabes de lo hablo. En estos casos, corremos el riesgo de caer en un &#8220;efecto bola de nieve&#8221; en el que cada día aumenta la <a href="http://pragprog.com/the-pragmatic-programmer/extracts/software-entropy" rel="external">entropía de la aplicación</a>. Y es entonces cuando el proyecto tiene todas las papeletas para fracasar.</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/la-metafora-de-la-deuda-tecnica-technical-debt-por-ward-cunningham/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Un ejemplo muy sencillo para entender el desarrollo dirigido por comportamiento (BDD) con Cucumber y Ruby On Rails</title>
		<link>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/</link>
		<comments>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 22:28:50 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=303</guid>
		<description><![CDATA[El propósito de este post es ayudarte a configurar una aplicación Ruby On Rails muy sencilla, con soporte para la definición de tests de aceptación de usuario con Cucumber. Son los pasos que yo he seguido para iniciarme en el mundo del BDD (desarrollo dirigido por comportamientos). El ejemplo consiste en la clásica aplicación Rails [...]]]></description>
			<content:encoded><![CDATA[<p>
<img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/12/cucumber_logo.png" alt="Logotipo de Cucumber. Pruebas de aceptación con Cucumber y Rails (BDD)" title="cucumber_logo" width="391" height="119" class="aligncenter size-full wp-image-320" /></p>
<p>El propósito de este post es ayudarte a <strong>configurar una aplicación <a href="http://www.rubyonrails.org/" rel="external">Ruby On Rails</a> muy sencilla, con soporte para la definición de tests de aceptación de usuario con <a href="http://cukes.info/" rel="external">Cucumber</a></strong>. Son los pasos que yo he seguido para iniciarme en el mundo del <a rel="external" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"><acronym title="Behavior Driven Development">BDD</acronym> (desarrollo dirigido por comportamientos)</a>. El ejemplo consiste en la clásica aplicación Rails (versión 2.3.5) de gestión de Posts, generada usando <a href="http://guides.rubyonrails.org/getting_started.html#getting-up-and-running-quickly-with-scaffolding" rel="external"><em>Scaffolding</em></a>.</p>
<p>He colgado la aplicación resultante en mi cuenta de GitHub: <a href="https://github.com/alonsogarciapablo/cucumber_rails_test" rel="external">https://github.com/alonsogarciapablo/cucumber_rails_test</a>.</p>
<p><span id="more-303"></span></p>
<h2>Configuración previa</h2>
<p>Antes de empezar, es necesario instalar las siguientes gemas:</p>
<h3>Gherkin</h3>
<p>Gherkin son dos cosas:</p>
<ul>
<li>El lenguaje que ha surgido a partir de Cucumber. Más concretamente es un <a rel="external" href="http://en.wikipedia.org/wiki/Domain-specific_language"><acronym title="Domain Specific Language">DSL</acronym> (lenguaje específico de dominio)</a> que permite hacer <a rel="external" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"><acronym title="Behavior Driven Development">BDD</acronym> (desarrollo dirigido por comportamiento)</a>.</li>
<li>La <a rel="external" href="https://github.com/aslakhellesoy/gherkin">librería</a> para parsear dicho lenguaje.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> gherkin</pre></div></div>

<h3>Cucumber y Cucumber para Rails</h3>
<p>Como introducción a Cucumber, te recomiendo leer <a href="https://github.com/aslakhellesoy/cucumber/wiki/Cucumber-Backgrounder" rel="external">Cucumber Backgrounder</a>, donde <a href="http://twitter.com/aslak_hellesoy" rel="external">Aslak Hellesøy</a> explica cómo se puede integrar Cucumber en una aplicación Rails, y la sintaxis para definir <em>Features</em>, <em>Scenarios</em> y <em>Steps</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> cucumber-rails</pre></div></div>

<h3>Webrat</h3>
<p><a href="https://github.com/brynary/webrat/" rel="external">Webrat</a> permite escribir tests de aceptación que simulan el comportamiento de un navegador web y de los usuarios en definitiva. Permite simular cosas como: ve a la página principal, rellena el campo nombre de usuario con &#8220;Pablo&#8221;, rellena el campo contraseña con &#8220;Alonso&#8221;, pincha en el botón &#8220;Login&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> webrat</pre></div></div>

<h3>Database Cleaner</h3>
<p><a href="https://github.com/bmabey/database_cleaner" rel="external">Database Cleaner</a> define una serie de estrategias para limpiar una base de datos. Originalmente se pensó para garantizar un estado &#8220;limpio&#8221; entre la ejecución de los tests automáticos.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> database_cleaner</pre></div></div>

<h2>Aplicación de prueba</h2>
<h3>Creamos una aplicación Rails y la configuramos para que funcione con Cucumber</h3>
<p>Creamos la aplicación Rails:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rails cucumber_rails_test
$ <span style="color: #7a0874; font-weight: bold;">cd</span> cucumber_rails_test</pre></div></div>

<p>Generamos los ficheros necesarios para usar Cucumber con Webrat:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate cucumber <span style="color: #660033;">--webrat</span>
      create  config<span style="color: #000000; font-weight: bold;">/</span>cucumber.yml
      create  config<span style="color: #000000; font-weight: bold;">/</span>environments<span style="color: #000000; font-weight: bold;">/</span>cucumber.rb
      create  script<span style="color: #000000; font-weight: bold;">/</span>cucumber
      exists  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions
      create  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>web_steps.rb
      create  features<span style="color: #000000; font-weight: bold;">/</span>support
      create  features<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>paths.rb
      create  features<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>env.rb
      create  lib<span style="color: #000000; font-weight: bold;">/</span>tasks
      create  lib<span style="color: #000000; font-weight: bold;">/</span>tasks<span style="color: #000000; font-weight: bold;">/</span>cucumber.rake</pre></div></div>

<h3>Generamos una <em>Feature</em></h3>
<p>Generamos una <em>feature</em> con dos escenarios, uno para la creación y otro para el borrado de Posts:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate feature post title:string body:text published:boolean
      exists  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions
      create  features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature
      create  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>post_steps.rb</pre></div></div>

<p>Se deben haber creado automáticamente dos nuevos ficheros, un fichero con la definición de la funcionalidad de Gestión de posts (<strong>features/manage_posts.feature</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Feature: Manage posts
  <span style="color:#9966CC; font-weight:bold;">In</span> order to <span style="color:#006600; font-weight:bold;">&#91;</span>goal<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#006600; font-weight:bold;">&#91;</span>stakeholder<span style="color:#006600; font-weight:bold;">&#93;</span>
  wants <span style="color:#006600; font-weight:bold;">&#91;</span>behaviour<span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  Scenario: Register new post
    Given I am on the new post page
    <span style="color:#9966CC; font-weight:bold;">When</span> I fill <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">&quot;Title&quot;</span> with <span style="color:#996600;">&quot;title 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I fill <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">&quot;Body&quot;</span> with <span style="color:#996600;">&quot;body 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I uncheck <span style="color:#996600;">&quot;Published&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I press <span style="color:#996600;">&quot;Create&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should see <span style="color:#996600;">&quot;title 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should see <span style="color:#996600;">&quot;body 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should see <span style="color:#996600;">&quot;false&quot;</span>
&nbsp;
  Scenario: Delete post
    Given the following posts:
      <span style="color:#006600; font-weight:bold;">|</span>title<span style="color:#006600; font-weight:bold;">|</span>body<span style="color:#006600; font-weight:bold;">|</span>published<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I delete the 3rd post
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should see the following posts:
      <span style="color:#006600; font-weight:bold;">|</span>Title<span style="color:#006600; font-weight:bold;">|</span>Body<span style="color:#006600; font-weight:bold;">|</span>Published<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span></pre></div></div>

<p>, y otro fichero con la definición de los pasos (<strong>features/step_definitions/post_steps.rb</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^the following posts:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>posts<span style="color:#006600; font-weight:bold;">|</span>
  Post.<span style="color:#9900CC;">create</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>posts.<span style="color:#9900CC;">hashes</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I delete the <span style="color:#006600; font-weight:bold;">&#40;</span>\d<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span>?:st<span style="color:#006600; font-weight:bold;">|</span>nd<span style="color:#006600; font-weight:bold;">|</span>rd<span style="color:#006600; font-weight:bold;">|</span>th<span style="color:#006600; font-weight:bold;">&#41;</span> post$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>pos<span style="color:#006600; font-weight:bold;">|</span>
  visit posts_path
  within<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;table tr:nth-child(#{pos.to_i+1})&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    click_link <span style="color:#996600;">&quot;Destroy&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should see the following posts:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>expected_posts_table<span style="color:#006600; font-weight:bold;">|</span>
  expected_posts_table.<span style="color:#9900CC;">diff</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>tableish<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'table tr'</span>, <span style="color:#996600;">'td,th'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3>Ejecutamos los tests de aceptación</h3>
<p>Como todavía no está implementada la funcionalidad, la ejecución de los dos escenarios falla. No existe todavía el modelo <em>Post</em>, ni la ruta asociada a la creación de un nuevo Post:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rake cucumber
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paul<span style="color: #000000; font-weight: bold;">/</span>Proyectos<span style="color: #000000; font-weight: bold;">/</span>cucumber_rails_test<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">/</span>System<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>Ruby.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #660033;">-I</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/lib:lib&quot;</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/bin/cucumber&quot;</span>  <span style="color: #660033;">--profile</span> default
Using the default profile...
F-------F--
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span>::<span style="color: #7a0874; font-weight: bold;">&#41;</span> failed steps <span style="color: #7a0874; font-weight: bold;">&#40;</span>::<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
undefined <span style="color: #7a0874; font-weight: bold;">local</span> variable or method <span style="color: #000000; font-weight: bold;">`</span>new_post_path<span style="color: #ff0000;">' for #&lt;Cucumber::Rails::World:0x8194fd00&gt; (NameError)
./features/support/paths.rb:14:in `path_to'</span>
.<span style="color: #000000; font-weight: bold;">/</span>features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>web_steps.rb:<span style="color: #000000;">16</span>:<span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`/</span>^<span style="color: #7a0874; font-weight: bold;">&#40;</span>?:<span style="color: #000000; font-weight: bold;">|</span>I <span style="color: #7a0874; font-weight: bold;">&#41;</span>am on <span style="color: #7a0874; font-weight: bold;">&#40;</span>.+<span style="color: #7a0874; font-weight: bold;">&#41;</span>$<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">'
features/manage_posts.feature:7:in `Given I am on the new post page'</span>
&nbsp;
uninitialized constant Post <span style="color: #7a0874; font-weight: bold;">&#40;</span>NameError<span style="color: #7a0874; font-weight: bold;">&#41;</span>
.<span style="color: #000000; font-weight: bold;">/</span>features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>post_steps.rb:<span style="color: #000000;">2</span>:<span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`/</span>^the following posts:$<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">'
features/manage_posts.feature:17:in `Given the following posts:'</span>
&nbsp;
Failing Scenarios:
cucumber features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature:<span style="color: #000000;">6</span> <span style="color: #666666; font-style: italic;"># Scenario: Register new post</span>
cucumber features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature:<span style="color: #000000;">16</span> <span style="color: #666666; font-style: italic;"># Scenario: Delete post</span>
&nbsp;
<span style="color: #000000;">2</span> scenarios <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> failed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">11</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> failed, <span style="color: #000000;">9</span> skipped<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.124s
rake aborted<span style="color: #000000; font-weight: bold;">!</span></pre></div></div>

<h3>Generamos el <em>scaffold</em> del modelo Post y ejecutamos las migraciones pendientes</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold post title:string body:text published:boolean
$ rake db:migrate</pre></div></div>

<h3>Volvemos a lanzar las pruebas</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rake cucumber
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paul<span style="color: #000000; font-weight: bold;">/</span>Proyectos<span style="color: #000000; font-weight: bold;">/</span>cucumber_rails_test<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">/</span>System<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>Ruby.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #660033;">-I</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/lib:lib&quot;</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/bin/cucumber&quot;</span>  <span style="color: #660033;">--profile</span> default
Using the default profile...
...........
&nbsp;
<span style="color: #000000;">2</span> scenarios <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">11</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">11</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.261s</pre></div></div>

<p>Ahora sí que <strong>funcionan los tests y nuestra aplicación ya tiene una cobertura muy básica de tests de aceptación</strong> para la funcionalidad de gestión de posts, y los escenarios de creación y borrado. Ya tenemos listo nuestro <strong>entorno para empezar a desarrollar <a href="http://blog.dannorth.net/introducing-bdd/" rel="external">the-bdd-way</a></strong> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ¿A que no era tan difícil?</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retrospectiva de Agile Spain 2010, la primera conferencia sobre metodos ágiles en España</title>
		<link>http://alonsogarciapablo.com/blog/retrospectiva-de-agile-spain-2010-la-primera-conferencia-sobre-metodos-agiles-en-espana/</link>
		<comments>http://alonsogarciapablo.com/blog/retrospectiva-de-agile-spain-2010-la-primera-conferencia-sobre-metodos-agiles-en-espana/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 22:29:36 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=182</guid>
		<description><![CDATA[Estas son mis notas y retrospectiva acerca de la Conferencia Agile Spain 2010, la primera conferencia de metodologias ágiles en España celebra en Madrid durante los días 10 y 11 de Junio. Jueves 10 de Junio Llegué bastante pronto en el cercanías a Vallecas. Pensé que sería de los primeros. En el camino, coincido con algunos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-191" title="workshop-evaluation" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/06/workshop-evaluation.jpg" alt="Erling Workshop Evaluation" /></p>
<p>Estas son mis notas y retrospectiva acerca de la <a href="http://alonsogarciapablo.com/blog/mi-paso-por-la-conferencia-agile-spain-2010/">Conferencia Agile Spain 2010</a>, la primera conferencia de metodologias ágiles en España celebra en Madrid durante los días 10 y 11 de Junio.<br />
<span id="more-182"></span></p>
<h2>Jueves 10 de Junio</h2>
<p>Llegué bastante pronto en el cercanías a Vallecas. Pensé que sería de los primeros. En el camino, coincido con algunos de los chicos de <a href="http://mobivery.com/">Mobivery</a> y me uno a ellos en la &#8220;ginkana&#8221; que nos llevaría hasta la zona de recogida de acreditaciones. Una vez allí, mucha gente ya esperando, algunos con camisetas amarillas moviéndose de un lado a otro a un ritmo frenético, ultimando los detalles.</p>
<p>Tras unos minutos deambulando por la sala y reconociendo el terreno en busca de alguna cara conocida me doy cuenta de que no conozco a nadie&#8230; ¿Cómo puede ser que ningún compañero de facultad esté por aquí? O ¿algún antiguo compañero de trabajo? Me doy cuenta de que he de ser ágil si quiero integrarme un poco.</p>
<p>Se abre la recogida de acreditaciones. En la fila oigo voces de latinoamericanos detrás mío. &#8220;Estos no son de Vallecas&#8221;, pienso&#8230; Nos presentamos. Se trata de Facundo, Fernando y Francisco, socios de la empresa <a href="http://soluciones3f.com.ar/">3F Soluciones Informáticas</a> y recién llegados de Argentina. Desayunamos juntos y empiezo a conocer a algunos twitteros como <a href="http://twitter.com/jorgeuriarte">Jorge Uriarte</a> y <a href="http://twitter.com/cvidal">Carmen Vidal</a>.</p>
<p>Tras la presentación del evento por el parte del equipo organizador (<a href="http://es.linkedin.com/pub/agustin-yague/11/308/2">Agustín Yagüe</a>, <a href="http://www.linkedin.com/in/xavieralbaladejo">Xavi Albadalejo</a>, <a href="https://syst.eui.upm.es/jgarbajosa">Juan Garbajosa</a>), comienza la Keynote de <a href="http://www.crisp.se/henrik.kniberg">Henrik Kniberg</a>, titulada <a href="http://blog.crisp.se/henrikkniberg/2010/06/10/1276196340000.html">&#8220;The essence of Agile&#8221;</a>. Henrik disfruta explicando e introduciendo todos esos términos que posteriormente se desarrollarían en sesiones y talleres (SCRUM, XP, Pair Programming, etc.)</p>
<p>Comienzan las sesiones y la gente comienza a desperdigarse&#8230;</p>
<h3>Behavior Driven Development aplicado en Acceptance Test Automation  (Christian Ramírez)</h3>
<p>Llego a la sala y está repleta de gente. Mucha gente de pié y algunos en la puerta. Entro y decido sentarme en el suelo, practicando la postura del sastre con el portátil en las piernas.</p>
<p>Christian nos explicó el <a href="http://blog.dannorth.net/introducing-bdd/">lenguaje que se utiliza a la hora de definir los tests de aceptación automáticos</a> y que permite centrarse en el negocio. Se habla de las <a href="http://www.mountaingoatsoftware.com/articles/27-advantages-of-user-stories-for-requirements">historias de usuario como herramienta para capturar los requisitos</a> de un proyecto y describir las unidades mínimas de funcionalidad a implementar.</p>
<p>En la segunda parte, Christian nos explica dos herramientas concretas:</p>
<ul>
<li><a href="http://cukes.info/">Cucumber</a>, que soporta más de 30 idiomas y está basado en el lenguaje <a href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin">Gherkin</a>. Funciona con Ruby, Java, .NET, Python y otros.</li>
<li><a href="http://www.thoughtworks-studios.com/agile-test-automation">Twist</a>. Herramienta de <a href="http://www.thoughtworks.com/">ThoughtWorks</a> con un IDE propio.</li>
</ul>
<p>Por último vimos un ejemplo de código de un proyecto real. Por problemas de la conexión con la wi-fi, Christian no pudo ejecutar la demo que traía preparada <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> .</p>
<h3>Enterprise Scrum – Scrum en la empresa (Xavier Quesada)</h3>
<p>Salgo rápidamente a la siguiente sala. Resuelvo de nuevo la &#8220;ginkana&#8221; y llego a tiempo. Aula más grande y muchos sitios libres. <a href="http://www.xqa.com.ar/">Xavier</a> comienza la charla de fórma ágil con un experimento. Nunca había asistido a algo así. Los asistentes propusimos y priorizamos los temas a tratar.</p>
<p><img class="aligncenter size-full wp-image-186" title="xavier-quesada-enterprise-scrum" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/06/xavier-quesada-enterprise-scrum.jpg" alt="Xavier Quesada en la sesión Enterprise Scrum de Agile Spain 2010" /></p>
<p>Empezamos hablando sobre las distintas condiciones que podían darse en una empresa referidas a la implantación de metodologías ágiles (apoyo de la gerencia o no, existencia de algún proyecto piloto,experiencia previa, etc). Me gustó el concepto de <em>&#8220;Scrum de Guerrilla&#8221;</em>, es decir, utilizar métodos ágiles sin que nadie lo sepa, ya sea a nivel individual (con prácticas como TDD) o a nivel de equipo. Si en tu empresa no te permiten hacer Pair Programming, tendrás que <em>&#8220;Pair under the radar&#8221; </em> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Xavi recomienda contratar a un ScrumMaster al principio para guiar al equipo en algún proyecto piloto de pequeña envergadura y nos relata de forma muy amena algunas de sus experiencias pasadas y actuales en Bélgica.</p>
<p>Pasamos a hablar de Prácticas Técnicas que todo equipo ágil debe utilizar: <a href="http://en.wikipedia.org/wiki/Revision_control">Control de versiones</a> (parece mentira pero hay gente que no lo usa), <a href="http://martinfowler.com/articles/continuousIntegration.html">Integración Contínua</a> que permita hacer despliegues automáticos y que incluya un ambiente de prubas, una cobertura mínima de Tests funcionales automatizados (por ejemplo con <a href="http://seleniumhq.org/">Selenium</a>) y <a href="http://www.extremeprogramming.org/rules/unittests.html">Tests de unidad</a>.</p>
<p>El tiempo pasó rápido y hubo muchas preguntas en la sala, dando lugar a un interesante debate.</p>
<h3>Comida</h3>
<p>Quite hungry, I head towards the restaurant. I&#8217;m alone again. I don&#8217;t find any familiar face around. Fortunately, I realise that <a href="http://erlingwl.wordpress.com/">Erling Wegger Linde</a> is the person behind me in the queue. I don&#8217;t have the oportunity to speak to a <a href="http://martinfowler.com/">Thoughtworks</a>&#8216;s employee everyday, so I don&#8217;t doubt it and start talking to him. We ended up having lunch together and I had the oportunity to ask him about his company, about life in London and Norway, and about the industry of software development. I had a very good time. Thanks dude!</p>
<h3>Pair Programming Strategies (Erling Wegger Linde)</h3>
<p>Earling me abandona para terminar su presentación, y yo busco a los chicos de 3Fs para &#8220;platicar&#8221; un rato con ellos. Conozco a Joseba y a otro chico más de Bilbao y hablamos hasta que Jorge Uriarte nos avisa de que ya es la hora.</p>
<p>Me dirigo al taller de Pair Programming and when I arrive, the classroom it&#8217;s full again. I manage to find a chair and I sit at the back of the classroom. Beside me, <a href="http://skillsmatter.com/expert-profile/agile-testing/mike-scott">Mike Scott</a> sitting on the floor.</p>
<p><img class="aligncenter size-full wp-image-189" title="pair-programming-workshop-erling-wegger-linde" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/06/pair-programming-workshop-erling-wegger-linde.jpg" alt="Pair programming workshop with Erling Wegger Linde in Agile Spain 2010" /></p>
<p>It was my first time to take part in an <a href="http://www.agile-spain.com/que-es-como-hacer-open-space">Open Space Session</a>. After a short introduction by Erling, we proposed tracks to talk about, prioritize them and choose three of them. I participated in the &#8220;<em>How to get started with Pair Programming&#8221;</em> one, mostly because I have never practiced Pair Programming inside a company, and also because <a href="http://www.crisp.se/henrik.kniberg">Henrik Kniberg</a> was there and I felt like speaking in english. Henrik talked us about <em>&#8220;Ping pong pair programming&#8221;</em> which consists in one person writting a test and switching the keyboard to the other person so that he/she has to write the code to make the test pass. He proposed  that the driver should program for 3 minutes and &#8220;slide&#8221; the keyboard to his partner. We also talked about things like visualizing the current story the programmers are working on, the needs of a special <a href="http://www.martinfowler.com/bliki/TeamRoom.html">physical space to pair program</a>, the pressure and necessary resting periods, etc.</p>
<p>Among my group, there were some members of <a href="http://mobivery.com/">Mobivery</a>, a programmer from <a href="http://www.electronicarts.es/">EA</a>, <a href="http://skillsmatter.com/expert-profile/agile-testing/mike-scott">Mike Scott</a>, and more.</p>
<p>The rest of the groups talked about &#8220;Distributted Pair Programming&#8221; and another topic I don&#8217;t get to remember <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> .</p>
<p>After a short presentation of each group&#8217;s results, Erling asked us to evaluate his session with some Post-its on the door (see the picture on top of this post).</p>
<p>I ended up with the convinction that Pair Programming can be really useful and its regular practice can reduce the number of bugs in the code. I&#8217;ll have to practice it from now on <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . <a href="http://erlingwl.wordpress.com/2010/06/14/pair-programming-workshop-at-agile-spain-2010/">Erling posted a summary of the discussions in his blog</a>.</p>
<h3>Integración Continua punta a punta (Xavier Quesada)</h3>
<p>Continúo de nuevo in Spanish. Me quedo sin bajar al café para asegurarme un sitio en la siguiente charla. Volvemos con Xavier Quesada. La sala 4 abarrotada. Las personas que están fuera fuera del aula se quejan (con razón) y los organizadores deciden cambiarnos de sala. Nada grave, los agilistas recibimos con gusto los nuevos requisitos <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p><img class="aligncenter size-full wp-image-194" title="xavier-quesada-integracion-continua" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/06/xavier-quesada-integracion-continua.jpg" alt="Taller de integración continua con Xavier Quesada en Agile Spain 2010" /></p>
<p>Xavi retoma la charla a toda pastilla y comenta las claves de la integración contínua:</p>
<ul>
<li>Usar un sistema de control de versiones (<a href="http://git-scm.com/">Git</a> está de moda, pero <a href="http://subversion.tigris.org/">SVN</a> también vale lógicamente)</li>
<li>Hacer varios <em>commits</em> al día.</li>
<li>Llevar a cabo la integración contínua cada vez que se hace un commit. Remarca que este proceso no debería tardar más de 10 minutos.</li>
</ul>
<p>Después comienza a dibujar en la pizarra su entorno de integración ideal, que incluye:</p>
<ul>
<li>Los desarrolladores con su PC y BD propia,</li>
<li>Un ambiente de testing con una BD predecible, donde se ejecutan los tests de regresión y con posibilidad de refrescar los datos de prueba,</li>
<li>Un ambiente <em>demo</em> donde se ejecutan los <em><a href="http://en.wikipedia.org/wiki/Acceptance_testing">User Acceptance Tests</a><span style="font-style: normal;"> y que, dada la fiabilidad del deploy en este punto, puede atacar a los datos de producción para ejecutar estos tests.</span></em></li>
<li>Ambiente de producción.</li>
</ul>
<p>Reconozco que me suena todo un poco a ciencia ficción y que nunca he trabajado en un entorno tan complejo (aunque me encantaría verlo funcionando). Ante la pregunta de &#8220;¿De donde sacamos tantos ordenadores en la empresa para montar esto?&#8221;, Xavi responde muy expontáneamente &#8220;¡Los robais!&#8221;. Risas mil en el público.</p>
<h3>Prácticas de programación para hacer realidad la agilidad: Refactorización, IC y TDD (Alberto Pérez y Carmen Vidal)</h3>
<p>La última charla del día, cortesía de Carmen Vidal y Alberto Pérez, de <a href="http://www.paradigmatecnologico.com/">Paradigma Tecnológico</a>(patrocinador de la conferencia). Carmen comienza nombrado los nombres de algunos twitteros como <a href="http://twitter.com/ialcazar">Israel Alcázar</a>, <a href="http://twitter.com/ialcazar">Joaquín (A.K.A. Kinisoftware)</a>, y el <a href="http://twitter.com/_pablo_alonso">mío propio</a>, por sendos posts en los que publicamos que asistiríamos a su charla. Gracias a estos comentarios tuve la oportunidad de desvirtualizar a Israel y Joaquín <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>La afluencia es masiva aunque se ven ya caras de cansancio (incluída la mía). Carmen y Alberto dieron un muy buen repaso a muchas de las técnicas propias del desarrollo ágil: <em>testing</em>, <em>refactoring</em>, propiedad colectiva del código, etc. La charla fue muy completa, aunque varias cosas ya habían sido explicadas (al menos en mi itinerario) en sesión anteriores. Me sirvió para descubrir una empresa en la que seguramente no me importaría trabajar <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>Termina el Jueves y vuelvo a coincidir con Erling, con quien comparto el viaje de vuelta en metro. Seguimos charlando sobre las diferencias entre las ciudades europeas y llegamos a la conclusión que son todas bastante parecidas en general.</p>
<h2>Viernes 11 de Junio</h2>
<p>Llego bastante justito de tiempo al Panel. Interesante discusión con varias figuras claves en esto del agilismo. Preguntas y respuestas fluyen por el auditorio. Pregunto por twitter por qué no se está enseñando esto ya en la universidad. Alguien por detrás grita: &#8220;¡La universidad es Waterfall!&#8221;. Muchas risas. Juan Garbajosa contesta que lógicamente no es muy sencillo modificar un plan de estudios. Me quedo tranquilo al saber que gente como él y Agustín Yagüe están metidos en el equipo docente de la <a href="http://www.upm.es/">UPM</a>.</p>
<p>Actualmente trabajo en la <a href="http://www.uniovi.es/inicio/">Universidad de Oviedo</a> y estoy en un punto en que debo decidir si continuar mi carrera profesional por la rama de la Investigación. Me interesaba mucho la sesión de contribuciones para ver sobre qué se está investigando en estos temas pero&#8230; no podía irme de Agile Spain 2010 sin ver una sesión de <a href="http://www.presionblogosferica.com/">Ángel Medinilla</a>. Cambié ágilmente mis planes y decidí ir a ver la primera sesión de Ángel y la segunda parte de la sesión de Contribuciones&#8230;</p>
<h3>Gestión Ágil de equipos (Ángel Medinilla)</h3>
<p>Cómo Ángel ha colgado su presentación, la incrusto aquí porque creo que merece la pena verla. Ángel es un auténtico <em>&#8220;showman&#8221;</em> y consigue ganarse al público con sus experiencias y analogías. Habló de liderazgo, de motivación a los equipos de desarrollo, anti-patrones en la gestión de equipos, etc. En definitiva nos dió las claves para un correcta gestión de un equipo, sin estructuras verticales, eliminando la cultura del miedo, etc. He aquí su presentación:</p>
<div id="__ss_4480850" style="width: 425px; margin: 0 auto;"><object id="__sse4480850" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=100601gestionagilequipos-email-100612023605-phpapp01&amp;stripped_title=100612cas2010-gestion-agil-equipos" /><param name="name" value="__sse4480850" /><param name="allowfullscreen" value="true" /><embed id="__sse4480850" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=100601gestionagilequipos-email-100612023605-phpapp01&amp;stripped_title=100612cas2010-gestion-agil-equipos" name="__sse4480850" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>Me gustó mucho el &#8220;Piensa en el peor jefe que hayas tenido y nunca hagas lo que te hizo a tus empleados. Piensa en el mejor jefe que hayas tenido y sé como él cada día con tus empleados&#8221;.</p>
<h3>Contribuciones (2ª parte)</h3>
<p>Me incorporo a la 2ª parte de la sesión de contribuciones. Muchos comentarios en twitter apuntaban a que estaba siendo un éxito. Se presentan algunos <em>papers</em> muy interesantes. Me gustaron especialmente <a href="http://portal.acm.org/citation.cfm?id=1632290">KOWLAN: A Multi Agent System for Bayesian Diagnosis in Telecommunication Networks</a> por mostrar un caso real de implantación de Scrum en una empresa de gran tamaño como <a href="http://tid.es">Telefónica I+D</a> (donde por cierto inicié mi carrera profesional) y <a href="https://syst.eui.upm.es/node/192">Spanish vs European Agile Methods Adoption: Results of an Empirical Study</a>, que compara la implantación de metologías ágiles en España y Europa.</p>
<p>En definitiva una fuente de inspiración para posibles artículos de investigación en estos temas. Al final de la sesión tuve la oportunidad de hacerme con un ejemplar de las <em>&#8220;Actas de 1ª conferencia de Agile-Spain CAS 2010&#8243;</em> donde se incluyen todos los papers. Thanks!</p>
<p>Se nos echó el tiempo encima y salí a comer rápidamente junto con Facundo, Fernando y Jorge Uriarte.</p>
<h3>Gestión ágil de requisitos – Construyendo nuestro backlog (Jose Luis Soria)</h3>
<p>Pasamos a una de las charlas que más ganas tenía de ver para intentar solucionar muchas de mis dudas sobre las historias de usuario y el <em><a href="http://www.mountaingoatsoftware.com/scrum/product-backlog">Product Backlock</a></em>.</p>
<p>En esta charla, Jose Luis nos contó el formato de las historias de usuario y tests de aceptación. Una de mis dudas era cuando y en qué medida hay que detallar las historias de usuario. Según Jose Luis se debe:</p>
<ul>
<li>Detallar lo suficiente para poder empezar a trabajar.</li>
<li>Detallar más las historias más importantes (que saldrán antes del Backlog).</li>
<li>Esperar a que los detalles más concretos surjan y aborden durante el desarrollo.</li>
</ul>
<p>Se habló de las características que debe cumplir una buena historia de usuario: <a href="http://xp123.com/xplor/xp0308/">INVEST</a>.</p>
<p>Algunos consejos referentes a las historias de usuario:</p>
<ul>
<li>Dividir las historias hasta que proporcionen funcionalidad demostrable.</li>
<li>Las historias deben estar basadas en objetivos del usuario.</li>
<li>El aumento de detalles debe ser progresivo.</li>
<li>No detallar demasiado las interfaces de usuario.</li>
<li>Hay cosas que no son historias ()</li>
<li>Especificar bien los roles de los usuarios.</li>
<li>Tratar los requisitos no funcionales como restricciones de cada historia, en la parte de los tests de aceptación.</li>
</ul>
<p>Posteriormente, Jose Luis habló un poco sobre las distintas formas de realizar las estimaciones, ya sea en forma de medidas absolutas (días, horas, etc) o de medidas relativas (tallas de camiseta, puntos de historia). Se discutieron las ventajas de cada sistema y tengo la sensación de que la gente se decantaba más por el sistema absoluto por ser más objetivo, robusto y coherente en el tiempo.</p>
<p>Por último Jose Luis nos introdujo algunos <em>&#8220;bad smells&#8221;</em> en proyectos ágiles:</p>
<ul>
<li>Historias de usuario demasiado pequeñas.</li>
<li>Historias de usuario dependientes entre sí.</li>
<li>Requisitos inventados por los usuarios.</li>
<li>Historias de usuario con demasiados detalles.</li>
<li>Historias dificilmente priorizables.</li>
<li>Clientes que no se involucran en el proyecto.</li>
</ul>
<p>Charla muy productiva para mí. Muchas dudas resueltas, aunque supongo que en la práctica no será todo tan bonito como aquí se pintó <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<h3>Integrando prácticas ágiles y de experiencia de usuario en Telefónica I+D (Mónica Izquierdo y Ana Mª de Alarcón)</h3>
<p>La charla sobre la experiencia de <a href="http://tid.es">Telefónica I+D</a> me interesaba porque, como comenté anteriormente trabajé allí durante 6 meses durante mi último curso de carrera&#8230; y no recuerdo que la cosa fuese muy ágil por aquellos entonces <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Me senté en una de los laterales de la sala para enchufar el portátil y poder seguir tomando notas.</p>
<p>Las ponentes comenzaron introduciendo la iniciativa <em>&#8220;Agile Telefónica I+D&#8221;</em> explicando como un grupo de personas tomaron la iniciativa y empezaron a investigar y evangelizar a los compañeros en temas de metodologías ágiles. Actualmente forman parte de un grupo dentro de TID destinado a asesorar en temas de métodos ágiles a sus propios compañeros.</p>
<p>Mónica y Ana explicaron 8 puntos clave para la implantación de metodologías ágiles:</p>
<ul>
<li>Equipo de UX, diseñadores y desarrolladores forman un único equipo.</li>
<li>Un representante de UX forma parte del <em>Product Owner Team.</em></li>
<li>Realizan <em>user insights</em> para generar ideas o productos.</li>
<li>Utilizan <em><a href="http://www.jnd.org/dn.mss/personas_empath.html">Personas</a></em> como método guía para identificar las historias de usuario.</li>
<li>Realizan un trabajo de conceptualización y diseño previo.</li>
<li>Utilizan la técnica de <em><a href="http://dpwhelan.com/blog/agile/parallel-tracks-for-agile-and-user-experience/">Parallel Tracks</a><span style="font-style: normal;"> para abordar el problema del diseño de interfaces:</span></em> La historia de usuario se diseña en un sprint y se codifica en el siguiente.</li>
<li>Prueban continuamente los incrementos con usuarios finales, y disponen de un entorno ficticio donde realizar estas pruebas.</li>
<li>Realizan documentación de lo imprescindible, dando prioridad a la comunicación cara a cara.</li>
</ul>
<p>Me gustó especialmente porque se hizo mucho hincapié en el tema de la Experiencia de Usuario, algo que yo considero sumamente importante para el éxito de un proyecto. Sin duda, se enfrentan un gran reto y un trabajo apasionante al mismo tiempo.</p>
<h3 id="testing-de-aceptacion-con-luismi-y-sergio">Testing de aceptación con Ruby (Luismi Cavallé y Sergio Gil)</h3>
<p>La última sesión fue bastante intensa. <a href="http://twitter.com/cavalle">Luismi Cavallé</a> y <a href="http://twitter.com/porras">Sergio Gil</a> nos sorprendieron con una presentación muy bien preparada y algunos ejemplos en video. En la sala, algunos cracks como <a href="http://twitter.com/calavera">David Calavera</a> y <a href="http://twitter.com/fguillen">Fernando Guillén</a>, a quienes me había presentado en un descanso.</p>
<p>Volvimos a repasar el formato de los tests de aceptación y escenarios en las historias de usuarios y Luismi nos mostró cómo estos pueden ser generados a partir de una descripción textual con <a href="http://cukes.info/">Cucumber</a>. Tendremos que probarlo.</p>
<p>Sergio nos explicó <a href="http://github.com/jnicklas/capybara">Capybara</a>, un DSL que permite simular el comportamiento de un navegador en un lenguaje cercano a los usuarios. Entre otras acciones, es posible: visitar una página, pinchar enlaces, rellenar campos de texto, marcar <em>checkboxes</em>, comprobar que una página ha renderizado determinados elementos, etc. También explicó las características de algunos de los <em>drivers:</em></p>
<ul>
<li><a href="http://github.com/brynary/rack-test">Rack Test</a> (Viene por defecto)</li>
<li><a href="http://seleniumhq.org/">Selenium</a> (De facto, depende de Java, el único que usa realmente el navegador)</li>
<li><a href="http://celerity.rubyforge.org/">Celerity</a>/<a href="http://github.com/langalex/culerity">Culerity</a> (depende de Java)</li>
<li><a href="http://www.envjs.com/">Envjs</a> (Basado en SpiderMonkey)</li>
</ul>
<p>Sergio presentó finalmente la herramienta que ellos utilizan, y que ha sido creada por el propio Luismi: <a href="http://github.com/cavalle/steak">steak</a>, otro DSL para describir tests de aceptación en Ruby.</p>
<p>Por si no fuera poco, hicieron un repaso de más herramientas y técnicas: <em>fixture replacement </em>(en Ruby puro o con <a href="http://github.com/thoughtbot/factory_girl">Factory Girl</a> y similares), <a href="http://github.com/bebanjo/delorean">delorean</a> (volver al pasado), <a href="http://github.com/bmabey/database_cleaner">database cleaner</a>, <a href="http://github.com/bmabey/email-spec">email spec</a>, <a href="http://github.com/bblimke/webmock">webmock</a> (simulación de peticiones http), y <a href="http://github.com/nando/mundo-pepino">MundoPepino</a> (Colección de pasos muy genéricos).</p>
<p>He de decir que al final quedé un poco abrumado con tantos &#8220;productos&#8221; diferentes y no sé si algún día tendré tiempo de probarlos todos, pero la sesión mereció la pena.</p>
<h2>Conclusiones</h2>
<p>Terminaron las sesiones y participé en la última parte de la <a href="http://groups.google.es/group/agile-spain/web/agilespain2010-retrospectiva">Retrospectiva</a>. En general casi no hubo comentarios negativos, sí algunos puntos en los que se podría mejorar.</p>
<p>Personalmente quedé muy satisfecho con el encuentro. Salvo las mínimas molestias ocasionadas en la sala 4, que quedó un poco pequeña en algunos casos, me pareció un precio muy razonable y 2 días me parece una duración adecuada (más tiempo habría sido mucho para participantes y organizadores). Aprendí mucho, aunque finalmente me quedé con ganas de apuntarme a algún taller para practicar un poco.</p>
<p>Lo más importante para mí, sin duda alguna, fue comprobar que cosas sobre las que llevo leyendo algunos meses son ya una realidad en España, y que hay una <a href="http://www.agile-spain.com/">auténtica comunidad de personas muy motivadas que utilizan y promueven las metologías ágiles en España</a>. Poder compartir un tiempo con ellos, es algo que no tiene precio <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>Aprovecho para felicitar a la organización. ¡Nos vemos en la próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/retrospectiva-de-agile-spain-2010-la-primera-conferencia-sobre-metodos-agiles-en-espana/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mi paso por la conferencia Agile Spain 2010</title>
		<link>http://alonsogarciapablo.com/blog/mi-paso-por-la-conferencia-agile-spain-2010/</link>
		<comments>http://alonsogarciapablo.com/blog/mi-paso-por-la-conferencia-agile-spain-2010/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 16:13:32 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=141</guid>
		<description><![CDATA[Esta semana asistiré a la conferencia Agile Spain 2010. Muchas sesiones y talleres interesantes, tantas que ha sido difícil elegir a cuales asistir y renunciar a los talleres. Intentaré ir resumiendo en este blog cada una de las charlas a las que asista: Jueves Behavior Driven Development aplicado en Acceptance Test Automation (Christian Ramírez) Enterprise Scrum [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/06/agile.v.230.largo_.png" alt="" title="Conferencia Agile Spain 2010 - Haciendo realidad la agilidad" class="size-full wp-image-233" /></p>
<p>Esta semana asistiré a la <a href="http://conferencia2010.agile-spain.com/">conferencia Agile Spain 2010</a>. Muchas <a href="http://conferencia2010.agile-spain.com/?page_id=395">sesiones y talleres interesantes</a>, tantas que ha sido difícil elegir a cuales asistir y renunciar a los talleres. Intentaré ir resumiendo en este blog cada una de las charlas a las que asista:</p>
<h2>Jueves</h2>
<ul>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#bdd">Behavior Driven Development aplicado en Acceptance Test Automation</a> (Christian Ramírez)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#enterprise_scrum">Enterprise Scrum &#8211; Scrum en la empresa</a> (Xavier Quesada)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#pair_programming_strategies">Pair Programming Strategies</a> (Erling Wegger Linde)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#integracion_continua_punta_a_punta">Integración Continua punta a punta</a> (Xavier Quesada)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#practicas_de_programacion">Prácticas de programación para hacer realidad la agilidad: Refactorización, IC y TDD</a> (Alberto Pérez y Carmen Vidal)</li>
</ul>
<h2>Viernes</h2>
<ul>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#ser_agil_en_espana">Ser ágil en España, un caso real con equipos de trabajo en remoto</a> (Enrique J. Amodeo y Antonio David Fernández)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#one_year_of_software_developments">One year of software developments to win a world racing championship</a> (Luca Minudel)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#gestion_agil_de_requisitos">Gestión ágil de requisitos &#8211; Construyendo nuestro backlog</a> (Jose Luis Soria)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#integrando_practicas_agiles">Integrando prácticas ágiles y de experiencia de usuario en Telefónica I+D</a> (Mónica Izquierdo y Ana Mª de Alarcón)</li>
<li><a href="http://conferencia2010.agile-spain.com/?page_id=347#testing_de_aceptacion_con_ruby">Testing de aceptación con Ruby</a> (Luismi Cavallé y Sergio Gil)</li>
</ul>
<p>Además el sábado asistiré al <a href="http://jruby-training.stagehq.com/events/294">workshop gratuito de JRuby</a> impartido por <a href="http://twitter.com/calavera">David Calavera</a>.</p>
<p>¡Nos vemos en Agile Spain 2010!</p>
<p>PD: Otros itinerarios de asistentes: <a href="http://kinisoftware.lacoctelera.net/post/2010/06/07/conferencia-agile-spain-2010-mi-itinerario">Itinerario de kinisoftware</a>, <a href="http://farmerdev.com/wp/?p=27">itinerario de Israel Alcázar</a>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/mi-paso-por-la-conferencia-agile-spain-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Scrum, by Ken Schwaber</title>
		<link>http://alonsogarciapablo.com/blog/scrum-by-ken-schwaber/</link>
		<comments>http://alonsogarciapablo.com/blog/scrum-by-ken-schwaber/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:52:43 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[Ken Schwaber]]></category>
		<category><![CDATA[metodologías ágiles]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/?p=90</guid>
		<description><![CDATA[En este vídeo, Ken Schwaber nos presenta Scrum, la metodología de desarrollo ágil de aplicaciones:]]></description>
			<content:encoded><![CDATA[<p>En este vídeo, <a href="http://en.wikipedia.org/wiki/Ken_Schwaber" class="externo">Ken Schwaber</a> nos presenta Scrum, la metodología de desarrollo ágil de aplicaciones:</p>
<p><embed id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=-7230144396191025011&#038;hl=es&#038;fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/scrum-by-ken-schwaber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Driven Development</title>
		<link>http://alonsogarciapablo.com/blog/test-driven-development/</link>
		<comments>http://alonsogarciapablo.com/blog/test-driven-development/#comments</comments>
		<pubDate>Tue, 20 May 2008 14:20:56 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Metodologías ágiles]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/?p=65</guid>
		<description><![CDATA[Test-Driven Development (TDD) is a software development technique consisting of short iterations where new test cases covering the desired improvement or new functionality are written first, then the production code necessary to pass the tests is implemented, and finally the software is refactored to accommodate changes. The availability of tests before actual development ensures rapid [...]]]></description>
			<content:encoded><![CDATA[<blockquote cite="http://en.wikipedia.org/wiki/Test-driven_development"><p>Test-Driven Development (TDD) is a software development technique consisting of short iterations where new test cases covering the desired improvement or new functionality are written first, then the production code necessary to pass the tests is implemented, and finally the software is refactored to accommodate changes. The availability of tests before actual development ensures rapid feedback after any change. Practitioners emphasize that test-driven development is a method of designing software, not merely a method of testing.</p></blockquote>
<p><cite><a href="http://en.wikipedia.org/wiki/Test-driven_development">Wikipedia</a></cite></p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/test-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

