<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>programania</title>
	
	<link>http://www.programania.net</link>
	<description>Ingeniería del Software</description>
	<lastBuildDate>Tue, 30 Jun 2009 14:41:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Programania" type="application/rss+xml" /><item>
		<title>Sale la versión definitiva de PHP 5.3</title>
		<link>http://www.programania.net/php/sale-la-version-definitiva-de-php-5-3/</link>
		<comments>http://www.programania.net/php/sale-la-version-definitiva-de-php-5-3/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 14:41:20 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP 6]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[ZEND FRAMEWORK]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[php closures]]></category>
		<category><![CDATA[php namespaces]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=729</guid>
		<description><![CDATA[publicado php 5.3 con todas sus novedades]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://bolsadeideas.cl/zsamer/2009/06/php-530-liberado/">blogosfera ya comienza a hacerse eco</a>, y se puede descargar <a href="http://php.net/downloads.php#v5.3.0">aquí</a>. Recordemos que ésta versión trae mayor velocidad, nuevas características de POO, closures, namespaces, y todo de lo que ya hemos hablado por aquí.</p>
<p>Recordemos también que <a href="http://www.programania.net/patrones-de-diseno/zend-framework-20-no-sera-compatible-hacia-atras/">comienza la cuenta atrás para la llegada de Zend Framework 2.0</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/xcmZvwRTC1tNuIusFM0vwb6P3oU/0/da"><img src="http://feedads.g.doubleclick.net/~a/xcmZvwRTC1tNuIusFM0vwb6P3oU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xcmZvwRTC1tNuIusFM0vwb6P3oU/1/da"><img src="http://feedads.g.doubleclick.net/~a/xcmZvwRTC1tNuIusFM0vwb6P3oU/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/php/sale-la-version-definitiva-de-php-5-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integración continua en PHP: ¿ Xinc o phpUnderControl?</title>
		<link>http://www.programania.net/desarrollo-agil/integracion-continua-en-php-%c2%bf-xinc-o-phpundercontrol/</link>
		<comments>http://www.programania.net/desarrollo-agil/integracion-continua-en-php-%c2%bf-xinc-o-phpundercontrol/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 07:25:12 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[DESARROLLO DE SOFTWARE]]></category>
		<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[phpundercontrol]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[xinc]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=652</guid>
		<description><![CDATA[comparativa entre xinc y phpundercontrol: dos servidores de integración continua en PHP]]></description>
			<content:encoded><![CDATA[<p>Un servidor de integración continua es algo mucho más sencillo de lo que parece. Básicamente sólo se dedica a ejecutar un proceso periódicamente (cada cierto tiempo, o cada commit del repositorio) que automatiza el proceso de construcción del software (build). Para entendernos, uno podría programar un script de terminal que llamara al framework de pruebas unitarias, y al generador de la documentación y a los analizadores de métricas de código, etc&#8230; y que se ejecutara cada cierto tiempo mediante el cron, y con eso estaría haciendo integración continua. Siendo esto así, <strong>el servidor de integración continua es independiente del lenguaje en el que esté escrito el software que está integrando (t</strong>odo esto ya <a href="http://www.programania.net/desarrollo-agil/la-verguenza-de-la-ingenieria-del-software/#comment-15049">lo comentaba Blaxter en un post anterior de este blog</a>).</p>
<p>Sin embargo, me inclino por utilizar un servidor de integración continua específico para PHP. Y es que estos aportan soporte específico para herramientas de PHP como phpUnit, phpDocumentor, etc&#8230; con lo que simplifica mucho la configuración y, sobre todo, la visualización de los resultados obtenidos (Front End). Como siempre, dentro del software libre, tenemos bastantes soluciones de calidad variable. Para mí destacan principalmente dos: <a href="http://code.google.com/p/xinc/">Xinc</a> y <a href="http://phpundercontrol.org/about.html">phpUnderControl</a>.</p>
<p>phpUnderControl es una adaptación de Cruise Control a PHP. Cruise Control es el servidor de integración continua (originalmente para Java, pero ahora con versión para .NET, Ruby, etc.) con una comunidad de desarrolladores más grande y activa. Como consecuencia, tiene una enorme cantidad de documentación y de extensiones desarrolladas. Para funcionar, utiliza herramientas típicas de Java como Ant, etc. aunque a efectos prácticos, configurar un proyecto para utilizarlo con CruiseControl es escribir un XML.</p>
<p>Xinc significa Xinc is not CruiseControl. Como se puede ver por su propio nombre, nace como alternativa a phpUnderControl. Su idea es crear una herramienta más específica para el desarrollo en PHP, escrita en PHP y que, por ejemplo, utilice Phing (el Ant de PHP) en vez del propio Ant. A efectos prácticos, también supone escribir un XML. Una de sus ventajas es que <strong>no necesita Java</strong>, así que puede funcionar en un LAMP necesidad de instalar nada más. Su comunidad de desarrolladores es mucho menor que la de CruiseControl, pero también es más específica para PHP.</p>
<p>Finalmente, <a href="http://www.programania.net/david-gonzalez/">David</a> y yo nos hemos inclinado por phpUnderControl, por varias razones:</p>
<ul>
<li> Más documentación y extensiones desarrolladas. He sufrido muchas veces la falta de documentación. Da igual lo potente que sea un framework, herramienta o servidor: si la documentación no es extensa y rica en detalles.. no sirve.</li>
<li>Desde el momento en que nuestras pruebas funcionales van en Selenium,  ya necesitamos instalar Java&#8230; así que la posibilidad de utilizar un LAMP sin nada más desaparece.</li>
<li>Aprendiendo Selenium y CruiseControl no solo aprendemos integración continua específica para PHP, sino que también obtenemos conocimientos aplicables a Java u otros lenguajes. Aprender Phing sólo es útil en PHP&#8230;</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/P-xP__MSR7my-pylv7_p4oRyptU/0/da"><img src="http://feedads.g.doubleclick.net/~a/P-xP__MSR7my-pylv7_p4oRyptU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/P-xP__MSR7my-pylv7_p4oRyptU/1/da"><img src="http://feedads.g.doubleclick.net/~a/P-xP__MSR7my-pylv7_p4oRyptU/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/integracion-continua-en-php-%c2%bf-xinc-o-phpundercontrol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Control de las funcionalidades de un producto con Google Docs</title>
		<link>http://www.programania.net/desarrollo-agil/control-de-las-funcionalidades-de-un-producto-con-google-docs/</link>
		<comments>http://www.programania.net/desarrollo-agil/control-de-las-funcionalidades-de-un-producto-con-google-docs/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 07:17:59 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[gestión de proyectos]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[increment]]></category>
		<category><![CDATA[iteration backlog]]></category>
		<category><![CDATA[product backlog]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=664</guid>
		<description><![CDATA[Gestión funcional con google Docs]]></description>
			<content:encoded><![CDATA[<p>Animado por el artículo de Enrique sobre <a href="http://phpsenior.blogspot.com/2009/06/google-docs-para-gestionar-proyectos.html">el uso de Google Docs para la gestión funcional de un proyecto</a>, publico un artículo que llevaba tiempo pensando sobre cómo lo estoy haciendo yo ahora mismo. Obviamente, el sistema que os expongo está basado en SCRUM, aunque no me atrevería a decir que estoy &#8220;haciendo SCRUM&#8221; precisamente. Si los términos que utilizo en el artículo (Product Backog, Iteration Backlog, etc&#8230;) te son nuevos, <a href="http://www.navegapolis.net/content/view/694/">quizá te interese leerte éste estupendo libro de introducción a SCRUM</a>. La captura que muestro a continuación, como se puede ver claramente, es inventada.</p>
<p><a href="http://www.programania.net/wp-content/uploads/captura-backlog2.jpg"><img class="alignnone size-full wp-image-694" title="captura-backlog" src="http://www.programania.net/wp-content/uploads/captura-backlog2.jpg" alt="captura-backlog" width="580" height="353" /></a></p>
<p>La razón por la que utilizamos Google Docs y no la clásica pizarra de SCRUM es porque el equipo no se encuentra físicamente en el mismo sitio. Quizá en el futuro utilicemos herramientas más específicas para la gestión de las user stories, iteration backlog e increment &#8230; pero a día de hoy éste sistema nos está funcionando por lo sencillo y visual que es.</p>
<p>El <a href="http://www.programania.net/desarrollo-agil/gestion-de-proyectos-objetivos/">objetivo de la gestión es planificar, ejecutar y controlar</a>. Veamos a continuación cómo planificamos, ejecutamos y controlamos el valor funcional de la aplicación.</p>
<p>Algunos apuntes sobre la <strong>ejecución</strong>:</p>
<ul>
<li>El documento recoge tanto el Iteration Backlog como el Increment. Pero es un documento que sólo ve el equipo. El cliente puede ver el Product Backlog (que está en un documento a parte) y se le envía una versión &#8220;más redactada&#8221; del Increment.</li>
<li>Cada iteración está en una tabla. Las tablas se guardan todas en el mismo documento, de tal manera que si vamos bajando por el documento podremos ver el backlog de las anteriores iteraciones. Las iteraciones se nombran con el primer día que se ejecutan (Iteración 18-05-2009) . Suelen ser de dos semanas.</li>
<li>Todos los proyectos son gestionados desde el mismo Iteration Backlog.</li>
<li>Marcamos la prioridad de una funcionalidad dentro de una iteración con <strong>[1]</strong>,<strong>[2]</strong> y <strong>[3]</strong>.</li>
<li>Se puede saber en qué estado está una Iteración porque:
<ul>
<li>Si está a la izquierda y sólo pone la prioridad([1]), es que está <strong>sin empezar</strong>.</li>
<li>Si está a la izquierda pero pone la prioridad  y un dueño ([1][Luis]), es que <strong>está empezada</strong> y la está haciendo Luis.</li>
<li>Si está a la derecha, es que <strong>está terminada</strong>.</li>
</ul>
</li>
<li>En el incremento, además de los items terminados en la iteración, se añaden los unplanned items (<strong>[U]</strong>), defectos (<strong>[D]</strong>) y cuestiones técnicas abordadas (<strong>[T]</strong>). Supongo que para los defectos sería mucho mejor utilizar un Issue Tracker, pero normalmente los clientes suelen querer comunicarse solo por teléfono, y bastante cuesta ya hacerles escribir un mail&#8230; como para intentar que se peguen con un Issue Tracker&#8230;</li>
<li>Los <strong>defectos tienen siempre prioridad</strong> sobre el desarrollo de nuevas funcionalidades.</li>
<li>La <strong>trazabilidad</strong> del proyecto es enorme, no sólo porque así tenemos un histórico de todas las iteraciones, sino porque el Google Docs guarda versiones de cada cambio que se hace.. así que podríamos retrotraernos a cualquier situación pasada del documento.</li>
</ul>
<p>Forma de detectar cómo va la iteración (<strong>controlar</strong>):</p>
<ul>
<li>Si se están generando muchos Unplanned Items (<strong>[U]</strong>) es que algo se diseñó mal.</li>
<li>Si se están generando muchos Defectos (<strong>[D]</strong>) es que la aplicación no está suficientemente probada.</li>
<li>Si se están atacando funcionalidades de prioridad [2] sin haber terminado las de prioridad [1], o se están atacando funcionalidades sin haber corregido los Defectos, probablemente se esté programando en el orden incorrecto.</li>
<li>Otras cuestiones muy relacionadas con las funcionalidades, las iteraciones, sería el <strong>control de costes y plazos</strong>: lo voy a dejar fuera del artículo por no extenderme.</li>
</ul>
<p>Algunos apuntes sobre <strong>planificación</strong> de las funcionalidades que se incluyen en cada iteración. En cada iteración se meten una serie de funcionalidades de el/los Product Backlog. Esas funcionalides cumplen que:</p>
<ul>
<li>Es la mayor cantidad de funcionalidades que se pueden hacer en dos semanas.</li>
<li>Son las funcionalidades que más valor añaden a la aplicación.</li>
<li>Camino crítico: desarrollar esas funcionalidades ayudan a descubrir posibles nuevos requisitos de forma lo más temprana posible (aunque no sea la que más valor añade), eliminar incertidumbres y hacer pensar al cliente (feedback) en qué es lo que quiere realmente. Esto también puede incluir desarrollar funcionalidades que ayuden a descubrir el diseño técnico (orientación a objetos, patrones de diseño) de la aplicación.</li>
<li>La que el cliente exija (a veces no hay más remedio: hay que implementar funcionalidades que el cliente exija aunque se le argumente que no son las que más valor añaden o las que más ayudan a descubrir la forma exacta de la aplicación).</li>
<li>Se evita programar funcionalides que no puedan probarse o ponerse en producción cuanto antes. Ejemplo: &#8220;Informe anual de ventas&#8221;, implementar éste informe en la primera iteración del producto, cuando todavía la empresa no ha introducido ni una sola venta, hará que no pueda probarse correctamente y traerá problemas meses después.</li>
<li>Resolver defectos tiene más prioridad que desarrollar nuevas funcionalidades, aunque dependerá de la gravedad del defecto. Los defectos son difíciles de planificar porque no sabes ni cuando ni cómo saldrán.</li>
<li>Es importante saber dividir o juntar funcionalidades para poder adaptarlas al tamaño de la iteración. No sirve para nada hacer &#8220;Listar facturas&#8221;, si no tienes un &#8220;añadir facturas&#8221;. Deberán ir en la misma iteración. Quizá &#8220;buscar facturas&#8221; pueda ir en la siguiente iteración, pese a que todo ello fuera planificado originalmente como &#8220;gestionar facturas (listar, añadir, modificar, eliminar, buscar)&#8221;.</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/PLuDO1Pe_y4zysKbPv8cNHO1VOY/0/da"><img src="http://feedads.g.doubleclick.net/~a/PLuDO1Pe_y4zysKbPv8cNHO1VOY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/PLuDO1Pe_y4zysKbPv8cNHO1VOY/1/da"><img src="http://feedads.g.doubleclick.net/~a/PLuDO1Pe_y4zysKbPv8cNHO1VOY/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/control-de-las-funcionalidades-de-un-producto-con-google-docs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gestión de proyectos: objetivos</title>
		<link>http://www.programania.net/desarrollo-agil/gestion-de-proyectos-objetivos/</link>
		<comments>http://www.programania.net/desarrollo-agil/gestion-de-proyectos-objetivos/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 07:19:00 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[DESARROLLO DE SOFTWARE]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[gestión de proyectos]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=516</guid>
		<description><![CDATA[gestión de proyectos, una definición muy básica]]></description>
			<content:encoded><![CDATA[<p>A continuación, un esquema MUY básico sobre lo que es la gestión de proyectos, que utilizaré en artículos posteriores para divagar un rato sobre metodologías ágiles e ingeniería del software.  <img src='http://www.programania.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Un proyecto es:</p>
<div>
<ol>
<li>un conjunto de <strong>recursos</strong> limitados (personas, ordenadores, etc.)</li>
<li>que realizan una serie de <strong>actividades</strong> interrelacionadas</li>
<li>para conseguir un <strong>objetivo</strong>.</li>
</ol>
</div>
<div></div>
<div>La gestión sobre un proyecto busca:</div>
<div>
<ul>
<li>definir el proyecto (recursos, actividades y objetivos)</li>
<li>ejecutarlo</li>
<li>controlarlo</li>
</ul>
</div>
<div>La gestión del proyecto se divide en:</div>
<ul>
<li>Gestión de la integración del proyecto.</li>
<li>Gestión de costes.</li>
<li>Gestión de la calidad.</li>
<li>Gestión de tiempos y agendas.</li>
<li>Gestión del alcance del proyecto.</li>
<li>Gestión de la comunicación en el proyecto (incluido el cliente).</li>
<li>Gestión de la transmisión del conocimiento (pair programming, empowerment).</li>
<li>Gestión de los riesgos.</li>
<li>Gestión de proveedores.</li>
</ul>
<p>La madurez del proceso se mide por:</p>
<ul>
<li>repetitividad de resultados</li>
<li>Escalabilidad</li>
<li>Mejora contínua</li>
<li>know-how propio</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/ttZjNLletXOJtTEsSZxY56O5EyM/0/da"><img src="http://feedads.g.doubleclick.net/~a/ttZjNLletXOJtTEsSZxY56O5EyM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ttZjNLletXOJtTEsSZxY56O5EyM/1/da"><img src="http://feedads.g.doubleclick.net/~a/ttZjNLletXOJtTEsSZxY56O5EyM/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/gestion-de-proyectos-objetivos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pruebas unitarias y funcionales en PHP</title>
		<link>http://www.programania.net/desarrollo-agil/pruebas-unitarias-y-funcionales-en-php/</link>
		<comments>http://www.programania.net/desarrollo-agil/pruebas-unitarias-y-funcionales-en-php/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 07:04:51 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[TDD - Test Driven Development]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[ZEND FRAMEWORK]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[mock objects]]></category>
		<category><![CDATA[mockery phpt]]></category>
		<category><![CDATA[php spec]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[SELENIUM]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[zend_test]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=609</guid>
		<description><![CDATA[Técnicas y frameworks de pruebas unitarias en PHP]]></description>
			<content:encoded><![CDATA[<div>A continuación dejo unos cuantos recursos que recorren todo lo relacionado con las pruebas unitarias y funcionales en PHP.</div>
<p>Los principales frameworks de pruebas unitarias en PHP:</p>
<ul>
<li><a href="http://www.phpunit.de/">phpUnit</a>.</li>
<li><a href="http://www.simpletest.org/">SimpleTest</a>.</li>
<li><a href="http://qa.php.net/write-test.php">phpt</a></li>
</ul>
<p>Comparartivas:</p>
<ul>
<li><a href="http://weierophinney.net/matthew/archives/64-PHP-Unit-Tests-and-the-winner-is-phpt.html">phpt versus phpUnit</a>.</li>
<li><a href=" http://blog.astrumfutura.com/archives/317-Mocks,-Stubs,-And-SimpleTest-Wins.html">SimpleTest versus phpunit</a>.</li>
<li>S<a href="http://baphled.wordpress.com/2009/01/28/simpletest-vs-phpunit/">impleTest versuss phpunit 2</a>.</li>
</ul>
<p>Pruebas funcionales:</p>
<ul>
<li>Z<a href="http://framework.zend.com/manual/en/zend.test.html">end_Test, extensión e phpUnit para probar el MVC del Zend Framework</a>.</li>
<li><a href="http://devzone.zend.com/article/2242-Acceptance-Testing-of-Web-Applications-with-PHP">Acceptance test in php with Selenium</a>.</li>
</ul>
<p>Integración continua:</p>
<ul>
<li><a href="http://phpundercontrol.org/about.html">phpUnderControl</a></li>
<li><a href="http://www.atlassian.com/software/bamboo/">Bamboo</a></li>
<li><a href="http://rephlux.sourceforge.net/">Rephlux</a></li>
<li><a href="http://code.google.com/p/xinc/">Xinc</a></li>
</ul>
<p>Extra point:</p>
<ul>
<li><a href="http://code.google.com/p/phpspec/">phpSpec: Behaviour Driven Development (BDD) en PHP</a>.</li>
<li><a href=" http://sebastian-bergmann.de/archives/509-Mock-Objects-in-PHPUnit.html">Mock Objects in phpUnit.</a></li>
<li><a href="http://blog.astrumfutura.com/archives/392-The-Mockery-An-Independent-Mock-Object-and-Stub-Framework-for-PHP5.html">Mockery: an independent Mock and Stub framework for PHP.</a></li>
<li><a href="http://www.programania.net/desarrollo-agil/%C2%BFpruebas-unitarias-mutantes/">Pruebas unitarias mutantes.</a></li>
<li><a href="http://www.ds-o.com/archives/62-PHPDBUnit-Testing-DB-interaction-with-PHPUnit.html">Pruebas unitarias y base de datos.</a></li>
</ul>
<p><strong>Mi elección es phpUnit.</strong> Y es que pese a que es verdad que su mecanismo para Mock Objects es peor que el de SimpleTest, y que escribir pruebas es más pesado que en phpT, es el framework de pruebas unitarias en PHP que elige Zend Framework (y su Zend_Test) y su creador (Sebastian Bergmann) es el que más activamente está desarrollando extensiones para base de datos, etc&#8230; así que, si todavía tienen puntos débiles, con el tiempo será el aceptado por todo el mundo. Además,  Bergmann es el principal promotor de phpUnderControl, el framework de integración continua que hemos decidido utilizar <a href="http://www.programania.net/david-gonzalez/">David</a> y yo (ya explicaremos más ampliamente en su momento el por qué).</p>

<p><a href="http://feedads.g.doubleclick.net/~a/6s_lWCiL5YDRhpYragEMoSVIDmA/0/da"><img src="http://feedads.g.doubleclick.net/~a/6s_lWCiL5YDRhpYragEMoSVIDmA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6s_lWCiL5YDRhpYragEMoSVIDmA/1/da"><img src="http://feedads.g.doubleclick.net/~a/6s_lWCiL5YDRhpYragEMoSVIDmA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/pruebas-unitarias-y-funcionales-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integración continua: objetivos</title>
		<link>http://www.programania.net/desarrollo-agil/integracion-continua-objetivos/</link>
		<comments>http://www.programania.net/desarrollo-agil/integracion-continua-objetivos/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 07:04:16 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[WEBDEV]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=595</guid>
		<description><![CDATA[Como ayuda la integración continua a la ingeniería del software]]></description>
			<content:encoded><![CDATA[<div>Ya nadie discute las ventajas de desarrollar software de manera iterativa e incremental. En cada iteración, se recorre el flujo completo de desarrollo de un programa:</div>
<div>
<ul>
<li>Análisis &#8211;&gt; diseño &#8211;&gt; Implementacion &#8211;&gt; <a href="http://www.programania.net/diseno-de-software/tipos-de-pruebas-automatizadas-de-software/">Pruebas</a> &#8211;&gt; Despliegue.</li>
</ul>
</div>
<p>En cada iteración, las fases de Análisis &#8211;&gt; Diseño &#8211;&gt; Implementación, se harán SOLO para las nuevas funcionalidades. Si las fases de Pruebas &#8211;&gt; Despliegue se hacen también SOLO para las nuevas funcionalidades, se caerá inevitablemente en <a href="http://www.programania.net/desarrollo-agil/la-verguenza-de-la-ingenieria-del-software/">la vergüenza de la Ingeniería del Software</a>. Así que, <strong>en cada iteración, todas las funcionalidades de la aplicación deben ser probadas antes del despliegue. </strong>Pero no sólo eso, antes del despliegue, también <a href="http://www.programania.net/desarrollo-agil/metricas-para-la-calidad-del-software/">deberán aplicarse una serie de métricas, y realizar tareas como generar la documentación</a> para controlar la calidad del software.</p>
<div>O sea que, las funcionalidades <strong>f1</strong> desarrolladas en la primera iteración <strong>I1 </strong>deberán ser probadas en la N iteraciones posteriores que se planifiquen durante el desarrollo.</div>
<div style="padding-left: 30px;"><em>Iteración &#8211;&gt; funcionalidades a probar</em></div>
<div style="padding-left: 30px;"><em>I1 &#8211;&gt; </em><strong><em>f1</em></strong></div>
<div style="padding-left: 30px;"><em>I2 &#8211;&gt; </em><strong><em>f1</em></strong><em>,f2</em></div>
<div style="padding-left: 30px;"><em>I3 &#8211;&gt; </em><strong><em>f1</em></strong><em>,f2,f3</em></div>
<div style="padding-left: 30px;"><em>I4 &#8211;&gt;</em><strong><em> f1</em></strong><em>,f2,f3,f4</em></div>
<div></div>
<div>El coste de probar las funcionalides desarrolladas en la fase 1 (f1) se multiplica por el número de iteraciones N. <strong>Es un coste inasumible.</strong></div>
<div></div>
<div><strong><br />
</strong></div>
<div>¿Cómo mejorar éste proceso? Haciendo que <strong>el coste de probar unas funcionalides se reduzca a cero</strong>. (O más bien, se reduzca a la propia implementación de las pruebas en su fase correspondiente).</div>
<div></div>
<div>Un servidor de integración continua tiene como objetivo automatizar el proceso de integración entre el código desarrollado por los diferentes programadores del proyecto, ejecutar todas las pruebas sobre ese código, aplicar todas las métricas y ser capaz de desplegar la aplicación. De tal manera que la integración de funcionalidades nuevas, prueba de todas las funcionalidades, aplicación de métricas o generación de documentación <strong>ya no ocurre iterativamente ni se hace manualmente</strong>, sino que son procesos que se ejecutan continuamente y de manera automatizada.</div>
<div></div>
<div>Como ayuda la integración continua a la ingeniería del software (<a href="http://www.programania.net/diseno-de-software/reflexiones-sobre-la-ingenieria-de-software/">entendida como maximizar calidad y minimizar coste</a>):</div>
<ul>
<li>minimizar el coste de desarrollo 1: evitar que el coste de las pruebas de las funcionalidades de la iteración 1 (f1) en la iteración N sea = f1*N.</li>
<li>minimizar el coste de desarrollo 2: detección y solución temprana de problemas (colisiones entre lo desarrollado por dos programadores, colisión con funcionalidades anteriores, etc.), si se integra cada semana, un desarrollador puede pasarse una semana entera desarrollando algo que choca contra otra cosa codificada por otro desarrollador, haciendo inútil todas sus horas de trabajo.</li>
<li>maximizar la calidad: evitando entregar versiones donde el código nuevo puede haber estropeado el que ya funcionaba.</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/6Lr7HkD00bCw-WRBGNtjAwAyBxE/0/da"><img src="http://feedads.g.doubleclick.net/~a/6Lr7HkD00bCw-WRBGNtjAwAyBxE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6Lr7HkD00bCw-WRBGNtjAwAyBxE/1/da"><img src="http://feedads.g.doubleclick.net/~a/6Lr7HkD00bCw-WRBGNtjAwAyBxE/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/integracion-continua-objetivos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Métricas para la calidad del software</title>
		<link>http://www.programania.net/desarrollo-agil/metricas-para-la-calidad-del-software/</link>
		<comments>http://www.programania.net/desarrollo-agil/metricas-para-la-calidad-del-software/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 07:10:52 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[DESARROLLO DE SOFTWARE]]></category>
		<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[calidad del software]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[cyclomatic complexity]]></category>
		<category><![CDATA[npath complexity]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=626</guid>
		<description><![CDATA[Métricas como cyclomatic complexity, code coverage, cohesión y acoplamiento que ayudan  a maximizar la calidad del software]]></description>
			<content:encoded><![CDATA[<p>Definí una vez la ingeniería del software es<a href="http://www.programania.net/diseno-de-software/reflexiones-sobre-la-ingenieria-de-software/"> aquel conocimiento específico que busca maximizar la calidad del software y minimizar su coste</a>. Siguiendo con esa misma idea: ¿Cómo se podría maximizar la calidad del código escrito (<strong>incluyendo su diseño</strong>)? Los pasos básicos serían:</p>
<ol>
<li>establecer una serie de métricas (variables a maximizar o minimizar) sobre el código. Sólo nos sirve aquello que podamos medir.</li>
<li>montar un sistema automático que genere información sobre esas variables y su evolución a lo largo del desarrollo (<a href="http://www.programania.net/category/integracion-continua/">integración continua</a>).</li>
<li>aplicar medidas sobre el código y observar si se consigue maximizar o minimizar la variable objetivo</li>
</ol>
<p>Muchas de las medidas que maximizan la calidad producen como efecto colateral una diminución en el coste, y viceversa. Tradicionalmente se piensa que aumentar la calidad es aumentar el coste en tiempo. Pero muchas veces el tiempo invertido en aumentar la calidad (robusto, flexible, mantenible, escalable) repercute en el futuro en un menor coste de desarrollo o mantenimiento.</p>
<p>Valores abstractos del software:</p>
<ul>
<li><strong>Robusto</strong>: libre de errores.</li>
<li><strong>Flexible</strong>: permite reutilización y adaptación a nuevos requisitos.</li>
<li><strong>Mantenible</strong>: permite entender el código tiempo después de haber sido escrito y/o por personas que no lo escribieron (estándares de sintaxis y documentación).</li>
<li><strong>Escalabilidad y rendimiento</strong>: al aumentar el número de usuarios, el rendimiento no disminuye exponencialmente.</li>
<li><strong>Seguridad</strong>: existen herramientas que enfrentan a tu código a una base de datos de vulnerabilidades conocidas.</li>
</ul>
<p>Las variables medibles (métricas) que pongo a continuación están centradas en el código, no en la gestión de proyectos (no se incluyen métricas como &#8220;esfuerzo del equipo&#8221;, etc&#8230;). Tampoco en temas propiamente web como la accesibilidad ni el diseño de interfaces (usabilidad).</p>
<ul>
<li><strong>Número de lineas de código</strong>: tiene una utilidad limitada. Depende de la forma de escribir el código, la misma sentencia se puede escribir en una o varias lineas, en diferentes lenguajes la misma funcionalidad puede tener diferente cantidad de lineas, etc. Pero si se utiliza para comprar el número de lineas de código entre dos versiones del mismo software, se puede observar si el crecimiento en lineas de código es lineal o no. Si no lo es, puede valer la pena investigar por qué.</li>
<li><strong>Cyclomatic Complexity y </strong><strong>Npath Complexity</strong>: se trata de analizar todos los caminos que llevan al mismo código y medir cuantos caminos hay. Da una medida de la reutilización que se hace del código. No se busca ni maximizarla ni minimizarla, sino mantenerla entorno a una cifra.</li>
<li><strong>Code coverage</strong>: porcentaje de código cubierto por las pruebas. Se aplica de forma práctica en las pruebas unitarias. Los principales frameworks xUnit dan datos de code coverage. Se busca maximizarla.</li>
<li><strong>Cohesion</strong>:  mide la relación entre las responsabilidades de las clases de un mismo módulo.  Se busca maximizarla.</li>
<li><strong>Acoplamiento</strong>: Si dos clases están poco acopladas, si se hace un cambio en una de las clases repercutirá poco o nada en la otra clase. Si están muy acopladas, un cambio en una clase supondrá cambios importantes en la otra. Se busca software con alta cohensión y  bajo acoplamiento. El acoplamiento se puede medir en función del número de imports (includes), extends, implements, que relaciona a unas clases y módulos con otras.</li>
</ul>
<p>Un software cuyo código tiene una cohesión alta, un acoplamiento bajo, tiene un alto porcentaje de código cubierto por pruebas unitarias y/o funcionales, tiene código que se reutiliza desde diferentes partes y cuyas lineas crecen de manera controlada, es un código que permitirá añadir funcionalidades facilmente (reduciendo el coste de añadirlas) y permitirá mantener más fácilmente el código existente.</p>
<ul></ul>
<p>Algunas herramientas para aplicar métricas sobre el software:</p>
<ul>
<li><a href=" http://www.pdepend.org/documentation/software-metrics.html">PHP Depend</a></li>
<li><a href="http://pmd.sourceforge.net/">Project Mess Detection</a></li>
</ul>
<p>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/AGpQ_E4HmQB9tAZ0Vf5anUEyzLM/0/da"><img src="http://feedads.g.doubleclick.net/~a/AGpQ_E4HmQB9tAZ0Vf5anUEyzLM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/AGpQ_E4HmQB9tAZ0Vf5anUEyzLM/1/da"><img src="http://feedads.g.doubleclick.net/~a/AGpQ_E4HmQB9tAZ0Vf5anUEyzLM/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/metricas-para-la-calidad-del-software/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>¿Cuales son los factores más importantes a la hora de decidirse por una metodología?</title>
		<link>http://www.programania.net/desarrollo-agil/%c2%bfcuales-son-los-factores-mas-importantes-a-la-hora-de-decidirse-por-una-metodologia/</link>
		<comments>http://www.programania.net/desarrollo-agil/%c2%bfcuales-son-los-factores-mas-importantes-a-la-hora-de-decidirse-por-una-metodologia/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 10:03:20 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[WEBDEV]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=646</guid>
		<description><![CDATA[Factores que más influyen a la hora de configurar la metodología de desarrollo a utilizar.]]></description>
			<content:encoded><![CDATA[<p>Creo que a día de hoy está asumido ya que dentro de las metodologías de desarrollo de software hay una serie de &#8220;buenas prácticas&#8221; que se pueden/deben aplicar <strong>en función del tipo de escenario en el que nos encontremos</strong>. Me he dado cuenta de que muchas veces los problemas que tengo a la hora de desarrollar software vienen porque no estoy aplicando la política adecuada al escenario adecuado. Creo que los factores más a tener en cuenta, al menos en mi pequeño mundo son:</p>
<ul>
<li><strong>Tipo de cliente</strong>: no es lo mismo si es un profano del desarrollo de software que, además, no usa apenas internet ni ordenadores, o si es un usuario habitual de internet y ordenadores, o si es otro informático de otra empresa. No se habla en el mismo idioma, no se puede utilizar los mismos entregables (¿entenderá UML?) ni se puede utilizar el mismo proceso (a veces potenciar el feedback de alguien totalmente profano puede ser contraproducente).</li>
<li><strong>Tipo de solución:</strong> no es lo mismo instalar y configurar Magento (una solución e-commerce en PHP) y luego personalizarlo, que desarrollar &#8220;desde cero&#8221; un sistema de gestión de información. Para el primer caso no se me ocurriría utilizar pruebas unitarias o integració continua, mientras en el segundo caso es una buena idea.</li>
<li><strong>Tipo de presupuestado</strong>: coste fijo, coste por objetivos. Si se trata de un desarrollo dividido en objetivos, la mayoría de prácticas ágiles encajan a las mil maravillas. Sin embargo, en caso de ser un desarrollo a coste fijo, hay que tener mucho cuidado con &#8220;aceptar que los requisitos son siempre cambiantes&#8221; porque el coste del proyecto puede dispararse con facilidad.</li>
</ul>
<p>Un par de preguntas y, como siempre, me quedo a la espera de lo que escribáis en los comentarios:</p>
<ul>
<li>¿Qué factores os influyen más a la hora de configurar cómo será vuestro desarrollo?</li>
<li>¿Existe una matriz que relacione factores del escenario de desarrollo con metodologías o prácticas recomendadas? ¿Creéis que podría llegar a hacerse?</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/0usN4qkt9SsfZlL5jcQ19ChdCPA/0/da"><img src="http://feedads.g.doubleclick.net/~a/0usN4qkt9SsfZlL5jcQ19ChdCPA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/0usN4qkt9SsfZlL5jcQ19ChdCPA/1/da"><img src="http://feedads.g.doubleclick.net/~a/0usN4qkt9SsfZlL5jcQ19ChdCPA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/%c2%bfcuales-son-los-factores-mas-importantes-a-la-hora-de-decidirse-por-una-metodologia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tipos de pruebas automatizadas de software</title>
		<link>http://www.programania.net/diseno-de-software/tipos-de-pruebas-automatizadas-de-software/</link>
		<comments>http://www.programania.net/diseno-de-software/tipos-de-pruebas-automatizadas-de-software/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 07:27:27 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[DESARROLLO DE SOFTWARE]]></category>
		<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[pruebas de regresión]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=589</guid>
		<description><![CDATA[tipos de pruebas de software: unitarias, funcionales, de aceptación o de regresión]]></description>
			<content:encoded><![CDATA[<p>Hablaba el otro día sobre la<a href="http://www.programania.net/desarrollo-agil/la-verguenza-de-la-ingenieria-del-software/"> necesidad de utilizar un servidor de integración contínua en el desarrollo de una aplicación</a>, para poder entregar software con cierta garantía de calidad. Un servidor de integración continua se encarga de ejecutar una serie de <strong>procedimientos automatizados</strong> que chequean el código en busca de errores, aplicando métricas (sintaxis del código, etc.) y realizando tareas regulares como la documentación.</p>
<p>Centremonos en los tipos de pruebas:</p>
<ul>
<li><strong>Pruebas unitarias</strong>: se encargan de probar una clase en concreto, testeando cada uno de sus métodos y viendo si dados unos parámetros de entrada, la salida es la esperada.</li>
<li><strong>Pruebas funcionales</strong>: como su propio nombre indican, prueban una funcionalidad completa, donde pueden estar implicadas una o varias clases, la propia interfaz de usuario y, en el caso del desarrollo web, llamadas AJAX.</li>
<li><strong>Pruebas de regresión</strong>: son aquellas pruebas cuyo objetivo es comprobar por qué ha dejado de funcionar algo que ya funcionaba. El objetivo de las pruebas de regresión es no tener que &#8220;volver atrás&#8221;.</li>
<li><strong>Pruebas de aceptación</strong>: son pruebas funcionales, pero vistas directamente desde el cliente. Digamos que son aquellas pruebas que demuestran al cliente que la funcionalidad está terminada y funciona correctamente.</li>
<li><strong>Pruebas de integración</strong>: conjunto de pruebas unitarias, funcionales, de regresión y/o de aceptación que se realizan las probar el software. Incluye también comprobar que lo programado por los diferentes desarrollados no &#8220;choca&#8221; entre sí y que funcionará en un entorno real.</li>
</ul>
<p>Conceptos relacionados:</p>
<ul>
<li><strong>TDD &#8211; Test Driven Development</strong>: son pruebas unitarias que siguen el principio &#8220;test-first&#8221;. Esto es, la prueba unitaria se crea ANTES de crear la propia clase. La idea es que, al pensar en cómo probarás la clase, estás pensando en la propia clase desde el punto de vista de su interfaz (qué métodos tendrá y con qué parámetros), ayudando a desarrollar antes un mejor diseño. De ésta manera, además, te aseguras de que no exista ninguna clase que no esté probada.</li>
<li><strong>BDD &#8211; Behaviour Driven Development</strong>: sus defensores la consideran una evolución de TDD, con una forma de escribir las pruebas más centrada en el comportamiento (behaviour) que debe tener la clase.</li>
<li><strong>Code Coverage</strong>: métrica que mide la cantidad de código que está probado unitariamente.</li>
</ul>
<p>En un entorno de <a href="http://www.programania.net/category/integracion-continua/">integración continua</a>, las pruebas (unitarias, funcionales, etc.) y las métricas (code coverage, syntax check, etc.) se ejecutan de manera regular con el objetivo de probar que la evolución del software desarrollado funciona perfectamente, tanto para las <strong>funcionalidades nuevas como para aquellas que ya existían. Una de las claves es que las pruebas sean automatizadas, porque si se ejecutaran manualmente, el coste de hacerlo &#8220;continuamente&#8221; sería inabordable</strong>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Cxf_9IQwprYOCrtAQ5yf6TvgxTw/0/da"><img src="http://feedads.g.doubleclick.net/~a/Cxf_9IQwprYOCrtAQ5yf6TvgxTw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Cxf_9IQwprYOCrtAQ5yf6TvgxTw/1/da"><img src="http://feedads.g.doubleclick.net/~a/Cxf_9IQwprYOCrtAQ5yf6TvgxTw/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/diseno-de-software/tipos-de-pruebas-automatizadas-de-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¿Existe una metodología llamada Programación Extrema?</title>
		<link>http://www.programania.net/desarrollo-agil/%c2%bfexiste-una-metodologia-llamada-programacion-extrema/</link>
		<comments>http://www.programania.net/desarrollo-agil/%c2%bfexiste-una-metodologia-llamada-programacion-extrema/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 11:17:17 +0000</pubDate>
		<dc:creator>Luis Artola</dc:creator>
				<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[METODOLOGÍAS ÁGILES]]></category>
		<category><![CDATA[PRUEBAS FUNCIONALES]]></category>
		<category><![CDATA[PRUEBAS UNITARIAS]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[TDD - Test Driven Development]]></category>
		<category><![CDATA[WEBDEV]]></category>
		<category><![CDATA[XP - Programacion Extrema]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://www.programania.net/?p=585</guid>
		<description><![CDATA[¿Es programación extrema, simplemente, una manera de llamar a hacer Test Driven Development e integración contínua?]]></description>
			<content:encoded><![CDATA[<p>Si visitamos <a href="http://www.extremeprogramming.org/">la página de Extreme Programming</a> vemos que hacer XP es combinar las siguientes prácticas:</p>
<ul>
<li><strong>Planning</strong>: user stories, release planning, small releases, project velocity, iterations, iteration planning, move people around, stand-up meetings</li>
<li><strong>Designing</strong>: simplificity, system metaphor, CRCcards, spike solutions, no funcionality added early and refactor.</li>
<li><strong>Testing</strong>: unit testing, acceptance test, etc.</li>
<li><strong>Coding</strong>: <a href="http://www.programania.net/category/integracion-continua/">integración continua</a> y TDD.</li>
</ul>
<p>Cualquiera de las metodologías ágiles puede cumplir la parte de planning, designing y testing. Es más, por seguir esos principios generales podrás decir que estás siguiendo una metodología ágil, pero nadie podrá adivinar cual exactamente. Como se explica en el <a href="http://www.navegapolis.net/content/view/832/58/">artículo más completo que yo he leído sobre todas los métodos ágiles</a> que hay, programación extrema sería una metodología <strong>más centrada en la solución técnica que en la gestión de proyectos</strong>. Por eso es tan fácil <a href="http://www.programania.net/desarrollo-agil/scrum-y-xp-desde-las-trincheras/">combinarla con metodologías más enfocadas a la gestión de proyectos como SCRUM</a>.</p>
<p>Respecto a la parte de coding, tenemos dos técnicas: Test Driven Development (TDD) e <a href="http://www.programania.net/category/integracion-continua/">Integración continua</a>.  Recordemos que hacer TDD es escribir las pruebas unitarias ANTES de escribir las clases que prueban. O sea que si utilizamos un servidor de integración continua y hacemos pruebas unitarias DESPUES de escribir las clases, no estaremos haciendo Programación Extrema.</p>
<p>El propio <strong>Ken Beck</strong>, en su libro <em>Extreme Programming Explained</em>, afirma que no hay en su metodología ninguna práctica revolucionaria, que sólo es la combinación de una serie de prácticas y su seguimiento de &#8220;manera extrema&#8221; (muy estricta).</p>
<p>Me queda la sensación de que &#8220;Programación extrema&#8221; <strong>fue una manera de llamar originariamente que a día de hoy está obsoleta</strong> y que se ha dividido en :</p>
<ol>
<li>las &#8220;prácticas ágiles básicas&#8221; (iterativo, incremental, fortalecer la comunicación directa, pruebas unitarias, funcionales, etc.)</li>
<li>integración contínua</li>
<li>TDD</li>
</ol>
<p>Si sigues los puntos 1 y 2, y haces pruebas unitarias después de escribir la clase, puedes estar siguiendo casi cualquier metodología ágil. Y si haces el punto 3, estarás haciendo Test Driven Development, que queda mucho más claro que decir &#8220;Programación extrema&#8221;.</p>
<p>¿Qué opináis vosotros? ¿Tiene cabida el término Programación Extrema?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/49nZSfM50HYRGLYfYTBxth6B1AY/0/da"><img src="http://feedads.g.doubleclick.net/~a/49nZSfM50HYRGLYfYTBxth6B1AY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/49nZSfM50HYRGLYfYTBxth6B1AY/1/da"><img src="http://feedads.g.doubleclick.net/~a/49nZSfM50HYRGLYfYTBxth6B1AY/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.programania.net/desarrollo-agil/%c2%bfexiste-una-metodologia-llamada-programacion-extrema/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
