<?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><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>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>0</slash:comments><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 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/e-CJ7IcCHmJrvja7m-PALN_TX3k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e-CJ7IcCHmJrvja7m-PALN_TX3k/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/e-CJ7IcCHmJrvja7m-PALN_TX3k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e-CJ7IcCHmJrvja7m-PALN_TX3k/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: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>10</slash:comments><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><item><title>Sobre gurús y telepredicadores…</title><link>http://feedproxy.google.com/~r/mlbb/~3/IhiKxlOD-Ac/sobre-gurus-y-telepredicadores.aspx</link><pubDate>Tue, 23 Jun 2009 21:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151092</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>8</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=151092</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/23/sobre-gurus-y-telepredicadores.aspx#comments</comments><description>&lt;p&gt;Escrib&amp;iacute;a hace algunos d&amp;iacute;as Juan Palacio en su imprescindible blog &lt;a target="_blank" href="http://navegapolis.net"&gt;navegapolis.net&lt;/a&gt; sobre la proliferaci&amp;oacute;n de gurus de lo &amp;aacute;gil (antes proliferaron los gur&amp;uacute;s de la gesti&amp;oacute;n del riesgo, de CMMI, de&amp;hellip;). Gente que por cursos de dudosa &amp;uacute;tilidad, m&amp;aacute;s all&amp;aacute; de regodearse en la obviedades de lo &amp;aacute;gil, cobran autenticas burradas. Comparto la apat&amp;iacute;a de Juan hacia este tipo de gur&amp;uacute; (o telepredicador).&lt;/p&gt;
&lt;p&gt;Yo siempre he estado en contra de los cursos de Scrum generalistas. En Plain Concepts no los ofrecemos. No tiene sentido dedicar dos d&amp;iacute;as de tu precioso tiempo ha hablar de las generalidades Scrum, Lean, XP&amp;hellip;, es algo que se puede aprender con la &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/05/10/lecturas-imprecincibles-sobre-scrum.aspx"&gt;excelente bibliograf&amp;iacute;a disponible sobre el tema&lt;/a&gt;. Los fundamentos de Scrum (y de la agilidad en general) &lt;a target="_blank" href="http://geeks.ms/blogs/thempra/archive/2008/12/15/scrum-en-10-minutos.aspx"&gt;se aprenden en diez minutos&lt;/a&gt; y se le pueden hasta &lt;a target="_blank" href="http://geeks.ms/blogs/jorge/archive/2007/05/09/explicando-scrum-a-mi-abuela.aspx"&gt;explicar a tu abuela&lt;/a&gt;. Otra cosa es aplicar lo aprendido.&amp;nbsp;Ah&amp;iacute; si que puedes necesitar ayuda. La teoria es f&amp;aacute;cil, hay que conocerla pero es facil, &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2007/06/06/nadie-dijo-que-no-exigiese-un-esfuerzo.aspx"&gt;la pr&amp;aacute;ctica dificil&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Aprender Scrum de verdad no puede hacerse, no tiene sentido , si no es en un marco concreto de aplicaci&amp;oacute;n pr&amp;aacute;ctica, con un equipo concreto, para un proyecto o proyectos concretos. Ah&amp;iacute; es donde est&amp;aacute; la dificultad, Ah&amp;iacute; es donde quiz&amp;aacute;s un experto en la materia pueda hacerte falta. Alguien que de verdad se haya fajado en el barro, que se haya pegado con montar todas las &lt;a target="_blank" href="http://geeks.ms/blogs/rcorral/archive/2009/03/05/191-es-posible-scrum-ignorando-las-buenas-pr-225-cticas.aspx"&gt;practicas de ingenier&amp;iacute;a del software que rodean la agilidad&lt;/a&gt;, con soportar la agilidad con las herramientas adecuadas, o con tem&amp;aacute;s tan simples y obvios, pero tan olvidados, como &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;adecuar tu pol&amp;iacute;tica de gesti&amp;oacute;n de la configuraci&amp;oacute;n a tu metodolog&amp;iacute;a &amp;aacute;gil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Como coment&amp;eacute; en el post de Juan, en mi opini&amp;oacute;n, lo que separa a un gur&amp;uacute; de un telepredicador son los resultados, nada m&amp;aacute;s. La puesta en escena es similar, la verborrea parecida, los powerpoints igual de deslumbrantes... pero los resultados, los resultados no. Hay mucha gente dando cursos de Scrum o Lean o XP o lo que sea, mucha m&amp;aacute;s escribiendo sobre el mismo tema, bastantes m&amp;aacute;s luciendo certificaciones y certificando a otros... pero no hay tanta gente que pueda ense&amp;ntilde;ar un palmar&amp;eacute;s de resultados significativo. Si no funciona simpre podremos llamar al Gran Vidente Africano&amp;hellip;&lt;/p&gt;
&lt;p&gt;No son tantos los gur&amp;uacute;s que pueden decir, mira, por qu&amp;eacute; no te vienes a este cliente conmigo o a este otro o aquel que es de tu sector y hablamos de c&amp;oacute;mo hemos transformado la gesti&amp;oacute;n de proyectos en su organizaci&amp;oacute;n, de que resultados hemos obtenido, de que ha ido bien y que no ha ido tan bien... y tambi&amp;eacute;n, ya que estamos, de si el resultado ha sido satifactorio y el gur&amp;uacute; era tal. &lt;/p&gt;
&lt;p&gt;Mucha gente puede venderte la moto de la agilidad, y ense&amp;ntilde;arte a jugar con &lt;em&gt;postits&lt;/em&gt;, pero no tantos pueden transformar la manera en la que tu equipo de desarrollo funciona. Solo estos son gur&amp;uacute;s. Y es que en esto de la agilidad, como en todo, una cosa es predicar y otra dar trigo.&lt;/p&gt;
&lt;p&gt;Por cierto antes de que alguien tire con dardo en los comentarios: no, no me considero un gur&amp;uacute;, no le llego a la altura del zapato al Gran Vidente Africano (que ya me ha solucionado dos fugas de memoria y tres deadlocks con un &lt;a target="_blank" href="http://geeks.ms/blogs/palvarez/archive/2009/06/23/modern-day-cowboy-sosex-para-windbg.aspx"&gt;conjuro llamado SOSEX&lt;/a&gt; o quiz&amp;aacute;s ese fue el &lt;a target="_blank" href="http://geeks.ms/blogs/palvarez"&gt;Maestro Sr. Doval&lt;/a&gt;)&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img height="347" width="452" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Granvidenteafricano_5F00_35EEDD35.jpg" alt="Gran vidente africano" border="0" title="Gran vidente africano" style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" /&gt; &lt;/p&gt;
&lt;p&gt;&amp;hellip;pero s&amp;iacute;, tengo claro que puedo ayudarte a llevar la agilidad a tu empresa.&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=151092" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LgDeVYNHiCuvCXk9Jr3QKExj9to/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LgDeVYNHiCuvCXk9Jr3QKExj9to/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/LgDeVYNHiCuvCXk9Jr3QKExj9to/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LgDeVYNHiCuvCXk9Jr3QKExj9to/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=IhiKxlOD-Ac:gSbXj8OZ-p4: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=IhiKxlOD-Ac:gSbXj8OZ-p4: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=IhiKxlOD-Ac:gSbXj8OZ-p4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=IhiKxlOD-Ac:gSbXj8OZ-p4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/IhiKxlOD-Ac" 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/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/23/sobre-gurus-y-telepredicadores.aspx</feedburner:origLink></item><item><title>¿Qué hacer si MSMQ tarda mucho en enviar el primer mensaje?</title><link>http://feedproxy.google.com/~r/mlbb/~3/sh4vD6o6JFM/191-qu-233-hacer-si-msmq-tarda-mucho-en-enviar-el-primer-mensaje.aspx</link><pubDate>Mon, 15 Jun 2009 16:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:150350</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>5</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=150350</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/15/191-qu-233-hacer-si-msmq-tarda-mucho-en-enviar-el-primer-mensaje.aspx#comments</comments><description>&lt;p&gt;MSMQ es una de esas tecnologías que de repente reviven, y pasan de ser usadas por unos pocos a ser ampliamente utilizadas. WCF y la popularidad que las arquitecturas EDA (&lt;a href="http://en.wikipedia.org/wiki/Event_Driven_Architecture" target="_blank"&gt;Event Driven Architecture&lt;/a&gt;) han ganado tiene que ver mucho con este renacer. WCF ha facilitado enormemente la utilización de MSMQ llevando las ventajas de las comunicaciones basada en mensajería a una infinidad de arquitecturas. Si queréis saber más sobre el tema no os perdáis un webcast muy interesante del que ya hablé hace un tiempo: &lt;a href="http://geeks.ms/blogs/rcorral/archive/2007/06/05/webcast-patrones-para-arquitecturas-orientadas-a-eventos-y-mensajes.aspx" target="_blank"&gt;Webcast: Patrones para arquitecturas orientadas a eventos y mensajes&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;WCF pone una capa de abstracción sobre MSMQ que facilita enormemente su uso, pero que también dificulta en cierto modo la detección de problemas. No debemos olvidar que MSMQ esta debajo de WCF. Y todas las abstracciones fugan. Es en ese momento cuando tenemos que bajar de nivel y ver que pasa en MSMQ. Son muchos los aspectos de MSMQ que pueden penalizar el rendimiento o la estabilidad de nuestra aplicaciones, por mucho que WCF abstraiga los aspectos más truculentos. La fuente última de información sobre MSMQ una tecnología de Microsoft no muy bien documentada es un documento, de ciento y pico páginas, nada fácil del encontrar llamado &lt;a href="http://download.microsoft.com/download/f/0/6/f06db639-09c4-4738-bd36-ca8640d9f872/msmqFaq.doc" target="_blank"&gt;Message Queuing Frequently Asked Questions&lt;/a&gt;. Regencia imprescindible para cualquiera que use MSMQ en sus aplicaciones. &lt;/p&gt;  &lt;p&gt;Hoy voy a hablar de una de esas situaciones en que hay que trastear con los oscuros parámetros de MSMQ, un sniffer de red y los contadores de rendimiento para lograr que nuestra aplicación funcione como debe. &lt;/p&gt;  &lt;p&gt;Hace unos días recibí una llamada de un cliente. Una aplicación que funcionaba perfectamente en decenas de instalaciones no se comportaba como debía. La primera vez que realizaban unas acciones (que yo sabía que implicaban el envío de un mensaje de MSMQ mediante WCF) la aplicación tardaba un motón de tiempo (alrededor de un minuto) en arrojar resultados. Esto era especialmente molesto, pues el patrón típico de uso de la aplicación era largos tiempos de inactividad seguidos de momentos en que debía responder rápidamente. &lt;/p&gt;  &lt;p&gt;Una cosa que mucha gente desconoce de MSMQ es que trabaja mediante sesiones (ojo, no confundir con las sesiones de WCF, nada que ver). Siempre que en una arquitectura nos encontramos con &amp;#39;sesiones&amp;#39; sean del tipo que sean, sabemos o podemos intuir dos cosas: que establecer esas sesiones tiene un coste y que las sesiones tienden a caducar tras ciertos periodos de inactividad para ahorrar recursos. Pues bien, esta es la clave del asunto que hoy nos preocupa: típicamente iniciar una sesión de MSMQ es un proceso que no debe llevar más de unos milisegundos. De todos modos es un proceso complejo que implica numerosos elementos de nuestra infraestructura de red y comunicaciones: consultas DNS, consultas al directorio activo, autenticación de usuarios y el intercambio de unos cuantos intercambios de información por la red. Podéis ver el proceso en la siguiente captura de red (realizada con &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=983b941d-06cb-4658-b7f6-3088333d062f" target="_blank"&gt;Microsoft Network Monitor&lt;/a&gt;): &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="MSMQ Session" border="0" alt="MSMQ Session" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/MSMQSession_5F00_00702D3E.gif" width="1063" height="238" /&gt; &lt;/p&gt;  &lt;p&gt;La parte resaltada en rojo, se corresponde con el establecimiento de la sesión de MSMQ. La parte resaltada en azul con el envío del primer mensaje. Si en alguno de los paquetes intercambiados hubiese un retardo relevante, con alta probabilidad, tendríamos un problema relacionado con la apertura de sesiones. &lt;/p&gt;  &lt;p&gt;En esta situación, la solución pasa por ver que elementos de nuestra infraestructura subyacente está fallando. Más adelante comentaré algunas opciones para resolver esta cuestión, pero ahora voy a comentar un workarround rápido para el problema. Es evidente que una táctica que podemos usar, es evitar que las sesiones de MSMQ caduquen. Así solo pagaremos el peaje del retardo en una única ocasión. Para controlar el tiempo que tardan en caducar las sesiones de MSMQ hemos de modificar el valor &lt;a href="http://technet.microsoft.com/en-us/library/cc957466.aspx" target="_blank"&gt;CleanupInterval&lt;/a&gt; en la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters que controla el tiempo de caducidad de las sesiones de MSMQ. Hay que resaltar, ya que la documentación no lo dice que debemos establecer este valor tanto en el cliente como en el servidor pues prima el menor de ambos (anda que no me dio quebraderos de cabeza este tema). El valor máximo es 0xffffffff milisegundos, unos cincuenta días. &lt;/p&gt;  &lt;p&gt;&lt;img title="MSMQ Session Cleanup Interval" border="0" alt="MSMQ Session Cleanup Interval" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/MSMQSessionCleanupInterval_5F00_2838C40C.gif" width="688" height="374" /&gt;&lt;/p&gt;  &lt;p&gt;Para monitorizar el comportamiento de las sesiones de MSMQ lo mejor es usar los contadores de rendimiento de MSMQ:&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="MSMQ Sessions Performance Counter" border="0" alt="MSMQ Sessions Performance Counter" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/MSMQSessionsPerformanceCounter_5F00_655F1042.gif" width="576" height="329" /&gt; &lt;/p&gt;  &lt;p&gt;Evidentemente este &amp;#39;workarround&amp;#39; tiene efectos laterales:&lt;/p&gt;  &lt;p&gt;1) Cada sesión abierta consume una CAL de servidor. Si agotamos esas CAL, sucesivos clientes no se podrán conectar. Además hay que recordar que en un sistema operativo que no sea de servidor como máximo podremos tener diez sesiones abiertas simultáneamente.   &lt;br /&gt;2) Mantener sesiones, consume recursos y puede afectar a la escalabilidad. &lt;/p&gt;  &lt;p&gt;Evidentemente lo aquí comentado solo minimiza el problema pero no los resuelve. Algunas recomendaciones para diagnosticar este tipo de problemas son: &lt;/p&gt;  &lt;p&gt;- Usar la IP del servidor a establecer la dirección de la cola remota. Nos ahorraremos la resolución de nombres y podemos diagnosticar si el retardo de establecimiento de sesione tiene que ver con esto.   &lt;br /&gt;- Usar colas privadas, sin autenticación y sin transaccionacionalidad. Nos ahorraremos consultas al AD para localizar las colas, para autenticar usuarios y nos ahorraremos mensajes de ACK de MSMQ para mantener la transaccionacionalidad. &lt;/p&gt;  &lt;p&gt;¡Espero que os resulte interesante!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150350" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JniK2pTtDpixrZNT_26dgxAFtmw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JniK2pTtDpixrZNT_26dgxAFtmw/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/JniK2pTtDpixrZNT_26dgxAFtmw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JniK2pTtDpixrZNT_26dgxAFtmw/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=sh4vD6o6JFM:B7dd-JTSYsg: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=sh4vD6o6JFM:B7dd-JTSYsg: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=sh4vD6o6JFM:B7dd-JTSYsg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=sh4vD6o6JFM:B7dd-JTSYsg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/sh4vD6o6JFM" 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/MSMQ/default.aspx">MSMQ</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Optimizaci_26002300_243_3B00_n/default.aspx">Optimizaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Depuraci_26002300_243_3B00_n/default.aspx">Depuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/DOT/default.aspx">DOT</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/15/191-qu-233-hacer-si-msmq-tarda-mucho-en-enviar-el-primer-mensaje.aspx</feedburner:origLink></item><item><title>He leído: Simple architectures for complex enterprises de Roger Sessions</title><link>http://feedproxy.google.com/~r/mlbb/~3/jYPMgfi_fyo/he-le-237-do-simple-architectures-for-complex-enterprises-de-roger-sessions.aspx</link><pubDate>Thu, 11 Jun 2009 17:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:150035</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=150035</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/11/he-le-237-do-simple-architectures-for-complex-enterprises-de-roger-sessions.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0735625786?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735625786"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral.He+le_ED00_do/Simple-architectures-for-complex-enterprises.gif" align="left" alt="C&amp;oacute;mpralo en Amazon" border="0" title="C&amp;oacute;mpralo en Amazon" style="margin:0px 10px 10px 0px;display:inline;" /&gt;&lt;/a&gt; Todos los que estamos de una manera u otra vinculados con el desarrollo de software sabemos que hay un enemigo a combatir: la complejidad. El libro que hoy comento es una oda a la simplicidad. Que entendamos las fuentes de la complejidad, sus manifestaciones y las t&amp;aacute;cticas con las que contamos a la hora de combatirla es la clara motivaci&amp;oacute;n que llevo a Roger Sessions.&lt;/p&gt;
&lt;p&gt;El libro tiene, a mi modo de ver partes bien diferenciadas, que no necesariamente se corresponder con cap&amp;iacute;tulos determinados. &lt;/p&gt;
&lt;p&gt;Hay partes del libro que tratan las matem&amp;aacute;ticas subyacentes en la complejidad y que &amp;lsquo;prueban&amp;rsquo; matem&amp;aacute;ticamente como las diferentes t&amp;aacute;cticas que propone para acotar esa complejidad son efectivas. Es la parte m&amp;aacute;s &amp;aacute;rida del libro, para muchos lectores ser&amp;aacute; prescindible, aunque yo he disfrutado con enormemente con ella. Que nadie piense en formulas matem&amp;aacute;ticas si no en un tono de divulgaci&amp;oacute;n matem&amp;aacute;tica bastante logrado.&lt;/p&gt;
&lt;p&gt;Otra parte del libro, lleva al mundo real, mediante fabulas, ejemplos e historias reales la teor&amp;iacute;a expuesta de manera matem&amp;aacute;tica. La fabulas son en general divertidas y algunas de ellas han inspirado post en este blog: &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/03/12/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx"&gt;Velocidad de iteraci&amp;oacute;n vs Calidad de iteraci&amp;oacute;n&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx"&gt;Ya, ya... Keep It Simple, Stupid&amp;hellip; &amp;iquest;pero c&amp;oacute;mo?&lt;/a&gt;. De especial inter&amp;eacute;s me ha resultado la explicaci&amp;oacute;n que da el autor del enorme fallo de proyecto que se produjo con el sistema inform&amp;aacute;tico de la seguridad social del Reino Unido y como lo liga con la complejidad del sistema&amp;hellip; aunque mi conclusi&amp;oacute;n tras leer el tema fue que la complejidad estaba en la mara&amp;ntilde;a de subcontrataciones que se transluce&amp;hellip; adem&amp;aacute;s de en la propia arquitectura.&lt;/p&gt;
&lt;p&gt;Otra parte del libro, la dedica el autor a describir de manera formal una metodolog&amp;iacute;a, SIP, basada en el concepto de partici&amp;oacute;n (el autor a estas alturas ya ha demostrado que particionar los problemas arquitect&amp;oacute;nicos es la manera m&amp;aacute;s eficaz de evitar la complejidad) y los principios descritos por las cinco leyes de las particiones:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1&amp;ordf; Ley: Las particiones deben ser verdaderas particiones. &lt;br /&gt;2&amp;ordf; Ley: Las particiones deben ser adecuadas al problema. &lt;br /&gt;3&amp;ordf; Ley: El n&amp;uacute;mero de subconjuntos en una partici&amp;oacute;n debe ser adecuado. &lt;br /&gt;4&amp;ordf; Ley: El tama&amp;ntilde;o de las particiones debe ser aproximadamente igual. &lt;br /&gt;5&amp;ordf; Ley: Las interacciones entre subconjuntos deben ser m&amp;iacute;nimas y bien definidas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nada nuevo bajo el sol, si cambiamos particiones por subsistemas, y elementos por clases, algo que todo desarrollador con experiencia conoce. De hecho, en la &amp;uacute;ltima parte del libro, que quiz&amp;aacute;s sea la m&amp;aacute;s importante desde un punto de vista de pura arquitectura del software, el autor desarrolla un m&amp;eacute;todo de an&amp;aacute;lisis, sustentado en las leyes anteriores que permite id&amp;eacute;ntica los elementos y las particiones en una arquitectura de software. Pod&amp;eacute;is introduciros en las ideas explicadas en el libro leyendo este art&amp;iacute;culo del autor: &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa479371.aspx"&gt;A Better Path to Enterprise Architectures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El merito del autor, es crear una metodolog&amp;iacute;a formal para atajar la complejidad en las arquitecturas empresariales. Esto es algo que ning&amp;uacute;n otro framework arquitect&amp;oacute;nico anterior, como TOGAF, FEA o Zachman ha logrado. Estos framework no han ido m&amp;aacute;s all&amp;aacute; de construir taxonom&amp;iacute;as para catalogar nuestros artefactos arquitect&amp;oacute;nicos, pero sin dotarnos de ning&amp;uacute;n proceso. En el libro tambi&amp;eacute;n encontraremos una descripci&amp;oacute;n de los frameworks arquitect&amp;oacute;nicos m&amp;aacute;s comunes. Pod&amp;eacute;is leer una comparci&amp;oacute;n entre estos frameworks realizada por el autor en &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb466232.aspx"&gt;A Comparison of the Top Four Enterprise-Architecture Methodologies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En definitiva, el libro es interesante, pero sin duda no es una obra imprescindible aunque si es interesante y novedosa. Lo que s&amp;iacute; es cierto que la aproximaci&amp;oacute;n que el autor hace a la arquitectura empresarial es muy original y totalmente agn&amp;oacute;stica de la tecnolog&amp;iacute;a empleada. Sea el que sea el tipo de arquitectura empresarial que quieras establecer (una intranet corporativa, un sistema de correo, un ERP&amp;hellip;) lo expuesto en el libro es de inter&amp;eacute;s. En cualquier caso, si est&amp;aacute;s interesado en la arquitectura de m&amp;aacute;s alto nivel, en la arquitectura a nivel empresarial, este es &lt;a target="_blank" href="http://www.amazon.com/gp/product/0735625786?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735625786"&gt;un libro que sin duda debes comprar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Feliz lectura!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150035" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iwTWns7j3cFDhWzd7BRJ13q4eb4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iwTWns7j3cFDhWzd7BRJ13q4eb4/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/iwTWns7j3cFDhWzd7BRJ13q4eb4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iwTWns7j3cFDhWzd7BRJ13q4eb4/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=jYPMgfi_fyo:yQDReU5TCPM: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=jYPMgfi_fyo:yQDReU5TCPM: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=jYPMgfi_fyo:yQDReU5TCPM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=jYPMgfi_fyo:yQDReU5TCPM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/jYPMgfi_fyo" 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><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/11/he-le-237-do-simple-architectures-for-complex-enterprises-de-roger-sessions.aspx</feedburner:origLink></item><item><title>Microsoft SDL Process Template: La seguridad, una cuestión de proceso</title><link>http://feedproxy.google.com/~r/mlbb/~3/1cyruI5uCZE/microsoft-sdl-process-template-la-seguridad-una-cuesti-243-n-de-proceso.aspx</link><pubDate>Mon, 08 Jun 2009 05:06:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:149976</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>3</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=149976</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/08/microsoft-sdl-process-template-la-seguridad-una-cuesti-243-n-de-proceso.aspx#comments</comments><description>&lt;p&gt;Todo comenz&amp;oacute; con un &lt;a href="http://windowsitpro.com/article/articleid/23801/complete-text-of-the-bill-gates-trustworthy-computing-memo.html"&gt;mail de Bill Gates&lt;/a&gt;. La seguridad era la gran prioridad y Michael Howard ha sido el encargado de materializar, desde un punto de vista t&amp;eacute;cnico, esta nueva visi&amp;oacute;n. Howard enseguida se dio cuenta de que la seguridad era cuesti&amp;oacute;n de dos pilares: la formaci&amp;oacute;n de los desarrolladores (Writing Secure Code fu&amp;eacute; el gran paso en este aspecto) y, sobre todo, una cuesti&amp;oacute;n de proceso. Solo un proceso de desarrollo seguro, dar&amp;iacute;a los resultado necesarios. As&amp;iacute; surgi&amp;oacute; &lt;a href="http://msdn.microsoft.com/en-us/library/ms995349.aspx"&gt;SDL (Security Development Lifecycle)&lt;/a&gt;. Este proceso, sobre el que pod&amp;eacute;is saber m&amp;aacute;s gracias al libro &lt;a href="http://www.amazon.com/gp/product/0735622140?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735622140"&gt;The Security Development Lifecycle&lt;/a&gt;, es el responsable de la mejora espectacular en seguridad que los productos de Microsoft han logrado en los &amp;uacute;ltimos a&amp;ntilde;os. No hay m&amp;aacute;s que ver por ejemplo IIS7 comparado con Apache 2.2.x, como pod&amp;eacute;is ver en estos gr&amp;aacute;ficos de &lt;a target="_blank" href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.secunia.com"&gt;Secunia&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img height="270" width="443" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/IIS7vulnerabilities_5F00_72C6B82F.png" alt="IIS7 vulnerabilities" border="0" title="IIS7 vulnerabilities" style="display:inline;border:0;float:left;margin:10px;" /&gt; &lt;img height="270" width="443" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Apachevulnerabilities_5F00_43482396.png" alt="Apache vulnerabilities" border="0" title="Apache vulnerabilities" style="display:inline;border:0;float:left;margin:10px;" /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="230" width="443" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/IIS7patches_5F00_7322C557.png" alt="IIS7 patches" border="0" title="IIS7 patches" style="display:inline;border:0;float:left;margin:10px;" /&gt;&lt;img height="230" width="443" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Apachepatches_5F00_66486F39.png" alt="Apache patches" border="0" title="Apache patches" style="display:inline;border:0;margin:10px;" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los frutos del mail de Bill Gates, &lt;a href="http://msdn.microsoft.com/en-us/library/dd378764.aspx"&gt;han sido muchos&lt;/a&gt;: &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc337897.aspx"&gt;mejoras en las librer&amp;iacute;as de C/C++&lt;/a&gt;, mejoras en el API de Windows, una gu&amp;iacute;a clara a la hora de abordar la seguridad cuando desarrollamos para Windows, el excelente libro: &lt;a href="http://www.amazon.com/gp/product/0735617228?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735617228"&gt;Writing Secure Code&lt;/a&gt;, y as&amp;iacute; un largo etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Si hablamos de un proceso de desarrollo de Microsoft, parece evidente que el mejor lugar para que este proceso viva, a parte de los excelentes libros y art&amp;iacute;culos ya citado,s es en un plantilla metodol&amp;oacute;gica de Team System. Pues bien, el &lt;a href="http://blogs.msdn.com/sdl/"&gt;equipo de SDL&lt;/a&gt; ha liberado una plantilla que facilita enormemente la implementaci&amp;oacute;n de SDL como complemento a nuestro proceso de desarrollo. La calidad de la plantilla es espectacular. No se trata de una de tantas plantillas &amp;#39;cutres&amp;#39; que hay por ah&amp;iacute; dando vueltas&amp;hellip; Pod&amp;eacute;is &lt;a href="http://msdn.microsoft.com/en-us/security/dd670265.aspx"&gt;descargarla&lt;/a&gt; y echarla un vistazo, de verdad merece la pena, aunque solo sea como ejemplo de lo que se puede hacer desde le punto de vista de incorporar procesos de desarrollo a TFS con facilidad.&lt;/p&gt;
&lt;p&gt;&lt;img height="449" width="628" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/SDL_5F00_168F43F0.png" alt="Microsoft Secure Development Lifecycle" border="0" title="Microsoft Secure Development Lifecycle" style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" /&gt; &lt;/p&gt;
&lt;p&gt;Evidentemente, SDL no es un proceso que toda empresa se deba plantear implementar. Para muchos desarrollos casi con usar FxCop y la seguir las buenas pr&amp;aacute;cticas de seguridad recomendadas por Microsoft es suficiente o al menos todo lo que nuestro clientes van a pagar. Pero hay muchos proyectos en los que implementar SDL nos puede proporcionar un retorno de la inversi&amp;oacute;n claro: banca, administraci&amp;oacute;n p&amp;uacute;blica, sitios que manejan datos sensibles o privados en internet, etc&amp;hellip; En estos casos SDL y Team System son un excelente camino hacia una implementaci&amp;oacute;n sencilla de un proceso de desarrollo seguro, no en vano, &lt;strong&gt;el &amp;lsquo;tagline&amp;rsquo; de esta plantilla es &amp;lsquo;Making secure code easier&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Siempre se dice, que &lt;strong&gt;en seguridad es vital no inventar&lt;/strong&gt;, &amp;iquest;qu&amp;eacute; mejor que usar un proceso de desarrollo que ha dado grandes resultados y que se apoya en nuestra herramienta favorita de gesti&amp;oacute;n de proyectos?&lt;/p&gt;
&lt;p&gt;Si este post ha despertado vuestra curiosidad ten&amp;eacute;is m&amp;aacute;s informaci&amp;oacute;n sobre la plantilla en el &lt;a target="_blank" href="http://blogs.msdn.com/bharry/archive/2009/05/19/the-microsoft-sdl-process-template-making-secure-code-easier.aspx"&gt;blog de Brian Harry&lt;/a&gt; y en &lt;a target="_blank" href="http://blogs.msdn.com/sdl/archive/2009/05/19/making-secure-code-easier.aspx"&gt;el blog del equipo de SDL&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=149976" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b9O7QanCeLj9xfuoqkn1g9Fy8ow/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b9O7QanCeLj9xfuoqkn1g9Fy8ow/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/b9O7QanCeLj9xfuoqkn1g9Fy8ow/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b9O7QanCeLj9xfuoqkn1g9Fy8ow/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=1cyruI5uCZE:yZsNMXRXMmY: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=1cyruI5uCZE:yZsNMXRXMmY: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=1cyruI5uCZE:yZsNMXRXMmY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=1cyruI5uCZE:yZsNMXRXMmY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/1cyruI5uCZE" 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/Herramientas/default.aspx">Herramientas</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/Calidad/default.aspx">Calidad</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Seguridad/default.aspx">Seguridad</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/08/microsoft-sdl-process-template-la-seguridad-una-cuesti-243-n-de-proceso.aspx</feedburner:origLink></item><item><title>Modelos de salud: ¿Cúanto tarda una operación determinada de mi aplicación?</title><link>http://feedproxy.google.com/~r/mlbb/~3/oSTBC6O3UrA/modelos-de-salud-191-c-250-anto-tarda-una-operaci-243-n-determinada-de-mi-aplicaci-243-n.aspx</link><pubDate>Wed, 03 Jun 2009 05:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:149638</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>10</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=149638</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/06/03/modelos-de-salud-191-c-250-anto-tarda-una-operaci-243-n-determinada-de-mi-aplicaci-243-n.aspx#comments</comments><description>&lt;p&gt;Poder reponder esta simple pregunta cuando nuestra aplicaci&amp;oacute;n est&amp;aacute; en producci&amp;oacute;n nos puede dar un mot&amp;oacute;n de informaci&amp;oacute;n sobre la salud de la misma. Todo modelo de salud de una aplicaci&amp;oacute;n deber&amp;iacute;a darnos la respuesta a esta simple pregunta para las operaciones m&amp;aacute;s significativas que realiza la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Evidentemente, en situaciones donde hay problemas de rendimiento, siempre podr&amp;iacute;amos responder esta cuesti&amp;oacute;n utilizando un &amp;lsquo;profiler&amp;rsquo;. Pero esto es reactivo, ya hay problemas de rendimiento, y entonces actuamos. Sin duda no es lo m&amp;aacute;s eficiente, lo m&amp;aacute;s eficiente es actuar de manera proactiva, ser capaz de detectar que nuestra aplicaci&amp;oacute;n se est&amp;aacute; comportando de manera an&amp;oacute;mala en lo relativo a rendimiento y poder tener una pista clara de que partes de la misma est&amp;aacute;n fallando. Con un modelo de salud, parte esencial de toda arquitectura de aplicaciones moderna, podemos detectar estas situaciones. &lt;/p&gt;
&lt;p&gt;Una manera, a menudo muy adecuada, de plantear un modelo de salud, es seleccionar una serie de operaciones clave que nuestra aplicaci&amp;oacute;n realiza y publicar contadores de rendimiento que nos permitan monitorizar cuanto tiempo est&amp;aacute;n tardando en llevarse a cabo esas operaciones y sobre todo detectar desviaciones de los par&amp;aacute;metros normales de funcionamiento.&lt;/p&gt;
&lt;p&gt;Supongamos, por ejemplo, que en una aplicaci&amp;oacute;n de banca pudiesemos monitorizar el tiempo que tardan en realizarse las operaciones sobre cuentas. Tras poner la aplicaci&amp;oacute;n en producci&amp;oacute;n y hacer los ajustes necesarios, sabemos que la aplicaci&amp;oacute;n esta funcionando correctamente. Entonces establecemos una l&amp;iacute;nea base para el modelo de salud de nuestra aplicaci&amp;oacute;n: las transferencias duran X, los cargos Y, los abonos Z, etc&amp;hellip; A partir de este momento podemos detectar de manera temprana variaciones significativas en estos valores y por lo tanto detectar problemas de rendimiento en cuanto se producen, lo que nos da una oportunidad de actuar de manera temprana y que la calidad de servicio de nuestra aplicaci&amp;oacute;n no se vea resentida.&lt;/p&gt;
&lt;p&gt;Si quer&amp;eacute;is &lt;a target="_blank" href="http://channel9.msdn.com/posts/eliseta/Windows-Server-2008-para-Desarrolladores/"&gt;saber m&amp;aacute;s sobre modelos de salud&lt;/a&gt;, no os perd&amp;aacute;is la charla que mis compa&amp;ntilde;eros Iv&amp;aacute;n Gonz&amp;aacute;lez y Unai Zorrilla dieron en el lanzamiento de Visual Studio 2008 y que est&amp;aacute; publicada en Channel 9.&lt;/p&gt;
&lt;p&gt;Para poder actuar como he descrito, tenemos que saber como &lt;strong&gt;publicar mediante contadores de rendimiento lo que dura una operaci&amp;oacute;n de nuestra aplicaci&amp;oacute;n&lt;/strong&gt;. Para ello basta con utilizar el API de contadores de rendimento de .Net. En concreto el tipo de contador que utilizaremos en esta ocasi&amp;oacute;n es &lt;em&gt;&lt;span style="color:#2b91af;"&gt;PerformanceCounterType&lt;/span&gt;.AverageTimer32&lt;/em&gt; que siempre debe apoyarse en otro contador de tipo &lt;em&gt;&lt;span style="color:#2b91af;"&gt;PerformanceCounterType&lt;/span&gt;.AverageBase&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;El procedimiento es simple. Creamos una categor&amp;iacute;a de contadores y a&amp;ntilde;adimos a la misma los contadores en cuesti&amp;oacute;n. Cuando termina la operaci&amp;oacute;n que queremos medir, llamamos al m&amp;eacute;todo Increment del contador de tipo &lt;em&gt;&lt;span style="color:#2b91af;"&gt;PerformanceCounterType&lt;/span&gt;.AverageBase&lt;/em&gt; y, aqu&amp;iacute; es donde viene el truco del asunto, al m&amp;eacute;todo &lt;em&gt;IncrementBy&lt;/em&gt; del contador de tipo &lt;em&gt;AverageTimer32&lt;/em&gt;, pas&amp;aacute;ndole el tiempo empleado por la operaci&amp;oacute;n en &amp;lsquo;ticks&amp;rsquo;. La manera m&amp;aacute;s l&amp;oacute;gica de obtener este tiempo es utilizar un objeto &lt;span style="color:#2b91af;"&gt;&lt;em&gt;Stopwatch&lt;/em&gt;&lt;span style="color:#000000;"&gt; en concreto la propiedad &lt;em&gt;ElapsedTicks&lt;/em&gt;. Destacar que aunque el contador espera &amp;lsquo;ticks&amp;rsquo; cuando lo recogarmos desde el monitor de rendimiento, nos informa del valor en milisegundos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n pod&amp;eacute;is ver un ejemplo:&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;using&lt;/span&gt; System;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Diagnostics;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Threading;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; OperationTimePerformanceCounterSample&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Diagnostics;&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; &lt;span style="color:blue;"&gt;namespace&lt;/span&gt; OperationTimePerformanceCounterSample&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;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OperationTimePerformaceCounter&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Stopwatch&lt;/span&gt; _sw = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Stopwatch&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;PerformanceCounter&lt;/span&gt; _pc;&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;PerformanceCounter&lt;/span&gt; _pcBase;&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:blue;"&gt;public&lt;/span&gt; OperationTimePerformaceCounter(&lt;span style="color:blue;"&gt;string&lt;/span&gt; categoryName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterBaseName)&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;/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; _pc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PerformanceCounter&lt;/span&gt;(categoryName, counterName, &lt;span style="color:blue;"&gt;false&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; _pcBase = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PerformanceCounter&lt;/span&gt;(categoryName, counterBaseName, &lt;span style="color:blue;"&gt;false&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;/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:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Start()&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;/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; _sw.Start();&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;/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:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Finish()&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;/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; _sw.Stop();&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; _pc.IncrementBy(_sw.ElapsedTicks);&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; _pcBase.Increment();&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;/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;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&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;Program&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:green;"&gt;//Constantes con los nombre de los contadores y categorias&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; categoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;Operation Time Performace Counter Category&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; categoryHelp = &lt;span style="color:#a31515;"&gt;&amp;quot;Demonstrates usage of the AverageTimer32 performance counter type.&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterTimerName = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Average Time Counter&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterTimerHelp = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Average Time Counter&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterBaseName = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Base Counter&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;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterBaseHelp = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Base Counter&amp;quot;&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;&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;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&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;//Controlamos el Control + C para para la aplicaci&amp;oacute;n&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;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Pulse Control + C para terminar...&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.CancelKeyPress += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConsoleCancelEventHandler&lt;/span&gt;(Console_CancelKeyPress);&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;//Eliminamos la catergia de contadores si ya existe&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; (&lt;span style="color:#2b91af;"&gt;PerformanceCounterCategory&lt;/span&gt;.Exists(categoryName))&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; &lt;span style="color:#2b91af;"&gt;PerformanceCounterCategory&lt;/span&gt;.Delete(categoryName);&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;//Creamos los contadores necesarios&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;//Necesitamos dos contadores, aunque solo se publican como uno solo&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;//Uno actua de base y el otro recoge las medidas&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;CounterCreationDataCollection&lt;/span&gt; counters = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CounterCreationDataCollection&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;CounterCreationData&lt;/span&gt; counterTimer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CounterCreationData&lt;/span&gt;(counterTimerName, counterTimerHelp, &lt;span style="color:#2b91af;"&gt;PerformanceCounterType&lt;/span&gt;.AverageTimer32);&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; counters.Add(counterTimer);&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:#2b91af;"&gt;CounterCreationData&lt;/span&gt; counterBase = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CounterCreationData&lt;/span&gt;(counterBaseName, counterBaseHelp, &lt;span style="color:#2b91af;"&gt;PerformanceCounterType&lt;/span&gt;.AverageBase);&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; counters.Add(counterBase);&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;//Creamos la categoria y a&amp;ntilde;adimos los contadores&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;PerformanceCounterCategory&lt;/span&gt;.Create(&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; categoryName,&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; categoryHelp,&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; &lt;span style="color:#2b91af;"&gt;PerformanceCounterCategoryType&lt;/span&gt;.SingleInstance, counters);&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;//Simulamos una operaci&amp;oacute;n&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;while&lt;/span&gt; (&lt;span style="color:blue;"&gt;true&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;/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; &lt;span style="color:green;"&gt;//La clase OperationTimePerformaceCounter encapsula la medici&amp;oacute;n&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; &lt;span style="color:green;"&gt;//de tiempo&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; &lt;span style="color:#2b91af;"&gt;OperationTimePerformaceCounter&lt;/span&gt; pc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OperationTimePerformaceCounter&lt;/span&gt;(categoryName, counterTimerName, counterBaseName);&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; pc.Start();&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; SimulateWork(); &lt;span style="color:green;"&gt;//Simulamos trabajo&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; pc.Finish();&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;/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;/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;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Console_CancelKeyPress(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;ConsoleCancelEventArgs&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:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;PerformanceCounterCategory&lt;/span&gt;.Exists(categoryName))&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; &lt;span style="color:#2b91af;"&gt;PerformanceCounterCategory&lt;/span&gt;.Delete(categoryName);&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SimulateWork()&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;Random&lt;/span&gt; rnd = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Random&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;Thread&lt;/span&gt;.Sleep(rnd.Next(0, 5000));&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;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;El c&amp;oacute;digo de la clase &lt;span style="color:#2b91af;"&gt;OperationTimePerformaceCounter&lt;/span&gt; que encapsula la medici&amp;oacute;n del tiempo y la actualizaci&amp;oacute;n de los contadores es el siguiente:&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;using&lt;/span&gt; System.Diagnostics;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; OperationTimePerformanceCounterSample&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&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;OperationTimePerformaceCounter&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:green;"&gt;//Objeto Stopwatch para medir la duraci&amp;oacute;n de la aplicaci&amp;oacute;n&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;span style="color:#2b91af;"&gt;Stopwatch&lt;/span&gt; _sw = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Stopwatch&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;span style="color:green;"&gt;//Contadores de rendimiento&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;span style="color:#2b91af;"&gt;PerformanceCounter&lt;/span&gt; _pc;&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:#2b91af;"&gt;PerformanceCounter&lt;/span&gt; _pcBase;&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; OperationTimePerformaceCounter(&lt;span style="color:blue;"&gt;string&lt;/span&gt; categoryName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; counterBaseName)&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;//Abrimos los contadores&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; _pc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PerformanceCounter&lt;/span&gt;(categoryName, counterName, &lt;span style="color:blue;"&gt;false&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; _pcBase = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PerformanceCounter&lt;/span&gt;(categoryName, counterBaseName, &lt;span style="color:blue;"&gt;false&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;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&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;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; M&amp;eacute;todo que llamamos cuando comienza la operaci&amp;oacute;n&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;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&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;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Start()&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; _sw.Start(); &lt;span style="color:green;"&gt;//Inciamos el cron&amp;oacute;metro&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;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&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;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; M&amp;eacute;todo que llamamos cuando termina la operaci&amp;oacute;n&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;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&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;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Finish()&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; _sw.Stop(); &lt;span style="color:green;"&gt;//Paramos el cron&amp;oacute;metro&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;//Actualizamos los contadores&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; _pc.IncrementBy(_sw.ElapsedTicks);&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; _pcBase.Increment();&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;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Si ejecutamos el c&amp;oacute;digo (que puedes encontrar como adjunto a esto post) el resultado ser&amp;aacute; el siguiente, visto con el monitor de rendimiento de Windows:&lt;/p&gt;
&lt;p&gt;&lt;img height="448" width="936" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/image_5F00_6A202A6F.png" alt="Tiempo de operaci&amp;oacute;n en el monitor de rendimiento" border="0" title="Tiempo de operaci&amp;oacute;n en el monitor de rendimiento" style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" /&gt; &lt;/p&gt;
&lt;p&gt;Espero que os sea &amp;uacute;til e incorpor&amp;eacute;is este tipo de contadores a los modelos de salud de vuestras arquitecturas.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=149638" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RKnM5pIvWpHL7Zxta5H1Lrza2KQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKnM5pIvWpHL7Zxta5H1Lrza2KQ/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/RKnM5pIvWpHL7Zxta5H1Lrza2KQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKnM5pIvWpHL7Zxta5H1Lrza2KQ/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=oSTBC6O3UrA:tGDDREJKk48: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=oSTBC6O3UrA:tGDDREJKk48: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=oSTBC6O3UrA:tGDDREJKk48:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=oSTBC6O3UrA:tGDDREJKk48:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/oSTBC6O3UrA" 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/.Net/default.aspx">.Net</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Optimizaci_26002300_243_3B00_n/default.aspx">Optimizaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Depuraci_26002300_243_3B00_n/default.aspx">Depuraci&amp;#243;n</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/06/03/modelos-de-salud-191-c-250-anto-tarda-una-operaci-243-n-determinada-de-mi-aplicaci-243-n.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/mlbb/~5/3rHtruJqUx0/OperationTimePerformanceCounterSample.rar" length="7658" type="application/octet-stream" /><feedburner:origEnclosureLink>http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.14.96.38/OperationTimePerformanceCounterSample.rar</feedburner:origEnclosureLink></item><item><title>Evento: XXIII Foro de Arquitectos – Novedades en la gestión de proyectos en Team System 2010</title><link>http://feedproxy.google.com/~r/mlbb/~3/_OemtaIWoHA/evento-xxiii-foro-de-arquitectos-novedades-en-la-gesti-243-n-de-proyectos-en-team-system-2010.aspx</link><pubDate>Mon, 01 Jun 2009 05:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:149622</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=149622</wfw:comment><comments>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#comments</comments><description>&lt;p&gt;El pasado jueves estuve en el XXIII Foro de Arquitectos de Microsoft, hablando sobre las novedades en la gestión de proyectos en Team System 2010, estas novedades se pueden resumir en que todo lo relacionado con la gestión de proyectos pasa a ser mucho más ágil, tanto la propía metodología MSF, que se parece mucho a Scrum sin peder sus señas de identidad tradicionales (fuerte énfasis en la calidad y gestión explicita del riesgo), como el propio entorno, que es mucho más usable y amigable en lo relativo al trabajo con ‘work item’, informes, etc... Además se han añadido nuevas herramientas, apoyas en Excel, que facilitan muchísimo la planificiación de las iteraciones.&lt;/p&gt;  &lt;p&gt;Los que viváis en Barcelona o alrededores, y seáis arquitectos, el próximo 16 de Junio podréis ver esta presatación en directo, junto otro puñado de presentaciones sumamente interesantes en el &lt;a href="http://www.microsoft.com/spain/eventos/eventdetail.aspx?EventID=1032417706" target="_blank"&gt;Foro de Arquitectos que Microsoft llevará a cabo en esta ciudad&lt;/a&gt;. ¡No os lo perdáis!.&lt;/p&gt;  &lt;p&gt;Os dejo la presentación que hice donde podéis ver pantallazos de todos estos temas. Podéis descargarla desde el menú.&lt;/p&gt; &lt;object style="margin:0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=xxiiiforodearquitectos-novedadesenlagestindeproyectos-090530042340-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=novedades-en-la-gestin-de-proyectos-en-vs2010" /&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=xxiiiforodearquitectos-novedadesenlagestindeproyectos-090530042340-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=novedades-en-la-gestin-de-proyectos-en-vs2010" type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;¿Qué os parecen estas novedades?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=149622" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tweHBUWSCVAYZ1XclTCXFOxJkeA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tweHBUWSCVAYZ1XclTCXFOxJkeA/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/tweHBUWSCVAYZ1XclTCXFOxJkeA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tweHBUWSCVAYZ1XclTCXFOxJkeA/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=_OemtaIWoHA:eitUiStacxQ: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=_OemtaIWoHA:eitUiStacxQ: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=_OemtaIWoHA:eitUiStacxQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=_OemtaIWoHA:eitUiStacxQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/_OemtaIWoHA" 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/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/Visual+Studio/default.aspx">Visual Studio</category><feedburner:origLink>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</feedburner:origLink></item><item><title>¡No te olvides de las pruebas unitarias! Sobre todo si tu jefe es un tirano…</title><link>http://feedproxy.google.com/~r/mlbb/~3/kGXgg3CJQPE/161-no-te-olvides-de-las-pruebas-unitarias-sobre-todo-si-tu-jefe-es-un-tirano.aspx</link><pubDate>Sat, 30 May 2009 08:38:22 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:149620</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>2</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=149620</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/05/30/161-no-te-olvides-de-las-pruebas-unitarias-sobre-todo-si-tu-jefe-es-un-tirano.aspx#comments</comments><description>&lt;p&gt;Un divertido video en el que un jefe de proyecto no precisamente razonable se toma bastante mal que su equipo ‘pase’ de las pruebas unitarias… Los subtitulos están en inglés, pero se entiende…&lt;/p&gt;  &lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/l1wKO3rID9g&amp;amp;hl=es&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/l1wKO3rID9g&amp;amp;hl=es&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Estoy por subcontratarle solo para las broncas… jejejeje…&lt;/p&gt;  &lt;p&gt;Por cierto para darle un toque de seriedad a post, os recomiendo que &lt;a href="http://geeks.ms/blogs/ilanda/archive/2009/05/27/evento-secondnug-calidad-y-productividad-con-pruebas-unitarias.aspx" target="_blank"&gt;no os perdáis la charla de Ibon Landa en Second Nug sobre pruebas unitarias&lt;/a&gt;, he hablado con gente que la ha visto presencialmente en Santander y me han hablado muy bien. Y pensar que no inicializaba los punteros cuando llego a Panda a currar conmigo… ;P&lt;/p&gt;  &lt;p&gt;¡Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=149620" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YBjQWEsS_Cqe--hkf1WvlgCuNTQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YBjQWEsS_Cqe--hkf1WvlgCuNTQ/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/YBjQWEsS_Cqe--hkf1WvlgCuNTQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YBjQWEsS_Cqe--hkf1WvlgCuNTQ/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=kGXgg3CJQPE:OGNDT9YApw8: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=kGXgg3CJQPE:OGNDT9YApw8: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=kGXgg3CJQPE:OGNDT9YApw8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=kGXgg3CJQPE:OGNDT9YApw8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/kGXgg3CJQPE" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Humor/default.aspx">Humor</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/05/30/161-no-te-olvides-de-las-pruebas-unitarias-sobre-todo-si-tu-jefe-es-un-tirano.aspx</feedburner:origLink></item><item><title>Subcripciones a eventos de Team Foundation Server con facilidad</title><link>http://feedproxy.google.com/~r/mlbb/~3/6VdPhto2HJ4/subcripciones-a-eventos-de-team-foundation-server-con-facilidad.aspx</link><pubDate>Wed, 20 May 2009 22:03:01 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148994</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=148994</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/05/21/subcripciones-a-eventos-de-team-foundation-server-con-facilidad.aspx#comments</comments><description>&lt;p&gt;Una de las múltiples vías que tenemos para extender e integrar nuestro TFS con otras aplicaciones existentes en nuestra organización es poner un servicio web a escuchar los eventos que se producen en nuestro TFS. Podemos escuchar eventos relacionados con ‘work items’, el gestor de fuentes o el servicio de builds. Básicamente lo que tenemos que hacer es crear un servicio que exponga un método con la siguiente firma:&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;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;SoapDocumentMethod&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify&amp;quot;&lt;/span&gt;, RequestNamespace = &lt;span style="color:#a31515;"&gt;&amp;quot;http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03&amp;quot;&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Notify(&lt;span style="color:blue;"&gt;string&lt;/span&gt; eventXml, &lt;span style="color:blue;"&gt;string&lt;/span&gt; tfsIdentityXml)&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Luego registraremos la url en la que el servicio escucha las notificaciones de TFS utilzando el clásico BisSuscribe.exe o, para aquellos que le tengan más miedo a la línea de comandos, usando &lt;a href="http://www.codeplex.com/tfseventsubscription" target="_blank"&gt;Team Fondation Event Subscription Tool&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Nada que no podáis leer en cientos de sitios… la película se complica cuando, una vez subscrito el servicio, tenemos que acceder a la información sobre el evento que se a producido, que recibimos en ¡un string que contiene xml!. Pues bien, la buena noticia es que los esquemas de los eventos son públicos (se pueden encontrar en el directorio Web Services\Services\v1.0\Transforms dentro del directorio de instalación de nuestro TFS (tìpicamente C:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\). Así podemos usar &lt;a href="http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx" target="_blank"&gt;XSD.exe&lt;/a&gt; para crear una clase a partir del esquema, esta clase nos permitirá deserializar un objeto a partir del string XML que recibimos en los parámetros eventXml y&amp;#160; tfsIdentityXml…&lt;/p&gt;  &lt;p&gt;Vamos que es un proceso factible pero tedioso. Menos mal que Howard van Ronijen se ha molestado en crear una plantilla de proyecto que nos facilita la labor. Podéis &lt;a href="http://howardvanrooijen.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25327" target="_blank"&gt;descargarla desde su sitio en Codeplex&lt;/a&gt;.&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="TFS Notification Web Service Project Template" border="0" alt="TFS Notification Web Service Project Template" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/TFSNotificationWebServiceProjectTemplate_5F00_3CCA2684.png" width="631" height="460" /&gt;&lt;/p&gt;  &lt;p&gt;Una vez instalada esta plantilla en nuestro Visual Studio, podemos crear el esqueleto de un nuevo proyecto orientado a consumir los diferentes eventos que TFS expone y además ¡se a molestado en crear las clases para deserializar el XML de notificación de todos las posibles notificaciones! Así es facilísimo interpretar la información que TFS nos envia en la notificación del evento, tal y como podéis ver en el siguiente ejemplo:&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;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;SoapDocumentMethod&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify&amp;quot;&lt;/span&gt;, RequestNamespace = &lt;span style="color:#a31515;"&gt;&amp;quot;http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03&amp;quot;&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Notify(&lt;span style="color:blue;"&gt;string&lt;/span&gt; eventXml, &lt;span style="color:blue;"&gt;string&lt;/span&gt; tfsIdentityXml)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;BuildCompletionEvent&lt;/span&gt; buildCompletionEvent = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.CreateInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;BuildCompletionEvent&lt;/span&gt;&amp;gt;(eventXml);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;TFSIdentity&lt;/span&gt; tfsIdentity = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.CreateInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;TFSIdentity&lt;/span&gt;&amp;gt;(tfsIdentityXml);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Por ejemplo para el evento generado cuando se completa una build contariamos con las siguientes clases para manejar la información recibida como string XML en los parámetros de evento:&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="TFS Event ClassDiagram" border="0" alt="TFS Event ClassDiagram" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/TFSEventClassDiagram_5F00_5AD44646.png" width="427" height="408" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Vamos, que no puede ser más simple consumir eventos de TFS. Lo que hagáis con ellos, queda a vuestra imaginación.&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=148994" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i87Zlrl-Rd0lf1GkDpjNndfEZbE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i87Zlrl-Rd0lf1GkDpjNndfEZbE/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/i87Zlrl-Rd0lf1GkDpjNndfEZbE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i87Zlrl-Rd0lf1GkDpjNndfEZbE/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=6VdPhto2HJ4:cjtHevQJxMc: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=6VdPhto2HJ4:cjtHevQJxMc: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=6VdPhto2HJ4:cjtHevQJxMc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=6VdPhto2HJ4:cjtHevQJxMc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/6VdPhto2HJ4" 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/Herramientas/default.aspx">Herramientas</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/05/21/subcripciones-a-eventos-de-team-foundation-server-con-facilidad.aspx</feedburner:origLink></item><item><title>Presentación: Almacenamiento de datos en la nube</title><link>http://feedproxy.google.com/~r/mlbb/~3/aKYSMaBxzWU/presentaci-243-n-almacenamiento-de-datos-en-la-nube.aspx</link><pubDate>Sun, 17 May 2009 18:48:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148781</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=148781</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/05/17/presentaci-243-n-almacenamiento-de-datos-en-la-nube.aspx#comments</comments><description>&lt;p&gt;El pasado día 16 de Abril participe en un evento para ISVs dentro del programa Metro de Microsoft. El programa Metro es un programa de apoyo a la adopción de nuevas tecnologías de Microsoft por parte de ISVs.&lt;/p&gt;  &lt;p&gt;En este evento hablé sobre las posibilidades que la plataforma en la nube de Microsoft plantea a la hora de almacenar datos. Especial interés despertaron los &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/04/04/sql-server-data-services-cambio-radical-en-azure.aspx" target="_blank"&gt;recientes cambios en Sql Server Data Services&lt;/a&gt; y se plantearon bastantes preguntas sobre las diferentes opciones con las que contamos y cuando es mejor utilizar una u otra. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/AzureMetroTrainingDatosenlanube_5F00_5422D446.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" title="Azure Metro Training - Datos en la nube" border="0" alt="Azure Metro Training - Datos en la nube" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/AzureMetroTrainingDatosenlanube_5F00_thumb_5F00_71A48978.jpg" width="501" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Os dejo la &lt;a href="http://geeks.ms/media/p/148780/download.aspx" target="_blank"&gt;presentación que utilicé durante el evento&lt;/a&gt; por si es de utilidad.&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=148781" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/e42WnC2tCl1ys0uuUCvROHqhiuE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e42WnC2tCl1ys0uuUCvROHqhiuE/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/e42WnC2tCl1ys0uuUCvROHqhiuE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e42WnC2tCl1ys0uuUCvROHqhiuE/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=aKYSMaBxzWU:LBRDgybpz34: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=aKYSMaBxzWU:LBRDgybpz34: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=aKYSMaBxzWU:LBRDgybpz34:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=aKYSMaBxzWU:LBRDgybpz34:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/aKYSMaBxzWU" 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/Azure/default.aspx">Azure</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/05/17/presentaci-243-n-almacenamiento-de-datos-en-la-nube.aspx</feedburner:origLink></item><item><title>Evento: Fin de gira ALM’08 de Plain Concepts…</title><link>http://feedproxy.google.com/~r/mlbb/~3/XZVN-qsexcE/evento-fin-de-gira-alm-08-de-plain-concepts.aspx</link><pubDate>Mon, 20 Apr 2009 21:34:14 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:147118</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>3</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=147118</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/04/20/evento-fin-de-gira-alm-08-de-plain-concepts.aspx#comments</comments><description>&lt;p&gt;… al menos de momento.&lt;/p&gt; Por fin llego el final de la función, por esta noche…  &lt;br /&gt;es otro día más que va sellando tu destino…  &lt;p&gt;Como dice la versión de MCD de My way, titulada &lt;a href="http://open.spotify.com/track/0MWcgU61dNXl5tYUt8vZ7p"&gt;Entre borrachos&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Hace unos meses os contaba que mi compañero &lt;a href="http://geeks.ms/blogs/jlsoria" target="_blank"&gt;Jose Luis Soria&lt;/a&gt; y un servidor nos ibamos a ‘currar’ un &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/01/15/m-225-s-eventos-agilidad-y-team-system-en-bilbao-santiago-valencia-y-zaragoza.aspx" target="_blank"&gt;buen puñado de eventos&lt;/a&gt;. Hemos visitado Bilbao, Santiago, Valencia y Zaragoza, con exito de público y espero que de crítica.&lt;/p&gt;  &lt;p&gt;Toca cerrar la gira con un evento en Madrid, y tan magna ocasión merece un evento a la altura, así que este jueves, 23 de Abril, estaremos en las instalaciones de Microsoft España con un evento de todo el día. Vamos a hablar de metodologías ágiles y Team System (como a lo largo de toda la gira) y además, de calidad del software con Team System. &lt;/p&gt;  &lt;p&gt;La agenda será la siguiente (si os parece interesate, podéis inscribiros &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408325&amp;amp;Culture=es-ES"&gt;aquí&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;Sesión: Metodologías ágiles y Team System en el mundo real&lt;/p&gt;  &lt;p&gt;Cada vez más empresas necesitan encontrar el equilibrio entre control de los proyectos y productividad de sus equipos de desarrollo, las metodologías ágiles proponen un marco de trabajo que nos permite gestionar los proyectos y mejorar la productividad de nuestros equipos de desarrollo sin caer en la temida burocracia. Team System es un marco de trabajo ideal que proporciona de manera integrada todas las herramientas que un equipo ágil puede necesitar. En este evento veremos cómo un equipo de desarrollo puede usar metodologías ágiles junto a Team System para dar un salto importante en su productividad. &lt;/p&gt;  &lt;p&gt;Agenda: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;09:00&amp;#160;&amp;#160;&amp;#160; Registro y bienvenida       &lt;br /&gt;09:30&amp;#160;&amp;#160;&amp;#160; Metodologías ágiles ¿qué son? ¿cómo nos ayudan?         &lt;br /&gt;10:00&amp;#160;&amp;#160;&amp;#160; Introducción a MSF Agile         &lt;br /&gt;10:45&amp;#160;&amp;#160;&amp;#160; Introducción a Scrum         &lt;br /&gt;11:00&amp;#160;&amp;#160;&amp;#160; Café        &lt;br /&gt;11:30&amp;#160;&amp;#160;&amp;#160; Scrum y Team System en el mundo real         &lt;br /&gt;12:00&amp;#160;&amp;#160;&amp;#160; Team System: la herramienta perfecta para el desarrollo ágil         &lt;br /&gt;13:30&amp;#160;&amp;#160;&amp;#160; Comida&lt;/em&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sesión: Calidad del software con Team System&lt;/p&gt;  &lt;p&gt;La manera más rápida de desarrollador software es hacerlo con la calidad requerida desde el principio. Team System propone la calidad del software como pieza central del desarrollo de software moderno. Team System proporciona una serie de herramientas que facilitan enormemente que los desarrolladores y los testers hagan de las actividades orientadas a asegurar y mantener la calidad durante todo el ciclo de desarrollo. En este evento veremos cuáles son estas herramientas, cómo se pueden utilizar en nuestros proyectos y qué ventajas obtendremos de su uso. &lt;/p&gt;  &lt;p&gt;Agenda: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;14:30&amp;#160;&amp;#160;&amp;#160; Testeo unitario        &lt;br /&gt;15:00&amp;#160;&amp;#160;&amp;#160; Pruebas web&amp;#160; y de carga         &lt;br /&gt;15:45&amp;#160;&amp;#160;&amp;#160; Optimización y monitorización del rendimiento de aplicaciones durante el desarrollo         &lt;br /&gt;16:15&amp;#160;&amp;#160;&amp;#160; Refrescos         &lt;br /&gt;16:45&amp;#160;&amp;#160;&amp;#160; Test de aceptación         &lt;br /&gt;17:15&amp;#160;&amp;#160;&amp;#160; Integración de la calidad en el proceso de desarrollo: métricas de calidad        &lt;br /&gt;19:00&amp;#160;&amp;#160;&amp;#160; Fin del evento&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;El año pasado ya hicimos un evento muy similar a este, solo que en esa ocasión me acompaño &lt;a href="http://geeks.ms/blogs/palvarez" target="_blank"&gt;Pablo Alvarez Doval&lt;/a&gt;. Si queréis ver las presentaciones de aquella ocasión, muy similares a las que utilizaremos, las podéis &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/07/05/presentaciones-del-evento-sobre-metodolog-237-as-225-giles-y-calidad-del-software-con-team-system.aspx" target="_blank"&gt;descargar&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;¡Espero veros en el evento!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=147118" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/brN1foRG5_QcBuoTx3roQP7Q7g8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/brN1foRG5_QcBuoTx3roQP7Q7g8/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/brN1foRG5_QcBuoTx3roQP7Q7g8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/brN1foRG5_QcBuoTx3roQP7Q7g8/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=XZVN-qsexcE:zubhrp-uOqg: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=XZVN-qsexcE:zubhrp-uOqg: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=XZVN-qsexcE:zubhrp-uOqg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=XZVN-qsexcE:zubhrp-uOqg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/XZVN-qsexcE" 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/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/04/20/evento-fin-de-gira-alm-08-de-plain-concepts.aspx</feedburner:origLink></item><item><title>SQL Server Data Services: Cambio radical en Azure</title><link>http://feedproxy.google.com/~r/mlbb/~3/89sYWC4e5C8/sql-server-data-services-cambio-radical-en-azure.aspx</link><pubDate>Sat, 04 Apr 2009 20:23:46 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:146236</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>0</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=146236</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/04/04/sql-server-data-services-cambio-radical-en-azure.aspx#comments</comments><description>&lt;p&gt;Que cosas tienen las tecnologías beta, oiga. De repente, de un plumazo todas las presentaciones, videos, hols, demos y demás sobre SDS resultan obsoletas, así de un plumazo. Incluido el material que yo estaba preparando para el próximo Foro de Arquitectos de Microsoft. Pero bueno, que le vamos a hacer, ya sabíamos a que nos exponíamos.&lt;/p&gt;  &lt;p&gt;Seguro que más de uno estáis pensando ¿pero de que habla este tío? Pues hablo de que Microsoft ha decidido cepillarse de un plumazo el modelo ACE (authorities, containers, y entities) de SDS y pasar a soportar un modelo plenamente basado en TDS (el protocolo de comunicación entre cliente y servidor de SQL Server). A pesar de que me han reventado la presentación, creo que este cambio es una excelente noticia y una gran decisión.&lt;/p&gt;  &lt;p&gt;Vamos a poder usar todas las características de SQL Server que usamos en el día a día: tablas, tipos de datos, procedimientos almacenados, triggers, índices, ADO.Net, Entity Framework… al menos en teoría, pues aun no se sabe que carácteristicas de SQL Server y del protocolo TDS se soportarán en una primera hornada. Sin duda este cambion también va a acercar otras tecnologías relacionadas con SQL Server más a la nube, como por ejemplo Reporting Services.&lt;/p&gt;  &lt;p&gt;Poner nuestros datos en la nube va a ser mucho más sencillo. Será una decisión de despliegue y no una decisión de diseño. Podremos llevar nuestras bases de datos a la nube y que las aplicaciones clientes ni se enteren. Cualquier aplicación existente actualmente podrá subirse a la nube con muchísima más facilidad y sin necesidad de&amp;#160; cambios profundos en su arquitectura.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="SDS y TDS" border="0" alt="SDS y TDS" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/SDSyTDS_5F00_08D326A6.gif" width="432" height="302" /&gt;&lt;/p&gt;  &lt;p&gt;Además no vamos a perder lo que la nube ofrece: alta disponibilidad, tolerancia a fallos, escalabilidad infinita… la arquitectura subyacente de SDS no cambia, es la que ya conocemos. Lo que van a hacer es poner sobre esta arquitectura una capa que entienda el protocolo TDS.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Arquitectura SDS y TDS" border="0" alt="Arquitectura SDS y TDS" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/ArquitecturaSDSyTDS_5F00_1A631171.gif" width="361" height="425" /&gt;&lt;/p&gt;  &lt;p&gt;Por el lado de la seguridad, comunicación sobre SSL y autenticación de SQL Server.&lt;/p&gt;  &lt;p&gt;En cuanto al soporte REST/HTTP la respuesta es clara: ADO.Net Data Services.&lt;/p&gt;  &lt;p&gt;Podríamos pensar, que semejante cambio estratégico se habría anunciado en un PDC, o en el reciente MIX o en un TechEd al menos… pues no. El anuncio se ha hecho &amp;#39;a la chita callando&amp;#39; un &lt;a href="http://blogs.msdn.com/ssds/archive/2009/03/10/9469228.aspx" target="_blank"&gt;post en el blog del equipo de SDS&lt;/a&gt; y una entrada nueva en la MSDN, que describe someramente el nuevo &lt;a href="http://msdn.microsoft.com/en-us/library/dd557595.aspx" target="_blank"&gt;SQL Data Services RDBMS Model&lt;/a&gt; . &lt;/p&gt;  &lt;p&gt;Para los ansiosos (¡&lt;a href="http://geeks.ms/blogs/unai" target="_blank"&gt;Unai&lt;/a&gt; quieto!), decir que hasta que no haya una nueva CTP del SDK de SDS, no podremos disfrutar de lo que va a ser la primera base de datos genuinamente relacional en la nube. Decir que me parece un excelente movimiento por parte de Microsoft: las ventajas de la nube sin tener que aprender un nuevo modelo de almacenamiento.&lt;/p&gt;  &lt;p&gt;Además para los nostálgicos de el modelo ACE, siempre quedará &lt;a href="http://msdn.microsoft.com/en-us/library/dd179355.aspx" target="_blank"&gt;Azure Storage Services&lt;/a&gt;, cuyo Table Storage API es muy similar a lo que ofrece el modelo ACE.&lt;/p&gt;  &lt;p&gt;Por último como curiosidad decir que TDS es una &lt;a href="http://msdn.microsoft.com/en-us/library/cc448435.aspx" target="_blank"&gt;especificación abierta&lt;/a&gt;, liberada como parte de la &lt;a title="Microsoft Open Specification Promise" href="http://en.wikipedia.org/wiki/Microsoft_Open_Specification_Promise"&gt;Microsoft Open Specification Promise&lt;/a&gt;, que originalmente nació para Sybase. Podéis ver la especificación de TDS, y además existen implementaciones de &lt;a href="http://www.freetds.org/" target="_blank"&gt;TDS para entornos Linux/Unix&lt;/a&gt; y para &lt;a href="http://jtds.sourceforge.net/" target="_blank"&gt;Java&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=146236" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-dlPa-KmvIZySkaAj0Pix7EnMlc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-dlPa-KmvIZySkaAj0Pix7EnMlc/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/-dlPa-KmvIZySkaAj0Pix7EnMlc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-dlPa-KmvIZySkaAj0Pix7EnMlc/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=89sYWC4e5C8:dQdYcyvbwis: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=89sYWC4e5C8:dQdYcyvbwis: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=89sYWC4e5C8:dQdYcyvbwis:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=89sYWC4e5C8:dQdYcyvbwis:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/89sYWC4e5C8" 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/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Azure/default.aspx">Azure</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/SQL+Server+Data+Services/default.aspx">SQL Server Data Services</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/04/04/sql-server-data-services-cambio-radical-en-azure.aspx</feedburner:origLink></item><item><title>Geeks.ms: Pa’ habernos matao…</title><link>http://feedproxy.google.com/~r/mlbb/~3/b6JDXKvzkQo/geeks-ms-pa-habernos-matao.aspx</link><pubDate>Fri, 03 Apr 2009 21:50:44 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:146180</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>9</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=146180</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/04/03/geeks-ms-pa-habernos-matao.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px 10px;display:inline;border-top:0px;border-right:0px;" title="Peligro de caidas" border="0" alt="Peligro de caidas" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Peligrodecaidas_5F00_5AC90928.jpg" width="246" height="350" /&gt;Debido a un fallo en un disco, Geeks.ms ha estado caído todo el día de hoy. No es la primera vez que Geeks.ms se cae, la &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/09/15/geeks-ms-caido.aspx"&gt;otra fue por culpa de un huracán&lt;/a&gt;. Lo peor&amp;#160; a sido el susto que se ha llevado el pobre &lt;a href="http://geeks.ms/blogs/dcarmona/"&gt;David Carmona&lt;/a&gt;, que tras instalar un parche y reiniciar el servidor, vio que este no volvía a la vida. David, tranquilo, que no has sido el culpable, te has llevado el susto pero no has sido el culpable, jejejej...&lt;/p&gt;  &lt;p&gt;Si escribo este post es más que nada para tranquilizar a todo el mundo que tiene contenidos en Geeks.ms. Os voy a contar como está protegido el servidor:&lt;/p&gt;  &lt;p&gt;El servidor cuenta con dos discos en RAID 1, esto es lo que nos ha salvado hoy el culo. El problema se ha solucionado cuando la gente del hosting, se ha levantado de la cama y ha reiniciado el servidor desde el disco espejo. Si hemos tenido tanto ‘donwtime’ ha sido por la diferencia horaria, el hosting está en la costa oeste de los estados unidos y por querer diagnosticar cuidadosamente la situación para evitar la pérdida de datos.&lt;/p&gt;  &lt;p&gt;Además de la protección por RAID, en caso de un desastre mayor, contamos con una política de copias de seguridad. Todos los sábados por la noche, en el momento de menos actividad se hace una copia de seguridad completa del contenido relevante del servidor y de la base de datos de Geeks.ms. Además, se hacen copias de seguridad incrementales cada seis horas. Esto nos protege de errores lógicos o ataques que puedan dañar el contenido de Geeks.ms&lt;/p&gt;  &lt;p&gt;Por si esto fuese poco, estas copias de seguridad se mueven fuera del servidor, a un NAS de almacenamiento, semanalmente. Esto nos asegura que en caso de destrucción total del servidor aun tendríamos copias de seguridad.&lt;/p&gt;  &lt;p&gt;Cada cierto tiempo, aproximadamente dos semanas, compruebo personalmente que la última copia de seguridad realizada es recuperable. Para ello levanto desde cero un sitio llamado beta.geeks.ms, que también uso cuando hago adaptaciones de Community Server. Puesto que el NAS y el servidor están en el mismo ‘data center’, además la copia de seguridad verificada se mueve desde el NAS a un servidor de Plain Concepts. En caso de desastre total en el ‘data center’ siempre quedaría la copia verificada almacenada en un servidor de Plain Concepts.&lt;/p&gt;  &lt;p&gt;Así que si alguien a sufrido por su contenido durante las últimas, croe que puede estar razonablemente tranquilo. Evidentemente la seguridad absoluta no existe, pero creo que podemos dormir tranquilos.&lt;/p&gt;  &lt;p&gt;¡Un saludo y gracias a todos, autores y lectores, por vuestra paciencia!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=146180" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sBtUPjvLsHTQIH50jqBM1kUjUpM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sBtUPjvLsHTQIH50jqBM1kUjUpM/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/sBtUPjvLsHTQIH50jqBM1kUjUpM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sBtUPjvLsHTQIH50jqBM1kUjUpM/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=b6JDXKvzkQo:nZjXQLdt0Ec: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=b6JDXKvzkQo:nZjXQLdt0Ec: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=b6JDXKvzkQo:nZjXQLdt0Ec:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=b6JDXKvzkQo:nZjXQLdt0Ec:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/b6JDXKvzkQo" 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/04/03/geeks-ms-pa-habernos-matao.aspx</feedburner:origLink></item><item><title>Ya, ya... Keep It Simple, Stupid… ¿pero cómo?</title><link>http://feedproxy.google.com/~r/mlbb/~3/NNwl_T0zQcc/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx</link><pubDate>Mon, 23 Mar 2009 13:00:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144958</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>9</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=144958</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx#comments</comments><description>&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&lt;img height="282" width="300" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Complejidad_5F00_7A20FA4C.jpg" align="right" alt="Complejidad" border="0" title="Complejidad" style="border-bottom:0px;border-left:0px;margin:0px 0px 10px;display:inline;border-top:0px;border-right:0px;" /&gt; Que seguir el &lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/10/05/Grandes-principios-del-desarrollo-de-Software.aspx"&gt;principio KISS&lt;/a&gt; y mantener nuestras metodolog&amp;iacute;as, nuestras arquitecturas, nuestros dise&amp;ntilde;os, nuestras clases etc&amp;hellip; simples nos proporciona innumerables ventajas es algo que todos los desarrolladores de software tenemos claro desde un principio o acabamos aprendiendo a la fuerza. La simplicidad en una caracter&amp;iacute;stica que, cuando hablamos de desarrollar o dise&amp;ntilde;ar software, es buena en si misma. &lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;La paradoja es, que si bien sabemos lo anteriormente comentados, no es menos cierto que a menudo acabamos con procesos de desarrollo o&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;con soluciones demasiados complejas. Evidentemente hay dos aspectos claves a la hora de luchar contra la complejidad: uno, detectarla, el otro combatirla.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;Hoy voy a hablar de que estrategias tenemos a la hora de combatir la complejidad. La verdad es que antes de estar leyendo &lt;a href="http://www.amazon.com/gp/product/0735625786?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735625786"&gt;Simple Architectures for Complex Enterprises de Roger Sessions&lt;/a&gt;, no ten&amp;iacute;a ni una idea expl&amp;iacute;cita sobre este tema. Pero lo que comenta este libro sobre el tema es sumamente interesante. Aunque siempre he cre&amp;iacute;do que la complejidad es uno de los mayores enemigos de los procesos de desarrollo y los sistemas de software nunca me hab&amp;iacute;a plantead, antes de la lectura de este libro, de manera explicita, con que t&amp;aacute;cticas contamos a la hora de atacar la complejidad.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Las tres t&amp;aacute;cticas con las que contamos son: el particionado, la simplificaci&amp;oacute;n y las iteraciones.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;El &lt;span style="font-weight:bold;"&gt;particionado&lt;/span&gt; consiste en dividir grupos de elementos en elementos menores. Esta t&amp;aacute;ctica es quiz&amp;aacute;s la m&amp;aacute;s poderosa de las tres y, de manera consciente o no, la utilizamos continuamente en el desarrollo de software. Particionados nuestras arquitecturas en capas, de manera que cada una de ellas solo tenga que lidiar con las complejidades propias de su cometido. Nuestra capa de acceso a datos, solo tiene que atacar las complejidades relacionadas con la obtenci&amp;oacute;n o persistencia de los datos, pero no se preocupa por las complejidades de la capa de presentaci&amp;oacute;n. Particionar la complejidad de manera explicita nos permite atajarla de manera clara. La complejidad crece exponencialmente. Mezclar en una misma capa de la aplicaci&amp;oacute;n acceso a datos, e interfaz de usuario, no hace nuestra aplicaci&amp;oacute;n el doble de compleja sino que a&amp;ntilde;ade varios ordenes de magnitud.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Cuando hablamos de arquitecturas SOA, dos de &lt;a href="http://msdn.microsoft.com/en-us/library/bb264584.aspx"&gt;los pilares de SOA&lt;/a&gt; abogan claramente por el particionado: los l&amp;iacute;mites de los servicios son expl&amp;iacute;citos y los servicios son aut&amp;oacute;nomos.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;El particionado tambi&amp;eacute;n es una t&amp;eacute;cnica que las metodolog&amp;iacute;as usan a la hora de reducir la complejidad. Las metodolog&amp;iacute;as &amp;aacute;giles proponer dividir la complejidad de implementar un soluci&amp;oacute;n completa en historias de usuario independientes, testeables y simples. Esto es claramente una estrategia de particionado que nos permite atacar la complejidad de un desarrollo en peque&amp;ntilde;as historias de una complejidad acotada.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;En el libro, Roger Sessions cuenta un caso en el que las particiones reducen la complejidad de forma clara y visual cuando estas son adecuadas. Imagin&amp;aacute;is una tienda en la que la ropa estuviese ordenada por colores &amp;iquest;no ser&amp;iacute;a extremadamente complejo el proceso de compra?. Sin embargo en todas las tiendas de ropa las particiones que aparecen tiene sentido: caballeros, se&amp;ntilde;oras, ni&amp;ntilde;os&amp;hellip;, ropa de vestir, ropa deportiva, ropa de dormir, ropa interior&amp;hellip; XXL, XL, L, S&amp;hellip; con estas particiones &amp;iexcl;la complejidad de realizar una compra es infinitamente menor que si las partici&amp;oacute;n fuese por colores!.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;Una vez tenemos particiones explicitas, podemos proceder a utilizar la &lt;span style="font-weight:bold;"&gt;simplificaci&amp;oacute;n.&lt;/span&gt; La t&amp;aacute;ctica de simplificaci&amp;oacute;n mas poderosa es la eliminaci&amp;oacute;n. No ha t&amp;aacute;ctica m&amp;aacute;s poderosa de simplificaci&amp;oacute;n que eliminar aquellas particiones que no son relevantes. Si eliminamos completamente una historia de usuario, hemos reducido su complejidad a cero: no tenemos que dise&amp;ntilde;arla, implementarla, probarla o mantenerla. Desgraciadamente esto no siempre es posible: debemos eliminar tanto como sea posible, pero evidentemente no podemos eliminar todas las particiones, es necesario un equilibrio. Pero sin duda merece la pena observar nuestro proceso de desarrollo, nuestra arquitectura, nuestros dise&amp;ntilde;os y nuestras soluciones para eliminar todos aquellos elementos, todas aquellas particiones que a&amp;ntilde;adan complejidad. &lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;A veces, si bien no es posible eliminar completamente una partici&amp;oacute;n, si podemos eliminar algunos de los elementos que la componen. Por ejemplo, en un sistema de gesti&amp;oacute;n de almacenes, podemos tener historias relativas a ajustes de almacenes y a informes. No podemos eliminar completamente ninguna de estas particiones sin que el sistema pierda su utilidad, pero seguro que podemos eliminar algunas historias relativas a ajustes y algunas relativas a informes.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;La otra manera de combatir la complejidad es la &lt;span style="font-weight:bold;"&gt;iteraci&amp;oacute;n&lt;/span&gt;. Implementar las particiones de manera iterativa y revisar la complejidad al fin de cada iteraci&amp;oacute;n es un mecanismo poderoso que complementa las dos t&amp;aacute;cticas anteriores. Os remito aqu&amp;iacute; a un &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/03/12/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx"&gt;post anterior sobre velocidad de iteraci&amp;oacute;n frente a calidad de iteraci&amp;oacute;n&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0in;font-family:calibri;font-size:11pt;"&gt;Recordad, &lt;span style="font-weight:bold;"&gt;contra la complejidad: partici&amp;oacute;n, simplificaci&amp;oacute;n e iteraci&amp;oacute;n&lt;/span&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144958" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c54XAVWnRhQUCp-_jb9X9QGX_Vg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c54XAVWnRhQUCp-_jb9X9QGX_Vg/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/c54XAVWnRhQUCp-_jb9X9QGX_Vg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c54XAVWnRhQUCp-_jb9X9QGX_Vg/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=NNwl_T0zQcc:RdombhGbAfQ: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=NNwl_T0zQcc:RdombhGbAfQ: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=NNwl_T0zQcc:RdombhGbAfQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=NNwl_T0zQcc:RdombhGbAfQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/NNwl_T0zQcc" 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/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/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><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx</feedburner:origLink></item><item><title>MSBuild Profiler: ¿por qué mi build tarda una eternidad?</title><link>http://feedproxy.google.com/~r/mlbb/~3/xQIMOfzbhR4/msbuild-profiler-191-por-qu-233-mi-build-tarda-una-eternidad.aspx</link><pubDate>Mon, 16 Mar 2009 06:28:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144941</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>1</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=144941</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/03/16/msbuild-profiler-191-por-qu-233-mi-build-tarda-una-eternidad.aspx#comments</comments><description>&lt;p&gt;La cuadrillita del Debugging &amp;amp; Optimization Team de Plain Concepts somos bastante fanáticos de los profilers. Hay un arsenal de ellos: el &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=fd02c7d6-5306-41f2-a1be-b7dcb74c9c0b"&gt;profiler de Visual Studio&lt;/a&gt;, el &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/05/06/c-243-mo-cazar-una-fuga-de-memoria-en-net-y-ii.aspx"&gt;CLR Profiler&lt;/a&gt;, el Memprofiler de SciTech, VTune de Intel, el &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/01/05/luchando-contra-los-interbloqueos-en-sql-server.aspx"&gt;profiler de SQL Server&lt;/a&gt;… cada uno con sus puentos fuertes y débiles. Todos estos profilers se centran en mejorar la velocidad de ejecución de nuestros programas.&lt;/p&gt;  &lt;p&gt;Pues bien, hoy me he topado con un profiler, el &lt;a href="http://msbuildprofiler.codeplex.com/"&gt;MSBuild Profiler&lt;/a&gt;, radicalmente diferente, pero igualmente útil. Este profiler nos permite ‘instrumetar’ una build de MSBuild para analizar donde está fugando rendimiento. El procedimiento es bien simple, este profiler es capaz de analizar la salida de un &lt;a href="http://msdn.microsoft.com/en-us/library/ms171471(VS.80).aspx"&gt;logger a medida de MSBuild&lt;/a&gt;, proporcionado con el propio profiler. Basta con lanzar nuestra build con ese logger como salida para que el profiler nos de información sobre donde se pierde el tiempo en nuestra build, para ello basta con usar el parámetro /l de MSBuild que permite estarblecer el logger de salida que nos interese, en este caso: MSBuildProfilerLogger:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;MSBuild.exe buildfile.proj&amp;#160; /l:MSBuildProfileLogger,MSBuildProfiler,Version=1.0.1.0,Culture=neutral,PublicKeyToken=09544254e89d148c&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Esto arranca una instancia de MSBuild Profiler de manera interactiva. Puede ser que no sea esto lo que nos interese, por ejemplo si queremos lanzar una build con TFSBuild. Para estas situaciones el MSBuildProfilerLogger admite un parámetro &lt;em&gt;file &lt;/em&gt;que nos pemite genera un archivo &lt;em&gt;.snapshot&lt;/em&gt; con la información de rendimeinto de la build:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;MSBuild.exe buildfile.proj&amp;#160; /l:MSBuildProfileLogger,MSBuildProfiler,Version=1.0.1.0,Culture=neutral,PublicKeyToken=09544254e89d148c,&lt;font color="#ff0000"&gt;file=out.snapshot&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Luego podremos cargar en el MSBuild Profiler este archivo para ver los resultados, tal y como se muestra en la pantalla siguiente:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MSBuildProfiler" border="0" alt="MSBuildProfiler" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/MSBuildProfiler_5F00_095394C4.jpg" width="739" height="679" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Sin duda una herramienta excelente para &lt;a href="http://www.digwin.com/chewbacca-toda-la-potencia-y-velocidad-al-tfs-build-que-dir-a-han-solo"&gt;acelerar nuestras builds&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144941" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tkOIDdQe15rpBcUUzy1GMhdiyo0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tkOIDdQe15rpBcUUzy1GMhdiyo0/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/tkOIDdQe15rpBcUUzy1GMhdiyo0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tkOIDdQe15rpBcUUzy1GMhdiyo0/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=xQIMOfzbhR4:hYT7TkybSPA: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=xQIMOfzbhR4:hYT7TkybSPA: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=xQIMOfzbhR4:hYT7TkybSPA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=xQIMOfzbhR4:hYT7TkybSPA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/xQIMOfzbhR4" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Herramientas/default.aspx">Herramientas</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/03/16/msbuild-profiler-191-por-qu-233-mi-build-tarda-una-eternidad.aspx</feedburner:origLink></item><item><title>Velocidad de iteración vs Calidad de iteración</title><link>http://feedproxy.google.com/~r/mlbb/~3/ekeYfK6kFR0/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx</link><pubDate>Thu, 12 Mar 2009 21:18:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144434</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>8</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=144434</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/03/12/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx#comments</comments><description>&lt;p&gt;   &lt;div style="padding-bottom:10px;margin:0px;padding-left:10px;padding-right:0px;display:inline;float:right;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6292e8a8-0bec-41fe-97c7-f10ceeafd094" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=4bxjCI5PKMg&amp;amp;rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;feature=player_embedded&amp;amp;fs=1" target="_new"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/video2dc84f100a42_5F00_16AE7D9C.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; Estoy leyendo &lt;a href="http://www.amazon.com/gp/product/0735625786?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735625786"&gt;Simple Architectures for Complex Enterprises de Roger Sessions&lt;/a&gt;. No me queda mucho así que en breve espero que tengáis una reseña sobre el libro aquí, pero hoy voy ha hablaros de una cuestión que el libro trata de manera muy amena: la velocidad de iteración vs la calidad de iteración.&lt;/p&gt;  &lt;p&gt;Cuenta Roger Sessions en su libro una curiosa historia para ilustrar la diferencia que existe en el desarrollo de software entre iterar buscando la mayor velocidad de iteración o iterar buscando la mayor calidad de iteración. Este es un tema que ya he tratado con anterioridad en este blog: &lt;a href="http://geeks.ms/blogs/rcorral/archive/2007/12/12/no-persigas-tu-cola.aspx"&gt;No persigas tu cola...&lt;/a&gt;, pero la historia que cuenta Roger Sessions es realmente ilustrativa.&lt;/p&gt;  &lt;p&gt;El Coronel &lt;a href="http://en.wikipedia.org/wiki/John_Boyd_(military_strategist)"&gt;Jhon Boyd&lt;/a&gt;, uno de los grandes pilotos de la época de los primeros reactores de combate y estratega reconocido, estudio una anomalía en la luchas aéreas entre los dos grandes cazas de la década de los 50. Cito aquí la historia tal y como Roger Sessions la cita en su libro, traducida al español lo mejor que he sido capaz, además añado un video sobre el tema (en inglés), que no solo de informática vive el hombre: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;quot;El Coronel John Boyd estaba interesado no solo en cualquier lucha aérea, sino específicamente en los combates entre el &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Mikoyan-Gurevich_MiG-15"&gt;&lt;em&gt;MiG-15s&lt;/em&gt;&lt;/a&gt;&lt;em&gt; y el &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/F-86_Sabre"&gt;&lt;em&gt;F-86s&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Como ex-piloto y consumado diseñador de aeronaves, Boyd conocía estos dos aviones perfectamente. Él sabía que el MiG-15 era mejor técnicamente que el F-86. El MiG-15 podría subir más rápido que el F-86. El MiG-15 puede girar más rápidamente que el F-86. El MiG-15 tenía una mejor distancia de visibilidad. El F-86 tenía dos puntos a su favor. En primer lugar, tenía una mejor visibilidad lateral. Mientras que el piloto de MiG-15 podía ver más lejos, el piloto de F-86 podría ver un poco más por los laterales. En segundo lugar, el F-86 tenía un control de vuelo hidráulico. El MiG-15 tenía control de vuelo manual.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;La hipótesis más común por parte de los diseñadores aéreos era que la maniobrabilidad era el componente clave a la hora de ganar duelos aéreos. Evidentemente, el MiG-15, con su giro más rápido y su capacidad para escalar más rápido, podía mejorar la capacidad de maniobra del F-86. &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Pero hubo un pequeño problema con todo esto. A pesar de que el MiG-15 era considerado un avión superior por los diseñadores de aviones, el F-86 era preferido por los pilotos. La razón por la que era preferido por los pilotos fue simple: en los duelos uno-a-uno entre MiG-15 y F-86, el F-86 ganó nueve de cada diez veces.&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;¿Cómo un avión inferior puede ganar de manera consistente a un avión superior? Era la pregunta que surge rápidamente. Boyd, tenía una teoría: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;quot;Boyd concluyo que la cuestión determinante a la hora de ganar un duelo aéreo no era observar, orientarse, planear o actuar mejor. La cuestión determinante para ganar un duelo aéreo era observar, orientarse planear y actuar más rápido. En otras palabras, como de rápido uno podía iterar. La velocidad de iteración, sugirió Boyd, bate a la calidad de iteración.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;La siguiente pregunta que se realizo Boyd es esta: ¿por qué el F-86 iteraría más rápido?. La razón, concluyo, era algo que nadie había pensado que fuese particularmente importante, el hecho de que el F-86 contase con un mando de vuelo hidráulico mientras que el MiG-15 tenía un mando de vuelo manual. Sin ayuda hidráulica, costaba un poco más mover el mando de vuelo del MiG-15 que el del F-86. Aunque el MiG-15 girase más rápido (o pudiese llegar más alto) cada vez que el mando era movido, la cantidad de energía necesaria para mover el mando era mayor para el piloto del MiG-15. Con cada iteración, el piloto del MiG-15 sufría un poco más de fatiga que el piloto del F-86. Según se iba fatigando un poco más, tardaba un poco más en completar su ciclo de observar, orientarse, planear y actuar. El piloto del MiG-15 no perdía por que pilotase peor. Perdía por que completar el ciclo de lucha cada le costaba más tiempo.&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;De esta observación se deriva la Ley de la Iteración de Boyd: la velocidad de iteración bate a la calidad de iteración.&lt;/p&gt;  &lt;p&gt;Hoy en día todas las metodologías de desarrollo son iterativas. No hay otra manera de desarrollar software que en iteraciones en las que se repite la secuencia de combate del desarrollo de software: conocer el problema, analizarlo, implementar la solución, construir, probar (con diferentes variantes). La diferencia es que unas metodologías ponen el peso en la calidad de iteración (CMMI, RUP) mientras que otras ponen el peso en &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/10/02/exprimiendo-scrum-scrum-y-el-control-del-proyecto-i-el-avance.aspx"&gt;la velocidad de iteración&lt;/a&gt; (XP, Scrum). ¿Alguien duda de quien está ganando más combates?. La idea es clara, si te vas a equivocar, equivócate pronto, rectifica rápido en lugar de &lt;a href="http://geeks.ms/blogs/rcorral/archive/2007/12/12/no-persigas-tu-cola.aspx"&gt;tratar de no equivocarte por todos los medios y quedarte sin tiempo para rectificar&lt;/a&gt;. A veces se describe esto como dinero por flexibilidad en lugar de dinero por información. Las metodologías guiadas por un plan, consumen muchos recursos trantando de asegurar las maniobras adecuadas, las metodologías ágiles tratan de realizar las maniobras de manera rápida y razonablemente adecuada. Si hay problemas siempre se puede rectificar… si el coste de rectificar es razonable y si tienes la ágilidad necesaria para no morir en el intento.&lt;/p&gt;  &lt;p&gt;La esencia del software es iterativa, como la esencia del combate aéreo y no deja de ser curioso como ese énfasis en la iteración rápida aparece en todas las buenas practicas de la ingeniería del software, igual que en combate aéreo. Perseguimos &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;encontrar rápido los errores&lt;/a&gt;, intentamos incorporar temprano el feedback de los usuarios, intentamos &lt;a href="http://geeks.ms/blogs/rcorral/archive/2007/06/24/construcciones-automatizadas-y-diarias.aspx" target="_blank"&gt;construir el software&lt;/a&gt; de manera frecuente y minimizando el coste de construirlo, etc…&lt;/p&gt;  &lt;p&gt;¿Qué opinión os merece esta reflexión? ¿Mejor primar la velocidad de iteración o la calidad de iteración?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144434" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Any-ttZWEWbCoWZY8N3U7VHW4jw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Any-ttZWEWbCoWZY8N3U7VHW4jw/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/Any-ttZWEWbCoWZY8N3U7VHW4jw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Any-ttZWEWbCoWZY8N3U7VHW4jw/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=ekeYfK6kFR0:D4FKZhDzNfI: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=ekeYfK6kFR0:D4FKZhDzNfI: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=ekeYfK6kFR0:D4FKZhDzNfI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=ekeYfK6kFR0:D4FKZhDzNfI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/ekeYfK6kFR0" 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/03/12/velocidad-de-iteraci-243-n-vs-calidad-de-iteraci-243-n.aspx</feedburner:origLink></item><item><title>He leído: More Joel on Software de Joel Spolsky</title><link>http://feedproxy.google.com/~r/mlbb/~3/HZXs3ZpKgRI/he-le-237-do-more-joel-on-software-de-joel-spolsky.aspx</link><pubDate>Wed, 11 Mar 2009 06:13:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144328</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>8</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=144328</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/03/11/he-le-237-do-more-joel-on-software-de-joel-spolsky.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/1430209879?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430209879" 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="Cómpralo en Amazon" border="0" alt="Cómpralo en Amazon" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/MoreJoelonSoftware_5F00_37663169.jpg" width="233" height="350" /&gt;&lt;/a&gt; Hay libros que se leen y libros que devoran. Aunque no se pretenda de antemano.. Hace menos de dos semanas, llegaba mi regalo de reyes. Un pedido de libros. Entre los cinco títulos que llegaban, estaba este libro que hoy comento. No era el primero entre mis preferencias de los que componían el paquete. De hecho comencé con mi regalo de reyes leyendo otro libro. Pero de repente, un día abrí el libro de Joel y zas… ¡no pude para de leer hasta que lo devoré!. En menos de una semana lo había leído. Los habituales del este blog habréis visto que el libro que tengo entre manos suele aparecer en el ‘sidebar’ del blog, pues en este caso ¡ni siquiera me ha dado tiempo a ponerlo!.&lt;/p&gt;  &lt;p&gt;Nada oculta que soy un gran fan de Joel. Ya antes he publicado mi impresión sobre otros de sus libros: &lt;a title="He leído- Joel on Software de Joel Spolsky" href="http://geeks.ms/blogs/rcorral/archive/2007/08/31/he-le-237-do-joel-on-software-de-joel-spolsky.aspx"&gt;Joel on Software&lt;/a&gt; y &lt;a title="He leído- The Best Software Writing I de Joel Spolsky" href="http://geeks.ms/blogs/rcorral/archive/2006/08/28/He-le_ED00_do_3A00_-The-Best-Software-Writing-I.aspx"&gt;The Best Software Writing I&lt;/a&gt;. Muchos de los artículos de este blog están influenciados por él, muchos citan alguno de sus post. Su blog es mi blog favorito, sin duda alguna y espero sus artículos con devoción, una devoción que solo tengo por la columna de Arturo Perez Reverte, en El Semanal y por Miguel Delibes. Vamos que cuando abrí el libro no esperaba ninguna novedad, y sin embargo en cada página he encontrado un aliciente continuo que me impedía dejar de leer. Todos los artículos los había leído con anterioridad, pero leer en papel tu blog favorito no tiene precio, la verdad. Además los artículos están ordenados por temática, lo que da al libro una coherencia, una continuidad y una línea argumental que el blog no tiene.&lt;/p&gt;  &lt;p&gt;Es una caña de libro, un libro divertido sobre una multitud de temas relacionados con el desarrollo de software: desde como contratar desarrolladores, a como fijar el precio del software o como crear una empresa de desarrollo de éxito, pasando por… por todos los temas relevantes del desarrollo de software y sus aledaños. Los temas que trata Joel: la gestión del personal en proyectos informáticos, consejos para los futuros programadores, la importancia de diseño, la gestión de grandes proyectos, consejos sobre programación, cómo comenzar un negocio de software, cómo continuar con el, como lograr liberar software y cómo revisar y mantener el software liberado. Todo salpicado de amenas historias que hacen que los temas que trata, muchos de ellos pilares de la gestión proyectos de software, se queden grabados a fuego en la memoria. Sin duda, los libros de Joel son los libros de gestión de proyectos más amenos jamás escritos. Tan amenos que es facil olvidar que estas leyendo sobre desarrollo de software.&lt;/p&gt;  &lt;p&gt;Para muestra, un botón: &lt;a href="http://www.joelonsoftware.com/items/2008/03/17.html" target="_blank"&gt;Martian Headsets&lt;/a&gt;, en el que habla sobre la falacia de los estándares web. No existe tal cosa como los estándares web, los estándares son una buen idea, de imposible implementación. Memorable. O &lt;a title="The Perils of JavaSchools - Joel on Software" href="http://www.google.com/url?q=http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html&amp;amp;ei=qwGzScDJAtyxjAeTkbjtBQ&amp;amp;sa=X&amp;amp;oi=spellmeleon_result&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;usg=AFQjCNGnwzsLtMGV31im5-eYJddfQrxDYw"&gt;The Perils of JavaSchools&lt;/a&gt; que explica como C es el tamiz que separa el gran de la paja cuando hablamos de desarrolladores. O uno, magnifico, sobre ¿economía? &lt;a title="Camels and Rubber Duckies - Joel on Software" href="http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html"&gt;Camels and Rubber Duckies&lt;/a&gt;, en el que trata de responder a una pregunta sin respuesta: ¿Cúanto debo cobrar por mi software?. No responde a la prengunta, pero yo al menos ahora se por qué hay cientos de ediciones de Windows… segmentación del mercado, se llama el asunto, y al final la segmentación se traduce en ¡más pasta!… que cosas oigan.&lt;/p&gt;  &lt;p&gt;Resumiendo, si ya conoces el blog de Joel, el libro te encantará, si no conoces el blog de Joel, el libro te fascinará y seguro que correrás a comprar los otros dos libros de este autor que menciono en este blog. O mejor aun, &lt;a href="http://www.amazon.com/gp/product/1430209879?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430209879" target="_blank"&gt;comprate los tres&lt;/a&gt; de un tirón, seguro que me lo agradecerás. Una &lt;a href="http://www.amazon.com/gp/product/1430209879?ie=UTF8&amp;amp;tag=lamaselladlab-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430209879" target="_blank"&gt;compra&lt;/a&gt; más que recomendable.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144328" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vSMtt-rSRmnQMqQVsFJ_FGtTHKo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSMtt-rSRmnQMqQVsFJ_FGtTHKo/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/vSMtt-rSRmnQMqQVsFJ_FGtTHKo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSMtt-rSRmnQMqQVsFJ_FGtTHKo/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=HZXs3ZpKgRI:IP1dnIk8D_4: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=HZXs3ZpKgRI:IP1dnIk8D_4: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=HZXs3ZpKgRI:IP1dnIk8D_4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=HZXs3ZpKgRI:IP1dnIk8D_4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/HZXs3ZpKgRI" 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/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/03/11/he-le-237-do-more-joel-on-software-de-joel-spolsky.aspx</feedburner:origLink></item><item><title>Estaré en SecondNug: 'Herramientas de modelado: en busca del El Dorado'</title><link>http://feedproxy.google.com/~r/mlbb/~3/5huIIB_Rva4/estar-233-en-secondnug-herramientas-de-modelado-en-busca-del-el-dorado.aspx</link><pubDate>Tue, 10 Mar 2009 14:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144594</guid><dc:creator>Rodrigo Corral</dc:creator><slash:comments>10</slash:comments><wfw:comment>http://geeks.ms/blogs/rcorral/commentapi.aspx?PostID=144594</wfw:comment><comments>http://geeks.ms/blogs/rcorral/archive/2009/03/10/estar-233-en-secondnug-herramientas-de-modelado-en-busca-del-el-dorado.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032407379&amp;amp;EventCategory=4&amp;amp;culture=es-ES&amp;amp;CountryCode=ES"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 10px 10px;display:inline;border-top:0px;border-right:0px;" title="Herramientas de modelado" border="0" alt="Herramientas de modelado" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcorral/Herramientasdemodelado_5F00_6C8664A0.jpg" width="394" height="292" /&gt;&lt;/a&gt; Los chicos de SecondNug me han invitado a dar una charla, no se si lograré estar a la altura de mi amado jefe, pero lo intentare. Me pidieron una charla sobre UML. Pero UML ¡es muy aburrido! y el modelado es un campo que está evolucionado de manera muy rápida y continua, así que he abierto un poco más la temática... espero que la charla os resulte atractiva y os animeis a &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032407379&amp;amp;EventCategory=4&amp;amp;culture=es-ES&amp;amp;CountryCode=ES" target="_blank"&gt;asistir&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Durante décadas, lo que es tanto como una eternidad en el mundo del software, los desarrolladores hemos intentado reducir la creciente complejidad de los proyectos que construimos utilizando la abstracción. La utilización de modelos ha sido una de las técnicas que más adeptos han tenido a la hora de ganar en abstracción. Desde los lenguajes 4GL hasta Oslo, pasando por el omnipresente UML, y las todopoderosas DSL las promesas han sido muchas y los resultados… bueno han sido los que han sido.&lt;/p&gt;  &lt;p&gt;En este charla vamos a repasar la historia del modelado, vamos a introducir UML, veremos cómo han evolucionado las herramientas de modelado en la plataforma de desarrollo de Microsoft y sobre todo, vamos a mirar al futuro de la mano de VSTS 2010 y de la de Oslo, la nueva plataforma de modelado y DSL de Microsoft.&lt;/p&gt;  &lt;p&gt;El modelado a sido El Dorado del mundo del desarrollo de software, muchos hemos creído en el, muchos lo siguen buscando, muchos intuimos que existe, pero nadie ha encontrado la solución definitiva. Pero por supuesto, en ocasiones, y utilizado correctamente, el modelado nos puede ser de utilidad.&lt;/p&gt;  &lt;p&gt;Por cierto el evento será grabado y lo podréis &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032407379&amp;amp;EventCategory=4&amp;amp;culture=es-ES&amp;amp;CountryCode=ES"&gt;ver&lt;/a&gt; cuando queráis.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144594" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0EQPkFl2q34gT50k190NoHW-LDw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0EQPkFl2q34gT50k190NoHW-LDw/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/0EQPkFl2q34gT50k190NoHW-LDw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0EQPkFl2q34gT50k190NoHW-LDw/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=5huIIB_Rva4:YSzTCOejiac: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=5huIIB_Rva4:YSzTCOejiac: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=5huIIB_Rva4:YSzTCOejiac:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mlbb?i=5huIIB_Rva4:YSzTCOejiac:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mlbb/~4/5huIIB_Rva4" height="1" width="1"/&gt;</description><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Herramientas/default.aspx">Herramientas</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Patrones/default.aspx">Patrones</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/rcorral/archive/tags/Oslo/default.aspx">Oslo</category><feedburner:origLink>http://geeks.ms/blogs/rcorral/archive/2009/03/10/estar-233-en-secondnug-herramientas-de-modelado-en-busca-del-el-dorado.aspx</feedburner:origLink></item></channel></rss>
