Modernizandome o los reyes magos no son los padres…

Es curiso como evolucionan ciertas creencias según vas creciendo… Primero piensas que los Reyes Magos vienen de Oriente en camello. Luego descubres que son los padres, con una sensación de alivio (me intraquilizaba que tres tios se colasen en mi casa a deshoras para beber orujo) y desengaño a la vez. Pero lo peor es cuando descubres que esto tiene fecha de caducidad… que realmente tu eres el Rey Mago durante la mayor parte de tu vida… Menos mal que tiene sus ventajas… a partir de este momento los Reyes siempre aciertan!!! Y este año han acertado… o al menos eso espero…

 Este año me he traido, si si, ya se que antes de tiempo, una PDA. Los que me conoceís estareís flipando, voy a abandonar mi Nokia… creo que de Plain Concepts era el único que no tenia un dispositivo con Windows Mobile, lo que tenia como consecuencia que tubiese que aguantar todo tipo de comentarios más o menos ‘ofensivos’ sobre mi grado de ‘frikismo’ tecnológico… Pues bien eso se acabo. Evidentemente no voy a estar a la altura de mi amigo ‘o bruxo mobile’ (lease obrussomovail), Unai Zorrilla, que acarrea por el mundo del orden de tres a cuatro dispositivos, incluso, dicen las malas lenguas, que dentro de la ducha.

El caso es que para que yo me comprase una PDA esta tenia que cumplir una condición ineludible, tener radio integrada. Seguro que a Unai esto le parece una chorrada pero para mi era condición necesaria. A principios de esta semana veia el dispositivo de mis sueños… una HTC P3300: con radio, gps, telefono y pda todo integradito en un dispositivo de tamaño manejable. Solo me preocupaba una cosa, el procesador ‘solo’ es a 200Mhz, así que le pregunte al bruxo, que me dijo literalmente y con cierto tonito de desden: ‘Para lo que tu vas ha hacer te sobra’, y la verdad es que tiene razón!!!. Por poner un pero: no creo que el juego ese de las bolas vaya tan rápido como en el JasJar de Unai… pero claro solo Unai, que debe tener el record del universo en el juego en cuestión podria notarlo… Bien es cierto que ser rumorea que además de jugar con las bolas, el bruxo sabe hacer alguna que otra cosa interesante con esos chismes.

Así que tome la decisión y compre mi PDA en Antzup. Acojanante el servicio. Llaman para confirmar el pedido, llaman para confirmar el pago, todo además con seguimiento por mail y web y en menos de 18 horas tenia el ansiado chisme en mi poder. Acojonante… Así que espero que mis familiares no prentendan entrablar mucha conversación estas navidades, estaré ensismismado con mi nuevo juguete. El que quiera conversación que me llame a la PDA ejejejjee….

¿Existirá algún cliente para Team System que corra en estos chismes? De momento no he encontrado nada…

Además, no se queda aquí mi modernización!!! Me he instalado Office 2007 y he abandonado Outlook Express, otro de los puntos de sorna de mis amigos de Plain Concepts. Y la verdad es que me encanta Office 2007, realmente impresionante y el cambio de los menus a los ‘ribbons’ no a podido ser más sencillo. Recomiento a todo el mundo que este en dudas que de el salto, claramente merece la pena.

Espero que con tanto cambio no acabe como Raiman, dandome cabezazos contra la parez… ya os iré contando.

Ala… a jugar a pala…

¿Cuántos proyectos NO gestionas?

Cuando imparto formación sobre gestión de proyectos suelo preguntar a los asistentes cuantos proyectos gestionan. Si entre la audiencia hay jefes de proyecto, inevitablemente estos responden cifras del orden de 5, 6 o incluso más proyectos. Despues de impartir el curso suelo replantear la pregunta, del siguiente modo: ¿Cuantos de vosotros seguís pensando que gestionaís 5 o 6 proyectos?. La pregunta siempre queda sin respuesta.


Hace poco surgia el tema en este blog, en un comentario a un post anterior mio, Jefe de Proyecto: ¿técnico o gestor?.


En mi opinión nadie puede gestionar más de un par de proyectos y realizar una buena gestión de proyectos. La gestión de proyectos implica un trabajo continuo desde dentro del proyecto, con una alta implicación en el mismo. Con independencia de la metodología elegida sea esta ágil o guiada por un plan para decir que realizamos gestión de un proyecto debemos abordar multitud de cuestiones que para un proyecto pequeño ya exigen plena dedicación: gestión del riesgo, del personal, de los cambios, del presupuesto, de las relaciones con el cliente, de los requisitos, de la calidad, etc…


El problema es que el rol de jefe de proyecto no tiene termino medio: o ayudas al exito del proyecto o lo entorpeces. Si un jefe de proyecto está gestionando muchos proyectos el resutado práctico no es solo que no está gestionando ninguno, sino que además esta entorpeciendo el progreso de esos proyectos. Esto generalmente supone que o alguien está haciendo la gestión de manera implicita y no explicita, lo que tiene un gran coste para la gestión efectiva del proyecto, o bien nadie está gestionando efectivamente el proyecto, situación aun peor.


El problema con gestionar un número elevado de proyectos es que el tiempo que se debe dedicar a la gestión del proyecto se pierde en ‘cambios de contexto’. Gerald Weinberg propuso la siguiente tabla:



























Número de Proyectos Tiempo disponible por proyecto Tiempo perdido en cambios de contexto
1 100% 0%
2 40% 20%
3 20% 40%
4 10% 60%
5 5% 75%

Resumiendo es imposible gestionar más de 5 proyectos y es muy ineficiente gestionar más de 2. Puesto que esto es evidente, a poco que se piense friamente: ¿Por qué se empeñan las empresas en el espejismo de tener jefes de proyecto que gestionan un alto número de proyectos? ¿Quizá ese empeño es la raiz última de que tantos proyectos fallen? ¿Quizá nadie está efectivamente gestionando los proyectos y por eso fallan? ¿Cuantos proyecto gestiona un jefe de proyecto en proyectos no informáticos?. En fin creo que es un tema sobre el que se debería reflexionar…

Esperar a que los hilos acaben cuando termina un proceso

Una pregunta habitual relacionada con el desarrollo multihilo en plataforma .net es ¿Cómo espero a que los hilos que lanza mi aplicación acaben? El último que me la realizaba era uno de los alumnos del curso de Programación Multihilo que imparto en Campus MVP. No hay una respuesta única. La respuesta varia según se trate de un hilo que hemos creado explicitamente o un hilo que hayamos creado usando el pool de hilos de .Net.


El escenario que generalmente se plantea es que una aplicación lanza hilos, y queremos evitar que los hilos mueran sin concluir su trabajo cuando la aplicación termina.


Tenemos múltiples posibilidades:


Podemos antes de terminar el hilo principal de la aplicación, tener un tiempo durante el cual el hilo principal da tiempo a que el resto de hilos terminen. Para ello el hilo principal se duerme, y no crea más hilos. Para ello basta con poner una llamada a Sleep en las rutinas de finalización de nuestra aplicación.


//En aplicaciones Windows usamos el evento
//ThreadExit del objeto Application
static void Application_ThreadExit(object sender, EventArgs e)
{
  //Damos tiempo a que acaben los hilos ya lanzados…
  System.Threading.Thread.Sleep(10000);
}
 

//En servicios de Windows usamos la función OnStop
protected override void OnStop()
{
  //Damos tiempo a que acaben los hilos ya lanzados…
  System.Threading.Thread.Sleep(10000);
}
 

Pero esto puede no ser suficiente si necesitamos tener la certeza de que nuestros hilos acaben. Para ello podemos establecer IsBackground de los hilos que creamos a false.


Thread t = new Thread(new ThreadStart(ThreadMethod));
t.IsBackground = false;
t.Start();

De esta manera evitamos que el proceso muera mientras quedan hilos en ejecución. Eso si debemos tener en cuenta que esta aproximación puede interferir con el cierre de nuestras aplicaciones o incluso del sistema. Esto es especialmente molesto cuando los hilos los estamos creando en un servicio. Los servicios tienen un tiempo máximo para detenerse, trascurrido el cual el SCM lanza un error.


Cuando usamos el pool de hilos el proceso es un poco diferente, pues no tenemos acceso al hilo directamente. En cualquier caso desde la función de trabajo que pasamos a QueueUserWorkItem podemos obtener el hilo actual y establecer su propiedad IsBackground a false.


ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod));

static void WorkMethod()
{
  //Antes de realizar ningún proceso establecemos la propiedad
  //IsBackgrount a true
  Thread.CurrentThread.IsBackground = false;
}

Oferta de trabajo: Scrum y Calidad

Cómo algunos ya sabreís además de trabajar en Plain Concepts, trabajo en Sisteplant, la empresa donde estaba ya antes de fundar Plain Concepts. Pues bien en Sisteplant, tenemos dos puestos de trabajo que queremos cubrir.


Los dos están relacionados con temas sobre los que escribo habitualmente en este blog: la calidad del software y Scrum. Ambas ofertas están publicadas en Infojobs, pero pongo aquí los puntos más notables. En ambas trabajariaís conmigo y con el vecino de blog Gorka Elexgaray, codo con codo, además de con otra gente muy competente técnicamente y apasionada por el desarrollo de software.


Sobre Sisteplant solo decir que la página web no hace justicia a la empresa que es. Yo personalmente puedo decir que, depués de Plain Concepts, es el mejor sitio en el que he trabajado.


Responsable de calidad del software 


Para este puesto pensamos en un DESARROLLADOR DE SOFTWARE:


Con interés en ser la consciencia del equipo de desarrollo en todo lo relativo a la calidad del software.
Apasionado por la calidad del software.
Acostumbrado a trabajar con testeo unitario.
Acostumbrado a escribir y mantener pruebas automatizadas.
Acostumbrado a valorar de manera objetiva la calidad del software desarrollado.
Con experiencia real como desarrollador de software con lenguajes orientados a objetos. Preferiblemente C#.
Que conozca la herramientas habituales de calidad en entorno .Net (Bugtracking, NUnit, FxCop, Profilers, Team System,…)


Miembro de equipo Scrum


Para este puesto pensamos en un desarrollador de software:
Acostumbrado o con interés en trabajar en equipos ágiles
Acostumbrado a participar activamente en todos los aspectos del desarrollo
Autoorganizado y acostumbrado a cumplir sus propios compromisos
Con experiencia en lenguajes orientados a objetos de al menos 2 años, idealmente en plataforma .NET.
Altamente concienciado en la importancia de la calidad del software
Se valorarán conocimientos de: Windows Communication Foundation, Windows Workflow Foundation, ASP.NET y C#
Se valorarán conocimientos en aplicaciones de gestión de planta y comunicación con dispositivos


Los candidatos seleccionados se incorporarán a un proyecto:
• Tecnológicamente innovador, sobre plataforma .NET
• Gestionado utilizando SCRUM como metodología
• Realizado por un equipo de profesionales experimentados y apasionados por el desarrollo de software

Excepciones en WCF

Tal y como comentaba el vecino de blog Oskar, durante la charla que nos ofrecio en el grupo de usuarios del Pais Vasco, yo pregunte si era posible que la clase que proporcinabamos como tipo a la clase genérica FaultException derivase de la clase Exception. La motivación de esta pregunta está en poder manejar internamente al servcio o propagar excepciones desde el mismo usando la misma jerarquía de excepciones.


Tas investigar un poco más el tema he llegado a la conclusión de que no necesitamos que la clase que envolvemos en la clase genérica FaultException derive de Exception, tal y como yo proponia, porque FaultException ya deriva de Exception. De todos modos agredezco a Oskar que se molestase en buscar las solución a mi pregunta.

Creo que es mucho más lógico que tengamos una clase derivada de FaultException<> que podemos manejar como una excepción normal o como una excepción que propagamos por WCF si queremos.

Vamos que para soportar el escenario que yo planteaba lo que haría es declara una excepción que derive de FaultException<>


public class InvalidContactFault : FaultException<string>


{


  public InvalidContactFault(string faultDetail):


    base(faultDetail)


    {


    }


}


Lo que me permite lanzar una excepción y capturarla dentro de las fronteras del mismo servicio como cualquier otra excepción gracias a que FaultException deriva de Exception…


try


{


  //Tras validar que el contacto no existe lanzamos una excepción


  throw new InvalidContactFault(“El contacto no exite”);


}


//… que capturamos en la parte servidor del servicio


  catch (InvalidContactFault ex)


{


  //Podemos por ejemplo crear el contacto


  //al vuelo en el servidor


}


o si preferimos podemos dejar que se propague hasta el cliente a través de los mecanismos de WCF y poder capturarla en el cliente y extraer la información del error que ocurrio en el servidor como es habitual:



try


{


  proxy.GetContact(1);


}


catch (InvalidContactFault ex)


{


  Console.WriteLine(ex.Detail);


}

De C/C++ a C# de la mano de Petzold

Charles Petzold autor de varios libros que son ‘la biblia’ para los desarrolladores en plataforma Windows, ha escrito un libro, .Net Book Zero (en inglés) que se puede descargar gratuitamente en pdf o xps, en el que guia a los programadores de C/C++ hacia el desarrollo en plantaforma .Net con C#.


Por lo que he tenido ocasión de ojear del libro parece que merece la pena hecharle un vistazo. Destacar que aborda cuestiones del Framework 2.0 como genéricos y tipos anulables. Además el libro viene acompañado de ejemplos.

Scrum y XP desde las trincheras

Desde hace algunos días soy uno más de los cerdos que componen la piara de un proyecto que utiliza Scrum como metodología. Si bien todo apunta a que utilizar Scrum ha sido una excelente decisión no se puede negar que llevar una metodología a la practica siempre presenta retos prácticos.

Un excelente recurso para ayudarnos en el camino de la teoria a la práctica es conocer como otros han andado este camino. En ‘Scrum and XP from the trenches‘ [pdf] (Scrum y XP desde las trincheras), Henrik Kniberg nos cuenta precisamente esto, como implanto Scrum y algunas prácticas de XP en un proyecto que involucraba a un equipo de 40 personas.

Este documento además de ser muy útil si tratamos de implantar Scrum es tambien el relato de un notable caso de exito de Scrum. Otro punto interesante es que muestra como XP y Scrum pueden ser utilizadas de manera complementaria.

Resumiendo: este documento y las listas de comprobacióm para Scrum me están siendo de gran utilidad para mejorar mis conocimientos sobre Scrum desde un punto de vista práctico.

Para más información sobre Scrum: Scrum en Geeks.ms.

Importando áreas e iteraciones a Team Foundation Server

Casualidades tiene la vida… justo después de escribir sobre las iteraciones y las áreas en Team Foundation Server, me he visto en la obligación de cargar un montón de áreas (unas ochenta) en mi Team Foundation Server. Quizás hubiese tardado menos haciendolo a mano pero como soy desarrollador, me gusta escribir código, los programas no cometen errores (una vez depurados claro) y quizá me toque volver a hacer esto en el futuro… pues me he escrito una pequeña utilidad que carga áreas e iteraciones desde un fichero de texto en un Team Foundation Server.


La verdad es que gracias a Merrick Chaffer la labor no ha sido muy ardua. Poco más que poner una simple línea de comandos entorno a su clase para crear areas e iteraciones  y leer de un fichero de texto.


El mayor problema que he tenido es que habiendo creado el fichero de areas con el notepad y guardandolo con las opciones por defecto, las areas se estaban creando sin acentos. Todo se ha solucionado guardando el archivo como Unicode, gracias a la sugerencia del vecino de blog y de proyecto Gorka Elexgaray.


Todos los interasados en esta herramienta podeís descargar tanto las fuentes como los binarios. El uso de esta utilidad es muy simple, ejecutando la aplicación sin especificar parámetros se muestra una pequeña ayuda.


!Atentos!: Service Pack 1 de Visual Studio 2005

Leo que Microsoft ha libreado ya a producción el service Pack 1 de Visual Studio, que estará disponible oficialmente para descarga el proximo lunes. Habrá que estar atentos.


Entre las novedades destacables:


Integración entre Team Foundation Server y Excel y Project 2007.
Mayor soporte para SQL Server Mobile Edition.
Soporte para proyectos Web basados en el modelo de aplicación.
Soporte para ClickOne con dispositivos móviles.


Tambien dice la noticia que Microsoft está trabajando en parche para aquello que utilizan Visual Studio 2005 en Windows Vista orientado a mejorar la compatibilidad y la productividad.


Última hora: me comunican en un comentario que ya están disponibles los Service Pack y el Vista Refresh, os dejo los links!!!


Visual Studio 2005 SP1 (includes SP1 updates for Standard, Professional, and Team Editions of Visual Studio 2005)
Visual Studio 2005 Team Foundation Server SP1
Visual Studio 2005 Express Editions SP1
Visual Studio 2005 SP1 Vista Refresh

Mono Live LiveCD

Nos comentaba hace poco el amigo y compañero Pablo Martinez Doval en su blog la existencia de Monopix, una distribución live CD (se puede arrancar desde el cd sin instalar en el disco duro), que nos permite disfrutar del desarrollo sobre plataforma .Net en Linux.


Pues bien hoy he sabido de la existencia de otro live CD que permite hacer lo mismo o parecido, se trata de Mono Live LiveCD. Quiza la principal ventaja de esta sobre Monopix es que es parte del proyecto Mono.


Algo tendrá .Net cuando hay tanto interés en implementarlo en otras plataformas fuera de Windows. No está mal hechar un vistazo de vez en cuanto a Mono, nunca se sabe cuando tendremos que hacer algún programa en alguna de las exotéricas plataformas en las que corre Mono.


Es un pena que estos chicos siempre vayan muy por detrás de la implentación de Microsoft y que no tengan nada que se acerque ni de lejos en productividad a Visual Studio, pero sin duda están haciendo grandes avances.