<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>La masa, el ladrillo, la bota, el bocadillo...</title><link>http://geeks.ms/blogs/rcorral/default.aspx</link><description>Los pensamientos, peleas y descubrimientos de Rodrigo Corral con Scrum, C++, C#, ASP.Net, Team System, Sql Server, Sharepoint, la arquitectura, la gestión de proyectos y el desarrollo de software en general...</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mlbb" /><geo:lat>43.062285</geo:lat><geo:long>-82.693273</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Estuve en: ALM’09 Sessions</title><link>http://feedproxy.google.com/~r/mlbb/~3/ZQjza5dmNwM/estuve-en-alm-09-sessions.aspx</link><pubDate>Mon, 30 Nov 2009 05:58:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:161459</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=161459</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=161459</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/11/30/estuve-en-alm-09-sessions.aspx#comments</comments><description>&lt;p&gt;El pasado martes estuve participando como ponente en las ALM’09 Sessions. Un exitazo de evento que reunión a más de 800 profesionales interesados en mejorar la gestión del ciclo de desarrollo de sus aplicaciones. La agenda que propuso Microsoft y la calidad de los ponentes tubo una clara respuesta. &lt;a href="http://www.plainconcetps.com" target="_blank"&gt;Plain Concepts&lt;/a&gt; era uno de los patrocinadores del evento y colaboramos con tres charlas. Yo hablé en el track de procesos, mi compañero Jose Luis Soria hablo de ecosistemas heterogéneos de desarrollo y Team System, y mis compañeros Pablo Peláez y Ricardo Acosta, hablaron de como integrar a los diseñadores en el ciclo de vida.&lt;/p&gt;  &lt;p&gt;Como no podía ser de otro modo hablé de Scrum, aderezándolo esta vez, con un poco de buenas prácticas y con un tema que cada vez me preocupa más, &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/01/29/exprimiendo-scrum-scrum-y-la-gesti-243-n-de-la-configuraci-243-n-i.aspx" target="_blank"&gt;la gestión de la configuración en equipos ágiles&lt;/a&gt;. El motivo es que veo cada vez más aberraciones de arquitectura, complejidad innecesaria y disfunciones en el ciclo de vida que se pueden solucionar con una política de gestión de la configuración. La gestión de la configuración es una de las ramas más desconocidas, más infrautilizadas y peor utilizadas cuando se usa, de la ingeniería del software.&lt;/p&gt;  &lt;p&gt;Os dejo la presentación que realice:&lt;/p&gt;  &lt;div style="text-align:left;width:425px;" id="__ss_2602858"&gt;&lt;object style="margin:0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alm09-scrumvisualstudioybuenasprcticas-rodrigocorral-091128104315-phpapp02&amp;amp;stripped_title=alm09-scrum-visual-studio-y-buenas-prcticas" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alm09-scrumvisualstudioybuenasprcticas-rodrigocorral-091128104315-phpapp02&amp;amp;stripped_title=alm09-scrum-visual-studio-y-buenas-prcticas" type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;p&gt;Como siempre, lo mejor en este tipo de eventos fue la oportunidad de charlar con compañeros de la comunidad, amigos, clientes y gente interesada en la gestión de sus proyectos y las tecnologías de Microsoft.&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161459" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Toc49cdsTcAbuwMv2MkY8H9yxwc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Toc49cdsTcAbuwMv2MkY8H9yxwc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Toc49cdsTcAbuwMv2MkY8H9yxwc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Toc49cdsTcAbuwMv2MkY8H9yxwc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZQjza5dmNwM:70vTUXXKHTY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZQjza5dmNwM:70vTUXXKHTY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZQjza5dmNwM:70vTUXXKHTY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=ZQjza5dmNwM:70vTUXXKHTY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/ZQjza5dmNwM" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/11/30/estuve-en-alm-09-sessions.aspx</feedburner:origLink></item><item><title>Estuve en: Foro de arquitectos sobre VSTS 2010 en Santander</title><link>http://feedproxy.google.com/~r/mlbb/~3/wZJfeVlMpcw/estuve-en-foro-de-arquitectos-sobre-vsts-2010-en-santander.aspx</link><pubDate>Sat, 28 Nov 2009 18:50:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:161461</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=161461</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=161461</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/11/28/estuve-en-foro-de-arquitectos-sobre-vsts-2010-en-santander.aspx#comments</comments><description>&lt;p&gt;Gracias a la amable invitación de Juan Carlos, MVP y miembro del CIIN fui invitado junto a &lt;a href="http://geeks.ms/blogs/ilanda" target="_blank"&gt;Ibon Landa&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/jirigoyen" target="_blank"&gt;Juan Irigoyen&lt;/a&gt;, a participar en un evento en Santander. El evento consistió en una reedición del &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/06/01/evento-xxiii-foro-de-arquitectos-novedades-en-la-gesti-243-n-de-proyectos-en-team-system-2010.aspx" target="_blank"&gt;Foro de Arquitectos&lt;/a&gt; (podéis seguir el link si queréis la ppt) en el que había participado en Madrid y Barcelona.&lt;/p&gt;  &lt;p&gt;El evento reunión a tres decenas de profesionales del mundo informático cántabro, entre los que quiero resaltar al compañero de Geeks.ms &lt;a href="http://geeks.ms/blogs/msierra" target="_blank"&gt;Miguel Sierra&lt;/a&gt;, más que nada por que en la comida posterior al evento hubo mucho debate muy interesante sobre CMMI vs. Scrum y la idea de realizar ese debate en forma de evento… ¡algo que seguro que haremos!, estad atentos.&lt;/p&gt;  &lt;p&gt;Sodercan TV siguió el evento y publicó una pequeña reseña sobre el evento. Desde luego no se quien eligió los cortes, pero en lo que a mi respecta… no me parece que me quisiese bien ;).&lt;/p&gt;  &lt;p&gt;&lt;object width="530" height="320" data="http://www.sodercan.tv/swf/flowplayer.commercial-3.1.1.swf?0.4538515211627119" type="application/x-shockwave-flash"&gt;&lt;param name="movie" value="http://www.sodercan.tv/swf/flowplayer.commercial-3.1.1.swf?0.4538515211627119" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="flashvars" value="config={&amp;quot;key&amp;quot;:&amp;quot;#@544fb20001df7416dcc&amp;quot;,&amp;quot;clip&amp;quot;:{&amp;quot;autoPlay&amp;quot;:false,&amp;quot;autoBuffering&amp;quot;:true,&amp;quot;url&amp;quot;:&amp;quot;http://www.sodercan.tv/resources/20091103Uxg5Z8k7Rz/content/vcompress.mp4&amp;quot;}}" /&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161461" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8kGC4jqD527ADMj4dTMRJizVBK4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8kGC4jqD527ADMj4dTMRJizVBK4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8kGC4jqD527ADMj4dTMRJizVBK4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8kGC4jqD527ADMj4dTMRJizVBK4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wZJfeVlMpcw:kP3YGrTNBQg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wZJfeVlMpcw:kP3YGrTNBQg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wZJfeVlMpcw:kP3YGrTNBQg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=wZJfeVlMpcw:kP3YGrTNBQg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/wZJfeVlMpcw" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/11/28/estuve-en-foro-de-arquitectos-sobre-vsts-2010-en-santander.aspx</feedburner:origLink></item><item><title>Exprimiedo Scrum: Scrum y el triangulo de la gestión de proyectos: la calidad</title><link>http://feedproxy.google.com/~r/mlbb/~3/Hrg3p25CvPI/exprimiedo-scrum-scrum-y-el-triangulo-de-la-gesti-243-n-de-proyectos.aspx</link><pubDate>Mon, 09 Nov 2009 06:18:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:157360</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=157360</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=157360</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/11/09/exprimiedo-scrum-scrum-y-el-triangulo-de-la-gesti-243-n-de-proyectos.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Triangulo" border="0" alt="Triangulo" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Triangulo_5F00_4E607B9F.jpg" width="300" height="285" /&gt; Escribía hace un tiempo sobre &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/08/23/Lo-quiero-todo_2C00_-todo-y-todo_2620_-o-la-triste-realidad-del-tri_E100_ngulo-de-la-gesti_F300_n-de-proyectos.aspx" target="_blank"&gt;el triangulo de gestión de proyectos&lt;/a&gt; y la férrea dictadura que impone sobre la gestión de proyectos. En esencia, uses la metodología que uses para la gestión de proyectos o incluso si no usas ninguna hay cuatro factores sobre los que, como gestor de proyectos, puedes llevar a cabo tu gestión: la calidad, el alcance, el coste y el tiempo. De todos estos factores, el cliente puede controlar como máximo, tres. El cuarto será el que nos permite gestionar. Si el cliente o alguien externo a la gestión del proyecto controla la totalidad de los aspectos ¿que papel nos queda como gestores del proyecto?.&lt;/p&gt;  &lt;p&gt;Dado que el dichoso tirano triángulo nos impone su realidad, cabe plantearse una serie de cuestiones sobre el mismo y su relación con Scrum: ¿Cuál es la relación de Scrum con estos factores? ¿Cómo se actúa sobre ellos en Scrum? ¿Cómo condicionan esta metodología? ¿Qué decisiones explicitas han tomado los diseñadores de Scrum sobre ellos? Estas son las preguntas que quiero responder, en la medida de mis conocimientos, con esta serie de post.&lt;/p&gt;  &lt;p&gt;Hoy hablaremos de la calidad, desde la perspectiva de Scrum.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/09/02/En-el-software_2C00_-la-calidad_2C00_-no-es-opcional.aspx" target="_blank"&gt;La calidad no es opcional&lt;/a&gt;, no es un factor sobre el que podamos especular. Ni siquiera lo podemos gestionar explícitamente: cualquier decisión que tomemos puede ser dañina, vaya esta en el sentido de incrementarla como en el sentido de reducirla. Es un aspecto que siempre decide el cliente no quien gestiona el proyecto. Si decidimos recortar calidad para ganar velocidad, por ejemplo, tarde o temprano lo pagaremos si la calidad que logramos no es la que el cliente está dispuesto a aceptar. &lt;/p&gt;  &lt;p&gt;El riesgo, ocurre a menudo, es sobrereaccionar. Para asegurarnos de que cumplimos las expectativas ponemos más calidad de la necesaria en el proyecto. El problema es que la calidad adicional tiene un coste, pero sin embargo, no es percibida por el cliente. Suelo poner siempre el mismo ejemplo, que explica muy bien este asunto, solo es un ejemplo, que nadie se quede con los valores absolutos. A mi me gusta el vino, el buen vino, estoy dispuesto a pagar por un vino de cierta calidad. Si alguien me quiere regalar vino, que no se gaste más de 25 euros, ni menos de 10. Por debajo de 10 euros, es probable que el regalo no cumpla su cometido de agradarme, por encima de 25, estará tirando el dinero, ¡mi paladar no es capaz de distinguir un vino de 25 euros, de uno de 35!. A partir de 25 euros todos los vinos me parecen excelentes. Descubrir el nivel de calidad que satisface al cliente al menor coste, es nuestra principal labor a la hora de gestionar la calidad.&lt;/p&gt;  &lt;p&gt;El otro aspecto clave la gestión de la calidad es mantenerla a lo largo del proyecto. Es sumamente difícil medir el nivel de calidad de una manera objetiva, precisamente, por que es algo que depende de los usuarios, de los clientes y de su percepción subjetiva. Pero siempre tenemos una idea más o menos intuitiva o analítica (será más analítica si tenemos métricas claras, un proceso de aseguramiento y validación y sobre todo si tenemos testers) sbore cual es nuestro nivel de calidad que nuestro cliente requiere. Y sobre todo de cuan lejos estamos del nivel de calidad que nuestro cliente esta dispuesto a aceptar: ¿se beberá nuestro cliente un Don Simón o un Castillo de Vulpi (dignísimos vinos en brick para calimotxo, pero capaces de corroer una copa de cristal) sin negarse a pagar la cuenta?. Supongamos que no, ¿cómo podemos descubrir que nuestro cliente no se conformará con nuestro Don Simón, sino que quiere mínimo un rioja joven un poco decente y en botella?. Y sobre todo, una vez que lo descubrimos, que sabemos el nivel mínimo de calidad que satisface a nuestro cliente, ¿cómo aseguramos que no estamos elaborando Don Simón?. Por que estaremos de acuerdo en que si estamos elaborando Don Simón es muy muy difícil que al final, hagamos lo que hagamos, logremos que nos salga un Vega Sicilia (¡hay clientes muy exigentes!). Debemos evitar a toda costa &lt;a href="http://geeks.ms/blogs/rcorral/archive/2007/01/18/evitar-quebraderos-de-cabeza-al-final-de-los-proyectos.aspx" target="_blank"&gt;darnos cuenta al final de que no hemos alcanzado el nivel de calidad&lt;/a&gt; que nuestro cliente requiere, es un riesgo que no podemos asumir.&lt;/p&gt;  &lt;p&gt;El único enfoque que funciona, es, sin duda el mantener de manera constante, durante toda la vida del proyecto, un nivel de calidad que sea aceptable al cliente. Si no averiguamos el nivel de calidad que el cliente esta dispuesto a aceptar y no lo mantenemos a lo largo del ciclo del vida del proyecto, a final, cuando los recursos y el tiempo que nos queden sean más bien justos, tendremos que, aunque la funcionalidad este completa, el proyecto se alargará para alcanzar el nivel de calidad necesario.&lt;/p&gt;  &lt;p&gt;Las claves son claras: descubrir el nivel mínimo de calidad que el cliente esta dispuesto a aceptar y mantenerse alrededor del mismo durante todo el proyecto. La pregunta es ¿qué mecanismos establece Scrum para que esto ocurra?: El sprint review y los incrementos de funcionalidad potencialmente entregables.&lt;/p&gt;  &lt;p&gt;El &lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/11/23/las-reglas-de-scrum-iii-el-sprint-review-meeting.aspx" target="_blank"&gt;sprint review&lt;/a&gt;, actúa como regulador de la calidad. Por un lado nos va a permitir detectar, mediante el feedback que los asistentes aporten, si estamos lejos o no del nivel de calidad requerido. Además, que el equipo presente las nuevas funcionalidades, es un catalizador clave de la calidad: asegurando una calidad mínima (da mucha vergüenza que te ‘casque’ una demo) y asegurando que el equipo percibe cual es el nivel de calidad mínimo aceptable.&lt;/p&gt;  &lt;p&gt;Los incrementos de funcionalidad potencialmente entregables son otro aspecto clave de Scrum. Si algo es ‘potencialmente entregable’, como debe ser el resultado de todo sprint en Scrum, debe cumplir las expectativas de calidad de nuestro clientes (o de su proxy, el Product Owner). Si algo no cumple las expectativas del cliente, no está completado y no se sigue avanzando. Esta es la única manera de asegurar que el equipo no toma atajos sacrificando funcionalidad o no cae en el preciosismo, añadiendo calidad que el cliente no está dispuesto a apreciar y mucho menos a pagar.&lt;/p&gt;  &lt;p&gt;Un error habitual es recortar el sprint review o saltárselo, de tal manera que el equipo nunca llega a descubrir cual es el nivel de calidad mínimo aceptable por el cliente o no se asegura que no estamos lejos de este.&lt;/p&gt;  &lt;p&gt;En la próxima entrega, Scrum y el triangulo de la gestión de proyectos: El alcance.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157360" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/udnJBOWDUScdV60GCr0dzfrYXzs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/udnJBOWDUScdV60GCr0dzfrYXzs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/udnJBOWDUScdV60GCr0dzfrYXzs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/udnJBOWDUScdV60GCr0dzfrYXzs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Hrg3p25CvPI:TcUc86tZE-s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Hrg3p25CvPI:TcUc86tZE-s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Hrg3p25CvPI:TcUc86tZE-s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=Hrg3p25CvPI:TcUc86tZE-s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/Hrg3p25CvPI" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Calidad/default.aspx">Calidad</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/11/09/exprimiedo-scrum-scrum-y-el-triangulo-de-la-gesti-243-n-de-proyectos.aspx</feedburner:origLink></item><item><title>Agile Open Spain 2009: ¡impresionante!</title><link>http://feedproxy.google.com/~r/mlbb/~3/EuEK6FiExic/agile-open-spain-2009-161-impresionante.aspx</link><pubDate>Mon, 26 Oct 2009 06:46:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:158844</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=158844</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=158844</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/10/26/agile-open-spain-2009-161-impresionante.aspx#comments</comments><description>&lt;p&gt;Aun estoy que no me lo creo. Pedazo de evento nos ha salido, y cuando digo nos ha salido me refiero a los 160, si 160, asistentes. Aunque &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/09/20/plain-concepts-patrocinador-del-agile-open-spain-2009.aspx"&gt;los patrocinadores y la organizaci&amp;oacute;n&lt;/a&gt; tambi&amp;eacute;n hemos tenido algo que ver seguro. No cito a nadie de la organzaci&amp;oacute;n para no dejarme a nadie: compromiso compartido y responsabilidad compartida, para lo bueno y lo malo. &lt;/p&gt;
&lt;p&gt;No esperaba yo tanto de este evento, sobre todo era bastante esc&amp;eacute;ptico en lo que al formato de &lt;a target="_blank" href="http://www.agile-spain.com/que-es-como-hacer-open-space"&gt;open space&lt;/a&gt; se refiere. Eso de no tener una lista de sesiones de antemano me pon&amp;iacute;a un poco nervioso &amp;iquest;c&amp;oacute;mo pod&amp;iacute;a saber que las sesiones merec&amp;iacute;an un viaje desde Bilbao? &amp;iexcl;Nada me garantizaba tener un hueco a pesar de que mi empresa patrocinaba el evento! &amp;iquest;y si no hab&amp;iacute;a temas suficientes? &amp;iquest;y si hab&amp;iacute;a mucho? &amp;iquest;y si construir la agenda era un proceso eterno?&amp;hellip; El resultado a tener de la retrospectiva que entre todos los asistentes realizamos al final del evento no puede ser m&amp;aacute;s satisfactorio. En lo personal decir que a sido uno de los eventos en los que m&amp;aacute;s he disfrutado&amp;hellip; y mira que &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx"&gt;he participado en eventos&lt;/a&gt; &amp;iquest;eh?&amp;hellip;&lt;/p&gt;
&lt;p&gt;La primera jornada del evento, viernes por la tarde, se dedic&amp;oacute; a montar la rejilla. B&amp;aacute;sicamente el proceso es escribir el t&amp;iacute;tulo de tu propuesta (sesi&amp;oacute;n, debate, charla magistral o lo que sea) y tu nombre en una tarjeta, comentar en un minuto de que va el tema y luego poner tu tarjeta en un panel con una chincheta. Luego todos los asistentes cogen tres pegatinas rojas que representan votos y las reparten por aquellas sesiones de su inter&amp;eacute;s. Se recogen las sesiones m&amp;aacute;s votadas y de manera colaborativa se distribuyen por la rejilla de sesiones. Entre mi compa&amp;ntilde;ero &lt;a target="_blank" href="http://geeks.ms/blogs/jlsoria/"&gt;Jose Luis&lt;/a&gt; y yo propusimos cinco sesiones (tampoco hay que abusar) y salieron las cinco. Una pena que una de J se solapo con una m&amp;iacute;a y no pude asistir. El que salgan todas tus propuestas tiene una pega, no puedes ir a las sesiones de los dem&amp;aacute;s&amp;hellip; es el &amp;uacute;nico&amp;nbsp; pero que puedo poner. A continuaci&amp;oacute;n pod&amp;eacute;is ver la rejilla. Repasando la rejilla he visto que hay una sesi&amp;oacute;n m&amp;iacute;a a la que no asist&amp;iacute;, &amp;iquest;Ya tengo Scrum y ahora qu&amp;eacute;?, se fusiono con otras y no me di cuenta. Pens&amp;eacute;, err&amp;oacute;neamente que se hab&amp;iacute;a quedado fuera, lamento el error y pido disculpas.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/SesionesAgileOpenSpain_5F00_34C00AB7.jpg"&gt;&lt;img height="458" width="610" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/SesionesAgileOpenSpain_5F00_thumb_5F00_251CAD4E.jpg" alt="Sesiones Agile Open Spain" border="0" title="Sesiones Agile Open Spain" style="border-right-width:0px;margin:10px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Las sesiones a la que acud&amp;iacute; fueron:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artesan&amp;iacute;a del software, propuesta por Xavi Gost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Esta sesi&amp;oacute;n molo de verdad, la m&amp;aacute;s friki, de todas la que asist&amp;iacute;, sin duda. Pura diversi&amp;oacute;n. La radical propuesta de Xavi (al que le &amp;lsquo;da verg&amp;uuml;enza ser tan frki&amp;rsquo; jajajaj&amp;hellip;) era dejar fuera de la sala todo lo que oliese a negocio y centrarnos en la parte m&amp;aacute;s artesanal, l&amp;uacute;dica y motivadora del desarrollo de software. A final la sesi&amp;oacute;n se centro en la belleza del c&amp;oacute;digo. Xavi defend&amp;iacute;a que el c&amp;oacute;digo debe ser bello, que el c&amp;oacute;digo bello en un valor en si mismo y yo, en otra l&amp;iacute;nea m&amp;aacute;s utilitarista comentaba que para m&amp;iacute; el c&amp;oacute;digo bello es el c&amp;oacute;digo bueno. No todo el mundo compart&amp;iacute;a mi opini&amp;oacute;n. Se habl&amp;oacute; de analizadores est&amp;aacute;ticos, que garantizan un m&amp;iacute;nimo de calidad pero nunca belleza y todos concluimos por unanimidad que el &lt;a target="_blank" href="http://www.yapceurope.org/2001/proceedings/26/fractalcamel/camel_00.html"&gt;camello de Perl&lt;/a&gt; es tan bello como mal ejemplo de c&amp;oacute;digo mantenible. Tambi&amp;eacute;n se hablo de las escuelas de programaci&amp;oacute;n y su relaci&amp;oacute;n con las escuelas de Kung Fu. La idea de Xavi que comparto plenamente es que a programar se aprende principalmente con maestros, con gente que te ayuda, es paciente contigo, te corrige el c&amp;oacute;digo con cari&amp;ntilde;o (o tobas, en esto no nos pusimos de acuerdo), y leyendo buenos libros. Pod&amp;eacute;is ver otro resumen de esta sesi&amp;oacute;n (y de otras) y la lista completa de libros propuestos en el &lt;a target="_blank" href="http://prietopa.wordpress.com/2009/10/25/agile-open-spain-2009-resumen-de-las-charlas-a-las-que-he-asistido/"&gt;post que ha publicado Jose Manuel Prieto&lt;/a&gt; sobre el evento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Control en proyectos &amp;aacute;giles, propuesta por mi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mi idea para esta sesi&amp;oacute;n era debatir y compartir con los asistentes las m&amp;eacute;tricas y t&amp;eacute;cnicas de control y seguimiento de proyectos que utilizan las metodolog&amp;iacute;as &amp;aacute;giles. Utilice la siguiente ppt para romper el hielo:&lt;/p&gt;
&lt;div id="__ss_2342132" style="text-align:left;width:425px;"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=controldeproyectosconmetodologasgilesyteamsytem-091025121749-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=control-de-proyectos-con-metodologas-giles-y-team-sytem" width="425" height="355"&gt;&lt;/embed&gt;&lt;/div&gt;
&lt;p&gt;Luego a base de preguntas a la audiencia y su participaci&amp;oacute;n llegamos a las siguientes conclusiones, que fuimos poniendo en una pizarra durante la sesi&amp;oacute;n: &lt;/p&gt;
&lt;p&gt;La base del seguimiento del &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2008/10/02/exprimiendo-scrum-scrum-y-el-control-del-proyecto-i-el-avance.aspx"&gt;avance de un proyecto&lt;/a&gt; de un proyecto es utilizar tareas peque&amp;ntilde;as y binarias. &lt;br /&gt;Es necesario &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/01/14/exprimiendo-scrum-scrum-y-el-control-del-proyecto-ii-la-visibilidad.aspx"&gt;visibilizar y medir el avance&lt;/a&gt;. &lt;br /&gt;La m&amp;eacute;trica clave es la velocidad, pero hacia fuera del equipo interesa m&amp;aacute;s el grado de cumplimiento de lo comprometido en el sprint. &lt;br /&gt;Para cumplir hace falta compromiso, sin equipos dedicados no se logra compromiso. &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/06/25/Exprimiendo-Scrum_3A00_-_BF00_Cu_E100_l-es-tu-definici_F300_n-de-equipo_3F00_.aspx"&gt;Definir tus equipos&lt;/a&gt; es vital. &lt;br /&gt;Solo con &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/tags/Estimaci_26002300_243_3B00_n/default.aspx"&gt;estimaciones&lt;/a&gt; colegiadas y consensuadas, logramos compromiso por parte del equipo. &lt;br /&gt;Es vital la priorizaci&amp;oacute;n. Cuando las m&amp;eacute;tricas cantan que estamos retrasados, no tenemos m&amp;aacute;s opci&amp;oacute;n que recortar funcionalidad. &lt;br /&gt;Sin priorizaci&amp;oacute;n ese recorte deja fuera caracter&amp;iacute;sticas importantes y da&amp;ntilde;a el resultado del proyecto irreversiblemente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tres a&amp;ntilde;os de proyecto con Scrum, propuesta por mi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En esta sesi&amp;oacute;n, ya un cl&amp;aacute;sico, pues la he presentado en una u otra forma en varios foros diferentes trate de comentar mis experiencias de tres a&amp;ntilde;os en un proyecto gestionado con Scrum y Team System como herramienta de gesti&amp;oacute;n. Una vez m&amp;aacute;s use una ppt para romper el hielo:&lt;/p&gt;
&lt;div id="__ss_2342533" style="text-align:left;width:425px;"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scrumteamsystemyelmundoreal-091025124916-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=scrum-team-system-y-el-mundo-real" width="425" height="355"&gt;&lt;/embed&gt;&lt;/div&gt;
&lt;p&gt;En esta sesi&amp;oacute;n hable de las dificultades, las acciones tomadas ante ellas y los resultados que nos ha dado la adopci&amp;oacute;n de Scrum y Team System en el desarrollo de Captor 3 en Sisteplant. Angel Agueda tiene un &lt;a target="_blank" href="http://legnita.wordpress.com/2009/10/24/agile-open-spain-2009-dia-2-las-sesiones/"&gt;excelente resumen sobre esta sesi&amp;oacute;n&lt;/a&gt; en su blog, as&amp;iacute; que os remito a el.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oficina de proyectos &amp;aacute;gil, propuesta por &lt;/strong&gt;&lt;a target="_blank" href="http://www.proyectosagiles.org/"&gt;&lt;strong&gt;Xavier Albaladejo&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lo mejor de la sesi&amp;oacute;n sin duda, escuchar las experiencias de Xavier en Indra y ver como est&amp;aacute; cambiando el panorama de la gesti&amp;oacute;n de proyectos en empresas de esa envergadura gracias a tipos como &amp;eacute;l. La otra gran cosa fue coincidir con mi viejo conocido &lt;a target="_blank" href="http://www.presionblogosferica.com/"&gt;Angel Medinilla&lt;/a&gt;. Angel es uno de los grandes del agil&amp;iacute;smo en Espa&amp;ntilde;a, &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/09/25/ya-soy-certified-scrum-master-191-y.aspx"&gt;coincid&amp;iacute; con &amp;eacute;l en el curso de CSM&lt;/a&gt; y desde entonces, de un modo u otro hemos estado en contacto. Poder debatir con &amp;eacute;l la visi&amp;oacute;n de una oficina de proyectos &amp;aacute;gil fue toda una experiencia. La principal conclusi&amp;oacute;n de la sesi&amp;oacute;n para m&amp;iacute; fue que una oficina de proyectos (PMO) que de una visi&amp;oacute;n global de todos los proyectos de la empresa y que de soporte en ingenier&amp;iacute;a &amp;aacute;gil a todos los proyectos es posible y deseable. Tambi&amp;eacute;n fue muy interesante la aportaci&amp;oacute;n de gente que ya est&amp;aacute; en PMOs, como Juan Mari Huarte de Orona.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentaci&amp;oacute;n &amp;aacute;gil e historias de usuario propuesta por Jose Luis Soria, &lt;/strong&gt;tambi&amp;eacute;n de Plain Concepts y por otra persona cuyo nombre no recuerdo (disculpas):&lt;/p&gt;
&lt;p&gt;Excelente sesi&amp;oacute;n en la que se trataron temas como:&lt;/p&gt;
&lt;p&gt;&amp;iquest;C&amp;uacute;al es la utilidad de la documentaci&amp;oacute;n? &lt;br /&gt;&amp;iquest;C&amp;oacute;mo de &amp;uacute;tiles son las historias? &lt;br /&gt;&amp;iquest;C&amp;oacute;mo es una buena historia? &lt;br /&gt;La importancia de las condiciones de aceptaci&amp;oacute;n &lt;br /&gt;Documentar frente a refactorizar&lt;/p&gt;
&lt;p&gt;Las principales conclusiones:&lt;/p&gt;
&lt;p&gt;La documentaci&amp;oacute;n es un subproducto del software que funciona. Debemos evitarla. &lt;br /&gt;Los wikis pueden ser de gran ayuda, pero tambi&amp;eacute;n tienen problemas relacionados con la organizaci&amp;oacute;n, la responsabilidad sobre el contenido etc&amp;hellip;. Ninguno de estos problemas anulan su utilidad. &lt;br /&gt;Debemos tender a generar toda la documentaci&amp;oacute;n. &lt;br /&gt;La &amp;uacute;nica documentaci&amp;oacute;n &amp;uacute;nica es aquella que evoluciona a la vez que el c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Seguro que Jose Luis nos contar&amp;aacute; m&amp;aacute;s cosas sobre esta sesi&amp;oacute;n y sobre la otra sesi&amp;oacute;n que propuso sobre gesti&amp;oacute;n de la configuraci&amp;oacute;n en proyectos &amp;aacute;giles.&lt;/p&gt;
&lt;p&gt;Destacar la aportaci&amp;oacute;n de Joao Gama en esta sesi&amp;oacute;n. No todos los d&amp;iacute;as se encuentra uno con un Product Owner profesional y que se dedica a ello &amp;lsquo;full time&amp;rsquo;. Esto es algo que me encanto del formato open space, &amp;iexcl;cualquiera puede aportar en una sesi&amp;oacute;n!.&lt;/p&gt;
&lt;p&gt;Mi conclusi&amp;oacute;n sobre el evento: excelente, &lt;strong&gt;no he estado nunca en un evento m&amp;aacute;s participativo&lt;/strong&gt;. Todo el mundo tuvo voz y todo el mundo ten&amp;iacute;a cosas interesantes que decir. &lt;strong&gt;Pens&amp;eacute; que no ten&amp;iacute;a mucho que aprender sobre agilidad, que era un campo ya muy arado, &amp;iexcl;como me equivocaba!.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Y sab&amp;eacute;is lo mejor &amp;iexcl;este era el primer evento de Agile Spain!&amp;hellip; en pr&amp;oacute;ximas ocasiones no se que va a ser esto&amp;hellip;&lt;/p&gt;
&lt;p&gt;Por &amp;uacute;ltimo decir que tambi&amp;eacute;n aprovechamos para constituir oficialmente como asociaci&amp;oacute;n Agile Spain. Puedo presumir de ser uno de los que han firmado los estatutos aun a costa de casi perder el avi&amp;oacute;n&amp;hellip; menos mal que lo cog&amp;iacute;, sino me cuesta el matrimonio y con raz&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Pod&amp;eacute;is encontrar una recapitulaci&amp;oacute;n de post, fotos y twits sobre el evento &lt;a target="_blank" href="http://groups.google.es/group/agile-spain/web/agileopenspain2009"&gt;en esta p&amp;aacute;gina&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158844" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4kqKn-saex5nVpIWryMnPToBAfE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4kqKn-saex5nVpIWryMnPToBAfE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4kqKn-saex5nVpIWryMnPToBAfE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4kqKn-saex5nVpIWryMnPToBAfE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=EuEK6FiExic:Fp6u3trd7lU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=EuEK6FiExic:Fp6u3trd7lU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=EuEK6FiExic:Fp6u3trd7lU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=EuEK6FiExic:Fp6u3trd7lU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/EuEK6FiExic" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Comunidad/default.aspx">Comunidad</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Agile+Spain/default.aspx">Agile Spain</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/10/26/agile-open-spain-2009-161-impresionante.aspx</feedburner:origLink></item><item><title>Luchando contra los interbloqueos en Sql Server (II): Read Commited y el modo snapshot</title><link>http://feedproxy.google.com/~r/mlbb/~3/ecQWA8ra7LI/luchando-contra-los-interbloqueos-en-sql-server-ii-read-commited-y-el-modo-snapshot.aspx</link><pubDate>Tue, 20 Oct 2009 15:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:158444</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=158444</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=158444</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/10/20/luchando-contra-los-interbloqueos-en-sql-server-ii-read-commited-y-el-modo-snapshot.aspx#comments</comments><description>&lt;p&gt;Hace ya un tiempo escribía sobre &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/01/05/luchando-contra-los-interbloqueos-en-sql-server.aspx" target="_blank"&gt;cómo evitar los interbloqueos en Sql Server y como diagnosticar que les está causando&lt;/a&gt; cuando se producen. Hoy quiero contar un pequeño ‘truco’ que nos puede ayudar a, sin cambio alguno en el código de nuestra aplicación, reducir las probabilidades de sufrir un bloqueo. Este pequeño truco es un ‘antídoto’ que nos permite solucionar a menudo problemas de interbloqueos con un mínimo impacto sobre la aplicación. Además, esta técnica también puede mejorar el rendimiento de aquellas aplicaciones que estén sufriendo problemas de esperas en bloqueos entre lectores (&lt;em&gt;selects&lt;/em&gt;) y escritores (&lt;em&gt;updates&lt;/em&gt; e &lt;em&gt;inserts&lt;/em&gt;).&lt;/p&gt;  &lt;p&gt;El nivel de aislamiento por defecto de Sql Server es Read Commited. Esto quiere decir que este nivel es el más utilizado y que si no tienes ni idea de qué es el nivel de aislamiento este es el que estás utilizando. En este nivel de aislamiento, con el fin de evitar las lecturas sucias, cuando una consulta esta actualizando una fila, establece un bloqueo sobre la misma. Este bloqueo hace que quien quiere leer esta fila, se encuentre con que debe esperar. Este bloqueo en principio inocuo, puede se origen de interbloqueos en aplicaciones altamente concurrentes que no se hayan diseñado adecuadamente. Cuantos mas bloqueos, menos rendimiento, y más posibilidades de interbloqueos Tengo que decir, antes de que mi compañero &lt;a href="http://geeks.ms/blogs/palvarez/" target="_blank"&gt;Pablo Alvarez Doval&lt;/a&gt;, gurú de estos temas, me saque los colores, que he simplificado mucho la película, para no liar el asunto.&lt;/p&gt;  &lt;p&gt;A partir de Sql Server 2005 se introdujo un nuevo modo de funcionamiento para el nivel de aislamiento&lt;em&gt; Read Commited&lt;/em&gt;, que sigue evitando las lecturas sucias y que también evita ese posible bloque dañino del que hablábamos. Este modo es el modo &lt;em&gt;Snapshot&lt;/em&gt; del nivel de aislamiento &lt;em&gt;Read Commited&lt;/em&gt;, en el que, simplificando de nuevo el asunto, en lugar de establecer un bloqueo que para las lecturas, hace una copia en la sombra (snapshot) de las filas que se están modificando y si alguien intenta leer no lo bloquea sino que devuelve el valor copiado en la sombra. Resumiendo, no hay lecturas sucias como exige el nivel &lt;em&gt;Read&lt;/em&gt; &lt;em&gt;Commited&lt;/em&gt; y además no hay bloqueo.&lt;/p&gt;  &lt;p&gt;Una ventaja adicional de este modo, es que es así y solo así como Oracle se comporta, luego si tu aplicación soporta Oracle y Sql Server, con este modo consigues el mismo comportamiento en ambas bases de datos en lo que a las transacciones &lt;em&gt;Read&lt;/em&gt; &lt;em&gt;Commited&lt;/em&gt; se refiere.&lt;/p&gt;  &lt;p&gt;Evidentemente nada es gratis en la vida, y a cambio de no tener bloqueos, vamos a tener más trasiego en la base de datos temporal (&lt;em&gt;TempDb&lt;/em&gt;) donde se almacenan los &lt;em&gt;Snapshot&lt;/em&gt; y esta va a crecer en tamaño. En la mayoría de las ocasiones este es un mal menor.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Corolario: Si tienes una aplicación que está sufriendo bloqueos o interbloqueos, donde hay tablas que se escriben y leen concurrentemente, activar el modo &lt;em&gt;Snapshot&lt;/em&gt; puede ayudarte a solucionar el problema.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Os dejo un script que establece el modo &lt;em&gt;Snapshot&lt;/em&gt; para el nivel de aislamiento &lt;em&gt;Read Commited&lt;/em&gt; para un base de datos:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code&gt;&lt;span style="font-family:courier new;font-size:10pt;"&gt;&lt;span style="font-style:italic;color:green;"&gt;-- Script que cambia en comportamiento del nivel de aislamiento&lt;/span&gt;           &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;-- READ_COMMITED para que use snapshots (READ_COMMITTED_SNAPSHOT ON)&lt;/span&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;-- ¡OJO!: Ejecutar este script establece la base de datos a modo&lt;/span&gt;           &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;-- de usuario único y por tanto termina las conexiones actuales a la&lt;/span&gt;           &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;-- base de datos&lt;/span&gt;           &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;           &lt;br /&gt;-- Establecer la base de datos sobre la que haremos el cambio&lt;/span&gt;           &lt;br /&gt;&lt;span style="color:blue;"&gt;USE&lt;/span&gt;&amp;#160;&lt;span style="color:maroon;"&gt;&amp;lt;nombreDeBaseDeDatos&amp;gt;&lt;/span&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;span style="font-style:italic;color:green;"&gt;-- Comprobar que la versión es SQL Server 2005 o superior&lt;/span&gt;           &lt;br /&gt;&lt;span style="color:blue;"&gt;IF&lt;/span&gt;&amp;#160;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt;&amp;#160;&lt;span style="color:#8000ff;"&gt;@@microsoftversion&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;/&lt;/span&gt;&amp;#160;&lt;span style="color:black;"&gt;0x01000000&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;&amp;gt;=&lt;/span&gt;&amp;#160;&lt;span style="color:black;"&gt;9&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;           &lt;br /&gt;&amp;#160; &lt;span style="color:blue;"&gt;BEGIN&lt;/span&gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt;&amp;#160; &lt;span style="color:#8000ff;"&gt;@sql&lt;/span&gt;&amp;#160;&lt;span style="font-style:italic;color:black;"&gt;VARCHAR&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;8000&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt;&amp;#160;&lt;span style="color:#8000ff;"&gt;@sql&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;=&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;&amp;#39;ALTER DATABASE &amp;#39;&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="font-style:italic;color:fuchsia;"&gt;DB_NAME&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;&amp;#39; SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="font-family:courier new;font-size:10pt;"&gt;&lt;span style="color:red;"&gt;ALTER DATABASE &amp;#39;&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="font-style:italic;color:fuchsia;"&gt;DB_NAME&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;&amp;#39; SET READ_COMMITTED_SNAPSHOT ON;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ALTER DATABASE &amp;#39;&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="font-style:italic;color:fuchsia;"&gt;DB_NAME&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;&amp;#160;&lt;span style="color:silver;"&gt;+&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;&amp;#39; SET MULTI_USER; &amp;#39;&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;EXEC&lt;/span&gt;&lt;span style="color:maroon;"&gt;(&lt;/span&gt;&lt;span style="color:#8000ff;"&gt;@sql&lt;/span&gt;&lt;span style="color:maroon;"&gt;)&lt;/span&gt;           &lt;br /&gt;&amp;#160; &lt;span style="color:blue;"&gt;END&lt;/span&gt;           &lt;br /&gt;&lt;span style="color:blue;"&gt;ELSE&lt;/span&gt;           &lt;br /&gt;&amp;#160; &lt;span style="color:blue;"&gt;PRINT&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;&amp;#39;La versión de su SQL Server no soporta READ_COMMITTED_SNAPSHOT&amp;#39;&lt;/span&gt;           &lt;br /&gt;&lt;span style="color:blue;"&gt;GO&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;¡Suerte en la batalla contra los bloqueos y los interbloqueos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158444" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hsKinjNM0Upn2T26rhwr9rqd3Zo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hsKinjNM0Upn2T26rhwr9rqd3Zo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hsKinjNM0Upn2T26rhwr9rqd3Zo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hsKinjNM0Upn2T26rhwr9rqd3Zo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ecQWA8ra7LI:iGnMP0ouIWg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ecQWA8ra7LI:iGnMP0ouIWg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ecQWA8ra7LI:iGnMP0ouIWg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=ecQWA8ra7LI:iGnMP0ouIWg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/ecQWA8ra7LI" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Optimizaci_26002300_243_3B00_n/default.aspx">Optimizaci&amp;#243;n</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/10/20/luchando-contra-los-interbloqueos-en-sql-server-ii-read-commited-y-el-modo-snapshot.aspx</feedburner:origLink></item><item><title>Estuve, subido a la nube con Windows Azure, en el CodeCamp de Tarragona</title><link>http://feedproxy.google.com/~r/mlbb/~3/fZc8j_oT9T0/estuve-subido-a-la-nube-con-windows-azure-en-el-codecamp-de-tarragona.aspx</link><pubDate>Mon, 19 Oct 2009 13:41:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:158336</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=158336</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=158336</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/10/19/estuve-subido-a-la-nube-con-windows-azure-en-el-codecamp-de-tarragona.aspx#comments</comments><description>&lt;p&gt;Este pasado fin de semana tuve el enorme placer de ser uno de los ponentes del &lt;a href="http://www.codecamp.es" target="_blank"&gt;CodeCamp&lt;/a&gt;, evento que mi empresa Plain Concepts patrocinaba siguiendo con su línea de continuo apoyo a la comunidad de desarrolladores en .Net. Tuve la oportunidad de exponer en dos sesiones una sobre la plataforma Windows Azure y otra, compartida con dos titanes del tema Luis Fraile y Bruno Capuano, sobre las novedades de VSTS 2010. &lt;/p&gt;  &lt;p&gt;Sobre la sesión de Azure puedo decir que me sorprendió gratamente la asistencia que hubo, no esperaba tanto interés sobre el tema, la verdad, y sin embargo la sala se llenó. A continuación os dejo la PPT que use, no tiene mucho contenido, puesto que al ser el evento un CodeCamp traté de mostrar código, pero quizás veáis en ella información que os interese. Si tenéis algún feedback sobre la charla, no dudéis en dejarlo en los comentarios de este post.&lt;/p&gt;  &lt;div style="text-align:left;width:425px;" id="__ss_2273701"&gt;&lt;object style="margin:0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=quieresestarenlasnubes-091019032630-phpapp01&amp;amp;stripped_title=windows-azure-quieres-estar-en-las-nubes" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=quieresestarenlasnubes-091019032630-phpapp01&amp;amp;stripped_title=windows-azure-quieres-estar-en-las-nubes" type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;p&gt;En la charla sobre las novedades de VSTS 2010, que puedo decir, que disfruté como un enano compartiendo sesión con Bruno y Luis. La verdad es que da gusto ver como cuando hay comunidad de por medio, podemos dejar a parte la lógica competencia entre empresas y pasar un rato charlando sobre los temas que nos apasionan.&lt;/p&gt;  &lt;p&gt;No puedo cerrar este post sin un agradecimiento explicito a la organización de evento. El esfuerzo realizado por los grupos de usuario implicados y por las personas que ha llevado adelante la organización a sido espectacular. Un diez señores, podéis sacar pecho de comunidad .Net. Además hay que destacar que en esta ocasión también Mono estuvo presente, más comunidad aun, incorporando otras plataformas. Jose Miguel Torres, Viçens Masanas, Toni Recio, Marc Rubiño (y seguro que algunos otros que me dejo), se han lucido con la organización. No es fácil montar un evento para trescientas personas y que no haya fricciones y todo vaya como la seda.&lt;/p&gt;  &lt;p&gt;Decir, por último que la sesiones fueron grabadas, así que supongo que, tras maquetarlas un poco, en un tiempo estarán disponibles para que las podáis disfrutar aquellos que no pudisteis asistir al evento, ¡estad atentos!.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158336" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tUfIjcHS0Y2Xo-XFP887gjrWgEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tUfIjcHS0Y2Xo-XFP887gjrWgEw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tUfIjcHS0Y2Xo-XFP887gjrWgEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tUfIjcHS0Y2Xo-XFP887gjrWgEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=fZc8j_oT9T0:1bW-PrD215g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=fZc8j_oT9T0:1bW-PrD215g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=fZc8j_oT9T0:1bW-PrD215g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=fZc8j_oT9T0:1bW-PrD215g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/fZc8j_oT9T0" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Azure/default.aspx">Azure</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/10/19/estuve-subido-a-la-nube-con-windows-azure-en-el-codecamp-de-tarragona.aspx</feedburner:origLink></item><item><title>¿Hasta donde podemos llegar?</title><link>http://feedproxy.google.com/~r/mlbb/~3/XlWVPLRVJFA/191-hasta-donde-podemos-llegar.aspx</link><pubDate>Mon, 28 Sep 2009 20:33:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:156932</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>22</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=156932</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=156932</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/09/28/191-hasta-donde-podemos-llegar.aspx#comments</comments><description>&lt;p&gt;&lt;img height="199" width="300" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Complejidad_5F00_2619B02E.jpg" align="right" alt="Complejidad" border="0" title="Complejidad" style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;Un anuncio de Microsoft decia: &amp;lsquo;hasta donde quieres llegar hoy&amp;rsquo; o algo as&amp;iacute;, pero la pregunta es m&amp;aacute;s bien &amp;iquest;hasta donde puede llegar la ingenier&amp;iacute;a del software?. Comenta Gustavo, vecino de blog y uno de los grandes de Sharepoint (y no solo de Sharepoint) que cada vez la complejidad de los proyectos de Sharepoint es mayor, tanto como para que en muchas ocasiones lo mejor sea &lt;a target="_blank" href="http://geeks.ms/blogs/gvelez/archive/2009/09/28/el-algoritmo-del-avestruz-en-sharepoint.aspx"&gt;esconder la cabeza como un avestruz&lt;/a&gt;.&amp;nbsp; Yo lo se bien, pase de conocer a fondo la versi&amp;oacute;n 2003 a caer en la sima de la transici&amp;oacute;n a 2007. Hace tiempo que deje de ser un experto en Sharepoint, si es que alguna vez lo fui del todo, el salto a la versi&amp;oacute;n 2007 me supero, demasiada complejidad para un humano mortal.&lt;/p&gt;
&lt;p&gt;En mi opini&amp;oacute;n lo que Gustavo comenta no solo est&amp;aacute; ocurriendo en Sharepoint. Es un problema generalizado, cada vez m&amp;aacute;s voces importantes del mundo de la ingenier&amp;iacute;a de software se preguntan si no hemos alcanzado un punto de singularidad en el que la complejidad de los problemas a resolver se ha incrementado m&amp;aacute;s all&amp;aacute; de lo manejable.&lt;/p&gt;
&lt;p&gt;Hace poco ve&amp;iacute;a un proyecto que han hecho una compa&amp;ntilde;eros de Plain Concepts. La interfaz es realmente acojonante, lo que antes ser&amp;iacute;an aburridas cajitas de texto y etiquetas ahora son preciosos controles de WPF que informan visualmente del estado de los aparatos que la aplicaci&amp;oacute;n monitoriza. Se cae la baba viendo la interfaz. Pero eso tiene un precio. Hay miles de l&amp;iacute;neas de WPF y XAML. &amp;iexcl;Miles de l&amp;iacute;neas en la interfaz de usuario!. Se que muchas son generadas, pero me da igual, generadas o no son fuente de complejidad. La herramienta las genera, pero tu las mantienes y cuando la herramienta falla o la abstracci&amp;oacute;n fuga, el problema es tuyo. M&amp;aacute;s c&amp;oacute;digo m&amp;aacute;s problemas. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los sistemas son cada vez m&amp;aacute;s complejos, exponencialmente m&amp;aacute;s complejos&lt;/strong&gt;, pero las herramientas han cambiado solo sutilmente. Ya nos sabemos &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx"&gt;eso de KISS&lt;/a&gt;, si, pero no es suficiente. En esencia, desde que &lt;a target="_blank" href="http://es.wikipedia.org/wiki/Grace_Hopper"&gt;Grace Murray&lt;/a&gt;, almirante de la marina estadounidense y probablemente la mujer m&amp;aacute;s influyente en la historia de la ingenier&amp;iacute;a de software, invento el compilador, no se ha producido un cambio cualitativo importante en la forma en que se hace software. Codificar, compilar, depurar. Solo se han a&amp;ntilde;adido billones de horas hombre al desarrollo de software. Fuerza bruta. El problema es hasta donde escala esta aproximaci&amp;oacute;n... cada vez parece m&amp;aacute;s que hemos tocado techo. Hay quien incluso ha puesto nombre a este problema: el dilema de la divergencia del software. Ah&amp;iacute; es nada&amp;hellip;&lt;/p&gt;
&lt;p&gt;Para que os hag&amp;aacute;is una idea. Un avi&amp;oacute;n de caza de los a&amp;ntilde;os 60, ten&amp;iacute;a t&amp;iacute;picamente unas cincuenta mil l&amp;iacute;neas de c&amp;oacute;digo, un caza moderno unos cinco millones de l&amp;iacute;neas de c&amp;oacute;digo. Cada vez me da m&amp;aacute;s por los &lt;a target="_blank" href="http://geeks.ms/blogs/144434.aspx"&gt;aviones para hablar de software&lt;/a&gt; :). En este periodo, pese a la evoluci&amp;oacute;n de las herramientas, los estudios m&amp;aacute;s optimistas sostiene que se ha doblado la productividad de los desarrolladores. Y mucha de esa productividad se ha ido en actividades de coordinaci&amp;oacute;n entre los miembros el equipo.&lt;/p&gt;
&lt;p&gt;Barry Boehm, padre del modelo COCOMO y padre del ciclo de vida en espiral, comentaba en 2004, en un conferencia auspiciada por el DoD (Department of Defence, el mayor contratista de software del mundo por mucho), que &amp;lsquo;la cantidad de software que el DoD necesita crece exponencialmente, por lo tanto nunca podremos completarlo en un tiempo finito de tiempo&amp;rsquo;, para echarse a llorar... o no, tambi&amp;eacute;n se puede hacer la lectura positiva: los inform&amp;aacute;ticos tenemos una cantidad de trabajo infinita por hacer.&lt;/p&gt;
&lt;p&gt;Yo personalmente soy pesimista. &lt;strong&gt;Todos los intentos de atajar la complejidad que hemos realizado han sido en vano&lt;/strong&gt;. Los patrones parec&amp;iacute;an prometedores, pero aunque &amp;uacute;tiles no han supuesto una revoluci&amp;oacute;n. Las herramientas 4GL se postularon como una especie de b&amp;aacute;lsamo de Saxafrax, que se quedo en nada &amp;iquest;alguien usa 4GL?. Las herramientas de modelado&amp;hellip; en fin&amp;hellip; esperemos a Oslo, pero mucho me temo que tampoco ser&amp;aacute; m&amp;aacute;gico&amp;hellip; y necesitamos mucha magia. Las herramientas no van a ser la soluci&amp;oacute;n al problema. Fijaros, llevo programando desde VB3.0. En la caja de todas la herramientas de programaci&amp;oacute;n que he usado desde entonces pon&amp;iacute;a algo parecido a &amp;lsquo;mejora tu productividad un X%, siendo X &amp;gt; 20&amp;rsquo;. He conocido VB4, VB5, VS6, VS2001 (productividad con esteroides gracias a .NET), VS2003&amp;hellip; hasta VS2010. Si cada versi&amp;oacute;n hubiese mejorado mi productividad lo que su marketing promet&amp;iacute;a ahora yo ser&amp;iacute;a capaz de programar con la mente.&lt;/p&gt;
&lt;p&gt;En el lado de los procesos de desarrollo, me conformo no ya con ganar productividad, sino simplemente con poner orden en el caos que se contempla en la gran mayor&amp;iacute;a de los equipos de desarrollo. Mejoras lo que se dice mejoras, se ven, pero no radicales no nos enga&amp;ntilde;emos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ahora todos los proyectos dan miedo, mucho miedo, no hay proyectos sencillos&lt;/strong&gt;. No los hay. Aun recuerdo cuando, en mi &amp;eacute;poca de freelance, yo, con veinte a&amp;ntilde;itos reci&amp;eacute;n cumplidos era el rey del mambo: &amp;iexcl;sabia que exist&amp;iacute;an los m&amp;oacute;dulos de clase, sab&amp;iacute;a que exist&amp;iacute;a DCOM y como hablar con SQL Server!, estaba a a&amp;ntilde;os luz del programador medio. Ahora todos los proyectos dan miedo. Hay unas frase de Linus Tordvals que son esclarecedoras: &amp;lsquo;No esperes hace nada grande en poco tiempo&amp;rsquo; dijo, &amp;lsquo;he estado trabajado en Linux trece a&amp;ntilde;os, y creo que lo hare durante bastante tiempo m&amp;aacute;s. Si hubiese pensando que me estaba metiendo en algo tan grande, nunca hubiese empezado&amp;rsquo;. Esclarecedor. Hay que tener un punto de incauto para meternos en los proyectos que nos metemos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El tema se resume en dos frases, una de Donal Knuth: &amp;lsquo;hacer software es dif&amp;iacute;cil&amp;rsquo; y otra de Fred Brooks&lt;/strong&gt;&lt;strong&gt;: &lt;/strong&gt;&lt;a target="_blank" href="http://www.lips.utexas.edu/ee382c-15005/Readings/Readings1/05-Broo87.pdf"&gt;&lt;strong&gt;&amp;lsquo;no hay balas de plata&amp;rsquo;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;que da t&amp;iacute;tulo a uno de los grandes ensayos de la historia de la ingenier&amp;iacute;a del software&lt;strong&gt;. &lt;/strong&gt;Brooks es tambi&amp;eacute;n el padre de la &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Frederick_P._Brooks"&gt;ley que lleva su nombre&lt;/a&gt; y que dice que&lt;strong&gt; &amp;lsquo;a&amp;ntilde;adir desarrolladores a un proyecto retasado solo lo retrasa m&amp;aacute;s&amp;rsquo;,&lt;/strong&gt; luego extrapolando esta ley, a&amp;ntilde;adir m&amp;aacute;s fuerza de desarrollo no va a arreglar el problema como ya he comentado&lt;strong&gt;.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La paradoja es que dificultad es tal que necesitamos unas balas de plata que no tenemos en nuestra arsenal. Unamos a esto que &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2008/12/22/161-la-broma-ha-terminado.aspx"&gt;la ley de Moore ya no est&amp;aacute; ah&amp;iacute; para salvarnos el culo&lt;/a&gt; permiti&amp;eacute;ndonos cambiar complejidad por ciclos de reloj. &lt;strong&gt;Tenemos una tormenta perfecta. &amp;iexcl;Hemos llegado al l&amp;iacute;mite!.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;iquest;Sois vosotros igual de pesimistas que yo? Gustavo creo que s&amp;iacute;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156932" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zEe-dIMO-i_C-UEl4QD4Xz4Zsl0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zEe-dIMO-i_C-UEl4QD4Xz4Zsl0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zEe-dIMO-i_C-UEl4QD4Xz4Zsl0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zEe-dIMO-i_C-UEl4QD4Xz4Zsl0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=XlWVPLRVJFA:TmvhMzFCbPQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=XlWVPLRVJFA:TmvhMzFCbPQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=XlWVPLRVJFA:TmvhMzFCbPQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=XlWVPLRVJFA:TmvhMzFCbPQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/XlWVPLRVJFA" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Opini_26002300_243_3B00_n/default.aspx">Opini&amp;#243;n</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/09/28/191-hasta-donde-podemos-llegar.aspx</feedburner:origLink></item><item><title>Curso de Scrum con Team System en Bilbao (2º edición)</title><link>http://feedproxy.google.com/~r/mlbb/~3/3mWn_XDsWRM/curso-de-scrum-con-team-system-en-bilbao-2-186-edici-243-n.aspx</link><pubDate>Mon, 21 Sep 2009 13:37:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:156193</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=156193</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=156193</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/09/21/curso-de-scrum-con-team-system-en-bilbao-2-186-edici-243-n.aspx#comments</comments><description>&lt;p&gt;Entre &lt;a href="http://www.plainconcepts.com/" target="_blank"&gt;Plain Concepts&lt;/a&gt; y &lt;a href="http://www.sarein.com/"&gt;Sarein&lt;/a&gt; hemos preparado un interesante curso sobre &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx"&gt;Scrum&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/Team+System/default.aspx"&gt;Team System&lt;/a&gt;: &lt;a href="http://www.sarein.com/Portals/0/Newsletter/0907Scrum/ScrumSend.html" target="_blank"&gt;Gestión ágil de proyectos con Metodología Scrum y Visual Studio Team System&lt;/a&gt; que tendré el placer de impartir los días 30 de Septiembre y 1, 2 de Octubre en Bilbao.&lt;/p&gt;  &lt;p&gt;El contenido del curso, que tiene una duración de 24 horas es:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scrum &lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Introducción a Scrum y las metodologías ágiles     &lt;br /&gt;Roles en Scrum      &lt;br /&gt;Definición de Sprint      &lt;br /&gt;Artefactos en Scrum      &lt;br /&gt;Gráficos de progreso y control del proyecto      &lt;br /&gt;Comunicación en Scrum      &lt;br /&gt;Escalando Scrum      &lt;br /&gt;¿Precio y fecha cerrados con Scrum?      &lt;br /&gt;Madurez y Scrum      &lt;br /&gt;Las reglas de Scrum&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Visual Studio Team System&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Team Foundation Server y el ciclo de desarrollo     &lt;br /&gt;Gestión del proyecto utilizando elementos de trabajo y Scrum      &lt;br /&gt;Gestión de fuentes      &lt;br /&gt;Herramientas para calidad&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;El precio del curso, es de 900 euros e incluye el almuerzo de los tres días.&lt;/p&gt;  &lt;p&gt;¡Espero que os animéis!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156193" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OoHpIvrstbihgokCHxEnuKtqnlo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoHpIvrstbihgokCHxEnuKtqnlo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OoHpIvrstbihgokCHxEnuKtqnlo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoHpIvrstbihgokCHxEnuKtqnlo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=3mWn_XDsWRM:DrmUozrFbNs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=3mWn_XDsWRM:DrmUozrFbNs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=3mWn_XDsWRM:DrmUozrFbNs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=3mWn_XDsWRM:DrmUozrFbNs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/3mWn_XDsWRM" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/09/21/curso-de-scrum-con-team-system-en-bilbao-2-186-edici-243-n.aspx</feedburner:origLink></item><item><title>Plain Concepts patrocinador del Agile Open Spain 2009</title><link>http://feedproxy.google.com/~r/mlbb/~3/uUThG-VoRyE/plain-concepts-patrocinador-del-agile-open-spain-2009.aspx</link><pubDate>Sun, 20 Sep 2009 17:26:47 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:156159</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=156159</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=156159</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/09/20/plain-concepts-patrocinador-del-agile-open-spain-2009.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Logo Agile Open" border="0" alt="Logo Agile Open" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/LogoAgileOpen_5F00_488ABF4C.jpg" width="153" height="116" /&gt;Siguiendo la tradición de Plain Concepts y sus profesionales de colaborar con la comunidad en todas las ocasiones que se presente, tenemos el gusto de comunicar que seremos co-organizadores y co-patrocinadores de la próxima edición de &lt;a href="http://www.agile-spain.com/agile-open-spain-2009"&gt;Agile Open Spain 2009&lt;/a&gt;, a celebrar en Madrid los días 23 y 24 de Octubre (el viernes por la tarde y el sábado).&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://www.agile-spain.com/agile-open-spain-2009"&gt;Agile Open Spain&lt;/a&gt; es un &lt;strong&gt;evento de comunidad centrado en compartir&lt;/strong&gt; entre los asistentes experiencias, ideas, dificultades, inquietudes y éxitos sobre metodologías ágiles de desarrollo de software. Este evento tendrá el formato de &lt;a href="http://www.agile-spain.com/que-es-como-hacer-open-space"&gt;Open Space&lt;/a&gt; con el afán de promover la participación y sobre todo que emerja la conferencia que los asistentes diseñen. No contamos por tanto con una agenda preestablecida, sino que entre todos diseñaremos la conferencia, participando en la selección de las ponencias según su interés.&lt;/p&gt;  &lt;p&gt;Desde Plain Concepts, entre un servidor y mi compañero &lt;a href="http://geeks.ms/blogs/jlsoria/" target="_blank"&gt;Jose Luis Soria&lt;/a&gt; propondremos los siguientes temas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Gestión de la configuración orientada a la agilidad (charla + demos + ronda preguntas / debate) &lt;/li&gt;    &lt;li&gt;Control de proyectos con metodologías ágiles (charla breve + debate) &lt;/li&gt;    &lt;li&gt;Dificultades frecuentes y posibles soluciones en la implantación de Scrum (introducción + debate)&amp;#160; &lt;/li&gt;    &lt;li&gt;Gestión ágil con Team Foundation Server (charla + demos + ronda preguntas) &lt;/li&gt;    &lt;li&gt;Behavior driven development (charla + demos + ronda preguntas) &lt;/li&gt;    &lt;li&gt;Historias de usuario: ¿son suficiente? (charla + debate) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Aprovecho que todo aquel asistente que lo desee puede &lt;a href="http://groups.google.es/group/agile-spain/web/sesiones-agile-open-spain-2009" target="_blank"&gt;proponer una sesión&lt;/a&gt;. También me gustaría pediros, que si queréis que plantee alguno de los temas que sobre &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx" target="_blank"&gt;metodologías ágiles&lt;/a&gt; o &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx" target="_blank"&gt;Scrum&lt;/a&gt; he tratado en el blog, no tenéis más que pedirlo.&lt;/p&gt;  &lt;p&gt;Las inscripciones han sido un gran éxito y el aforo está completo desde hace tiempo, me gustaría comentar que en Plain Concepts tenemos algunas invitaciones para nuestros clientes, por lo que si tienes interés en asistir, por favor ponte en contacto conmigo.&lt;/p&gt;  &lt;p&gt;¡Espero veros en el Agile Open Spain 2009!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156159" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tiNi78BGFq1AF68brQ9P4QLc7Dg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tiNi78BGFq1AF68brQ9P4QLc7Dg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tiNi78BGFq1AF68brQ9P4QLc7Dg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tiNi78BGFq1AF68brQ9P4QLc7Dg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=uUThG-VoRyE:GlQPNUZy4L0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=uUThG-VoRyE:GlQPNUZy4L0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=uUThG-VoRyE:GlQPNUZy4L0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=uUThG-VoRyE:GlQPNUZy4L0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/uUThG-VoRyE" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/09/20/plain-concepts-patrocinador-del-agile-open-spain-2009.aspx</feedburner:origLink></item><item><title>Software e innovación… innovación y software: ¿existe un proceso?</title><link>http://feedproxy.google.com/~r/mlbb/~3/BBvl6uj1sQk/software-e-innovaci-243-n-innovaci-243-n-y-software-191-existe-un-proceso.aspx</link><pubDate>Tue, 08 Sep 2009 22:37:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:155475</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>17</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=155475</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=155475</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/09/09/software-e-innovaci-243-n-innovaci-243-n-y-software-191-existe-un-proceso.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Reno en la carretera" border="0" alt="Reno en la carretera" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Renoenlacarretera_5F00_4A4FD81A.jpg" width="352" height="316" /&gt;Me encuentro en la Oulanka Research Station de la Universidad de Oulu en Kuusamo, un &lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=oulanka+research+station&amp;amp;sll=66.367801,29.329376&amp;amp;sspn=0.138451,0.614548&amp;amp;ie=UTF8&amp;amp;ll=66.554821,29.443359&amp;amp;spn=37.3005,157.324219&amp;amp;t=h&amp;amp;z=3" target="_blank"&gt;lugar perdido de Finlandia&lt;/a&gt;, a 25 km del círculo polar. Donde Cristo perdió el gorro, vamos. El sitio es precioso: cientos de lagos, miles de arboles, renos en medio de la carretera y una paz que invita a pensar.&lt;/p&gt;  &lt;p&gt;En el marco del &lt;a href="http://www.itei-itea2.org/" target="_blank"&gt;proyecto ITEI&lt;/a&gt;, subvencionado por la Unión Europea, un puñado de ingenieros, académicos y gente de la empresa estamos buscando desarrollar una metodología y un soporte informático abierto para la gestión de la innovación en el desarrollo de sistemas de software. Hay es nada. De este proyecto deben salir una especie de libro blanco de la innovación en el marco del desarrollo de software (SinnoBok) y el diseño de un ecosistema de software que soporte esta proceso de innovación (CyberRoom).&lt;/p&gt;  &lt;p&gt;Mi participación, en representación de &lt;a target="_blank"&gt;Sisteplant&lt;/a&gt;, es como empresa que está innovando en el desarrollo de software usando metodologías ágiles. Debo aportar que requisitos tenemos en nuestro proceso de desarrollo e innovación para que sean incorporados como parte del proyecto y actuar como caso de uso de la puesta en marcha de lo que sea que salga del proyecto. &lt;/p&gt;  &lt;p&gt;El motivo de este mail, es comentar la esencia del proyecto. &lt;strong&gt;¿Es posible definir un proceso de innovación? ¿Es la innovación algo que se puede materializar en un proceso? ¿Hay una serie de pasos que se pueden dar que faciliten la aparición de productos, servicios o vías de comercialización innovadoras en el marco del desarrollo de software? ¿Existe al menos un conjunto de patrones que podamos detectar y describir?. Yo creo que no.&lt;/strong&gt; Pero también creo que es un camino que es interesante explorar, sobre todo por que hay mucha gente que cree que si y lógicamente yo puedo estar equivocado (es altamente probable).&lt;/p&gt;  &lt;p&gt;Lo que quiero comentar es por que creo que no existe un proceso de innovación definible y repetible (¡como les gustaría a la gente de CMMi esto!). Mis argumentos son los siguientes:&lt;/p&gt;  &lt;p&gt;1) &lt;strong&gt;No hay dos productos de software iguales, no hay dos proyectos iguales, no hay dos equipos iguales, no hay dos empresas iguales&lt;/strong&gt;. Si tenemos en cuenta que el marco del desarrollo de software es tan diferente y cambiante, es sumamente difícil encontrar un marco que funcione en todas. Esto ocurre con las metodologías, que para funcionar necesitan un fuerte proceso de ajuste e implantación. Si añadimos a esto, que por su propia naturaleza, una innovación es radicalmente diferente de cualquier otra cosa existente, la cosa se complica aun más.&lt;/p&gt;  &lt;p&gt;2) Viendo la historia de las innovaciones recientes: el procesador, el ratón, el compilador, las redes, el ordenador personal, la web, las listas de correo, el chat, las redes sociales, las metodologías ágiles… &lt;strong&gt;no hay dos que hayan surgido de una manera similar&lt;/strong&gt;. Es imposible trazar un patrón. En cada situación se partía de unas condiciones iniciales diferentes, se siguió un proceso diferente, se llegó al final del proceso y se comercializo la idea de manera diferente. Pensad en como surge el concepto de Wiki, por poner un ejemplo, base de algo tan rompedor en la cultura moderna como Wikipedia: &lt;a href="http://en.wikipedia.org/wiki/Ward_Cunningham" target="_blank"&gt;Ward Cunningham&lt;/a&gt; uno de los padres de los patrones, arto de recibir mails pidiéndole que corrija tal o cual detalle en &lt;a href="http://c2.com/cgi/wiki?PortlandPatternRepository" target="_blank"&gt;su catálogo de patrones&lt;/a&gt;, decide añadir un simple botón que permita a cualquiera editar el html de la página. Una innovación radical, algo nuevo, que nadie ha hecho antes, que no era especialmente ambicioso, que podría haber concluido en un desastre de gente haciendo el vándalo en su sitio y que acaba cambiando el modelo de enciclopedia que se conocía desde la ilustración francesa. Impresionante. ¿Pero como catalogarlo? ¿Cómo sistematizar los ocurrido para facilitar que surjan nuevas innovaciones?. Imposible.&lt;/p&gt;  &lt;p&gt;3) &lt;strong&gt;No hay una receta para desarrollar software, menos para desarrollar software innovador&lt;/strong&gt;. Aunque Joel Spolsky incluso tiene un &lt;a href="http://geeks.ms/blogs/jalarcon/archive/2009/09/07/c-243-mo-hacer-que-tu-software-sea-el-n-250-mero-1-por-joel-spolsky.aspx" target="_blank"&gt;receta para hacer que tu software sea el número 1&lt;/a&gt; ;).&amp;#160; El desarrollo de software es un arte. Generalmente detrás de cada gran innovación en este campo hay una persona que actual como un gran catalizador, un artista o un grupo de ellos: La WWW y Tim Berners-Lee, Linux y Linnus Torwalds, GNU y Stallman, C++ y Stroustroup, C# y Gunnerson, los patrones y la Gang of Four, Google y Larry Page y Sergei Brin... Ningún proceso garantiza que ese catalizador va a aparecer, más bien al contrario. Parece que la sensación general es que los procesos definidos tienden a encorsetar la creatividad necesaria para innovar. Muchos creen que Microsoft a perdido su capacidad de innovar y que Google la está perdiendo precisamente por esto.&lt;/p&gt;  &lt;p&gt;Tom Simpson, ingeniero de IBM y uno de los padres del &lt;a href="http://en.wikipedia.org/wiki/OS/360" target="_blank"&gt;OS/360&lt;/a&gt; escribió una algo que aplica perfectamente a lo que comento, en un excelente ensayo breve suyo, escrito en 1968, &lt;a href="http://homepages.cs.ncl.ac.uk/brian.randell/NATO/NATOReports/index.html#Appendix" target="_blank"&gt;Masterpiece Engineering&lt;/a&gt;. Tom escribe la siguiente sátira, que he traducido muy libremente, sobre como un grupo de ingenieros de software estaba buscando los criterios a establecer para diseñar un sistema operativo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Estudiando el problema de como lograr establecer el diseño para producir ‘Mona Lisas’ …la Conferencia decidió que se debía establecer un Instituto para trabajar con más detalle sobre los problemas en el campo de la producción de obras maestras. Así que salieron a las calles de Roma y seleccionó unos cuantos conductores de carros, algunos luchadores y otros artesanos y los sometieron durante un período de cinco semanas (a media jornada) a un Curso de creación de obras maestras, y luego todos fueron puestos en una gran habitación y se les solicito que comenzaran con la creación de obras maestras. &lt;/p&gt;    &lt;p&gt;Pronto se dieron cuenta de que no estaban consiguiendo los resultados esperados del Instituto, por lo que se trato de equipar a los trabajadores en la producción de obras maestras con algunas herramientas más eficaces para ayudarles a crearlas. Se inventaron cinceles a motor, pistolas de pintura y así sucesivamente, pero todo esto se limito a provocar una protesta ruidosa de los maestros: &amp;quot;Todas estas técnicas se dan en los pintores de técnica descuidada&amp;quot;, dijeron.      &lt;br /&gt;      &lt;br /&gt;La producción aún no estaba llegando a niveles satisfactorios por lo que se amplió la gama de técnicas de producción de obras maestras con algunas medidas adicionales. Una idea fue tener un lienzo y que pasase rápidamente de pintor a pintor. Mientras uno estaba aplicando el pincel los demás tenían tiempo para pensar. &lt;/p&gt;    &lt;p&gt;El siguiente paso natural a tomar fue, por supuesto, duplicar el número de pintores, pero antes de tomarlo, adoptaron un mecanismo más interesante. Se decidió establecer &lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/11/02/M_E900_tricas-mal-entendidas.aspx" target="_blank"&gt;alguna métrica adecuada de la productividad&lt;/a&gt;. Se emplearon dos semanas en el Instituto contando el número de pinceladas por día producidas por un grupo de pintores, y este criterio fue inmediatamente aplicado para calcular valor aportado a la empresa por el resto. Si un pintor fracasaba en lograr sus veinte pinceladas por día sería claro que se trataba de alguien claramente improductivo.       &lt;br /&gt;      &lt;br /&gt;Lamentablemente ninguno de estos avances en el conocimiento parecía tener un impacto real sobre la producción de obras maestras y así, al fin, el grupo decidió que la dificultad básica era claramente un problema de gestión. Uno de los más brillantes estudiantes (con el nombre de Leonardo da Vinci) fue inmediatamente promovido a gerente del proyecto, poniéndolo a cargo de la adquisición de pinturas, lienzos y pinceles para el resto de la organización.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Evidentemente no lograron producir una obra maestra.&lt;/p&gt;  &lt;p&gt;Entiendo que el mensaje puede ser poco esperanzador, que sueno muy pesimista, pero si que es cierto que hay cosas que podemos hacer para mejorar la innovación. Muy generales, pero hay están. Y son precondiciones. Sin estas precondiciones, no surge la innovación. Quizás facilitar la eliminación de estas barreras de entrada a la innovación sea la innovación que debemos esperar de este proyecto. La gente del VTT y de Sirris ha propuesto unas áreas clave de la innovación que ellos han llamado, en un claro reconocimiento de la naturaleza artística del problema, &lt;em&gt;El Arte de…:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;… mantenerse enfocado.      &lt;br /&gt;… experimentar.       &lt;br /&gt;… optimizar el impacto de tus recursos de alto impacto (tus artistitas vamos…).       &lt;br /&gt;… abrirse al mundo (openness tiene una traducción difícil…).       &lt;br /&gt;… estimular la innovación.       &lt;br /&gt;… de mejorar la innovación.       &lt;br /&gt;… de la incubación de ideas.       &lt;br /&gt;… de la recolección de ideas.       &lt;br /&gt;… de la evaluación de ideas.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A mi me suena que &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx" target="_blank"&gt;Scrum&lt;/a&gt; puede dar una respuesta a algunas de estas preguntas ;) ¿pero realmente si conseguimos responder estas respuesta, estamos consiguiente ser innovadores? No en vano uno de los objetivos de Scrum y de las metodologías en general es ser capaz de incorporar el cambio y la innovaciones que surgen al proceso de desarrollo. Al fin y al cabo: ¿no es toda innovación un proceso de cambio radical?.&lt;/p&gt;  &lt;p&gt;Espero que os animéis a dar vuestra opinión, ya que todos los que estáis en el mundo del software sois innovadores por naturaleza. Con cada línea de código que escribís, estáis haciendo algo nuevo. Esto &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/04/06/la-falacia-de-la-industrializaci-243-n-del-desarrollo-de-software.aspx" target="_blank"&gt;nos diferencia claramente de otras industrias&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155475" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uH-NZSJZ1_6sAYf93SBJa5HUWoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uH-NZSJZ1_6sAYf93SBJa5HUWoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uH-NZSJZ1_6sAYf93SBJa5HUWoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uH-NZSJZ1_6sAYf93SBJa5HUWoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=BBvl6uj1sQk:Dl50dGff_Iw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=BBvl6uj1sQk:Dl50dGff_Iw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=BBvl6uj1sQk:Dl50dGff_Iw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=BBvl6uj1sQk:Dl50dGff_Iw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/BBvl6uj1sQk" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Opini_26002300_243_3B00_n/default.aspx">Opini&amp;#243;n</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Patrones/default.aspx">Patrones</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/ITEI/default.aspx">ITEI</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/09/09/software-e-innovaci-243-n-innovaci-243-n-y-software-191-existe-un-proceso.aspx</feedburner:origLink></item><item><title>Instalando Ubuntu en un PowerMac G4</title><link>http://feedproxy.google.com/~r/mlbb/~3/MBEMua4ugTU/instalando-ubuntu-en-un-powermac-g4.aspx</link><pubDate>Wed, 02 Sep 2009 08:43:41 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:155136</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=155136</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=155136</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/09/02/instalando-ubuntu-en-un-powermac-g4.aspx#comments</comments><description>&lt;p&gt;Algunos no somos tan afortunados como el amigo Rafael, &lt;a href="http://geeks.ms/blogs/rfog/archive/2009/08/23/me-he-comprado-un-imac.aspx" target="_blank"&gt;poseedor de un flamante y nuevecito Mac&lt;/a&gt;. Yo me tengo que conformar con un &lt;a href="http://en.wikipedia.org/wiki/Powermac_G4" target="_blank"&gt;PowerMac G4&lt;/a&gt;, con 512Mb de RAM, un procesador PowerPC a 400MHz un disco duro de 10Gb y una tarjeta ATI Rage de 128Mb, un equipo que tiene más de una década y que aun tiene un aspecto realmente acojonante. Es un placer abrir la caja, sin soltar un solo tornillo, simplemente accionando una palanquita de diseño perfectamente integrada en la caja, y echar un vistazo dentro. Que acabados tiene este hardware, impresionante. Antes de hacer nada tuve que limpiar las babas que se me cayeron en la placa base. Es una máquina increíble: cuando salió la mercado se catalogo como material sensible para la exportación por su potencia.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/LastripasdelPowerMacG4_5F00_1539FD27.jpg"&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Las tripas del PowerMac G4" border="0" alt="Las tripas del PowerMac G4" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/LastripasdelPowerMacG4_5F00_thumb_5F00_7E621374.jpg" width="582" height="437" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Se ve, nada más abrirlo, que el equipo es una gran máquina, con un sistema operativo muy antiguo, Mac OS 9.2, una reliquia de los tiempos de Windows 3.1. La pega es que no he podido instalar Windows 7, que no soporta procesadores PowerPC. Aunque la máquina soporta perfectamente Mac OS X 10.4 ‘Tiger’, no tengo los CDs de instalación. Así que me he tenido que decantar por Ubuntu 9.04. Será suficiente pues el único cometido del equipo en cuestión será pinchar MP3 en el Pub Jonh Lennon que mi amigo Javier aka Paisano tiene en Belorado.&lt;/p&gt;  &lt;p&gt;La instalación de Ubuntu ha ido rodada. Simplemente bajarme la ISO de la versión para PowerPC, tostarla en un CD y arrancar el Open Firmware del Mac (no arranca directamente el CD) hay que hacerlo a manopla. En este equipo, no funciona arrancar pulsando C. Hay que arrancar el Open Firmware (pulsando alt + manzana + o + f) y luego ejecutar el siguiente comando:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;boot cd:;\install\yaboot&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A partir de aquí la instalación de Ubuntu va como la seda.&lt;/p&gt;  &lt;p&gt;Una vez instalado Ubuntu he tenido algunos pequeños problemas:&lt;/p&gt;  &lt;p&gt;1) Configurar los drivers de la tarjeta gráfica (sino solo se soportan 800x600 y Xorg consume un montón de procesador haciendo la máquina muy lenta).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;La solución es simple, basta editar el archivo /etc/X11/xorg.conf: &lt;/p&gt;    &lt;p&gt;&lt;em&gt;sudo gedit /etc/X11/xorg.conf&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;El contenido del archivo es el siguiente (tened en cuenta que mi monitor es un Philips 107S, pero lo relativo a la tarjeta gráfica serviría para cualquier PowerMac G4 con tarjeta ATI Rage 128 AGP): &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Section &amp;quot;Device&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Identifier&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;ATI&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Boardname&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Ati Rage 128 M3&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Driver&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;r128&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Screen&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Vendorname&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;ATI&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Option&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;MergeFB&amp;quot;&amp;#160;&amp;#160; &amp;quot;off&amp;quot;       &lt;br /&gt;EndSection &lt;/p&gt;    &lt;p&gt;Section &amp;quot;Monitor&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Identifier&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Configured Monitor&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HorizSync&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 30.0 - 71.0       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VertRefresh&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 50 - 160       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Option&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;DMPS&amp;quot;       &lt;br /&gt;EndSection &lt;/p&gt;    &lt;p&gt;Section &amp;quot;Screen&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Identifier&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Default Screen&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Monitor&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Configured Monitor&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Device&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;ATI&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultDepth&amp;#160;&amp;#160;&amp;#160; 24       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Subsection &amp;quot;Display&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Depth&amp;#160;&amp;#160;&amp;#160;&amp;#160; 24       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Modes&amp;#160;&amp;#160;&amp;#160; &amp;quot;1024x768&amp;quot; &amp;quot;800x600&amp;quot; &amp;quot;640x480&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EndSubsection       &lt;br /&gt;EndSection&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2) No &lt;strike&gt;puedo&lt;/strike&gt; podía escribir arrobas (@), ni pipes (|), ni sostenidos (#)…&lt;/p&gt;  &lt;p&gt;Vamos a &lt;em&gt;Sistema-&amp;gt;Preferencias-&amp;gt;Teclado&lt;/em&gt; y seleccionamos como modelo de teclado PC genérico 105 teclas (intl), en distribución seleccionamos España Macintosh. Luego pulsamos el botón &lt;em&gt;Opciones de distribución…&lt;/em&gt; en &lt;em&gt;Key to choose 3rd level&lt;/em&gt;, marcamos &lt;em&gt;Rigth Win&lt;/em&gt; y listo, la manzana de la derecha pasa a ser nuestro amado Alt Gr.&lt;/p&gt;  &lt;p&gt;3) La hibernación no funciona, aunque el equipo hiberna, luego no se despierta. Así que &lt;a href="http://ubuntuforums.org/showthread.php?t=440225" target="_blank"&gt;la he desactivado&lt;/a&gt; y listo.&lt;/p&gt;  &lt;p&gt;Otro tema interesante es que, lógicamente el equipo no tiene una tarjeta Wireless, solo una conexión Ethernet. Yo en el pueblo solo tengo acceso a internet por wireless (cortesía de un vecino). Así que conecté el Mac a mi portátil mediante un cable de red cruzado, active la conexión compartida a internet en el portátil, y listo, conexión a internet en el Mac.&lt;/p&gt;  &lt;p&gt;Una fuente espectacular de información, sin la que me hubiese costado mucho hacer andar este equipo, es la &lt;a href="https://wiki.ubuntu.com/PowerPCFAQ" target="_blank"&gt;FAQ de PowerPC de Ubuntu&lt;/a&gt; también me ha servido enormemente un artículo sobre &lt;a href="http://www.extremetech.com/article2/0,2845,2126239,00.asp" target="_blank"&gt;como hacer que Ubuntu sea más amigable en un Mac&lt;/a&gt;. Aquí podéis ver como el G4 arranca Ubuntu 9.04.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/UbuntuarrancandoenelPowerMacG4_5F00_5D2E0999.jpg"&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Ubuntu arrancando en el PowerMac G4" border="0" alt="Ubuntu arrancando en el PowerMac G4" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/UbuntuarrancandoenelPowerMacG4_5F00_thumb_5F00_1D3F994C.jpg" width="575" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No es que la máquina vuele, la verdad, pero es usable para su cometido, navegar por internet, ripear CDs y reproducir MP3.&lt;/p&gt;  &lt;p&gt;La siguiente misión es instalar OS X Tiger en este equipo, estoy removiendo Roma con Santiago para encontrar el DVD de instalación. A ver si logro dar con el.&lt;/p&gt;  &lt;p&gt;P.D.: Como me mola lo de trastear con hardware viejuno… tengo una flamante estación &lt;a href="http://en.wikipedia.org/wiki/SGI_Indigo%C2%B2_and_Challenge_M" target="_blank"&gt;SGI Indigo Impact&lt;/a&gt; a la que llevo metiendo mano meses y aun no he conseguido actualizar el Irix que trae. No tengo la password del root, no tiene lector de CD, y no he logrado instalar Irix por red desde Ubuntu, por mucho que lo intento… pero la historia va a cambiar, junto con el G4 han caído en mis manos dos CD externos SCSI, justo lo que necesito para revivir la Impact… :)… ya os contaré.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155136" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VDKB7r4HHC5BnDarH8WRQ_4LdhA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VDKB7r4HHC5BnDarH8WRQ_4LdhA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VDKB7r4HHC5BnDarH8WRQ_4LdhA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VDKB7r4HHC5BnDarH8WRQ_4LdhA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=MBEMua4ugTU:Zi4YRSezQjM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=MBEMua4ugTU:Zi4YRSezQjM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=MBEMua4ugTU:Zi4YRSezQjM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=MBEMua4ugTU:Zi4YRSezQjM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/MBEMua4ugTU" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Linux/default.aspx">Linux</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Mac/default.aspx">Mac</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Hardware+antiguo/default.aspx">Hardware antiguo</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/09/02/instalando-ubuntu-en-un-powermac-g4.aspx</feedburner:origLink></item><item><title>Lo quiero todo, todo y todo… o la triste realidad del triángulo de la gestión de proyectos</title><link>http://feedproxy.google.com/~r/mlbb/~3/VsYA_33NBjY/Lo-quiero-todo_2C00_-todo-y-todo_2620_-o-la-triste-realidad-del-tri_E100_ngulo-de-la-gesti_F300_n-de-proyectos.aspx</link><pubDate>Sun, 23 Aug 2009 19:53:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:154607</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=154607</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=154607</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/23/Lo-quiero-todo_2C00_-todo-y-todo_2620_-o-la-triste-realidad-del-tri_E100_ngulo-de-la-gesti_F300_n-de-proyectos.aspx#comments</comments><description>&lt;p&gt;Resulta que esta ma&amp;ntilde;ana me he levantado graciosito y no se si como resultado del aburrimiento, de la pila de d&amp;iacute;as de descanso vacacional que llevo, o de los cubatas del &lt;a target="_blank" href="http://cebollarock.com/"&gt;Cebolla Rock&lt;/a&gt;, me he propuesto hacer un experimento. Me he ido al concesionario de BMW m&amp;aacute;s cercano, he buscado a uno de esos aseados y sonrientes y le he dicho&amp;hellip;&lt;/p&gt;
&lt;p&gt;Buenos d&amp;iacute;as, me gustar&amp;iacute;a comprar un 750i, blanco, que le gusta a mi mujer de eso color, aunque a mi me parece un poco taxi. Taxi, un 750i, ni aunque le ponga lucecita verde hombre, ha dicho el comercial. Ya que estamos, no lo vamos a mirar, he seguido yo&amp;hellip; p&amp;oacute;ngamelo con llantas de 20&amp;rsquo;&amp;rsquo;, como no y todos los extras, lo quiero todo, todo y todo&amp;hellip; si si el paquete M tambi&amp;eacute;n, como no, yo soy un joven, din&amp;aacute;mico y profesional, no puedo ir por el mundo sin el paquete M, faltar&amp;iacute;as m&amp;aacute;s. &lt;/p&gt;
&lt;p&gt;&amp;iquest;No ser&amp;iacute;a interesante a&amp;ntilde;adir tambi&amp;eacute;n la garant&amp;iacute;a extendida? Por su tranquilidad, ya sabe. Ha dicho el comercial. Y claro, pues yo he pensado&amp;hellip; como no se me habr&amp;aacute; ocurrido, p&amp;oacute;ngalo, p&amp;oacute;ngalo. Quiz&amp;aacute;s no lo use pero que le vamos a hacer, nunca se sabe lo que puede pasar.&lt;/p&gt;
&lt;p&gt;Y la bola de caravana, &amp;iquest;no la necesitar&amp;aacute; usted?&amp;hellip; Hombre, yo no tengo caravana, pero ya que lo comentas, y como nunca se sabe, a lo peor me da por cambiar el pueblo por un camping&amp;hellip; venga vale, total, molestar tampoco molesta.&lt;/p&gt;
&lt;p&gt;Y claro, seguro que un profesional, joven, din&amp;aacute;mico, con paquete M y toda la zarandaja es una avezado ciclista, de los de mountain bike molona, de esos de los de gafas Oakley, maillot, culotte, zapatillas y pedales autom&amp;aacute;ticos &amp;iquest;no? Seguro que necesita el exclusivo portabicicletas de BMW para pasear, digo transportar sus bicis. Pues no, he dicho yo, eso si que no, que yo hace mucho que deje la bici y soy de pelota mano y tal y cual. Hombre, recuerde que nunca se sabe, ha dicho el comercial, y se lo dejo a precio de risa, a a&amp;ntilde;adido. As&amp;iacute; que he pensado, por si acaso, con portabicis, &amp;iquest;voy a saber yo m&amp;aacute;s que el comercial?.&lt;/p&gt;
&lt;p&gt;Ya solo nos quedan dos detalles menores. Empecemos por el plazo de entrega. El comercial a empezado a farfullar no se que de disponibilidad, que si las opciones retrasan no se que y no se cual. Yo he pensado, co&amp;ntilde;o, aqu&amp;iacute; el cliente soy yo &amp;iquest;no? y le he dicho&amp;hellip; a ver si yo lo entiendo todo, pero me lo tienes para dentro de dos semanas, son fiestas del pueblo y tengo que fardar. El comercial no ha dicho ni mu, es m&amp;aacute;s me ha dicho, que quiz&amp;aacute;s lo tenga un poco antes.&lt;/p&gt;
&lt;p&gt;El segundo tema menor, el precio. Aqu&amp;iacute; yo he tomado la iniciativa que para algo soy el cliente &amp;iquest;no?. Para esto tengo treinta mil euritos, entiendo que tengo que poner otros dos cientos, por la llantas, pero esto es lo que hay. Me han dicho que en la india hay unos concesionarios que lo hacen m&amp;aacute;s barato y mejor, eso s&amp;iacute;, por evitarme el papeleo que sino te iba a comprar al ti el BMW Rita&amp;hellip; la cantadora.&lt;/p&gt;
&lt;p&gt;Entonces me he despertado. Claro. &amp;iquest;Por qu&amp;eacute; estas cosas solo nos pasan en el mundo del software? La historia no se sostiene, claro est&amp;aacute;, pero cambiad BMW por aplicaci&amp;oacute;n de software, y dar sudores fr&amp;iacute;os el pensar realismo que se a&amp;ntilde;ade. &amp;iquest;Alguno de vosotros le suena? ;)&lt;/p&gt;
&lt;p&gt;Hace mucho, mucho tiempo, que se describi&amp;oacute; el famoso &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Project_Management_Triangle"&gt;triangulo o tetraedro de hierro de la gesti&amp;oacute;n de proyectos&lt;/a&gt; (hay gente que cree que la calidad tambi&amp;eacute;n es un factor sobre el que podemos gestionar, yo soy de los que piensan que la calidad no es algo con lo que se pueda especular, &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2006/09/02/En-el-software_2C00_-la-calidad_2C00_-no-es-opcional.aspx"&gt;la calidad no es opcional&lt;/a&gt;, y la marca el cliente, no nosotros). &lt;/p&gt;
&lt;p&gt;&lt;img height="268" width="368" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Triangulodegestindeproyectos_5F00_63566ED4.jpg" alt="Triangulo de gesti&amp;oacute;n de proyectos" border="0" title="Triangulo de gesti&amp;oacute;n de proyectos" style="border-bottom:0px;border-left:0px;margin:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;La idea es que de los tres aspectos: alcance, coste, y plazo, el cliente puede manejar dos grados de libertad. El otro, lo maneja la gesti&amp;oacute;n del proyecto. Esta es en esencia una idea de equilibrio b&amp;aacute;sico entre las partes de un proyecto. Es problema es que a menudo este equilibro se rompe. Incluso hay un &lt;a target="_blank" href="http://www.ambysoft.com/essays/brokenTriangle.html"&gt;antipatr&amp;oacute;n que describe esta situaci&amp;oacute;n&lt;/a&gt;. Diferentes metodolog&amp;iacute;as dan diferentes respuestas a este problema, en un pr&amp;oacute;ximo post, comentar&amp;eacute; la soluci&amp;oacute;n que propone &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx"&gt;Scrum&lt;/a&gt;. De hecho el prop&amp;oacute;sito de este post, es comentar el dichoso triangulo de una manera un poco amena, como proleg&amp;oacute;meno a dicho post.&lt;/p&gt;
&lt;p&gt;Por cierto, ya tengo mi BMW, ha llegado seis meses tardes, no es blanco, y le faltan algunos detalles menores. Eso si, cuatro ruedas y volante tiene. Os dejo una fotito, para daros envidia. No es lo que esperaba, pero esa es otra historia&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img height="308" width="296" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/BMW_5F00_02C57310.jpg" alt="BMW" border="0" title="BMW" style="border-bottom:0px;border-left:0px;margin:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;iquest;Qu&amp;eacute; es lo que hace que cuando se habla de software la realidad se torne tan an&amp;oacute;mala? &amp;iquest;Por qu&amp;eacute; cre&amp;eacute;is vosotros que es tan dif&amp;iacute;cil mantener el equilibrio descrito en el triangulo de la gesti&amp;oacute;n de proyectos en la realidad? &amp;iquest;Que factores hacen que salte por los aires tan a menudo en los proyectos? Y no, no vale el argumento f&amp;aacute;cil: &amp;iexcl;es que los comerciales&amp;hellip;! ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=154607" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OU0xDsB_OVHyqhM_ZX4Ku2LcGnE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OU0xDsB_OVHyqhM_ZX4Ku2LcGnE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OU0xDsB_OVHyqhM_ZX4Ku2LcGnE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OU0xDsB_OVHyqhM_ZX4Ku2LcGnE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=VsYA_33NBjY:XgFvyNm7Adw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=VsYA_33NBjY:XgFvyNm7Adw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=VsYA_33NBjY:XgFvyNm7Adw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=VsYA_33NBjY:XgFvyNm7Adw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/VsYA_33NBjY" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Patrones/default.aspx">Patrones</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/23/Lo-quiero-todo_2C00_-todo-y-todo_2620_-o-la-triste-realidad-del-tri_E100_ngulo-de-la-gesti_F300_n-de-proyectos.aspx</feedburner:origLink></item><item><title>Emitiendo para toda la galaxia, ¿hay alguien ahí?: Lo que todo desarrollador debe saber sobre los eventos en .Net</title><link>http://feedproxy.google.com/~r/mlbb/~3/Ljh7aLnCjRE/emitiendo-para-toda-la-galaxia-191-hay-alguien-ah-237-lo-que-todo-desarrollador-debe-saber-sobre-los-eventos-en-net.aspx</link><pubDate>Tue, 18 Aug 2009 23:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:154002</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=154002</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=154002</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/19/emitiendo-para-toda-la-galaxia-191-hay-alguien-ah-237-lo-que-todo-desarrollador-debe-saber-sobre-los-eventos-en-net.aspx#comments</comments><description>&lt;p&gt;La manera que las clases tiene de alertar a otras clases en los lenguajes orientados a objetos modernos es lanzar eventos. Una clase que no expone eventos, hace mucho m&amp;aacute;s ardua la tarea de los desarrolladores que la consumen a la hora de detectar cambios en su estado. Una clase sin eventos es un clase incomunicada, que dir&amp;iacute;an los O&amp;rsquo;funk&amp;rsquo;illo.&lt;/p&gt;
&lt;p&gt;En en sentido amplio, se podr&amp;iacute;a decir que toda clase que dise&amp;ntilde;emos y que mantenga un estado, deber&amp;iacute;a tener eventos. Si una clase mantiene estado, es evidente que ese estado va a cambiar a lo largo del ciclo de vida de los objetos que instanciemos. Es evidente tambi&amp;eacute;n que si no exponemos eventos quien quiera enterarse de los cambios en el estado, no tendr&amp;aacute; m&amp;aacute;s opci&amp;oacute;n que preguntar activamente a nuestro objeto, en lugar de esperar pl&amp;aacute;cidamente a recibir notificaciones. Nada nuevo bajo el sol, el viejo conocido &lt;a target="_blank" href="https://channel9.msdn.com/posts/Daniel+Garzon/Patrn-Observer/"&gt;patr&amp;oacute;n Observer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Los eventos son imprescindibles y en .Net son ciudadanos de primera categor&amp;iacute;a (no ocurre as&amp;iacute; en otros lenguajes como C++). Aun as&amp;iacute;, &lt;strong&gt;no es extra&amp;ntilde;o ver malas implementaciones de&lt;/strong&gt; &lt;strong&gt;eventos&lt;/strong&gt;. Es un tema que muchos desarrolladores creen conocer bien y sin embargo se ven a menudo errores relacionados con la mala implementaci&amp;oacute;n de eventos. Y es que implementar bien un evento tiene m&amp;aacute;s arte del que podr&amp;iacute;a parecer y se pueden cometer m&amp;aacute;s errores de los que uno puede pensar que var&amp;iacute;an en gravedad desde complicar la vida a las clases que deriven de nuestra clase que expone eventos hasta introducir condiciones de carrera dif&amp;iacute;ciles de diagnosticar, pasando por simples incorrecciones de estilo. Lo peor de caso, es que &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/02/10/el-cuento-de-los-tres-desarrolladores.aspx"&gt;al contrario que en otras ocasiones&lt;/a&gt;, por la propia naturaleza de estos errores, FxCop no es capaz de avisarnos de ellos.&lt;/p&gt;
&lt;p&gt;Vamos al grano. Veamos la implementaci&amp;oacute;n m&amp;aacute;s simple posible de un evento en .Net 2.0, los que hemos vivido los tiempos de .Net 1.0 y 1.1 sabemos que la palabra clave &lt;span style="color:blue;"&gt;event&lt;/span&gt; solo es az&amp;uacute;car sint&amp;aacute;ctico que provoca que el compilador emita por nosotros un delegado. En los tiempos de 1.0 y 1.1 nosotros ten&amp;iacute;amos que declarar el tipo de delegado &amp;lsquo;a manopla&amp;rsquo;. Se trata de un evento que ni siquiera implementa su propia clase de argumento del evento. Ser&amp;iacute;a algo como sigue:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FunctionThatProducesTheEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SampleEvent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;iquest;Cu&amp;aacute;ntos errores puede ver en esta implementaci&amp;oacute;n? Uno, dos, tres&amp;hellip; si no les ves sigue leyendo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Qu&amp;eacute; pasa si no hay nadie escuchando?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Generalmente, en una conversaci&amp;oacute;n, para que se produzca una comunicaci&amp;oacute;n correcta debe haber una parte emitiendo y otra recibiendo. Evidentemente esto no aplica si se trata de un grupo de mujeres. Pueden estar todas emitiendo, ninguna escuchando y aun as&amp;iacute; todas enterarse&amp;hellip; misterios de la naturaleza.&lt;/p&gt;
&lt;p&gt;En .Net un clase que quiera escuchar los eventos de otra simplemente tiene que subscribirse a ellos:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Subscriber&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt; _publiser = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; Subscriber()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _publiser.SampleEvent += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(_publiser_SampleEvent);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; _publiser_SampleEvent(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(&lt;span style="color:#a31515;"&gt;&amp;quot;Habemus evento&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Como la hemos comentado lo eventos se implementan, simplificando el asunto, como delegados. Simplificando otro poco, podemos decir que los delegados son la versi&amp;oacute;n orientada a objetos de los punteros a funci&amp;oacute;n. B&amp;aacute;sicamente la clase que declara el evento es declarando un tipo de puntero a funci&amp;oacute;n y un lugar en el que almacenar ese puntero. La clase que se subscribe proporciona la funci&amp;oacute;n que realmente se ejecutar&amp;aacute;, proporcionando el puntero a la funci&amp;oacute;n mediante la subscripci&amp;oacute;n. Cuando la clase que lanza el evento hace la llamada al evento (SampleEvent en el ejemplo), simplificando, esta llamando a una funci&amp;oacute;n a trav&amp;eacute;s de un puntero. Es de l&amp;oacute;gica que si nadie se a subscrito dicho puntero ser&amp;aacute; nulo, por lo tanto invalido, y en consecuencia recibiremos una fea excepci&amp;oacute;n de tipo System.NullReferenceException. La moraleja: &lt;strong&gt;siempre debemos comprobar que alguien se ha subscrito a nuestro evento antes de lanzarlo. &lt;/strong&gt;M&amp;aacute;s simple no puede ser:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; OnEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FunctionThatProducesTheEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Comprobar que tenemos subcriptores&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (SampleEvent != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SampleEvent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;iquest;Que pasa si hay varios hilos?&lt;/p&gt;
&lt;p&gt;El c&amp;oacute;digo anterior es m&amp;aacute;s correcto. Pero aun tiene un error, adem&amp;aacute;s un bastante sutil, que solo se manifestar&amp;iacute;a en situaciones en las que haya varios hilos de ejecuci&amp;oacute;n. Es una t&amp;iacute;pica condici&amp;oacute;n de carrera. Estamos comprobando que tenemos alguien subscrito, en la siguiente instrucci&amp;oacute;n de c&amp;oacute;digo estamos lanzando el evento. &amp;iquest;Qu&amp;eacute; impide que la clase que estaba subscrita se haya desuscrito entre medias? Nada. La moraleja: &lt;strong&gt;debemos asegurar que si alguien estaba escuchando, siga escuchando cuando nosotros digamos algo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n pasa por manejar nuestra propia copia local de la lista de subscriptores. La implementaci&amp;oacute;n de esta soluci&amp;oacute;n es:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FunctionThatProducesTheEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Copia local de las subcripciones al evento para&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//evitar la condici&amp;oacute;n de carrera entre la comprobaci&amp;oacute;n de&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//que hay subscriptores y el lanzamiento del evento.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Aunque que todos se desuscriban, nosotros tenemos la referencia.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; handler = SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Comprobar que tenemos subcriptores&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (handler != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Aunque todos se desuscriban nosotros seguimos teniendo una referencia. Las consecuencias de esta soluci&amp;oacute;n (que es la implementaci&amp;oacute;n correcta si seguimos el patr&amp;oacute;n de eventos de .Net) son varias:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1) &lt;strong&gt;Una clase que se haya desuscrito de un evento, en un entorno multihilo, puede aun as&amp;iacute; recibirlo temporalmente&lt;/strong&gt;. Si este comportamiento no es aceptable, tendremos que utilizar alg&amp;uacute;n mecanismo de sincronizaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;2) Si una clase est&amp;aacute; subscrito a un evento, no podr&amp;aacute; ser recolectada por el recolector de basura, pues aun quedar&amp;aacute;n referencias a ella. Esta es una forma muy sutil de fugar objetos en .Net: olvidar desuscribir la clase de los eventos a los que est&amp;aacute; subscrita. Si esto no fuese as&amp;iacute;, no habr&amp;iacute;a manera de garantizar que siempre hay alguien escuchando. La moraleja: &lt;strong&gt;si no desuscribes tus objetos de los eventos a los que est&amp;eacute;n suscritos de objetos con mayor tiempo de vida, el recolector de basura no puede llev&amp;aacute;rselos al otro mundo. &lt;/strong&gt;Un patr&amp;oacute;n que funciona bastante bien es &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2008/10/30/191-aqu-237-qu-237-en-barre-o-lo-m-237-nimo-que-todo-desarrollador-debe-saber-sobre-idisposable-y-los-finalizadores.aspx"&gt;implementar IDisposable&lt;/a&gt; y desuscribirnos de todos los eventos a lo que la clase se a subscrito en el m&amp;eacute;todo Dispose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Qu&amp;eacute; pasa si derivo de un clase que expone eventos?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Supongamos que derivamos una clase de la clase base que expone eventos. Todos sabemos que el motivo para derivar una clase de otra es modificar o extender su comportamiento. L&amp;oacute;gicamente uno de los aspectos que no puede interesar modificar del comportamiento de una clase es como se comportan sus eventos, que ocurre cuando se lanzan, que informaci&amp;oacute;n acompa&amp;ntilde;a al evento, etc&amp;hellip; Cuando se trata de una modificar el comportamiento de un m&amp;eacute;todo de una clase base, podemos sobreescribir dicha funci&amp;oacute;n, el problema es que no podemos sobreescribir un evento. La soluci&amp;oacute;n al problema es simple, lanzar todos los eventos desde una funci&amp;oacute;n protegida y virtual, en lugar de directamente, de tal manera que una clase derivada pueda redefinir el comportamiento del evento a su gusto o incluso anular su lanzamiento reescribiendo esta funci&amp;oacute;n. La moraleja: &lt;strong&gt;Debemos dar a las clases derivadas la oportunidad de modificar el comportamiento del lanzamiento del evento.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Adem&amp;aacute;s, con esa funci&amp;oacute;n &lt;strong&gt;damos a las clases derivadas la posibilidad de lanzar el evento si lo necesitan&lt;/strong&gt;, simplemente invocando a la funci&amp;oacute;n que lanza el evento.&lt;/p&gt;
&lt;p&gt;Con lo comentado anteriormente la implementaci&amp;oacute;n de nuestro evento quedar&amp;iacute;a como sigue:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FunctionThatProducesTheEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Hacer algo aqu&amp;iacute;...&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Lanzar el evento&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnSampleEvent();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnSampleEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Copia local de las subcripciones al evento para&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//evitar la condici&amp;oacute;n de carrera entre la comprobaci&amp;oacute;n de&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//que hay subscriptores y el lanzamiento del evento.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Aunque que todos se desuscriban, nosotros tenemos la referencia.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; handler = SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Comprobar que tenemos subcriptores&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (SampleEvent != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SampleEvent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;De esta manera, cualquier clase que derivase de la nuestra podr&amp;iacute;a modificar el comportamiento del evento a su gusto simplemente sobreescribiendo la funci&amp;oacute;n OnSampleEvent.&amp;nbsp;La moraleja:&amp;nbsp;&lt;strong&gt;si nuestro evento se llama XYZ la funci&amp;oacute;n virtual asociada debe llamarse OnXYX&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Qu&amp;eacute; pasa si adem&amp;aacute;s tengo algo que contar asociado al evento?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La firma de un evento declarado con &lt;em&gt;EventHandler &lt;/em&gt;es &lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e);&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Con esta firma, podemos detectar en la funci&amp;oacute;n que maneja el evento, cual es el objeto que origino el evento, en el par&amp;aacute;metro sender e informaci&amp;oacute;n asociada al evento, en el par&amp;aacute;metro &lt;em&gt;e&lt;/em&gt;, de tipo &lt;em&gt;EventArgs&lt;/em&gt;. Si vemos la definici&amp;oacute;n de la clase &lt;em&gt;EventArgs&lt;/em&gt;, veremos que es de nula utilidad, ya que no tiene campos que contengan informaci&amp;oacute;n. El prop&amp;oacute;sito de esta clase es servir como clase base para nuestras propios argumentos de evento.&lt;/p&gt;
&lt;p&gt;Supongamos que quisi&amp;eacute;semos que cuando salte nuestro evento, quien lo reciba, reciba adem&amp;aacute;s cierta informaci&amp;oacute;n. Por ejemplo nos podr&amp;iacute;a interesar saber a que hora se produjo el evento. En esta situaci&amp;oacute;n lo primero es derivar una clase de la clase &lt;em&gt;EventArgs &lt;/em&gt;que incluya la informaci&amp;oacute;n que nos interesa: &lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; _eventDateTime = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; EventDateTime&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _eventDateTime; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ahora l&amp;oacute;gicamente necesitamos cambiar la firma del delegado que manejar&amp;aacute; el evento. Para eso, desde .Net 2.0 tenemos una implementaci&amp;oacute;n gen&amp;eacute;rica de la clase &lt;em&gt;EventHandler&lt;/em&gt; que nos permite especificar el tipo de nuestro &lt;em&gt;EventArgs&lt;/em&gt;. Basta por tanto cambiar la declaraci&amp;oacute;n del evento adecuadamente y corregir los errores de compilaci&amp;oacute;n. Con lo que la implementaci&amp;oacute;n de nuestra clase que expone eventos, quedar&amp;iacute;a definitivamente, como sigue:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt;&amp;gt; SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FunctionThatProducesTheEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Hacer algo aqu&amp;iacute;...&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Lanzar el evento&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnSampleEvent();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnSampleEvent()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Copia local de las subcripciones al evento para&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//evitar la condici&amp;oacute;n de carrera entre la comprobaci&amp;oacute;n de&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//que hay subscriptores y el lanzamiento del evento.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Aunque que todos se desuscriban, nosotros tenemos la referencia.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt;&amp;gt; handler = SampleEvent;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Comprobar que tenemos subcriptores&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (SampleEvent != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SampleEvent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt;());&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;La moraleja: &lt;strong&gt;Si necesitamos transmitir informaci&amp;oacute;n junto con el evento debemos derivar una clase de EventArgs contenedora de la informaci&amp;oacute;n y usar la implementaci&amp;oacute;n gen&amp;eacute;rica de EventHandler.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Una clase subscrita podr&amp;iacute;a extraer f&amp;aacute;cilmente la informaci&amp;oacute;n adicional asociada al evento:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:12pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Subscriber&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt; _publiser = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Publisher&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; Subscriber()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _publiser.SampleEvent += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt;&amp;gt;(_publiser_SampleEvent);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; _publiser_SampleEvent(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;SampleEventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(&lt;span style="color:#a31515;"&gt;&amp;quot;Se lanzo el evento a las {0}&amp;quot;&lt;/span&gt;, e.EventDateTime);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Corolario:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No es extra&amp;ntilde;o ver malas implementaciones de&lt;/strong&gt; &lt;strong&gt;eventos.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Siempre debemos comprobar que alguien se ha subscrito a nuestro evento antes de lanzarlo y esta comprobaci&amp;oacute;n debe ser &amp;lsquo;thread safe&amp;rsquo;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una clase que se haya desuscrito de un evento, en un entorno multihilo, puede aun as&amp;iacute; recibirlo moment&amp;aacute;neamente.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si nuestro evento se llama XYZ la funci&amp;oacute;n virtual asociada debe llamarse OnXYX.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si no desuscribes tus objetos de los eventos a los que est&amp;eacute;n suscritos, de objetos con mayor tiempo de vida, el recolector de basura no puede llev&amp;aacute;rselos al otro mundo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debemos dar a las clases derivadas la oportunidad de modificar el comportamiento del lanzamiento de los eventos y de lanzarlos si lo necesitan.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si necesitamos transmitir informaci&amp;oacute;n junto con el evento debemos derivar una clase de EventArgs contenedora de la informaci&amp;oacute;n y usar la implementaci&amp;oacute;n gen&amp;eacute;rica de EventHandler.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A que no pensabais que los eventos daban para tanto&amp;hellip; ;).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=154002" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cta0jA8BCOJgWRnO88WwwsdIcz4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cta0jA8BCOJgWRnO88WwwsdIcz4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cta0jA8BCOJgWRnO88WwwsdIcz4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cta0jA8BCOJgWRnO88WwwsdIcz4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Ljh7aLnCjRE:OSqYvaMa3SM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Ljh7aLnCjRE:OSqYvaMa3SM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=Ljh7aLnCjRE:OSqYvaMa3SM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=Ljh7aLnCjRE:OSqYvaMa3SM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/Ljh7aLnCjRE" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/.Net/default.aspx">.Net</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Patrones/default.aspx">Patrones</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/19/emitiendo-para-toda-la-galaxia-191-hay-alguien-ah-237-lo-que-todo-desarrollador-debe-saber-sobre-los-eventos-en-net.aspx</feedburner:origLink></item><item><title>He leído: The old new thing de Raymon Chen</title><link>http://feedproxy.google.com/~r/mlbb/~3/p6cmwkI0GYM/he-le-237-do-the-old-new-thing-de-raymon-chen.aspx</link><pubDate>Tue, 11 Aug 2009 19:58:22 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153991</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=153991</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=153991</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/11/he-le-237-do-the-old-new-thing-de-raymon-chen.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Comprálo en Amazon: The old new thing" href="http://www.amazon.com/gp/product/0321440307?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321440307" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral.He+le_ED00_do/The-old-new-thing.jpg" alt="" /&gt;&lt;/a&gt;Una de las liturgias de mi familia y mía en particular es almorzar donde mi abuela Basi. La liturgia es muy simple, siempre que llego a mi pueblo, Belorado, a eso de media mañana, pongo el culo en una de las sillas de la cocina de mi abuela y degusto alguno de los manjares que prepara: unos huevos fritos o en salsa, una morcillita asada, un trocito de queso, chorizo, pancetita, asadurilla, bacalao… vamos el típico almuerzo castellano. Supongo que muchos ya estaréis salivando pero el tema no es la gastronomía. Ahora me explico, paciencia.&lt;/p&gt;  &lt;p&gt;Mientras mi abuela concina y nosotros almorzamos, mi abuela no calla. No para de hablar ni un segundo. Generalmente sobre los pequeños asuntos familiares. Pero, en las grandes ocasiones en las que tengo el placer de ser el único comensal mi abuela me cuenta un motón de historias. Historias sobre mi pueblo, sobre su gente, sobre lo que ha pasado esa semana, sobre lo que paso en la guerra, sobre mi abuelo en Alemania, sobre la vida en el campo, sobre la infancia de mi padre y mi tío, sobre cuando vivían en San Nicolas … Historias inconexas, historias que a veces no tiene sentido para mi, , que divierten o que aburren soberamente (las menos de las ocasiones) y a veces autenticas perlas de sabiduría, historias que enseñan un motón casi siempre, sobre la vida, sobre mi pueblo, sobre mi familia. Muchas veces no conozco a la mayoría de los personajes: Si hombre, la hija de tal, que fue a vivir no se donde, que es prima de ese que es padre de aquella que es de tu cuadrilla que salía con el primo de tu amigo aquel de Galdakano, dice mi abuela y yo digo, si si ya se, no por que sepa sino por no liar más la madeja. Seguro que los que tenéis abuela sabéis lo que digo.&lt;/p&gt;  &lt;p&gt;Pues bien, de eso va este libro de Raymon Chen, de historias sobre su pueblo, que da la casualidad que es Windows y su API, en el que lleva viviendo desde la versión 1.0. Las historias que recoge, son como las de mi abuela: entretenidas, aburridas, unas se entienden y otras no, todas tiene algo en común, aunque muchas veces sea difícil ver la línea argumental y en otras no exista.&lt;/p&gt;  &lt;p&gt;Resumiendo, y aquí es donde vamos al grano del asunto, que Raymon Chen se ha puesto a contar todas sus historias de abuelo cebolleta. Se trata de un abuelo que lo sabe todo todo todo sobre Windows, su desarrollo, su historia y su interioridades.&lt;/p&gt;  &lt;p&gt;El libro es de un valor inapreciable para entender la dificultad que entraña el tomar decisiones que pueden afectar a millones de usuarios y desarrolladores. Además explica un montón de interioridades de Windows y justifica por que muchas cosas son como son en nuestro sistema operativo favorito. Hay artículos sobre como se pintan las ventanas, como se manejan los mensajes (¡por fin lo he entendido! solo por esto ha merecido la pena leer el libro), chascarrillos sobre el equipo de desarrollo de Windows, interioridades de COM, trucos de depuración, etc... Hay artículos muy técnicos y artículos que podría entender cualquiera. Eso sí, si has peleado con el API de Windows desde C, te vas a sentir como en tu pueblo, sino el libro puede ser un poco árido, es la única pega que tiene. Hay que tener claro que el pueblo de Chen es Windows, su shell, el API, COM y C, nada de .Net. Vamos Windows de verdad de la buena.&lt;/p&gt;  &lt;p&gt;Un libro bastante recomendable y que merece bastante la pena &lt;a href="http://www.amazon.com/gp/product/0321440307?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321440307" target="_blank"&gt;comprar&lt;/a&gt;. Si bien tiene pasajes difíciles de digerir (si si abuelo, ya se de que me hablas, sigue hacia adelante no te enrolles), es lo suficientemente ameno como para recomendar su lectura a cualquier desarrollador que disfrute desarrollando en Windows.&lt;/p&gt;  &lt;p&gt;Por último, si queréis saber de antemano el tipo de historias que encontraréis, podéis revisar &lt;a href="http://blogs.msdn.com/oldnewthing/" target="_blank"&gt;el blog de Raymon Chen&lt;/a&gt;, que lleva el mismo título que el libro.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153991" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BcYd9WnMtpUNuNgHd6J9gBeUl7g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcYd9WnMtpUNuNgHd6J9gBeUl7g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BcYd9WnMtpUNuNgHd6J9gBeUl7g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcYd9WnMtpUNuNgHd6J9gBeUl7g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=p6cmwkI0GYM:p4KUnWrdn1c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=p6cmwkI0GYM:p4KUnWrdn1c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=p6cmwkI0GYM:p4KUnWrdn1c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=p6cmwkI0GYM:p4KUnWrdn1c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/p6cmwkI0GYM" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/He+le_26002300_237_3B00_do_2E00__2E00__2E00_/default.aspx">He le&amp;#237;do...</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/11/he-le-237-do-the-old-new-thing-de-raymon-chen.aspx</feedburner:origLink></item><item><title>Truco: Liberar espacio tras la actualización a Windows 7</title><link>http://feedproxy.google.com/~r/mlbb/~3/vRa6BzC0y-k/truco-liberar-espacio-tras-la-actualizaci-243-n-a-windows-7.aspx</link><pubDate>Mon, 10 Aug 2009 09:01:14 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153880</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=153880</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=153880</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/10/truco-liberar-espacio-tras-la-actualizaci-243-n-a-windows-7.aspx#comments</comments><description>&lt;p&gt;He realizado dos actualizaciones a Windows 7, una desde Windows Vista a la RC y otra &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/08/09/truco-actualizando-windows-7-rc-a-la-versi-243-n-final-rtm.aspx" target="_blank"&gt;desde la RC de Windows 7 a la RTM&lt;/a&gt;. Las dos han sido un éxito absoluto, a pesar que el segundo camino de actualización, de RC a RTM, no esta oficialmente soportado.&lt;/p&gt;  &lt;p&gt;En el caso de la primera, de Vista a RC, lo que más me sorprendió en su momento fue la gran cantidad de espacio de disco duro que recuperé. No tengo muy claro el por que pero el actualizar de Vista a Windows 7 me liberó 8 Gb de disco duro de manera inmediata. Evidentemente esto no ocurrió de la RC a la RTM.&lt;/p&gt;  &lt;p&gt;Esto no es todo, el truco que os voy a contar no va a permitir liberar más espacio aun tras una actualización a Windows 7. El hecho es que una actualización a Windows 7 deja mucha ‘morralla’ tras de sí. Principalmente copias de seguridad de archivos descartados durante la migración y una gran cantidad de información de logeo de las operaciones realizadas durante la actualización.&lt;/p&gt;  &lt;p&gt;Para recuperar ese espacio debemos ejecutar el asistente para la liberación de espacio en disco. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" title="Clean up system files" border="0" alt="Clean up system files" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Cleanupsystemfiles_5F00_77F29582.png" width="391" height="478" /&gt; &lt;/p&gt;  &lt;p&gt;El detalle más importante es pulsar en el botón &lt;em&gt;Clean up system files, &lt;/em&gt;sino no podremos seleccionar la opciones que vemos en la siguiente imagen:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" title="Clean up Windows 7 discarded files and upgrade logs" border="0" alt="Clean up Windows 7 discarded files and upgrade logs" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/CleanupWindows7discardedfilesandupgradelogs_5F00_4FBF9AC9.png" width="391" height="478" /&gt; &lt;/p&gt;  &lt;p&gt;Seleccionando &lt;em&gt;Files discarded by Windows upgrade&lt;/em&gt; y &lt;em&gt;Windows upgrade log files&lt;/em&gt; liberaremos, en mi caso, 1,96 Gb, un cifra nada despreciable. Decir que esta cifra, según mi varia de máquina a máquina y es aun mayor cuando la actualización es desde Vista a Windows 7.&lt;/p&gt;  &lt;p&gt;¡Espero que os sirva!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153880" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ImBN0Zob0SiMi6zCRO7ndtfNvII/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ImBN0Zob0SiMi6zCRO7ndtfNvII/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ImBN0Zob0SiMi6zCRO7ndtfNvII/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ImBN0Zob0SiMi6zCRO7ndtfNvII/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=vRa6BzC0y-k:iSGKmlfjDc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=vRa6BzC0y-k:iSGKmlfjDc8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=vRa6BzC0y-k:iSGKmlfjDc8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=vRa6BzC0y-k:iSGKmlfjDc8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/vRa6BzC0y-k" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/10/truco-liberar-espacio-tras-la-actualizaci-243-n-a-windows-7.aspx</feedburner:origLink></item><item><title>Truco: Actualizando Windows 7 RC a la versión final (RTM)</title><link>http://feedproxy.google.com/~r/mlbb/~3/nmCJPwVwl5A/truco-actualizando-windows-7-rc-a-la-versi-243-n-final-rtm.aspx</link><pubDate>Sun, 09 Aug 2009 18:34:13 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153844</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=153844</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=153844</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/09/truco-actualizando-windows-7-rc-a-la-versi-243-n-final-rtm.aspx#comments</comments><description>&lt;p&gt;En teoría, no es una situación soportada el actualizar una instalación de Windows 7 Release Candidate (RC) a la versión final o RTM (Release To Manufacturing). Si lo intentamos encontraremos una pantalla, que impide continuar con la instalación, como esta:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/W7RCtoRTMcompatibilityreport_5F00_3C2F8DA0.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" title="W7 RC to RTM compatibility report" border="0" alt="W7 RC to RTM compatibility report" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/W7RCtoRTMcompatibilityreport_5F00_thumb_5F00_197B2958.png" width="491" height="369" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Gracias a dios, hay un simple truco del almendruco, lógicamente no soportado, que nos permitirá hacer la actualización. Debemos copiar el contenido del DVD de Windows 7 al nuestro disco duro. En la ubicación que hayamos copiado los contenidos del DVD, dentro de la carpeta &lt;em&gt;sources &lt;/em&gt;encontraremos un archivo llamado &lt;em&gt;cversion.ini&lt;/em&gt;, con el contenido que podéis ver en la siguiente imagen:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px;display:inline;border-top:0px;border-right:0px;" title="Contenido original del archivo cversion.ini" border="0" alt="Contenido original del archivo cversion.ini" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/cversion_5F00_208A4003.png" width="393" height="273" /&gt; &lt;/p&gt;  &lt;p&gt;Podéis ver que en la entrada &lt;em&gt;MinClient&lt;/em&gt; tenemos el valor 7233.0. Si ponemos en esta entrada 7000.0 y guardamos el archivo, podremos actualizar desde la RC a la versión RTM definitiva ‘sin problema alguno’. Pongo entre comillas, ‘sin problema alguno’ porque si bien es cierto que en mi caso todo ha ido de maravilla, insisto: &lt;strong&gt;este procedimiento no esta soportado&lt;/strong&gt;, podéis usarlo a vuestro propio riesgo y lógicamente siempre tras haber hecho una copia de seguridad de todos vuestros datos valiosos.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;¡Espero que os sirva y que os funcione tan bien como a mi!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153844" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SjEZINoBDDJnYpSiasCyYQEcZ3k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SjEZINoBDDJnYpSiasCyYQEcZ3k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SjEZINoBDDJnYpSiasCyYQEcZ3k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SjEZINoBDDJnYpSiasCyYQEcZ3k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=nmCJPwVwl5A:u_QDuWJRuTM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=nmCJPwVwl5A:u_QDuWJRuTM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=nmCJPwVwl5A:u_QDuWJRuTM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=nmCJPwVwl5A:u_QDuWJRuTM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/nmCJPwVwl5A" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/09/truco-actualizando-windows-7-rc-a-la-versi-243-n-final-rtm.aspx</feedburner:origLink></item><item><title>He leído: The art of Unix programming de Eric S. Raymon</title><link>http://feedproxy.google.com/~r/mlbb/~3/wGwA1BDo1s4/he-le-237-do-the-art-of-unix-programming-de-eric-s-raymon.aspx</link><pubDate>Tue, 04 Aug 2009 08:48:47 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153553</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>12</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=153553</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=153553</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/08/04/he-le-237-do-the-art-of-unix-programming-de-eric-s-raymon.aspx#comments</comments><description>&lt;a href="http://www.amazon.com/gp/product/0131429019?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0131429019" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 10px 10px 0px;display:inline;border-top:0px;border-right:0px;" title="Comprálo en Amazon" border="0" alt="Comprálo en Amazon" align="left" src="http://geeks.ms/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral.He+le_ED00_do/The-art-of-Unix-programming.gif" /&gt;&lt;/a&gt;Supongo que lo primero que se preguntan los lectores de este blog al ver el título de este post es ¿qué hace un MVP leyendo cosas sobre Unix? o formulando la pregunta de una manera menos torticera ¿por qué un experto en entornos Microsoft está interesado en Unix?. La respuesta es compleja, pero las motivaciones que me han llevado a leer este libro son:  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Unix es un gran sistema operativo&lt;/strong&gt;, estaba seguro que aprendiendo más sobre Unix me iba a convertir en un desarrollador y arquitecto más valioso. Internet es Unix, Internet es omnipresente. Quieras o no a diario todos usamos sistemas Unix. Me gusta conocer lo que uso.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Conocer los puntos fuertes y débiles de otras plataformas de desarrollo y sistemas operativos&lt;/strong&gt; te ayuda a detectar, prevenir y minimizar las debilidades de tus soluciones y del entorno en que te mueves, Windows y .Net en mi casos.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Es un libro enormemente citado&lt;/strong&gt;. Casi todo el mundo que lo ha leído coincide en que es un gran libro que todo amante del desarrollo de software, por encima de afinidades a tal o cual sistema operativo, disfruta leyendo.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A pesar de lo que pueda parece por el título el libro no es un libro sobre programación. No te enseña a programar en Unix. Es un libro sobre historia, arquitectura y cultura informática en general. Es una lectura amena y llevadera, sobre todo si ya has tenido contacto con entornos Unix y te apetece saber por que las cosas son como son en esa plataforma. &lt;/p&gt;  &lt;p&gt;La primera parte del libro, de aplicación universal, &lt;strong&gt;desgrana las grandes decisiones de arquitectura y circunstancias históricas que han llevado a los entornos Unix a ser como son&lt;/strong&gt;. Muchísimas de estas decisiones de diseño, tomadas por gente de extraordinaria valía, pioneros de la computación e Internet, esconden extraordinarias lecciones prácticas de arquitectura y diseño de sistemas informáticos. Además se incluye una ‘comparativa’ entre sistemas operativos y las grandes decisiones de diseño que han marcado cada una de ellos que sin duda aporta una interesantísima cultura general sobre el tema que todo arquitecto debería tener. Lo que menos me ha gustado del libro, sin duda, es que no es del todo objetivo en su tratamiento de los sistemas operativos de Microsoft y que se nota que lleva un lustro escrito y no ha sido actualizado con los avances habidos en&amp;#160; esta plataforma. Por poner un simple ejemplo se critica la ausencia de una interfaz de línea de comandos potente, algo paliado ampliamente desde la aparición de &lt;a href="http://geeks.ms/blogs/rcorral/archive/tags/PowerShell/default.aspx" target="_blank"&gt;PowerShell&lt;/a&gt;. En esta parte del libro me parecen especialmente destacables e interesantes las reglas que el autor desgrana sobre la filosofía de Unix, ¡son reglas aplicables a cualquier arquitectura!. No se puede discutir que si algo a demostrado Unix es su capacidad para adaptarse a las circunstancias, evolucionando durante cincuenta años para amoldarse y ser una plataforma puntera en todo cambio habido en la informática durante su historia. Sin duda esta capacidad de adaptación y permanencia se deriva de una excelente arquitectura, por eso conocer las reglas que han guiado esa arquitectura es sumamente valioso.&lt;/p&gt;  &lt;p&gt;En la segunda parte del libro, &lt;strong&gt;se baja de nivel y pasamos de la arquitectura de Unix a su diseño, a detalles concretos de soluciones que se han tomado en el diseño de este sistema operativo&lt;/strong&gt; y de aplicaciones significativas del mismo. Esta parte del libro es, para mí, la más interesante. Podemos extraer de los casos estudiados en el libro una gran cantidad de conocimiento práctico sobre el diseño de sistemas informáticos. Se tratan todos los temas clásicos del diseño arquitectónico: Encapsulación, ortogonalidad, capas, diseño de protocolos, transparencia, multiprocesamiento, lenguajes embebidos, generación de código, optimización, complejidad… Resumiendo, todo un tratado sobre los grandes temas del diseño de software, vistos no solo desde un punto de vista teórico sino repasando como se han aplicado en esta plataforma y en sus aplicaciones más relevantes.&lt;/p&gt;  &lt;p&gt;El libro &lt;strong&gt;presenta además un repaso sumamente interesante, en su tercera parte, de las herramientas y lenguajes de programación que permiten llevar a la práctica la lecciones aprendidas sobre arquitectura y diseño&lt;/strong&gt;. Aquí el libro se convierte en algo mucho más especifico de la plataforma Unix, y por lo tanto las lecciones que aprendemos en esta parte, aunque interesantes y valiosas, no son de universal aplicación.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;La cuarta parte del libro está dedicada a la comunidad&lt;/strong&gt;. No cabe duda que la cultura de comunidad ha sido mucho más rica y tiene una tradición mucho mayor en entornos Unix que en entornos Windows. Esto ha cambiado radicalmente en los últimos años, pero aun así hay lecciones importantes que podemos aprender y otras que aun estamos aprendiendo en el mundo Windows sobre como compartir código, trabajar en proyectos de manera abierta, documentar los proyectos que compartimos, etc... Conocer como el mundo ‘open source’ Unix lleva años haciendo esto, puede enriquecer el mundo ‘open source’ Windows, cada vez más potente y rico y sobre todo nos puede ayudar a evitar reinventar la rueda.&lt;/p&gt;  &lt;p&gt;En resumen &lt;strong&gt;un libro excelente, más que recomendable, que merece la pena leer y &lt;/strong&gt;&lt;a href="http://www.amazon.com/gp/product/0131429019?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0131429019" target="_blank"&gt;&lt;strong&gt;comprar&lt;/strong&gt;&lt;/a&gt;. Sin duda va a ocupar un lugar preeminente en mi biblioteca y con seguridad va a inspirar post en este blog.&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153553" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lb2VsTDo8Llc2_epDmrlH_zL3_k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lb2VsTDo8Llc2_epDmrlH_zL3_k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lb2VsTDo8Llc2_epDmrlH_zL3_k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lb2VsTDo8Llc2_epDmrlH_zL3_k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wGwA1BDo1s4:VFJ_5N7qt6I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wGwA1BDo1s4:VFJ_5N7qt6I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=wGwA1BDo1s4:VFJ_5N7qt6I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=wGwA1BDo1s4:VFJ_5N7qt6I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/wGwA1BDo1s4" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/He+le_26002300_237_3B00_do_2E00__2E00__2E00_/default.aspx">He le&amp;#237;do...</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Linux/default.aspx">Linux</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Unix/default.aspx">Unix</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/08/04/he-le-237-do-the-art-of-unix-programming-de-eric-s-raymon.aspx</feedburner:origLink></item><item><title>Serías capaz de… ¡por supuesto! o Scrum también da respuestas</title><link>http://feedproxy.google.com/~r/mlbb/~3/YGvj8NTMctc/ser-237-as-capaz-de-161-por-supuesto-o-scrum-tambi-233-n-da-respuestas.aspx</link><pubDate>Tue, 30 Jun 2009 06:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151311</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=151311</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=151311</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/30/ser-237-as-capaz-de-161-por-supuesto-o-scrum-tambi-233-n-da-respuestas.aspx#comments</comments><description>&lt;p&gt;&lt;img height="379" width="247" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/SpideyVsWolverine_5F00_5FBB8586.jpg" align="right" alt="SpideyVsWolverine" border="0" title="SpideyVsWolverine" style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt; Escrib&amp;iacute;a un interesante post de Miguel Sierra, vecino de blog en Geeks.ms, &lt;a target="_blank" href="http://geeks.ms/blogs/msierra/archive/2009/06/25/cmmi-experiences-i.aspx"&gt;sobre la implantaci&amp;oacute;n de CMMI que ha llevado a cabo su empresa&lt;/a&gt;. El post es interesante, y agradezco a Miguel que comparta su experiencias. Por mucho que para mi&amp;nbsp;CMMI sea rara vez la elecci&amp;oacute;n metodol&amp;oacute;gica adecuada, creo que es un marco metodol&amp;oacute;gico que debemos conocer, aunque solo sea por la influencia que ha ejercido en el desarrollo de software en los &amp;uacute;ltimos a&amp;ntilde;os. Adem&amp;aacute;s a mi &amp;lsquo;me va en el sueldo&amp;rsquo;, pues me toca apoyar t&amp;eacute;cnicamente la implantaci&amp;oacute;n de TFS en organizaciones que han elegido CMMI como marco de trabajo.&lt;/p&gt;
&lt;p&gt;Lo que motiva este post es el &amp;lsquo;reto&amp;rsquo; que lanzaba Miguel preguntando si ser&amp;iacute;amos capaces de responder a una serie de preguntas relacionadas con el ciclo de vida de nuestros proyectos. Yo que llevo ya un tiempo viviendo en Bilbao, y se me ha pegado un poco la vena Vasca, no he podido remediar el recoger el guante y decir &amp;lsquo;que te apuestas a que s&amp;iacute;&amp;quot;&amp;rsquo;. Es un poco como el chiste de meter cien vascos en un seiscientos&amp;hellip; dici&amp;eacute;ndoles que no caben. Es un poco como las luchas fict&amp;iacute;cias entre superheroes tipo Lobezno contra Spiderman.&lt;/p&gt;
&lt;p&gt;Aqu&amp;iacute; van las preguntas de Miguel y la respuesta que Scrum en particular y las metodolog&amp;iacute;as &amp;aacute;giles en general dar&amp;iacute;an, de la mano de TFS:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Ser&amp;iacute;as capaz de ...?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identificar las tareas y pruebas funcionales relacionadas con un requisito concreto&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tras el Sprint Planning Meeting y antes de que cualquier trabajo de desarrollo se realice, el equipo de desarrollo desglosa las historias de usuario (requisitos) en tareas. Toda historia de usuario lleva expl&amp;iacute;citamente en su definici&amp;oacute;n las condiciones de aceptaci&amp;oacute;n (versi&amp;oacute;n &amp;aacute;gil de las pruebas de aceptaci&amp;oacute;n). Luego la respuesta es si.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Identificar las partes de c&amp;oacute;digo fuente a las que afecta un cambio de requisito&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por supuesto. Todo cambio tendr&amp;aacute; su historia de usuario asociada. En Scrum no se hace ning&amp;uacute;n desarrollo sin que pase por el backlog y por lo tanto sin que ese trabajo este definido. Apoy&amp;aacute;ndonos en TFS podemos enlazar los cambios en el c&amp;oacute;digo con tareas o requisitos en el momento de hacer checkin&amp;hellip; &amp;iquest;a alguien se le ocurre algo m&amp;aacute;s productivo, menos intrusivo para el desarrollador?. Adem&amp;aacute;s para que nadie se olvido lo podemos &amp;lsquo;imponer&amp;rsquo; mediante pol&amp;iacute;ticas de c&amp;oacute;digo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decir cuando se realiz&amp;oacute; una tarea en concreto y la cantidad de esfuerzo que supuso&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lo lleva el TFS. Sin salir del su entorno natural, el IDE de desarrollo (sea VS o Eclipse) el desarrollador puede actualizar el estado de sus tareas o bug en el mismo instante en el que comienza su trabajo o lo termina. Y sin cambio de contexto alguno. Evidentemente, aunque en Scrum no nos importa demasiado, es posible responder con facilidad el tiempo que te llevo implementar una determinada tarea, bug o requisito. Otra vez, gracias a TFS con burocracia cero para el desarrollador.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Realizar una estimaci&amp;oacute;n precisa de una tarea que ya realizaste en alg&amp;uacute;n proyecto anterior&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El Product Backlog se debe &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/07/22/el-dif-237-cil-problema-de-la-estimaci-243-n.aspx"&gt;estimar&lt;/a&gt;, las tareas que forman parte de un Sprint se estiman. Scrum no dice nada sobre como debes estimar, pero la comparaci&amp;oacute;n con experiencias anteriores es la t&amp;eacute;cnica que explicita o impl&amp;iacute;citamente todos usamos. Los equipos &amp;aacute;giles suelen preferir &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2008/03/16/planning-poker-distribuido.aspx"&gt;m&amp;eacute;todos m&amp;aacute;s ligeros y m&amp;aacute;s llevaderos de estimaci&amp;oacute;n&lt;/a&gt;, basados en mejorar el conocimiento, la responsabilidad compartida y el consenso.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Listar las tareas que tienes pendientes en un determinado m&amp;oacute;dulo de tu proyecto&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En Scrum el concepto de &amp;lsquo;hecho&amp;rsquo; y &amp;lsquo;no hecho&amp;rsquo; es clave para &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2008/10/02/exprimiendo-scrum-scrum-y-el-control-del-proyecto-i-el-avance.aspx"&gt;gestionar el avance del proyecto&lt;/a&gt;. Sabemos en todo momento que elementos del Product Backlog han sido completado y cuales no. Exactamente el mismo aplica a nivel de Sprint Backlog. No solo eso, adem&amp;aacute;s visualizamos este estado mediante los gr&amp;aacute;ficos de burndown.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decir el tiempo restante para terminar un m&amp;oacute;dulo de tu proyecto&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En Scrum evitamos construir por m&amp;oacute;dulos. Un m&amp;oacute;dulo por si mismo no suele se capaz de hacer algo de valor para le cliente. No se trata de completar m&amp;oacute;dulos, sino de liberar en cada momento lo que m&amp;aacute;s valor tiene para el cliente. Tratamos de construir el software en &amp;lsquo;tiras verticales&amp;rsquo; que implementan toda la funcionalidad de una determinada historia de usuario. Logramos as&amp;iacute; un continuo flujo de valor. &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/WindowsLiveWriter/ExprimiendoScrumScrumyelcontroldelproyec_8FDB/Burndonw%20Chart_1f04b2ac-0464-4626-bae9-a14864e442cb.jpg"&gt;Mirando el Burdown Chart&lt;/a&gt; es muy simple decir cuanto queda para completar el proyecto. Evidentemente podemos filtrar este Burdown Chart para las historias de un area (m&amp;oacute;dulo) concreto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sacar un listado de las incidencias de un proyecto y la desviaci&amp;oacute;n en esfuerzo, tiempo y coste&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Una vez m&amp;aacute;s la respuesta es el Burdown Chart que visualiza cualquier desviaci&amp;oacute;n en tiempo real. El Burdown Chart refleja las desviaciones en tiempo, pero todos sabemos que tiempo y coste son magnitudes convertibles en gesti&amp;oacute;n de proyectos. Por ejemplo en este &lt;a href="http://geeks.ms/blogs/rcorral/WindowsLiveWriter/ExprimiendoScrumScrumyelcontroldelproyec_8FDB/Burndonw%20Chart_1f04b2ac-0464-4626-bae9-a14864e442cb.jpg"&gt;Burdown Chart&lt;/a&gt; se aprecia claramente una desviaci&amp;oacute;n de 60 puntos en un proyecto de 20 unidades de tiempo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sacar un listado de las peticiones de cambio de un cliente&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El Product Backlog recoge continuamente todas las peticiones del cliente. Todo lo solicitado por el cliente es gestionado por el Producto Owner utilzando el Product Backlog que permanece vivo a lo largo del proyecto. TFS nos proporciona informes sobre la tasa de cambio que ocurre en el Product Backlog.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Certificar que los requisitos del proyecto han sido entendidos y comprometidos por el equipo de trabajo&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Evidentemente. Durante el Sprint Planning Meeting, los desarrolladores entienden los requisitos, hacen preguntas y mejoran su conocimiento. La primera parte del Sprint Planning Meeting se dedica a esto. El Sprint Planning Meeting termina con el compromiso de los desarrolladores de hacer todo lo humanamente posible para lograr implementar los requisitos comprometidos para el Sprint durante el mismo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Identificar, si una prueba falla, que requisitos se ven afectados&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TFS permite asociar pruebas de aceptaci&amp;oacute;n y sus resultados con cualquier tipo de work item. Si haces esto, es simple responder esta pregunta. Yo he trabajado con equipos que hacen esto y equipos que no lo hacen. Si hay un tester en el equipo, es muy recomendable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Entregar una versi&amp;oacute;n del producto, mas o menos estable, al cliente, ahora mismo&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L&amp;oacute;gicamente. Esto es un problema cl&amp;aacute;sico de SCM. En cierto modo no est&amp;aacute; ligado a la metodolog&amp;iacute;a, sino que es una pr&amp;aacute;ctica de ingenier&amp;iacute;a del software m&amp;aacute;s que recomendable. En Scrum todo Sprint debe terminar con un &amp;lsquo;incremento de funcionalidad potencialmente entregable&amp;rsquo;. Las pol&amp;iacute;ticas de SCM de un proyecto que use Scrum &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/01/29/exprimiendo-scrum-scrum-y-la-gesti-243-n-de-la-configuraci-243-n-i.aspx"&gt;deben adecuarse a este objetivo&lt;/a&gt;. Una vez m&amp;aacute;s, aperece aqu&amp;iacute;, el objetivo de Scrum y de las metodolog&amp;iacute;as &amp;aacute;giles en general de &amp;lsquo;crear un flujo continuo del valor para le cliente&amp;rsquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decir el porcentaje de construcci&amp;oacute;n del producto o proyecto y certificar el coste actual, &amp;quot;on the fly&amp;quot;, del producto&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Una vez m&amp;aacute;s me remito al Product Backlog y a su primo visual, el Burndown Chart.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decir los riesgos activos que hay en tu proyecto&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claro que &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/06/28/exprimiendo-scrum-scrum-y-la-gesti-243-n-del-riesgo.aspx"&gt;gestionamos el riesgo&lt;/a&gt;, lo llamamos impedimentos y lo hacemos de una manera un poco diferente. No ponemos tanto &amp;eacute;nfasis pero todo proyecto Scrum tiene un backlog de impedimentos, que es &amp;lsquo;equivalente&amp;rsquo; a la lista de riesgos. Otras metodolog&amp;iacute;as &amp;aacute;giles, sobre todo MSF Agile, hace un gesti&amp;oacute;n del riesgo mucho m&amp;aacute;s explicita.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Enumerar las personas dedicadas al proyecto y el porcentaje de ocupaci&amp;oacute;n&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ufff&amp;hellip; porcentaje de ocupaci&amp;oacute;n&amp;hellip; es que alguien en alguna empresa no est&amp;aacute; ocupado al 100% :). Bromas a parte. En Scrum no nos importa tanto la ocupaci&amp;oacute;n del individuo como la del equipo. El concepto de equipo es vital. Pero l&amp;oacute;gicamente, en todo momento tratamos de ajustar la carga del equipo a su capacidad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decirme cuando queda liberado un recurso en concreto&lt;/strong&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ummm&amp;hellip; si por recursos te refieres a m&amp;aacute;quinas, servidores, fuentes de agua, y m&amp;aacute;quinas de caf&amp;eacute; y refrescos&amp;hellip; simplemente tratamos de tener los suficiente ;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decir las medidas correctivas que has tomado cuando has tenido desviaciones&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Todo Sprint termina con una Sprint Retrospective. Se trata de saber que ha ido bien, que ha ido mal y plantear las acciones correctoras. Todas las conclusiones quedan reflejadas en TFS y las acciones correctores necesarias que impliquen un esfuerzo explicito se meten en Product Backlog para su gesti&amp;oacute;n dentro de el marco de un Sprint.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Contar lo que se habl&amp;oacute; en la ante &amp;uacute;ltima reuni&amp;oacute;n de seguimiento con el cliente&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En Scrum las reuniones de seguimiento son obligatorias. Ocurren puntualmente con periodicidad predeterminada. En esta reuniones de seguimiento, Sprint Reviews en la jerga de Scrum, se muestra software que funciona mediante &amp;lsquo;demos&amp;rsquo;. Ocurre, sin excepci&amp;oacute;n, al final de cada Sprint. El cliente puede ver el progreso, no imagin&amp;aacute;rselo en base a diagramas de Gantt o sesudos informes de seguimiento. Adem&amp;aacute;s puede y debe dar feedback sobre lo visto durante el Sprint Review.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Enumerar las tareas y esfuerzo que te va a suponer la puesta en producci&amp;oacute;n&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Los equipos &amp;aacute;giles tratamos de hacer de la puesta en producci&amp;oacute;n una h&amp;aacute;bito. La idea es &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/01/18/evitar-quebraderos-de-cabeza-al-final-de-los-proyectos.aspx"&gt;minimizar el esfuerzo de puesta en producci&amp;oacute;n hasta limites tales que sea inapreciable&lt;/a&gt;. Para ello nos apoyamos en t&amp;eacute;cnicas como la &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/06/24/construcciones-automatizadas-y-diarias.aspx"&gt;integraci&amp;oacute;n continua o frecuente&lt;/a&gt; y el testeo automatizado. Dicho esto, cualquier tarea que se realice, sea del tipo que sea, se debe meter en el marco de un Sprint.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Como pod&amp;eacute;is ver &lt;strong&gt;Scrum responde las mismas cuestiones que CMMI de una manera diferente&lt;/strong&gt;, pero las responde. No pod&amp;iacute;a se de otra manera, pues muchas de las cuestiones planteadas por Miguel, son cuestiones universales en la gesti&amp;oacute;n de proyectos de software.&lt;/p&gt;
&lt;p&gt;Esto me lleva a pensar&amp;hellip; es posible usar Scrum + TFS, para cubrir CMMI Nivel 2&amp;hellip; la respuesta es que s&amp;iacute;. Precisamente de esto habl&amp;oacute; mi compa&amp;ntilde;ero &lt;a target="_blank" href="http://geeks.ms/blogs/jlsoria/archive/2009/06/16/evento-cmmi-agilidad-y-team-system.aspx"&gt;Jose Luis Soria hace poco en un evento sobre CMMI&lt;/a&gt;, a ver si se anima y publica las ppts en Slideshare.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151311" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iledfo3Hldh9_nSEONy7Y47L5ec/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iledfo3Hldh9_nSEONy7Y47L5ec/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iledfo3Hldh9_nSEONy7Y47L5ec/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iledfo3Hldh9_nSEONy7Y47L5ec/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=YGvj8NTMctc:qQy0mP73XZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=YGvj8NTMctc:qQy0mP73XZA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=YGvj8NTMctc:qQy0mP73XZA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=YGvj8NTMctc:qQy0mP73XZA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/YGvj8NTMctc" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/CMMI/default.aspx">CMMI</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/30/ser-237-as-capaz-de-161-por-supuesto-o-scrum-tambi-233-n-da-respuestas.aspx</feedburner:origLink></item><item><title>Pregunta a la comunidad: ¿Queréis un wiki en Geeks·ms?</title><link>http://feedproxy.google.com/~r/mlbb/~3/ZezQcOWIdNQ/pregunta-a-la-comunidad-191-quer-233-is-un-wiki-en-geeks-183-ms.aspx</link><pubDate>Sun, 28 Jun 2009 19:16:27 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151426</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=151426</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=151426</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/28/pregunta-a-la-comunidad-191-quer-233-is-un-wiki-en-geeks-183-ms.aspx#comments</comments><description>&lt;p&gt;Una de las posibilidades que tiene Community Server, la plataforma sobre la que corre Geeks·ms es contar con un Wiki. Esta posibilidad lleva ‘dormida’ mucho tiempo. No se si activar está posibilidad o no. De aquí las preguntas que hoy lanzo.&lt;/p&gt;  &lt;p&gt;¿Os gustaría contar con una Wiki en Geeks·ms?   &lt;br /&gt;Los editores serían todos aquellos que tengan un blog en Geeks·ms ¿qué contenidos adicionales a vuestro blog pondríais en ese Wiki?    &lt;br /&gt;¿Qué sugerencias tenéis, como autores o lectores de Geeks·ms sobre este asunto?&lt;/p&gt;  &lt;p&gt;Podemos contar con más de un Wiki, pero tal y como yo lo veo, creo que debería haber solo uno que aglutinase todo el conocimiento que pudiésemos almacenar sobre los temas que habitualmente tratamos en Geeks·ms.&lt;/p&gt;  &lt;p&gt;Lo que quiero es valorar si la comunidad cree que un Wiki aportaría valor a Geeks·ms. La duda se me plantea por que al contrario que los blogs, los foros que tenemos disponibles desde hace mucho tiempo, no parecen tener mucho movimiento.&lt;/p&gt;  &lt;p&gt;Esta vez, más que nunca, espero vuestros comentarios. Si no hay comentarios, supondré que la idea no despierta interés.&lt;/p&gt;  &lt;p&gt;¡Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151426" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aC7TIKJkmahfbxA949TmDupvQCU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aC7TIKJkmahfbxA949TmDupvQCU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aC7TIKJkmahfbxA949TmDupvQCU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aC7TIKJkmahfbxA949TmDupvQCU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZezQcOWIdNQ:HM-kujMlI2M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZezQcOWIdNQ:HM-kujMlI2M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=ZezQcOWIdNQ:HM-kujMlI2M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=ZezQcOWIdNQ:HM-kujMlI2M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/ZezQcOWIdNQ" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Geeks.ms/default.aspx">Geeks.ms</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/28/pregunta-a-la-comunidad-191-quer-233-is-un-wiki-en-geeks-183-ms.aspx</feedburner:origLink></item><item><title>Exprimiendo Scrum: ¿Cuál es tu definición de equipo?</title><link>http://feedproxy.google.com/~r/mlbb/~3/AEbeeQumQEw/Exprimiendo-Scrum_3A00_-_BF00_Cu_E100_l-es-tu-definici_F300_n-de-equipo_3F00_.aspx</link><pubDate>Thu, 25 Jun 2009 21:34:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151144</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://geeks.ms/blogs/rcorral/rsscomments.aspx?PostID=151144</wfw:commentRss><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=151144</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/25/Exprimiendo-Scrum_3A00_-_BF00_Cu_E100_l-es-tu-definici_F300_n-de-equipo_3F00_.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Equipo A" border="0" alt="Equipo A" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/EquipoA_5F00_59D346B0.jpg" width="209" height="285" /&gt;La problemática de la gestión de proyectos en las organizaciones que desarrollan software se deriva, simplificando el asunto, de dos situaciones: gestionar proyectos muy grandes o gestionar muchos proyectos pequeños. Todos estaremos de acuerdo en que cualquiera de estas dos situaciones es más compleja que la situación, más equilibrada, en la que tenemos un número limitado de proyectos con unas dimensiones limitadas. &lt;/p&gt;  &lt;p&gt;De estas tres posibilidades, sin duda la más compleja es muchos proyectos pequeños. Los grandes problemas siempre se pueden dividir en problemas de tamaño medio y reducir así la complejidad, llevarlos a la categoría de ‘un numero pequeños de proyectos medianos’.&lt;/p&gt;  &lt;p&gt;El por qué la situación más compleja se da cuando tenemos muchos pequeños proyectos es simple: tendemos a tener más cambios de contexto. Los cambios de contexto se dan al ‘pasar’ de un proyecto a otro y son tiempos perdidos. Si a un número grande de proyectos pequeños, unimos que no hay concepto de equipo, los cambios de contexto son continuos y la caída de productividad acusada. Cuando un proyecto está en manos de una persona y no de un equipo, esta persona inevitablemente es un cuello de botella. &lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;No voy ha hablar hoy de los cambios de contexto, en otra ocasión volveré sobre el tema, que ya he &lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/12/28/cu-ntos-proyectos-no-gestionas.aspx" target="_blank"&gt;tratado, someramente, en alguna otra ocasión&lt;/a&gt;.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Cuando tratamos de implantar Scrum en una organización este problema de la gestión de proyectos también nos afecta de manera decisiva. Como hemos comentado se trata de un problema de cambios del contexto y el antídoto de Scrum para los cambios de contexto es el concepto de equipo autoorganizado y autogestionado. La idea clave es que un equipo autoorganizado y autogestionado puede elegir en que momentos introducir los cambios de contexto, y por simple sentido común elegirá los momentos idóneos. Siguiendo con esta argumentación se hace patente que &lt;strong&gt;es precisamente en entornos que presentan muchos pequeños proyectos en los que más dificultoso es implantar Scrum y en los que más atención se debe prestar a un tema clave: definir que es un equipo en tu organización.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;En empresas con ‘muchos pequeños proyectos’, como la gran mayoría de las pequeñas y medianas consultoras, la gran dificultad pasa por encontrar que es un equipo para esa organización, en primer lugar, y en segundo lugar definir cuantos product backlogs se van manejar.&lt;/p&gt;  &lt;p&gt;Para hacer esto, no hay una receta universal. Depende mucho de la cultura y organización actual de la empresa. Pero es la clave. Pensad que ahora solo existen individuos y tenemos que pasar de esa situación a una en la que el trabajo de reparta entre equipos, no entre individuos. Esa es la gran dificultad.&lt;/p&gt;  &lt;p&gt;El principal problema que tenemos en la situación actual es el tiempo que se os va en cambios de contexto, insisto. Probablemente estemos en la típica situación de prioridades difusas, de atender a los fuegos, al cliente que más grita... el antídoto para eso es Scrum y su modelo de equipos. Por ahí empezaría yo, por ahí empiezo yo toda implantación de Scrum en este tipo de situaciones, definir los equipos.&lt;/p&gt;  &lt;p&gt;Esa definición de equipos se puede hacer atendiendo a numerosos factores y es particular de cada caso, muchas veces no resulta evidente, pero es vital hacerlo bien. Podemos particionar los equipos por numerosos criterios: tecnología, cliente al que se dedican, proyecto (la más evidente)... Lo vital, en mi opinión, es que esas particiones sean verdaderas particiones, que no existan individuos que están en n equipos a la vez.&lt;/p&gt;  &lt;p&gt;Yo suelo analizar las particiones que me salen según las leyes de las particiones de Roger S. Sessions, y da buen resultado:&lt;/p&gt;  &lt;p&gt;1ª Ley: Las particiones deben ser verdaderas particiones.    &lt;br /&gt;2ª Ley: Las particiones deben ser adecuadas al problema.     &lt;br /&gt;3ª Ley: El número de subconjuntos en una partición debe ser adecuado.     &lt;br /&gt;4ª Ley: El tamaño de las particiones debe ser aproximadamente igual.     &lt;br /&gt;5ª Ley: Las interacciones entre subconjuntos deben ser mínimas y bien definidas.&lt;/p&gt;  &lt;p&gt;Si lográis hacer bien eso, habréis dado un gran paso. Luego, a la hora de determinar el número de backlogs, el enfoque más simple es un equipo, un backlog, un product owner. Aunque no siempre es posible, es el enfoque más simple y el que siempre se debe perseguir.&lt;/p&gt;  &lt;p&gt;Hay una manera muy simple de saber si hemos hecho esto bien: elegimos un desarrollador al azar y le preguntamos:&lt;/p&gt;  &lt;p&gt;¿Tu a qué equipo perteneces?    &lt;br /&gt;¿Dónde está vuestro product backlog?     &lt;br /&gt;¿Quién son vuestro Producto Owner y Scrum Master?     &lt;br /&gt;¿Cuáles son los objetivos de tu equipo para este sprint?&lt;/p&gt;  &lt;p&gt;Si recibimos respuestas ambiguas, es que no tenemos un modelo de equipos. &lt;strong&gt;Sin un modelo claro de equipos no es posible una correcta implantación de Scrum.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;El enfoque más simplista de Scrum persigue un proyecto, un backlog, un equipo. Pero esto no siempre es posible en consultoras donde lo que hay son muchos proyectos pequeños que gestionar como un todo en lugar de algunos proyectos grandes que respondan al modelo simple de Scrum.&lt;/p&gt;  &lt;p&gt;Este post, se inspira en una interesante conversación mantenida sobre este tema en la lista de Agile Spain, quizás queráis &lt;a href="http://groups.google.es/group/agile-spain/browse_thread/thread/2938dab99fc12129" target="_blank"&gt;leer los pensamientos allí expuestos&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;¡Espero vuestros comentarios!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151144" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ViUpoG1X0tdnURMOH4Orb4nXsQU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ViUpoG1X0tdnURMOH4Orb4nXsQU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ViUpoG1X0tdnURMOH4Orb4nXsQU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ViUpoG1X0tdnURMOH4Orb4nXsQU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=AEbeeQumQEw:nc2-mdJFV7Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=AEbeeQumQEw:nc2-mdJFV7Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mlbb?a=AEbeeQumQEw:nc2-mdJFV7Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=AEbeeQumQEw:nc2-mdJFV7Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/AEbeeQumQEw" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Metodolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metodolog&amp;#237;as &amp;#193;giles</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/25/Exprimiendo-Scrum_3A00_-_BF00_Cu_E100_l-es-tu-definici_F300_n-de-equipo_3F00_.aspx</feedburner:origLink></item></channel></rss>
