Marejadilla, a fuerte marejada… y gestión de proyectos

Trinchera en el Somme 1916Siempre me ha interesado la economía. Ya de niño me empollaba las páginas salmón con el gusto de aprender algo por el simple hecho de saber sobre algo que la mayoría de la gente simplemente ignora. Además, ya con unos añitos más, las páginas salmón eran las únicas que siempre estaban abandonadas al fondo de la barra del bar. No le he sacado nunca partido ninguno a ese conocimiento: mi situación económica no es espectacular, pero me sigue gustando el tema.

Acabo de terminar de leer El crash del 2010, libro escrito por Santiago Niño Becerra, gurú económico que ha ganado relevancia por su certero, hasta el momento, y apocalíptico diagnostico de la crisis que vivimos. El libro me parece bueno, más que nada por la explicación historicista que da la situación actual (la historia es otra de mis aficiones). Pero este post no es uno de mis habituales comentarios de libros de la sección He leído… de este blog. No, en esa sección solo hablo de libros que tengan que ver con desarrollo de software, temática de este blog (pese a lo que pueda parecer). Tampoco este es un post sobre economía, aunque pueda parecerlo, es un post sobre gestión de proyectos (esto ya parece más este blog)… y ¡economía!.

Hay dos ideas claras en el libro. Bueno tres. La primera es que lo peor lo peor está por llegar, vamos que vamos de marejadilla a fuerte marejada, que la crisis no ha  hecho nada más que empezar y que es de agárrense que vienen curvas… pero bueno, esta idea no me interesa, de verdad. Y encima dice que ¡no podemos hacer nada!. Me la sopla lo que piense este señor, me da igual, vengan como vengan dadas, la resignación y el pesimismo no van conmigo. Por mal que vengas las cosas, siempre podrán se menos malas si las encaramos con optimismo.

Vamos con las ideas del libro que me parecen relevantes… y con lo que realmente importa ¡cómo van a cambiar la gestión de proyectos!…

La primera es que los recursos que hemos tratado hasta ahora como ilimitados han dejado de serlo. Vamos a tener que pensar en lo que consumimos para producir. El resultado no va a ser lo único relevante, sino que los recursos consumidos para obtener el resultado van a ser un elemento clave.

“El crecimiento ha estado basado en la creencia de que gastar de todo, sin límite, era posible e incluso necesario […] pero cuando la deuda se ha hecho físicamente insostenible […] nuestro sistema ha encarado una crisis”

La segunda es que la economía va a cambiar de manera radical y que el nuevo paradigma económico va a ser la productividad. Vamos a ser tan productivos que va a sobrar factor trabajo por todos los lados.

“Hoy la tendencia apunta hacia la buena administración, hacia el no desperdicio, hacia lo necesario, hacia la productividad.” dice Santiago.

Bien, recursos limitados y productividad serán la clave, ¿cómo afectan estos dos elementos a la gestión de proyectos?

Todos conocemos como se han hecho tradicionalmente los proyectos de desarrollo en este país (y seguro que en la gran mayoría). A base de fuerza fruta. Que un proyecto no se mueve, no hay problema, para que vamos a pensar, simplemente añadamos más carne de cañón. Pongamos más programadores, ¡más recursos!, eso sí, de los baratitos, de los ‘recién salidos’, que total ‘solo tienen que hacer informes y mantenimientos’. Nos da igual la productividad.

Y así es como acabamos en una guerra de trincheras, enquistada, en la que el proyecto no avanza por que al cliente se le ocurren más informes y mantenimientos que los que nuestro equipo es capaz de completar. Y la productividad daba igual, que no somos productivos, no pasa nada, más fuerza bruta. Total siempre podemos ignorar la ley de Brooks. La ignorancia tiene una virtud, no genera inquietud. ¡Viva al Spanish theory management! que tan bien describe Peopleware.

Que queréis que os diga, a mi no preocuparía esta situación, si no fuese por la pobre carne de cañón y por los recursos que se dilapidan. Miles de programadores que acaban hastiados de una profesión que es realmente bonita. Miles de millones de euros quemados en retrabajos, fallos de calidad, en características que nunca se van a usar, en proyectos faraónicos donde el único afán de la mega consultora de turno es mantener la factoría en funcionamiento. Mientras hay esclavos moviendo la maquinaria, el dinero fluye y se queda en las manos de los de siempre. Da igual el resultado del proyecto, lo importante es facturar. Si sale una castaña, ya haremos otra versión total, hasta ahora los recursos eran ilimitados…

… pero no hija no… es no… que decía Ozores, el tirar con pólvora del Rey se ha acabado. Ahora las administraciones están caninas, y las empresas ni te cuento. Todos van a mirar la pela, todos van a exigir un retorno de la inversión. Ya no va a valer con quemar pólvora, la gente querrá ver fuegos artificiales cuando huela a pólvora quemada.

Que va a ocurrir en la gestión de proyectos según yo lo veo:

Que nadie va a financiar megaproyectos a tres años, ni fases de captura de requisitos de meses, ni continuos cambios de requisitos por antojos de vaya usted a saber quien… se van a empezar a exigir resultados pronto y rápido. Las metodologías ágiles van a ganar mucho peso, mucho. Es imposible ser productivo y trabajar con recursos limitados si tu proceso de desarrollo no lo promociona y facilita. No te digo nada si no tienes proceso. Nadie va a poder pagar la burocracia inútil.

Tampoco nadie va a poder mantener equipos lentos y enormes, sin capacidad de reacción y que tardan decenas de meses en liberar valor. Los equipos ágiles, altísimamente productivos, excepcionalmente preparados va a brillar como siempre debieron brillar.

La gran consultora va a sufrir, y mucho. Va a ganar la pequeña empresa altamente especializada y sumamente rápida que logre hacer software de calidad y entregar valor en un flujo continuo. ¡Vale, vale! Reconozco que el que mi empresa, Plain Concepts, trate de seguir esta definición quizás influya en mi juicio 😉

Y que queréis que os diga… si las cosas son como Santiago Niño Becerra y yo las vemos, bendita crisis. Por fin van a ganar los que lo merecen: los que se han preparado, son técnicamente excelentes y aman su trabajo de desarrolladores de software, en definitiva, los productivos.

La mala noticia es que la parte difícil es asegurarse de que tú y tu empresa sois productivos. Que esfuerzo.

¡Un saludo!

Videos: ¿Quieres estar en las nubes? y VSTS2010: Los 3 tenores en el Code Camp 2009

Gracias al trabajo espectacular que los organizadores del Code Camp ha realizado todos podemos disfrutar de los videos de las sesiones que se impartieron allí.

Os invito a ver mi charla sobre Azure de la que ya os hablé anteriormente en este blog.

Y no os perdáis la estelar actuación de Los tres tenores de VSTS, Bruno, Luis Fraile y un servidor (como nos han bautizado los chicos de la organización). Una charla muy divertida.

Tenéis los videos a vuestra disposición aquí. Especialmente recomendables… ¡todos!.

¡Un saludo!

Podcast: El rol de Propietario del Producto en Scrum

Juan Palacio, David Alfaro y un servidor grabamos un podcast este pasado sábado sobre el papel que en Scrum juega el Propietario del Producto o Product Owner.

Cualquiera que se haya aproximado mínimamente a Scrum sabe que la labor del Propietario del Producto es representar la voz del cliente asegurando que el equipo de desarrollo se enfoca en los temas adecuados desde la perspectiva del negocio.

Evidentemente dentro de esta definición caben muchísimos matices y detalles. Precisamente esto es lo que tratamos en el podcast.

Los asuntos más relevantes que hemos tratado son:

Las labores del Propietario de Producto, todas ellas relacionadas con la gestión de los requisitos del proyecto de un modo u otro:

Mantener contento al cliente.
Realizar la captura de requisitos.
Priorizar los requisitos.
Digerir esos requisitos antes de que lleguen al equipo de desarrollo.

También hemos hablado sobre la diferencia entre el papel que juega el Propietario del Producto comparándolo con roles como el de Product Manager que aparece en otras metodologías. Hemos comentado sobre este punto como la principal diferencia es el uso de determinados artefactos (product backlog, historias de usuario) y liturgias (scrum planning meeting, scrum review) y como la labor del Propietario del Producto esta en todo momento guiada por la búsqueda de valor para el cliente.

Hemos hablado también de como la priorización de requisitos es la técnica que lleva a lograr ese retorno de la inversión.

Hemos hecho mucho hincapié en la importancia de tener este rol perfectamente detectado entre los participantes en el proyecto y que su voz debe ser única y respetada en todo lo relativo a que se debe hacer en el proyecto.

Sirva este post de introducción al tema y de invitación a que escuchéis el podcast.

Si os a gustado este podcast no os perdáis otros muchos relacionados con Scrum y la agilidad en el canal Open Knowledge Scrum Manager.

¡Espero vuestros comentarios!

Malditos spammers, esto es una guerra o ¿Cómo cortar el acceso a tu IIS desde una IP mediante programación?

Una larvada, oculta y desconocida guerra, para mi mucho más importante que la de Afganistan o la de Iraq, me mantiene regularmente ocupado. Es la lucha contra los comentarios de spam en Geeks.ms. La verdad es que si no me lo tomase como un hobby, como una extraña partida de ajedrez, como un juego de inteligencia, una arcana lucha entre el bien y el mal… ya tendría una ulcera de estomago de tanto cargarme el la p**a madre de los p**os spammers.

La guerra ha tenido diferentes batallas como todas las guerras que se precien. Y también algunos daños colaterales, ninguno de gravedad extrema gracias a Dios, como usuarios que no han podido acceder a su sitio favorito, o autores que no han podido publicar o han sido banneados del sitio, e incluso algún comentario perdido en la onda expansiva de algún script un poco desviado de su objetivo.

Hemos jugado numerosas partidas los spammers y yo. De momento, dado que el sitio no está totalmente tomado por el spam pese a sus intentos y que nunca he tenido quejas sobre este tema, creo que voy ganando. Aunque por poco: solo puedo actuar reactivamente y evitar que los comentarios de spam perduren. Aunque este en si mismo es una victoria, el simple hecho de hacer ver que el sitio está defendido, hace que los spammers mas perezosos abandones sus ataques y dirijan sus esfuerzos hacia otros sitios más vulnerables.

En esta batalla, he usado y uso numerosas armas. Durante un tiempo tuvimos captchas por todos los lados, los viejos del lugar lo recordarán, luego solo comentarios de usuarios autenticados (algo que odio, pues creo que Geeks.ms debe ser lo más abierto y accesible posible para los usuarios licitos), luego incluso tuve que capar el registro de usuarios con mail de determinados dominios de correo…

Lo interesante del tema es el continuo toma y dada. Ellos intentan algo, yo lo detecto e implemento una medida de protección. Rara vez comento de manera explicita estas medidas en el blog, algunas de ellas curiosas, por razones obvias de no dar información al enemigo. Aunque de manera clara, mi particular guerra ha inspirado algún que otro post, como por ejemplo: Protegerse de las inyecciones de SQL por URL, fruto de una de las más cruentas batallas libradas en esta guerra.

Hoy os vengo a contar una medida que he usado durante mucho tiempo, pero que ha caído en desuso. Ya digo que lo que ayer les funcionaba a los spammers hoy no les funciona y viceversa. Ahora este mecanismo ya no sirve ya que los spammers, que serán unos cabr*nes pero no gilip*yas del todo, spoofean sistemáticamente la IP. Pero quizás vosotros si que lo podáis sacar partido para para ataques que podáis sufrir en vuestro sitio o en otras situaciones.

Durante mucho tiempo, los muy capullos, no cayeron en la cuenta de que, cuando un bot se ponía a inyectar comentarios yo podía evitar que lo volviese a hacer con el simple mecanismo de bannear su IP. Como Community Server me permite de manera simple saber que comentarios se habían considerado spam y la IP origen del comentario, yo banneaba la IP que había creado los comentarios y borraba los comentarios recientes de esa IP. Alguna vez alguien perdió un comentario y se quedo fuera de Geeks.ms un tiempo por culpa de este mecanismo, daños colaterales, ya digo, inevitables en toda batalla.

Bueno dejando las batallas del abuelo cebolleta vamos a dar el toque técnico que el título del post promete: ¿Cómo cortar el acceso a tu IIS a una IP mediante programación?. Pues con esta simple función que usa el modelo de objetos de IIS por WMI.

       
	/// <summary>
	/// Ban an IP from IIS
	/// </summary>
        /// <param name="IP">IP to ban</param>
        /// <param name="siteIdentifier">IIS site identifier</param>
        private void IISBanIP(string IP, string siteIdentifier)
        {
            try
            {
                //Get the directory entry for the root of the IIS server
                DirectoryEntry IIS =
                     new DirectoryEntry(
                     @"IIS://localhost/w3svc/" + siteIdentifier + "/root");

                //Get the IPSecurity property
                Type type = IIS.Properties["IPSecurity"][0].GetType();
                object IPSecurity = IIS.Properties["IPSecurity"][0];

                //Get the IPDeny list from the IPSecurity object
                Array oldIPDenyList = (Array)type.InvokeMember("IPDeny",
                                     BindingFlags.DeclaredOnly |
                                     BindingFlags.Public | BindingFlags.NonPublic |
                                     BindingFlags.Instance | BindingFlags.GetProperty,
                                     null, IPSecurity, null);

                List<object> newIPDenyList = new List<object>(oldIPDenyList.Length);

                foreach (object ip in oldIPDenyList)
                    newIPDenyList.Add(ip);

                newIPDenyList.Add(IP + ", 255.255.255.255");

                //Add the updated list to the IPSecurity object
                type.InvokeMember("IPDeny",
                                 BindingFlags.DeclaredOnly |
                                 BindingFlags.Public | BindingFlags.NonPublic |
                                 BindingFlags.Instance | BindingFlags.SetProperty,
                                 null, IPSecurity, new object[] { newIPDenyList.ToArray() });

                IIS.Properties["IPSecurity"][0] = IPSecurity;

                //Save changes
                IIS.CommitChanges();
                IIS.RefreshCache();

                ShowMessage("IP {0} was banned", IP);
            }
            catch (Exception e)
            {
                ShowMessage("Error banning IP: {0} Error:{1}", IP, e.InnerException.Message);
            }
        }

Os preguntaréis como protejo ahora Geeks.ms… el día que los sepáis será por que un spammer lo ha averiguado antes ;).

¡Ojala os sirva! Contra el spammer ¡Aur, aur… Desperta ferro!.

Script para eliminar los índices que siguen un determinado patrón

Os dejo un script que elimina todos los índices que siguen un determinado patrón. Yo lo suelo utilizar para eliminar todos los índices que he creado tras usar el Index Tunning Wizard y seleccionar aquellos que realmente me resulta útiles o para poder volver a la línea base que tenía antes de utilizarlo. Podéis cambiar el LIKE ‘_dta_%’ por el patrón que deseéis.

También suelo utilizar este script en sesiones de optimización. Voy añadiendo índices con diferentes prefijos según el escenario que estoy optimizando, veo su impacto sobre el servidor y si quiero eliminar una serie de índices que he añadido para optimizar un determinado escenario lo puedo hacer con suma facilidad.

/* OJO: Este script es peligroso */
/* Comprobar que la select devuelve los índices que realmente deseamos borrar */

DECLARE @Index VARCHAR(128)
DECLARE @Table VARCHAR(128)

SELECT OBJECT_NAME(id) AS [table], name AS [index]
INTO #Indexes
FROM sysindexes
WHERE name LIKE '_dta_%' --Índices y estadísticas creados por el DTA

WHILE (SELECT COUNT(*) FROM #Indexes) > 0
BEGIN
   SET
@Index = (SELECT TOP 1 [Index] FROM #Indexes)
  
SET @Table = (SELECT TOP 1 [Table] FROM #Indexes)

   IF (@Index LIKE '_dta_stat_%')
      
BEGIN
           PRINT
'DROP STATISTICS ' + @Table + '.' + @Index + CHAR(13)
          
EXEC ('DROP STATISTICS ' + @Table + '.' + @Index )
      
END
   ELSE
       BEGIN
           PRINT
'DROP INDEX [' + @Index + '] On [' + @Table + ']' + CHAR(13)
          
EXEC ('DROP INDEX [' + @Index + '] On [' + @Table + ']')
      
END 

   DELETE FROM #Indexes WHERE [Index] = @Index AND [Table] = @Table
END

DROP TABLE #Indexes

¡Quizás os sirva a vosotros también!

MVP también en 2010

Un año más Microsoft ha tenido a bien distinguirme en una ocasión más como MVP en la categoría de Team System. Es la séptima vez que soy MVP, tres veces en la categoria de C++ y cuatro más en la de Team System, y no por ser la séptima vez la ilusión es menor. Ilusión que nace de poder compartir un año más de eventos y buenos ratos con el resto de MVPs y la comunidad, que es lo que realmente hace importante este reconocimiento.

Quiero aprovechar para agradecer a la comunidad la excelente acogida que han dado a todos mis eventos, artículos, participaciones en grupos de usuarios, a mi blog y a Geeks.ms. Sin esta excelente acogida, el reconocimiento, el apoyo y el ánimo que la comunidad me brinda, yo no sería MVP. En especial quiero mencionar a la gente de Artalde, dotNetMania y mis compañeros de Plain Concepts y de Sisteplant.

También quiero agradecer todo lo que de la comunidad aprendo que es mucho más valioso que el reconocimiento como MVP, a pesar del valor que le doy.

Espero estar a la altura del reconocimiento que Microsoft me ha otorgado.

Pido disculpas por el autobombo, pero ¡la ocasión lo merece!