<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Palabras sobre código</title>
	<atom:link href="http://delm.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://delm.wordpress.com</link>
	<description>El blog de un programador en .NET</description>
	<lastBuildDate>Fri, 27 Jan 2012 18:44:46 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='delm.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Palabras sobre código</title>
		<link>http://delm.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://delm.wordpress.com/osd.xml" title="Palabras sobre código" />
	<atom:link rel='hub' href='http://delm.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Historias de usuario: No es análisis de software</title>
		<link>http://delm.wordpress.com/2012/01/27/historias-de-usuario-no-es-analisis-de-software/</link>
		<comments>http://delm.wordpress.com/2012/01/27/historias-de-usuario-no-es-analisis-de-software/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 18:32:57 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agilidad]]></category>
		<category><![CDATA[historias de usuario]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=98</guid>
		<description><![CDATA[Luego de algún tiempo de transición a la agilidad, mucho me ha impactado que tiendo siempre a considerar el ejercicio de creación de historias de usuario como un proceso de análisis de software pero con otro formato. Las historias de usuario, son simplemente registros de un deseo de el cliente, fraseado de una forma conveniente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=98&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Luego de algún tiempo de transición a la agilidad, mucho me ha impactado que tiendo siempre a considerar el ejercicio de creación de historias de usuario como un proceso de análisis de software pero con otro formato.</p>
<p>Las historias de usuario, son simplemente registros de un deseo de el cliente, fraseado de una forma conveniente para recordar la conversación que se llevó a cabo cuando se hizo la solicitud.</p>
<p>Es el programador que luego tome este ítem para trabajar, el que debe realizar el análisis correspondiente, realizar el diseño correspondiente y la implementación.</p>
<p>Dejo esto solo como recuerdo para volver a leerlo más adelante.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=98&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2012/01/27/historias-de-usuario-no-es-analisis-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Testers en un equipo ágil.</title>
		<link>http://delm.wordpress.com/2011/03/20/testers-en-un-equipo-agil/</link>
		<comments>http://delm.wordpress.com/2011/03/20/testers-en-un-equipo-agil/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 21:22:24 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agilidad]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=85</guid>
		<description><![CDATA[Este es un punto algo controversial y no poco discutido dentro de los círculos ágiles cuando se desean aplicar a un ambiente empresarial. Comencemos por decir que el tester tradicionalmente es una figura antagonista para el programador; se ubica justo antes del paso a producción de una aplicación con el  propósito de asegurar la calidad [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=85&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este es un punto algo controversial y no poco discutido dentro de los círculos ágiles cuando se desean aplicar a un ambiente empresarial.</p>
<p>Comencemos por decir que el tester tradicionalmente es una figura antagonista para el programador; se ubica justo antes del paso a producción de una aplicación con el  propósito de asegurar la calidad del software para poder reducir los periodos de marcha blanca, tan costosos y difíciles.</p>
<p>Al otro lado del río, en los equipos ágiles, se promueve un desarrollo iterativo en el cual el usuario trabaja de manera muy cercana a  los programadores, junto a una agenda de publicaciones muy frecuentes para que el software tenga contacto con el mundo real lo antes posible.</p>
<p>Esto se puede entender porque el desarrollo en cascada nace desde la administración hacia los programadores, mientras que la agilidad nace desde los programadores hacia la administración. La administración tiende a ver al desarrollo de software como una linea de producción en donde se debe colocar un control de calidad, y cuando la metodología es en cascada, el control va al final. Los programadores por su parte ven a los testers como una resistencia para que el software pase a producción y muchas veces como un insulto a su inteligencia. Obviamente esto está exagerado y se presenta en muchos matices, pero es para ilustrar un punto: Es natural que en un lado los testers sean muy necesarios mientras en el otro lado se clasifiquen como desperdicio.</p>
<p>Pero analicemos un poco el rol real del tester. El trabajo de un tester es ponerse en el lugar de un usuario y utilizar las funcionalidades del software de tal manera que le hagan sentido al negocio y a los usuarios. Nuestra responsabilidad como programadores es entregar un software que tenga la calidad suficiente para que el tester y por lo tanto, los usuarios, puedan usarlo día a día. Se analiza desde percepción de rendimiento hasta usabilidad de las pantallas. Si el tester encuentra un bug en esta revisión es su deber rechazar el build y comunicar al equipo los detalles del error.</p>
<p>En la agilidad contamos con muchas herramientas de automatización en cuanto al aseguramiento de calidad: historias de usuario que definen requerimientos en lenguaje de negocio, pruebas unitarias guían el diseño interno de la aplicación y lo comprueban repetitivamente, pruebas de aceptación automatizadas basadas en las historias de usuario que garantizan cumplimiento, entre otras. Pero sobre todas estas herramientas están los principios sobre los cuales la agilidad se basa, especialmente la comunicación con el usuario, que al ser fluida y sin intermediarios garantiza un correcto entendimiento del negocio y los requerimientos.</p>
<p>Todo parece indicar que el rol del tester no tiene cabida en un mundo ágil, especialmente cuando la comunicación del usuario y el programador es tan fluida como para que el usuario siempre esté entregando feedback sobre la aplicación.</p>
<p>Pero hay un punto débil en este razonamiento. El disponer del usuario con tanta fluidez es imposible en la mayoría de los desarrollos empresariales. Los usuarios son personas productivas para la empresa cliente y por lo tanto el cliente es celoso del tiempo que invertimos con ellos. Pero no es posible desarrollar un software sin el usuario. Muchos de nosotros tenemos cicatrices con las que aprendimos esa verdad. Lo que necesitamos es un punto medio y ese punto medio es el tester.</p>
<p>El tester ágil es parte del equipo de desarrollo, muy cercano al product owner y a su vez cercano a los programadores. El tester participa de la escritura de historias de usuario y dirige la escritura de las pruebas de aceptación. En este esquema el trabajo del programador continúa siendo el entregar una historia desarrollada que cumpla las pruebas de aceptación. El trabajo del tester es probar la historia de usuario desde el punto de vista de un usuario, encontrar oportunidades de mejora, detectar problemas de usabilidad o inconsistencias con otras historias previas o futuras. (Un tester sigue sin poder hacer su trabajo si el equipo de desarrollo no entrega un sw de calidad suficiente para ser probado)</p>
<p>El tester tiene un acceso más frecuente a los usuarios que el equipo de desarrollo. Esto permite que una persona en el equipo esté enfocada en capturar las personalidades e idiosincrasias de los usuarios, pero sin eliminar completamente el acceso dirécto de los programadores a los usuarios. Podemos pensar en el tester como una especie de &#8220;cache&#8221; de los usuarios, una capa de abstracción.</p>
<p>Si el cliente permite acceso directo a los usuarios y a la vez permite que los usuarios tengan una aplicación en producción con cambios nuevos cada dos semanas, entonces tener un tester es efectivamente un desperdicio. Pero si cualquiera de estas facilidades (o las dos) es negada o reducida, entonces un tester permite tener un ciclo de feedback rápido y sano apesar de aquello.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=85&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2011/03/20/testers-en-un-equipo-agil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Fundamentos de Programación 2: Capítulo 1, Calidad y Eficiencia</title>
		<link>http://delm.wordpress.com/2011/02/22/fundamentos-de-programacion-2-capitulo-1-calidad-y-eficiencia/</link>
		<comments>http://delm.wordpress.com/2011/02/22/fundamentos-de-programacion-2-capitulo-1-calidad-y-eficiencia/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 19:07:29 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fundamentos]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=82</guid>
		<description><![CDATA[Capítulo 1 &#8211; Calidad y Eficiencia “La calidad nunca es un accidente, siempre es resultado de un esfuerzo inteligente” &#8211; John Ruskin Pragmáticamente, la razón por la que yo y (asumo) la mayoría de los programadores, estamos deseosos de aprender, es para mejorar la calidad del código que escribimos al igual que nuestra eficiencia. No [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=82&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Capítulo 1 &#8211; Calidad y Eficiencia</h2>
<blockquote><p>“La calidad nunca es un accidente, siempre es resultado de un esfuerzo inteligente” &#8211; John Ruskin</p></blockquote>
<p>Pragmáticamente, la razón por la que yo y (asumo) la mayoría de los programadores, estamos deseosos de aprender, es para mejorar la calidad del código que escribimos al igual que nuestra eficiencia. No conozco programador que ocupe tiempo aprendiendo nuevos acercamientos y tecnologías con el objetivo explícito de escribir peor código, o encontrar medios para trabajar más lento. Pero, ¿Cómo medimos la eficiencia y la calidad? ¿Qué cosa, como creadores, consideramos que son nuestros objetivos?</p>
<p>Aquellos del tipo administrativo, considerarían como medida de calidad puramente la satisfacción del cliente. Aun cuando es ciertamente importante, los buenos programadores son los interesados con mayores expectativas y también son los más críticos. Como DeMarco y Lister dijeron en Peopleware, <strong>Todos tendemos a vincular fuertemente nuestra auto estima con la calidad del producto que producimos &#8211; no con la cantidad del producto, sino con la calidad.</strong> Encuentro difícil poder expresar con palabras, desde la perspectiva de un programador, lo que significa la calidad; pero, estoy seguro que no solo muchos de nosotros coincidimos en la definición, sino que también podemos reconocerla fácilmente (o la falta de ella). Calidad es sobre encontrar una solución elegante para un problema &#8211; tanto a un nivel micro (comportamientos individuales) como macro (el sistema como un todo). ¿Qué es <em>elegante</em> entonces? Varía según el contexto del problema pero, generalmente, una solución elegante es tanto la más simple posible, como la más explícita y fácil de entender.</p>
<p>Mientras más programo, más me doy cuenta de algo realmente sorprendente. No solo la solución más sencilla es obviamente la más fácil de implementar, sino que también la más fácil de entender, mantener y cambiar. Las soluciones simples también tienden a tener mejor rendimiento que aproximaciones más complejas. Esto es particularmente sorprendente cuando te encuentras hasta las rodillas en un lío sobre trabajado en donde la intención original de flexibilidad, rendimiento y eficiencia son saboteadas por complejidad artificial. Esto no significa que esté a favor de la programación sin consideración por el diseño. En vez, creo que dada cierta experiencia y reflexión, un balance entre pensar por delante los problemas y el pragmatismo no solo es lograble, sino que también bastante natural.</p>
<p>Me gustaría decirte cuál es la respuesta. No es que no lo sepa. El problema es que tengo que anteponer una advertencia; sino corro el riesgo que me des un desprecio y dejes el libro aquí. Yo sé que muchos de ustedes está cansados de escucharlo, pero les suplico que me escuchen y reconozcan que probablemente no estoy diciendo lo que ustedes piensan que digo. ¿Ok? Entonces, el secreto para escribir código con calidad es asegurarse de que el código es testeable. ESPERA… no te vayas aun. No estoy diciendo que debas testear tu código (Ciertamente tampoco niego que se deba hacer) solo estoy diciendo que si, teóricamente, fueras a testear tu código, no debiera ser difícil. El código puede ser testeable sin efectivamente testearlo y al final, es a lo que debieras apuntar.</p>
<p>Por un largo tiempo pensaba que la solución era realmente así de simple. Escribir tests y la calidad del código iría incrementando. Pero más recientemente me he dado cuenta que no todos los tests son creados iguales y que es enteramente posible, si es que no común, tener realmente malos tests. Entender qué es lo que hace a un tests bueno, y por lo tanto qué es lo que hace al código testeable, viene con la experiencia y espero, junto con los siguientes capítulos, pueda ayudarte a esquivar algunas de las piedras que me he encontrado en el camino. Es por esto que mucho de este libro estará dedicado tanto a escribir tests como a la testeabilidad del código. No mezcles testabilidad como una metrica con escribir tests. Es como escribir un montón de código mantenible que no necesita mantenimiento. Es un objetivo, no una actividad. Ahora, es cierto que la mejor manera de descubrir que una solución es testeable es mediante la escritura de un test. Eso sí, espero poder convencerte de que le des un intento; en los últimos tres años el convertirme en un escritor de tests efectivo es una de las cosas que más me ha ayudado a elevar mi habilidad. Sin embargo, es enteramente posible ver un método o un sistema y estimar su testeabilidad, y por lo tanto, su calidad, sin escribir un test.</p>
<h3>Testeabilidad como una medida de calidad</h3>
<p>No te culpo si eres escéptico. Todo lo que puedo hacer es prometer que mientras puede se que gastemos algo de tiempo escribiendo tests, no voy a tratar de hacerte sentir que estás haciendo algo malo si elijes no hacer tests. También, puedo mostrarte un ejemplo sencillo de lo que quiero decir:</p>
<p><pre class="brush: csharp;">
//Un ejemplo de código dificil de probar, y por lo tanto, de mala calidad.
private void LoginButton_Click(object sender, EventArgs e)
{
    User user = SqlServerDataStore.FindUser(UserName.Text, Password.Text);
    if (user != null)
    {
        Session[&quot;userId&quot;] = user.Id;
        Response.Redirect(&quot;~/members/index.aspx&quot;);
    }
    else
    {
        ErrorMessage.Text = &quot;Invalid UserName or Password&quot;;
    }
}
</pre></p>
<p>(Si esta fuera una pequeña aplicación desechable, podríamos perdonarla. Aunque también debo decir que en mi experiencia, programadores hábiles escriben código limpio sin importar la expectativa de vida para el código. Esto es probablemente por el hecho que todos conocemos código de <em>prototipos</em> que ha terminado con un periodo de vida vergonzosamente largo.)</p>
<p>Este trozo de código está lejos de la perfección. Si específicamente lo miramos desde una perspectiva de la testabilidad, podemos ver una cantidad de dependencias que lo harán difícil de testear, como por ejemplo <code>SqlServerDataStore.FindUser</code> y <code>Response.Redirect</code>, por nombrar algunas. Lamentablemente muchas de estas vienen incluidas en el framework, lo que es uno de los motivos por los que muchos programadores .Net tienen tan fuertes sentimientos en contra de WebForms. En este caso en particular, la practica imposibilidad de hacer tests me dice que este código va a ser difícil de cambiar y mantener.</p>
<p>Muchas de las mejores prácticas que escuchas por ahí, como YAGNI (you aren’t going to need it; no lo vas a necesitar), bajo acople y alta cohesión, puede ser medido mediante la observación del código y pensando cómo lo testearías. Un método que hace demasiado, potencialmente está violando tanto YAGNI como la alta cohesión, y requerirá una cantidad dolorosa de código inicial en un test, y probablemente va a ser muy fácil de quebrar.</p>
<p>Hay un acrónimo en la programación que se usa bastante: SOLID. Se refiere a cinco principios importantes del diseño orientado a objetos: Single responsibility principle (Principio de responsabilidad única), Open/close principle (Principio abierto/cerrado), Liskov substitution principle (Principio de substitución de Liskov), Interface segregation principle (Principio de segregación de interfaces) y Dependency inversion principle (Principio de inversión de dependencias). Estos son todos tópicos dignos de su propio capítulo, pero deberá bastar decir que muchos de ellos son algo ambiguos. ¿En qué momento un nuevo comportamiento o mejora es considerado una responsabilidad o en cuál se le asigna un componente? ¿Cuándo una interfaz se vuelve demasiado compleja? Estas son preguntas importantes y respuestas equivocadas van a tener consecuencias. La testabilidad y la experiencia son herramientas que puedes usar para resolver esta ambigüedad. (Un buen lugar para comenzar a aprender sobre SOLID es en la <a href="http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29">Wikipedia</a>.)</p>
<h3>Eficiencia: No tan simple como parece</h3>
<p>Puede que aún no me creas sobre la testabilidad como métrica de calidad, pero confío en que crees que la calidad es un aspecto de suprema importancia. Otro de nuestros objetivos pragmáticos es la eficiencia, debido a que no debemos demorarnos mucho en producir un código de gran calidad. Uno esperaría que la eficiencia en cuanto a aprender y mejorar, fuera algo fácil de medir: puedo lograr XYZ ahora más rápido de lo que lo hacía antes, pero no es así.</p>
<p>Primero que nada, y lo más peligroso, es que los programadores no siempre nos damos cuenta de que hay mejores formas de hacer las cosas. Seamos honestos, muchos de los programadores rehúsa aceptar solo la posibilidad que exista. Es difícil para la gente, especialmente aquellos no muy apasionados sobre lo que hacen, el aceptar que hay mejores formas de hacer las cosas. No solo amenaza su comodidad, pero potencialmente sus carreras. Yo estaba en la escuela cuando Java iniciaba a ganar popularidad y quedé impresionado por lo cerrado de mente de los programadores que rehusaban aceptar que la recolección de basura automática, luego de corregir algunos menores problemas, podría ser algo muy útil (ni pensar en estándar). Ahora encuentro particularmente irónico ver programadores de Java reusando aceptar que los lenguajes dinámicos podrían convertirse en el nuevo Java (Especialmente dado que generalmente utilizan los mismos argumentos que los que usaban los programadores C++ contra Java)</p>
<p>Segundo, sin importar cuanto más eficiente es una tecnología o técnica, siempre serás más eficiente en lo que sabes versus lo que estás aprendiendo. Mi estrategia para sobrepasar esto es tomarme mi tiempo y reconocer que el proceso es una inversión de largo plazo. Además si eres astuto, probablemente puedas introducir algo de investigación en tu trabajo diario. Por astuto no quiero decir tramposo. Quiero decir que encuentres un proyecto secundario, no crítico. Aquel sistema de monitorización que querías hacer pero que nunca tuviste tiempo, o aquel prototipo que te solicitaron hacer. La aproximación exacta que tomes va a depender de tu forma de aprender. Todo lo que puedo decir es que no debieras esperar un incremento de productividad de la noche a la mañana.</p>
<h3>En Este Capítulo</h3>
<p>Eso fue mucho texto y poco código. Este capítulo sentó las bases para los que continúan, los que presentarán mucho código y ejemplos. Definimos lo que significa calidad para nosotros asi como las métricas que usaremos para medirlo (testabilidad). Miramos a la eficiencia y descubrimos que mientras parecía fácil de medir, no lo era. Toma un respiro y considera algo del código que has escrito recientemente. Si hiciste tests, ¿Qué podría haber hecho los tests más simples y que tuvieran menor posibilidad de fallar si el sistema cambia? Si no lo hiciste, ¿Puedes imaginar algún inconveniente o problema que enfrentarías si decidieras hacer tests ahora?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=82&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2011/02/22/fundamentos-de-programacion-2-capitulo-1-calidad-y-eficiencia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Fundamentos de Programación 2: Introducción</title>
		<link>http://delm.wordpress.com/2011/02/20/fundamentos-de-programacion-2-introduccion/</link>
		<comments>http://delm.wordpress.com/2011/02/20/fundamentos-de-programacion-2-introduccion/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 19:06:58 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fundamentos]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=80</guid>
		<description><![CDATA[Introducción Siempre me encuentro sorprendido por el número de programadores con los que me encuentro. Mucho de sus vidas lo dedican al trabajo del cual somos afortunados por tener la oportunidad de estar haciendo lo que amamos. Esta no es una propiedad única de los programadores, pero es lo suficientemente extraña para que la mayoría [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=80&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Introducción</h2>
<p>Siempre me encuentro sorprendido por el número de programadores con los que me encuentro. Mucho de sus vidas lo dedican al trabajo del cual somos afortunados por tener la oportunidad de estar haciendo lo que amamos. Esta no es una propiedad única de los programadores, pero es lo suficientemente extraña para que la mayoría de la gente lo encuentre sorprendente. “¿Vas a casa y <em>trabajas</em> cada día?” nos preguntan. Solo nuestros más cercanos amigos y colegas apasionados entienden que <em>trabajo</em> tiene dos significados para nosotros, ninguno de los que es una esclavitud de 9 a 5.</p>
<p>Probablemente has notado que el entusiasmo y puje es una característica critica en un campo tan joven. La tecnología continúa cambiando a un paso acelerado, el campo está creciendo y los sistemas están cada día volviéndose más complejos. El resultado es una clara división entre programadores que aman su oficio y lo que no. Estas o bien leyendo, intentando y a veces fallando, o estás estancado en el pasado, probablemente ignorante de lo atrás que te has quedado.</p>
<p>Desafortunadamente, ser apasionado por lo que haces no siempre es suficiente. Todos tenemos distintas fortalezas y debilidades, diferentes formas de aprender y diferentes tolerancias al fallo. También tenemos el constante flujo de nuevas tecnologías que hacen difícil decidir en cual ocupar el tiempo para aprender. La verdad es que no soy un gran programador. Soy un buen programador que le gusta aprender (y enseñar) y que disfruta jugando con la tecnología. He visto personas aprender un lenguaje solo días cuando a mi me ha costado meses, o escribir algoritmos con los cuales pretendo estar de acuerdo porque simplemente no pude entenderlo. Las Fundaciones de la Programación es una serie pensada para ayudar a la gente como yo, gente a la que le interesa lo que hacen y lo queren hacer mejor, pero no están seguros como hacerlo.</p>
<p>Espero que este libro te ayude.</p>
<h3>Respecto al Original</h3>
<p>El libro original <a href="https://github.com/karlseguin/Foundations-of-Programming-Ebook">Foundations of Programming</a> ha sido, bajo mis estándares, un éxito. Tal parece haber ayudado genuinamente a desarrolladores y servido a una real necesidad cada libro, el original y este, existen por separado. Son independientes el uno del otro. Sin embargo podría sugerir que si tienes en mente leer el original, lo hagas antes de continuar con este. Mis vistas han madurado y en algunos casos cambiado o clarificado. Creo que mucho puede ser obtenido en ver cómo he evolucionado en la programación.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=80&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2011/02/20/fundamentos-de-programacion-2-introduccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Fundamentos de Programación 2: Traducción de Foundations of Programming 2</title>
		<link>http://delm.wordpress.com/2011/02/13/fundaciones-de-programacion-2-traduccion-de-foundations-of-programming-2/</link>
		<comments>http://delm.wordpress.com/2011/02/13/fundaciones-de-programacion-2-traduccion-de-foundations-of-programming-2/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 01:13:03 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fundamentos]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=75</guid>
		<description><![CDATA[He decidido comenzar un proyecto interesante. Voy a traducir Foundations of Programming 2, un libro que aun está en trabajo, por Karl Seguin. Karl también escribió hace algún tiempo la primera parte de este libro, y si desean la pueden acceder de manera gratuita en http://www.openmymind.net/FoundationsOfProgramming.pdf Gracias a que Karl utiliza GitHub para este proyecto, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=75&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>He decidido comenzar un proyecto interesante. Voy a traducir Foundations of Programming 2, un libro que aun está en trabajo, por Karl Seguin.</p>
<p>Karl también escribió hace algún tiempo la primera parte de este libro, y si desean la pueden acceder de manera gratuita en http://www.openmymind.net/FoundationsOfProgramming.pdf</p>
<p>Gracias a que Karl utiliza GitHub para este proyecto, es muy fácil comenzar a traducir su trabajo, incluso mientras lo realiza. Además la licencia permite no solo traducirlo, sino que compartirlo y distribuirlo de manera gratuita.</p>
<p>Estoy muy entusiasmado, debido a que la primera parte fue muy buena, además porque siempre me ha interesado a contribuir en la disponibilidad de material de calidad en la lengua castellana.</p>
<p>Mi ortografía no será la mejor ni tampoco mi redacción, pero ya pueden comenzar a ver mi trabajo, también en Github, mediante la dirección: https://github.com/davidlaym/Foundations-of-Programming-2 y la versión original la pueden ver en https://github.com/karlseguin/Foundations-of-Programming-2</p>
<p>Estaré publicando los capítulos en el blog a medida los termine, y si bien ya tengo el primero traducido, quiero hacer algunas revisiones de ortogragía y redacción antes de publicarlo.</p>
<p>La idea es obtener opiniones y dar a conocer este esfuerzo.</p>
<p>Actualización:</p>
<p>Puedes acceder a la versión en castellano del primer libro de Karl en http://www.scribd.com/doc/33303471/Fundamentos-de-Programacion-Traducido</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/75/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=75&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2011/02/13/fundaciones-de-programacion-2-traduccion-de-foundations-of-programming-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabajos en hilos separados con BackgroundWorker (parte 2, reusabilidad)</title>
		<link>http://delm.wordpress.com/2009/04/25/trabajos-en-hilos-separados-con-backgroundworker-parte-2-reusabilidad/</link>
		<comments>http://delm.wordpress.com/2009/04/25/trabajos-en-hilos-separados-con-backgroundworker-parte-2-reusabilidad/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 03:03:57 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[winform]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=62</guid>
		<description><![CDATA[En la parte 1 mostré como crear una barra de progreso que realizaba un trabajo de manera asíncrona mientras mantenía a el usuario informado de que se estaba realizando un trabajo. Todo eso fue hecho en forma de prototipo, y con varias cosas pendientes que mejorar. En esta segunda parte me voy a enfocar en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=62&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En la <a title="Parte 1" href="http://delm.wordpress.com/2008/12/20/trabajo-en-hilos-separados-con-backgroundworker-parte-1-prototipo/" target="_self">parte 1</a> mostré como crear una barra de progreso que realizaba un trabajo de manera asíncrona mientras mantenía a el usuario informado de que se estaba realizando un trabajo. Todo eso fue hecho en forma de prototipo, y con varias cosas pendientes que mejorar.</p>
<p>En esta segunda parte me voy a enfocar en la reusabilidad del código,  explicando una mejor forma utilizar esta ventana, y voy a explicar el manejo de exepciones. Todo esto acompañado de pequeñas modificaciones al código del post anterior.</p>
<p><span id="more-62"></span></p>
<div id="attachment_67" class="wp-caption alignright" style="width: 310px"><a href="http://delm.files.wordpress.com/2009/04/main_screen1.png"><img class="size-medium wp-image-67" title="main_screen1" src="http://delm.files.wordpress.com/2009/04/main_screen1.png?w=300&#038;h=142" alt="Ventana principal del programa" width="300" height="142" /></a><p class="wp-caption-text">Ventana principal del programa</p></div>
<p>Nuestro proyecto consta de un formulario principal, que tiene un datagridview y un botón, el que llama a un diálogo que presenta una barra de progreso y se encarga de lanzar un trabajo a un hilo por separado, cerrandose al terminar ese trabajo. El trabajo a realizar, es un método dentro del mismo formulario principal, lo que nos impide pasar parámetros o recibir resultados de una forma limpia y estamos usando variables globales.</p>
<p>Tampoco tenemos manejo de excepciones, ya que al ocurrir cualquier problema, la ventana se cierra sin dar ninguna explicación, aunque la aplicación no se cae.</p>
<p><strong>Encapsulación</strong></p>
<p>En la mayoría de los casos nuestro método de trabajo va a estar en una clase especialmente diseñada para realizar la obtención de los datos y la preparación de estos, ya que pueden venir desde cualquier fuente externa.</p>
<p>Nuestro siguiente paso es precisamente emular este escenario creando una clase llamada <code>RSSReader.cs</code> que va a encapsular la lógica sobre la obtención de un RSS a través de HTTP.</p>
<pre>    class RSSReader
    {
        public Uri Ubicación
        {
            get;
            set;
        }
        public DataTable Items
        {
            get;
            private set;
        }
        public String Título
        {
            get;
            private set;
        }
        public String Descripción
        {
            get;
            private set;
        }

        public RSSReader(String url)
        {
            Ubicación = new Uri(url);
        }

        public void LeeRSS()
        {
            var noticias = new DataSet();
            noticias.ReadXml(Ubicación.AbsoluteUri, XmlReadMode.Auto);
            Título = noticias.Tables["channel"].Rows[<span class="currency_converter_link" title="Convert this amount">0</span>]["title"].ToString();
            Descripción = noticias.Tables["channel"].Rows[<span class="currency_converter_link" title="Convert this amount">0</span>]["description"].ToString();
            Items = noticias.Tables["item"];
        }

    }</pre>
<p>De esta forma podemos apreciar una pequeña clase que nos va a facilitar el paso de parámetros y la obtención de resultados.</p>
<p>El siguiente paso es modificar el formulario para que soporte nuestra nueva manera de obtener los datos:</p>
<pre>    public partial class Form<span class="currency_converter_link" title="Convert this amount">1</span> : Form
    {
        public Form<span class="currency_converter_link" title="Convert this amount">1</span>()
        {
            InitializeComponent();
        }

        private void button<span class="currency_converter_link" title="Convert this amount">1</span>_Click(object sender, EventArgs e)
        {
            <strong>var rssReader = new RSSReader("http://lifehacker.com/tag/top/index.xml");
            var proceso = new dlgDialogoProceso(rssReader.LeeRSS);</strong>
            proceso.Mensaje = "Obteniendo noticias de Lifehacker...";
            if (proceso.ShowDialog(this) == DialogResult.OK)
                dgLinks.DataSource = rssReader.Items;
            dgLinks.Refresh();
        }
    }</pre>
<p>Mucho más limpio  y claro, sin manejo de datasets ni lecturas de xml. Todo eso está correctamente encapsulado en la nueva clase.</p>
<p>¿Recuerdan que nuestro diálogo recibía una función que debía ejecutar de manera asíncrona? En nuestra versión anterior, ese método estaba dentro del mismo formulario. Ahora nosotros queremos hacer responsable a la clase RSSReader de todo el trabajo de obtención de datos, esto significa, que debemos pasarle al dialogo una función de un objeto RSSReader.</p>
<p><strong>Manejo de Excepciones</strong></p>
<p>Lo que sigue es el manejo de excepciones.  Este problema radica en que no se pueden manejar exepciones de un hilo a otro con bloques try-catch, ya que las excepciones están almacenadas en pilas, y las pilas están alocadas en memoria que es independiente para cada proceso.</p>
<p>Pero nuestro backgroundworker nos tiene eso solucionado, hasta cierto punto. Cuando nuestro proceso termina de ejecutarse, el backgroundworker llama al evento RunWorkerCompleted, ya sea que haya terminado debido a una excepción o de manera normal.</p>
<p>La diferenciación la realiza gracias a los parámetros, veamos el código primero y luego lo explicamos (He colocado solo las partes que han cambiado desde la versión anterior):</p>
<pre>    public partial class dlgDialogoProceso : Form
    {
        [ ... ]

        /// &lt;summary&gt;Entrega información sobre la excepción que ha generado el trabajo que se realizaba&lt;/summary&gt;
        <strong>public Exception Error
        {
            get; private set;
        }</strong>

        [ ... ]

        /// &lt;summary&gt; Configura un BackgrowndWorker para realizar el trabajo indicado&lt;/summary&gt;
        private BackgroundWorker CreaTrabajador(trabajo delegado)
        {

            [ ... ]

            // Definimos que debe hacer al concluir el trabajo
            trabajador.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) {
                 if (e.Error == null) {
                     DialogResult = DialogResult.OK;
                 }
                <strong> else {
                     // Si ha ocurrido una excepción, la exponemos
                     Error = e.Error;
                     // y reportamos que ha ocurrido un error
                     DialogResult = DialogResult.Abort;
                 }</strong>
                 Close();
             };

            // Devolvemos el trabajador configurado
            return trabajador;
        }

    }</pre>
<p>He agregado una propiedad que expone una excepción si se encuetra, y luego he cambiado el delegado que maneja el término del trabajo para revisar si ha ocurrido una exepción.</p>
<p>Importante es notar, que en el método que realiza el trabajo (en este caso LeeRSS) no debe haber ningún try-catch para que la excepción suba hasta el método DoWork y luego el backgrowndworker sea capaz de manejarla.</p>
<p>Un problema con esto, es que el debugger de visual studio siempre va a parar en el punto donde cree que se ha generado una excepción no manejada, pero tengan confianza que esto funciona correctamente en ejecución normal.</p>
<p>Si les molesta mucho este problema del debugger, pueden agregar el atributo DebuggerStepThrough del namespace System.Diagnostics tanto en el método que realiza el trabajo (LeeRSS) como en la clase del diálogo. Este atributo evita que el debugger entre en el código, pero por lo mismo, no va a parar incluso si han ubicado ahi un breakpoint.</p>
<p>Con esto concluimos la seguda parte de esta serie de posts introductorios para el trabajo con backgroundworker.</p>
<p><a href="http://cid-a11737efda92baf9.skydrive.live.com/self.aspx/.Public/delm.wordpress.com/DialogoProceso2.zip">El código completo del proyecto lo pueden bajar aqui</a>.</p>
<p>Me había comprometido con una tercera parte, pero no la voy a realizar. En cambio voy a generar una cantidad de nuevos posts sobre Windows Comunication Framework, NHibernate, ASP MVC, ya que estoy en un proyecto universitario que está explorando todas estas tecnologías.</p>
<p>También pueden esperar posts sobre Test Driven Design y Pruebas unitarias. Estén atentos.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=62&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2009/04/25/trabajos-en-hilos-separados-con-backgroundworker-parte-2-reusabilidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>

		<media:content url="http://delm.files.wordpress.com/2009/04/main_screen1.png?w=300" medium="image">
			<media:title type="html">main_screen1</media:title>
		</media:content>
	</item>
		<item>
		<title>Aprendiendo WPF</title>
		<link>http://delm.wordpress.com/2009/02/19/aprendiendo-wpf/</link>
		<comments>http://delm.wordpress.com/2009/02/19/aprendiendo-wpf/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:27:05 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/2009/02/19/aprendiendo-wpf/</guid>
		<description><![CDATA[Si el blog no ha sido actualizado recientemente, es culpa de WPF. Cada momento libre que he tenido he estado dedicándolo ya sea a descansar o a aprender WPF. Es desagradablemente complicado todo el esquema de trabajo que presenta, pero a la vez, en esa complejidad hay una riqueza enorme. Sinceramente creo que es un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=63&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Si el blog no ha sido actualizado recientemente, es culpa de WPF.<br />
Cada momento libre que he tenido he estado dedicándolo ya sea a descansar o a aprender WPF.</p>
<p>Es desagradablemente complicado todo el esquema de trabajo que presenta, pero a la vez, en esa complejidad hay una riqueza enorme.<br />
Sinceramente creo que es un diamante en bruto (muy en bruto) y con el tiempo van a llegar mejores herramientas.</p>
<p>Me recuerda mucho cuando daba mis primeros pasos en HTML, y luego de varios años aparecieron las técnicas AJAX junto a los mejorados browsers.</p>
<p>Cuando salga VS <span class="currency_converter_link" title="Convert this amount">11</span> (no el <span class="currency_converter_link" title="Convert this amount">10</span>, el <span class="currency_converter_link" title="Convert this amount">11</span>) estoy seguro que ya estaremos en camino de una consolidación de la plataforma.</p>
<p>Por ahora sólo lo veo como una herramienta rústica pero poderosa, que todavía exige una cantidad demasiado grande de conceptos y técnicas nuevas.</p>
<p>A continuación, les dejo un par de links a recursos que me han servido infinitamente en cuanto al aprendisaje de esta nueva tecnología (en inglés):</p>
<p><a title="Conceptos básicos de WPF" href="http://dotnetslackers.com/articles/silverlight/WPFTutorial.aspx" target="_blank">Conceptos básicos de WPF</a> (inglés)</p>
<p><a title="Patrón M-V-VM Explicado" href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx">Patrón M-V-VM Explicado</a> (inglés)</p>
<p><strong>Actualización</strong>: De hecho he encontrado una discusión bien interesante en el sitio StackOverflow  <a title="StackOverflow question #534205" href="http://stackoverflow.com/questions/534205/migrating-from-winforms-to-wpf-was-it-worth-it" target="_blank">#534205</a> (inglés) en donde tratan el tema de la migración de aplicaciones y desarrollo de aplicaciones de producción con WPF en el mundo real. Coincide bastante con lo que es mi punto de vista: Excelente momento para aprender, pero hay que esperar un tiempo prudente hasta que la tecnología madure.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=63&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2009/02/19/aprendiendo-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabajos en hilos separados con BackgroundWorker (parte 1, prototipo)</title>
		<link>http://delm.wordpress.com/2008/12/20/trabajo-en-hilos-separados-con-backgroundworker-parte-1-prototipo/</link>
		<comments>http://delm.wordpress.com/2008/12/20/trabajo-en-hilos-separados-con-backgroundworker-parte-1-prototipo/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 17:25:53 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[winform]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=33</guid>
		<description><![CDATA[Para ciertos sistemas, es necesario realizar trabajos que toman un tiempo considerable, como por ejemplo la lectura de archivos grandes, la generación de archivos, la comunicación con sistemas en la web. Para estos casos, es necesario que la aplicación permanezca activa e informe al usuario que se está realizando el trabajo, ya que de otra [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=33&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Para ciertos sistemas, es necesario realizar trabajos que toman un tiempo considerable, como por ejemplo la lectura de archivos grandes, la generación de archivos, la comunicación con sistemas en la web.</p>
<p>Para estos casos, es necesario que la aplicación permanezca activa e informe al usuario que se está realizando el trabajo, ya que de otra manera el usuario puede confundir la demora con una falla.</p>
<p>Una forma que he descubierto funciona bastante bien, es cada vez que se generan estos procesos, levantar un pequeño dialogo, con una barra de progreso infinita, que lo único que hace es dar esa información al usuario de que se está trabajando.</p>
<p>Veremos como implementar esta solución en C# 3.5 , utilizando hilos de ejecución paralela. <span id="more-33"></span> Haremos esto de una manera sencilla y directa, más adelante ingresaremos en optimizaciones de diseño y detalles de implementación.</p>
<p>Si la aplicación está realizando un trabajo fuerte, es posible que ocupe toda o casi toda  la capacidad del procesador en realizar la tarea, o quizás ocupe demasiado acceso a disco, o simplemente necesite esperar la información desde una fuente externa que se demora en entregarla.</p>
<p>En un escenario con estas características, es muy posible que el hilo de ejecución (el hilo que maneja la interfaz gráfica y toda la aplicación) se paralice en espera,  y el sistema permanezca inactivo durante el proceso, y el usuario piense que se ha &#8220;pegado&#8221; o &#8220;colgado&#8221; la aplicación.</p>
<p>Si nos detenemos un poco a definir lo que necesitamos, es simplemente un dialogo que se ejecute en el hilo principal, pero que sea capaz de lanzar una tarea (cualquiera) en un hilo secundario, que presente una barra de progreso y que indique con un pequeño texto el proceso que se está realizando.</p>
<p>Para este caso vamos a usar una barra de progreso infinita (marquee) para que no nos tengamos que preocupar de actualizar el progreso (y de paso mantener la API simple) y el texto por ahora será fijo.</p>
<p>Como primer paso, entonces, creamos lo que va a ser nuestra interfaz gráfica. A mi me gusta comenzar por diagramar las ventanas ya que eso me permite tener los objetivos claros al principio, por lo menos para obtenter la funcionalidad básica.</p>
<p>Este es solo un primer prototipo, luego, en otros posts, mejoraremos el diseño (diseño de software y componentes) y tomaremos algunas decisiones de refactoring si es necesario.</p>
<div id="attachment_46" class="wp-caption aligncenter" style="width: 623px"><img class="size-full wp-image-46" title="Diseño inicial del diálogo " src="http://delm.files.wordpress.com/2008/12/dialog1.png?w=630" alt="Diseño inicial del diálogo "   /><p class="wp-caption-text">Diseño inicial del diálogo</p></div>
<p>Luego que hemos hecho el trabajo de dibujar el diálogo, queda dibujar el formulario que va a llamar a nuestro dialogo.</p>
<p>Me imagino que vamos a necesitar un DataGridView para mostrar la algun tipo de data, y un botón de proceso. Luego inventaremos algo de data para probar el proceso.</p>
<div id="attachment_45" class="wp-caption aligncenter" style="width: 869px"><img class="size-full wp-image-45" title="Diseño Inicial de formulario" src="http://delm.files.wordpress.com/2008/12/form1.png?w=630" alt="Diseño Inicial de formulario"   /><p class="wp-caption-text">Diseño Inicial de formulario</p></div>
<p>Muy bien, entonces, tenemos un formulario y un diálogo para iniciar la programación.</p>
<p>Para el primer requerimiento vamos a necesitar crear el diálogo y traspasarle la responsabilidad de realizar el trabajo requerido.</p>
<p>Como esto es un prototipo, iniciemos con algo sencillo,  en el diálogo mismo, crearemos un delegado.  Los delegados pueden entenderlos como &#8220;punteros a funciones&#8221; si vienen del mundo de C, y básicamente me permiten hacer esta funcionalidad que necesito, traspasar la responsabilidad de ejetutar un método a otra secuencia de control.</p>
<p>Los delegados necesitan una firma, es decir se declara que parametros recibe y que tipo de dato retorna, pero luego se puede especificar cualquier método que cumpla con estos parametros y tipos de retorno para que sea ejecutado. Todos los eventos en .net funcionan mediante delegados.</p>
<p>También vamos a necesitar exponer algunas propiedades del diálogo, como el texto a mostrar.  De hecho, el delegado lo podemos exponer también como una propiedad.</p>
<p>Nuestro código del diálogo entonces estaría quedando algo similar a:</p>
<pre>using System;
using System.Windows.Forms;
namespace DialogoProceso
{
  public partial class dlgDialogoProceso : Form
  {
    // Declaración del delegado (declara la firma y el nombre que tendrá)
    public delegate void trabajo();

    // Delegado que usaremos para realizar finalmente el trabajo, entregado por parámetro al Constructor
    public trabajo Delegado
    {
        get;
        set;
    }

    /// &lt;summary&gt; Mensaje que se muestra en la pantalla de progreso&lt;/summary&gt;
    public String Mensaje
    {
      get { return lblTextoProceso.Text; }
      set { lblTextoProceso.Text = value; }
    }

    /// &lt;summary&gt;Crea una nueva instancia del dialogo de proceso.&lt;/summary&gt;
    /// &lt;param name="delegado"&gt;Trabajo a realizar por el diálogo, será lanzado en un nuevo hilo.&lt;/param&gt;
    public dlgDialogoProceso(trabajo delegado)
    {
      InitializeComponent();
      Delegado = delegado;
    }

    private void On_Shown(object sender, EventArgs e)
    {
      // Al mostrar el formulario (al ejecutarse el metodo Show()
      // hacemos el trabajo mediante el delegado
      Delegado();
    }
  }
}</pre>
<p>He tomado la decisión de mantener el delegado lo más simple posible:  sin retorno y sin parámetros.</p>
<p>Para obtener data, yo creo que vamos a hacer algo entretenido y simple, vamos a obtener las noticias de Lifehacker en rss (http://lifehacker.com/tag/top/index.xml) en el DataGridView.</p>
<p>El método de trabajo lo vamos a colocar en el formulario principal para continuar con nuestra filosofía de prototipo. No te espantes, esto no es algo final ni está pensado para que lo uses directamente en código de producción, solo estamos desarrollando una funcionalidad principal desviándonos lo menos posible del objetivo, un prototipo.</p>
<p>Veamos como queda el código del formulario, con la inclusión de el evento del botón y el trabajo a realizar:</p>
<pre>using System;
using System.Data;
using System.Windows.Forms;

namespace DialogoProceso
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void obtieneEnlaces()
        {
            var ds = new DataSet();
            ds.ReadXml("http://lifehacker.com/tag/top/index.xml", XmlReadMode.Auto);

            // El DataGridView se llama dgLinks
            dgLinks.DataSource = ds.Tables["item"];
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var proceso = new dlgDialogoProceso(obtieneEnlaces);
            proceso.Mensaje = "Obteniendo noticias de Lifehacker";
            proceso.Show();
        }
    }
}</pre>
<p>Bastante simple, pero si ejecutas en este punto, te darás cuenta de que el problema que estamos tratando de resolver todavía existe, la interfaz todavía está bloqueada.</p>
<p>Esto solo lo solucionaremos incorporando los hilos de ejecución al sistema, y lo haremos mediante el muy útil objeto BackgroundWorker que nos encapsula el trabajo en hilos separados.</p>
<p>Todo el trabajo lo hacemos en el diálogo,  reemplazamos el metodo On_Shown y agregamos un nuevo método que nos configurará un BackgroundWorker:</p>
<pre>        private void On_Shown(object sender, EventArgs e)
        {
            CreaTrabajador(Delegado).RunWorkerAsync();
        }

        private BackgroundWorker CreaTrabajador(trabajo delegado)
        {
            var trabajador = new BackgroundWorker();

            // Definimos el trabajo a realizar por el BackgroundWorker
            trabajador.DoWork += delegate {
                delegado();
            };

            // Definimos que debe hacer al concluir el trabajo
            trabajador.RunWorkerCompleted += delegate {
                DialogResult = DialogResult.OK;
                Close();
            };

            // Devolvemos el trabajador configurado
            return trabajador;
        }</pre>
<p>Y ya tenemos listo nuestro prototipo.</p>
<div id="attachment_55" class="wp-caption aligncenter" style="width: 826px"><img class="size-full wp-image-55" title="Formulario con datos" src="http://delm.files.wordpress.com/2008/12/form2.png?w=630" alt="Formulario con datos"   /><p class="wp-caption-text">Formulario con datos</p></div>
<p>Pueden obtener el código del prototipo <a title="Código del proyecto" href="http://www.mediafire.com/?5nnu2d0nmmf" target="_blank">aquí</a>. Van a requerir visual studio 2008 para poder compilar. No viene compilado para ahorrar espacio.</p>
<p>Pero quedan muchas cosas que hacer. Esto es muy poco portable, no tenemos manejo de excepciones, y hay algo que me molesta sobre tener que lanzar un diálogo&#8230; la idea es que pueda seguir trabajando mientras se procesa la información.</p>
<p>En el siguiente post vamos a crear una interfaz (IPararlelizable) para mejorar la generalización de esta solución y veremos como manejar excepciones que se generan en hilos separados. En un tercer post, veremos como convertir esto en un control de usuario completamente reusable y finalmente tendremos algo listo para producción.</p>
<p>Estén atentos para la próxima semana.</p>
<p>||dELm||</p>
<p><strong>Update</strong>: Nunca continué esta serie. sorry.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=33&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2008/12/20/trabajo-en-hilos-separados-con-backgroundworker-parte-1-prototipo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>

		<media:content url="http://delm.files.wordpress.com/2008/12/dialog1.png" medium="image">
			<media:title type="html">Diseño inicial del diálogo </media:title>
		</media:content>

		<media:content url="http://delm.files.wordpress.com/2008/12/form1.png" medium="image">
			<media:title type="html">Diseño Inicial de formulario</media:title>
		</media:content>

		<media:content url="http://delm.files.wordpress.com/2008/12/form2.png" medium="image">
			<media:title type="html">Formulario con datos</media:title>
		</media:content>
	</item>
		<item>
		<title>Bug Driven Development</title>
		<link>http://delm.wordpress.com/2008/12/18/bug-driven-development/</link>
		<comments>http://delm.wordpress.com/2008/12/18/bug-driven-development/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 12:42:07 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Opinión]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=39</guid>
		<description><![CDATA[No tengo que explicar que los bugs son una realidad y que dado el estado de nuestra profesión, son imposibles de evitar por completo. Pero una cosa completamente aparte es entrar en una lógica de desarrollar características en los sistemas de manera mediocre y sabiendo que se dejan errores y posibles puntos de falla sin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=39&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>No tengo que explicar que los bugs son una realidad y que dado el estado de nuestra profesión, son imposibles de evitar por completo.</p>
<p>Pero una cosa completamente aparte es entrar en una lógica de desarrollar características en los sistemas de manera mediocre y sabiendo que se dejan errores y posibles puntos de falla sin revisar.</p>
<p>Veo esto cada día,  y en lo que termina en en un desarrollo guiado por los bugs, en donde tarde  o temprano el proceso de programación deja de ser un contante progreso en características y se vuelve un 70% resolución de bugs y un 30% introducción de nuevas características, que a su vez se desarrollan de la misma mediocre manera.</p>
<p>Basta de esto, tomemos esta profesión en serio.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=39&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2008/12/18/bug-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD (Desarrollo guiado por pruebas): Impresiones</title>
		<link>http://delm.wordpress.com/2008/10/07/tdd-desarrollo-guiado-por-pruebas-impresiones/</link>
		<comments>http://delm.wordpress.com/2008/10/07/tdd-desarrollo-guiado-por-pruebas-impresiones/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 13:46:55 +0000</pubDate>
		<dc:creator>David Lay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Opinión]]></category>

		<guid isPermaLink="false">http://delm.wordpress.com/?p=30</guid>
		<description><![CDATA[Durante los últimos meses he aprendido mucho sobre TDD y todo lo que lo rodea  y he tratado de evangelizar en mi organización sobre sus beneficios y virtudes. Sin embargo, en mi organización soy el único desarrollador con OO (Orientación a objetos) en la sangre, todos vienen de VFox o VB6, por lo que ya [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=30&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Durante los últimos meses he aprendido mucho sobre TDD y todo lo que lo rodea  y he tratado de evangelizar en mi organización sobre sus beneficios y virtudes.</p>
<p>Sin embargo, en mi organización soy el único desarrollador con OO (Orientación a objetos) en la sangre, todos vienen de VFox o VB6, por lo que ya tengo ocupado mucho tiempo y recursos en evangelizar sobre OO y en resguardar que todas las cosas dentro de mis proyectos se realicen de acuerdo a los principios de la OO.</p>
<p>Y es aquí mi donde entra mi primera impresión. TDD es una arquitectura para sistemas contruidos en la base de OO. Para desarrollar una aplicación susceptible a pruebas unitarias e integración, se requiere utilizar grandes cantidades de conceptos de OO que muchos VB6 tradicionales considerarían completamente fuera de sus conocimientos e intereses.</p>
<p>Yo mismo he tenido que aprender una o dos cosas sobre OO, y reforzar otro par de conceptos antes de poder hacerme una idea global de lo que es TDD, de cómo diseñar para probar y de todos estos conceptos asociados, como el DIP (Patrón de inyección de dependencias por sus siglas en inglés).</p>
<p>Moraleja: Partir por la base siempre. Primero introducir OO, Luego introducir TDD, luego introducir esquemas de desarrollo ágiles. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/delm.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/delm.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/delm.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=delm.wordpress.com&amp;blog=867062&amp;post=30&amp;subd=delm&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://delm.wordpress.com/2008/10/07/tdd-desarrollo-guiado-por-pruebas-impresiones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2d1111f9c291ddbbbccd140a56ca1441?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">delm</media:title>
		</media:content>
	</item>
	</channel>
</rss>
