<?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; Desarrollo web</title>
	<atom:link href="http://alonsogarciapablo.com/blog/category/desarrollo-web/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>Una semana de trabajo en BeBanjo</title>
		<link>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/</link>
		<comments>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 16:34:15 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[bebanjo]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[VOD]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=673</guid>
		<description><![CDATA[Durante el pasado de mes de Julio, tuve la gran oportunidad de pasar una semana trabajando con los increíbles chicos de BeBanjo. En cuanto me enteré de que están buscando gente para ampliar su equipo, decidí escribir a Luismi Cavallé para obtener más información al respecto. Y cual fue mi sorpresa cuando me propusieron trabajar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bebanjo.com/"><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/08/BeBanjo.jpg" alt="BeBanjo - A better way to manage your VOD services" title="BeBanjo - A better way to manage your VOD services"  class="aligncenter size-full wp-image-674" /></a></p>
<p>Durante el pasado de mes de Julio, tuve la gran oportunidad de pasar <strong>una semana trabajando con los increíbles chicos de <a href="http://bebanjo.com/" rel="external">BeBanjo</a></strong>. En cuanto me enteré de que <a href="http://twitter.com/#!/cavalle/status/80921455017197568" rel="external">están buscando gente para ampliar su equipo</a>, decidí escribir a <a href="http://www.lmcavalle.com/" rel="external">Luismi Cavallé</a> para obtener más información al respecto. Y cual fue mi sorpresa cuando <strong>me propusieron trabajar una semana con ellos</strong>. Claro: <strong>¿qué mejor forma de conocer a tus candidatos que trabajar una semana con ellos?</strong>. Mucha gente no entendía que fuese a una empresa a trabajar sin cobrar un duro, pero ¡yo no lo dudé ni un minuto! <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>La experiencia fue genial para mí. Fueron sólo 5 días pero personalmente me aportó mucho. Por eso, y en primer lugar, quiero <strong>dar las gracias a <a href="http://www.linkedin.com/in/jorgesancha" rel="external">Jorge Gomez Sancha</a> y <a href="http://www.linkedin.com/in/bastianm" rel="external">Bastian Manintveld</a> por la invitación. Thanks!</strong>. </p>
<p>Paso a resumir algunas de las <strong>buenas prácticas y aspectos que más me llamaron la atención</strong> y por las que opino que realmente merece mucho la pena trabajar en BeBanjo:</p>
<h2>A nivel técnico</h2>
<p>Llevaba mucho tiempo deseando trabajar en algún proyecto Rails &#8220;de la vida real&#8221; y con un equipo maduro que realmente llevara mucho tiempo trabajando con el framework. Ya había asistido a una <a href="http://alonsogarciapablo.com/blog/retrospectiva-de-agile-spain-2010-la-primera-conferencia-sobre-metodos-agiles-en-espana#testing-de-aceptacion-con-luismi-y-sergio" rel="external">sesión sobre Testing de aceptación en Ruby impartida por Luismi y Sergio Gil</a> y eso me motivó mucho a escribirles. A nivel técnico, me llamó la atención:</p>
<h3>La programación por parejas: un ordenador, dos pantallas, dos teclados, y dos ratones</h3>
<p>Reconozco que nunca había <a href="http://en.wikipedia.org/wiki/Pair_programming" rel="external">programado en pareja</a> de una forma tan intensiva. Sí lo había hecho para resolver algún problema complejo concreto, pero no durante jornadas completas. La experiencia fue muy positiva. En BeBanjo tuve la oportunidad de comprobar la <strong>productividad y calidad que se consigue cuando dos cabezas están resolviendo un mismo problema</strong>.</p>
<p>El hecho de tener una persona al lado, con quien poder discutir una determinada solución, no sólo ayuda a obtener un mejor código, sino que también consigue que <strong>ambas partes estén completamente concentradas en su trabajo</strong>. Trabajando con Luismi comprendí que <strong>el hecho de exponer el problema a otra persona de una forma oral, ayuda a darse cuenta de muchas cosas que de forma introspectiva sería difícil descubrir</strong>.</p>
<p>Y si a eso le sumas <strong>la <a href="http://www.pomodorotechnique.com/" rel="external">técnica del Pomodoro</a> sincronizada</strong> entre todos los miembros del equipo con <a href="http://tomatoi.st/" rel="external">tomatoi.st</a>, un sencillo tablero kanban y una planificación al comienzo de cada día: <strong>¡la productivad es brutal!</strong> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>El ciclo BDD/TDD: ¡las pruebas primero!</h3>
<p><strong>¡En BeBanjo siempre escriben los tests primero!</strong>. Y gracias a esta experiencia puede ver a un <a href="http://www.lmcavalle.com/2009/02/10/how-we-do-bdd.html" rel="external">equipo real con su propia forma de hacer BDD/TDD</a>, es decir, programando primero cuál es el comportamiento esperado desde el punto de vista del usuario en forma de test para después codificar una solución lo más elegante posible. Esto hace posible <strong>desarrollar nuevas funcionalidades sin apenas abrir el navegador</strong>.</p>
<p>En el caso de Ruby On Rails, tuve la oportunidad de trabajar con el <a href="http://github.com/cavalle/steak" rel="external">famoso Steak</a>, y también pude ver a <a href="http://pivotal.github.com/jasmine/" rel="external">Jasmine</a> en acción <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Lo mejor que he aprendido referente a este tema es, a parte del enfoque BDD, que <strong>no existe una forma definitiva de probar tu código</strong> sino que cada equipo/persona debe elegir qué <em>aproach</em> le aporta más valor y seguridad&#8230; Por otro lado, he aprendido que hay cosas bastante triviales que no merece la pena probar.</p>
<h3>El workflow con git: varias ramas y un buen entorno</h3>
<p>He de reconocer que a nivel profesional sólo he trabajado con Subversion. Conozco GIT gracias a <a href="https://github.com/" rel="external">GitHub</a> y algún proyecto que he desplegado en <a href="http://www.heroku.com/" rel="external">Heroku</a>.</p>
<p>En BeBanjo tienen muy bien planteando <a href="http://www.slideshare.net/sergio.gil/a-git-workflow" rel="external">su flujo de trabajo con git</a>. Descubrí bastante comandos de git y los problemas que puede ocasionar el trabajar con una única rama <em>master</em>.</p>
<p>Ni que decir tiene, que <a href="http://en.wikipedia.org/wiki/Release_early,_release_often" rel="external">los <strong>despliegues en producción son bastante frecuentes</strong></a> y que cualquier miembro del equipo puede <strong>desplegar nuevas funcionalidades sin miedo a romper algún código anterior</strong>.</p>
<h3>Excelencia técnica y <em>happy programmers</em></h3>
<p>Poco puedo contar de <a href="https://github.com/cavalle" rel="external">Luismi</a>, <a href="https://github.com/porras" rel="external">Sergio Gil (Porras)</a> y <a href="https://github.com/christos" rel="external">Christos Zisopoulos</a> que no se sepa ya. A nivel técnico cuentan con una gran experiencia y son <strong>desarrolladores muy &#8220;visibles&#8221; y activos en el panorama Ruby nacional e internacional</strong>, lo cual dice mucho sobre sus perfiles y los convierte en grandes compañeros de trabajo. Pero <strong>lo más importante de todo es que disfrutan con su trabajo</strong>. </p>
<p>En este punto he de <strong>agradecerles a los tres su gran paciencia a la hora de responder mis infinitas preguntas</strong>, y en especial a Luismi que fue con quién más trabajé y de quién más pude aprender <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Thanks!</p>
<h2>A nivel de empresa</h2>
<p>Al mismo tiempo, <strong>tenía muchas ganas de vivir el ambiente de una <a href="http://alzado.org/articulo.php?id_art=895" rel="external">empresa de producto</a> tipo <em>startup</em></strong>. El hecho de que mi estancia coincidiera con un cambio de oficina me hizo estar implicado en situaciones bastante divertidas y a su vez curiosas por las que supongo toda startup debe pasar algún día. BeBanjo me parece una buena empresa por los siguientes aspectos:</p>
<h3>El buen ambiente de trabajo: felt like home!</h3>
<p><a href="http://bebanjo.com/about">Los miembros de BeBanjo</a><strong> me hicieron sentir como en casa desde el minuto nº1</strong>. Pocas veces me he sentido tan cómodo en un ambiente de trabajo en tan sólo una semana. He de reconocer que durante esa semana no tuve la sensación de ir a &#8220;trabajar&#8221;. Horarios flexibles, mucha comunicación entre el equipo, reuniones informales, comidas muy distendidas, y mi gran inquietud por aprender con<strong> ellos lograron que el día a día fuese super ameno</strong>.</p>
<h3>Productos nicho que resuelven necesidades reales</h3>
<p>El éxito de BeBanjo radica en que sus <strong>productos están enfocados a un nicho de mercado muy específico</strong>. Los fundadores detectaron que las empresas que ofrecen contenidos de video bajo demanda tienen determinados problemas a la hora de gestionar la información sobre sus referencias (series, películas, etc) y la publicación en diversas plataforma. Entonces <strong>diseñaron y desarrollaron varias aplicaciones (<a href="http://bebanjo.com/sequence" rel="external">Sequence</a>, <a href="http://bebanjo.com/movida" rel="external">Movida</a> y <a href="http://bebanjo.com/metadata">Metadata</a>) enfocadas a ayudar a estas empresas</strong>. Un punto clave en este aspecto es la <strong>gran colaboración de los clientes en todo este proceso</strong>.</p>
<h3>Concienciación de la importancia del diseño</h3>
<p>Sin duda, en BeBanjo saben lo importante que es el buen diseño de producto y por eso trabajan con los mejores. No pude conocer personalmente a <a href="http://sofanaranja.com/" rel="external">Ale Muñoz</a> pero sin duda ha hecho un gran trabajo en el diseño de los actuales productos de BeBanjo. Actualmente están buscando diseñadores todo-terreno y estoy convencido que no tardarán en encontrar a algún crack en este campo.</p>
<h3>La importancia de un buen equipo comercial y una clara orientación a cliente</h3>
<p>Hace tiempo que soy consciente de <strong>la importancia de un buen equipo comercial a la hora de desarrollar productos tecnológicos de éxito</strong>. De poco o nada sirve tener un producto excelente a nivel técnico si los posibles compradores no conocen acerca de su existencia&#8230; En este sentido creo que<strong> ambos socios realizan una gran labor a la hora de establecer nuevos contactos comerciales y en el trato diario con el cliente</strong>. </p>
<h3>Su enfoque internacional: pensando en grande</h3>
<p>Me llamó mucho la atención el <strong>enfoque claramente internacional de esta pequeña gran empresa</strong>&#8230; No era raro escuchar a lo largo del día muchas conversaciones de fondo en inglés o francés. Parece de perogrullo pero&#8230; <strong>¿por qué limitarse al mercado nacional?</strong> Y este enfoque no se limita a la parte de captar clientes, sino también a la hora de contratar nuevos empleados&#8230; <strong>¿por qué no contratar a gente con talento de otros países?</strong>.</p>
<p style="margin-top:40px">
Podría seguir escribiendo&#8230; pero no me quiero extender mucho más. Aprovecho para agradecer de nuevo a todos los miembros de BeBanjo y <strong>me despido recomendado a todo el mundo vivir una experiencia de este tipo. Merece la pena.
</p>
<p>¡Gracias BeBanjo!</strong> </p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>8 sitios web que ofrecen alojamiento para el código fuente de tus proyectos privados</title>
		<link>http://alonsogarciapablo.com/blog/sitios-web-alojar-el-codigo-fuente-privado/</link>
		<comments>http://alonsogarciapablo.com/blog/sitios-web-alojar-el-codigo-fuente-privado/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 08:47:41 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=638</guid>
		<description><![CDATA[A esta alturas cualquier desarrollador debería tener claro que es importante usar un sistema de control de versiones tanto en el ámbito profesional como en proyectos personales. Las empresas acostumbran a destinar uno o varios servidores para albergar en ellos los repositorios de cada uno de sus proyectos. Otras recurren a servicios como los que [...]]]></description>
			<content:encoded><![CDATA[<p>A esta alturas cualquier desarrollador debería tener claro que <strong>es importante usar un <a rel="external" href="http://en.wikipedia.org/wiki/Revision_control">sistema de control de versiones</a> tanto en el ámbito profesional como en proyectos personales</strong>.</p>
<p>Las empresas acostumbran a destinar uno o varios servidores para albergar en ellos los repositorios de cada uno de sus proyectos. Otras recurren a servicios como los que incluyo a continuación.</p>
<p>A nivel personal, es muy probable que no contemos con esa infraestructura y nos interese contratar un servicio bueno, bonito y barato, que nos permita alojar nuestros proyectos privados (y otros públicos). Si bien es cierto que <a rel="external" href="http://github.com">GitHub</a> es uno de los sitios más populares y alberga el código fuente de muchas aplicaciones conocidas, existen otras alternativas.</p>
<h2>Bitbucket</h2>
<p><img class="aligncenter size-full wp-image-647" title="bitbucket" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/bitbucket.jpg" alt="bitbucket, sitio web para alojar código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="https://bitbucket.org/">Visitar ell sitio web de BitBucket</a></p>
<h2>Codebase</h2>
<p><img class="aligncenter size-full wp-image-648" title="codebase" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/codebase.jpg" alt="codebase, sitio web para alojar código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="http://www.codebasehq.com/">Visitar el sitio web de Codebase</a></p>
<h2>Codeplane</h2>
<p><img class="aligncenter size-full wp-image-649" title="codeplane" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/codeplane.jpg" alt="codeplane, sitio web para alojar código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="https://codeplane.com">Visitar el sitio web de Codeplane</a></p>
<h2>GitHub</h2>
<p><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/github.jpg" alt="github, sitio web para alojar código fuente" title="github" class="aligncenter size-full wp-image-662" /></p>
<p style="text-align: center;"><a rel="external" href="https://github.com/">Visitar el sitio web de GitHub</a></p>
<h2>Projectlocker</h2>
<p><img class="aligncenter size-full wp-image-650" title="projectlocker" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/projectlocker.jpg" alt="projectlocker, sitio web para alojar código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="http://projectlocker.com">Visitar el sitio web de Projectlocker</a></p>
<h2>Repositoryhosting</h2>
<p><img class="aligncenter size-full wp-image-651" title="Repositoryhosting" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/Repositoryhosting.jpg" alt="Repositoryhosting, alternativa a Github para alojar código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="http://repositoryhosting.com">Visitar el sitio web de RepositoryHosting</a></p>
<h2>unfuddle</h2>
<p><img class="aligncenter size-full wp-image-652" title="unfuddle" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/unfuddle.jpg" alt="bitbucket, alternativa a github para alojar tu código fuente" /></p>
<p style="text-align: center;"><a rel="external" href="http://unfuddle.com">Visitar el sitio web de unfuddle</a></p>
<h2>XP-Dev</h2>
<p><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/06/xpdev.jpg" alt="xpdev, servicio para alojar tu codigo fuente" title="xpdev" width="334" height="640" class="aligncenter size-full wp-image-667" /></p>
<p style="text-align: center;"><a rel="external" href="http://xp-dev.com/">Visitar el sitio web de XP-Dev</a></p>
<p>Si conoces alguna alternativa más estaré encantado de incluirla en este listado. Gracias! <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/sitios-web-alojar-el-codigo-fuente-privado/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a los módulos en Ruby</title>
		<link>http://alonsogarciapablo.com/blog/modulos-en-ruby/</link>
		<comments>http://alonsogarciapablo.com/blog/modulos-en-ruby/#comments</comments>
		<pubDate>Thu, 12 May 2011 07:54:17 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[extend]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[mixin]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[require]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=603</guid>
		<description><![CDATA[Llega un momento en la vida del programador Ruby en que, de forma natural, empieza a indagar en el código escrito por otras personas, por ejemplo en proyectos alojados en GitHub. En estos proyectos se empieza a ver cómo se hace uso de los módulos, mixins, etc. Pero no siempre es fácil de entender todos [...]]]></description>
			<content:encoded><![CDATA[<p>Llega un momento en la vida del programador Ruby en que, de forma natural, empieza a indagar en el código escrito por otras personas, por ejemplo en proyectos alojados en <a href="http://github.com" rel="external">GitHub</a>. En estos proyectos se empieza a ver cómo se hace uso de los módulos, mixins, etc. Pero no siempre es fácil de entender todos estos conceptos.</p>
<p>Con este post pretendo <strong>ayudarte a entender bien los módulos de ruby</strong> para, por ejemplo, aprender cómo dividir bien el código en módulos, entender el código de las gemas, extender el comportamiento de Rails, etc&#8230;</p>
<h2>¿Qué es un módulo?</h2>
<p>Un módulo es una <strong>agrupación de métodos, clases y constantes</strong>. Mediante el uso de módulos, podemos dividir un programa o sistema en varias partes independientes y reutilizables que interactúen entre sí. Si estás familiarizado con Java, el concepto de módulo podría asimilarse al concepto de paquetes.</p>
<p>Uno podría pensar que esta definición es similar a la de una Clase, que también tiene métodos, clases y constantes&#8230; Sin embargo, la <strong>diferencia fundamental respecto a las clases, es que no se pueden crear instancias de un módulos</strong>.</p>
<p>Como ejemplo de módulo tenemos <a href="http://www.ruby-doc.org/core/classes/Math.html" rel="external">el módulo Math</a>, que recopila mayormente funciones para operaciones trigonométricas. Y que </p>
<h2>¿Cómo se define un módulo?</h2>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyModule
&nbsp;
  MY_CONSTANT = <span style="color:#996600;">'...'</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> MyModule.<span style="color:#9900CC;">my_method_1</span>
    ...
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> my_method_2
     ...
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  ...
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#6666ff; font-weight:bold;">MyModule::MY_CONSTANT</span>
...
<span style="color:#9900CC;">MyModule</span>.<span style="color:#9900CC;">my_method_1</span></pre></div></div>

<p>El ejemplo define un módulo de nombre &#8216;MyModule&#8217; con una constante MY_CONSTANT. Vemos que el módulo tienes 2 métodos: un primer <strong>método de módulo</strong>, llamado &#8220;my_method_1&#8243;, que sería equivalente a un método estático de una clase; y un segundo método, &#8220;my_method_2&#8243;, que sería un <strong>método de instancia</strong>. ¿Método de instancia? ¿No me acabas de decir que los módulos no tienen instancias? Lo veremos un poco más abajo <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Como hemos visto, podemos acceder al valor de una constante a través de &#8220;::&#8221; y el nombre de la constante. La invocación de los métodos de módulo sería similar a la invocación de un método estático.</p>
<h2>Principales usos de los módulos</h2>
<h3>Definición de espacios de nombres</h3>
<p>Cuando los programas crecen, surge la <strong>necesidad de organizar de alguna forma todas las partes de la aplicación que están de alguna forma relacionadas entre sí</strong>. En el caso del módulo Math, queda claro que todas esas funciones están tan relacionadas que deben habitar en un mismo espacio de nombres. Los espacios de nombres también <strong>evitan el problema de que surja una ambiegüedad en el caso de que haya dos componentes con un mismo nombre</strong>. Por ejemplo, podemos tener dentro de un programa varias clases con el nombre &#8220;Settings&#8221;, pero cada una estará referida a algo concreto. Incluyendo esas clases en distintos módulos, conseguimos que puedan ser identificadas de forma unívoca.</p>
<p>Para cargar y utilizar un módulo desde otras partes de la aplicación, podemos usar principalmente 3 métodos:</p>
<ul>
<li><strong><a href="http://ruby-doc.org/core/classes/Kernel.html#M001418" rel="external">require</a></strong>, que carga un fichero de código sólo una vez. En este caso el método recibe una cadena con el nombre del fichero.</li>
<li><strong><a href="http://ruby-doc.org/core/classes/Kernel.html#M001417" rel="external">load</a></strong>, que carga un fichero de código aunque ya ha sido ejecutado previamente.
<li>
<li><a href="http://ruby-doc.org/core/classes/Kernel.html#M001419" rel="external">autoload</a>, que recibe el nombre de un fichero y de un módulo, y carga el fichero la primera vez que se accede al módulo indicado.</a>
</ul>
<p>Todos estos métodos aceptan rutas absolutas y relativas.</p>
<h3>Mixins</h3>
<p>Los <em>mixins</em> permiten añadir funcionalidad a una clase mediante el comando <a href="http://ruby-doc.org/core/classes/Module.html#M000440" rel="external">include</a>.</p>
<p>Vamos a ver un ejemplo en el que añadimos un método de instancia a la clase String que elimina los espacios en blanco de principio y fin de una cadena y los sustituye por guiones.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> StringUtils
  <span style="color:#9966CC; font-weight:bold;">def</span> hyphenize
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">to_s</span>.<span style="color:#9900CC;">strip</span>.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">' '</span>, <span style="color:#996600;">'-'</span><span style="color:#006600; font-weight:bold;">&#41;</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;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> StringUtils
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot; en un lugar de la mancha... &quot;</span>.<span style="color:#9900CC;">hyphenize</span></pre></div></div>

<p>Con este mecanismo, podemos reutilizar el módulo en varias clases. <strong>Es posible incluir varios módulos en una misma clase o módulo</strong>, con lo que conseguiríamos un efecto similar al de la herencia múltiple disponible en otros lenguajes como C++.</p>
<p><strong>Además de añadir métodos de instancia, es posible extender una clase con métodos de clase</strong>, haciendo uso de <a href="http://ruby-doc.org/core/classes/Object.html#M001002" rel="external">extend</a>. Lo vamos a ver con un último ejemplo, que extiende una clase con métodos de instancia y de clase.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MiModulo
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">included</span><span style="color:#006600; font-weight:bold;">&#40;</span>base<span style="color:#006600; font-weight:bold;">&#41;</span>
    base.<span style="color:#9900CC;">send</span> <span style="color:#ff3333; font-weight:bold;">:include</span>, InstanceMethods
    base.<span style="color:#9900CC;">send</span> <span style="color:#ff3333; font-weight:bold;">:extend</span>, ClassMethods
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">module</span> InstanceMethods
    <span style="color:#9966CC; font-weight:bold;">def</span> mi_metodo_de_instancia
      <span style="color:#996600;">&quot;mi método de instancia&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;">module</span> ClassMethods<span style="color:#006600; font-weight:bold;">&lt;/</span>p<span style="color:#006600; font-weight:bold;">&gt;</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> mi_metodo_de_clase
      <span style="color:#996600;">&quot;mi método de clase&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</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;">class</span> MiClase
  <span style="color:#9966CC; font-weight:bold;">include</span> MiModulo
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> MiClase.<span style="color:#9900CC;">mi_metodo_de_clase</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> MiClase.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">mi_metodo_de_instancia</span></pre></div></div>

<p>Como vemos, definiendo el método <a href="http://ruby-doc.org/core/classes/Module.html#M000458" rel="external">included</a> dentro de un módulo, podemos especificar un comportamiento que se ejecutará cuando ese módulo sea incluido en otro módulo o clase. En este caso, cuando se incluye el módulo en tiempo de ejecución, en envían dos mensaje con <a href="http://ruby-doc.org/core/classes/Object.html#M000999" rel="external">send</a> a MiClase para añadir los métodos de instancia(<em>include</em>) y de clase(<em>extend</em>).</p>
<p>Y con esta introducción y los ejemplillos, espero que entiendas un poco mejor cómo funcionan los módulos en Ruby <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<h2>Referencias</h2>
<p>Lógicamente, esto no lo he inventado yo, sino que he consultado estos enlaces:</p>
<ul>
<li><a href="http://ruby-doc.org/core/classes/Module.html" rel="external">Documentación de la clase <em>Module</em> de Ruby</a>.</li>
<li><a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html" rel="external">Capítulo sobre módulos en Programming Ruby, The Pragmatic Programmer&#8217;s Guide</a>.</li>
<li><a href="http://www.rubyist.net/~slagell/ruby/modules.html" rel="external">Sección sobre módulos, Ruby User&#8217;s Guide</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Modular_programming" rel="external">Definición de programación modular, Wikipedia</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/modulos-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</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>El proceso de creación de una aplicación web, desde la idea al producto, contado por Ryan Singer de 37signals</title>
		<link>http://alonsogarciapablo.com/blog/el-proceso-de-creacion-de-una-aplicacion-web-de-la-idea-al-producto-contado-por-ryan-singer-de-37signals/</link>
		<comments>http://alonsogarciapablo.com/blog/el-proceso-de-creacion-de-una-aplicacion-web-de-la-idea-al-producto-contado-por-ryan-singer-de-37signals/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 21:23:15 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[maquetación]]></category>
		<category><![CDATA[prototipado]]></category>
		<category><![CDATA[release early release often]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=435</guid>
		<description><![CDATA[Me ha gustado mucho este vídeo (34:10 min) en el que Ryan Singer, diseñador de interfaces y programador de 37signals, explica el proceso que siguen para transformar una idea/concepto en una aplicación real. Ryan no cuenta nada nuevo. Sin embargo, a través de un ejemplo práctico y en tiempo real, explica de forma muy sencilla [...]]]></description>
			<content:encoded><![CDATA[<p>Me ha gustado mucho este vídeo (34:10 min) en el que <a href="http://feltpresence.com/" rel="external">Ryan Singer</a>, diseñador de interfaces y programador de <a href="http://37signals.com/" rel="external">37signals</a>, explica el proceso que siguen para transformar una idea/concepto en una aplicación real.</p>
<p><iframe src="http://player.vimeo.com/video/15772341?byline=0&amp;portrait=0" width="400" height="300" frameborder="0"></iframe></p>
<p>Ryan no cuenta nada nuevo. Sin embargo, a través de un ejemplo práctico y en tiempo real, explica de forma muy sencilla cómo abordan la creación de una aplicación web <a href="http://37signals.com/" rel="external">37signals</a>. Allí siguen los siguientes pasos:</p>
<ol>
<li>Estudiar el modelo y obtener los conceptos sobre los que tratará la aplicación,</li>
<li>Crear prototipos visuales de la estructura de las pantallas/<em>wireframes</em>,</li>
<li>Aplicar el diseño gráfico a los prototipos,</li>
<li>Maquetar las pantallas mediante HTML/CSS,</li>
<li>Programar la aplicación y ver los resultados.</li>
</ol>
<p>De la charla me quedo con dos cosas importantes:
<ul>
<li>Es muy probable que cuando el cliente vea los primeros prototipos de la aplicación empiece a darse cuenta de posibles cambios y mejoras en la aplicación. <strong>Es importante pararle los pies al cliente para no caer en una toma de requisitos infinita</strong>. Se le pueden plantear soluciones genéricas que le satisfagan y permitan continuar con el desarrollo.</li>
<li>Lo anterior es importante para poder avanzar con todo el proceso y<strong> sacar rápido una primera versión al mercado</strong>. Esto les permite <strong>obtener rápidamente <em>feedback</em> de los clientes/usuarios</strong> y realizar los cambios oportunos en base a experiencias reales y no a elucubraciones hechas en una fase temprana en la que no se conoce bien el dominio de la aplicación.</li>
</ul>
<p>Espero que os guste.</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/el-proceso-de-creacion-de-una-aplicacion-web-de-la-idea-al-producto-contado-por-ryan-singer-de-37signals/feed/</wfw:commentRss>
		<slash:comments>0</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>Accesibilidad Web: Herramientas</title>
		<link>http://alonsogarciapablo.com/blog/accesibilidad-web-herramientas/</link>
		<comments>http://alonsogarciapablo.com/blog/accesibilidad-web-herramientas/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 13:01:53 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>

		<guid isPermaLink="false">http://www.alonsogarciapablo.com/accesibilidad-web-herramientas/</guid>
		<description><![CDATA[Con el objetivo de garantizar la accesibilidad de los contenidos Web, los desarrolladores deberíamos hacer uso de herramientas que faciliten esa labor, y sirvan para comprobar que los sitios son real y funcionalmente accesibles. En este post, quiero recopilar todas las herramientas que estamos viendo en clase. Validadores automáticos TAW: Desarrollado por la Fundación CTIC. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-26" title="navaja_suiza" src="http://alonsogarciapablo.com/blog/wp-content/uploads/2008/05/navaja_suiza.jpg" alt="" /></p>
<p>Con el objetivo de garantizar la accesibilidad de los contenidos Web, <strong>los desarrolladores deberíamos hacer uso de herramientas</strong> que faciliten esa labor, y sirvan para comprobar que los sitios son real y funcionalmente accesibles. En este post, quiero recopilar todas las herramientas que estamos viendo en clase.</p>
<p><span id="more-24"></span></p>
<h3>Validadores automáticos</h3>
<ul>
<li><a class="externo" title="Enlace al Test de Accesibilidad Web" href="http://www.tawdis.net/"><acronym title="Test de Accesibilidad Web">TAW</acronym></a>: Desarrollado por la <a title="Enlace a la página de la Fundación CTIC class=" href="http://www.fundacionctic.org/"> Fundación CTIC</a>.</li>
<li><a class="externo" title="Validador de accesibilidad HERA" href="http://www.sidar.org/hera/">Hera</a>: Responsabilidad de la <a title="Enlace a la página de la Fundación Sidar" href="http://www.sidar.org/">Fundación Sidar</a>.</li>
<li><a title="Validador de accesibilidad WAVE" href="http://wave.webaim.org/">WAVE</a>: Por <a title="Enlace a Web Accessibility in Mind" href="http://webaim.org/">WebAIM: Web Accessibility in Mind</a>.</li>
</ul>
<h3>Complementos para Firefox</h3>
<ul>
<li><a class="externo" title="Complemento TAW para firefox" href="http://www.tawdis.net/taw3/cms/es/herramientas/extension.html">TAW en un clic</a>.</li>
<li><a class="externo" title="Complemento HERA para firefox" href="http://www.sidar.org/extension/#heraextension">Hera Extension</a>.</li>
<li><a class="externo" title="Sitio del Web Developer para firefox" href="https://addons.mozilla.org/es-ES/firefox/addon/60">Web Developer Toolbar</a>.</li>
</ul>
<h3>Amplificadores y lectores de pantalla</h3>
<ul>
<li><a class="externo" title="Magnificador de pantalla Zoom Text" href="http://www.aisquared.com/Products/ZoomTextMRD/index.cfm">Zoomtext</a></li>
<li><a class="externo" title="Lector de pantalla JAWS" href="http://www.freedomscientific.com/fs_products/software_jaws.asp">Jaws</a>. Impresiona escuchar esa voz sintentizada.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/accesibilidad-web-herramientas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accesibilidad Web: Resúmen de lo más importante</title>
		<link>http://alonsogarciapablo.com/blog/accesibilidad-web-resumen-de-lo-mas-importante/</link>
		<comments>http://alonsogarciapablo.com/blog/accesibilidad-web-resumen-de-lo-mas-importante/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 08:05:04 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[accesibilidad]]></category>
		<category><![CDATA[ATAG]]></category>
		<category><![CDATA[UUAG]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[WAI]]></category>
		<category><![CDATA[WCAG]]></category>

		<guid isPermaLink="false">http://www.alonsogarciapablo.com/accesibilidad-web-resumen-de-lo-mas-importante/</guid>
		<description><![CDATA[En el Máster en Ingeniería Web que estoy estudiando, tenemos una asignatura titulada: Usabilidad, Accesibilidad y Adaptibilidad de la Web. De primero, estamos repasando todos los conceptos, recursos, etc. relacionados con la Accesibilidad Web. Escribo este post, a modo de apuntes personales, para afianzar bien los conceptos importantes sobre Accesibilidad y recopilar enlaces a documentación [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://www15.uniovi.es/master/ingenieriaweb/" title="Página del Máster en Ingenería Web de la Universidad de Oviedo" class="externo">Máster en Ingeniería Web</a> que estoy estudiando, tenemos una asignatura titulada: <em>Usabilidad, Accesibilidad y Adaptibilidad de la Web.</em> De primero, estamos repasando todos los conceptos, recursos, etc. relacionados con la Accesibilidad Web. Escribo este post, a modo de apuntes personales, para afianzar bien los <strong>conceptos importantes sobre Accesibilidad</strong> y recopilar enlaces a documentación y recursos.</p>
<p><span id="more-19"></span></p>
<h3>¿Qué es la accesibilidad Web?</h3>
<p>Una de las definiciones más populares, por razones obvias, es aquella propuesta por <a href="http://es.wikipedia.org/wiki/Tim_Berners-Lee" title="Página de Wikipedia sobre Tim Berners-Lee" class="externo">Tim Berners-Lee</a>:</p>
<blockquote><p>“El arte de garantizar que cualquier<br />
recurso, a través de cualquier medio, esté disponible para todas las<br />
personas, tengan o no algún tipo de discapacidad&#8221;</p></blockquote>
<p>Como sabemos, no hablamos únicamente de personas ciegas, sino que debemos incluir en este grupo: personas que no distinguen bien los colores, con visión reducida, gente mayor, etc</p>
<h3>¿Qué es <acronym title="Web Accessibility Initiative">WAI</acronym>?</h3>
<p><a href="http://www.w3.org/WAI/" title="Web Accesibility Initiative" class="externo">Web Accesibility Initiative</a>, es una iniciativa del <a href="http://www.w3.org/" title="W3C" class="externo">W3C</a> que aboga por el cumplimiento global de las normas de accesibilidad. Se dividen en:</p>
<ul>
<li><a href="http://www.w3.org/TR/WCAG10/" class="externo"><acronym title="Web Content Accesibility Guidelines">WCAG</acronym></a>. Contenido web accesible.</li>
<li><a href="http://www.w3.org/TR/ATAG10/" class="externo"><acronym title="Authoring Tool Accesibility Guidelines">ATAG</acronym></a>. Herramientas de Autor (como Dreamweaver y FrontPage) accesibles y que generen código accesible.</li>
<li><a href="http://www.w3.org/TR/UAAG10/" class="externo"><acronym title="User Agent Accesibility Guidelines">UAAG</acronym></a>. Navegadores y herramientas multimedia accesibles.</li>
</ul>
<p>La siguiente imagen, resume lo expuesto anteriormente:<br />
<img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2008/04/specs1.png" alt="Ilustración que resume el objetivo de la Web Accesibility Initiative" class="aligncenter size-full wp-image-20" /></p>
<h3>&#8220;A&#8221;, &#8220;Doble-A&#8221; (AA), y &#8220;Triple-A&#8221; (AAA)</h3>
<p>Las normas, están divididas en checkpoints o puntos de verificación, cada uno de los cuales tiene asociado una <a href="http://www.w3.org/TR/WAI-WEBCONTENT/#priorities" title="Prioridades de las normas de Accesibilidad" class="externo">prioridad</a>, en función de su impacto en la accesibilidad de los contenidos:</p>
<ul>
<li>Prioridad 1: El desarrollador <strong>tiene </strong>que satisfacer este punto de control.</li>
<li>Prioridad 2: El desarrallador <strong>debe </strong>satisfacer el punto de control.</li>
<li>Prioridad 3: El desarrollador <strong>puede </strong>satisfacer el punto de control.</li>
</ul>
<p>Esto significa que, lo mínimo que debería hacer un desarrollador, es cumplir los checkpoints de prioridad 1. Así, aparecen 3 niveles de conformidad de los contenidos Web:</p>
<ul>
<li><strong>Nivel de conformidad &#8220;A&#8221;</strong>:  Se cumplen todos los puntos de verificación de Prioridad 1;</li>
<li><strong>Nivel de conformidad </strong><strong>&#8220;Doble-A&#8221;</strong>:  Se cumplen todos los puntos de verificación de Prioridad 1 y 2;</li>
<li><strong>Nivel de conformidad </strong><strong>&#8220;Triple-A&#8221;</strong>: Se cumplen los puntos de Prioridad 1, 2, y 3.</li>
</ul>
<p>Actualmente, los sitios Web de la administración pública, deberían tener el nivel de conformidad &#8220;Doble-A&#8221;.</p>
<h3>La ley española</h3>
<p>Lo que interesa ahora, sobre todo a las administracions públicas, que pueden ser sancionadas, es la <a href="http://www.boe.es/g/es/bases_datos/doc.php?coleccion=iberlex&amp;id=2007/22293" class="externo">LEY 49/2007, de 26 de diciembre, por la que se establece el régimen de infracciones y sanciones en materia de igualdad de oportunidades, no discriminación y accesibilidad universal de las personas con discapacidad</a>.</p>
<h3>Otras normas y leyes importantes</h3>
<ul>
<li>La norma Española <a href="http://www.inteco.es/Accesibilidad/Normativa_1/Descarga/DescargaUNE_http://www.inteco.es/Accesibilidad/Normativa_1/Descarga/DescargaUNE_139803" title="Enlace a fichero PDF con la Norma UNE 139803:2004" class="externo">UNE 139803:2004</a>, de <a href="http://www.aenor.es/" title="Enlace a la página de la Asociación Española de Normalización y Certificación" class="externo">AENOR</a>, compatible con las directrices <em>WAI</em>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/accesibilidad-web-resumen-de-lo-mas-importante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

