<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3732630541286744699</atom:id><lastBuildDate>Thu, 24 May 2012 12:36:56 +0000</lastBuildDate><category>DefaultProxy</category><category>DataGridView</category><category>SQL</category><category>WinFx</category><category>Windows Server 2008</category><category>Timeboxing</category><category>Log</category><category>Sitecore</category><category>Excepciones</category><category>Planificacion</category><category>Microsoft SQL Server</category><category>ASP.NET</category><category>Intercambio</category><category>Equipos distribuidos</category><category>Trabajo a distancia</category><category>Aprendizaje</category><category>TDD</category><category>Microsoft SQLServer 2005</category><category>Novedades en Enterprise library 3.0</category><category>Debugging</category><category>Metodologias</category><category>Koan</category><category>Seguridad Integrada</category><category>Coding Dojo</category><category>WinForms</category><category>.NET 2.0</category><category>.NET 3.5</category><category>Teletrabajo</category><category>Desarrollo Custom</category><category>ConfigurationManager</category><category>web.config</category><category>Html5</category><category>Community Server</category><category>LINQ</category><category>IE7</category><category>Time Management</category><category>Windows Vista</category><category>Operators checked unchecked</category><category>Office Open XML Format</category><category>Logging and Instrumentation Application Block</category><category>Progressive Enhancement</category><category>Web Services</category><category>Servicios</category><category>SQL Server 2005</category><category>Logging</category><category>.NET 3.0</category><category>Enterprise library</category><category>Buenas Prácticas</category><category>ASP.NET AJAX</category><category>Nullable types</category><category>ViewModel</category><category>SQL Express Edition</category><category>Agile</category><category>Web projects</category><category>Trabajo distribuido</category><category>CMS</category><category>Scrum</category><category>HTML</category><category>Internet Explorer</category><category>JavaScript</category><category>app.config</category><category>Exceptions</category><category>Blog</category><category>Pampa Notes</category><category>Windows Mobile</category><category>IIS 7</category><category>MVC</category><category>XP</category><category>dynamic</category><category>Source Control</category><category>Brasil</category><category>.Net</category><category>Programación</category><category>WebRequest</category><category>LINQ para SQL</category><category>Crystal Clear</category><category>Coaching ontológico</category><category>SOA</category><category>Exception Handling Application Block</category><category>Implicit and Explicit operators</category><category>Node.js</category><category>SQL Compact Edition</category><category>UnitTesting</category><category>Avalon</category><category>Tercer Planeta</category><category>Pair Programming</category><category>HttpWebRequest</category><category>compatibilidad</category><category>Microsoft SQLServer 2005 "Snapshots"</category><category>Indigo</category><category>.Net 4.0</category><category>Herramientas</category><category>Retrospectiva</category><category>IE6</category><category>Arquitectura</category><category>Profiling</category><category>QUnit</category><category>TFS</category><category>desarrollo personal</category><category>Cryptography Application Block</category><category>Bookmarklet</category><category>Team Fundation Server</category><category>DragAndDrop</category><category>Exception Handling</category><category>C#</category><category>WCF</category><category>Proxy</category><category>Silverlight</category><title>Ideas 3p</title><description>El blog técnico de &lt;strong&gt;Tercer Planeta&lt;/strong&gt;</description><link>http://blog.tercerplaneta.com/</link><managingEditor>noreply@blogger.com (Benjamin Eidelman)</managingEditor><generator>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Ideas3p" /><feedburner:info uri="ideas3p" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-6440624947479712215</guid><pubDate>Tue, 10 Jan 2012 15:21:00 +0000</pubDate><atom:updated>2012-01-10T12:21:49.815-03:00</atom:updated><title>Lo que dejó Ágiles 2011</title><description>&lt;div style="text-align: left"&gt;Los días 11, 12 y 13 de Octubre de 2011 se realizó la &lt;strong&gt;4ta Jornada Latinoamericana de Metodologías Ágiles&lt;/strong&gt; en Buenos Aires. Los dos primeros días de la jornada se dedicaron a charlas, workshops y tutoriales, dejando el último día reservado a los Open Space. En el &amp;quot;Cierre oficial de las Jornadas&amp;quot; se realizó la correspondiente retrospectiva del evento e inmediatamente después se habilitó la fiesta para completar la finalización del evento.&lt;/div&gt;  &lt;div&gt;   &lt;div&gt;&lt;/div&gt;    &lt;div&gt;A pesar que han pasado algunos meses, desde las jornadas hasta la publicación de este artículo, quiero compartir una breve reseña de algunas de las sesiones a las que asistí y las impresiones más destacadas que me llevé. &lt;/div&gt;    &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;Keynote: Us, them and the problem with common agile practice&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;&lt;i&gt;(Jeff Patton)&lt;/i&gt;&lt;/div&gt;    &lt;div&gt;Remarcó la importancia ubicarnos en el lugar del usuario/cliente en cuanto a poder imaginarnoslo en un “mal día” para poder visualizarlo en un “buen día”. Esto nos ayuda a “sincronizar nuestros cerebros”, al intercambio de conocimiento acerca de los problemas actuales, futuros y lo que hay en el medio.&lt;/div&gt;    &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;&lt;strong&gt;Consejo&lt;/strong&gt;: construir el “Story map” en conjunto con el usuario/cliente para explorar el producto completo a través de la conversación con él, quien habla de su “vida laboral” en lugar de un producto de software.&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;Es importante armar “Cross functional team”&lt;/div&gt;    &lt;div&gt;&lt;a href="http://lh3.ggpht.com/-8YlPszYTC5M/TwxXg5FrNzI/AAAAAAAAAEs/ceZs94mHXJ8/s1600-h/CrossFunctionalTeam_thumb%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="CrossFunctionalTeam_thumb" border="0" alt="CrossFunctionalTeam_thumb" src="http://lh6.ggpht.com/-k9rhmqKEu-Q/TwxXhWOwScI/AAAAAAAAAE0/cCjjFuJOgN8/CrossFunctionalTeam_thumb_thumb.png?imgmax=800" width="329" height="130" /&gt;&lt;/a&gt;&lt;/div&gt;    &lt;div&gt;de esta forma, el trabajo se tratará de hacerlo NOSOTROS Y ELLOS.&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;Workshop: Design emergente e divida técnica: tomando decisoes conscientes&lt;/font&gt;&lt;/b&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div&gt;   &lt;div style="background-color: transparent"&gt;(&lt;em&gt;Mariana Vivian Bravo, Hugo Corbucci&lt;/em&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;div&gt;Fue un workshop en el cual al principio se presentaron tres ideas relacionadas con &amp;quot;&lt;i&gt;Deuda técnica&lt;/i&gt;&amp;quot; y luego se realizó un debate entre los asistentes.&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;Durante el debate uno de los participantes compartió una metáfora donde la deuda técnica está representada con lo que se deja sin lavar al cocinar. Se pueden lavar los utensillos y recipientes de cocina cuando no se utilizan más, o postergar el lavado hasta finalizar la preparación. La principal diferencia entre ambos es el esfuerzo asociado a realizar el &amp;quot;lavado de los platos&amp;quot;: en el primer caso son pocos platos a lavar en varios momentos, en el segundo es una pila de platos -proporcional al nivel de dificultad de la preparación- al finalizar la misma.&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&lt;a href="http://lh3.ggpht.com/-C1jgyejILy8/TwxXhjwwh6I/AAAAAAAAAE8/8zL1Tt5x2y0/s1600-h/gg_dlswn0614_thumb1%25255B2%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="gg_dlswn0614_thumb1" border="0" alt="gg_dlswn0614_thumb1" src="http://lh6.ggpht.com/-H7QdMg1NExg/TwxXiFC5F5I/AAAAAAAAAFE/m2XFuqBU5IA/gg_dlswn0614_thumb1_thumb.jpg?imgmax=800" width="189" height="126" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div&gt;Un interesante punto de vista para evaluar qué se puede y quiere hacer con las deudas técnicas.&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;Keynote: Agile, past and future&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;&lt;i&gt;(James Shore)&lt;/i&gt;&lt;/div&gt;  &lt;div&gt;Me pareció muy interesante y enriquecedor el Keynote que brindó James Shore. Develó algunos secretos para tener éxito en ágil:&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;strong&gt;Pasión por el trabajo ¿Cómo tener “El mejor trabajo de mi vida”?&lt;/strong&gt;&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Hacerse cargo del software que se está construyendo. &lt;/li&gt;    &lt;li&gt;Hacer foco en la Mejora continua, no solo durante la retrospectiva. Importante –&amp;gt; qué se hace para progresar, cambir o resolver algo. &lt;/li&gt;    &lt;li&gt;Calidad –&amp;gt; “&lt;em&gt;es una cuestión de actitud&lt;/em&gt;”. &lt;/li&gt;    &lt;li&gt;Habilidad –&amp;gt; ser bueno en lo que se hace pero no ser un “rock star”. &lt;/li&gt;    &lt;li&gt;Disciplina. &lt;/li&gt;    &lt;li&gt;Buen entorno, sin fricción, donde sea sencillo trabajar. Alegría. &lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;&lt;strong&gt;Comunicación&lt;/strong&gt;&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Lograr que todas las personas tengan la misma idea, que entiendan lo mismo. &lt;/li&gt;    &lt;li&gt;Hablar, comunicarse. &lt;/li&gt;    &lt;li&gt;Estar atento a los temas que son sensibles, se necesita un equipo maduro para poder manejar estas situaciones. &lt;/li&gt;    &lt;li&gt;Comenzar a compartir experiencias, a divertirse trabajando juntos para conseguir el objetivo. &lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;&lt;strong&gt;Herramientas&lt;/strong&gt;&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Velocidad de iteración sólida y constante. &lt;/li&gt;    &lt;li&gt;Pocos defectos. Test automatizados. Diseño continuo. &lt;/li&gt;    &lt;li&gt;Tener rigor –&amp;gt; identificar un diseño pobre y corregirlo, mejorarlo. &lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;El secreto con el que más me siento identificada, está relacionado con la &lt;i&gt;pasión por el trabajo&lt;/i&gt;. Me alegró escucharlo y coincido plenamente con ese concepto, aunque creo que va mas allá de ser ágil o no. Creo que es fundamental que cada uno disfrute del trabajo que realiza y se sienta orgulloso del resultado.&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;div&gt;&lt;b style="line-height: 35px; background-color: rgb(255,255,255); letter-spacing: -0.04em; color: rgb(78,78,78)"&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;&lt;b style="line-height: 35px; background-color: rgb(255,255,255); letter-spacing: -0.04em; color: rgb(78,78,78)"&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;&lt;b style="line-height: 35px; background-color: rgb(255,255,255); letter-spacing: -0.04em; color: rgb(78,78,78)"&gt;&lt;font size="4"&gt;Optimizing Organizational / Team collaboration &amp;amp; transparency even with distributed teams&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;   &lt;div&gt;(&lt;i&gt;Michael DePaoli&lt;/i&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;div&gt;Modelo representativo del trabajo en equipo, en cuanto a las relaciones y la comunicación:&lt;/div&gt;  &lt;div&gt;&lt;a href="http://lh5.ggpht.com/-Zi9jnxoyCck/TwxXivmy5zI/AAAAAAAAAFM/G-RSux4ySyU/s1600-h/modelo_thumb5%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="modelo_thumb5" border="0" alt="modelo_thumb5" src="http://lh6.ggpht.com/-H7dwoFFL7tg/TwxXjI7N34I/AAAAAAAAAFU/wSgI35oXRhs/modelo_thumb5_thumb.png?imgmax=800" width="258" height="92" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Enumero algunos conceptos que me parecieron destacados:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cuanto mas alejado está el equipo, menos confianza y colaboración existe. &lt;/li&gt;    &lt;li&gt;¿La cultura de la Compañía valora la &lt;em&gt;Confianza e Integridad&lt;/em&gt;? &lt;/li&gt;    &lt;li&gt;Todos deberían “Walk the talk”, hacer lo que dicen, especialmente el líder. &lt;/li&gt;    &lt;li&gt;Desperdicio = cuando se pierde tiempo tratando de descubrir a quien culpar. &lt;/li&gt;    &lt;li&gt;No temer a fallar, es una oportunidad para aprender. &lt;/li&gt;    &lt;li&gt;Aprender –&amp;gt; es la clave. &lt;/li&gt;    &lt;li&gt;El entorno físico afecta el comportamiento. Tener comodidad ayuda a la colaboración y transparencia. &lt;/li&gt;    &lt;li&gt;Tener éxito o fracaso &lt;strong&gt;como un equipo&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Remover aquellas personas que “no juegan en equipo”. &lt;/li&gt;    &lt;li&gt;Canales de comunicación vs. Efectividad. &lt;/li&gt;    &lt;li&gt;Herramientas no técnicas: considerar el uso de la más poderosa herramienta que disponemos: &lt;strong&gt;tu cerebro&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Mejorar la calidad del mensaje. Crear un vocabulario común. &lt;/li&gt;    &lt;li&gt;Con “Openness &amp;amp; Trust” la persona se encuentra mas receptiva al feedback. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Relationship Awareness theory&lt;/strong&gt; –&amp;gt; es un modelo de auto-aprendizaje para entender e inferir eficiente y acertadamente el motivo detrás del comportamiento de otros. Ayuda a construtir relaciones personales y laborales mas efectivas. 4 Premisas: &lt;/li&gt; &lt;/ul&gt;  &lt;ol&gt;   &lt;li&gt;El comportamiento está dirigido por la motivación de lograr la autoestima. &lt;/li&gt;    &lt;li&gt;La motivación cambia en los conflictos. &lt;/li&gt;    &lt;li&gt;Fortalezas, cuando son exageradas, pueden ser percibidas como debilidades (hay que conocer a la otra persona). &lt;/li&gt;    &lt;li&gt;Claridad y validez para mejorar el auto-descubrimiento. &lt;/li&gt; &lt;/ol&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Motivational Value System&lt;/strong&gt; –&amp;gt; mediante un sencillo test de personalidad se puede conocer cómo una persona se comporta frente a un conflicto, con el fin de brindarle herramientas para manejarlo en forma positiva. Manejar cómo responde uno ante un conflicto y conocer o intuir el comportamiento de otras personas conduce a resultados de beneficio mutuo y nos acerca a entender cómo nos comunicamos. &lt;a href="http://www.personalstrengths.us/index.php/en/sdi/about-sdi-an-overview" target="_blank"&gt;Más información acerca de SDI-Personal strenghts trainig&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;    &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="4"&gt;Conclusión&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;   &lt;div&gt;Desde lo personal, asistir a las jornadas y participar de ciertas charlas enriqueció y fortaleció mi valoración acerca de las metodologías ágiles, reafirmando su importancia para la conformación de un &lt;b&gt;&lt;i&gt;equipo de trabajo&lt;/i&gt;&lt;/b&gt; que trabaje en conjunto, colaborando unos con otros para alcanzar entre todos un objetivo en común. Fue inevitable hacer una introspección acerca del trabajo diario y detectar algunos puntos en los cuales se puede seguir mejorando, aquellos que hay que reforzar y cuales mantener. &lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-6440624947479712215?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/w1McjZuEcWA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/w1McjZuEcWA/lo-que-dejo-agiles-2011.html</link><author>noreply@blogger.com (Nora Martinez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-k9rhmqKEu-Q/TwxXhWOwScI/AAAAAAAAAE0/cCjjFuJOgN8/s72-c/CrossFunctionalTeam_thumb_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2012/01/lo-que-dejo-agiles-2011.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-8512954699130382554</guid><pubDate>Tue, 13 Dec 2011 16:27:00 +0000</pubDate><atom:updated>2011-12-13T15:53:21.732-03:00</atom:updated><title>Web Tests utilizando Selenium y SpecFlow</title><description>&lt;p&gt;En el desarrollo de aplicaciones cada vez es más&amp;#160; indispensable&amp;#160; el uso de herramientas que nos permitan automatizar nuestras pruebas. A continuación vamos a echarle un vistazo a dos herramientas que se usan para el desarrollo de tests orientados a bdd (desarrollo guiado por comportamiento)&lt;strong&gt;,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Selenium WebDriver: Es una biblioteca que nos facilita la creación de test automatizados para aplicaciones web.&lt;/p&gt;  &lt;p&gt;SpecFlow: Está herramienta sirve para escribir test utilizando el lenguaje Gherkin.&lt;/p&gt;  &lt;h3&gt;¿Y que es Gherkin?&amp;#160;&amp;#160; &lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="113" alt="image" src="http://lh5.ggpht.com/-i1PGgA8vE2Y/Tud81n4XKtI/AAAAAAAAAE8/KPTpXzLCqKw/image_thumb%25255B4%25255D.png?imgmax=800" width="253" align="right" border="0" /&gt;Es un lenguaje común para crear test unitarios en texto plano usando el lenguaje de negocio de la misma forma que escribimos los criterios de aceptación de una historia de usuario. Esto quizás no parezca muy impresionante a simple vista, pero contar con esta declaratividad hace que los test sean fácilmente comprensibles para cualquier stakeholder, funcionando como puente conceptual entre usuarios y desarrolladores, y que finalmente&amp;#160; sirva como &lt;b&gt;documentación ejecutable de toda la funcionalidad&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;Para entender un poco mejor de qué se trata vamos con un ejemplo:&lt;/p&gt;  &lt;p&gt;Supongamos que necesitamos probar la funcionalidad de un abm para carga de usuarios,&lt;/p&gt;  &lt;p&gt;podríamos escribir el test de la siguiente forma,&lt;/p&gt;  &lt;p&gt;Scenario: Add new, modify and delete&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; When add a User with description &amp;quot;Don Pepito&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; When change User description &amp;quot;Don Pepito&amp;quot; to &amp;quot;Don José&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; And search for User &amp;quot;Don&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Then should read &amp;quot;Don José&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; But should not read &amp;quot;Don Pepito&amp;quot;&lt;/p&gt;  &lt;p&gt;Una vez escrito el test lo podemos ejecutar y lo que va a pasar a continuación es que “mágicamente” (suponiendo que todo esté debidamente configurado) se va abrir una ventana con el navegador que hayamos preestablecido y automáticamente se ejecutarán las pruebas.&lt;a href="http://lh3.ggpht.com/-62d3x2VvkZI/Tud82JbHSxI/AAAAAAAAAF0/2eFhV93KGJI/s1600-h/holaDonPepito%25255B27%25255D.jpg"&gt;&lt;img title="holaDonPepito" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 15px 0px 0px; border-right-width: 0px" height="120" alt="holaDonPepito" src="http://lh6.ggpht.com/-46UiTejMFRo/Tud82fzp_BI/AAAAAAAAAF4/Z-bL6B4OFYk/holaDonPepito_thumb%25255B25%25255D.jpg?imgmax=800" width="178" align="right" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;¿Y donde esta la magia?&lt;/h3&gt;  &lt;p&gt;Está en que SpecFlow nos&amp;#160; permite que las frases que escribimos, y representan las acciones a realizar en la aplicación, están bindeados a métodos&amp;#160; de test escritos utilizando WebDriver.&amp;#160; Entonces, si por ejemplo quisiéramos navegar a través de una de estas frases nos vamos a encontrar con algo parecido a esto,&lt;/p&gt;  &lt;p align="left"&gt;[When(@&amp;quot;add a Clown with description &amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;)]&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void WhenAddAClownWithDescription__(string description)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var ws = new CommonWebSteps();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ws.WhenVisit(&amp;quot;List.aspx/Option/Clowns&amp;quot;);&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ws.WhenPressButton(&amp;quot;Add Clown&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ws.WhenFillWith(&amp;quot;Description&amp;quot;, description);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ws.WhenPressButton(&amp;quot;Save&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;Recapitulando un poco, teniendo definidos los métodos apropiados no se necesitan conocimientos en programación para escribir pruebas de aceptación (Por cierto, además contamos con IntelliSence =D)&amp;#160; que&amp;#160; podemos ejecutar las veces que sean necesarias en varios navegadores evitándonos tediosas jornadas de clics repetitivos a través de nuestra aplicación web.&amp;#160; En otras palabras, es casi como tener una unidad R2D2&amp;#160; que hace el trabajo por nosotros!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-lHuJ-KA3tQQ/Tud82wQ2sfI/AAAAAAAAAFU/uvlE_8DlJU0/s1600-h/R2D2%25255B16%25255D.jpg"&gt;&lt;img title="R2D2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="238" alt="R2D2" src="http://lh4.ggpht.com/-dHoGgyhelek/Tud83ALUD8I/AAAAAAAAAFc/g-zfBwPbKT0/R2D2_thumb%25255B14%25255D.jpg?imgmax=800" width="220" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh6.ggpht.com/-8btxJgPS2X4/Tud83slojII/AAAAAAAAAFk/oycn21U2RmM/s1600-h/RobotLost%25255B8%25255D.jpg"&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/-8btxJgPS2X4/Tud83slojII/AAAAAAAAAFk/oycn21U2RmM/s1600-h/RobotLost%25255B8%25255D.jpg"&gt;&lt;img title="RobotLost" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="239" alt="RobotLost" src="http://lh4.ggpht.com/-Duacia1XPp8/Tud84LP8_9I/AAAAAAAAAFs/nWYjPAmnmvI/RobotLost_thumb%25255B6%25255D.jpg?imgmax=800" width="150" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Robots: en el futuro realizarían nuestro trabajo.&lt;/h5&gt;  &lt;p&gt;Links:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://specflow.org/"&gt;SpecFlow&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/selenium/"&gt;Selenium&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/-lHuJ-KA3tQQ/Tud82wQ2sfI/AAAAAAAAAFU/uvlE_8DlJU0/s1600-h/R2D2%25255B16%25255D.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/-lHuJ-KA3tQQ/Tud82wQ2sfI/AAAAAAAAAFU/uvlE_8DlJU0/s1600-h/R2D2%25255B16%25255D.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/-lHuJ-KA3tQQ/Tud82wQ2sfI/AAAAAAAAAFU/uvlE_8DlJU0/s1600-h/R2D2%25255B16%25255D.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:234b4f95-a3bd-49dd-a23b-6b727fde6899" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/Web+Test" rel="tag"&gt;Web Test&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BDD" rel="tag"&gt;BDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WebDriver" rel="tag"&gt;WebDriver&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SpecFlow" rel="tag"&gt;SpecFlow&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Selenium" rel="tag"&gt;Selenium&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-8512954699130382554?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/NcoD4frMJdA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/NcoD4frMJdA/web-tests-utilizando-selenium-y.html</link><author>noreply@blogger.com (Matías Timossi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-i1PGgA8vE2Y/Tud81n4XKtI/AAAAAAAAAE8/KPTpXzLCqKw/s72-c/image_thumb%25255B4%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/12/web-tests-utilizando-selenium-y.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-2743148266197090320</guid><pubDate>Mon, 21 Nov 2011 17:03:00 +0000</pubDate><atom:updated>2011-11-25T17:14:27.256-03:00</atom:updated><title>Jornadas Data Mining</title><description>&lt;p&gt;El pasado 27 y 28 de octubre, en la Facultad de Ciencias Exactas de la UBA, se organizaron las sextas jornadas de Data Mining. Como estoy cursando algunas materias de la &lt;a href="http://www-2.dc.uba.ar/materias/mdmkd/index_1024.html"&gt;Maestría en DM&amp;amp;KD&lt;/a&gt;, fui invitada a participar de las conferencias y las capacitaciones que se ofrecieron.&lt;br /&gt;A continuación presento un resumen de los paneles que me interesaron.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ian Witten- Wikipedia&lt;br /&gt;&lt;/strong&gt;Ian Witten es profesor de Computer Science en la Universidad de Waikato, Nueva Zelanda.&lt;br /&gt;Es un personaje muy interesante para la comunidad de mineros, ya que fue uno de los creadores de &lt;a href="http://es.wikipedia.org/wiki/Weka_(aprendizaje_autom%C3%A1tico)"&gt;WEKA&lt;/a&gt;. (Conjunto de librerías JAVA para la extracción de conocimiento desde bases de datos y realizar tareas de dataminig. Es un software desarrollado en la Universidad de Waikato bajo licencia GPL lo cual ha impulsado que sea una de las suites más utilizadas en el área en los últimos años) . &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Wikipedia es una mina de oro de información, no solo para muchos lectores, sino también para una creciente comunidad de investigadores que la reconocen como una fuente de excepcional escabilidad y utilidad. Wikipedia representa una gran inversión de tiempo y de opinión: un enorme tapiz de conceptos y relaciones en constante evolución. Muchos la vemos como poco confiable, sin embargo el nivel de precisión en sus conceptos es similar al de la Enciclopedia Británica. Ian presentó Wikipedia como una nueva forma de democratizar el conocimiento. El saber fue custodiado hasta el 1500 por la religión, luego paso a ser exclusividad de la academia, finalmente ahora, en la era digital, el saber estaría en manos de la gente.&lt;br /&gt;Destacó también que Wikipedia posee una estructura de links muy rica, pues brinda através de sus artículos explicaciones, investigaciones y serendipity ( hallazgos afortunados e inesperados).&lt;br /&gt;Habló de "wikificación": incrementar un documento de texto con los hipervínculos correspondientes a los artículos de Wikipedia - como si el documento fuera en sí mismo un artículo de Wikipedia. Wikipedia puede ser utilizado para determinar la relación semántica entre conceptos. "Wikificar" documentos es explotar los enlaces internos de Wikipedia para obtener información relacional y sus textos de anclaje como información léxica.&lt;br /&gt;Es interesante destacar que Witten es precursor en la temática de bibliotecas digitales y es quien actualmente está a cargo del Laboratorio de Biblioteca Digital de la Universidad de Waikato, Nueva Zelanda. Allí se están desarrollando proyectos de interés. Entre ellos, el software &lt;a href="http://www.greenstone.org/"&gt;Greenstone &lt;/a&gt;que ha ayudado a difundir la tecnología de bibliotecas digitales en todo el mundo, con especial énfasis en los países en desarrollo.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Curso de WEKA&lt;br /&gt;&lt;/strong&gt;Uno de los dos días de las jornadas fue dedicado a un curso práctico de Weka. A cargo de Ian Witten.&lt;br /&gt;En el curso de Weka, se describieron conceptos fundamentales como overfitting y evaluación. Se mostraron algoritmos simples de aprendizaje automático, modelado estadístico, arboles de decisión, reglas de asociación, modelos lineales y clustering. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Morosidad&lt;/strong&gt;&lt;br /&gt;Hubo una charla acerca de riesgo de morosidad, donde se presentó un proyecto que trata con todos los riesgos relacionados al pago tardío. Administrar estos riesgos asociados a los clientes es un proceso continuo basado en la observación y análisis del comportamiento. Las consecuencias financieras de ser más eficientes en el proceso de cobranza impactan directamente en la facturación y la rentabilidad de la compañía, y también están vinculadas a la relación con los clientes.&lt;br /&gt;Se explicaron conceptos de Payment Risk dentro de las áreas de prevención de pago tardío y optimización del proceso de cobranza.&lt;br /&gt;Con esta solución se busca colaborar con las decisiones de aceptación de clientes y ajuste de límites de créditos. Se busca también reducir los costos en los procesos de recupero de deuda y minimizar los tiempos.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Social Network Analysis&lt;/strong&gt;&lt;br /&gt;Otro tema de interés fue la presentación de técnicas de SNA , aplicadas al desarrollo de modelos en la industria de telecomunicaciones.&lt;br /&gt;Las personas que son afines entre sí -es decir, que pertenecen a determinado grupo social- comparten gustos, ideales y visiones.&lt;br /&gt;Por lo tanto si un miembro de ese grupo adquiere determinado equipo o ringtone o juego o inclusive, abandona el servicio, es probable que los otros miembros de ese grupo también lo hagan.&lt;br /&gt;El análisis de las redes sociales, determinadas por los llamados y mensajes de celular de una persona, permite identificar dichos grupos y los líderes de los mismos. En esta charla vimos cómo se utiliza el análisis de Redes Sociales en los modelos predictivos, y la mejora obtenida respecto a los modelos tradicionales que no utilizan dicha información.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Visualización&lt;br /&gt;&lt;/strong&gt;Finalmente alumnos de la maestría presentaron trabajos. Algunos alumnos participaron en el concurso organizado por &lt;a href="http://visualizeit.wordpress.com/2011/10/25/visweek-2011-vast-challenge/"&gt;VAST CHALLENGE 2011&lt;/a&gt;. Esta competencia es una de las iniciativas de la IEEE para impulsar la innovación de herramientas gráficas que resuelvan situaciones de la vida real. El desafío consistía en analizar conjuntos de datos y resolver problemas utilizando visualizaciones. En concreto, había que analizar secuencias de ataques a una red informática. Uno de los trabajos logró una mención especial por parte del comité evaluador del concurso. En la charla se presentó este trabajo: uso de mapas de calor y gráficos de coordenadas paralelas los cuales permitieron identificar eventos relevantes en los conjuntos de datos. Estos gráficos fueron desarrollados en Canvas y Processing. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-2743148266197090320?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/J2yA2yXZ1gc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/J2yA2yXZ1gc/jornadas-data-mining.html</link><author>noreply@blogger.com (Lucila Santos)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/11/jornadas-data-mining.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-5121585859588179749</guid><pubDate>Thu, 29 Sep 2011 14:20:00 +0000</pubDate><atom:updated>2011-09-29T11:20:19.932-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MVC</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>Asp.Net MVC Pipeline</title><description>Allá por Marzo del año pasado en lo que llamamos &lt;a href="http://blog.tercerplaneta.com/2010/08/debates-que-enriquecen.html"&gt;WebCrucijadas 2010&lt;/a&gt;,&amp;nbsp;&lt;span class="apple-style-span"&gt;hablamos un poco sobre Asp.Net MVC e intenté sintetizar el flujo de una aplicación Asp.Net MVC típica (en realidad es válido para casi cualquier framework web MVC).&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;span class="apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CACDc6wOYMQ/ToRyW03UiMI/AAAAAAAAA-I/Lld6igS6K48/s1600/aspnetmvcflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-CACDc6wOYMQ/ToRyW03UiMI/AAAAAAAAA-I/Lld6igS6K48/s400/aspnetmvcflow.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Este diagrama (pseudo-diagrama de flujo) es una supersimplificación que sirve como material introductorio. Pero el motivo del post es compartir un diagrama (mucho más profesional :)) que twitteó&amp;nbsp;&lt;a href="http://twitter.com/DanWahlin"&gt;@DanWahlin&lt;/a&gt;&amp;nbsp;que muestra con detalle el pipeline de Asp.Net MVC (es decir, la parte izquierda del gráfico anterior).&lt;br /&gt;
&lt;br /&gt;
El gráfico en PDF:&lt;br /&gt;
&lt;a href="http://www.simple-talk.com/content/file.ashx?file=6068"&gt;Asp.Net MVC Pipeline&lt;/a&gt;&lt;br /&gt;
y el artículo de&amp;nbsp;Simone Chiaretta con una explicación muy buena de cada paso del flujo (en inglés):&lt;br /&gt;
&lt;a href="http://www.simple-talk.com/dotnet/.net-framework/an-introduction-to-asp.net-mvc-extensibility/"&gt;An Introduction to ASP.NET MVC Extensibility&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
El artículo trata sobre la extensibilidad de la plataforma (que es destacable), de hecho el autor comienza afirmando "Si no estás extendiendo (Asp.Net MVC), no lo estás haciendo bien".&lt;br /&gt;
Sin embargo creo que conocer el pipeline es muy importante para arquitectos, programadores o cualquier otro perfil técnico.&lt;br /&gt;
De la misma forma que era vital entender el pipeline en WebForms para evitar darse la cabeza contra la pared, creo que es fundamental entender con cierta profundidad el pipeline de MVC para "moverse con soltura" en este nuevo framework.&lt;br /&gt;
&lt;br /&gt;
En cuanto a la parte derecha del primer gráfico, afortunadamente se trata de un front-end html+css+js (¿todavía no existe un acrónimo ingenioso para este stack?) para el cual se aplican los mismos lineamientos de cualquier otra plataforma web moderna.&lt;br /&gt;
&lt;br /&gt;
En un futuro, incluso podría tratarse de &lt;a href="http://www.codeandbeyond.org/2011/09/que-significan-windows-8-y-su-nuevo.html"&gt;una aplicación "Metro"&lt;/a&gt;&amp;nbsp;html+css+js (un acrónimo urgente!) &lt;b&gt;nativa &lt;/b&gt;para Windows 8.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-5121585859588179749?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/BEwgdKpwKK4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/BEwgdKpwKK4/aspnet-mvc-pipeline.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-CACDc6wOYMQ/ToRyW03UiMI/AAAAAAAAA-I/Lld6igS6K48/s72-c/aspnetmvcflow.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/09/aspnet-mvc-pipeline.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-7102482023328713079</guid><pubDate>Tue, 31 May 2011 15:34:00 +0000</pubDate><atom:updated>2011-05-31T12:34:31.003-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">Bookmarklet</category><category domain="http://www.blogger.com/atom/ns#">IE7</category><category domain="http://www.blogger.com/atom/ns#">Profiling</category><category domain="http://www.blogger.com/atom/ns#">Debugging</category><category domain="http://www.blogger.com/atom/ns#">HTML</category><category domain="http://www.blogger.com/atom/ns#">IE6</category><title>Bookmarklets: FireBug Lite y DOM Monster</title><description>2 &lt;a href="http://es.wikipedia.org/wiki/Bookmarklet"&gt;Bookmarklets &lt;/a&gt;para la barra de favoritos del desarrollador web.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_FmQ7sFgB48g/RskNce_uTVI/AAAAAAAAA8M/jSqSgNMRykQ/s400/91364-utility-belt_400.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_FmQ7sFgB48g/RskNce_uTVI/AAAAAAAAA8M/jSqSgNMRykQ/s320/91364-utility-belt_400.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;con bookmarklets la barra de favoritos puede ser tu Baticinturón&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Firebug Lite&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://getfirebug.com/firebuglite"&gt;http://getfirebug.com/firebuglite&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Firebug Lite es una versión de Firebug (herramientas de desarrollo para FireFox) escrita totalmente en javascript que puede ser cargada en cualquier browser, particularmente aquellos que no carecen de tales herramientas, por ej. &lt;a href="http://www.theie6countdown.com/default.aspx"&gt;IE6&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Firebug Lite puede agregarse como bookmarklet:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Zsmynog0v1U/TeT6JEk79hI/AAAAAAAAA3o/K42K3sRWCMY/s1600/firebugbookmarklet.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="327" src="http://2.bp.blogspot.com/-Zsmynog0v1U/TeT6JEk79hI/AAAAAAAAA3o/K42K3sRWCMY/s400/firebugbookmarklet.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;y al hacer click en el bookmarklet:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-g7XtWQgJf4o/TeT62ByjVnI/AAAAAAAAA3w/ACNvm8ofqjQ/s1600/firebugbookmarklet-on.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="520" src="http://3.bp.blogspot.com/-g7XtWQgJf4o/TeT62ByjVnI/AAAAAAAAA3w/ACNvm8ofqjQ/s640/firebugbookmarklet-on.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Genial! Inspección de HTML, CSS y Javascript, edición en tiempo real de estilos, consola javascript. Lamentablemente la magia no existe y no es posible debuggear javascript, monitorear requests, y otras features que no son posibles sin una mayor integración con el browser.&lt;br /&gt;
&lt;br /&gt;
Con la inspección de HTML y CSS es posible encontrar rápidamente esas inconsistencias tan divertidas en&amp;nbsp;&lt;a href="http://www.theie6countdown.com/default.aspx"&gt;IE6 &lt;/a&gt;o&amp;nbsp;IE7&amp;nbsp;como por ejemplo: &lt;a href="http://www.highdots.com/forums/cascading-style-sheets/ie-7-empty-div-will-234192.html"&gt;En IE6 y 7 los divs vacíos no respetan el atributo height si tienen width&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;DOM Monster&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://mir.aculo.us/dom-monster/"&gt;http://mir.aculo.us/dom-monster/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
otro Bookmarklet interesante (y totalmente diferente) es DOM Monster, al invocar el DOM Monster en cualquier página, éste ejecuta una serie de evaluaciones y muestra un reporte bastante interesante sobre posibles optimizaciones a HTML y Javascript.&lt;br /&gt;
Los creadores promocionan una &lt;a href="http://javascriptrocks.com/performance/"&gt;trilogía de libros&lt;/a&gt; sobre la optimización de Javascript como complemento, pero DOM Monster es &lt;a href="https://github.com/madrobby/dom-monster"&gt;open source&lt;/a&gt;. Podemos inclusive "forkearlo" y agregar nuestras propias reglas, no es más que un gran &lt;a href="https://github.com/madrobby/dom-monster/blob/master/src/dommonster.js"&gt;archivo Javascript&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Si bien tienen algunos puntos en común con herramientas como &lt;a href="http://pagespeed.googlelabs.com/"&gt;PageSpeed &lt;/a&gt;o &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt;, DOM Monster hace un análisis estático (por eso puede funcionar como bookmarklet) y pone el foco en la estructura del HTML+ CSS y el código Javascript.&lt;br /&gt;
&lt;br /&gt;
CUIDADO: La ejecución por primera vez de este tipo de herramientas puede herir sentimientos :)&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-K1ttTbGO4XY/TeUHHmQTHSI/AAAAAAAAA34/fTSrXL1ZY9M/s1600/dommonster.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-K1ttTbGO4XY/TeUHHmQTHSI/AAAAAAAAA34/fTSrXL1ZY9M/s1600/dommonster.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;buuuuuuuh!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Un reporte de ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_gGckdW7M4g/TeUCdqoiPHI/AAAAAAAAA30/ckYvPVHQGYg/s1600/DOMMonster-on-tercerplanetacom.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_gGckdW7M4g/TeUCdqoiPHI/AAAAAAAAA30/ckYvPVHQGYg/s1600/DOMMonster-on-tercerplanetacom.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-7102482023328713079?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/nbpmFO1dAtM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/nbpmFO1dAtM/bookmarklets-firebug-lite-y-dom-monster.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_FmQ7sFgB48g/RskNce_uTVI/AAAAAAAAA8M/jSqSgNMRykQ/s72-c/91364-utility-belt_400.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/05/bookmarklets-firebug-lite-y-dom-monster.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-698664703849040004</guid><pubDate>Fri, 27 May 2011 19:04:00 +0000</pubDate><atom:updated>2011-05-27T16:10:10.760-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">Progressive Enhancement</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><category domain="http://www.blogger.com/atom/ns#">Arquitectura</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Web projects</category><category domain="http://www.blogger.com/atom/ns#">Node.js</category><title>Dos modelos de aplicaciones web</title><description>Hace casi un mes se realizó (en Portland, OR, EEUU) la &lt;a href="http://2011.jsconf.us/"&gt;JSConf 2011&lt;/a&gt;, y estuve leyendo sobre algunas de las presentaciones, algunas muy interesantes, ya no es novedad que éste es un momento muy especial para el mundo Javascript.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;NodeConf&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Un poco al margen de esta nota es destacable que a continuación de la JSConf se realizó la &lt;a href="http://nodeconf.com/"&gt;NodeConf&lt;/a&gt;, cada una de 2 días de duración, una pauta de la importancia que está cobrando &lt;a href="http://nodejs.org/"&gt;Node.js,&lt;/a&gt; lo cual también puede verse en el impresionante crecimiento en la cantidad de &lt;a href="https://github.com/joyent/node/wiki/modules"&gt;modulos desarrollados por terceros&lt;/a&gt;, más de 20 se agregaron en los últimos 9 días).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Dos estilos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Volviendo al JSConf, quiero compilar en este artículo uno de los temas que vi emerger en varios blogs de los asistentes, y es la aparición a lo largo de la conferencia de 2 estilos distinguibles de aplicaciones web, en lo que al cliente se refiere (no voy a hablar de Asp.Net, PHP, Node.js o Ruby on Rails, sino de HTML+CSS+JS).&lt;br /&gt;
&lt;br /&gt;
Si bien no tienen nombres definidos voy a nombrar estos estilos por sus rasgos más representativos, voy a hablar de aplicaciones "Progressive Enhancement" (en adelante PE) y aplicaciones "MVC", "MVVM" o "MVVMC" (en adelante MVC), describiendo sus características quedará más claro a que me refiero.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Aplicaciones "Progressive Enhancement"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El termino "Progressive Enhancement" hace referencia a una práctica muy difundida en JavaScript en la que las páginas se descargan al cliente con funcionalidad básica, una vez completada la descarga mediante Javascript, se incrementa de forma &lt;b&gt;progresiva&lt;/b&gt;&amp;nbsp;la usabilidad, y en algún caso la funcionalidad a medida que se detecta soporte en el navegador para las tecnologías requeridas.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo simple: imaginemos una página en la que se le solicita al usuario ingresar su ubicación geográfica para ofrecerle algún servicio. Siguiendo el principio de "Progressive Enhancement" podría estar construída de esta manera:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;La página llega al cliente con un simple textbox en el cual el usuario ingresa su dirección (calle y número), al hacer click en enviar el formulario se envía al server, en el server se traduce esa dirección en coordenadas geográficas invocando por ej. a la API de Google Maps. Luego se devuelve al cliente una página con la dirección normalizada a modo de confirmación.&lt;/li&gt;
&lt;li&gt;En caso de detectar un cliente de escritorio o con suficiente resolución de pantalla se agrega a la página de confirmación un mapa (como imagen estática) con la ubicación encontrada señalada, ésta imagen puede generarse con la Static API de GMaps.&lt;/li&gt;
&lt;li&gt;Si se detecta en el navegador soporte para Javascript, al completarse la descarga del formulario se agrega debajo del textbox un mapa interactivo de GMaps dónde el usuario puede seleccionar su ubicación haciendo click en el mapa.&lt;/li&gt;
&lt;li&gt;Si luego de detectarse soporte para Javascript se detecta también soporte para geo-localización (HTML5) se utiliza este servicio para obtener la ubicación actual y mostrarla como valor default en el mapa.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
El resultado es que el cliente obtiene la mejor experiencia posible en base a las capacidades del navegador/dispositivo que utiliza.&lt;br /&gt;
&lt;br /&gt;
Típicamente se trata de páginas que en su mínima expresión se comportan como páginas con HTML (y CSS) &amp;nbsp;que permite navegar, manipular o enviar contenido con los elementos disponibles del HTML estático (anchors y forms). Y van incrementando su usabilidad, responsividad e inclusive su funcionalidad, a medida que se detecta soporte para Javascript, manipulación del DOM, procesamiento de información del lado cliente, comunicación asincrónica con el server (AJAX) y otras técnicas soportadas por las APIs de HTML5 (como geolocalización, modo "offline" o base de datos local).&lt;br /&gt;
&lt;br /&gt;
PE tiene el mismo objetivo que "Graceful Degradation" pero utiliza el camino reverso, con "Graceful Degradation" la página llega al cliente en su "máxima expresión" y se maneja de la manera más "agraciada" posible la falta de soporte del cliente presentando alternativas de menores requerimientos. A la larga la experiencia del usuario puede ser similar con ambos approaches, pero PE es a veces visto como una evolución de GD por hacer a un mejor diseño y uso eficiente de los recursos, pero ambos pueden ser convenientes según el escenario.&lt;br /&gt;
&lt;br /&gt;
Finalmente cabe mencionar que PE o GD no sólo aplican a Javascript o APIs HTML5, también aplica a diferentes resoluciones de pantalla (como muestra el punto 2 del ejemplo), o al uso de estilos más sofisticados de CSS3 (gradientes, esquinas redondeadas, etc.). Dejo este tipo de PE/GD para otro momento ya que son transversales al tema de este artículo ya que aplican a tanto a las que llamé aplicaciones PE como MVC. Quedaría para otro artículo en que hablemos por ejemplo de el uso condicional de estilos usando&amp;nbsp;&lt;a href="http://www.modernizr.com/"&gt;modernizr&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La construcción de aplicaciones PE suele estar soportada por el uso extensivo de frameworks como jQuery, Prototype o MooTools (o una combinación de microframeworks). A la hora de implementar los diferentes items de "mejora" progresiva es importante respetar la buena práctica de "&lt;a href="http://www.jibbering.com/faq/notes/detect-browser/"&gt;Feature detection over Browser Sniffing&lt;/a&gt;", es decir utilizar siempre la detección de soporte para una deteminada API en lugar de intentar detectar el nombre o versión del navegador (ya sea en base a&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;window.navigator &lt;/span&gt;o a la existencia de cierta función). Existen algunas librerías para facilitar el uso de "Feature detection",&amp;nbsp;&lt;a href="http://www.modernizr.com/"&gt;modernizr &lt;/a&gt;es la más famosa&amp;nbsp;(&lt;a href="http://www.asp.net/learn/whitepapers/mvc3-release-notes#tu-Modernizr"&gt;ahora se incluye por default en los proyectos Asp.Net Mvc 3&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
En conclusión, todo esto no es en realidad ninguna sorpresa, todas las aplicaciones web que usamos a diario han migrado o están migrando a este estilo, el cual seguramente siga siendo predominante por mucho tiempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Aplicaciones MVC o MVVM&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Por otro lado, existe otro estilo marcadamente diferente del anterior. Se trata de aplicaciones que implementan el patrón MVC (Model-View-Controller) o alguna variante MVVM (Model-View-ViewModel), MVVMC (Model-View-ViewModel-Controler) completamente del lado del cliente, el resultado es una arquitectura similar a la que permiten otras plataformas RIA, como Silverlight (véase Silverlight MVVM) o JavaFX pero con las ventajas de basarse únicamente en HTML+CSS+JS.&lt;br /&gt;
&lt;br /&gt;
En estas aplicaciones toda la lógica de presentación se encuentra en el cliente, lo que permite utilizar como BackEnd nada más que una capa de servicios REST+JSON que se encargue de lógica de negocios, persistencia, y conectividad con otros servicios (agrego un diagrama de arquitectura más adelante).&lt;br /&gt;
&lt;br /&gt;
Generalmente se trata de aplicaciones que se descargan como una única página html (single-page apps), que contiene el layout principal. Luego se realiza la carga e de algun framework JavaScript MVC (Backbone, Sproutcore, JavascriptMVC) o MVVM (Knockout.js, Batman.js).&lt;br /&gt;
Generalmente se encargan de coordinar el envío y recepción de datos via AJAX, y actualizar la UI (vistas) mediante el uso algún motor de templates para Javascript (&lt;a href="http://api.jquery.com/category/plugins/templates/"&gt;jQuery.templates&lt;/a&gt;, &lt;a href="http://embeddedjs.com/"&gt;EJS&lt;/a&gt;, &lt;a href="https://github.com/janl/mustache.js"&gt;mustache&lt;/a&gt;) o mediante la manipulación de bloques html decorados con metadata (clases css o atributos data-*), vistas "template-less".&lt;br /&gt;
&lt;br /&gt;
Este última modalidad (template-less) es el caso de &lt;a href="http://batmanjs.org/"&gt;Batman.js&lt;/a&gt;, un framework MVVM cuya uso de "Convention over Configuration" le da una simplicidad increíble, les recomiendo ver &lt;a href="http://batmanjs.org/alfred.html"&gt;alguno de los ejemplos&lt;/a&gt; que hay en la página oficial. Sólo les falta mejorar un poco el logo!&lt;br /&gt;
&lt;br /&gt;
En general, estos frameworks permiten definir modelos de entidades, aplicar databinding bidireccional, y configurar algún manejo de persistencia (por ejemplo Batman.js permite seleccionar entre almacenamiento local (HTML5), websockets (lo que permite colaboración en tiempo real) o el uso de un adaptador para otras bases de datos).&lt;br /&gt;
&lt;br /&gt;
Cada vez vemos más aplicación HTML con UI complejas (en su estructura y en su interactividad) el resultado suele ser un caótico rejunte de scripts (ya sea en files separados o embebidos) formada principalmente por una serie de métodos que manejan el input del usuario a traves eventos DOM: muchas líneas como éstas:&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$('#refresh').click(function(e) {&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;});&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$('.item-row').hover(function(e) {&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;});&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$('#btn-send').click(function(e) {&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; $.ajax({...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;success: function(data){&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $('#item-list').empty()&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.append(...)&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.children('.item')&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&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; .css({color:'red'}).end()&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.fadeIn(function(){&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&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; $('#progressbar').hide();&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;});&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;(Nótese la clásica "pirámide" con callback asincrónico incluído)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;Afortunadamente este problema es muy antigüo y como suele suceder existe un patrón que lo resuelve muy bien. El problema es simplicar la construcción de interfaces de usuario inherentemente complejas y el patrón más conocido para atacarlo es MVC y lo hace mediante la aplicación de SoC (separación de responsabilidades).&amp;nbsp;Con lo cual no debería sorprender el surgimiento de éstas librerías.&lt;br /&gt;
&lt;br /&gt;
A diferencia de las anteriores éstas aplicaciones están pensadas para proveer una experiencia de usuario al nivel de las aplicaciones de escritorio, pero con todas las bondades de la web, portabilidad, actualizaciones, sandboxing, etc. (hasta acá el lema de cualquier plataforma RIA) pero con la simplicidad de desarrollar sobre los estándares HTML+CSS+JS, stack que hoy en día todo desarrollador y diseñador web se ve obligado a dominar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Escenarios&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Quizás sea demasiado pronto para identificar escenarios recomendados para uno y otro (al menos para mí) pero si se puede ir pensando en los trade-offs entre un estilo y el otro. Pero antes de empezar a hacer comparaciones es importante la siguiente consideración: no se trata de modelos excluyentes, ambos pueden convivir en una aplicación (inclusive en una misma página!), en vez de en 2 modelos alternativos podríamos pensar en un gradiente como este:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JbP74dKUrM4/Tdv7e5Q8mqI/AAAAAAAAA3Y/RL1e1coDpco/s1600/HTMLApplicationGradient.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/-JbP74dKUrM4/Tdv7e5Q8mqI/AAAAAAAAA3Y/RL1e1coDpco/s400/HTMLApplicationGradient.png" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En un extremo del gradiente se ubican páginas de HTML estático, cuya única forma de interacción son links y formularios "planos", sin javascript. Salvo que se trate de un web site simple (en opuesto a una web application), tendremos en el server gran parte de la lógica de presentación y de navegación, y también prácticamente toda la lógica de negocios, la "responsividad" no es su fuerte y depende de la conexión.&lt;br /&gt;
&lt;br /&gt;
En el otro extremo podemos ubicar las aplicaciones puramente MVC, en las que toda la lógica de presentación se maneja del lado cliente, así como una parte de la lógica de negocios, la responsividad es óptima y no depende de la conexión, inclusive pueden trabajar "offline" de forma esporádica o permanente.&lt;br /&gt;
&lt;br /&gt;
Dónde están las aplicaciones "Progressive Enhancement"? Cómo se ve en el gráfico se "mueven" adaptativamente (según las capacidades de cada navegador) en un rango del gradiente, la granularidad y la amplitud del rango dependerá de como sean construídas en base a requerimientos.&lt;br /&gt;
&lt;br /&gt;
Sobre el gradiente señale algunas de las variables (que encontré más significativas) que se crecen o decrecen con este gradiente, anticipándome a lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Trade-offs&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Portabilidad&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Esta es a primera vista una ventaja evidente del primer estilo, ya que a esto apunta PE. Las aplicaciones construídas de esta manera se adaptan dinámicamente a las capacidades del navegador o dispositivo cliente.&lt;br /&gt;
Sin embargo es probable que éste punto se vuelva cada vez menos decisivo con el tiempo.&lt;br /&gt;
Las aplicaciones MVC tienden a requerir motores Javascript más poderosos y dependiendo del caso algunos features de HTML5, sin embargo ambas cosas son cada vez más fáciles de encontrar en cualquier dispositivo moderno.&lt;br /&gt;
En computadores personales, el único escollo son las versiones de Internet Explorer, 6, 7 y 8, que desaparecen más lento de lo que quisiéramos:&amp;nbsp;&lt;a href="http://deathtoie6.com/"&gt;http://deathtoie6.com/&lt;/a&gt;. Sin embargo es posible actualizarse en todas las plataformas. En WinXP sólo puede llegarse hasta IE8, pero puede instalarse Chrome y otros navegadores en sus últimas versiones.&lt;br /&gt;
Todos las nuevas versiones de navegadores salen a competir con rimbombantes benchmarks de sus motores Javascript (IE9 es el último en incorporarse a esta especie de "guerra fría" y lo hizo con una comparación de IE9 vs Chrome (al estilo desafío Pecsi) en una de las Keynotes del MIX2011. Y en el keynote de Google I/O 2011 también hubo una demostración en este sentido).&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;En los dispositivos móviles de última generación (IPad, IPhone, Android, RIM, etc.) motores Javascript modernos y soporte para HTML5 es más fácil de encontrar que cualquier plugin de tecnologías RIA (Flash, Silverlight). Inclusive ya hay herramientas para construir aplicaciones usando HTML+CSS+JS que logran el mismo "look and feel" y acceden a las mismas APIs que las aplicaciones nativas en todas estas plataformas moviles (&lt;a href="http://www.phonegap.com/"&gt;PhoneGap,&amp;nbsp;&lt;/a&gt;&lt;a href="http://www.appcelerator.com/"&gt;AppCelerator Titanium&lt;/a&gt;)&amp;nbsp;y con Android es probable que dento de poco podamos dispongamos de HTML5+CSS3+JS en TVs, heladeras y lavarropas :)&lt;/div&gt;&lt;br /&gt;
Por todo esto, las ventajas en portabilidad a la hora de implementar PE empiezan a desdibujarse.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SEO&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Este es punto está claramente a favor de PE y probablemente siempre lo esté. Las aplicaciones MVC simplemente no son indexables al igual que las demás tecnologías RIA, salvo que se recurra a los mismos "trucos" que se utilizan hoy en día en otras RIA, que implican en mayor o menor medida duplicar, o generar un duplicado del contenido que sea indexable.&lt;br /&gt;
Si SEO es importante para nosotros necesitamos que nuestro sitio pueda moverse dignamente hasta el extremo izquierdo del gradiente, sin embargo hay que tener en cuenta lo siguiente: si nuestra aplicación es SEOdependiente, hay grandes chances de que estemos hablando del tipo de website que no se beneficia mucho de una arquitectura MVC, un sitio (o la parte de un sitio!) que presenta y permite navegar a través de contenidos no es un escenario muy tentador para MVC de todas formas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Experiencia de Usuario&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Si bien con PE buscamos mejorar hasta dónde sea posible la experiencia de usuario, claramente este punto lo ganan las aplicaciones MVC, en los que la experiencia es del nivel de las aplicaciones de escritorio. Claro que es posible "mejorar progresivamente" una página hasta que las diferencias desaparezcan, pero si lo hacemos es posible que nos acerquemos al problema del siguiente punto:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Servicios REST+JSON como BackEnd&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Simplicidad&lt;/u&gt;&lt;/div&gt;&lt;div style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Si al construir el cliente web usando MVC transformamos nuestro BackEnd en un servicio REST+JSON&lt;br /&gt;
&lt;div style="display: inline !important;"&gt;&amp;nbsp;se mantiene toda la lógica de presentación en el cliente y se simplifican algunos problemas relacionados con la conservación de estado, como el manejo del sesiones, el ViewState, etc. el diseño del BackEnd se reduce a un caso trivial de SOA.&lt;/div&gt;&lt;/div&gt;&lt;div style="font-weight: normal;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;u&gt;Interoperabilidad&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Basándonos en un BackEnd REST+JSON podemos mantener el más alto nivel de interoperabilidad sin demasiado trabajo extra, ya que este tipo de servicio puede ser consumido fácilmente por otro tipo de aplicaciones (de escritorio (WPF), RIAs (Silverlight), procesos batch, un widget nativo para IPhone, etc, etc), y habilitando requests cross-origin (para los recursos/operaciones deseados) tenemos una API web pública que puede ser consumida desde otros sitios web.&lt;br /&gt;
Por lo general en aplicaciones web convencionales el agregado de una API pública implica duplicación de trabajo agreando un servicio de estas características.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Disponibilidad&lt;/u&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Al eliminarse la dependencia del server para la renderización de contenido, mantenemos a tiro la posibilidad de implementar un modo offline que utilize datos locales (ej. HTML5 Isolated Storage, WebSQL)&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Performance&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando PE es posible ahorrar muchos requests, pero sobretodo se mejora la "performance percibida" (Responsividad). Pero utilizando MVC también se reduce el tráfico de red al mínimo, la separación entre datos (JSON) y HTML no sólo permite transmitir únicamente la información necesaria, sino que ahora el contenido estático (y por lo tanto cacheable en el cliente) además de imágenes, scripts (.js) y estilos (.css) &amp;nbsp;también incluye el HTML (layouts y templates)&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Escalabilidad&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Además de la reducción de tráfico y el uso del cache cliente, se libera al server de la tarea de renderizar html, los clientes hacen trabajar al server sólo lo necesario (para solicitar datos que no se encuentran localmente, para persistirlos, para comunicarse con otros).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Separation of Concerns o Separación de Responsabilidades&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Este es la característica esencial del patrón MVC con lo cual no es extraño que incluya este punto. Si bien el título es SoC podríamos hablar más ampliamente de simplicidad y elegancia del diseño tanto del modelo de programación como de la arquitectura.&lt;br /&gt;
Basta con mirar la claridad que se logra en los ejemplos que diferentes frameworks MVC presentan, cualquier programador que haya trabajado en aplicaciones cuya interfaz HTML adquiere cierta complejidad habrá sentido la necesidad de un modelo superador que simplifique el código escrito.&lt;br /&gt;
Además llevando el patrón MVC al cliente podemos eliminar la "impedancia" que produce la división de nuestra capa de presentación entre servidor y cliente.&lt;br /&gt;
Esta impedancia es la misma que Asp.Net WebForms busca disminuir abstrayendo la interacción con el usuario web en un modelo de programación que se asemeja al de una aplicación WinForms (de escritorio), sin embargo quiénes hayan tenido sus luchas con el ciclo de vida y el manejo del view state, entenderán que la impedancia no desaparece.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;Para terminar de ilustrar la diferencia desde el punto de vista arquitectónico en este diagrama muestro como estos dos estilos de aplicación HTML (PE y MVC) pueden impactar en la arquitectura de las aplicaciones que las soportan:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--bN8M7DD41I/Td_VP1TCw9I/AAAAAAAAA3k/6lro1GUzKe8/s1600/ArquitecurasWebserverMVCvsclientMVC.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/--bN8M7DD41I/Td_VP1TCw9I/AAAAAAAAA3k/6lro1GUzKe8/s640/ArquitecurasWebserverMVCvsclientMVC.png" width="507" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Utilicé&amp;nbsp;colores anaranjados para indicar componentes que son especificos de (es decir, deben ser desarrollados para) cada aplicación.&lt;/div&gt;&lt;div&gt;Estos diagramas no deben tomarse como la única combinación posible, sino de un ejemplo de la forma que tomará típicamente la arquitectura de la aplicación para soportar un caso u otro.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Madurez&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Este es quizás el punto que más juega en contra de los frameworks Javascript MVC existentes, las aplicaciones PE son en realidad lo más cercano a una aplicación web tradicional, es un camino muy recorrido, y esto implica las ventajes usuales:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Experiencias previas, sin importar el problema que encaremos, seguramente encontraremos el camino muy allanado&lt;/li&gt;
&lt;li&gt;Hay muchos profesionales preparados para trabajar de esta forma y también muchos dispuestos a ayudarnos en distintas comunidades online.&lt;/li&gt;
&lt;li&gt;Herramientas, muchas y muy maduras&lt;/li&gt;
&lt;/ul&gt;De todas formas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Las aplicaciones MVC/MVVM adquieren masa crítica muy rápidamente, probablemente ésta se convierta en la plataforma RIA de facto, no por ser la mejor de todas, los estándares en que se basa, las marcas que lo soportan, lo hacen un caso típico de &lt;a href="http://en.wikipedia.org/wiki/Self-fulfilling_prophecy"&gt;profecía autocumplida&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No se trata de un entorno totalmente desconocido, se trata de HTML+CSS+JS, es en los frameworks existentes y librerías de funcionalidades aledañas (template engines, storage, etc.) dónde está la inmadurez&lt;/li&gt;
&lt;li&gt;En cuanto entornos de desarrollo:&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;La evolución de herramientas de desarrollo en los navegadores ha hecho mucho más ameno desarrollar (y sobretodo debuguear) este tipo de aplicaciones&lt;/li&gt;
&lt;li&gt;En la mayoría de las IDEs existentes existe un soporte razonable para escribir Javascript, Para VisualStudio 2010 existen algunas mejoras al respecto:&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/04/08/javascript-intellisense-improvements-with-vs-2010.aspx"&gt;Intelissense&lt;/a&gt;&amp;nbsp;con background compilation!&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jsdoc-toolkit-vsdoc/"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Adaptador de JsDoc para VisualStudio&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugin para&amp;nbsp;&lt;a href="http://jsoutlining.codeplex.com/"&gt;Outlining&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Todo parece indicar que si bien las aplicaciones que llame "Progressive Enhancement" seguirán siendo las predominantes, empezaremos a ver una coexistencia entre ambos tipos de aplicaciones, y seguramente haya muchas novedades sobre frameworks Javascript MVC/MVVM/MVVM.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Si alguno tuvo alguna experiencia en el uso de Javascript MVC en proyectos reales me encantaría que la compartan,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Saludos&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-698664703849040004?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/elkAUJJyNwE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/elkAUJJyNwE/dos-modelos-de-aplicaciones-web.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-JbP74dKUrM4/Tdv7e5Q8mqI/AAAAAAAAA3Y/RL1e1coDpco/s72-c/HTMLApplicationGradient.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/05/dos-modelos-de-aplicaciones-web.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-168742640001291307</guid><pubDate>Fri, 11 Feb 2011 14:06:00 +0000</pubDate><atom:updated>2011-02-11T11:06:57.413-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">Aprendizaje</category><category domain="http://www.blogger.com/atom/ns#">UnitTesting</category><category domain="http://www.blogger.com/atom/ns#">Koan</category><category domain="http://www.blogger.com/atom/ns#">QUnit</category><category domain="http://www.blogger.com/atom/ns#">Programación</category><title>Coding Koan - La (no tan misteriosa) senda del programador Zen</title><description>Recientemente en una nota en &lt;a href="http://www.codeandbeyond.org/"&gt;Code&amp;amp;Beyond&lt;/a&gt; se hablabla sobre &lt;a href="http://es.wikipedia.org/wiki/K%C5%8Dan"&gt;Koans&lt;/a&gt; para programadores.&lt;br /&gt;
Los Koans son una especie secuencias de ejercicios, pensados para guiar la meditación Zen.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.codeandbeyond.org/2011/02/meditacion-programatica-koans.html"&gt;http://www.codeandbeyond.org/2011/02/meditacion-programatica-koans.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Algunas personas están trasladando este concepto a la programación, estos Koans para programadores son una batería de tests unitarios inicialmente fallidos,&lt;br /&gt;
Un software asiste al aprendiz (un framework de unit testing, más algun plugin o pieza de software específica) para hacer pasar los tests uno por uno.&lt;br /&gt;
Cada test obliga a aprender algo nuevo, es una forma de aprendizaje excelente.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí". Confucio&lt;/blockquote&gt;&lt;br /&gt;
&lt;div style="color: black;"&gt;Los hay sobre diversos temas, y sobre diferentes lenguajes de programación en la nota hay links para varios de ellos, me pareció interesante el de JavaScript. Es un lenguaje con mala fama, y parte de eso se debe a que es muy utilizado esporádicamente por desarrolladores web, y no siempre con atención a las "buenas prácticas".&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;JavaScript Koans&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Existe todo un movimiento por tomar JavaScript "en serio", como una serie de buenas prácticas que suelen englobarse con el nombre de "&lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;Unobstrusive Javascript&lt;/a&gt;".&lt;br /&gt;
Esto combinado algunos proyectos recientes que hacen pensar que JavaScript sea quizás el único lenguaje necesario: V8, &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; (que tiene ahora un versión para .Net , Node.Net), &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;, etc.&lt;br /&gt;
(Esto es tema para otro post!)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/liammclennan/JavaScript-Koans#readme"&gt;https://github.com/liammclennan/JavaScript-Koans#readme&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Primeros pasos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Se baja el zip (Download), y después de descomprimirlo al abrir jskoans.htm se ve lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yvZRkKi-2p8/TVU2VuOXgzI/AAAAAAAAA1c/g4eBxmgRdig/s1600/jskoans1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-yvZRkKi-2p8/TVU2VuOXgzI/AAAAAAAAA1c/g4eBxmgRdig/s1600/jskoans1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Nota: como vemos este Koan usa QUnit, un framework de Unit Testing para JavaScript, es por ej. el utilizado por jQuery.&lt;br /&gt;
&lt;br /&gt;
Siguiendo la sugerencia, abrimos&amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;'topics/about_asserts.js'&lt;span class="Apple-style-span" style="font-size: 19px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;y hacemos algunas correciones:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/822331.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Actualizamos la página ...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6u-INkEOu8Y/TVU66u2dEgI/AAAAAAAAA1g/HPs5OKD2Mno/s1600/jskoans2.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6u-INkEOu8Y/TVU66u2dEgI/AAAAAAAAA1g/HPs5OKD2Mno/s1600/jskoans2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exito!, vemos el resultado positivo de los tests modificados, y ahora que aprendimos lo básico sobre los Asserts, se nos presenta el próximo desafío ("About Equality"), el Koan continúa asi sucesivamente. Éste consta de 14 tópicos, algunos que a veces sorprenden como &lt;i&gt;closures &lt;/i&gt;o&lt;i&gt; prototypal inheritanc&lt;/i&gt;e.&lt;br /&gt;
&lt;br /&gt;
Una forma muy efectiva y entretenida (después de todo, ambas cosas van de la mano) de aprender y enseñar. Además los koans por estar basados en Unit Tests son mucho más fáciles de mantener actualizados, lo que resulta un problema frecuente en materiales didácticos, al menos en esta industria.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-168742640001291307?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/lFhaLoSJwww" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/lFhaLoSJwww/coding-koan-la-no-tan-misteriosa-senda.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-yvZRkKi-2p8/TVU2VuOXgzI/AAAAAAAAA1c/g4eBxmgRdig/s72-c/jskoans1.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/02/coding-koan-la-no-tan-misteriosa-senda.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-7757943685929175826</guid><pubDate>Mon, 17 Jan 2011 15:05:00 +0000</pubDate><atom:updated>2011-01-17T12:07:17.963-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Intercambio</category><category domain="http://www.blogger.com/atom/ns#">Coding Dojo</category><category domain="http://www.blogger.com/atom/ns#">Pair Programming</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>Resolviendo un desafío en equipo</title><description>&lt;p&gt;En Noviembre pasado, &lt;a href="http://www.kinetica-solutions.com/" target="_blank"&gt;Kinética Solutions&lt;/a&gt; nos hizo partícipe de una capacitación, sobre Test Driven Development (TDD), que brindó a su equipo de trabajo. &lt;/p&gt;  &lt;p&gt;Esta capacitación se dividió en dos jornadas: la primera consistió en una charla introductoria del tema, la segunda fue un Workshop con el formato “Coding Dojo” para practicar un poco de Test Driven Development (TDD).&lt;/p&gt;  &lt;p&gt;En este artículo les contaré la experiencia de los participantes de TercerPlaneta con el “Coding Dojo”. &lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;  &lt;h4&gt;¿Que es “Coding Dojo”?&lt;/h4&gt;  &lt;p&gt;Un Coding Dojo es una sesión de codificación centrada alrededor de un &lt;strong&gt;desafío de programación&lt;/strong&gt;, de &lt;strong&gt;alcance pequeño&lt;/strong&gt;. &lt;strong&gt;Todos&lt;/strong&gt; los asistentes a esta sesión participan en la codificación para resolver el desafío planteado.&lt;/p&gt;  &lt;p&gt;El &lt;strong&gt;objetivo&lt;/strong&gt; es &lt;strong&gt;aprender, enseñar y mejorar&lt;/strong&gt; nuestras &lt;strong&gt;habilidades de programación&lt;/strong&gt;, compartiendo conocimiento y experiencia con otros desarrolladores de software, en un ambiente relajado.&lt;/p&gt;  &lt;p&gt;La versión de &lt;strong&gt;Coding Dojo&lt;/strong&gt; que propuso &lt;a href="http://www.kinetica-solutions.com/" target="_blank"&gt;Kinetica Solutions&lt;/a&gt; es &lt;strong&gt;Randori&lt;/strong&gt;, la misma consiste en utilizar una única computadora y un proyector. Los participantes de la sesión, en parejas, van utilizando la computadora durante una cantidad de tiempo fija y acotada, para codificar una porción de código de la solución. Una vez concluido el tiempo, dejan lugar a otra pareja de programadores para que continúen con el desafío.&lt;/p&gt;  &lt;h4&gt;Resolviendo el desafío&lt;/h4&gt;  &lt;p&gt;El desafío propuesto fue:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Llevar los puntos de un partido de tenis&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;sencillo, no?&lt;/p&gt;  &lt;p&gt;Todos conocíamos cómo se llevan los puntos en un partido de tenis, con lo cual el primer paso para entender el alcance estaba dado, y así podíamos comenzar a resolver el problema&lt;/p&gt;  &lt;p&gt;Para la dinámica del workshop se definieron 10 minutos para que la pareja de “piloto y co-piloto” se adueñen de la computadora y codifiquen un test (recordemos que estábamos haciendo TDD) y el código correspondiente para que pase el test.&lt;/p&gt;  &lt;p&gt;Las parejas no se formaron al inicio del taller, sino que se iban formando a medida que comenzaba un nuevo período de tiempo. Rápidamente dos participantes, en forma voluntaria, se proponían para pasar a la computadora, y entre ellos decidían quien haría de piloto, haciéndose cargo del teclado y mouse, y por lo tanto el otro voluntario actuaría de co-piloto, aportando en el armado del código. Juntos decidían qué probar, mientras el resto del auditorio podía aportar ideas, pero siendo respetuosos ya que los “dueños” del código durante los 10 minutos de cada sesión, eran los “dueños temporales” de la computadora.&lt;/p&gt;  &lt;p&gt;Una vez que se llegó a la mitad de la sesión, hicimos una Retrospectiva, con el objetivo de realizar los ajustes necesarios para completar el desafío en la siguiente mitad. Algunos cambios que surgieron fueron:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;tener 2 minutos de “yapa” para terminar de desarrollar la idea; &lt;/li&gt;    &lt;li&gt;la pareja que pasa a la computadora primero deja en claro para todos lo que va a hacer; &lt;/li&gt;    &lt;li&gt;para la misma pareja, se intercambian los roles de piloto y co-piloto. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En la segunda mitad, se llevaron a cabo los cambios propuestos y se logró que todos conozcan mas y puedan participar mejor en la resolución del desafío planteado.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Moraleja&lt;/h4&gt;  &lt;p&gt;A pesar que no se completó la resolución del desafío planteado, sí se pudo cumplir con los objetivos del Coding Dojo: mejorar las habilidades de programación y hacerlo en un entorno distendido. &lt;/p&gt;  &lt;p&gt;En particular, a los integrantes de Tercer Planeta, nos brindó la posibilidad de aprender un poco mas acerca de la dinámica detrás de TDD y participar en un workshop con el formato  Coding Dojo.&lt;/p&gt;  &lt;p&gt;Además, nos permitió compartir con nuestros colegas de Kinetica Solutions una actividad mas, la cual fue muy enriquecedora:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="color:#000000;"&gt;intercambiamos experiencias en la generación y uso de pruebas unitarias&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;hicimos pair programming con chicos de Kinetica&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;nos ayudó a hacer hincapié en tener claro qué codificar antes de “tirar” líneas de código&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;nos permitió interactuar con otros desarrolladores compartiendo un momento ameno, distendido y divertido&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;fue interesante codificar frente a un auditorio y recibir consejos, ayuda y opiniones&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;el espíritu que reinó durante el taller fue que todos, como un solo equipo, teníamos el objetivo de resolver el desafío.&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;¡Agradecemos la invitación y esperamos que se repita pronto!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-7757943685929175826?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/ZKPJkxK3CCc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/ZKPJkxK3CCc/resolviendo-un-desafio-en-equipo.html</link><author>noreply@blogger.com (Nora Martinez)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2011/01/resolviendo-un-desafio-en-equipo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-1014779175008232802</guid><pubDate>Wed, 24 Nov 2010 14:36:00 +0000</pubDate><atom:updated>2010-11-26T10:36:05.603-03:00</atom:updated><title>Jornadas Anuales  Versión 2010</title><description>Acercándonos a diciembre, todos nos encontramos planificando reuniones y despedidas.&lt;br /&gt;Nadie deja de celebrar de alguna manera el cierre del año. Fiestita, happy hour, eventos de todo tipo y color. También evaluaciones de objetivos, controles de desempeño.&lt;br /&gt;&lt;br /&gt;Nuestra empresa no escapa a la tradicional costumbre, pero dándole un toque distintivo. No nos conformamos con un simple brindis ni con el animador de turno. Tampoco queremos terminar el año sin hacer una retrospectiva del mismo.&lt;br /&gt;Por eso es ya una obligación escaparnos de la vorágine laboral hacia algún punto turístico. Playa o campo, lo importante es compartir un mini break con la gente de la oficina. Queremos hacer un preview de las vacaciones y simultáneamente repasar el trabajo de los últimos meses.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0msT4VVPI/AAAAAAAAAAM/GHOWSOPqQfE/s1600/ellugar.JPG"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 98px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5543129259055600882" border="0" alt="" src="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0msT4VVPI/AAAAAAAAAAM/GHOWSOPqQfE/s320/ellugar.JPG" /&gt;&lt;/a&gt; Con este espíritu nos encaminamos este año hacia La Posesiva, un antiguo casco de estancia en Capilla del Señor dedicado ahora al turismo. Lo primero que se nos propuso en la charla inicial al llegar fué detenernos un poco y disfrutar del lugar, como premio a un año difícil y de muchísimo trabajo.&lt;br /&gt;Empanadas, asado, alguna jineteada, ping pong y por supuesto metegol! Todo esto para lograr concentrarnos en el tarea de descansar y divertirnos.&lt;br /&gt;&lt;br /&gt; Todo este despliegue de tiempo libre suscita más de un resquemor. No deberíamos estar evaluando los objetivos de la empresa? Cuáles fueron los puntos débiles del trabajo del año? Cómo estuvimos en comunicación?&lt;br /&gt;Mejoramos en la implementación de las nuevas tecnologías? Pues bien, este año la consigna fue 'no hablar' de todo esto. Simplemente descansar, olvidarnos de las presiones diarias y pasar un buen rato.&lt;br /&gt;&lt;br /&gt;Después de todo un día sin 'hacer' nada, la llegada de &lt;a href="http://ar.linkedin.com/in/carolaherrscher" target="_blank"&gt;Carola Herrscher&lt;/a&gt; una de nuestras coach de Nuevas Miradas, parecía el momento de corte para empezar a hablar de algo serio. Reunidos el viernes a la mañana, nos propuso jugar a 'El teléfono descompuesto'. Contar una historia a un integrante, y esté debe representársela a otro. Este último a su vez re actúa lo entendido para un tercero. Finalmente el que termina debe explicar con palabras el cuento original a toda la audiencia.&lt;br /&gt;&lt;br /&gt;Después de divertirnos un rato comprobando nuestras dotes actorales,terminamos el juego, tratando de descubrir algún mensaje o metáfora. Pero esto fué tarea para cada uno. Caro simplemente condujo. No dijo nada ...&lt;br /&gt;&lt;br /&gt;Segundo juego : las manos en la masa! &lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5543131822699458786" border="0" alt="" src="http://4.bp.blogspot.com/_lZhqRmToIvM/TO0pBiMqMOI/AAAAAAAAAAU/4CGvsfibFNk/s320/ManosMasa.JPG" /&gt;&lt;br /&gt;Arcilla. Una buena hora para desarrollar capacidades creativas. Por cierto muy enterradas o inexistentes en algunos, increíbles en otros. Pero faltaba lo mejor: romper todo lo hecho! Seguir el trabajo de otro! Volver a empezar otra obra! Finalmente ... la construcción de la casa entre todos. Cada uno armó algo, todos aportamos y nos dimos cuenta de lo difícil que es armar algo coherente sin ponernos de acuerdo y planificar antes ... En fin, nuevamente Caro dijo poco, pero todos nos divertimos y no nos dimos cuenta que habíamos pasado toda la mañana trabajando.&lt;br /&gt;&lt;br /&gt;Mientras todos jugábamos, Andrea y José trabajaban intensamente. Dedicaron un buen rato de su tiempo para charlas individuales con cada uno. La idea de estos encuentros es hacer una especie de 'evaluación de desempeño'. Con su estilo directo y sencillo, nos ayudaron a ver los logros. Que por cierto no son pocos, hacia afuera y dentro de la empresa. Con tanta asertividad, lograron que cada uno se propusiera buenas metas para el 2011 ...&lt;br /&gt;&lt;br /&gt;Conclusiones después de estos dos días?&lt;br /&gt;&lt;br /&gt;Qué difícil es no hacer nada 'serio' y no hablar de nada filosófico!&lt;br /&gt;Es raro no evaluar, corregir ni planificar. Pero qué importante es conocer a los otros desde otra óptica. Respetar este tiempo de silencio. Darnos cuenta que en la acción conjunta está el valor, y que el ver a otros de una manera distinta enriquece al grupo y a cada uno.&lt;br /&gt;&lt;br /&gt;Después de un año de trabajo intenso con el tema de la comunicación, la integración y profundizando en distintas metodologías de trabajo este corte 'formalmente informal' fue más que positivo.&lt;br /&gt;&lt;br /&gt;Que es repita!!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0qZYEFHxI/AAAAAAAAAAk/TQ1i0hSDIiY/s1600/Todos2.JPG"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5543133331807608594" border="0" alt="" src="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0qZYEFHxI/AAAAAAAAAAk/TQ1i0hSDIiY/s320/Todos2.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0pQSkpe-I/AAAAAAAAAAc/U7ot_MBCqxU/s1600/Todos2.JPG"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-1014779175008232802?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/VHfzyZkcIXM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/VHfzyZkcIXM/jornadas-anuales-version-2010.html</link><author>noreply@blogger.com (Lucila Santos)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lZhqRmToIvM/TO0msT4VVPI/AAAAAAAAAAM/GHOWSOPqQfE/s72-c/ellugar.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/11/jornadas-anuales-version-2010.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-1024056687729936379</guid><pubDate>Mon, 08 Nov 2010 19:03:00 +0000</pubDate><atom:updated>2010-11-17T16:53:10.897-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Intercambio</category><category domain="http://www.blogger.com/atom/ns#">Brasil</category><category domain="http://www.blogger.com/atom/ns#">XP</category><category domain="http://www.blogger.com/atom/ns#">Scrum</category><category domain="http://www.blogger.com/atom/ns#">Agile</category><title>Visitando Giran</title><description>&lt;span style="color: black;"&gt;A principios de este año fue lanzado internamente en Tercer Planeta, la iniciativa "PAI".&lt;br /&gt;
PAI no implica nuestra conversión a la religión Umbanda, sino que se trata de las siglas Profesionalismo, Apertura e Intercambio.&lt;br /&gt;
Sin entrar en demasiados detalles, cómo parte de esta iniciativa incurrimos en muy diversas acciones, por ejemplo:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;Charlas de intercambio de "know-how", con grupos de desarrollo internos en nuestros clientes:&amp;nbsp;&lt;a href="http://blog.tercerplaneta.com/2010/09/intercambiando-experiencias.html"&gt;http://blog.tercerplaneta.com/2010/09/intercambiando-experiencias.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;span style="color: black;"&gt;
&lt;li&gt;Asesorarnos por expertos a la hora de acompañar el crecimiento profesional de nuestro equipo:&amp;nbsp;&lt;a href="http://blog.tercerplaneta.com/2010/07/como-entendemos-el-crecimiento.html"&gt;http://blog.tercerplaneta.com/2010/07/como-entendemos-el-crecimiento.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Organizar un mini-ciclo de charla-debate en forma conjunta con &lt;a href="http://kinetica-solutions.com/"&gt;Kinetica&lt;/a&gt;, a la cual invitamos algunos de nuestros clientes:&amp;nbsp;&lt;a href="http://blog.tercerplaneta.com/2010/08/debates-que-enriquecen.html"&gt;http://blog.tercerplaneta.com/2010/08/debates-que-enriquecen.html&lt;/a&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;PAI Mercosur&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: black;"&gt;La presentación de esta iniciativa en las oficinas de Tercer Planeta se realizó a principios de este año, mientras yo me encontraba &lt;a href="http://blog.tercerplaneta.com/2010/08/trabajo-distribuido.html"&gt;trabajando de forma remota&lt;/a&gt; desde &lt;a href="http://en.wikipedia.org/wiki/Vit%C3%B3ria,_Brazil"&gt;Vitória, Brasil&lt;/a&gt;, asi que asistí via Skype a este anuncio (empanadas acá, suco de manga allá), así fue que tuve la idea de coordinar algun tipo de intercambio con una empresa de la ciudad donde me encontraba, asi fue como buscando en algunos eventos de la comunidad ágil de la región encontré una empresa que se posicionó como referente en metodologías ágiles de Espirito Santo (estado del sudeste brasilero), &lt;a href="http://www.giran.com.br/"&gt;Giran&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Turismo Ágil&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Me puse en contacto con la idea de hacer una visita similar a las que hemos hecho con otras empresas cercanas, con el fin de intercambiar algunas ideas, y muy cordialmente me invitaron a visitarlos, lo que finalmente pude concretar el mes pasado.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="250" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?sspn=35.90509,62.050781&amp;amp;ie=UTF8&amp;amp;ei=fUTYTKnQBYGqzASnoN3wDQ&amp;amp;cd=6&amp;amp;fb=1&amp;amp;view=map&amp;amp;cid=10828090618655021804&amp;amp;z=2&amp;amp;ll=-20.281772,-40.292924&amp;amp;spn=0.006295,0.006295&amp;amp;iwloc=A&amp;amp;output=embed" width="325"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;&lt;a href="http://maps.google.com/maps?sspn=35.90509,62.050781&amp;amp;ie=UTF8&amp;amp;ei=fUTYTKnQBYGqzASnoN3wDQ&amp;amp;cd=6&amp;amp;fb=1&amp;amp;view=map&amp;amp;cid=10828090618655021804&amp;amp;ved=0CBsQpQY&amp;amp;hq=&amp;amp;hnear=&amp;amp;ll=-20.281772,-40.292924&amp;amp;spn=0.006295,0.006295&amp;amp;iwloc=A&amp;amp;source=embed" style="text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://www.giran.com.br/"&gt;Giran&lt;/a&gt;&amp;nbsp;es una empresa muy joven (cumplieron un año recientemente) y nació como una empresa enfocada no sólo en la práctica, sino también en la enseñanza y mentoring de metodologías ágiles, especialmente SCRUM + XP. Por lo cual mi visita, como supuse, fue muy fecunda.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Por el lado tecnológico usan en sus proyectos (y enseñan) Java, PHP y Ruby on Rails.&lt;br /&gt;
&lt;br /&gt;
El primer día que los visité se encontraban en medio de un sprint bi-semanal, con lo cual pude asistir, luego de&lt;br /&gt;
la charla técnica de la semana, a la reunión diaria y parte del desarrollo.&amp;nbsp;Me recibieron muy amablemente y son muy divertidos :), por supuesto, no sólo es un equipo ágil de geeks, además son brasileros!. &lt;br /&gt;
&lt;br /&gt;
Finalmente asistí a la retrospectiva de ese sprint, el cuál resulto ser un sprint con varios imprevistos, lo que hizo más interesante mi visita :)&lt;br /&gt;
&lt;br /&gt;
Me llamó la atención la ausencia total de "roces" o comentarios &lt;a href="http://en.wikipedia.org/wiki/Cover_your_ass"&gt;CYA&lt;/a&gt;&amp;nbsp;entre miembros del equipo (esperables en un sprint accidentado), y como todos los integrantes se mostraron muy involucrados en la mejora contínua del proceso SCRUM, admirable.&lt;br /&gt;
&lt;br /&gt;
De la visita me quedo con una grata experiencia y varias ideas interesantes que observé, sin duda tenemos mucho por aprender y enseñarnos, queda la puerta abierta para futuros encuentros.&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_GcXPWR_goXk/TNhAgA9rrpI/AAAAAAAAA0o/WhTWow1Wspk/s1600/2010-10-25+12.16.42.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_GcXPWR_goXk/TNhAgA9rrpI/AAAAAAAAA0o/WhTWow1Wspk/s400/2010-10-25+12.16.42.jpg" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Con parte del equipo de Giran en sus oficinas&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-1024056687729936379?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/XjpUDqiTh64" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/XjpUDqiTh64/visitando-giran.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_GcXPWR_goXk/TNhAgA9rrpI/AAAAAAAAA0o/WhTWow1Wspk/s72-c/2010-10-25+12.16.42.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/11/visitando-giran.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-6422784169859504715</guid><pubDate>Mon, 08 Nov 2010 17:19:00 +0000</pubDate><atom:updated>2010-11-12T13:11:48.123-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.Net</category><title>Trabajo en background</title><description>&lt;p&gt;Durante la construcción de una aplicación es habitual encontrarnos con procesos que son muy lentos y no dan feedback al usuario. A continuación les mostramos una de las formas de resolverlo utilizando un control que nos brinda .Net a partir de su versión 2.0: el &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.aspx"&gt;BackgroundWorker&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Caso de Uso&lt;/h4&gt;  &lt;p&gt;Una de nuestras aplicaciones tiene una pantalla donde se muestran filtros para obtener un informe que finalmente se graba en un archivo con formato Excel. Anteriormente, cuando el usuario apretaba el botón para iniciar el proceso, la pantalla se quedaba congelada hasta que la búsqueda de datos terminaba. En ese lapso de tiempo no se podía saber que estaba pasando: si se debía seguir esperando, o todo había dejado de funcionar. Aún informando “el proceso puede demorar”, después de unos instantes la aplicación comenzaba a mostrarse con el alerta de “(No Responde)”&amp;#160; y el usuario ya no sabía si seguir esperando, cancelar la ejecución de la aplicación, o en el peor de los casos reiniciar la computadora. &lt;/p&gt;  &lt;h4&gt;Por que la decisión de usar el BackgroundWorker&lt;/h4&gt;  &lt;p&gt;Al comprobar que la performance de la búsqueda ya había sido optimizada desde el motor de bases de datos, llegamos a la conclusión de que debíamos hacer algo para que la aplicación no quede inutilizable mientras se genera el reporte. Sabiendo que lo más importante del reporte&amp;#160; es el resultado final, decidimos hacer todo el proceso de búsqueda de los datos&amp;#160; en un segundo plano y así lograr que la aplicación siga funcionando sin inconvenientes, incluso para realizar otras tareas que necesiten utilizar al mismo tiempo la base de datos de la que estoy esperando la respuesta para el reporte inicialmente deseado.&lt;/p&gt;  &lt;p&gt;A pesar que no es ampliamente configurable y adaptable a todo tipo de necesidades, como podría serlo una solución que maneje varios hilos de ejecución desarrollada manualmente, el &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.aspx" target="_blank"&gt;BackgroundWorker&lt;/a&gt; tiene una serie de ventajas muy prácticas para nuestra necesidad en particular y nos evita, entre otras cosas,&lt;u&gt; planear la solución ideal para el problema&lt;/u&gt; y escribir “bastante” código para manejar hilos de ejecución lo cual es sumamente delicado ya que debemos tener en cuenta el ciclo de vida de cada hilo (y no perder ninguno en el camino),&amp;#160; la comunicación entre distintos hilos de ejecución, validar y manejar posibles errores, etc..&lt;/p&gt;  &lt;p&gt;Todo esto sumado a que solo necesitamos realizar una única tarea indivisible, que consume mucho tiempo y no podríamos mejorar eso con más hilos de ejecución nos llevó a tomar la decisión de inclinarnos por el &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.aspx" target="_blank"&gt;BackgroundWorker&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Manos a la obra&lt;/h4&gt;  &lt;p&gt;Veamos cómo en pocos pasos y sin mucho esfuerzo podemos obtener una aplicación que utilice varios hilos de ejecución.&lt;/p&gt;  &lt;p&gt;Inicialmente nuestro código lucía así.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_F67APmX9ii0/TNgxBpACDDI/AAAAAAAAADY/7n4G9sS-SZk/s1600-h/image4.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="142" alt="image" src="http://lh3.ggpht.com/_F67APmX9ii0/TNgxCS0dQXI/AAAAAAAAADc/UA8-dcFR_l8/image_thumb2.png?imgmax=800" width="457" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lo primero que debemos hacer es agregar un control &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.aspx"&gt;BackgroudWorker&lt;/a&gt; en el designer del form y configurar los eventos a usar.&amp;#160; Básicamente en nuestro ejemplo utilizamos dos:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_F67APmX9ii0/TNgxC5Rr4fI/AAAAAAAAADg/dKXUQsRpxP8/s1600-h/Eventos4.jpg"&gt;&lt;img title="Eventos" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="145" alt="Eventos" src="http://lh4.ggpht.com/_F67APmX9ii0/TNgxDiOJTwI/AAAAAAAAADk/V_Yyh8xlUYQ/Eventos_thumb2.jpg?imgmax=800" width="346" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.dowork.aspx"&gt;DoWork&lt;/a&gt; : Evento lanzado desde el código para realizar las tareas asincrónicas&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.runworkercompleted.aspx"&gt;RunWorkerCompleted&lt;/a&gt; : Evento lanzado por el control una vez finalizada la ejecución de las tareas asincrónicas.&lt;/p&gt;  &lt;p&gt;Una vez hecho ésto lo único que resta hacer es reorganizar el código:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_F67APmX9ii0/TNgxEh0drEI/AAAAAAAAADo/z2Kll3uX8Fo/s1600-h/FinalCode19.jpg"&gt;&lt;img title="FinalCode" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="233" alt="FinalCode" src="http://lh3.ggpht.com/_F67APmX9ii0/TNgxFHvqxlI/AAAAAAAAADs/RwHxBxw-kMg/FinalCode_thumb13.jpg?imgmax=800" width="440" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si observan con atención al hacer clic en el botón&amp;#160; invocamos al método &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.runworkercompleted.aspx"&gt;RunWorkerAsync&lt;/a&gt; que se encarga del manejo de hilos y realización de tareas en background lanzando el evento &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.dowork.aspx"&gt;DoWork&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Antes debemos verificar que el control no se encuentre trabajando actualmente, de esta forma evitamos un error.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_F67APmX9ii0/TNgxFaK2zdI/AAAAAAAAADw/v4wmOJw9RTA/s1600-h/image13.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="98" alt="image" src="http://lh5.ggpht.com/_F67APmX9ii0/TNgxGBPkNNI/AAAAAAAAAD0/L84tqRzyFhI/image_thumb8.png?imgmax=800" width="440" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En el evento &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.dowork.aspx"&gt;DoWork&lt;/a&gt; indicamos cuáles son las tareas que se ejecutan asincrónicamente, en nuestro caso hacemos el llamado a la base de datos.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="86" alt="image" src="http://lh6.ggpht.com/_F67APmX9ii0/TNgxHnKzxwI/AAAAAAAAAD4/JRBE6u06jN0/image_thumb7.png?imgmax=800" width="443" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;Vale aclarar que contamos con la opción de pasar como parámetro un objeto a través del &lt;u&gt;&lt;a href="http://msdn.microsoft.com/es-ar/library/h01xszh2.aspx"&gt;RunWorkerAsync&lt;/a&gt;&lt;/u&gt; que es recibido dentro del &lt;a href="http://msdn.microsoft.com/es-ar/library/13a7z7z8(VS.95).aspx"&gt;DoWorkEventArgs&lt;/a&gt;. Esto puede ser de utilidad si necesitamos tener acceso al estado de objetos definidos en nuestro primer hilo de ejecución.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_F67APmX9ii0/TNgxC5Rr4fI/AAAAAAAAADg/dKXUQsRpxP8/s1600-h/Eventos4.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Finalmente en el evento &lt;a href="http://msdn.microsoft.com/es-ar/library/system.componentmodel.backgroundworker.runworkercompleted.aspx"&gt;RunWorkerCompleted&lt;/a&gt; colocamos todas las tareas que&amp;#160; debemos realizar una vez que se ejecutaron todas las tareas asincrónicas. En nuestro ejemplo, como ya obtuvimos los datos debemos generar el reporte&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_F67APmX9ii0/TNgxIJLoqnI/AAAAAAAAAD8/LjLasDDrAV4/s1600-h/image25.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="111" alt="image" src="http://lh4.ggpht.com/_F67APmX9ii0/TNgxIpbphRI/AAAAAAAAAEA/uPj5WRdXxOc/image_thumb18.png?imgmax=800" width="441" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Conclusión:&lt;/h4&gt;  &lt;p&gt;El BackgroundWorker nos brinda la posibilidad de que nuestras aplicaciones WinForms sean más “ágiles” y luzcan más “veloces“ en la realización de tareas que demandan demasiado tiempo, siendo además su implementación muy sencilla.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_F67APmX9ii0/TNgxEh0drEI/AAAAAAAAADo/z2Kll3uX8Fo/s1600-h/FinalCode19.jpg"&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-6422784169859504715?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/_uPsv6Q7esQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/_uPsv6Q7esQ/trabajo-en-background_08.html</link><author>noreply@blogger.com (Matías Timossi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_F67APmX9ii0/TNgxCS0dQXI/AAAAAAAAADc/UA8-dcFR_l8/s72-c/image_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/11/trabajo-en-background_08.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-583905853963848836</guid><pubDate>Tue, 14 Sep 2010 14:55:00 +0000</pubDate><atom:updated>2010-09-15T09:55:19.094-03:00</atom:updated><title>Intercambiando experiencias</title><description>&lt;p&gt;Parte del valor agregado de la empresa es su preocupación (o mejor dicho ocupación) por ensayar cosas nuevas, siempre probando las ultimas tecnologías y metodologías. &lt;/p&gt;  &lt;p&gt;Uno de los objetivos que nos impusimos para este año es abrir Tercer Planeta al mundo. Es decir, intentar dar a conocer más lo que ocurre acá adentro (las prácticas que utilizamos, los experimentos técnicos y los problemas con los que nos enfrentamos) y al mismo tiempo poder aprender de las experiencias de otros grupos de desarrollo. Para esto nos propusimos varios hilos de acción, entre ellos escribir mas seguido en este blog. &lt;/p&gt;  &lt;p&gt;Otro hilo, el que nos ocupa en este post, fue armar un encuentro de intercambio de experiencias con el equipo de desarrollo de uno de nuestros clientes.&lt;/p&gt;  &lt;p&gt;La idea en este primer encuentro fue juntarnos para que cada equipo presente dos temas que consideraba que era interesante mostrarle al otro. Después de una previa coordinación de temas y logística, encaramos el encuentro con la participación de todos los desarrolladores de cada equipo.&lt;/p&gt;  &lt;h3&gt;Desarrollo&lt;/h3&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;El encuentro arrancó con un “check in” donde contamos los objetivos del encuentro. Luego cada uno se presentó, esto es importante para desarrollar cualquier charla pero en este caso también fue la oportunidad de conocer la cara detrás de los mails!&lt;/p&gt;  &lt;p&gt;Después expusimos intercalando una presentación por equipo. &lt;/p&gt;  &lt;p&gt;Nuestro equipo presentó dos temas: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Un Sprint en 3p: Armamos una presentación donde contamos las metodologías que aplicamos en un sprint de un proyecto. En la misma mostramos la implementación que hacemos de las reuniones diarias, la planificación, el desarrollo, el uso de los pizarrones, la demo y la retrospectiva entre otras prácticas aplicadas. &lt;/li&gt;    &lt;li&gt;BackgroundWorker: el uso del control, ventajas y desventajas y los problemas con los que nos enfrentamos al implementarlo. Este control facilita el manejo de distintos hilos de ejecución (próximamente tendremos un artículo del blog que profundice sobre este control) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;El otro equipo de desarrollo presentó:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Controles customizables: Una muestra de los nuevos controles DevExpress (para mas informacion ver &lt;a href="http://www.devexpress.com/"&gt;http://www.devexpress.com/&lt;/a&gt;) que utilizan y las ventajas para el usuario que traen. Estos controles brindan la posibilidad de que el usuario les cambie los colores, los cambie de lugar, etc., guardando esta configuración para poder tener siempre la aplicación como cada usuario prefiere verla. &lt;/li&gt;    &lt;li&gt;SpreadsheetGear: El uso de las nuevas clases de SpreadsheetGear (para mas informacion ver &lt;a href="http://www.spreadsheetgear.com/"&gt;http://www.spreadsheetgear.com/&lt;/a&gt;) usada para generar reporte en Excel. También nos mostraron algunos agregados que hicieron a estas clases para poder resolver algunos pedidos de los reportes.&amp;#160; &lt;/li&gt;    &lt;li&gt;Envío de mails: Formas de realizar el envío de mails desde una aplicación, los problemas con los que se encontraron y las configuraciones necesarias. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Todas las presentaciones contaron con momentos de debate y preguntas que sirvieron para enriquecer el intercambio. En esos momentos aprovechamos los conocimientos y experiencias de cada uno, que por suerte son muy diversos, para aportar a las presentaciones y hacer preguntas que ayuden a profundizar los temas planteados.&lt;/p&gt;  &lt;p&gt;Al finalizar propusimos armar una retrospectiva en 3 columnas: Lo que me gusto de la charla, lo que me gustaría que pase en la próxima charla y lo que nos comprometemos a hacer para el próximo encuentro. La idea fue tomarnos diez minutos para pensar que cosas estuvieron buenas del encuentro y que cosas nos interesaría profundizar, por ejemplo: temas técnicos (como Silverlight o la velocidad en las páginas web) y otros relacionados con la dinámica de los encuentros. Al final votamos y pusimos objetivos puntuales para un próximo encuentro: proponer distintas metodologías que se pueden utilizar e intentar resolver entre todos algún problema técnico que tenga alguno de los dos equipos en un desarrollo.&lt;/p&gt;  &lt;p&gt;En la retrospectiva tuvimos visiones bastante parecidas, varias de las cosas que salieron podríamos agruparlo en lo positivo que fue el conocer las metodologías de trabajo de cada equipo y, por otro lado, lo interesante de ver distintas miradas de un mismo problema.&lt;/p&gt;  &lt;h3&gt;Conclusión&lt;/h3&gt;  &lt;p&gt;Lo interesante del encuentro fue poder mostrar los problemas con los que nos enfrentamos y poder aprovechar las diferentes visiones para aportar soluciones. &lt;/p&gt;  &lt;p&gt;Es muy interesante ver como trabajan los distintos equipos de desarrollo y como para un mismo problema se encuentran distintas soluciones. &lt;/p&gt;  &lt;p&gt;Otro aspecto positivo de estos encuentros es que es muy motivante ya que ayuda a valorar el trabajo que uno hace cotidianamente y a ver otras cosas muy interesantes que uno en el trabajo del día a día no llega a poder profundizar.&lt;/p&gt;  &lt;p&gt;También nos ayuda a conocernos más con el cliente y generar una relación de mayor confianza que mejora el trabajo diario. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-583905853963848836?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/7dM8BgDFDg4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/7dM8BgDFDg4/intercambiando-experiencias.html</link><author>noreply@blogger.com (Marcelo Waisbaum)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/09/intercambiando-experiencias.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-6904040622903855844</guid><pubDate>Mon, 06 Sep 2010 13:25:00 +0000</pubDate><atom:updated>2010-09-10T15:17:51.118-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Metodologias</category><category domain="http://www.blogger.com/atom/ns#">Scrum</category><category domain="http://www.blogger.com/atom/ns#">Agile</category><category domain="http://www.blogger.com/atom/ns#">Retrospectiva</category><title>Aprendiendo un poco más acerca de la Retrospectiva</title><description>&lt;div style="color: rgb(51,51,51)"&gt;&lt;span style="font-size: 100%"&gt;Recientemente leí el libro &amp;quot;Agile Retrospective&amp;quot; de Esther Derby y Lana Larsen. Me resultó interesante, sencillo de leer, lleno de conceptos claros y principalmente, con ideas y consejos para poner en práctica. Está fundamentalmente orientado hacia los que dirigen una retrospectiva, acercándoles herramientas y conocimiento para facilitar su labor.&lt;/span&gt;&lt;/div&gt; &lt;span style="font-size: 100%"&gt;   &lt;div style="color: rgb(51,51,51)"&gt;     &lt;br /&gt;Al libro lo podemos dividir en dos partes: la primera presenta las habilidades y consideraciones que tendría que tener aquella persona que lidere una retrospectiva; la segunda parte describe algunas actividades que se pueden llevar a cabo durante las diferentes etapas de una retrospectiva.       &lt;br /&gt;      &lt;br /&gt;En este artículo dejo algunas anotaciones que me parecieron mas interesantes y útiles para remarcar, acerca de la primer parte.       &lt;br /&gt;      &lt;br /&gt;&lt;/div&gt;   &lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;Acerca de la retrospectiva&lt;/strong&gt;&lt;/span&gt;       &lt;br /&gt;La retrospectiva es una reunión que se lleva a cabo cuando termina un hito (iteración, release, proyecto), en la cual participan los miembros del equipo. Su fin es lograr que los participantes hagan una revisión de lo que pasó, inspeccionen y adapten sus métodos de trabajo y su forma de trabajar como equipo para incrementar la calidad del producto y mejorar el trabajo y la calidad de vida de los miembros. &lt;/span&gt;&lt;/span&gt;  &lt;div style="color: rgb(51,51,51)"&gt;&lt;span style="font-size: 100%"&gt;Algunos puntos importantes para remarcar acerca de esta reunión:&lt;/span&gt; &lt;/div&gt;  &lt;div style="color: rgb(51,51,51)"&gt;   &lt;ul&gt;     &lt;li&gt;&lt;span style="font-size: 100%"&gt;Tiene que &lt;span style="font-style: italic; font-weight: bold"&gt;aportar valor al equipo&lt;/span&gt;, así los participantes no piensan que es una pérdida de tiempo&lt;/span&gt; &lt;/li&gt;      &lt;li&gt;&lt;span style="font-size: 100%"&gt;Hay que definir su objetivo, para&lt;span style="font-style: italic"&gt; &lt;span style="font-weight: bold"&gt;tener una meta&lt;/span&gt;&lt;/span&gt; a la cual llegar&lt;/span&gt; &lt;/li&gt;      &lt;li&gt;&lt;span style="font-size: 100%"&gt;Se tiene que establecer el tiempo de duración y respetarlo&lt;/span&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;Con respecto a quien lidere la retrospectiva, también citado como facilitador, se destaca:&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Tiene que entender su rol y las funciones inherentes al mismo&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Permanece neutral durante las discusiones&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Maneja la dinámica del grupo, permitiendo que todos participen de igual forma&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;Acerca del equipo:&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 100%"&gt;&lt;/span&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Identifican sus valores como equipo y los respetan&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Establecen acuerdos de trabajo (reglas para la colaboración y la convivencia) y son responsables por hacer que todos los respeten&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Entienden la importancia de su participación en pos de la mejora continua&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Asumen un compromiso, al finalizar la retrospectiva, para cumplir con lo acordado&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;strong&gt;Estructura de una Retrospectiva&lt;/strong&gt;&lt;/span&gt;       &lt;br /&gt;La retrospectiva puede dividirse en 5 fases o etapas:&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Setear el estado&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Recopilar datos&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Profundizar&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Decidir qué hacer&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Finalizar la retrospectiva&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="color: rgb(204,102,0); font-weight: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="color: rgb(204,102,0); font-weight: bold"&gt;Setear el estado&lt;/span&gt;       &lt;br /&gt;En esta fase el facilitador le presenta al equipo el objetivo de la retrospectiva y la agenda para poner en conocimiento cómo van a invertir el tiempo.       &lt;br /&gt;      &lt;br /&gt;La información que se recolecte lo ayudará a trabajar con el equipo en la elección de un objetivo apropiado. Lo que observe le dará las pistas acerca de qué preguntas hacer y qué problemas podría enfrentar el equipo.       &lt;br /&gt;      &lt;br /&gt;Un objetivo útil ayuda a contestar la pregunta: &amp;quot;¿Cuál será el valor que se obtenga en el tiempo que dure la reunión?&amp;quot; proporcionando una razón para que las personas inviertan su tiempo en la reunión. &lt;/span&gt;&lt;span style="font-size: 100%"&gt;Si se define un objetivo amplio ayudará al equipo a que pueda reflexionar y pensar creativamente acerca de sus experiencias y descubrir los puntos de vista que sean importantes para los integrantes.      &lt;br /&gt;      &lt;br /&gt;Evitar los objetivos que definan un resultado específico; por ejemplo, el objetivo &amp;quot;Determinar cómo persuadir a Recursos Humanos para eliminar las evaluaciones de desempeño&amp;quot;, bloquea la consideración de otros canales de acción u otros problemas que el equipo esté enfrentando.       &lt;br /&gt;      &lt;br /&gt;Algunos objetivos útiles:&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Encontrar maneras de mejorar nuestras prácticas&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Descubrir qué se hizo bien&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Entender las razones detrás de los objetivos no alcanzados&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Reconstruir relaciones dañadas&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;Se le puede solicitar al equipo que describa un objetivo.      &lt;br /&gt;En cuanto a la duración, es proporcional a la &lt;/span&gt;&lt;span style="font-style: italic; font-size: 100%"&gt;cantidad de personas&lt;/span&gt;&lt;span style="font-size: 100%"&gt; que participan de la retrospectiva y al &lt;/span&gt;&lt;span style="font-style: italic; font-size: 100%"&gt;tiempo transcurrido desde la retrospectiva anterior&lt;/span&gt;&lt;span style="font-size: 100%"&gt;. Otros factores que influyen son:&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 100%"&gt;&lt;/span&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Complejidad, en cuanto al entorno tecnológico, relaciones entre los miembros del equipo o con departamentos externos, organización del equipo&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Nivel de conflicto o controversia (planear mas tiempo para tratar temas complicados)&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;Si el tiempo es extenso, guardar &lt;span style="font-style: italic"&gt;tiempo para recreos&lt;/span&gt; entre las distintas etapas de la retrospectiva. También estar atento, durante el desarrollo de la misma, si el equipo necesita descansar unos minutos.       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%; font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;Recopilar datos&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%"&gt;Una vez que se conoce el objetivo, se crea una &lt;span style="font-style: italic"&gt;imagen compartida&lt;/span&gt; de lo que sucedió en el tiempo que se está evaluando, con esta imagen común, se puede evitar que los participantes analicen según sus propias opiniones y creencias.       &lt;br /&gt;Armar la información y eventos en forma visual, para que las personas vean fácilmente patrones y conexiones. Los hechos son una parte de la información, y la otra mitad son los sentimientos, las emociones, éstas dicen lo que es importante para las personas de los hechos y hablan acerca del equipo.       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204,102,0); font-size: 100%; font-weight: bold"&gt;Profundizar&lt;/span&gt;&lt;span style="font-size: 100%"&gt;      &lt;br /&gt;Ahora es el momento de preguntar &amp;quot;¿Por qué?&amp;quot; y comenzar a pensar acerca de soluciones para hacer de forma diferente. Es un momento en que el equipo piensa en conjunto.       &lt;br /&gt;Considerar posibilidades adicionales, no quedarse con la primer solución que aparece. Buscar las causas y efectos, y pensar más analíticamente.       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;Decidir qué hacer&lt;/span&gt;         &lt;br /&gt;&lt;/span&gt;Elegir algunas de las soluciones (2 o 3, no tienen que ser muchas) y planear qué hacer.       &lt;br /&gt;Muchas veces el equipo tiene una lista larga de mejoras pero esto puede ser contraproducente ya que tener demasiadas iniciativas pueden abrumar y entorpecer la habilidad para cambiar. El facilitador tiene que ayudar al equipo a elegir los ítems a los que pueden comprometerse y que tengan un efecto positivo.       &lt;br /&gt;Una forma de planear los experimentos y los cambios es crear&lt;span style="font-style: italic"&gt; historias o ítems para que puedan ser incluidos en el próximo plan de trabajo de la iteración&lt;/span&gt;. Esta es una forma en que se asegure que las personas se comprometan a ejecutar las tareas; sin un compromiso individual, las personas asumen que &amp;quot;el equipo&amp;quot; hará la tarea, y entonces nadie la hace.       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204,102,0); font-size: 100%; font-weight: bold"&gt;Finalizar la retrospectiva&lt;/span&gt;&lt;span style="font-size: 100%"&gt;      &lt;br /&gt;Al completar el plan de acción, terminar en forma clara la reunión. Decidir cómo documentar la experiencia y el plan a seguir.       &lt;br /&gt;Lo que se aprende le pertenece al equipo y a sus miembros. El equipo necesita adueñarse de las enseñanzas que consigue.       &lt;br /&gt;Antes de finalizar, tomarse unos minutos para evaluar la retrospectiva que se llevó a cabo (sería una retrospectiva de la retrospectiva).       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%; font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;Beneficios de esta estructura&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size: 100%"&gt;Entender los diferentes puntos de vista&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Seguir un orden natural de pensamiento&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Tomar una visión comprensiva de los métodos del equipo y sus prácticas&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Permite que las discusiones vayan adonde se necesita&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-size: 100%"&gt;Queda una acción concreta y experimentos para realizar en la próxima iteración.&lt;/span&gt; &lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;Dirigiendo Retrospectivas&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 130%"&gt;&lt;span style="font-size: 100%"&gt;     &lt;p&gt;&lt;font size="2"&gt;No se necesita ser un facilitador experto para liderar una retrospectiva, pero sí necesita contar con algunas habilidades básicas. Estas habilidades se pueden aprender, para lo cual es necesario primero entender el rol, practicar y buscar feedback para ir haciendo los cambios necesarios&lt;/font&gt;.         &lt;br /&gt;        &lt;br /&gt;&lt;font size="2"&gt;Un facilitador de retrospectiva tiene como principal responsabilidad &lt;span style="font-style: italic"&gt;dirigir el proceso&lt;/span&gt;, es decir gestionar las &lt;span style="font-style: italic"&gt;actividades, la dinámica de grupo y el tiempo&lt;/span&gt;. Él permanecerá neutral durante las discusiones, aún si tiene opiniones firmes o si son temas que le preocupan, ya que si se involucra &lt;span style="color: rgb(204,0,0)"&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;en las discusiones perderá total atención al proceso.           &lt;br /&gt;          &lt;br /&gt;Los participantes se focalizan en el contenido, discusiones, desacuerdos (pero no desagradables) y toman decisiones; apuntan a un objetivo y manejan sus propios pensamientos, sentimientos y respuestas así contribuyen positivamente a las conversaciones y al resultado.           &lt;br /&gt;          &lt;br /&gt;Si el facilitador, durante la retrospectiva, considera que tiene algo importante que ofrecer, puede contribuir en la discusión, pero antes debe ceder su rol a otro miembro. Una vez ofrecido su aporte, recuperará su rol.&lt;/font&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;Actividades            &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="color: rgb(0,0,0); font-size: 100%"&gt;En cada una de las fases se puede realizar alguna actividad para crear acuerdos de trabajo, construir una línea de eventos en el tiempo, hacer una lluvia de ideas o priorización, entre otras . &lt;span style="font-style: italic"&gt;Las actividades ayudan al equipo a pensar en conjunto&lt;/span&gt;. Será necesario introducir y explicar cada actividad, monitorear su desarrollo y sacar conclusiones al finalizarla.             &lt;br /&gt;            &lt;br /&gt;Puede ser de mucha utilidad armar un guión de la actividad y practicar las instrucciones para recordar qué decir. &lt;/span&gt;Tener presente, que como líder de la retrospectiva, es responsable de contestar todas las preguntas acerca de la actividad y monitorearla, centrándose en el nivel de ruido del grupo, mientras trabaja, para tener una pista si las personas necesitan mas tiempo o ya finalizaron.           &lt;br /&gt;          &lt;br /&gt;El sacar conclusiones de cada actividad ayudará al equipo a examinar su experiencia y extraer diferentes puntos de vista.&lt;/font&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="color: rgb(204,102,0); font-weight: bold"&gt;Manejar la Dinámica del grupo&lt;/span&gt;         &lt;br /&gt;&lt;font size="2"&gt;Está relacionado con la &lt;span style="font-style: italic"&gt;participación &lt;/span&gt;de las personas durante la reunión, asegurándose que las personas que tienen algo que decir tengan la oportunidad de decirlo y asegurarse que quien tiene demasiado para decir no domine la reunión.           &lt;br /&gt;          &lt;br /&gt;Otra faceta tiene que ver con &lt;span style="font-style: italic"&gt;estar atento al lenguaje&lt;/span&gt; que utilizan los participantes de la retrospectiva. Si éste tiende a culpar a otros, como sucede con el &amp;quot;lenguaje de vos&amp;quot; (&amp;quot;Vos rompiste el build&amp;quot;) y con las &amp;quot;etiquetas&amp;quot; (&amp;quot;Vos sos inmaduro&amp;quot;), ésto derivará en que algunos integrantes comiencen a estar a la defensiva. Estas actitudes hieren la retrospectiva, distrayendo la atención de los problemas reales.           &lt;br /&gt;          &lt;br /&gt;El facilitador tiene como función fomentar el &lt;b style="font-style: italic"&gt;lenguaje &amp;quot;Yo&amp;quot;&lt;/b&gt;, este lenguaje se centra en la experiencia y observación de la persona que habla, en lugar de etiquetar a las otras personas. Al escuchar culpas o críticas, el facilitador tiene que intervenir y redireccionar la discusión.           &lt;br /&gt;          &lt;br /&gt;Otro punto importante en la dinámica de grupo está relacionado con la&lt;span style="font-style: italic"&gt; interacción y las emociones de los miembros del equipo&lt;/span&gt;. A pesar que el facilitador no es responsable de las emociones de otras personas, es responsable por mantener una reunión productiva. Esto significa que tiene que estar preparado para manejar situaciones e interacciones emocionales.           &lt;br /&gt;          &lt;br /&gt;En la retrospectiva, lo primordial es la interacción del &lt;span style="font-style: italic"&gt;equipo como un todo&lt;/span&gt;, no de individualidades. Esto no significa que se tengan que ignorar las emociones individuales, al contrario, significa tratar con emociones en una forma que sea de ayuda y respeto al equipo y al individuo.&lt;/font&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="color: rgb(204,102,0); font-weight: bold"&gt;Manejar el tiempo&lt;/span&gt;         &lt;br /&gt;&lt;font size="2"&gt;El facilitador de una retrospectiva tiene que responder a las necesidades del grupo y prestar atención al tiempo para &lt;span style="font-style: italic; font-weight: bold"&gt;respetar el tiempo fijo&lt;/span&gt;, presentado en la agenda de la retrospectiva, en la fase &lt;span style="color: rgb(204,51,204)"&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="color: rgb(204,51,204)"&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-style: italic"&gt;Setear el estado&lt;/span&gt;.           &lt;br /&gt;          &lt;br /&gt;Si una discusión, al cumplirse el tiempo estipulado, aún no finalizó y sigue en su punto alto, el facilitador le preguntará al grupo qué desea hacer: continuar con la discusión o seguir a la siguiente fase o actividad. Ésta decisión &lt;span style="font-style: italic"&gt;queda en manos del equipo&lt;/span&gt;, no del facilitador. Generalmente, la respuesta es clara para todos; cuando no lo es, se propone limitar la discusión en curso a un tiempo fijo o revisarla luego o en otra retrospectiva.           &lt;br /&gt;          &lt;br /&gt;Dado que el facilitador tiene como responsabilidad que se llegue al objetivo de la retrospectiva (identificar y planear experimentos y mejoras), tiene que estar preparado con actividades extra de diferente duración, en caso que se requiera cambiar por una mas corta.&lt;/font&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;Manejar al facilitador            &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="2"&gt;Además de manejar las actividades, la dinámica del grupo y el tiempo, cada facilitador tiene que poder manejarse a él mismo.          &lt;br /&gt;          &lt;br /&gt;Estar atento a la dinámica de equipo e interpersonal puede resultar abrumador. No existe una técnica para manejar la dinámica del grupo (aunque sirve tener algunas estrategias). La clave radica en &lt;span style="font-style: italic; font-weight: bold"&gt;entender y manejar su propio estado emocional y sus respuestas&lt;/span&gt;, para poder mantenerse centrado en su responsabilidad.           &lt;br /&gt;          &lt;br /&gt;Cuando las emociones están en un nivel alto, el equipo necesita a alguien que esté fuera de la confusión; esa persona es el facilitador de la retrospectiva. Por lo tanto, &lt;span style="font-style: italic"&gt;tiene que mantener la calma y la claridad durante toda la reunión&lt;/span&gt;. Él mismo sabrá si necesita unos minutos de descanso para recobrar su serenidad o para oxigenarse y, de esta forma, pensar con claridad y bajar la ansiedad y tensión. Así, una vez que logre re-centrarse, podrá utilizar alguna estrategia para manejar al grupo y cumplir con su responsabilidad. Tiene que tener siempre presente que &lt;b style="font-style: italic"&gt;no es quien causa las emociones y no es responsable por hacer que todos estén felices y bien&lt;/b&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;                &lt;br /&gt;                &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(204,102,0)"&gt;&lt;span style="color: rgb(0,0,0)"&gt;Es muy práctico que cada facilitador&lt;span style="font-style: italic"&gt; &lt;span style="font-weight: bold"&gt;encuentre un tuto&lt;/span&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, en quien confie y a quien haya visto manejar las emociones en un grupo. Él lo ayudará a ganar confianza y aprender mas opciones para manejar situaciones emocionales. También le brindará el feedback que necesita para mejorar sus habilidades como facilitador.&lt;/font&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;span style="font-size: 130%"&gt;&lt;font size="3"&gt;&lt;strong&gt;Opinión personal&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;           &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;Después de haber estado en varias retrospectivas de diferentes equipos, como observadora o participante, leer el libro me ayudó a valorar la importancia del facilitador y de entender la dinámica del grupo. Si bien en las retrospectivas no había una persona que desempeñara ese rol, creo que todos los que participamos nos hicimos responsables de hacer cumplir sus funciones, como si ello fuera nuestro &amp;quot;acuerdo de trabajo&amp;quot; implícito.          &lt;br /&gt;          &lt;br /&gt;&lt;span style="font-size: 100%"&gt;El libro me parece de gran interés para aquellos que participan de retrospectiva, no solo para los que actúen de facilitadores. Creo que es útil para entender&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 100%"&gt;&lt;font size="2"&gt; un poco mas acerca del concepto y de la filosofía detrás de la retrospectiva, y además acerca de la dinámica de la misma y de sus participantes y como cada uno, desde su lugar, puede aportar para darle a la retrospectiva la importancia que tiene.&lt;/font&gt;           &lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: rgb(204,102,0)"&gt;           &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-6904040622903855844?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/dOn1YWRqWSc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/dOn1YWRqWSc/aprendiendo-un-poco-mas-acerca-de-la.html</link><author>noreply@blogger.com (Nora Martinez)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/09/aprendiendo-un-poco-mas-acerca-de-la.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-5993400516907668325</guid><pubDate>Mon, 23 Aug 2010 17:34:00 +0000</pubDate><atom:updated>2010-08-23T11:24:39.050-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Community Server</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Desarrollo Custom</category><title>Debates que enriquecen</title><description>&lt;div&gt;En marzo de este año junto con la gente de &lt;a href="http://www.kinetica-solutions.com/" target="_blank"&gt;Kinética Solutions&lt;/a&gt; organizamos en el Club del Golf un evento para compartir experiencias con algunos de nuestros clientes y colegas.&lt;br /&gt;&lt;br /&gt;Bajo el nombre &lt;em&gt;&lt;strong&gt;WebCrucijadas 2010&lt;/strong&gt;&lt;/em&gt; y en medio de un &lt;em&gt;“opíparo”&lt;/em&gt; desayuno mantuvimos un debate abierto y enriquecedor, tomando como eje principal el análisis de factores que afectan a la toma de decisiones en la implementación de proyectos Web.&lt;br /&gt;&lt;br /&gt;Para ello se presentaron 2 casos ejemplo: &lt;br /&gt;&lt;h4&gt;Desarrollos convencionales (custom) vs. Integración sobre plataformas existentes&lt;/h4&gt;En este primer ejemplo, se comparó el desarrollo convencional de aplicaciones web (soluciones custom, de punta a punta) con el uso de plataformas existentes.&lt;br /&gt;&lt;br /&gt;Para eso, &lt;a href="http://ar.linkedin.com/in/aeidelman" target="_blank"&gt;Adrián Eidelman&lt;/a&gt; de &lt;a href="http://www.kinetica-solutions.com/" target="_blank"&gt;Kinética Solutions&lt;/a&gt; mostró su experiencia en la implementación de una solución web montada sobre Community Server, resaltando pros y contras de su utilización.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;El modelo WebForms vs. el modelo MVC ASPNET&lt;/h4&gt;En el segundo ejemplo, se comparó el modelo &lt;strong&gt;&lt;em&gt;clásico&lt;/em&gt;&lt;/strong&gt; de desarrollo de aplicaciones ASPNET (WebForms, WebControls, etc.) con su &lt;em&gt;“challenger”&lt;/em&gt; más reciente, el modelo &lt;a href="http://www.asp.net/mvc" target="_blank"&gt;MVC&lt;/a&gt; para aplicaciones Web.&lt;br /&gt;&lt;br /&gt;Aquí &lt;a href="http://ar.linkedin.com/in/rdguzman" target="_blank"&gt;Ricardo D. de Guzmán&lt;/a&gt; y &lt;a href="http://ar.linkedin.com/in/benjamineidelman" target="_blank"&gt;Benjamín Eidelman&lt;/a&gt;, integrantes de &lt;a href="http://www.tercerplaneta.com/" target="_blank"&gt;Tercer Planeta&lt;/a&gt; destacaron las características conceptuales de cada uno de los dos modelos.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;¿Qué nos llevo a hacerlo?&lt;/h3&gt;La idea principal del evento fue exponer y escuchar experiencias debatiendo sobre un tema frecuente para quienes nos dedicamos al desarrollo de software, como es el de tomar decisiones sobre este tipo de tecnologías al momento de encarar un proyecto nuevo.&lt;br /&gt;&lt;br /&gt;Además buscamos agasajar a clientes y pares, con quienes llevamos recorridos varios años de trabajo conjunto, pero esta vez en un entorno distendido y lejos de las negociaciones propias de un proyecto en particular.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;¿Qué nos dejo?&lt;/h3&gt;Nos beneficiamos con el aporte de todos los participantes aprovechando los diferentes puntos de vista que ofrecieron desde la diversidad de sus perfiles.&lt;br /&gt;&lt;br /&gt;Como experiencia nos pareció muy enriquecedora y recomendable, esperamos poder organizar otra pronto. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-5993400516907668325?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/J7bBWsmeE3M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/J7bBWsmeE3M/debates-que-enriquecen.html</link><author>noreply@blogger.com (Ricardo D. de Guzmán)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/08/debates-que-enriquecen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-8871382860825110955</guid><pubDate>Wed, 18 Aug 2010 14:34:00 +0000</pubDate><atom:updated>2010-08-18T15:54:54.555-03:00</atom:updated><title>Herramientas para trabajo distribuido</title><description>En el artículo sobre &lt;a href="http://blog.tercerplaneta.com/2010/08/trabajo-distribuido.html" target="_blank"&gt;trabajo distribuido&lt;/a&gt; comentamos que estamos aplicando ésta forma de trabajo desde el 2009. Por supuesto al principio la implementación supuso varios desafíos, entre los cuales estaban sostener una comunicación fluida en el equipo, mantener el código actualizado y además llevar a cabo las &lt;a target="_blank" href="http://es.wikipedia.org/wiki/Desarrollo_%C3%A1gil_de_software"&gt;prácticas ágiles&lt;/a&gt; a las cuales estamos acostumbrados.&lt;br /&gt;¿Cuáles serían las herramientas que nos facilitarían esta tarea? A continuación hago una breve reseña de las aplicaciones que utilizamos y cómo nos ayudaron: &lt;h3&gt;&lt;span style="color:#000000;"&gt;Team Foundation Server&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/b&gt;Es una herramienta de control de código que no presenta inconvenientes a la hora de trabajar tanto en la red local como desde una conexión de Internet.&lt;/p&gt;&lt;p&gt;También cuenta con un modo de trabajo offline que funciona muy bien si por una de esas casualidades nos quedamos sin conexión. &lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/ms181238(VS.80).aspx"&gt;Team Foundation Server&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Live Mesh&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Es un sistema de sincronización de datos que nos permite mantener compartidos y actualizados los cambios que vamos realizando en archivos y carpetas de uso conjunto.&lt;/p&gt;&lt;p&gt;Principalmente nos ayudó a mantener actualizada nuestras bases de datos ya que cada uno poseía una copia local (solo de las que necesitaba) y era indispensable algún medio que nos permitiera aplicar los cambios realizados por otros miembros del equipo. &lt;/p&gt;&lt;p&gt;El procedimiento que seguimos fue el siguiente: Cuando realizábamos alguna modificación creábamos un script de actualización. Estos scripts se iban colocando numerados en una carpeta compartida de cada proyecto, donde además teníamos un documento con un registro de las actualizaciones que había corrido cada uno. Luego, para saber si necesitábamos actualizar la BD, sencillamente entrábamos a esta carpeta y verificábamos hasta que script habíamos corrido y de haber nuevos scripts a continuación de éste, ejecutábamos los que nos faltaban. &lt;/p&gt;&lt;p&gt;Pronto va a ser reemplazado por la nueva versión de &lt;a href="https://sync.live.com/clientdownload.aspx?ibm=10"&gt;Windows Live Sync&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.mesh.com/welcome/default.aspx"&gt;Live Mesh&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Scrumy&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Esta aplicación web hace las veces de Task Board permitiéndonos realizar el seguimiento de nuestro sprint virtualmente. Realmente es muy fácil de usar y posee una versión gratuita con las funcionalidades necesarias. La única desventaja es que no podemos agregar &lt;i&gt;&lt;a href="http://blog.tercerplaneta.com/2009/11/columna-del-medio-aportando-dinamica-la.html"&gt;La columna del medio&lt;/a&gt;.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Pizarra Virtual:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;a href="http://lh5.ggpht.com/_F67APmX9ii0/TEncZiNlEhI/AAAAAAAAABo/v2lT-7xeh1U/s1600-h/Scrumy%5B8%5D.jpg"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Scrumy" border="0" alt="Scrumy" src="http://lh4.ggpht.com/_F67APmX9ii0/TEnca3c_8kI/AAAAAAAAABs/Q5tOzPoqWIo/Scrumy_thumb%5B6%5D.jpg?imgmax=800" width="638" height="323" /&gt;&lt;/a&gt; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://scrumy.com/"&gt;Scrumy&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Google Docs:&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;La posibilidad de que varias personas puedan editar un documento al mismo tiempo convierte a esta aplicación en una excelente herramienta para trabajo distribuido. &lt;/p&gt;&lt;p&gt;En nuestro caso, nos sirvió muchísimo a la hora de hacer las retrospectivas de cada proyecto. Para hacerlo utilizábamos una planilla en la cual podíamos escribir todos, y que además tenía unas columnas adicionales para realizar la votación.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Retrospectiva en Docs: &lt;a href="http://lh5.ggpht.com/_F67APmX9ii0/TEncbiZNEGI/AAAAAAAAABw/NSuVgLyoGHU/s1600-h/Retrospectiva%5B4%5D.jpg"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Retrospectiva" border="0" alt="Retrospectiva" src="http://lh4.ggpht.com/_F67APmX9ii0/TEnccb4Fp3I/AAAAAAAAAB0/amqfX4zFUz0/Retrospectiva_thumb%5B2%5D.jpg?imgmax=800" width="673" height="408" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.google.com/apps/intl/es-ar/business/docs.html"&gt;Google Docs&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Skype:&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Si bien no hace falta ninguna presentación, debo decir que esta aplicación se ha vuelto fundamental en nuestras vidas a la hora de comunicarnos mediante voz, mensajería instantánea y video. Resulta de gran utilidad por ejemplo a la hora de realizar la reunión diaria.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.skype.com/intl/es/home"&gt;Skype&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Yuuguu:&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Esta herramienta nos permite compartir escritorio con varias personas al mismo tiempo, e inclusive ceder el control de Mouse y teclado. Como punto interesante quiero añadir que la persona que se conecta a nuestra computadora puede hacerlo desde cualquier navegador sin instalar la aplicación. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.skype.com/intl/es/home"&gt;Yuuguu&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Seguramente habrá muchas más herramientas que se puedan explorar (sobre todo las que no son específicas para desarrollar) y que no conocemos. Lo importante es que cada equipo incorpore aquellas con las que se sienta más cómodo en cada caso. Para esto resulta muy valioso el conocer experiencias de otros en el tema. Cualquier intercambio en este sentido es siempre muy bienvenido !!&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:064412ac-c199-4d20-8cd3-59d36a578f88" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/Herramientas+para+trabajo+distribuido" rel="tag"&gt;Herramientas para trabajo distribuido&lt;/a&gt;,&lt;a href="http://technorati.com/tags/trabajo+distribuido" rel="tag"&gt;trabajo distribuido&lt;/a&gt;,&lt;a href="http://technorati.com/tags/trabajo+remoto" rel="tag"&gt;trabajo remoto&lt;/a&gt;,&lt;a href="http://technorati.com/tags/teletrabajo" rel="tag"&gt;teletrabajo&lt;/a&gt;,&lt;a href="http://technorati.com/tags/compartir+carpetas" rel="tag"&gt;compartir carpetas&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-8871382860825110955?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/2dyyCgsxYSo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/2dyyCgsxYSo/herramientas-para-trabajo-distribuido.html</link><author>noreply@blogger.com (Matías Timossi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_F67APmX9ii0/TEnca3c_8kI/AAAAAAAAABs/Q5tOzPoqWIo/s72-c/Scrumy_thumb%5B6%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/07/herramientas-para-trabajo-distribuido.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-7685317293633184582</guid><pubDate>Tue, 10 Aug 2010 12:33:00 +0000</pubDate><atom:updated>2010-08-10T12:13:48.980-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Trabajo distribuido</category><category domain="http://www.blogger.com/atom/ns#">Teletrabajo</category><category domain="http://www.blogger.com/atom/ns#">Equipos distribuidos</category><category domain="http://www.blogger.com/atom/ns#">Trabajo a distancia</category><title>Trabajo distribuido</title><description>Durante el mes de Julio del año pasado tuvimos la oportunidad de empezar a experimentar con esta modalidad de trabajo. Si bien la idea rondaba desde hacía tiempo por nuestras cabezas, todavía no habíamos tenido motivos suficientes como para tomar el riesgo de enfrentarnos a este terreno desconocido.  &lt;p&gt;Lo que verdaderamente nos dio el impulso final fue el brote de &lt;a href="http://es.wikipedia.org/wiki/Pandemia_de_gripe_A_(H1N1)_de_2009"&gt;Gripe A&lt;/a&gt; que por ese entonces estaba en su punto más alto. Siendo que varios de nosotros (entre los cuales me incluyo) pertenecíamos al grupo de riesgo, surgía la necesidad de desarrollar medidas preventivas. Entonces, con el objetivo de abogar por nuestra salud, y de paso aprovechar la oportunidad para probar que tal nos iba trabajando de forma remota , tomamos la decisión de replegarnos todos con nuestros equipos hacia nuestros respectivos hogares. Sólo una persona quedó en la oficina haciendo un poco de auxiliar en caso de que surgiera cualquier necesidad.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Mi experiencia&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Debo decir que al principio me costó algo la adaptación, sin embargo a los pocos días ya me sentía como “en casa”. Realmente la tecnología con la que contamos hoy en día nos otorga una gran flexibilidad a la hora de trabajar.&lt;/p&gt;  &lt;p&gt;Enfocándonos en la calidad de vida, quiero decir que el hecho de evitar las complejidades que se nos presentan camino a la oficina (como el tráfico) es una experiencia más que grata. Esto sin mencionar el tiempo y dinero que nos ahorramos.&lt;/p&gt;  &lt;p&gt;Durante todo el mes trabajando en mí en casa sufrí algunos desperfectos técnicos. Afortunadamente como contamos con un buen servicio técnico los pudimos solucionar rápidamente, por lo tanto les recomiendo tener este tipo de seguridad a su disposición.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Los Resultados&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Luego de un mes trabajando fuera de la oficina hicimos una evaluación de cómo nos había ido. Los resultados en general fueron bastante positivos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pudimos mantener sincronizados código y bases de datos sin demasiado esfuerzo.&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Comprobamos nuestra flexibilidad para trabajar en equipo .&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Se notó una gran autonomía para administrar los tiempos individuales con responsabilidad.&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Logramos sostener la productividad.&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ahorramos tiempo y dinero en viajes.&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En cuanto a lo negativo, creo que una de las cosas más importantes a destacar es la pérdida de la comunicación cara a cara. &lt;/p&gt;  &lt;p&gt;Pienso que uno de los ingredientes principales que nos permitió obtener buenos &lt;/p&gt;  &lt;p&gt;resultados donde otros fallan, es que hace tiempo que venimos trabajando juntos. &lt;/p&gt;  &lt;p&gt;El hecho de que nos conozcamos y que estemos acostumbrados al trabajo en equipo hace que tengamos un lenguaje común. Es mucho más fácil lograr la resolución de un problema cuando las partes involucradas hablan el mismo idioma. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Trabajo Distribuido Hoy &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ahora bien, si esta experiencia nos dio tan buenos resultados cabe preguntarse ¿Por qué no adoptar esta modalidad de trabajo siempre y trabajar todos desde nuestros hogares? &lt;/p&gt;  &lt;p&gt;En una empresa como la nuestra, donde mantener el espíritu de equipo y la identidad son valores muy importantes, esto sería difícil. Sin embargo, vimos que podíamos aprovechar esta metodología para los casos en los que nos es más útil y necesario.&lt;/p&gt;  &lt;p&gt;Por ejemplo, uno de nuestros compañeros dentro de unos días va a ser padre, y más alla del tiempo contemplado para ello, va a trabajar durante unas semanas desde su casa ya que creemos que es importante que este cerca de su familia. Lo mismo se da para otros casos personales donde un día a la semana o cada 2 ó 3 semanas alguno de nosotros hace trabajo remoto. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Mirando al futuro &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Evidentemente esta modalidad está totalmente instalada entre quienes nos dedicamos al software, modificando la calidad de vida de quienes la practican. Me parece importante señalar que para aprovechar los beneficios de la misma y lograr que este cambio sea positivo, no debemos olvidar lo valioso de poder salir de nuestras computadoras y ensayar distintas soluciones entre varios frente una pizarra, experimentar las virtudes de programar de a dos (de la forma” tradicional”) o simplemente compartir una charla extra laboral mientras nos tomamos una taza de café. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-7685317293633184582?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/qsm45QeFmbM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/qsm45QeFmbM/trabajo-distribuido.html</link><author>noreply@blogger.com (Matías Timossi)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/08/trabajo-distribuido.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-3875739004973980894</guid><pubDate>Mon, 26 Jul 2010 15:36:00 +0000</pubDate><atom:updated>2010-08-18T15:57:42.294-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dynamic</category><category domain="http://www.blogger.com/atom/ns#">.Net 4.0</category><category domain="http://www.blogger.com/atom/ns#">ViewModel</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>Model View ViewModel</title><description>&lt;span style="color: black;"&gt;En un mail reciente de MSDN apareció &lt;a href="http://msdn.microsoft.com/es-ar/magazine/ff798279(en-us).aspx" target="_blank"&gt;un artículo&lt;/a&gt; que toca un tema de diseño interesante.&lt;br /&gt;Y es el patrón Model-ViewModel-Model, en el artículo se hace referencia a su implementación en WPF/Silverlight, sin embargo es un tema con el que seguramente muchos se topen al incursionar en &lt;a href="http://www.asp.net/mvc"&gt;Asp.Net Mvc&lt;/a&gt;, y en realidad es imposible de esquivar en cualquier implementación de MVC, ya sea en Asp.Net, WinForms, Ruby o Haskell.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ViewModels&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Cuando trabajamos con un modelo MVC, especialmente si elegimos algún mecanismo de DataBinding entre M y V (y en un sentido amplio de la palabra consideremos los templates (como las vistas de Asp.Net Mvc) como un caso particular de DataBinding), resulta inmediato que cualquier aplicación que escape de lo elemental necesita algun tipo de transformación entre un Modelo y su Vista, ahi es donde llegan al rescate los ViewModels.&lt;br /&gt;&lt;br /&gt;Para hacerlo menos abstracto, pongamos un ejemplo, imaginemos que&amp;nbsp;nuestros amigos de Facebook® quieren construir la pagina de perfil de un usuario:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_GcXPWR_goXk/TE2UZytZIEI/AAAAAAAAAts/LmfCqsM267k/s1600/SampleProfile.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="419" src="http://4.bp.blogspot.com/_GcXPWR_goXk/TE2UZytZIEI/AAAAAAAAAts/LmfCqsM267k/s640/SampleProfile.JPG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Perfil de Usuario&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;supongamos también que utilizan MVC y construyen su "Model" de la siguiente forma:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GcXPWR_goXk/TE2VnbESUbI/AAAAAAAAAt0/eMYa1I2wELE/s1600/UserProfileModel.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="205" src="http://3.bp.blogspot.com/_GcXPWR_goXk/TE2VnbESUbI/AAAAAAAAAt0/eMYa1I2wELE/s400/UserProfileModel.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Nota: el modelo real de Facebook® podría ser más complejo&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;La duda es como obtener los datos resaltados en &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;amarillo &lt;/span&gt;en la captura de ejemplo&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Antigüedad del mensaje de estado ("lunes pasado").&lt;/li&gt;&lt;li&gt;Ubicación ("Villa Devoto" en lugar de el GUID correspondiente)&lt;/li&gt;&lt;li&gt;Amigos en común (con el usuario logueado actualmente)&lt;/li&gt;&lt;/ul&gt;Para esto podemos "envolver" estas entidades del modelo con otras más emparentadas a la vista que queremos construir:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GcXPWR_goXk/TE2XLkjFcTI/AAAAAAAAAt8/Qu63qVhCrpk/s1600/UserProfileViewModel.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://3.bp.blogspot.com/_GcXPWR_goXk/TE2XLkjFcTI/AAAAAAAAAt8/Qu63qVhCrpk/s400/UserProfileViewModel.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Estas clases extienden a las anteriores con campos calculados, listas filtradas, consolidaciones, u otro tipo de transformaciones sobre el modelo original.&lt;br /&gt;Para ilustrar ésta sería una versión (muy naive) de la nueva propiedad "CommonFriends" en UserVM:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;UserVM&amp;gt; CommonFriends        {            get            {                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Friends                    .Where(f =&amp;gt; f.Friends                      .Any(ff =&amp;gt; ff.UserID == User.CurrentUserID))                    .ToList();            }        }&lt;/pre&gt;&lt;br /&gt;Si usted ya estuvo agregando este tipo de campos calculados y transformaciones, y se sentía culpable por haber violado la prístina pureza de su modelo MVC&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://gryphonscry.files.wordpress.com/2009/06/guilty-puppy1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://gryphonscry.files.wordpress.com/2009/06/guilty-puppy1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;siéntase liberado de la culpa!, esto ya tiene nombre y se llama &lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;ViewModel&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Separación Model-ViewModel-Model&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por supuesto en esto podemos imaginar un gradiente de creciente complejidad:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Propiedades agregadas directamente a las entidades de nuestro modelo&lt;/li&gt;&lt;li&gt;Algunas clases nuevas y propiedades agregadas a entidades que descienden de las de nuestro modelo&lt;/li&gt;&lt;li&gt;Una capa de ViewModels que se interpone y separa completamente View de Model.&lt;/li&gt;&lt;/ul&gt;Volviendo un poco al principio, el &lt;a href="http://msdn.microsoft.com/es-ar/magazine/ff798279(en-us).aspx"&gt;artículo de MSDN&lt;/a&gt;&amp;nbsp;trata sobre la última opción, implementada como assemblies separados para View, Model y ViewModel, en el que no existen referencias entre View y Model.&lt;br /&gt;&lt;br /&gt;Véase este gráfico explicativo que tomé prestado de &lt;a href="http://blogs.msdn.com/b/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx"&gt;un artículo que resume muy bien el tema&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dphill/WindowsLiveWriter/CollectionsAndViewModels_EE56/ViewModel_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://blogs.msdn.com/blogfiles/dphill/WindowsLiveWriter/CollectionsAndViewModels_EE56/ViewModel_2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Rápidamente puede verse el problema burocrático en que nos pone este enfoque, ya que implica tener para casi todas las clases del modelo, una equivalente en ViewModel, con wrappers para todas las propiedades visibles. Imagínense la flagrante violación al principio &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt;&amp;nbsp;que supone crear páginas y páginas de código como este:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Fullname        {            get            {                &lt;span class="kwrd"&gt;return&lt;/span&gt; InnerEntity.Fullname;            }            set            {                InnerEntity.Fullname = &lt;span class="kwrd"&gt;value&lt;/span&gt;;            }        }&lt;/pre&gt;&lt;br /&gt;Tiene que haber algo mejor!&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;b&gt;Dynamic Proxies&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Como dice la máxima "El mejor código es aquel que no se escribe", y&amp;nbsp;el &lt;a href="http://msdn.microsoft.com/es-ar/magazine/ff798279(en-us).aspx"&gt;artículo al que hice referencia&lt;/a&gt; propone generar estos ViewModels como proxies dinámicos, implementar esos "gets" y "sets" automáticamente con el nuevo tipo &lt;a href="http://msdn.microsoft.com/en-us/library/dd264736.aspx"&gt;dynamic &lt;/a&gt;en .Net 4.0, un poco de Reflection y unos atributos muy elegantes para declarar dependencias entre propiedades (ej: Edad &amp;lt;-depende de-&amp;gt; FechaDeNacimiento).&lt;br /&gt;&lt;br /&gt;Existen también librerías muy famosas para la creación de proxies dinámicos (que funcionan con .Net 2.0), como por ejemplo las que son usadas en &lt;a href="http://es.wikipedia.org/wiki/NHibernate"&gt;NHibernate &lt;/a&gt;(para crear proxies que soporten lazy loading):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/linfu/"&gt;LinFu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.castleproject.org/dynamicproxy/index.html"&gt;Castle Project&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;que hacen fácil agregarle a estos proxies interceptores en getters y setters (u otros métodos) que implementen notificación de cambios, logging, autorización y otras cosas por el estilo.&lt;br /&gt;&lt;br /&gt;Y finalmente...&lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;&lt;b&gt;KISS&lt;/b&gt;&lt;/a&gt;! es importante recordar que puede resultar más que suficiente con mantener las clases en el modelo accesibles a las vistas, y las clases "ViewModel" mezcladas con el "Model", o separadas simplemente por namespace.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-3875739004973980894?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/eeBB8FRExS8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/eeBB8FRExS8/model-view-viewmodel.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_GcXPWR_goXk/TE2UZytZIEI/AAAAAAAAAts/LmfCqsM267k/s72-c/SampleProfile.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/07/model-view-viewmodel.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-8946578167382058314</guid><pubDate>Wed, 07 Jul 2010 18:03:00 +0000</pubDate><atom:updated>2010-08-18T15:58:20.002-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CMS</category><category domain="http://www.blogger.com/atom/ns#">Sitecore</category><title>Sitecore, otra opción que ofrecer</title><description>Algunas semanas atrás, uno de nuestros clientes más importantes, nos invitó a participar junto con otros proveedores de un curso intensivo de una semana sobre &lt;a href="http://www.sitecore.net/" target="_blank"&gt;Sitecore&lt;/a&gt;.&lt;br /&gt;Sitecore es un CMS que proporciona software de gestión de contenidos web y portales a organizaciones que requieran funciones empresariales, integración y escalabilidad a la hora de administrar sitios web.&lt;br /&gt;&lt;br /&gt;Sitecore fue desarrollado en Dinamarca, y tiene su mayor mercado actualmente en Estados Unidos y Europa. Nuestro cliente vio interesante, la posibilidad de que sus proveedores de mayor confianza, se puedan instruir en esta herramienta para que en el futuro los acompañen en la integración de Sitecore con otras aplicaciones, puedan agregar nuevas funcionalidades o colaboren en la implementación de la herramienta.&lt;br /&gt;&lt;br /&gt;Como en &lt;a href="http://www.tercerplaneta.com/"&gt;Tercer Planeta&lt;/a&gt; estamos acostumbrados a realizar nuestros propios desarrollos, la primera reacción a la invitación fue “y no sé, ¿te parece que tengamos que aprender Sitecore?”, pero rápidamente comprendimos que la mejor respuesta a esa pregunta con un , “claro que sí”, y hoy en día vemos los beneficios de haber participado en ese encuentro.&lt;br /&gt;&lt;br /&gt;Más allá que nuestro fuerte esté en los desarrollos a medida, siempre es enriquecedor poder conocer cómo otros pueden encarar una determinada solución. En este caso puntual, Sitecore nos pareció un producto muy completo, que tiene cubiertas muchísimas funcionalidades, muchas de las cuales todavía no pudimos explorar, pero en las que sí pudimos indagar descubrimos que están resueltas de manera muy diferente al enfoque que le hubiéramos dado nosotros, simplemente porque fue pensado por otras personas, en otro contexto, con otra experiencia y otras costumbres.&lt;br /&gt;&lt;br /&gt;Con lo cual la posibilidad de poder salir, tomar distancia de nuestros tareas diarias, y ver cómo piensan otros, nos resultó más que interesante.&lt;br /&gt;&lt;br /&gt;El curso fue dictado por &lt;a href="http://www.linkedin.com/in/theinsidecorner"&gt;Craig Nelson&lt;/a&gt;, un instructor técnico especializado en Sitecore, que viajo especialmente desde Estados Unidos. Cada día estaba orientado a diferentes perfiles (Usuarios Finales, Diseñadores, Desarrolladores, etc.), constaba de partes teóricas y prácticas, las cuales resolvíamos en grupos, esta interacción con otros colegas fue también una experiencia que valió la pena.&lt;br /&gt;&lt;br /&gt;Este curso nos sirvió para conocer una nueva herramienta, y fundamentalmente para ver otra forma de hacer las cosas, e independientemente del uso que la vayamos a dar en el futuro, hoy en día, sentimos que tenemos&lt;strong&gt; una posibilidad más&lt;/strong&gt;, &lt;strong&gt;otra opción que ofrecer&lt;/strong&gt;, o tener en cuenta, y eso creo que es lo más importante, para nosotros y para nuestros clientes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-8946578167382058314?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/23EEdmC7joc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/23EEdmC7joc/sitecore-otra-opcion-que-ofrecer.html</link><author>noreply@blogger.com (Ricardo D. de Guzmán)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/07/sitecore-otra-opcion-que-ofrecer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-8848141161492440923</guid><pubDate>Mon, 05 Jul 2010 18:00:00 +0000</pubDate><atom:updated>2010-07-05T16:56:20.148-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo personal</category><category domain="http://www.blogger.com/atom/ns#">Coaching ontológico</category><title>Cómo entendemos el crecimiento</title><description>Cuando en diciembre del 2009 nos reunimos con Jose a definir los objetivos del 2010 decidimos que teníamos que poner el foco en &lt;strong&gt;madurar&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Pero, qué significaba en ese momento “madurar” para nosotros ? Para el tamaño de organización que tenemos y por los lineamientos que seguimos, lo que buscábamos era lograr un crecimiento de la empresa pero no medido en este caso en cantidad de integrantes o en monto de facturación, sino &lt;em&gt;&lt;span style="color:#ff9900;"&gt;en base al crecimiento profesional y desarrollo personal de todos los integrantes del equipo&lt;/span&gt;&lt;/em&gt; de Tercer Planeta.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Help, I need somebody!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para quienes no somos especialistas en coaching y tenemos un perfil más técnico, el objetivo se presentaba como un gran desafío y sabíamos también que nos embarcábamos en un trabajo de largo plazo que implicaba grandes cambios individuales y en el grupo.&lt;br /&gt;&lt;br /&gt;Estaba claro que para poder llevar a cabo esta tarea necesitábamos contactar a especialistas en el tema y fue así que acudimos a &lt;a href="http://ar.linkedin.com/in/pfondevila" target="_blank"&gt;Pablo Fondevila&lt;/a&gt; y su empresa “Nuevas Miradas en Organizaciones”, quien junto con &lt;a href="http://ar.linkedin.com/in/carolaherrscher" target="_blank"&gt;Carola Herrscher&lt;/a&gt; y &lt;a href="http://ar.linkedin.com/in/marisaberges" target="_blank"&gt;Marisa Bergés&lt;/a&gt;  se dedican al &lt;a href="http://flapco.org/" target="_blank"&gt;Coaching Ontológico&lt;/a&gt; . Con ellos empezamos a transitar este camino desde hace 6 meses.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Algunos caminos a seguir&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Uno de los aspectos que comenzamos a abordar es tratar de lograr una convergencia entre la vida personal y la laboral ¿cómo pensar que con la cantidad de horas que compartimos en la oficina ambos entornos marchan cada uno por un “carril exclusivo” sin tocarse en ningún momento?&lt;br /&gt;Es lógico entender que estas dos “vidas” se cruzan en varios puntos pero no nos resultaba tan lógico hacer visible y poner un esfuerzo claro y público en juntarlas y complementarlas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y para qué querríamos hacer esto? Una de las respuestas que encontramos a esta pregunta es que creemos que la realización de las personas debe ser algo integral, el desarrollo personal y profesional implica poder mostrar los logros, tomar nuevos compromisos, cerrar etapas, explorar nuevos caminos, descubrir y explotar nuestras habilidades.&lt;br /&gt;&lt;br /&gt;Por otro lado, aceptar la influencia que las emociones tienen en nuestras vidas es fundamental para entender algunos comportamientos: por ejemplo, aclarar que estamos viviendo un momento difícil o que tenemos algo importante que resolver puede evitarnos conflictos de comunicación si encontramos un ámbito donde nos sintamos cómodos para declararlo y los demás entiendan el por qué de ciertas actitudes.&lt;br /&gt;&lt;br /&gt;Entender cuán valioso es el esfuerzo de alguien por terminar una carrera o por emprender nuevos retos, por ejemplo, nos anima a fomentar ese tipo de logros, que sin duda, redundarán en valor para los objetivos de la empresa.&lt;br /&gt;&lt;br /&gt;Cómo hacer entonces para acercar estos dos mundos y lograr que se retroalimenten ? O que el trabajo sea un medio más a través del cual alcanzar objetivos personales ?&lt;br /&gt;Cómo hacer que la "vida de la oficina" no genere trabas en la vida privada ? O que la vida privada (logros, alegrías, tristezas) puedan ser, de alguna manera, compartidos, apoyados y comprendidos por la empresa?&lt;br /&gt;&lt;br /&gt;Estas fueron algunas de las dudas que empezaron a surgir. Dudas que, gracias a las herramientas que nos van dando quienes nos acompañan (talleres, entrevistas individuales periódicas, consejos para la organización de eventos internos y externos, etc.), empezaron a disiparse.&lt;br /&gt;&lt;br /&gt;Puede asombrarnos pensar que con pequeños cambios o con la creación de ámbitos de discusión de cosas simples y concretas, es absolutamente posible y realizable encarar el tema.&lt;br /&gt;&lt;br /&gt;De la misma manera las &lt;em&gt;&lt;span style="color:#ff9900;"&gt;charlas individuales para desarrollo personal&lt;/span&gt;&lt;/em&gt; nos están abriendo los ojos a nuevas posibilidades de solución de conflictos, de aprovechamiento de las capacidades de cada uno, de alineamiento con los objetivos y visión de la empresa, de comunicación, de roles, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Esfuerzo vs. Beneficios&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Según mi opinión, el mayor desafío en este emprendimiento está en &lt;span style="color:#ff9900;"&gt;&lt;em&gt;saber incorporar y mantener estos valores&lt;/em&gt;&lt;/span&gt;. Lo cual implica un trabajo de replanteo individual, de delegación de tareas, de acompañamiento, de promoción de la creatividad, de generación de espacios de intercambio, entre otras cosas.&lt;br /&gt;&lt;br /&gt;Creo que el entender que estos procesos implican pensar a largo plazo, esfuerzo y modificaciones en la mentalidad, en las costumbres, en las estructuras y en la mirada con que enfocamos las cosas, es una de las &lt;span style="color:#ff9900;"&gt;&lt;em&gt;principales claves&lt;/em&gt;&lt;/span&gt; para obtener buenos resultados.&lt;br /&gt;&lt;br /&gt;Ahora, sin dejar de lado un enfoque más “empresario”, qué beneficios veo en estos cambios en relación con la organización y la productividad ?&lt;br /&gt;&lt;br /&gt;• Mayor compromiso de todos&lt;br /&gt;• Mayor motivación&lt;br /&gt;• Mejoramiento del ambiente laboral&lt;br /&gt;• Mayor confianza entre los miembros del equipo&lt;br /&gt;• Mejoras en la comunicación&lt;br /&gt;• Hacer que los objetivos y la visión de la empresa sean sostenibles en el tiempo&lt;br /&gt;&lt;br /&gt;Me animo a decir también que todo este “movimiento” &lt;em&gt;&lt;span style="color:#ff9900;"&gt;trasciende los límites de la empresa y repercute en la relación con nuestros clientes&lt;/span&gt;&lt;/em&gt;, quienes, en definitiva, se benefician con los resultados que un equipo de trabajo motivado y “en sintonía” es capaz de producir.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Vale la pena?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Considero que para empresas como la nuestra, donde el &lt;strong&gt;capital humano&lt;/strong&gt; es considerado uno de los puntos más importantes, &lt;em&gt;&lt;span style="color:#ff9900;"&gt;la inversión en este tipo de emprendimientos está más que justificada&lt;/span&gt;&lt;/em&gt; y muestra sus frutos en muchas áreas.&lt;br /&gt;&lt;br /&gt;Finalmente, creo que para “poner a rodar la maquinaria” en todo esto, el principal motor es &lt;strong&gt;ver y reconocer&lt;/strong&gt; la importancia que tienen estas cuestiones en nuestra vida cotidiana, cualquiera sea el carril por el que marche.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-8848141161492440923?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/7lay0J0UTaE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/7lay0J0UTaE/como-entendemos-el-crecimiento.html</link><author>noreply@blogger.com (Andrea Morales)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/07/como-entendemos-el-crecimiento.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-8826237730653893111</guid><pubDate>Tue, 29 Jun 2010 19:33:00 +0000</pubDate><atom:updated>2010-07-30T12:06:13.052-03:00</atom:updated><title>¡Qué comience la sesión!</title><description>Resulta común que durante el almuerzo o en esos 5' que lleva batir el café o preparar el mate surjan temas o ideas interesantes que son para "&lt;span style="font-style: italic;"&gt;discutir entre todos&lt;/span&gt;", o al menos entre muchos; y, por lo general, se hace difícil buscar y encontrar el tiempo necesario para hacerlo, por lo que esas ideas quedan sin transmitir ni impulsar.&lt;br /&gt;Esto nos sucedió a nosotros, hemos de reconocerlo. Pero encontramos la solución y, como era lógico, la misma surgió en esos momentos de "recreo laboral".&lt;br /&gt;La propuesta fue tener reuniones cortas para charlar y debatir acerca de diferentes temas. Así surgió nuestro "&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Cabildo Abierto&lt;/span&gt;&lt;/span&gt;", pensado como un espacio en el que se pudieran plantear problemas o inquietudes, discutir soluciones, propuestas o acciones a tomar y llegar a alguna conclusión con una solución rápidamente aplicable.&lt;br /&gt;&lt;br /&gt;El nombre elegido no fue al azar, ya que combina el nombre de la Avenida en la cual está nuestra oficina con el llamado a debate mediante la participación activa y sin límites de cualquier integrante de Tercer Planeta (3P) que quiera hacerlo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;¿En qué consiste?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;El término Cabildo Abierto no es nuevo, surge en la época del Virreinato del Río de La Plata en la cual algunos pobladores se reunían para tratar diversos temas.&lt;br /&gt;&lt;br /&gt;Nuestro &lt;span style="font-style: italic;"&gt;Cabildo Abierto&lt;/span&gt; consiste en hacer sesiones para debatir temas propuestos por los integrantes de 3P. Cada uno, al tener un tema a tratar, anota un título representativo en una Wiki. Fue designada la figura de &lt;span style="font-style: italic;"&gt;moderador&lt;/span&gt; quién es el encargado de seleccionar 2 o 3 temas propuestos para debatir en la siguiente sesión, estos temas pueden estar conectados o no; la particularidad de ellos es que el debate no debería llevar mas de 1 hora.&lt;br /&gt;&lt;br /&gt;Una vez seleccionados los temas, se proponen días y horarios (es deseable mas de 2 opciones para elegir) y cada interesado en participar se anota según su conveniencia. Aquel día-horario que tenga mas participantes será el día elegido para sesionar. Es fundamental que aquella persona que propuso el tema asista a la sesión ya que es la encargada de presentar el tema, impulsar el debate y anotar las conclusiones.&lt;br /&gt;&lt;br /&gt;Al comenzar la sesión, se expone cada tema, se lo discute y, al dar cierre al debate, se anotan las conclusiones propuestas en la Wiki. En caso de requerir un seguimiento, la persona que propuso el tema tendrá la responsabilidad de hacerlo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Anotando temas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Los temas a proponer pueden ser muy variados, ellos surgen de la motivación personal de mejorar algo que vemos y sentimos puede ser mejorado o revisado. Por supuesto dado que cada persona tiene al respecto una visión distinta, un enfoque distinto, esto es lo que enriquecerá la gama de tipos de temas propuestos.&lt;br /&gt;&lt;br /&gt;Se pueden proponer temas que traten asuntos relacionados con la metodología de trabajo o con cuestiones técnicas del desarrollo. También pueden sumarse aquellas cuestiones que tienen que ver con la convivencia o el espacio físico en el que nos encontramos. En definitiva, vale anotar cualquier tema que cada uno quiera tratar en una sesión de Cabildo Abierto.&lt;br /&gt;&lt;br /&gt;Nosotros, en particular, hemos presentado diversos temas. Algunos de ellos fueron:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cómo manejamos el Collate en SQLServer?&lt;/li&gt;&lt;li&gt;Timeboxing (como afecta la calidad, como tenerlo en cuenta en la planificación, como prever y manejar imprevistos, etc)&lt;/li&gt;&lt;li&gt;Equipar lo necesario para poder hacer reuniones remotas&lt;/li&gt;&lt;li&gt;Cómo mejorar nuestra relación con el cliente?&lt;/li&gt;&lt;li&gt;Cambiar las cortinas&lt;/li&gt;&lt;/ul&gt;por citar algunos títulos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Conclusiones&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Es importante saber que existe un epacio en el que se puede proponer y accionar esas propuestas. El Cabildo Abierto intenta ser eso precisamente: un espacio en el cual se planteen y canalicen las inquietudes de todos y se busquen las respuestas y soluciones en forma conjunta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-8826237730653893111?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/eV6LFaURTGo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/eV6LFaURTGo/que-comience-la-sesion_29.html</link><author>noreply@blogger.com (Nora Martinez)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/06/que-comience-la-sesion_29.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-5067336697248028538</guid><pubDate>Thu, 18 Mar 2010 16:16:00 +0000</pubDate><atom:updated>2010-07-22T12:07:34.239-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Html5</category><category domain="http://www.blogger.com/atom/ns#">Internet Explorer</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>HTML5, un paso más cerca</title><description>&lt;h3&gt;Html5: Html para aplicaciones web&lt;/h3&gt;&lt;p&gt;Desde hace mucho tiempo, oímos culpar de los problemas intrínsicos de las aplicaciones web, a la naturaleza “document-oriented” de la web. La web fue pensada originalmente como una red para compartir documentos “hipervinculados”, y no como plataforma de aplicaciones distribuídas. De hecho fue éste el &lt;a href="http://www.google.com/googlebooks/chrome/" target="_blank"&gt;argumento expuesto por Google en forma de historieta&lt;/a&gt; para lanzar &lt;a href="http://www.google.com/chrome" target="_blank"&gt;Chrome&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Para subsanar esta brecha surgieron una gran variedad de tecnologías, como javascript, Java Applets, Ajax, Flash, y más recientemente &lt;a href="http://gears.google.com/" target="_blank"&gt;Google Gears&lt;/a&gt;, &lt;a href="http://java.sun.com/javafx/" target="_blank"&gt;Java FX&lt;/a&gt; y &lt;a href="http://www.microsoft.com/silverlight/" target="_blank"&gt;Silverlight&lt;/a&gt; con la intención de crear en los browsers lo que se conoce como Rich Clients, clientes que permitan una experiencia de usuario similar a la de una aplicación de escritorio, con todas la ventajas de la web.&lt;/p&gt;&lt;p&gt;Sin embargo en todo este tiempo,  el “poder legislativo” de la web, la &lt;a href="http://www.w3.org/" target="_blank"&gt;W3C&lt;/a&gt;, no se quedó de brazos cruzados, y como es de esperar, respondieron con un estándar, tomándose su tiempo. La respuesta de la W3C fue: &lt;a href="http://dev.w3.org/html5/spec/Overview.html" target="_blank"&gt;HTML5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;HTML5 traerá muchas novedades, pero lo importante, la idea que está detrás de la mayoría de ellas, es la creación de aplicaciones web “ricas” en nuestros browsers. Para muestra basta un botón:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Graficos vectoriales, animaciones y efectos visuales más avanzados&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Almacenamiento local en el browser, no sólo como diccionarios, también en forma de bases de datos SQL, y otras facilidades para aplicaciones “offline/online”&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;WebWorkers, tareas asincrónicas, y un sistema de mensajería entre ellas. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Navegación Ajax&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Streaming de audio y video&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;DOM Events, los elementos de un documento html, expondrán una serie eventos (ej: div.resize)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Drag &amp;amp; Drop&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Tags semánticos asociados a aplicaciones como: &amp;lt;progress&amp;gt;, &amp;lt;meter&amp;gt;, &amp;lt;command&amp;gt;, &amp;lt;datalist&amp;gt;, &amp;lt;output&amp;gt;, y nuevos tipos de campos para formularios (&amp;lt;input&amp;gt;) como “datetime”, “range”, “search”, etc.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;varios etc.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;A esta altura, resulta evidente que tener soporte para todo esto, de forma nativa en HTML, se ve como una amenaza para todos los que proveen estos features actualmente mediante plugins, como Flash, Java FX, Silverlight y otros. &lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;HTML5 todavía está en pañales, y se acerca lentamente, sin embargo &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(HTML_5)" target="_blank"&gt;la mayoría de los browsers ya soportan varios features de HTML5&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;IE9, Podría Microsoft estar suicidando Silverlight?&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Con la salida de IE8, Microsoft empezó a soportar algunos features de HTML5, sin embargo este era muy limitado, y con la ausencia del elemento &amp;lt;canvas&amp;gt; que permite la inclusión de gráficos vectoriales, se especuló sobre una estratégica defensa de Silverlight.&lt;/p&gt;&lt;p&gt;Sin embargo, con la llegada de IE9 están anunciando un soporte para HTML5 mucho más completo, tanto que publicaron &lt;a href="http://ie.microsoft.com/testdrive/" target="_blank"&gt;una pagina para probar entre otras cosas el soporte HTML5 de IE9&lt;/a&gt; (incluyendo animaciones y gráficos vectoriales con aceleración por hardware).&lt;/p&gt;&lt;p&gt;Y a esto se suma un nuevo engine Javascript, que pretende ponerse a tiro con el resto con &lt;a href="http://ie.microsoft.com/testdrive/benchmarks/SunSpider/Default.html" target="_blank"&gt;benchmarkings prometedores&lt;/a&gt;. Esto me recuerda un comentario sobre &lt;a href="http://blog.salias.com.ar/2008/09/javascript-la-programacin-del-futuro.html" target="_blank"&gt;el futuro de Javascript&lt;/a&gt; de Martín Salías.&lt;/p&gt;&lt;p&gt;Para los que trabajamos con .Net surgen ahora dudas existenciales sobre como afectará esto el futuro de Silverlight.&lt;/p&gt;&lt;p&gt;&lt;img style="DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; MARGIN-RIGHT: auto" src="http://www.extendiendoelreino.com/img/desanimo.JPG" /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Sin duda la familiaridad del framework .Net, C#, y la integración con VisualStudio son la panacea para los desarrolladores que ya trabajamos con .Net, &lt;/span&gt;&lt;span style="color:#000000;"&gt;sin embargo, ¿Qué features realmente distintivos tendrá Silverlight para los usuarios?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/silverlight/features/" target="_blank"&gt;Gráficos 3D, Out-of-browser y Smooth Streaming&lt;/a&gt;?&lt;/p&gt;&lt;p&gt;Quizás todavía sea solo futurología, pero la llegada de IE9 nos acerca bastante a la pregunta: &lt;/p&gt;&lt;p&gt;¿Cuál será el lugar que ocupará Silverlight (y otras RIU) con la llegada de HTML5?.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;&lt;span style="color:#000000;"&gt;Profecía autocumplida: Google + Apple + Microsoft&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Ya no hace falta decirlo, a esta altura, HTML5 será un caso evidente de profecía autocumplida, no sólo por tratarse de un estándar de la W3C, sino por contar con el apoyo de Google (además de incluir soporte en Chrome, decidió abandonar Google Gears, por considerarlo un subset de lo que HTML5 proveerá y creo una versión HTML5 de YouTube), Apple (soporte en Safari, que incluirá IPhones que actualmente no soportan Flash), y finalmente Microsoft con la llegada IE9.&lt;/p&gt;&lt;p&gt;Falta aún saber cuanto falta para que sea soportado completamente por los browsers más populares, y para que nuestras IDEs nos permitan aprovecharlo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-5067336697248028538?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/w7l1ylBQKc4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/w7l1ylBQKc4/html5-un-paso-mas-cerca.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2010/03/html5-un-paso-mas-cerca.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-7662955392339753754</guid><pubDate>Mon, 30 Nov 2009 16:18:00 +0000</pubDate><atom:updated>2010-07-22T12:08:23.499-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Metodologias</category><category domain="http://www.blogger.com/atom/ns#">Agile</category><category domain="http://www.blogger.com/atom/ns#">Timeboxing</category><category domain="http://www.blogger.com/atom/ns#">Time Management</category><title>¿Y si jugamos a que hacemos software?</title><description>&lt;p&gt;Desde hace un tiempo, estoy dando una mirada de vez en cuando a una revista online sobre metodologías ágiles en portugués. &lt;a href="http://www.visaoagil.com/" target="_blank"&gt;Visão Ágil&lt;/a&gt;, como tarea hogareña del curso portugués que estoy haciendo, y con la intención de leer un poco sobre este tema (como dice la poco ecológica metáfora: matar dos pájaros de un tiro).&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;La técnica del Tomate&lt;/h4&gt;&lt;p&gt;En el blog de esta revista encontré recientemente un &lt;a href="http://visaoagil.wordpress.com/2009/11/20/pensamentos-sobre-a-tecnica-pomodoro/" target="_blank"&gt;artículo sobre la “Técnica Pomodoro”&lt;/a&gt; de Manoel Pimentel. La Técnica Pomodoro se utiliza para la administración personal del tiempo, y está inspirada en ideas de las metodologías ágiles, como TimeBoxing y el uso de herramientas de “baja tecnología”, puntualmente: papel, lápiz y un timer de cocina. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p align="center"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="tomato_timer1" border="0" alt="tomato_timer1" src="http://lh4.ggpht.com/_GcXPWR_goXk/SxPxE0DlenI/AAAAAAAAAhA/jLy5n_3K6SY/tomato_timer1%5B5%5D.jpg?imgmax=800" width="163" height="163" /&gt; &lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="paper-pencil" border="0" alt="paper-pencil" src="http://lh3.ggpht.com/_GcXPWR_goXk/SxPxFMR_bqI/AAAAAAAAAhE/jFeXA-rV6AA/paper-pencil%5B5%5D.jpg?imgmax=800" width="167" height="166" /&gt; &lt;/p&gt;&lt;p&gt;&lt;em&gt;Estos timers con forma de tomate (pomodoro en italiano) son los que dan nombre a la técnica&lt;/em&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Si bien ese artículo tiene un &lt;a href="http://en.wikipedia.org/wiki/Mind_map" target="_blank"&gt;mindmap&lt;/a&gt; que resume muy bien los puntos clave, lo que más destacaría es la simplicidad, el énfasis en mantener el foco, y la asignación rígida de tiempos (véase TimeBoxing) tanto a las tareas como a los intervalos de descanso entre éstas.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Con respecto a este último punto, el libro oficial que puede descargarse de &lt;a href="http://www.pomodorotechnique.com/"&gt;http://www.pomodorotechnique.com&lt;/a&gt; destaca la importancia de estos intervalos para “asimilar lo aprendido y hacer algo bueno por tu salud”, como caminar, ejercicios de respiración o contar un chiste. Interrumpir este período de descanso con cualquier tarea que implique un esfuerzo mental, “bloqueara el constructivo proceso mental de integración necesario para estar alerta y listo para el proximo ciclo”. Una especie de build de integración que se ejecuta periódicamente en background en nuestro cerebro.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;El último que se escondió arma el release!&lt;/h4&gt;&lt;p&gt;Sin embargo lo que quería mencionar en este artículo (y por eso el título), es algo que me parece muy valioso y puede pasar desapercibido a primera vista. Es el espíritu &lt;strong&gt;lúdico&lt;/strong&gt; que hay detrás de esta técnica (vi este punto escrito en el mindmap del artículo de Pimentel).&lt;/p&gt;&lt;p&gt;Una idea que tambien está implícita en varias técnicas utilizadas en metodologías ágiles.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Creo que en esta manera de encarar el trabajo (y cualquier otra cosa) hay mucho más jugo de lo que se cree habitualmente. Especialmente en ambientes que promueven la productividad y la creatividad.&lt;/p&gt;&lt;p&gt;No hay que confundirlo con una forma de hacer apología de la competencia (que casi nunca es sana), o de esquivar el bulto a las tareas tediosas. Se trata más bien de evitar que nuestro trabajo sea una letárgica marcha atrás de la recompensa monetaria de fin de mes (Dispositivo del burro y la zanahoria),&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title="burro_zanahoria" border="0" alt="burro_zanahoria" src="http://lh5.ggpht.com/_GcXPWR_goXk/SxPxFg3jAkI/AAAAAAAAAhI/bX8AVt6Hq8Q/burro_zanahoria%5B4%5D.gif?imgmax=800" width="200" height="205" /&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;para empezar a disfrutar del día a día, transformándolo en un juego constructivo, hasta casi “sentir que no trabajamos”.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_GcXPWR_goXk/SxPxGIByFXI/AAAAAAAAAhM/qon5xs9cqS0/s1600-h/burrojugando%5B3%5D.jpg"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: block; FLOAT: none; MARGIN-LEFT: auto; BORDER-TOP: 0px; MARGIN-RIGHT: auto; BORDER-RIGHT: 0px" title="burrojugando" border="0" alt="burrojugando" src="http://lh5.ggpht.com/_GcXPWR_goXk/SxPxGk7P1tI/AAAAAAAAAhQ/P5ueqC_UeX4/burrojugando_thumb%5B1%5D.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Sin duda el tema, da para mucho más que este artículo (y para autores más calificados!) pero la intención era traer a colación el tema, y tratar de poner en evidencia, o preguntar, ¿Cuántas cosas hacemos (o podemos hacer) en este sentido? &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-7662955392339753754?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/Q7BZiUw3j9k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/Q7BZiUw3j9k/y-si-jugamos-que-hacemos-software.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_GcXPWR_goXk/SxPxE0DlenI/AAAAAAAAAhA/jLy5n_3K6SY/s72-c/tomato_timer1%5B5%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2009/11/y-si-jugamos-que-hacemos-software.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-3939478359948820844</guid><pubDate>Fri, 13 Nov 2009 20:19:00 +0000</pubDate><atom:updated>2009-11-13T17:25:19.167-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Metodologias</category><category domain="http://www.blogger.com/atom/ns#">Scrum</category><category domain="http://www.blogger.com/atom/ns#">Agile</category><title>"La columna del medio"</title><description>&lt;h4&gt;Aportando dinámica a la pizarra&lt;/h4&gt;  &lt;p&gt;En nuestro equipo de trabajo contamos con los ambientes de desarrollo (pruebas de unidad) y de QA (pruebas de integración).&lt;/p&gt;  &lt;p&gt;Desde hace tiempo venimos aplicando prácticas de SCRUM. Con el uso de la pizarra notamos la necesidad de diferenciar las tareas cuyo desarrollo se encontraba en progreso de aquellas terminadas y a la espera de un pasaje al ambiente de QA.&lt;/p&gt;  &lt;p&gt;Esto era debido a que cada vez que terminábamos una tarea la pasábamos a la columna de “Test”, ocasionando muchas veces confusiones ya que no teníamos manera de saber si las tareas que se encontraban en esta columna estaban contempladas dentro del último build.&lt;/p&gt;  &lt;p&gt;Durante un tiempo intentamos hacer el pasaje de papelitos solamente cuando hacíamos el build al ambiente QA, pero para eso contábamos con nuestra memoria para saber que tareas estaban completas, lo que no siempre resultaba con éxito por que… seamos sinceros… esta no siempre nos era fiel =)&lt;/p&gt;  &lt;p&gt;Entonces un día, durante la retrospectiva de uno de nuestros proyectos tuvimos la siguiente maravillosa idea para arribar a una solución: &lt;/p&gt;  &lt;p&gt;Agregar una columna intermedia entre DESA (In progress) y QA (Test) que nos permitiera saber, de forma inmediata, cuáles eran las tareas que estaban listas pero que todavía no estaban disponibles para ser probadas en QA…&lt;/p&gt;  &lt;h4&gt;¿Como funciona?&lt;/h4&gt;  &lt;p&gt;Cada vez que el desarrollador termina alguna tarea, mueve el papelito correspondiente de “In Progress” a la columna “DESA/TEST”(la columna del medio) indicando de esta manera que el desarrollo ha finalizado y estará disponible en el próximo build para su prueba.&lt;/p&gt;  &lt;p&gt;Si bien debo reconocer que en un principio tuve mis dudas acerca de si la nueva columna iba a servir de algo, el uso de la misma nos demostró gran efectividad.&lt;/p&gt;  &lt;p&gt;Su implementación acarreó las siguientes mejoras:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Nos permitió tener una noción más precisa del avance del sprint, rompiendo con la sensación de un “avance estático” generado por la acumulación de tareas en la columna de desarrollo. &lt;/li&gt;    &lt;li&gt;Da una idea más clara al desarrollador de qué tareas le falta completar y cuáles completó. &lt;/li&gt;    &lt;li&gt;Brinda al tester la certeza de saber qué estará para probar. &lt;/li&gt;    &lt;li&gt;Es mucho más fácil decidir en qué momento hacer un pasaje de ambiente. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font color="#555555"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;Resultado final&lt;/h4&gt;  &lt;p&gt;&lt;font color="#555555"&gt;&lt;a href="http://lh4.ggpht.com/_F67APmX9ii0/Sv2_ZgsYKmI/AAAAAAAAABY/3vnrsQ2Kv7k/s1600-h/DSC01508%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="La pizarra" border="0" alt="La pizarra" src="http://lh3.ggpht.com/_F67APmX9ii0/Sv2_aFWlxnI/AAAAAAAAABc/V8-XeQ8EjcQ/DSC01508_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#555555"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;Conclusiones&lt;/h4&gt;  &lt;p&gt;Por nuestra experiencia, la incorporación de esta nueva columna trae grandes beneficios a la dinámica del equipo, agilizando la comunicación. Los invitamos a probar esta alternativa y que compartan con nosotros sus experiencias.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-3939478359948820844?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/c3RsqJUNZWA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/c3RsqJUNZWA/columna-del-medio-aportando-dinamica-la.html</link><author>noreply@blogger.com (Matías Timossi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_F67APmX9ii0/Sv2_aFWlxnI/AAAAAAAAABc/V8-XeQ8EjcQ/s72-c/DSC01508_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2009/11/columna-del-medio-aportando-dinamica-la.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-3679111601919045866</guid><pubDate>Wed, 08 Jul 2009 11:54:00 +0000</pubDate><atom:updated>2009-07-08T08:57:38.263-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Metodologias</category><category domain="http://www.blogger.com/atom/ns#">Agile</category><category domain="http://www.blogger.com/atom/ns#">Timeboxing</category><category domain="http://www.blogger.com/atom/ns#">Planificacion</category><title>Sobre Ratas, Elefantes y TimeBoxing</title><description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;La semana pasada nos dispusimos a realizar un cronograma de entregas para las próximas semanas de uno de nuestros proyectos, así que me reuní con el resto del  grupo involucrado, y empezamos una planificación, haciendo una revisión rápida de las historias de usuario prioritarias en nuestro backlog.&lt;/p&gt;  &lt;p&gt;Acto seguido, ubicaríamos estas historias de usuario según sus “tamaños” , prioridades y dependencias, en hipotéticos sprints, manteniendo presente el concepto de &lt;a href="http://www.proyectosagiles.org/timebox"&gt;TimeBoxing&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;La bolsa de Gatos&lt;/h4&gt;  &lt;p&gt;La lista resultó ser bastante extensa, y estimar el esfuerzo requerido por cada ítem, se volvía un poco confuso. Eran demasiado heterogéneas (lo que comúnmente llamamos bolsa de gatos).&lt;/p&gt;  &lt;p&gt;Era necesario dividir un poco las aguas y separar cosas como “cambiar el color de fondo del campo X” de “diseñar un generador de fusión en frío”.&lt;/p&gt;  &lt;p&gt;Creo que lo más peligroso de esto es que camufladas en medio de la estampida de historias de usuario más pequeñas, podían pasar desapercibidas las más pesadas o de más difícil estimación.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;Una metodología de planificación para toda la familia&lt;/h4&gt;  &lt;p&gt;Normalmente utilizamos para estimar el esfuerzo requerido de cada historia de usuario, cartas de &lt;a href="http://en.wikipedia.org/wiki/Planning_poker"&gt;Planning Poker&lt;/a&gt; (gracias a &lt;a href="http://www.planningpoker.com/"&gt;Mountain Goat&lt;/a&gt;) al comienzo de cada sprint, sin embargo esta planificación prolongada requería de una primera clasificación grosera.&lt;/p&gt;  &lt;p&gt;Fue así que con el ánimo de innovar un poco y de hacer la reunión un poco más divertida inventamos (y ofrecemos sin patente alguna) un método de planificación que podría llamarse “El Arca de Noé”.&lt;/p&gt;  &lt;p&gt;Es importante que participen todos los miembros del equipo (funcionales, desarrolladores, líder de proyecto, etc. con sus diferentes visiones) y consiste básicamente en 2 etapas:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;1. Clasificación&lt;/h4&gt;  &lt;p&gt;En esta etapa se toma cada una de las historias de usuario, y luego de una breve descripción, y discusión sobre sus implicancias (aquí típicamente es el momento de que un desarrollador advierta sobre dificultades posibles, o calle para siempre :)). se procede a su clasificación.&lt;/p&gt;  &lt;p&gt;Las tareas se ubicarán en 3 grandes categorías de acuerdo al esfuerzo que representa la tarea, para hacerlo más entretenido decidimos identificar estas categorías con especies animales:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Rata&lt;/strong&gt;: Con este nombre identificamos historias de usuario más rápidas de resolver y que no requieren casi ningún análisis sobre la forma de implementarlas. Típicamente cambios estéticos, cambios de configuración,  pseudo-duplicar un componente ya existente, etc. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Perro&lt;/strong&gt;: En esta categoría van tareas que implican un cierto análisis y/o un trabajo más cuidadoso o extenso que las anteriores. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Elefante&lt;/strong&gt;: Finalmente elefantes son las historias de usuario más pesadas, generalmente requieren un esfuerzo de diseño, o hay muchas dudas sobre la forma implementarlo, o implica un riesgo díficil de estimar. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;span style="color:#555555;"&gt;&lt;a href="http://lh6.ggpht.com/_GcXPWR_goXk/SlSI0siPTbI/AAAAAAAAAXc/-kXlKgDIsIU/s1600-h/MouseElephant2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="MouseElephant" border="0" alt="MouseElephant" src="http://lh5.ggpht.com/_GcXPWR_goXk/SlSI1OpcDsI/AAAAAAAAAXg/7-CEutfscpk/MouseElephant_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#555555;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span"  style="color:#555555;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#555555;"&gt;Finalmente es importante entender que tanto el número de categorías (3), como los criterios para ubicar un historia de usuario en cada categoría, son parámetros que deben ajustarse con el tiempo a las particularidades de cada equipo.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#555555;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;2. Planificación&lt;/h4&gt;  &lt;p&gt;En esta etapa al igual que Noé con su Arca, es dónde tenemos que acomodar estos animales (o historias de usuario) en compartimientos finitos (o sprints). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Advertencia&lt;/strong&gt;: Si la cantidad de sprints es limitada, es posible que algunas historias de usuario se pierdan en el diluvio universal.&lt;/p&gt;  &lt;p&gt;Para esto tenemos que sopesar diferentes criterios:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="color:#000000;"&gt;Historias prioritarias para el cliente&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;Dependencias entre éstas&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;Recursos disponibles&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color:#000000;"&gt;Imprevisibilidad o riesgo de una tarea (generalmente es preferible comenzar estas tareas lo antes posible para en caso de necesidad ajustar el rumbo a tiempo)&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;y otros que puedan ser particulares del proyecto.&lt;/p&gt;  &lt;p&gt;Aquí es dónde se aplican todas las metodologías de planificación que normalmente utilizamos.&lt;/p&gt;  &lt;p&gt;Por supuesto que la medida de cuántos “elefantes” entran en cada sprint, además de depender de los recursos disponibles en ese sprint, es algo que los miembros del equipo irán refinando con el paso del tiempo.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;El Resultado:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DSC01439_rr" border="0" alt="DSC01439_rr" src="http://lh5.ggpht.com/_GcXPWR_goXk/SlSI15D1fNI/AAAAAAAAAXk/5DFooaXRNp4/DSC01439_rr_thumb.jpg?imgmax=800" width="224" height="244" /&gt;&lt;/p&gt;  &lt;h5&gt; &lt;/h5&gt;  &lt;h4&gt;Conclusiones&lt;/h4&gt;  &lt;p&gt;Antes de empezar a dibujar Gantts, Cronogramas o un Análisis de Riesgo, se hace necesario hacer una primera pasada que identifique las historias de usuario clave. Esta variante simple resulta bastante divertida, lo cual en una larga planificación nunca está demás.&lt;/p&gt;  &lt;p&gt;Eso sí, una consecuencia inmediata y un poco vergonzosa, son expresiones del tipo; “Yo 2 elefantes en esta semana no me puedo comer, mejor empiezo agarro un elefante y voy intercalando con algunas ratitas” o “Me parece que nos estás vendiendo perro por rata”&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Quién se anima a compartir otras variantes de este tipo?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-3679111601919045866?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/Z0whgcajREE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/Z0whgcajREE/sobre-ratas-elefantes-y-timeboxing.html</link><author>noreply@blogger.com (Benjamin Eidelman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_GcXPWR_goXk/SlSI1OpcDsI/AAAAAAAAAXg/7-CEutfscpk/s72-c/MouseElephant_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2009/07/sobre-ratas-elefantes-y-timeboxing.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3732630541286744699.post-187738207977977667</guid><pubDate>Mon, 16 Feb 2009 12:36:00 +0000</pubDate><atom:updated>2009-02-16T14:35:28.868-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web.config</category><category domain="http://www.blogger.com/atom/ns#">Team Fundation Server</category><category domain="http://www.blogger.com/atom/ns#">TFS</category><category domain="http://www.blogger.com/atom/ns#">Source Control</category><title>Como excluir archivos de configuración de Source Control</title><description>&lt;span style="color:#000000;"&gt;Una pregunta que alguien se podría hacer al leer este artículo, es ¿porque voy a querer quitar los archivos de configuración del repositorio de código fuente?&lt;br /&gt;&lt;br /&gt;El objetivo de los Repositorios de Código es justamente ese, resguardar el código, los archivos de configuración son necesarios al ejecutar la aplicación, y muchas veces al compilarla, tal es el caso del &lt;em&gt;web.config&lt;/em&gt;, por este motivo necesitamos que sean parte del proyecto, pero tenerlos en el repositorio de código fuente nos puede traer algunos problemas.&lt;br /&gt;&lt;br /&gt;Uno de los inconvenientes ocurre en los procesos de Deployment, ya que los archivos de configuración, ente otras cosas, almacenan información referida al ambiente donde corre la aplicación:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Desarrollo&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Qa&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Producción&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;etc&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color:#000000;"&gt;y el repositorio almacena versiones del código, independientemente de los ambientes en donde se instale.&lt;br /&gt;&lt;br /&gt;En este sentido excluirlos, nos obliga a hacer un manejo especial con ellos en los diferentes pasajes de ambiente, que nos puede evitar errores. Por otro lado mientras estamos desarrollando, es bastante común hacer pruebas modificando los archivos de configuración, pruebas que nunca vamos a querer subir al repositorio de código (Ej.: apuntar la configuración a una Base de Datos local), si tenemos los archivos en el repositorio, es necesario hacer CECK OUT, para luego hacer UNDO PENDING CHANGES al finalizar la prueba. Esto, mas allá de ser una tarea tediosa para el desarrollador, es problemática si son muchos los que están trabajando al mismo tiempo.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Veamos cómo hacerlo&lt;/h3&gt;En este caso vamos a hacer un ejemplo utilizando como Repositorio de Código Fuente a &lt;strong&gt;Team Fundation Server&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;En este ejemplo, voy a abrir la solución correspondiente al Sitio corporativo de Tercer Planeta &lt;a href="http://www.tercerplaneta.com/"&gt;http://www.tercerplaneta.com/&lt;/a&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, para excluir al &lt;em&gt;web.config&lt;/em&gt;, cabe aclarar que esto se puede aplicar también, en una aplicación WinForms, excluyendo el &lt;em&gt;app.config&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Al abrir la solución vemos la siguiente estructura de carpetas y archivos desde Solution Explorer de &lt;strong&gt;Visual Studio 2008&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5303376490676414306" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 250px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_gPVbIsAFkYs/SZlg0dzs52I/AAAAAAAAAHI/KSQX1IpQ-9s/s320/Untitled.jpg" border="0" /&gt;El primer paso consta de hacer una copia del&lt;em&gt; web.config,&lt;/em&gt; para luego renombrarlo como &lt;strong&gt;&lt;em&gt;web.config.template&lt;/em&gt;&lt;/strong&gt;. Este témplate nos sirve para almacenar la configuración que requiere la aplicación, en el también podríamos identificar de alguna manera, que cosas vamos a tener que modificar, cada vez que la aplicación se encuentre en un ambiente diferente.&lt;br /&gt;&lt;br /&gt;Para esto nos paramos sobre el archivo &lt;em&gt;web.config&lt;/em&gt; en el Solution Explorer, hacemos una copia del mismo y lo renombramos como lo dijimos anteriormente.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5303392503497990034" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 266px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_gPVbIsAFkYs/SZlvYiN3n5I/AAAAAAAAAHQ/wD_m0Qlkug0/s320/Untitled.jpg" border="0" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Luego de subir los cambios, pasamos a excluir el &lt;em&gt;web.config&lt;/em&gt; de Source Control.&lt;br /&gt;&lt;br /&gt;Para ello, seleccionando el &lt;em&gt;web.config&lt;/em&gt; desde el Solution Explorer, debemos ir al punto de menú File / Source Control /&lt;strong&gt;Exclude web.config from Source Control&lt;/strong&gt; como se ve a continuación.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303393336756519394" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 274px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_gPVbIsAFkYs/SZlwJCWLweI/AAAAAAAAAHg/JM4N4CtBzMU/s320/Untitled.jpg" border="0" /&gt;Este último paso hace CHECK OUT del proyecto para marcar al &lt;em&gt;web.config&lt;/em&gt; como archivo excluido.&lt;br /&gt;&lt;br /&gt;Luego de guardar los cambios debemos eliminar definitivamente al &lt;em&gt;web.config&lt;/em&gt; de Source Control, para esto en la solapa Source Control Explorer de &lt;strong&gt;Visual Studio 2008&lt;/strong&gt;, debemos pararnos sobre el archivo &lt;em&gt;web.config&lt;/em&gt; y hacer Click Derecho / Delete.&lt;br /&gt;&lt;br /&gt;Si en este punto miramos la columna Pending Change, de la solapa Source Control Explorer vamos a ver que marca el archivo &lt;em&gt;web.config&lt;/em&gt; como Delete y además hace cambios sobre los archivos del proyecto.&lt;br /&gt;&lt;br /&gt;Como solo queremos quitarlo de Source Control y no del proyecto, lo que tenemos que hacer es desde el Source Control Explorer, deshacer los cambios sobre los archivos del proyecto.&lt;br /&gt;&lt;br /&gt;Para eso los seleccionamos y hacemos UNDO PENDING CHANGES como se muestra a continuación. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303394011395741346" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 222px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_gPVbIsAFkYs/SZlwwTktVqI/AAAAAAAAAHo/FKDHQyKtI2w/s320/Untitled.jpg" border="0" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Luego hacemos CHECK IN sobre el &lt;em&gt;web.config&lt;/em&gt; , para podes borrarlo definitivamente.&lt;br /&gt;&lt;br /&gt;Estos últimos dos pasos, hacen que el &lt;em&gt;web.config&lt;/em&gt; desaparezca del árbol de Source Control, pero no lo excluye del proyecto web.&lt;br /&gt;&lt;br /&gt;Si ahora observamos nuevamente el Solution Explorer vamos a ver que el&lt;em&gt; web.config&lt;/em&gt; sigue apareciendo en la lista de archivos, pero ahora con dos iconos.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303394585592065970" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 285px; CURSOR: hand; HEIGHT: 197px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_gPVbIsAFkYs/SZlxRunx77I/AAAAAAAAAHw/8ddTjGmZ6c4/s320/Untitled.jpg" border="0" /&gt;El icono rojo indica que el archivo está excluido de Source Control, mientras que el icono amarillo nos dice que no lo tenemos actualmente en el disco local.&lt;br /&gt;&lt;br /&gt;El último paso consta de ir a nuestro disco local, hacer una copia del témplate que generamos en los pasos anteriores, y renombrarla como &lt;em&gt;web.config&lt;/em&gt;, de esta manera en el Solution Explorer solo veríamos el icono rojo.&lt;br /&gt;&lt;br /&gt;A partir de este momento el &lt;em&gt;web.config&lt;/em&gt;, está localmente y nunca se va a pisar cuando hagamos Get Latest Version. Es importante aplicar los cambios al Témplate cuando se necesite hacer un cambio en el &lt;em&gt;web.config&lt;/em&gt;, y avisar de esto al resto del equipo, para que lo actualice localmente.&lt;br /&gt;&lt;br /&gt;De esta manera, cada puesto de trabajo pasa a tener su copia del &lt;em&gt;web.config&lt;/em&gt;, que el desarrollador puede modificar cuando quiera, evitando hacer CHECK-OUT cada vez. Por otro lado, cada ambiente donde se instale la aplicación va a tener que tener su propio &lt;em&gt;web.config&lt;/em&gt;, la forma de obtenerlo en este caso dependerá del mecanismo que utilicemos como publicación. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3732630541286744699-187738207977977667?l=blog.tercerplaneta.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ideas3p/~4/1v_lM14uuhA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Ideas3p/~3/1v_lM14uuhA/como-excluir-archivos-de-configuracion.html</link><author>noreply@blogger.com (Ricardo D. de Guzmán)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_gPVbIsAFkYs/SZlg0dzs52I/AAAAAAAAAHI/KSQX1IpQ-9s/s72-c/Untitled.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tercerplaneta.com/2009/02/como-excluir-archivos-de-configuracion.html</feedburner:origLink></item></channel></rss>

