<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1048881-6";
urchinTracker();
</script><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">]>
<rss version="2.0" xml:base="http://www.agile-spain.com/agilev2">
<channel>
 <title>agile-spain.com - Experiencias e informes</title>
 <link>http://www.agile-spain.com/agilev2/taxonomy/term/33/all</link>
 <description></description>
 <language>es</language>
<item>
 <title>ErroresDeConceptoDeLaProgramaciónPorParejas</title>
 <link>http://www.agile-spain.com/agilev2/erroresdeconceptodelaprogramacionporparejas</link>
 <description>&lt;p&gt;&lt;cite&gt;Escrito por Martin Fowler&lt;/cite&gt;&lt;br /&gt;
&lt;cite&gt;Traducido por Carmen Vidal ( Paradigma Tecnológico) &lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;Se tiene que programar por parejas si se sigue un proceso ágil.&lt;br /&gt;
Esto es completamente falso. &#039;Ágil&#039; es un término muy amplio definido sólo en términos de valores y principios, el más notablemente en &lt;a href=&quot;http://www.agile-spain.com/agilev2/manifiesto_agil&quot;&gt; el Manifiesto para el Desarrollo de Software Ágil.&lt;/a&gt; El manifiesto no menciona el programar por parejas y la mayoría de los métodos ágiles no lo incluyen en su aproximación.&lt;br /&gt;
Ya que programar por parejas es una práctica de XP, ha tenido mucha influencia en la comunidad ágil. Por consiguiente a menudo es mencionado como una práctica ágil – tomando como práctica algo que es comúnmente usado por la gente en proyectos ágiles. Pero esto es una observación, no una prescripción..&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <category domain="http://www.agile-spain.com/agilev2/tema/personajes">Personajes</category>
 <pubDate>Tue, 24 Jul 2007 13:19:14 +0000</pubDate>
</item>
<item>
 <title>HerenciaDiseñada</title>
 <link>http://www.agile-spain.com/agilev2/herenciadisenada</link>
 <description>&lt;p&gt;&lt;cite&gt;Escrito por Martin Fowler&lt;/cite&gt;&lt;br /&gt;
&lt;cite&gt;Traducido por Rafael Vacas&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;Uno de los más largos debates en los círculos orientados a objetos es el debate entre &lt;a href=&quot; http://www.martinfowler.com/bliki/OpenInheritance.html&quot;&gt;HerenciaAbierta&lt;/a&gt; y HerenciaDiseñada. &lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0201310058&quot;&gt;Josh Block&lt;/a&gt; ha sido probablemente quien mejor ha resumido el principio de la herencia diseñada: “Diseña y documenta para herencia o si no prohíbela”. Con este planteamiento te preocupas de decidir qué métodos pueden ser heredados y &lt;a href=&quot;http://www.martinfowler.com/bliki/Seal.html&quot;&gt;proteges&lt;/a&gt; los otros para evitar que sean sobrescritos.&lt;/p&gt;
&lt;p&gt;El argumento más común para la herencia diseñada es que dado que la herencia supone una relación muy estrecha (y rompe la encapsulación) es fácil que las subclases efectivamente rompan las superclases por ejemplo, omitiendo comportamientos necesarios cuando sus métodos son invocados.&lt;/p&gt;
&lt;p&gt;Muchos programadores, particularmente aquellos con una &lt;a href=&quot;http://www.martinfowler.com/bliki/EnablingAttitude.html&quot;&gt;ActitudPermisiva&lt;/a&gt;, no están muy convencidos por este estilo de argumento. Otro argumento que encuentro más apetecible es el de Elliote Rusty Harold al discutir los &lt;a href=&quot;http://www.cafeconleche.org/XOM/designprinciples.xhtml&quot;&gt;principios de diseño de XOM&lt;/a&gt;. La cuestión aquí es que “las API son escritas por expertos para no expertos”. El creador de librerías debería estar debidamente versado en la tecnología con la que trabaja la librería. Deberían trabajar para simplificar esta tecnología a los usuarios de la librería. La encapsulación consiste en esconder secretos, por tanto una buena librería debería esconder toda clase de complicaciones y puntos peligrosos a los usuarios de la librería, ya usen la librería mediante invocaciones o herencia. Por tanto, con XOM puedo sobrescribir de forma segura las clases de la librería para hacer lo que quiera ya que la librería garantiza que aún así producirá XML bien formado, sin que tenga que preocupar a mi fea cabecita con todas las cosas que de otra forma podrían ir mal.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <category domain="http://www.agile-spain.com/agilev2/tema/personajes">Personajes</category>
 <pubDate>Mon, 23 Jul 2007 08:07:10 +0000</pubDate>
</item>
<item>
 <title>Diseño planificado y Evolutivo</title>
 <link>http://www.agile-spain.com/agilev2/diseno_planificado_y_evolutivo</link>
 <description>&lt;p&gt;&lt;cite&gt;Escrito por Martin Fowler&lt;/cite&gt;&lt;br /&gt;
&lt;cite&gt;Traducido por Carmen Vidal ( Paradigma Tecnológico) &lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;Para este artículo voy a describir dos estilos de cómo se hace el diseño en el desarrollo de software. Quizás el más común es el diseño evolutivo. Esencialmente, el diseño evolutivo quiere decir que el diseño del sistema crece mientras se implemente el sistema. El diseño es parte de los procesos de programación y según el programa se desarrolla el diseño cambia.&lt;/p&gt;
&lt;p&gt;En su uso habitual, el diseño evolutivo es un desastre. El diseño termina siendo la agregación de un manojo de decisiones tácticas tomadas en el momento, cada una de las cuales hace el código más difícil de cambiar. Se podría argumentar de muchas formas que esto no es diseño, de hecho esto por lo general conduce a un diseño pobre. Como Kent dijo, el diseño está ahí para permitir cambiar el software fácilmente a largo plazo. Como el diseño se deteriora, entonces se necesita la capacidad de hacer cambios con eficacia. Se tiene el estado de entropía de software, con el tiempo el diseño se pone de mal en peor. &lt;/p&gt;
&lt;p&gt;No sólo hace esto el software más difícil de cambiar, esto también hace los errores más fácil de reproducirse y a la vez más difícil encontrar y seguramente para resolver. Esto es la pesadilla “codificar y arreglar”, donde los errores se hacen exponencialmente más caros de arreglar según el proyecto avanza.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <category domain="http://www.agile-spain.com/agilev2/tema/personajes">Personajes</category>
 <pubDate>Thu, 12 Jul 2007 15:23:44 +0000</pubDate>
</item>
<item>
 <title>HypótesisDeResistenciaAlDiseño</title>
 <link>http://www.agile-spain.com/agilev2/hypotesisderesistenciaaldiseno</link>
 <description>&lt;p&gt;&lt;cite&gt;Escrito por Martin Fowler&lt;/cite&gt;&lt;br /&gt;
&lt;cite&gt;Traducido por Carmen Vidal ( Paradigma Tecnológico) &lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;¿Merece la pena el esfuerzo para diseñar el software bien?&lt;/p&gt;
&lt;p&gt;De vez en cuando tengo conversaciones indirectas sobre si el diseño de buen software es una actividad que vale la pena. Digo que estas conversaciones son indirectas porque no creo que me haya encontrado a nadie diciendo que el diseño de software no tiene importancia. Por lo general es expresado de la forma &quot; realmente tenemos que ir rápido para cumplir nuestro objetivo el próximo año y entonces reducimos &quot;.&lt;/p&gt;
&lt;p&gt;Existe la noción de que el diseño es algo que se puede comerciar para conseguir una mayor velocidad. De hecho he tenido la impresión un par de veces de que el esfuerzo de diseño es aceptado para mantener a los programadores felices aun cuando esto reduzca la velocidad.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <category domain="http://www.agile-spain.com/agilev2/tema/personajes">Personajes</category>
 <pubDate>Wed, 11 Jul 2007 12:15:06 +0000</pubDate>
</item>
<item>
 <title>SCRUM y XP desde la experiencia práctica</title>
 <link>http://www.agile-spain.com/agilev2/scrum_y_xp_desde_la_experiencia_practica</link>
 <description>&lt;p&gt;Aún no he terminado de leerlo, pero por lo que he visto hasta ahora el artículo de 90 páginas &lt;a href=&quot;http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.pdf&quot;&gt;Scrum and XP from the trenches&lt;/a&gt; es definitivamente uno de los mejores que se han escrito sobre el tema. Cuenta las experiencias de la aplicación de diferentes prácticas de SCRUM y XP durante un año en una empresa con los típicos problemas de desarrolo de software (incumplimiento de fechas, efecto &quot;siempre estamos apagando fuegos&quot;, mala calidad, etc).&lt;/p&gt;
&lt;p&gt;En el artículo se describen desde un punto de vista completamente práctico la forma en la que han están haciendo las cosas ahora después de una añ aprendiendo (gracias a las retrospectivas periódicas). Pero también es muy importante lo claro que deja que esta no es la forma definitiva y que seguirán evolucionando (de nuevo apoyándose en retrospectivas periódicas). Hay que recordar con respecto a esto que no sólo cada proyecto es diferente sino que cada día el mismo proyecto es un poco distinto al día anterior. &lt;/p&gt;
&lt;p&gt;En definitiva un artículo muy recomendable para coger ideas y contrastar las prácticas que estamos usando con lo que le ha funcionado a otra gente.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Fri, 01 Dec 2006 06:47:37 +0000</pubDate>
</item>
<item>
 <title>La hora de la verdad con Ruby on Rails</title>
 <link>http://www.agile-spain.com/agilev2/la_hora_de_la_verdad_con_ruby_on_rails</link>
 <description>&lt;p&gt;La versión 0.1 de SprintTracker contenía únicamente funcionalidades típicas de los artículos de Rails. La hora de la verdad ha llegado al proponerme implementar las funcionalidades que había sugerido para la versión 0.2 y 0.3. Las más importantes son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gráficas Burndown de los sprints&lt;/li&gt;
&lt;li&gt;Reordenación jerárquica de las páginas de administración de proyectos, sprints y tareas. Esto ha permitido mejorar mucho la usabilidad de SprintTracker&lt;/li&gt;
&lt;li&gt;Páginas de edición rápida para añadir todas las reestimaciones de un día concreto o para una tarea concreta. Esto es fundamental si, como estoy haciendo yo últimamente, usas una hoja excel para llevar el seguimiento del proyecto&lt;/li&gt;
&lt;li&gt;Otras mejoras menores: borrado en cascada de proyectos, sprints y tareas, validación a medida de reestimaciones (no puede haber dos para la misma tarea y día), etc.
&lt;/ul&gt;
&lt;p&gt;En la captura de pantalla se muestra la vista de un sprint en la que se aprecian varias de estas funcionalidades.&lt;br /&gt;
&lt;a href=&quot;http://www.agile-spain.com/agilev2/files/sprint-view.png&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.agile-spain.com/agilev2/files/sprint-view.png&quot; width=&quot;400&quot; align=&quot;center&quot; hspace=&quot;20&quot; vspace=&quot;10&quot; border=&quot;0&quot;/&gt;&lt;/a&gt;&lt;br /&gt;
Tras implementar estas funconalidades he liberado &lt;a href=&quot;http://rubyforge.org/frs/?group_id=1472&quot;&gt;SprintTracker v0.3&lt;/a&gt; y creo que ya empieza a ser una aplicación lista para ser usada. Para ellas no había ningún artículo que me guiara y ello me ha obligado a aprender mucho más sobre Rails y sobre todo a manejarme con las referencias online imprescindibles para todo desarrollador de Rails:&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Mon, 10 Apr 2006 21:51:05 +0000</pubDate>
</item>
<item>
 <title>Peculiaridades de Ruby para desarrolladores Java (parte 2)</title>
 <link>http://www.agile-spain.com/agilev2/peculiaridades_de_ruby_para_desarrolladores_java_parte_2</link>
 <description>&lt;p&gt;Continuando con &lt;a href=&quot;http://www.agile-spain.com/agilev2/peculiaridades_de_Ruby_para_desarrolladores_java&quot;&gt;la entrada anterior&lt;/a&gt; sigo explorando los aspectos de Ruby mas peculiares para un programador que viene del mundo Java.&lt;/p&gt;
&lt;h4&gt;Closures&lt;/h4&gt;
&lt;p&gt;En los artículos de autores relacionados con el mundo de los métodos ágiles es habitual oir hablar de lenguajes que soportan closures. Pues bien, tengo que reconocer que aunque creía haber entendido bien el concepto lo cierto es que al menos no lo había asimilado. Usandolo con Rails por fin lo he conseguido, así que ahí va mi intento de explicar lo que son:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Un closure puede verse como un bloque de código que se sitúa en paralelo al del método y al que éste puede pasarle el control cuando crea conveniente usando el método &lt;tt&gt;yield()&lt;/tt&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Un ejemplo típico de uso podría ser un método que itera por un árbol y realiza una acción con cada nodo. En Ruby es posible pasar al método (al que llamaremos &lt;tt&gt;iterateTree&lt;/tt&gt;) un fragmento de código que será el que realice la operación sobre el nodo. Por ejemplo, la invocación del método para imprimir cada nodo podría ser:&lt;/p&gt;
&lt;pre&gt;
  tree.iterateTree do |node|
     puts &quot;Iterating node: &quot; + node
  end
&lt;/pre&gt;&lt;p&gt;
El fragmento de código entre &lt;tt&gt;do&lt;/tt&gt; y &lt;tt&gt;end&lt;/tt&gt; recibe el nombre de closure. El método &lt;tt&gt;iterateTree&lt;/tt&gt; invocará el closure usando el método especial &lt;tt&gt;yield&lt;/tt&gt;:&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 04 Apr 2006 12:09:27 +0000</pubDate>
</item>
<item>
 <title>Peculiaridades de Ruby para desarrolladores Java</title>
 <link>http://www.agile-spain.com/agilev2/peculiaridades_de_ruby_para_desarrolladores_java</link>
 <description>&lt;p&gt;Durante estos días en que he estado aprendiendo Ruby y Rails para desarrollar SprintTracker 0.1 me he ido encontrando diferentes elementos de sintaxis que me han sorprendido, confundido o incluso disgustado (al menos inicialmente). He pensado que podía ser buen idea revisarlos porque creo que conociéndolos resulta mucho más fácil entender los fragmentos de código presentados en la mayoría de artículos sobre el tema. Como son bastantes cosas lo voy a dividir en dos entradas del blog. &lt;/p&gt;
&lt;h4&gt;Llaves y paréntesis opcionales&lt;/h4&gt;
&lt;p&gt;En Ruby los paréntesis y las llaves (&lt;tt&gt;()&lt;/tt&gt; y &lt;tt&gt;{}&lt;/tt&gt;) pueden omitirse cuando son obvios. Por ello en Rails es habitual encontrar invocaciones a métodos de la forma:&lt;/p&gt;
&lt;pre&gt;
  nombre_método parametro
&lt;/pre&gt;&lt;p&gt;Que es equivalente a :&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo(parametro)
&lt;/pre&gt;&lt;p&gt;Cuando un mapa (hash) es el último parámetro de un método las llaves pueden ignorarse, así que uniendo esto a lo anterior es habitual encontrarse llamadas a métodos de la forma:&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo primer_parametro, :clave1 =&gt; &quot;valor1&quot;, :clave2 =&gt; &quot;valor2&quot;
&lt;/pre&gt;&lt;p&gt;Que es equivalente a:&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo(primer_parametro, {:clave1 =&gt; &quot;valor1&quot;, :clave2 =&gt; &quot;valor2&quot;})
&lt;/pre&gt;&lt;p&gt;Y que un programador Java escribiría como:&lt;/p&gt;
&lt;pre&gt;
  Map segundoParametro = new HashMap();
  segundoParametro(&quot;clave1&quot;, &quot;valor1&quot;);
  segundoParametro(&quot;clave2&quot;, &quot;valor2&quot;);
  nombreMetodo(primerMarametro, segundoParametro);
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Sun, 02 Apr 2006 16:22:31 +0000</pubDate>
</item>
<item>
 <title>Publicado SprintTracker v0.1</title>
 <link>http://www.agile-spain.com/agilev2/publicado_sprinttracker_v0_1</link>
 <description>&lt;p&gt;Efectivamente SprintTracker ya está aquí empaquetada y descargable. No esperes que te resulte muy útil aún, claro, es más bien una prueba de concepto. Tras completar la funcionalidad tal y como expliqué en mi &lt;a href=&quot;http://www.agile-spain.com/agilev2/relaciones_entre_entidades_y_validacion_en_rails&quot;&gt;post anterior&lt;/a&gt; sólo queda un lavado de cara visual a la aplicación y empaquetarla para que sea fácil de probar. En la siguiente captura de pantalla puede verse el resultado final, en concreto la pantalla con el listado de proyectos dados de alta:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.agile-spain.com/agilev2/files/sprinttracker-v0.1.png&quot;&gt;&lt;img src=&quot;http://www.agile-spain.com/agilev2/files/sprinttracker-v0.1.png&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Os explico cuales han sido los últimos pasos para crear la versión 0.1:&lt;/p&gt;
&lt;h4&gt;Mejorando el aspecto visual y la navegación&lt;/h4&gt;
&lt;p&gt;Según iba avanzando con el desarrollo de la aplicación me había preocupado bastante poco del aspecto visual de la misma y la navegación entre sus apartados. Simplemente había dejado la apariencia que se crea por defecto al ejecutar el script &lt;tt&gt;scaffold&lt;/tt&gt;. El principal inconveniente de esta es que no hay ningún mecanismo para acceder de unas herramientas a otras (y SprintTracker tiene ya 5). &lt;/p&gt;
&lt;p&gt;Así que lo primero que pensé fue en crear un primer menú. La cuestión es ¿dónde lo pongo? Leyendo uno de los artículos que tenía a mano vi que en Rails las páginas se construyen a partir de tres componentes visuales:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Layout: es el fichero que contiene la estructura de un conjunto de páginas. Se encuentran en la carpeta &lt;tt&gt;views/layouts&lt;/tt&gt;
&lt;li&gt;View: es el fichero que contiene el contenido principal de cada página concreta. Se encuentran en subcarpetas de &lt;tt&gt;views&lt;/tt&gt; con el nombre del controlador asociado a la vista.
&lt;li&gt;Parts: son ficheros incluidos, generalmente desde views usando el método &lt;tt&gt;&amp;lt;% render :partial =&gt; &#039;nombre_del_part&#039; %&gt;&lt;/tt&gt;. Por convenio el primer caracter del nombre del fichero es un subrayado y la extensión es (por ejemplo &lt;tt&gt;_nombre_del_part.rhtml&lt;/tt&gt;). Las parts se encuentran junto a las Views que las incluyen.
&lt;/ol&gt;
&lt;p&gt;Aquí me encontré con el primer problema, para cada una de las herramientas se había generado en la carpeta &lt;tt&gt;view/layouts&lt;/tt&gt; un layout diferente. Eso es un problema, porque si el menú es igual a todos ¿tengo que copiarlo a cada uno de los layouts? Eso viola el principio DRY (Don&#039;t Repeat Yourself) y por tanto no me hacía mucha gracia. Pero rápidamente leí la solución: basta con borrar todos esos layouts y crear una nuevo (copiando el contenido de cualquiera de los otros) llamado &lt;tt&gt;application.rhtml&lt;/tt&gt;. Rails primero mira si hay un layout con el nombre del controlador que se ha invocado y si no lo encuentra busca siempre uno llamado &lt;tt&gt;application.rhtml&lt;/tt&gt;. De esta forma creando este fichero es muy sencillo hacer que todas las páginas del portal tengan la misma apariencia, pero si hay alguna excepción se puede crear un layout para un controlador concreto.&lt;/p&gt;
&lt;p&gt;Una vez determinado el fichero ya podía escribir el código HTML de la cabecera, el menú etc. Lo que quería era:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear una apariencia más o menos decente (no soy diseñador, no le puedo pedir peras al olmo) pero muy poco sobrecargada&lt;/li&gt;
&lt;li&gt;Tener el código HTML lo más sencillo posible&lt;/li&gt;
&lt;li&gt;Poder cambiar la apariencia lo más posible usando CSS (para permitir a futuros usuarios de la herramienta adaptarla)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con estos requisitos en mente me encajaba a la perfección usar el &lt;a href=&quot;http://www.contentwithstyle.co.uk/Articles/17/a-css-framework&quot;&gt;framework CSS&lt;/a&gt; de Mike Stenhouse que ha sido propuesto recientemente. La idea de este framework es proponer una estructura HTML concreta con unos nombres de identificadores y estilos CSS definidos que permitan representar cualquier página web normal. Gracias a las técnicas CSS soportadas a la gran mayoría de los navegadores es posible aplicar toda la apariencia a la página desde fuera del HTML. Este framework ha tenido repercusión en el mundo Java gracias al &lt;a href=&quot;http://raibledesigns.com/page/rd?anchor=css_framework_design_contest&quot;&gt;concurso&lt;/a&gt; propuesto por Matt Raible para crear apariencias para él.&lt;/p&gt;
&lt;p&gt;En resumen, decidí seguir las guías de dicho framework CSS para SprintTracker y viendo los resultados me alegro de ello. Por un lado he perdido mucho menos tiempo de lo habitual maquetando el código HTML y por otro futuros cambios en la apariencia afectarán en la mayoría de los casos sólo al código CSS. En concreto siguiendo las guías de &lt;a href=&quot;http://www.contentwithstyle.co.uk/Articles/12/modular-css/&quot;&gt;CSS modular&lt;/a&gt; del propio Stenhouse he dividido los CSS en componentes. En particular uno de ellos, &lt;tt&gt;_color.css&lt;/tt&gt; contiene todas las definiciones de colores con lo que modificando sólo ese es posible cambiar todos los colores usados por SprintTracker.&lt;/p&gt;
&lt;h4&gt;Empaquetamiento&lt;/h4&gt;
&lt;p&gt;Uno de los aspectos que más me preocupaba cuando pensaba en implementar SprintTracker en Ruby on Rails era la dificultad de distribuirlo para que la gente lo probara. Yo pensaba &quot;&lt;i&gt;Si lo hiciera en Java, cualquiera puede instalar un tomcat y desplegar en él un WAR, o incluso puedo distribuir un tomcat con el WAR desplegado&lt;/i&gt;&quot;. Sin embargo mis temores se han convertido en nuevo reconocimiento hacia la comunidad de Ruby dado que me ha sido posible incluso crear un ejecutable autocontenido con toda la aplicación. ¡Más facilidad imposible!&lt;/p&gt;
&lt;p&gt;Las herramientas que llevan a cabo la magia necesaria son tar2rubyscript y rubyscript2exe. Para instalarlas basta con ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ gem install tar2rubyscript
$ gem install rubyscript2exe
&lt;/pre&gt;&lt;p&gt;Una vez instalados aprendo a usarlas tal y como se explica en el artículo &lt;a href=&quot;http://www.erikveen.dds.nl/distributingrubyapplications/rails.html&quot;&gt;Distributing Rails Applications&lt;/a&gt;. El artículo es bastante nuevo (de hace 10 días) pero tiene bastantes imprecisiones, quizá porque habla de una versión antigua de Rails. En definitiva los que he tenido que hacer es ir al en el que hay un subdirectorio denominado &lt;tt&gt;SprintTracker&lt;/tt&gt; que contiene toda la aplicación y ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ tar2rubyscript SprintTracker
&lt;/pre&gt;&lt;p&gt;Con este comando genero un fichero &lt;tt&gt;SprintTracker.rb&lt;/tt&gt; que contiene toda la aplicación. Basta con tener Ruby instalado para poder ejecutarlo como &lt;tt&gt;ruby SprintTracker.rb&lt;/tt&gt;. Me ha recordado a empaquetar una aplicación java en un jar y ejecutarla como &lt;tt&gt;java -jar app.jar&lt;/tt&gt; sin embargo con aplicaciones J2EE no es tan fácil.&lt;/p&gt;
&lt;p&gt;Pero ruby permite ir un paso más: puede incluirse el propio ruby en el paquete y crear un ejecutable. Basta con ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ rubyscript2exe SprintTracker.rb
&lt;/pre&gt;&lt;p&gt;Como inconveniente valga decir que esta herramienta genera un ejecutable que sólo funciona en la plataforma en la que se empleó. En mi caso para Linux (&lt;tt&gt;SprintTracker_linux&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;En la generación de estos ficheros me he encontrado con dos problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No se incluía la dependencia con &lt;i&gt;sqlite3&lt;/i&gt; y por tanto fallaba al ejecutarlo en un ordenador que no lo tuviera instalado aparte. Creo que esto ya lo he corregido, pero agradecería al que pudiera probarlo que me lo confirmara.&lt;/li&gt;
&lt;li&gt;No me ha funcionado el sistema para sacar la base de datos fuera del ejecutable. Por ello esta versión 0.1 pierde los datos una vez se cierra. No me preocupa para esta primera versión, pero tenlo en cuenta: ¡no introduzcas datos reales que se van a perder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debido a estos problemas de empaquetamiento he decidido marcar a los ficheros que he subido a RubyForge con la versión 0.1beta1. Os invito a todos los que estais siguiendo esta serie a descargarlos y probarlos:&lt;br /&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;a href=&quot;http://rubyforge.org/frs/?group_id=1472&quot;&gt;SprintTracker v0.1&lt;/a&gt;
&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Thu, 23 Mar 2006 22:52:54 +0000</pubDate>
</item>
<item>
 <title>Relaciones entre entidades y validación en Rails</title>
 <link>http://www.agile-spain.com/agilev2/relaciones_entre_entidades_y_validacion_en_rails</link>
 <description>&lt;p&gt;Lo prometido es deuda y tal y como comenté en el &lt;a href=&quot;http://www.agile-spain.com/agilev2/gestion_de_usuarios_en_rails_hacia_sprinttracker_v0_1&quot;&gt;post anterior&lt;/a&gt; hoy toca explicar el resto de pasos que me han llevado a implementar la funcionalidad de la primera versión de SprintTracker funcional.&lt;/p&gt;
&lt;p&gt;Estos han consistido en la creación de las herramientas de gestión de Proyectos, Sprints, Tareas y (re)Estimaciones con las oportunas relaciones entre estas entidades. Después he añadido un poco de validación (muy fácil, ya lo verás).&lt;/p&gt;
&lt;h4&gt;Proyectos, Sprints, Tareas y estimaciones&lt;/h4&gt;
&lt;p&gt;En el último post concluía que parece preferible usar la generación de código por script cuando vas a tener que modificar el resultado así que en esta ocasión lo uso directamente. Eso sí, lo primero es crear el modelo de datos. Lo hice en dos pasos en los ficheros &lt;tt&gt;003_add_projects_and_sprints.rb&lt;/tt&gt; y &lt;tt&gt;004_add_tasks_and_estimates.rb&lt;/tt&gt;, creados ejecutando:&lt;/p&gt;
&lt;pre&gt;
$ ruby script/generate migration add_projects_and_sprints
$ ruby script/generate migration add_tasks_and_estimates
&lt;/pre&gt;&lt;p&gt;Muestro la parte más interesante de su contenido (el código de &lt;tt&gt;self.up&lt;/tt&gt;)en ese orden:&lt;/p&gt;
&lt;pre&gt;
    create_table &quot;projects&quot; do |table|
      table.column &quot;name&quot;,:string,:limit=&gt;128
      table.column &quot;description&quot;,:string
    end
    create_table &quot;sprints&quot; do |table|
      table.column &quot;target&quot;,:string
      table.column &quot;start_date&quot;,:date
      table.column &quot;duration&quot;, :int
      table.column &quot;project_id&quot;, :int
    end
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;
    create_table &quot;tasks&quot; do |table|
      table.column &quot;name&quot;,:string,:limit=&gt;256
      table.column &quot;description&quot;,:string
      table.column &quot;user_id&quot;,:int
      table.column &quot;sprint_id&quot;,:int
      table.column &quot;initial_estimate&quot;, :int
      table.column &quot;real_effort&quot;, :int
    end
    create_table &quot;estimates&quot; do |table|
      table.column &quot;reestimation_date&quot;,:date
      table.column &quot;reestimation&quot;, :int
      table.column &quot;task_id&quot;, :int
      table.column &quot;is_going_well&quot;, :int
      table.column &quot;explanation&quot;,:string
    end
&lt;/pre&gt;&lt;p&gt;Es importante fijarse que las claves extranjeras deben seguir un convenio de nombres. Por ejemplo en &lt;tt&gt;estimates&lt;/tt&gt; la columna &lt;tt&gt;task_id&lt;/tt&gt; apunta a &lt;tt&gt;tasks&lt;/tt&gt; y por ello debe llamarse como la tabla a la que apunta en singular seguido de &lt;tt&gt;_id&lt;/tt&gt;.&lt;br /&gt;
Para cada uno de ellos apliqué los cambios a la base de datos con:&lt;/p&gt;
&lt;pre&gt;
$ rake migrate
&lt;/pre&gt;&lt;p&gt;Y ya estamos listos para generar el código:&lt;/p&gt;
&lt;pre&gt;
$ ruby script/generate scaffold Project
$ ruby script/generate scaffold Sprint
$ ruby script/generate scaffold Task
$ ruby script/generate scaffold Estimate
&lt;/pre&gt;&lt;p&gt;Tras ejecutar estos comandos ya tengo el 80% de las herramientas de gestión. Lo primero que queda es establecer las relaciones. &lt;/p&gt;
&lt;h4&gt;Relaciones entre entidades persistidas&lt;/h4&gt;
&lt;p&gt;Tomemos como ejemplo la relación entre Proyectos y Sprints (un proyecto contiene varios sprints, un sprint pertenece a un proyecto). Para declarar esto en Rails basta con escribir lo siguiente:&lt;/p&gt;
&lt;pre&gt;
[project.rb]
class Project &amp;lt; ActiveRecord::Base
  &lt;b&gt;has_many :sprints&lt;/b&gt;
end
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;
[sprint.rb]
class Sprint &amp;lt; ActiveRecord::Base
  &lt;b&gt;belongs_to :project&lt;/b&gt;
end
&lt;/pre&gt;&lt;p&gt;Esto permite navegar de uno a otro usando la notación habitual: &lt;tt&gt;project.sprints&lt;/tt&gt; o &lt;tt&gt;sprint.project&lt;/tt&gt; y Rails se encarga del acceso a base de datos. También proporciona facilidades adicionales opcionales como la obtención de datos a priori (eager). &lt;/p&gt;
&lt;p&gt;En el formulario de los sprints debemos poder elegir uno de los proyectos existentes. Para eso uso el siguiente código:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;p&gt;&amp;lt;label for=&quot;sprint_project_id&quot;&gt;Project&amp;lt;/label&gt;&amp;lt;br&gt;
  &amp;lt;%= select(&quot;sprint&quot;, &quot;project_id&quot;, Project.find_all.collect {|p| [ p.name, p.id ] }) %&gt;
&lt;/p&gt;</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Thu, 23 Mar 2006 11:46:26 +0000</pubDate>
</item>
<item>
 <title>Gestión de usuarios en Rails: hacia SprintTracker v0.1</title>
 <link>http://www.agile-spain.com/agilev2/gestion_de_usuarios_en_rails_hacia_sprinttracker_v0_1</link>
 <description>&lt;p&gt;Ya me hago a la idea de lo que es una aplicación con Rails con suficiente claridad como para embarcarme en la tarea de crear la primera versión de SprintTracker. El objetivo de esta versión es que permita gestionar usuarios y proyectos, crear sprints asociados a proyectos, crear tareas dentro de un sprint y asignárselas a un desarrollador y por último ir añadiendo (re)estimaciones de la tarea durante los días que dura un sprint. La interfaz de usuario no me preocupa por ahora y dejaré la que genere Rails.&lt;/p&gt;
&lt;h4&gt;Primeros pasos&lt;/h4&gt;
&lt;p&gt;En primer lugar me decido probar un IDE específico de Ruby y encuentro RadRails así que digo adios a kate. También me pongo a buscar más artículos de Rails y me encuentro con una recopilación de los &lt;a href=&quot;http://www.digitalmediaminute.com/article/1816/top-ruby-on-rails-tutorials&quot;&gt;12 mejores artículos de Ruby on Rails&lt;/a&gt;. A leer se ha dicho. &lt;/p&gt;
&lt;p&gt;Una de las primeras cosas que se aprende de Rails es obliga a desarrollar de abajo a arriba: es decir empezando por el modelo de datos y llegando hasta la interfaz. Por ello es interesante comenzar la aplicación pensando bien el modelo de datos. El de SprintTracker es este:&lt;br /&gt;
&lt;img align=&quot;center&quot; src=&quot;http://www.agile-spain.com/agilev2/files/erd-1.png&quot;/&gt;&lt;/p&gt;
&lt;h4&gt;Generación de código de persistencia en Rails&lt;/h4&gt;
&lt;p&gt;Rails ofrece dos modelos de generación de código (scaffolding) que podríamos denominar &lt;i&gt;generación dinámica&lt;/i&gt; y &lt;i&gt;generación por script&lt;/i&gt;&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 21 Mar 2006 23:29:40 +0000</pubDate>
</item>
<item>
 <title>Aprendiendo más sobre Rails y Ruby</title>
 <link>http://www.agile-spain.com/agilev2/aprendiendo_mas_sobre_rails_y_ruby</link>
 <description>&lt;p&gt;Tras conseguir &lt;a href=&quot;http://www.agile-spain.com/agilev2/instalando_ruby_y_ruby_on_rails_en_ubuntu&quot;&gt;instalar Ruby on Rails&lt;/a&gt; en la última sesión ha llegado la hora de entrar en materia. Como ya comenté mi idea era partir de los artículos del último número de la revista on-line &lt;a href=&quot;http://ratio.co.uk/objectiveview.html&quot;&gt;ObjectiveView&lt;/a&gt;. Gracias a ellos he conseguido crear mi primera aplicación Ruby on Rails y por el camino también he aprendido mucho más tanto sobre este framework como sobre Ruby. Os cuento como ha sido la experiencia.&lt;/p&gt;
&lt;p&gt;El primer artículo de la revista es sobre Ruby. Lo he leído rápidamente por encima y no me ha entusiasmado aunque si me he quedado con algunas de las peculiaridades de Ruby. En realidad tenía ganas de llegar al artículo &quot;Ruby on Rails&quot; de Obie Fernandez. Todo lo que escribo a continuación te resultará mucho más útil si has seguido, estás siguiendo o piensas seguir próximamente dicho artículo.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Siguiendo el artículo sobre Ruby on Rails&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Siguiendo las instrucciones de los primeros párrafos he creado la aplicación ejecutando:&lt;/p&gt;
&lt;pre&gt;
$ rails sprinttracker 
&lt;/pre&gt;&lt;p&gt;Me ha gustado mucho la idea de que tras ejecutar el comando ya tengo una aplicación ejecutable y a la que puede accederse desde el navegador. Es más fácil y gratificante ir construyendo poco a poco sobre algo que funciona que escribir líneas y líneas que probablemente no funcionarán a la primera ni a la segunda.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 21 Mar 2006 22:44:05 +0000</pubDate>
</item>
<item>
 <title>Instalando Ruby y Ruby on Rails en Ubuntu</title>
 <link>http://www.agile-spain.com/agilev2/instalando_ruby_y_ruby_on_rails_en_ubuntu</link>
 <description>&lt;p&gt;Ya no me he podido aguantar más. Después de meses escuchando las bondades de &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; y en particular para conseguir un ritmo de desarrollo muy ágil me he decidido a probarlo. Llevaba varios días coméntandolo con amigos y compañeros, pero lo que me ha decidido ha sido el encontrar una idea para una aplicación: he pensado en desarrollar un entorno via web para llevar el seguimiento de una iteración con gráfica Burndown incluida. Últimamente estoy usando una hoja de cálculo, con la que estoy muy contento, pero echo de menos varias funcionalidades y el que varias personas puedan acceder a ella simultáneamente. &lt;/p&gt;
&lt;p&gt;En definitiva que esta mañana me he puesto manos a la obra comenzando por instalar Ruby on Rails en mi Ubuntu 5.10. Lamentablemente la cosa no ha sido tan fácil como yo esperaba. Al final lo he instalado de la forma manual. Si no te interesan los problemas que me llevaron a esa decisión sáltate la sección que sigue ya pasa a la siguiente para una explicación rápida de cómo recomiendo proceder después de mi experiencia.&lt;/p&gt;
&lt;h4&gt;Primeros intentos con apt-get&lt;/h4&gt;
&lt;p&gt;Naturalmente lo primero que he hecho es mirar a ver si había paquetes disponibles para instalar con apt-get. Una de cal y una de arena. Ruby está y rails también (aunque una versión algo vieja) pero rubygems no. Primero instalé ruby:&lt;br /&gt;
&lt;code&gt;&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Mon, 27 Mar 2006 12:08:57 +0000</pubDate>
</item>
<item>
 <title>Cinco señales de problemas en una iteración</title>
 <link>http://www.agile-spain.com/agilev2/cinco_senales_de_problemas_en_una_iteracion</link>
 <description>&lt;p&gt;A todos los que hayais empezado a usar gráficas Burndown para llevar a cabo el seguimiento de los proyectos os resultará muy interesante el artículo &lt;a href=&quot;http://www.agileadvice.com/archives/2006/03/five_signs_of_t.html&quot;&gt;Five Signs of Trouble in an iteration&lt;/a&gt; donde Mishkin Berteig evalúa varias formas que pueden tomar esas gráficas y cómo identificar problemas a partir de ellas.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Mon, 06 Mar 2006 10:51:12 +0000</pubDate>
</item>
<item>
 <title>Una Experiencia real aplicando métodos ágiles</title>
 <link>http://www.agile-spain.com/agilev2/una_experiencia</link>
 <description>&lt;p&gt;Nelson Tapia (NTapia) nos envia esta interesante reflexión sobre su experiencia trabajando con métodos ágiles:&lt;/p&gt;
&lt;p&gt;&quot;Me tocó trabajar en la empresa Forestal mas grande de Chile en la Mantención de un Sistema desarrollado en Gupta ( Sql Windows ) con un equipo de trabajo de 3 personas en donde nos dedicabamos principalmente a resolver problemas y enfrentar modificaciones.&lt;br /&gt;
Principalmente para los desarrollos nuevos solamente se contaba con una Especificación Funcional ( que indica como el Usuario desea que funcione el Sistema ) y posteriormente uno debia preparar la Especificación Técnica en donde mediante redacción, grafos, propuestas de pantallas y otros, indicabamos lo que debiamos hacer y cuanto tiempo nos tomaría. Sin saberlo estabamos trabajando con un método ágil, sin utilizarlo completamente, pero si con la presión de hacer desarrollos cortos y con una fuerte interacción con el Usuario.&lt;br /&gt;
Debo comentar que lo que hace actualmente exitoso esta forma de trabajo ( con muy poco errores y una alta cohesión en los Sistemas ) no son los métodos, ni el lenguaje, ni la plataformas de Hardware.&lt;br /&gt;
El éxito se debe a lo siguiente:&lt;br /&gt;
1.- Un equipo que posee un amplio conocimiento del negocio.&lt;br /&gt;
2.- Confianzas ganadas con el tiempo en la completitud de los desarrollos como en su exactitud.&lt;br /&gt;
3.- Ambiente de trabajo colaborativo y proactivo.&lt;br /&gt;
4.- Coordinación de esfuerzos depositando a los mejores en sus ambitos de conocimiento.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Sat, 18 Feb 2006 18:48:41 +0000</pubDate>
</item>
</channel>
</rss>
