November 2010 - Artículos

image47dd1de4

Buenas,

hoy toca destapar un par de post de la lista de borradores, en este caso los pasos para utilizar WinMerge como la herramienta por defeto para analizar diferencias entre archivos en Visual Studio 2010.

Tutorial

1. Primero lo más obvio; descargar la última versión disponible desde http://winmerge.org/

2. Abrir Visual Studio 2010

3. Acceder al menu [Tools // Options]

image

4. Presionar el botón [Configure User Tools]

5. Seleccionamos la opción [Add]

6. Agregamos la opción de Comparar, pero en este caso utilizando WinMerge utilizando los siguientes valores:

  • Extension: .*
  • Operation: Compare
  • Command: C:\Program Files (x86)\WinMerge\WinMergeU.exe
  • Arguments: /e /x /s /wl /dl %6 /dr %7 %1 %2

image

7. Confirmamos la configuración con [OK]

8. Agregamos la opción de Merge, utilizando WinMerge utilizando los siguientes valores:

  • Extension: .*
  • Operation: Merge
  • Command: C:\Program Files (x86)\WinMerge\WinMergeU.exe
  • Arguments: /e /s /x /ub /dl %6 /dr %7 %1 %2 %4

image

9. Confirmamos la configuración con [OK]

10. Deberíamos ver la configuarción completa similar a la siguiente:

image

11. Done !!!

 

Saludos @ Home

El Bruno

   

image47dd1de4

Buenas,

hace unos días me preguntaban como calcular el espacio que ocupa un Branch en Team Foundation Server. Cuando vienes de trabajar con herramientas donde la acción de Branch es una constante diaria, por ejemplo en GIT; tiendes a preocuparte por el tamaño de los branches y por el espacio en disco. Ojo, que la filosofía de como trabajar con estas herramientas es diferente, pero bueno, un bit es un bit, y hay que pagarlo en €uros.

Para responder a esta pregunta, hice un ping a los amigos de Redmond y este fué el post de referencia que me pasaron. Los valores son bastante claros:

image

 

Saludos @ Home

El Bruno

   

Fuente: http://blogs.msdn.com/b/chandrur/archive/2009/06/09/space-used-by-tfs-branches.aspx

image

Buenas,

una de las opciones que tenemos en las builds de Team Foundation Server define si la build se ejecutará inclusive si no hubo cambios en el código que compila la misma. La siguiente imagen muestra un ejemplo de la configuración de la Build, con la opción [Build even if nothing has changed since the previous build].

image

Nota: Si quieres ver los pasos necesarios para definir una Build, MSDN es tu amiga http://msdn.microsoft.com/en-us/library/ms181716.aspx.

Supongamos que tenemos 3 definiciones de Build para 3 aplicaciones diferentes, con nombres absolutamente descriptivos:

  • Build A [para la aplicación A]
  • Build B [para la aplicación B]
  • Build C [para la aplicación C]

y las 3 definiciones compilan las aplicaciones por la noche y tienen activada esta opción. Durante una semana normal de trabajo en la que diferentes equipos de trabajo desarrollan para las diferentes aplicaciones, el resultado y evolución de las builds puede ser similar al siguiente gráfico:

image

Es normal que en los primeros días, las compilaciones tengan poca calidad y que el último día (día 5), 2 de las 3 aplicaciones ya tengan un buen nivel de calidad en las mismas y las compilaciones sean exitosas.

Durante la siguiente semana, los equipos de trabajo siguen trabajando y al final de la semana podemos ver un histórico similar al siguiente:

image

La lectura rápida de estos resultados de las builds nos indican que el desarrollo en la Aplicación A y en la Aplicación B, no ha introducido cambios que desestabilicen el código, pero sin embargo la Aplicación C, ha tenido cambios mucho más significativos ya que durante varios días la build nocturna no fué exitosa.

Esta visión que a primera vista puede ser alentadora para la Aplicación A y en la Aplicación B, es completamente diferente si analizamos los cambios en cada aplicación y pudiésemos ver que el último cambio para la  Aplicación A se introdujo el día 6; y en el caso de la Aplicación B, el último cambio se introdujo el día 7. El gráfico general sería similar al siguiente:

image

Si bien es cierto que cuando utilizamos Team Foundation Server y Team Build, los informes nos pueden ayudar a ver este tipo de escenarios, por ejemplo con el informe Build Quality Indicators, donde veremos la información cruzada del resultado de las últimas Builds, junto con las métricas de Code Churn, Cobertura de Código, resultado de ejecución de tests, etc.; personalmente prefiero dejar desactivada la opción [Build even if nothing has changed since the previous build], así en mi histórico de Builds puedo ver información como en el siguiente gráfico; y de un primer vistazo sé en que aplicación se han introducido cambios y “cuando”.

image

image

Disclaimer: ojo, que esta es una opinión personal y estoy seguro que existirá algún escenario donde dejar activa la opción de compilación sea una alternativa válida Risa, mientras tanto este check quedará desactivado.

 

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

pues hoy un video de las primeras pruebas con el Kinect, gracias al driver opensource disponible en https://github.com/OpenKinect/libfreenect; por ahora solo mover el motor vertical del Kinect, pero ya llegará el procesamiento de imágenes gracias a Kinect + Microsoft Robotics.

 

Obviamente una chorrada que em da verguenza comparada con los que muestran aquí  -> http://www.engadget.com/2010/11/25/kinect-hack-lets-you-control-a-web-browser-using-only-the-force/

 

Saludos @ Home

El Bruno

   

image

Buenas,

el próximo 24 de diciembre toca una mesa redonda, evento, charla o como se nos ocurra llamarlo para hablar de la migración de aplicaciones de Visual Basic 6 a .Net. Tema de por sí interesante y más aún si lo  lidera Jorge Serrano, que nos ilustrará un poco con sus experiencias al respecto.

Pueden encontrar más información en la nueva y super rediseñada página de MadridDotNet –> http://madriddotnet.wordpress.com/2010/11/09/evento-migracin-de-aplicaciones-de-vb-6-a-net-mito-o-realidad-huevo-o-gallina/

Saludos @ Here

El Bruno

   

Publicado 22/11/2010 17:25 por El Bruno | con no comments
Archivado en:

image47dd1de4

Buenas,

hoy toca un tip muiy rápido sobre una funcionalidad que poca gente conoce:

La capacidad de agregar puntos de interrupción de depuración (breakpoints) en el panel Call Stack.

Para agregar un punto de interrupución, simplemente accedemos al panel Call Stack y agregamos el punto de interrupción.

image

A partir de este momento, el mismo ya está configurado y disponible para las depuraciones de nuestro proyecto y podemos ver la diferencia entre un punto de interrupción “normal”, que está asociado a una clase de código, a una línea y a una posición; y el punto de interrupción asociado a la ejecución de un ensamblado (.dll) y a una función dentro del mismo.

image

A disfrutarlo !!!

 

Saludos @ Home

El Bruno

   

image47dd1de4

Buenas,

hace unos días se hacía oficial la disponibilidad del Feature Pack 2 para Visual Studio 2010. Jorge se hacía eco de la noticia aquí y además nos dejaba los links a la descarga y al hotfix necesario para el Feature Pack 2. Esta release trae muchas novedades interesantes; a la funcionalidad que más se le ha hecho mucha publicidad  es a la capacidad de realizar pruebas con Coded UI Tests para aplicaciones Silverlight (date una vuelta por el WebCast de Tony al respecto).

Pero como siempre en un Feature Pack hay muchas más cosas y una de ellas es realmente interesante: la capacidad de importar elementos UML basados en el estándard XMI 2.1 a nuestros diagramas de UML de Visual Studio 2010. Los que conocen y trabajan con UML conocen este formato de ficheros, ya que si bien es de carácter general para el intercambio de archivos (xmi= xml metadata interchange), muchas de las herramientas de modelado soportan este formato, un ejemplo: Microsoft Visio.

La prueba para Visual Studio 2010 + Feature Pack 2 hubiese sido demasiado “microsoft world” si hubiese creado un archivo en Visio y lo hubiese importado en Visual Studio, asi que mejor decidí realizar una búsqueda con google bing y descargar un ejemplo desde aquí http://www.isounifi.com/ws-cdl/example.xmi.

En Visual Studio 2010, tenemos una opción en el menú [Architecture // Import XMI ...] para importar este tipo de archivos.

image

 

Una vez importado el archivo podremos ver en log de proceso el resultado del proceso de importación, así como la cantidad de elementos que se han importado.

image

 

En el panel [UML Model Explorer]  podremos acceder a los elementos que se han agregado a nuestro modelo:

image

 

Y ahora solo queda acomodar los mismos en nuestros propios diagramas, por ejemplo un diagrama de clases:

image

 

o en un diagrama de secuencia:

image

 

Ahora bien, es necesario recordar que:

  • La funcionalidad de importar, solo importa los elementos, no los diagramas ni las estructuras ya creadas
  • Solo es compatible con la versión 2.1 (y superiores asumo)
  • Es imprescindible realizar sincronizaciones periódicas si trabajamos con modelos muy cambiantes

bueno lo último depende de la forma de trabajo … y para esto mejor date una vuelta por aquí.

 

Saludos @ Here

El Bruno

   

Fuentes:

Publicado 19/11/2010 20:58 por El Bruno | con no comments
Archivado en: ,

imageBuenas,

ayer Faceboook hizo un anuncio sobre un nuevo sistema de mensajería que si bien hizo un poco de eco en la red, no creo que haya tenido la suficiente repercusion. En GenBeta, por ejemplo, se encargaron de traducir literalmente lo que comunicaron en Techcrunch, pero tampoco le dieron muchas vueltas. Si quieres conocer cual es el nuevo modelo de mensajes que presenta Facebook, pues alguno de los links anteriores es útil, pero la cosa va más allá.

Antes de comentar mi opinión, hay que dejar en claro una cosa: Facebook se centra en las personas. A fb no le interesan los medios, ni los canales, pero si las personas y las relaciones peer-to-peer entre las mismas. Hace un tiempo comenté que ahora las personas pasan más tiempo frente al ordenador que frente a la televisión, y en estos tiempos también la necesidad de tener abierto Facebook ha pasado a ser una realidad constante. Para aportar un dato más relacionado con la importancia de Facebook en nuestro día a día, desde la salida de Windows Live Essentials 2011 hace un mes y su capacidad de integración con Facebook: Windows Live Messenger ha dado sopote a más de 1.5 billiones de minutos de chat en el chat de Facebook, lo que se dice poco.

Cuando abro mi ordenador necesito entrar en el flujo de información, esto suele ser revisar el correo, ver Facebook, actualizar mi Twitter, etc. Ahora bien, si facebook plantea una opción donde el correo y la mensajería se integren en un único canal, y a través de Facebook, pues me ahorraré bastante tiempo. Yo creo que por eso, Mark Zuckerberg ha decidido que esta será una killer feature para FB. Si bien Facebook está más orientado a las personas que a los profesionales, el alcance de los más de 500 millones de usuarios, mas la capacidad de integrarse con los correos más populares (gmail, hotmail, etc), será uno de los factores claves para que este mecanismo se convierta en una herramienta más de facebook. Volviendo al ejemplo anterior, yo al chat de facebook no lo utilizaba nunca, ahora la mitad del chat que recibo, suele venir de FB a través de Live Essentials.

La contrapartida a esta apuesta de FB, fué Google Wave. Pero el gran problema de GW fué que estaba enfocada hacia los diferentes tipos de comunicación, es decir, una apuesta tecnológica excelente, altamente extensible; pero que carecía de lo que a Facebook le sobra: enfoque personal. Es por eso que yo creo que esta apuesta de Facebook, puede ser un nuevo punto de inflexión en la forma en la que nos comunicamos, y que después de que se implante en FB, podamos comenzar a ver aplicaciones como Tweetdeck o Live Essentials que integren este modelo de comunicación para que lo utilicemos de forma dinámica.

Por ahora solo queda esperar …

 

Saludos @ Here

El Bruno

   

Fuentes

Publicado 16/11/2010 10:38 por El Bruno | con no comments
Archivado en: ,

image47dd1de4

Buenas,

voy a seguir con el tabarrón de las pruebas unitarias, después de un fin de semana de descanso. Hoy le toca un poco a Generics, esa gran incorporación al Framework 2.0, que venimos disfrutando y sufriendo desde hace más de 5 años.  Supongamos la siguiente clase GenericSample, que demuestra toda la capacidad inventiva que posee mi cabezota un lunes, y en la que se utilizan Generics con un fin más que tonto:

   1: using System;
   2: namespace DemoUnittesting
   3: {
   4:     public class GenericSample
   5:     {
   6:         public string ObtenerDescripcion<T>(T value)
   7:         {
   8:             string ret;
   9:             if (value is int)
  10:                 ret = "es un int";
  11:             else if (value is long)
  12:                 ret = "es un long";
  13:             else
  14:                 throw new NotImplementedException("hay q implementar esto che !!!");
  15:             return ret;
  16:         }
  17:     }
  18: }

Pues cuando Visual Studio 2010, crea una prueba unitaria de la función ObtenerDescripcion<T>(), veremos que en realidad en la clase de tests se crean 2 funciones para poder emular el comportamiento utilizando Generics. En el siguiente ejemplo, vemos como se crea un test llamado ObtenerDescripcionTest() (línea 20) y que internamente llama a la función ObtenerDescripcionTestHelper() (línea 10) utilizando como tipo genérico un GenericParameterHelper, incluido dentro de la suite de testing de Microsoft.VisualStudio.TestTools.UnitTesting.

 
   1: using DemoUnittesting;
   2: using Microsoft.VisualStudio.TestTools.UnitTesting;
   3: namespace ElBruno.DemoUnitTesting
   4: {
   5:     [TestClass]
   6:     public class GenericSampleTest
   7:     {
   8:         public TestContext TestContext { get; set; }
   9:  
  10:         public void ObtenerDescripcionTestHelper<T>()
  11:         {
  12:             var target = new GenericSample(); 
  13:             T value = default(T); 
  14:             var expected = string.Empty; 
  15:             var actual = target.ObtenerDescripcion<T>(value);
  16:             Assert.AreEqual(expected, actual);
  17:         }
  18:  
  19:         [TestMethod]
  20:         public void ObtenerDescripcionTest()
  21:         {
  22:             ObtenerDescripcionTestHelper<GenericParameterHelper>();
  23:         }
  24:     }
  25: }

 

Hasta este momento es todo muy bonito, pero claro, el test no funciona ya que al trabajar con un tipo no reconocido se dispara la excepción de la clase GenericSample.

image

 

Si nos sentamos a pensar un poco y organizamos las pruebas unitarias, teniendo en cuenta los diferentes casos, pues deberiamos llegar a tener algo parecido a lo siguiente:

   1: using System;
   2: using DemoUnittesting;
   3: using Microsoft.VisualStudio.TestTools.UnitTesting;
   4: namespace ElBruno.DemoUnitTesting
   5: {
   6:     [TestClass]
   7:     public class GenericSampleTest
   8:     {
   9:         public TestContext TestContext { get; set; }
  10:  
  11:         public void ObtenerDescripcionTestHelper<T>(string expected = "")
  12:         {
  13:             var target = new GenericSample(); 
  14:             T value = default(T); 
  15:             var actual = target.ObtenerDescripcion<T>(value);
  16:             Assert.AreEqual(expected, actual);
  17:         }
  18:  
  19:         [TestMethod, ExpectedException(typeof(NotImplementedException))]
  20:         public void ObtenerDescripcionUtilizaTipoInvalidoEsperaExcepcion()
  21:         {
  22:             ObtenerDescripcionTestHelper<GenericParameterHelper>();
  23:         }
  24:  
  25:         [TestMethod]
  26:         public void ObtenerDescripcionUtilizaTipoInt()
  27:         {
  28:             ObtenerDescripcionTestHelper<int>("es un int");
  29:         }
  30:  
  31:         [TestMethod]
  32:         public void ObtenerDescripcionUtilizaTipoLong()
  33:         {
  34:             ObtenerDescripcionTestHelper<long>("es un long");
  35:         }
  36:     }
  37: }

 

Donde ya implementamos un mínimo de pruebas coherentes y podemos tener cubierta la funcionalidad de nuestra aplicación.

image

 

Pues aquí lo dejo Risa, y si alguno lo prueba me cuenta como ve el caso del String.

 

Saludos @ Here

El Bruno

   

Buenas,

primero lo primero, aclarar que no soy un aficionado a Java y hace más de 5 años que no hago nada serio en Java. Pero es una plataforma de la que he aprendido mucho, cuando salió .Net, ý uno comenzaba a buscar fuentes de información, pues lo más rápido solía ser ver si el problema se había presentado en Java, e "inspirarse" en copiar la solución al mundo .Net. Después tuve la oportunidad de hacer algo medianamente grande en Java y me quedé asombrado de la cantidad de recursos que existían. Pero bueno, hasta ahí llegó mi camino en Java, y hoy lo sigo de cerca ya que mi chica trabaja en este entorno en aplicaciones realmente grandes y tengo varios amigotes que se encargan de llevar adelante estas aplicaciones.

Es por eso que cuando hace un tiempo, Oracle se "encargó de Java"; pues supuse que el camino de Java se complicaría un poco. Hoy por ejemplo, veo que la Apache Software Foundation (ASF) ha pedido a la comunidad de desarrolladores que voten en contra de la próxima versión de Java (Jave 7, hasta donde entiendo). Esto es ya que la nueva versión, además de las mejoras propias de una nueva versión, incorpora un nuevo modelo de licencias que no es a la que está acostumbrada la comunidad Javera.

Pero hago un poco de memoria, y claro, esto no es nuevo. Hace un par de semanas Doug Lea abandono el Java Community Process (JCP), como lo muestra la lista de correos de Java. Según lo que he entendido, el equipo del JCP es el encargado de definir los estándares para Java, en lo relacionado al lenguaje, a las licencias, a los mecanismos de distribución, etc.; vamos que en pocas palabras definen el futuro del lenguaje. Lo interesante del modelo propuesto en el JCP, es que cualquiera puede registrarse y participar; aunque después de leer un poco, parece que todo el mundo tiene voz, pero pocos tienen voto (normal en algo tan grande). Pero bueno, volviendo al bueno de Doug Lea que tiene un nombre de tío simpaticón, el tío abandona el comité y lo hace con las siguientes palabras:

I believe that the JCP is no longer a credible specification and standards body

...

Sun initially placed in the JSPA and Process documents enough rules to ensure that the JCP could foster innovation, quality, and diversity, independent of that from Sun, with few enough (albeit annoying) exceptions to allow JCP to drive consensual progress more successfully than seen in most standards bodies. However, some of these rules, and violations of rules, have been found to be the source of stalemates and lost technical ground. Rather than fixing rules or ceasing violations, Oracle now promises to simply disregard them. If they indeed act as they have promised, then the JCP can never again become more than an approval body for Oracle-backed initiatives.

...

For the core Java platform ... the only existing vehicle for which I can foresee a useful role for the academic and research community is OpenJDK. OpenJDK is a shared-source, not shared-spec body, so is superficially not an alternative at all. But at this point, a Linux-style model for collaboratively developed common source is likely to be more effective in meeting upcoming challenges than is the JCP.

Donde la primera frase, ya de por sí es demoledora: "Creo que JCP no es una especificación creíble". Luego remata con frases como "en la época de SUN, existían diferencias con JCP; pero ahora ORACLE parece que directamente destruirá las bases de JCP". Además parece que los cracks de ORACLE intentan meter en el comité de JCP a "amiguetes", como la empresa Hologic , que seguramente será para poder llevar los intereses "to home". Si comienzas a buscar en internet relacionada, parece una novela/culebrón caribeño la cantidad de idas y vueltas, peleas y amiguismos que hay alrededor de este tema.

Cuando armamos la charla con Pablo de JAVA vs NET, empecé a echarle un vistazo a las noticias relacionadas con Java y fué por enero, donde los analistas de ZDNet definían el futuro de Java como "Business as Usual". Es decir, Oracle trataría de sacar el mayor provecho en €uros posible a partir de esta plataforma y otros productos como MySQL, OpenSolaris, etc. Yo personalmente, no creo que esté mal lo que está haciendo ORACLE, por una parte está cambiando del modelo de negocio de Java para que sea más rentable, pero por otra parte no se ha olvidado que la base de Java son las comunidades y por eso quiere establecer contacto con las mismas.

Yo creo que en el camino perderá mucha gente, se desangrará de a poco; pero como la base de ORACLE sigue siendo eso de los SELECT, INSERT, UPDATE y DELETE, además de un Oracle Application Server simplemente bestial; a la larga las personas que se queden en la dupla ORACLE/JAVA (lo siento a partir de ahora ORACLE va delante), serán principalmente los desarrolladores de negocio y aquellos proyectos que puedan sobrevivir en base a contribuciones externas. El golpe/palo será muy fuerte, porque claro esto afecta  productos como la castaña de OpenOffice (en realidad el fork de LibreOffice), la base de desarrollo de Android, etc.; y por ahora ORACLE está teniendo disputas con todos. La mentalidad es clara:

¿si podemos aprovechar la plataforma armada para sacar unos €uros, porqué no hacerlo?

Y para cerrar un comic genial, porque claro a los que trabamos en el mundo Microsoft esto no nos toma por sorpresa Demonio

image

Comic: http://www.linuxhispano.net/2010/08/17/oracle-vs-android/

 

Saludos @ Home

El Bruno

   

PD: prometo no escribir más un post sobre temas que no conozco, pero es que gracias a Java aprendí conceptos ágiles, conocí herramientas para las pruebas unitarias, inyección de código, etc. Vamos que mucho de lo que vemos hoy en .Net y que se nos presenta como "una novedad" existe y desde hace mucho en Java; bajo otras premisas pero existe, por eso el camino para Java lo veo incierto Confundido

Fuentes

Publicado 14/11/2010 22:18 por El Bruno | 1 comment(s)
Archivado en:

image47dd1de4 

Buenas,

como hoy es sábado y no me funciona el messenger, voy a escribir un poco sobre la vida del Shuba, un excelente programador del que he aprendido muchas cosas.

 

Ya compila, está listo !!! It’s Done !!!

El Shuba era un excelente programador, muy inteligente, una persona que aprendía nuevos conceptos muy rápidamente y recuerdo que en sus primeros años programando, él solía soltar un “it’s done”, cuando el CTRL+SHIFT+B le mostraba una compilación sin errores. Su jefe en esos tiempos, era un persona que estaba un poco de vuelta y no quería muchos problemas. Como conocía al Shuba y sabía que la respuesta era “está terminado”, le soltaba frases como:

- Shuba, terminaste la aplicación XYZ?

- It’s done Risa

- Genial !!!; le acabo de decir a Rosa de Recursos Humanos que la pruebe, andá con ella y a ver que te dice.

Aquí se acababa la alegría del Shuba, porque claro, tenía que improvisar un despliegue de una aplicación que había compilado y poco más. Supongo que la mayoría ya se imagina el resto; 2 días después del primer intento de despliegue, llega con Rosa con la aplicación en su portátil (eso de desplegar a producción es un infierno) y se encuentra con una mujer que le dice que esa aplicación no tiene nada que ver con lo que ella había pedido, que así no funcionan las cosas, etc. El pobre Shuba, cuando volvió con su grupo de amiguetes, encima tuvo que soportar frases como “Rosa todavía está esperando la aplicación” y ver que habian apostado para ver cuanto tardaba en volver derrotado como un holandes. Por suerte y para compensar a la panda de impresentables de compañeros de trabajo del Shuba, su jefe era buena gente y además de enseñarle, le mostraba los caminos por donde tropezar para que aprenda más rápido.

 

Lo hice como querían y además lo probé !!!

Pero el Shuba no era tonto, ni mucho menos; le dió a la cocorota un buen rato e ideó un plan. Se sentó con Rosa toda una tarde, y escuchó cada uno de sus pedidos; los apuntó en una lista bastante detallada y se puso manos a la obra con la versión 2.0 de la aplicación XYZ. Después de trabajar varias semanas, en la versión nueva; decidió que ya estaba lista para que Rosa le diera su feedback. Pero esta vez se anticipó a los futuros problemas: tomó la hoja de requerimientos de Rosa y verificó que cada uno de los mismos estuviese implementado en la aplicación (en este punto creo lo que el luego llamaría “el plan de pruebas de Satanas”, aunque eso mejor llega después)

Como lo de desplegar a producción, seguía siendo trabajo de ligas mayores, pues el Shuba agarró su portátil, le dió un toque a Rosa y le dijo: en 5 minutos estoy por allí. Y, efectivamente, en 5 minutos estaba con Rosa dispuesto a mostrarle la aplicación XYZ 2.0. Esta vez, su sesión con Rosa solo duró 2 minutos, porque apenas había lanzado la aplicación, se encontró con en la siguiente situación:

- Perooooo, la aplicación es AZUL. Eso NO PUEDE SER.

- Hace un tiempo me dijiste que la aplicación tenía que ser AZUL.

- No way, desde hace 1 mes todas nuestras aplicacion son NARANJAS. Cambia eso y la vemos de nuevo.

El Shuba cerró su portátil y volvió a su escritorio, donde sus compañeros estaban viendo quien había ganado la apuesta del tiempo que iba a estar con Rosa.

 

Algo cambió pero no se qué es Triste !!!

El Shuba ignoró a sus compañeros, y pensó que solo tenía que cambiar el color de la aplicación de AZUL a NARANJA. Como era una persona organizada y tenía una aplicación basada en estilos; se puso a modificar los estilos de unas vistas, los estilos generales de presentación y en un día ya tenía el cambio listo; inició la aplicación vio que la aplicación era NARANAJA y se le dibujó una sonrisa de oreja a oreja.

De nuevo, el pedido de 5 minutos con Rosa, y arriba a la oficina de la susodicha. El Shuba pensaba que esta vez, las tenia todas consigo; pero se encontró con lo siguiente:

- Ahora si Rosa, la aplicación es NARANJA; como dicen los estándares.

- Bien Shuba, vamos a hacer un ajuste en un balance, para ver si la podemos empezar a probar.

- Espera que entro en el formulario de ajustes y ….

Pues hasta aquí llegó la alegría del Shuba, si bien algunos formularios se veían bien; el cambio de estilos había hecho que otro sean completamente imposibles de utilizar. Se habían movido controles, cambiado el tamaño de los mismos, etc. En este punto Rosa, se dió cuenta de que así no llegaba a ningún lado, asi que le dijo a Shuba que mejor probarán lo que funcionaba y lo demás lo veían en otro momento. Asi que Rosa comenzó a probar la aplicación y al cabo de 30 minutos, y al no poder cerrar un ciclo completo el Shuba se vió inundado de cambios para la aplicación. Frases como, “cuando arregles esto, ya que estás, cambia esto otro …”, hicieron que esta vez el Shuba estuviese a punto de desmayarse. Pero se lo tomó tranquilamente e intentó ser profesional (o lo que él entendía como profesional)

 

La aplicación va tomando forma Risa

Asi que una vez más el Shuba volvió a su escritorio, actualizó el listado de requerimientos , luego actualizó el excel de pruebas y se encargó de comenzar a aplicar los cambios. Un compañero, con un poco más de experiencia a cuestas, le recomendó que organizará reuniones con Rosa más frecuentes, para que la aplicación XYZ no sea una sorpresa. Asi que ahora, el Shuba se juntaba un par de horas por día con Rosa y discutían los avances de la aplicación y veían que todo fuera por el camino correcto. Luego el Shuba aplicaba los cambios, realizaba las pruebas y se encarga de solucionar los errores.

En varias ocasiones, tuvo algún malentendido con Rosa ya que lo que ayer era una fórmula [x + y = 10], hoy se convertía en [x + y = 11]. Esto afectaba no solo a la aplicación, sino también a la necesidad de tener que probar todo nuevamente para que la aplicación sea consistente en todos sus flujos. Cuando estaban llegando al final del desarrollo de la versión 1.0, el listado de pruebas era “un infierno” y probar todos los flujos era una tarea de varios días para el Shuba y Rosa; pero ambos trabajaban mano a mano y se encargaban de mantener una aplicación estable y coherente con lo que el equipo de Rosa necesita.

 

En producción no funciona Triste

Al cabo de un tiempo, tanto Rosa como el Shuba estuvieron de acuerdo en que la aplicación podía ser utilizada por varias personas del equipo de Rosa, asi que ya podían ponerla en producción. El jefe del Shuba dió el visto bueno, y le dijo al Shuba que hablase con Paco para que le dé una mano en el despliegue a producción.

Lo primero que le preguntó Paco a el Shuba era los cambios en la configuración que deberían hacer para que la aplicación XYZ funcione en producción, el Shuba le dijo que solo cambiar la cadena de conexión a la base de datos de producción y los usuarios podían comenzar a trabajar. Paco, que tenía bastantes años trabajando en esto, le preguntó si había verificado permisos de acceso a la base de datos, permisos de escritura en disco, etc. de la aplicación y el Shuba le dijo que su aplicación no hacía nada “raro” así que debía funciona sin problemas. Paco hizo de tripas corazón e hizo el primer despliegue.

Cuando el despliegue estuvo listo, Rosa decidió que su equipo conociese la aplicación y estos son algunos de los errores con los que se encontró a los 5 minutos de intentar utilizar la aplicación XYZ:

- Una parte de la aplicación consultaba un servicio externo para tener acceso a los valores de la bolsa. En los ordenadores de Rosa y su equipo no podían acceder a este servicio. Después de averiguar un poco, el Shuba se enteró que no todos los usuarios tienen el mismo nivel de acceso a internet.

- Cuando la aplicación fallaba, intentaba grabar un log en el disco [C:\Errores]. Aquí también la aplicación daba un error bastante feo ya que los usuarios del equipo de Rosa no tenían permisos para acceder al disco C:

- Los permisos de acceso a la base de datos no estaban aplicados, porque … bueno nadie sabe.

- etc.

El Shuba apuntó uno a uno los errores que se iban presentado y evaluando los mismos con Rosa y Paco de Producción, los fueron solucionado de manera organizada. Después de un par de semanas, y de mil peleas diferentes, pudieron tener la aplicación en producción. El Shuba y Rosa, se sintieron bastante decepcionados, ya que estaban muy orgullosos de su trabajo; pero comprendieron que un trabajo está listo no solo cuando compila, pasa las pruebas y el usuario clave está satisfecho con la aplicación; sino que además tiene que estar desplegado y en funcionamiento (bueno en realidad esto es mucho complicado, pero ese es material para otro post).

 

Cambio de jefe Caluroso

Fué por estos días cuando el jefe del Shuba llegó por fin a jubilarse como había querido desde hace tiempo. Un nuevo jefe comenzó a trabajar en el equipo de sistemas, y cuando escuchó la historia del Shuba, le dijo lo siguiente:

Shuba, has realizado un excelente trabajo. Tal vez sin pretenderlo has apuntado tu trabajo sobre las siguientes bases:

  • Has trabajado orientado a pruebas
  • Las pruebas se han convertido en el contrato de trabajo que define las funcionalidades que posee tu aplicación
  • Has ido evolucionando en tu relacion con “tu cliente”, hasta lograr una sinergia donde la responsabilidad del trabajo era del 50% y 50%
  • Has gestionado los cambios y los despliegues de una forma controlada, siempre respetando la funcionalidad de la aplicación

En este punto, hay muchas cosas que mejorar, como por ejemplo:

  • Automatizar las pruebas, con pruebas unitarias y pruebas de interfaz de usuario
  • Gestionar los cambios, incorporando trazabilidad a los mismos
  • Poder tener una estimación real del trabajo realizado, para utilizarla como base para trabajos futuros
  • Realizar un seguimiento más detallado, sobre el trabajo real que realizan Rosa y vos

Vení que te muestro como funciona Visual Studio 2010 Application Lifecycle Managenement Risa

A partir de aquí la vida del Shuba cambió radicalmente, siguió haciendo su trabajo como antes, pero con unas herramientas que le permitían ser mucho mas productivo/feliz.

 

Saludos @ Home

El Bruno

   

image47dd1de4

Buenas,

pues si, después de hablar del CollectionAssert en el post de ayer, hoy le toca al StringAssert.  Esta clase nos permitirá realizar diferentes tipos de acciones con cadenas de texto, para poder evaluar el resultado de las mismas en nuestras pruebas unitarias. Por ejemplo:

  • Verificar si una cadena contiene otra cadena
  • Verificar si una cadena cumple o no cumple con una expresión regular
  • Verificar si una cadena comienza o termina con otra cadena

La información completa de esta clase se puede encontrar en http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.stringassert.aspx, y una vez más, un poco de código para desestresarnos:

   1: using Microsoft.VisualStudio.TestTools.UnitTesting;
   2:  
   3: namespace ElBruno.DemoUnitTesting
   4: {
   5:     [TestClass]
   6:     public class StringAssertTest
   7:     {
   8:         public TestContext TestContext { get; set; }
   9:  
  10:         [TestMethod]
  11:         public void VerificaSiUnaCadenaContieneOtraCadena()
  12:         {
  13:             const string str1 = "1234567890";
  14:             const string str2 = "546789";
  15:             StringAssert.Contains(str1, str2);
  16:         }
  17:  
  18:         [TestMethod]
  19:         public void VerificaSiUnaCadenaEmpiezaConOtraCadena()
  20:         {
  21:             const string str1 = "12345";
  22:             const string str2 = "1";
  23:             StringAssert.StartsWith(str1, str2);
  24:         }
  25:  
  26:     }
  27: }

 

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

entre tanto mal momento con el que tengo q lidiar en estos días, hoy el amigo Alfredo me ha alegrado el día: he conocido muy pero muy tarde la clase CollectionAssert. Esta clase, permite realizar diferentes opciones cuando trabajamos con colecciones en pruebas unitarias. Permite por ejemplo:

  • Comparar 2 colecciones
  • Verificar si una colección es “subset” de otra
  • Verificar el tipo de todos los elementos de una colección
  • Verificar si una colección contiene un elemento (o si no lo contiene)
  • etc.

La información completa de las capacidades de esta clase se puede consultar en http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx; y como siempre un par de líneas de código vale más que una lista completa de ayuda:

 

   1: using Microsoft.VisualStudio.TestTools.UnitTesting;
   2:  
   3: namespace ElBruno.DemoUnitTesting
   4: {
   5:     [TestClass]
   6:     public class Class1Test
   7:     {
   8:         public TestContext TestContext { get; set; }
   9:  
  10:         [TestMethod]
  11:         public void ComparaElementosEnDosColecciones()
  12:         {
  13:             var col1 = new System.Collections.Generic.List<string>() { "a", "b", "c" };
  14:             var col2 = new System.Collections.Generic.List<string>() { "a", "b", "c" };
  15:             CollectionAssert.AreEqual(col1, col2);
  16:         }
  17:  
  18:         [TestMethod]
  19:         public void VerificaLosTiposDeLosElementos()
  20:         {
  21:             var col1 = new System.Collections.Generic.List<int> { 1, 2, 3 };
  22:             CollectionAssert.AllItemsAreInstancesOfType(col1, typeof(int));
  23:         }
  24:  
  25:         [TestMethod]
  26:         public void VerificaQueNoSeRepitanElementos()
  27:         {
  28:             var col1 = new System.Collections.Generic.List<int> { 1, 2, 3, 4 };
  29:             CollectionAssert.AllItemsAreUnique(col1);
  30:         }
  31:  
  32:         [TestMethod]
  33:         public void VerificaQueUnaColeccionEsSubSetDeOtra()
  34:         {
  35:             var col1 = new System.Collections.Generic.List<string>() { "a", "b", "c" };
  36:             var col2 = new System.Collections.Generic.List<string>() { "b", "c" };
  37:             CollectionAssert.IsSubsetOf(col2, col1);
  38:         }
  39:     }
  40: }

Obviamente todo para obtener:

image

Saludos @ Here

El Bruno

   

image

Buenas,

hace un par de días escribí un post donde comentaba el roadmap de Enterprise Library para el año 2011 y como el mismo apuntaba a dar soporte a ASP.Net MVC y a Silverlight. Al margen de lo bueno o malo de esto, una vez más me encontré con amiguetes y compañeros que le pegan a EntLib por donde menos le duele, en este caso por Twitter Rodrigo (@r_corral) y Javi (@jcalvarro); y en vivo un par más. Así que, intentando ser neutral (como un suizo como me diría Hadi @hhariri), comentaré lo que usualmente escucho sobre EntLib y mi opinión al respecto.

 

1. Algunos bloques están desfasados

Pues sí y es una pena que no los saquen de la lista de bloques, porque seguir teniendo un bloque para la gestión de la seguridad no tiene sentido. Por ejemplo, desde Visual Studio 2005 los Membership Providers dan una excelente solución para escenarios de autenticación y autorización, no veo necesario seguir manteniendo el Application Block de Seguridad (ni hablar de WIF, etc). Otro ejemplo es el Caching Aplicacion Block. El mismo tenía su razón de ser cuando queríamos tener capacidades de Caching en entornos no Web por favor, no agregues como referencia System.Web en una aplicacion Windows; pero ahora que .Net Framework 4.0 tambíen nos dá esta capacidad, pues bueno, será momento de ir reciclando.

Un dato en este punto, varias de las funcionalidades que posee EntLib, han llegado luego al Framework y se han eliminado de EntLib. El mejor ejemplo, es tal vez la gestión de la configuración que antes de .Net Fwk 2.0 era un poco infierno y el Application Block de Configuración era una ayuda que se agradecía; ahora con System.Configuration pues ya tenemos el problema resuelto.

 

2. La ejecución de los bloques es muy lenta

Este es otro de los argumentos que dan para debatir un rato largo. Por lo general aplica al Logging Application Block, pero yo aqui siempre intento hacer un ejercicio para ver la mejor solución posible porque no todas las aplicaciones tienen requerimientos funcionales que necesiten grabar millones de logs por milisegundo y si lo tienen, seguramente tampoco .Net pelado es una opción. Comento un ejemplo reciente.

En un cliente utilizamos LAB (Logging Application Block) para dar soporte a un sistema de mensajería interna y trazas entre aplicaciones. Como la app funciona correctamente, un directivo, en un acto que demuestra su inteligencia y su gran capacidad de razonamiento propone mover el esquema físico de la aplicación a todas las dependencias de la empresa en España, Portugal, Francia, etc. Vamos que sin preguntar, cae un marrón de esos que asustan. A mi personalmente, estas decisiones poco me importan, ya que si se puede –> BIEN, y sino se puede o es una venta de humo; pues se hace BIEN O NOS VAMOS. Pero le dimos una pensada y una pensada de las buenas, y llegamos a la conclusión de que aprochando las capacidades de trabajo asíncronas con colas MSMQ de LAB podiamos desplegar la aplicación, centralizar la grabación de logs y cambiar de repositorio desde el visor de eventos a una base de datos SQL, sin tocar una línea de código, simplemente modificando la configuración. Comento este caso, porque un compañero estaba dispuesto a escribir un artefacto de la muerte encargado de hacer todo este trabajo, y yo intenté hacer de “suizo” para obtener la mejor solución posible. En el ejemplo anterior, después de analizarlo lo importante no era “la velocidad” de ejecución de los bloques, sino la capacidad de los mismos; para velocidad algún día comentaré las trazas de una aplicación de banca que realmente asustaba Sonrisa.

Un dato final, es cierto que en las versiones iniciales de EntLib la carga de ensamblados era muy lenta, ya que la creación de objetos se realizaba con una factoria llamada ObjectBuilder, que creaba tipos  por reflection a partir de una configuración, etc. Ahora con Unity, este modelo ha cambiado completamente y la “sobrecarga” de trabajo es la que posee Unity; además se ha deshabilitado por defecto la notificación de eventos, se han eliminado los eventos WMIs, etc.

 

3. Prefiero escribir el código sensible de una aplicación yo mismo

Aquí hay discusión para rato, y no las clásicas “yo soy más inteligente que los de Patterns and Practices”, o que “los de P&P son muy feos”; sino más bien relacionada con el contexto  de negocio de una aplicación. Me explico; los bloques de trabajo de Enterprise Library son muy generalistas, son soluciones generales a problemas usuales. Si bien, creo que cubren la casuística de muchos escenarios, en algunos casos es necesario optar por una solución propia o modificar alguna parte de EntLib para dar por cerrado estos problemas.

Por otra parte, EntLib es código abierto, asi que puedes leerlo y criticarlo todo lo que quieras. De buena fuente, sé que el equipo de P&P están abiertos a recomendaciones y cambios. Un ejemplo de ello, es que en EntLib4, se entregaban todos los bloques y Unity como componentes separados; pero era un poco “cantoso” que la propia EntLib no se desacoplara utilizando Unity, asi que en EntLib5 ya está todo desacoplado.

Volviendo a los términos “codigo sensible” y “yo mismo”; pues aquí mi recomendación es: cuidado. Muchas veces queremos ser mejores que el mejor y a la larga los que sufren las consecuencias son nuestros clientes eso en mi caso que a mi nómina me la pagan mis clientes y ellos tienen que estar contentos y satisfechos Sonrisa, si a tus clientes no les importa que las aplicaciones no funciones o que los proyectos se atrasen pues te envidio Aunque si lo que escribes es mejor o más útil, pues compártelo que para eso estamos.

 

Podría seguir escribiendo un buen rato, ya que he escuchado otros puntos como:

 

Finalmente, si tienes algo que comentar del porqué no te gusta Enterprise Library, Codeplex es un excelente lugar o este post para ver una versión en español.

 

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

hace unos días, el gran Grigori Melnik escribió un post con el Roadmap para Enterprise Library. En el mismo, me llamó la atención que una vez estabilizada la versión actual (Enterprise Library 5.0) y entregados los materiales para que la comunidad pueda utilizarla, tutoriales,  libros, hands on labs, etc.; el próximo año el el foco estará en crear nuevas versiones de EntLib para plataformas como ASP.Net MVC o Silverlight.

Con todo el revuelo que hay ahora entre Silverlight vs HTML 5, o Batman vs Joker; creo que es bueno saber que para aquellos desarrollos “orientados a negocio” por ejemplo para Windows Phone 7, podremos contar con una plataforma como Enterprise Library. Lo mismo aplica para ASP.Net MVC.

image

En Avanade tenemos una versión homemade de EntLib para Silverlight, con la que hemos afrontado exitosamente algunos proyectos, pero creo que si el soporte viene de la gente de Patterns and Practices, pues mucho mejor.

Pues bueno, a esperar y probar las betas Risa

 

Saludos @ Here

El Bruno

   

Fuente: http://blogs.msdn.com/b/agile/archive/2010/11/03/enterprise-library-roadmap.aspx

image47dd1de4

Buenas,

cuando los archivos de MSBuild comienzan a ser más grandes que lo que aconseja el sentido común, pues es una buena idea, separar los mismos en varios archivos y además separar los MSBuild Targets en Targets más pequeños. Vamos que los mismos principios SOLID que aplicamos cuando escribimos código, deberíamos intentar aplicar en el diseño y construcción de nuestros archivos de MSBuild (ojo, que no soy un inconsiente y sé que MSBuild es poco más que un lenguaje, pero por pedir que no falte). Pero bueno, cuando empezamos a separar y a aislar los targets, también nos encontramos en la situación de querer probar el funcionamiento de los mismos de manera aislada y esto puede complicarse, principalmente por la naturaleza de MSBuild, donde es muy común que para invicar a un Target necesites una serie de propiedades o Items con valores ya establecidos.

Supongamos que tenemos el siguiente proyecto MSBuild.

   1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
   2:          ToolsVersion="4.0">
   3:   <Target Name="Target1">
   4:     <Message Text="Mensaje 1: $(Nino)"/>
   5:   </Target>
   6:   <Target Name="Target2">
   7:     <Message Text="Mensaje 2: $(Nino)"
   8:              Condition="'$(Nina)'=='Martina'"/>
   9:   </Target>
  10: </Project>

 

Si ejecutamos el mismo desde la línea de comandos veremos un resultado similar al siguiente, donde el primer target se ejecuta, pero en ningún momento estamos definiendo la propiedad $(Nino) para mostrar el valor de la misma.

image

 

Para asignar un valor a esta propiedad, sin tener que modificar el proyecto, simplemente utilizamos la opción /propertyName en la llamada, por ejemplo:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>msbuild "C:\srcBruno\Agile01\MsBuild Tests\CmdInvokeProperties_01.targets" /property:Nino=Valentino

Si ejecutamos el comando veremos como la tarea que muestra el mensaje, muestra el valor de la propiedad

image

 

Si ahora queremos probar el Target2, y además agregar otra propiedad para que la condición (línea 8) sea válida, pues también utilizamos la opción /target, por ejemplo:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>msbuild "C:\srcBruno\Agile01\MsBuild Tests\CmdInvokeProperties_01.targets" /target:Target2 /property:Nino=Valentino;Nina=Martina

El resultado de la ejecución ejecuta el segundo Target y además interpreta como válida la condicion.

image

 

Este HACK es mu simple, pero puede sacarnos de más de un problema al momento de trabajar e intentar probar nuestros MSBuild Targets.

La referencia completa de la línea de comandos se puede consultar aquí.

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

hoy me ha tocado uno de esos días interesantes donde estoy con un poc de fiebre a punto de matarme con un resfrío y además me toca bucear entre ensamblados y código ajeno. Para esto he tirado del Architecture Explorer, y mi compañero Alfredo me ha preguntado como funciona esto; así que, una vez que se lo he mostrado a Alfredo, pues también escribo un post al respecto.

El siguiente tutorial muestra como analizar los ensamblados que se generan con Enterprise Library 5.0, y que por defecto se almacenan en [c:\EntLib50Src\bin].

Tutorial

1. Abrir Visual Studio 2010

2. Abrir el Architecture Explorer utilizando el menú [View // Architecture Explorer]

3. En la 1ra columna del ArcExplorer seleccionar la opción [File System // Select Files …]

image

 

4. Seleccionar el archivo [EntLibConfig.exe]. Utilizaremos este archivo como punto de partida para realizar el analisis de los ensamblados a los que hace referencia este archivo.

5. Selecionamos el elemento que hemos cargado en la 1ra columna y cambiamos el modelo de navegación. Por defecto muestra la opción [Outbound Navigation // Contains] que muestra los miembros del ensamblado .Net, en nuestro caso cambiaremos a la opción [Outbound Navigation // References] que nos mostrará las referencias del ensamblado.

image

 

6. En este momento ya podemos generar un gráfico con los ensamblados y sus referencias, utilizando la opción [Generate New Graph] de la botonera vertical del Architecture Explorer. El gráfico debería ser similar al siguiente

image

 

7. Si en este punto queremos “subir un nivel más” en el árbol de dependencias, pues seleccionamos los ensamblados de Enterprise Library y vemos las referencias asociadas.

image

 

8. Agregamos las mismas al gráfico actual y ya podremos ver un diagrama de referencias más completo.

image

 

9. Finalmente, podemos tener una vista más clara si cambiamos las opciones de visualización e inclusive podremos realizar un análisis de los elementos para encontrar referencias circulares, hubs, etc.

 

Utilizar el Architecture Explorer es una buena forma de comenzar a comprender las relaciones entre ensamblados, el siguiente paso –> Reflector Risa

 

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

si hace unos días comentaba sobre una serie de parches para solucionar los problemas con las scrollbars en Visual Studio 2010, hoy toca apuntarme otro parche, esta vez para Microsoft Test Manager 2010 para el mes de Octubre.

Este parche soluciona varios problemas, entre ellos algún que otro memory leak, que por suerte no he sufrido.

La descripción completa del contenido del parche se puede leer en http://support.microsoft.com/kb/2387011#

Apuntado !!!

 

Saludos @ Home

El Bruno

   

Descarga; https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31858&wa=wsignin1.0

Fuente: http://feedproxy.google.com/~r/clemensreijnen/qzrF/~3/xcHeOjrWK6w/post.aspx

image47dd1de4

imageBuenas,

este post no comentará nada nuevo, asi que si quieres ahorrarte el tiempo de leer obviedades, es buen momento para darle a la [J] en el Google Reader o al [CTRL+F4] si has llegado directamente hasta aquí. Si por otra parte esperas encontrarte con un buen contenido técnico sobre las tripas de Team Foundation Server 2010 o con algún truco mágico que te salve el final de un proyecto ajustado, pues de nuevo [J] o [CTRL+F4].

Ahora que ya he aplicado una técnica de disperción basada en ser borde como House (aunque no tanto, que todavía no tengo bastón); pues soltaré el siguiente cubo de agua fría en todos aquellos productos que tienen a su alcance una excelente herramienta combinación de herramientas de trabajo, como Visual Studio 20XX + Team Foundation Server 20XX y no las aprovechan.

En mi día a día como consultor, ya he perdido la cuenta de la cantidad de veces que me he encontrado con equipos de trabajo, de gente muy capaz que utiliza “sólo” a Team Foundation Server como gestor de código fuente; vamos que han migrado de Visual Source Safe a Team Foundation Server, pero no han sabido aprovechar las capacidades de la nueva herramienta para mejorar el trabajo diario.

Un gran ejemplo, es el que se puede ver en la figura a la derecha, donde la base de Team Foundaiton Server es explotar las relaciones entre

  • WorkItems
  • Builds
  • Source Control

Muchas veces he escuchado, que es muy tedioso gestionar las tareas, bugs, etc.; o que trabajar con una estregia de Branching y Merging es muy complicado; y que automatizar la compilación y empaquetado de software requiere mucho esfuerzo; pero el gran problema frente a estos argumentos, es que las ventajas que dá el comenzar a trabajar con diferentes principios, no tiene una métrica con la que comparar. Si actualmente no es posible conocer aspectos como los siguientes, pues lo tendremos muy díficil si queremos cambiar:

  • Cuánto trabajo no planificado estoy agregando a mi pila de trabajo?
  • Puedo mantener un esquema de desarrollo correctivo y desarrollo evolutivo en paralelo?
  • Soy capaz de empaquetar y probar mi software o aplicación rápidamente?

Estas preguntas son un pequeño ejemplo, pero si queremos realmente hacer un análisis del estado de nuestro software deberíamos pensar en por ejemplo, aplicarnos el test de las 12 preguntas de Joel Spolsky (lectura altamente recomendada si no conoces a este personaje del mundo de la informática).

Un ejemplo que veo muchas veces es el siguiente:

Supongamos que tenemos a un equipo de desarrollo que trabaja desarrollando un sitio web (silverlight, asp.net mvc, webforms, o lo que esté de moda); y el día lunes ponen una versión 1.0 del website en producción. El proyecto ha sido todo un éxito, y como durante la fase de testing no se encontró ningún error, pues el equipo de desarrollo comienza a trabajar en los cambios para la versión 2.0 del website. Uno de estos cambios supone un cambio muy grande en la arquitectura del mismo, asi que es uno de los primeros cambios; y una vez implementado se continua con los demás. Cuando ha pasado un tiempo, los usuarios reportan un error muy grave en el website; y claro –> suenan las alarmas. El jefe del equipo de desarrollo, analiza el problema, y da con el error; pero para implementar la solución, va a tener que llevar además una serie de nuevas features y cambios muy grandes a producción, ya que la forma en la que trabaja con el gestor de código fuente no le permite implementar este cambio aisladamente de  elos nuevos desarrollos.

Este ejemplo, que parece muy trivial, es bastante común y la verdad con las capacidades de los gestores de código fuente que tenemos actualmente, pues es una pena no adoptar una estrategia de Branching y Merging, que permita dar soporte como mínimo a los desarrollos evolutivos y a los desarrollos correctivos. Para esto, solo hay que leer algún documento que nos enseñe a aprovechar las capacidades de las herramientas. La guía de Branchng y Merging de TFS2010 en Codeplex es un buen ejemplo (http://tfsbranchingguideiii.codeplex.com/)

Agora bien, volvamos a Team Foundation Server 2010 o versiones anteriores –> es una gran herramienta, no es solo una evolución de Visual Source Safe; y una de las grandes ventajas que nos propone es que, una vez que decidmos cambiar la forma de trabajo, toda la información relacionada entre Source Control, Builds y WorkItems, está disponible para analizar y ver la realidad del estado de nuestros proyectos. Yo usualmente comento, que para lo bueno y para lo malo, TFS es transparente en la información que muestra. Y además en la que no muestra, porque por ejemplo: si no somos constantes en seguir una línea de trabajo y organizar nuestros WorkItems, pues al tiempo veremos que los informes de proyectos muestran información que puede parecer errónea; pero que realidad es una foto de como trabaja nuestro equipo.

En algún próximo post, explicaré lo que yo llamo [baby steps] sobre como comenzar con Team Foundation Server; tratando de no atarme a ninguna metodología de procesos; pero si criticando a quienes tienen la herramienta y no la utilizan correctamente Risa

 

Saludos @ Home

El Bruno

   

  • PD: como en el post anterior, una vez más he tratado de ser independiente de la metodología de procesos con la que trabajemos