Preferencias en Visual Studio 2005 compatibles con 2008

Published 31 weeks, 2 days ago
Thu Nov 29 2007

Probando, probando, resulta que acabo de comprobar que los settings de Visual Studio 2005 se pueden importar sin problemas en Visual Studio 2008 Express.

Como sin duda ya sabréis, desde VS 2005 el manejo de los settings (configuraciones de entorno, en cristiano), es importable y exportable mediante ficheros .vssettings, en formato XML. Dentro de estos ficheros guardamos todas nuestras preferencias en el uso del IDE, desde la configuración de inicio del IDE (mostrar el entorno vacío, en mi caso), hasta el esquema de colores y fuentes en el editor de texto; pasando por la ruta por defecto para la creación de soluciones, el formato de la ayuda online, el control de código fuente, y un muy largo etcétera de opciones.

Por esta razón, si migramos de equipo o si usamos Visual Studio es más de una máquina es buena idea que hagamos una copia de seguridad de nuestros settings: mediante Herramientas -> Importar y Exportar Configuraciones accedemos a un wizard que nos permite importar configuraciones, exportarlas o restaurar las configuraciones que trae el IDE por defecto. Dicha copia de seguridad se almacena en un fichero .vsssettings, como hemos visto antes; que podemos importar en otras máquinas para disfrutar rápidamente de nuestras preferencias.

Y lo que me ha dado por probar esta mañana es importar los settings del Visual Studio 2005 del trabajo e importarlos en Visual Studio 2008 Express Edition. El proceso es exactamente el mismo, y VS2008 no ha dado ningún error al recibir el nuevo conjunto de preferencias. Pero se han producido dos circunstancias curiosas:

  1. VS2008 tiene, por defecto, un conjunto de preferencias mucho más reducido que el de un Visual Studio completo. Al importar estos settings, el conjunto de preferencias de VS2008 ha aumentado espectacularmente.
  2. Al tener instalado ReSharper en VS2005, el control del IntelliSense lo lleva dicho plugin, y no Visual Studio. Por tanto, en mis preferencias el IntelliSense aparece como desactivado. Para activarlo de nuevo, sencillamente iremos al menú Tools -> Options (VS2008 de momento no está en castellano, que yo sepa); y dentro del cuadro de diálogo que nos muestra el árbol con todas las opciones de personalización elegiremos Text Editor -> All Languages -> General. En esa opción marcaremos como verdaderas las opciones Auto list Members y Parameter Information y ya tendremos IntelliSense en VS2008.

Snippet Compiler

Published 31 weeks, 2 days ago
Wed Nov 28 2007

Creo que ya he hablado en alguna ocasión de Snippet Compiler, que es una de mis herramientas favoritas para C#. Desarrollada por Jeff Key, su página web tiene otro buen montón de utilidades.

Como se define en su página, Snippet Compiler compila snippets. Es decir, que mediante esta utilidad podemos crear pequeños bloques de código (snippets) y ejecutarlos... sin necesidad de Visual Studio.

Es perfecta para cuando quieres probar una pequeña funcionalidad y no quieres tener que meter líneas de prueba en tu solución actual o, peor aún, arrancar una nueva instancia de Visual Studio y crear una nueva solución para ese bloque de código. Por ejemplo, a mí siempre se me olvidan los formatos que se le pueden dar a las cadenas en String.Format(): tiramos de Snippet Compiler y hacemos las pruebas que hagan falta. O cuando tengo dudas al realizar funciones de manipulación de cadenas, lo mismo. O con cualquier método que desconozco, para probar.

Tiene IntelliSense, aunque por desgracia sólo funciona con las clases del .NET Framework, ventana de errores, posibilidad de importar proyectos de Visual Studio, y la posibilidad de crear templates. Por ejemplo, en el template por defecto incluye las funciones WL() y RL(), wrappers de Console.WriteLine y Console.ReadLine respectivamente, lo que nos evita tener que teclear demasiado al usar estas funciones frecuentemente.

Un bonito WTF

Published 31 weeks, 4 days ago
Mon Nov 26 2007

Para empezar la semana con alegría.

Están el equipo de calidad de mi trabajo depurando los últimos errores de una de mis aplicaciones, que entra en producción ya mismo. La cosa va bastante bien, ha pasado las pruebas de carga con nota, todo perfecto. Excepto una pequeña espinita que, de tan pequeña, tuve un tiempo ignorada en pro de errores más gordos. Hasta hoy.

La jefa de calidad, al teléfono, añade hoy a la conversación un "Y comprueba el error de las descripciones nulas, que sigue ocurriendo.". A lo que respondo: "¡No puede ser! Lo he comprobado y vuelto a comprobar y a mí me funciona!". Odio dar ésa respuesta en concreto, pero en este caso era cierto. Recordaba claramente el error: en caso de tener el campo Descripción a NULL dicho campo aparecía como tal en la página aspx, en lugar de aparecer vacío o con un texto alternativo; así como recordaba claramente haber picado la triste línea de código necesaria para impedirlo de una vez por todas y para siempre. No es que sea un error muy complicado de corregir, vaya.

Así que pruebo con uno de mis registros, funciona bien, mando un pantallazo y suelto aquello de en mi servidor funciona. La responsable de calidad me larga otro pantallazo, con el error, diciéndome pues en el mío no.

Tiramos de Toad a ver qué leches pasa, porque esto no es de código. Y efectivamente, no lo es. Vistos desde Toad los registros en cuestión, vemos que efectivamente tienen el campo Descripción a NULL. Pero no a nulo sino a "NULL". Vamos, que el contenido del campo no es un valor nulo, sino una cadena de caracteres "N", "U", "L", y "L".

Mis carcajadas se han debido oír hasta en Cuenca.

Links del Viernes (10)

Published 32 weeks, 1 day ago
Fri Nov 23 2007

Hoy pocos links pero jugosos...

  • Estupendo ejemplo sobre el Patrón de Estrategia, de Jeremy Jarrell. Me ha gustado especialmente el que use un ejemplo real y útil en sí mismo, una refactorización para eliminar Enums y su correspondientes switchs, no los ejemplos abstractos de costumbre de patitos voladores.
  • Ya lo ha dicho todo el mundo y su primo, pero es lo que tiene publicar los vínculos un día fijo a la semana: pierdes la novedad. El caso es que, como ya sabréis todos, Visual Studio 2008 ya ha salido. Si eres subscriptor de MSDN ya puedes descargártelo, y si no te puedes conformar con las ediciones Express, que no faltan a la cita. Para ir probando y aprendiendo todo lo necesario sobre la gran cantidad de novedades de lenguaje e IDE que se nos han echado encima, tenemos el Training Kit para Visual Studio 2008 y .NET 3.5.
  • También está disponible la Beta 2 del XNA Game Studio, que curiosamente requiere una licencia de Microsoft Live si quieres desarrollar juegos con conexión a red. Y en Coding4Fun he encontrado un motor 3D.
  • Otro motor 3D en .NET, Jade Engine, ya que ha salido el tema.
  • Primeros pasos si quieres programar con Google Android.
  • Artículo que critica a fondo el último meme(z) de los técnicoless y con más razón que un santo, oiga: Vista Nerd rage feedback. Los creativos de la Manzana (Podrida) son abanderados de este carro, iniciando una vez más una campaña negativa que en lugar de ensalzar lo bueno de sus productos intenta echar a otros por tierra a base de mentiras descaradas, suficiencia y prepotencia a raudales. Y todo el mundo a reírles la gracia. Así también soy yo creativo, no te fastidia.
  • 101 ejemplos de LINQ.
  • Y ya que hemos polemizado un poquito con la compañía de la Manzana (Podrida) y su legión de gusanos, vamos ahora con uno de los otros. Ya dije hace mucho, mucho tiempo y en un motor de blog muy lejano que Richard Stallman es un gilipollas. Y parece que historias como ésta no hacen sino darme la razón.

El desafío Chuck Norris... resuelto

Published 32 weeks, 3 days ago
Tue Nov 20 2007

El viernes pasado la empresa Ilitia Technologies, a la que conozco por ser la empresa de uno de mis blogueros de cabecera, Miguel Jiménez, publicó en Infojobs la siguiente oferta (editada ligeramente, que Infojobs no admite HTML):

Un importante proyecto de decodificacion de mensajes para el gobierno que fúe 
desarrollado por el mismisimo Chuck Norris (que escribe cualquier programa en una sola linea) 
necesita ser puesto en marcha lo antes posible. Lamentablemente, Chuck Norris eliminó del control 
de codigo fuente su libreria de utilidades antes de irse de la empresa para probar 
nuevos retos, por lo que el código ya no compila.
Es necesario que alguien reconstruya las partes necesarias de esta libreria para volver a hacer 
funcionar el decodificador. Una pista, nadie hace librerias tan simples como Chuck Norris.

Ánimo y gracias por tu interés y tiempo. Espero te diviertas

Console.WriteLine(
new long[]{
292805444303323170,
-4455112766532738942,
579137309091315972,
1207248581508040306,
7033655460037132288 }
.SelectMany(l => 64.DownTo(0)
.Select(i => (l & ((long)1 << i)) != 0))
.Take(285)
.Select((b, i) => new { b, i })
.GroupBy(p => p.i / 3, p => p.b)
.Select(g => g.ToArray())
.Select(a => 0.To(3)
.Sum(i => a[i] ? (1 << (2 - i)) : 0))
.Select((a, i) => new { c = @" _()|/'\,"[a], i })
.GroupBy(p => p.i / 19, p => p.c)
.Select(g => new string(g.ToArray()))
.Aggregate((s, t) => s + "\r\n" + t));

public static class ExtensionesChuckNorris
{
public static IEnumerable.int To(this int a, int b)
{
//TODO: Completar código
}
public static IEnumerable.int DownTo(this int a, int b)
{
//TODO: Completar código
}
}

La oferta, original como pocas, recibió sus 15 segundos de fama (estoy seguro de que si Warhol hubiera conocido Internet, la frase hubiera sido en segundos) siendo vinculada por unos cuantos blogs y foros. A mí me interesaba más resolverla, la verdad. Así que llegué a casa el viernes por la noche y me puse a ello. Si le echamos un vistazo por encima (y somos de los que, al menos, leemos blogs) podemos ver que en ese pedazo de bloque de código aparentemente ilegible se declara un array de tipo long, que se rellena con un montón de números aparentemente sin sentido a los que a continuación y sin un pobre punto y coma que llevarse a la boca se le ejecutan un montón de operaciones con nombres como Select, GroupBy, o Aggregate. Esto tiene toda la pinta de ser LINQ. Primer problema: no tengo ni repajolera idea de LINQ.

Don't panic

Bueno, me dije, ignora ese bloque de momento. Sabes que es un array de tipo long al que se le hacen un montón de transformaciones mediante LINQ. Puedes suponer que el resultado no van a ser números sino caracteres, por la presencia de un sospechoso cast a String y un par de cadenas. Bien. ¿Qué pide exactamente el problema? Concretamente, nos piden que implementemos dos de esas transformaciones: To(int a, int b) y DownTo(int a, int b). Mirando en el código principal, vemos que las llamadas a estas funciones son 64.DownTo(0) y 0.To(3). Es una sintaxis un tanto extraña, y aparentemente no tiene nada que ver con la firma de las funciones, pero puedo suponer que 64.DownTo(0) es equivalente a DownTo(64, 0). DownTo se podría traducir por Hasta, y teniendo en cuenta que el tipo que debe devolver la función es un IEnumerable<int>, podemos suponer que DownTo debe devolver un rango de números desde a hasta b en orden descendente, y que la función To debe devolver un rango de números desde a hasta b en orden ascendente. Vale, ya entendemos el problema. Intentemos implementarlo.

Intento y error

LINQ está disponible a partir de la versión 3.5 del .NET Framework, y sinceramente no tengo ganas de ponerme a buscarlas e instalarlas. El problema de las betas, CTPs, RTMs y demás versiones de early-adopters es que suelen ser algo puñeteras en su instalación y configuración, y el problema ahora era de código, no tenía ganas de comerme la cabeza con configuraciones. Virtual PC 2007 con la imagen completa de Windows 2003 Server y la última Beta de VS2008 al rescate. Sí, es una descarga de 11 Gbs, pero para hacer pruebas locas es perfecto. Una vez tenemos las herramientas necesarias (aunque eché bastante de menos a mi ReSharper, a ver cuándo hacen versión para el 2008), nos ponemos a currar.

Intenté primero hacer las cosas a lo sencillo: un simple bucle for que creara un array de integers desde a hasta b, convertirlo a IEnumerable<int> y a tirar. Pero no hubo manera humana de hacerlo, o yo no la encontré... y menos mal, porque aunque hubiera funcionado ésa no era la respuesta. Tenía que haber una manera de hacerlo mediante LINQ.

Después de mucho googlear, me encontré con unos cuantos recursos valiosos, entre ellos esta wiki sobre LINQ, y sobre todo este artículo de MSDN, que me pusieron sobre la pista correcta. Concretamente, conocí la existencia de la clase System.Linq.Enumerable, concretamente de su operador Range que, mira por dónde, devuelve un rango IEnumerable<int>. Parece que la función To estaba resuelta. ¿Y la función DownTo?


Al principio intenté unas cuantas manipulaciones groseras de Range, pero recordé que el reto me pedía soluciones sencillas, pues tal es el estilo de programación de Chuck... cosa que, viendo sus películas, dudo mucho. Pero ésa es otra cuestión. Seguí leyendo e investigando y me encontré con otro operador de System.Linq.Enumerable, el Reverse, que efectivamente era la solución que andaba buscando. Un poquito de intento y error para hacer las cosas lo más limpias posibles y voilá!: el reto de Chuck está solucionado.

Aquí tenéis el código completo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ilitia
{
class Program
{
    static void Main(string[] args)
    {
      Console.WriteLine(
            new long[]{
            292805444303323170,
            -4455112766532738942,
            579137309091315972,
            1207248581508040306,
            7033655460037132288 }
            .SelectMany(l => 64.DownTo(0)
            .Select(i => (l & ((long)1 << i)) != 0))
            .Take(285)
            .Select((b, i) => new { b, i })
            .GroupBy(p => p.i / 3, p => p.b)
            .Select(g => g.ToArray())
            .Select(a => 0.To(3)
            .Sum(i => a[i] ? (1 << (2 - i)) : 0))
            .Select((a, i) => new { c = @" _()|/'\,"[a], i })
            .GroupBy(p => p.i / 19, p => p.c)
            .Select(g => new string(g.ToArray()))
            .Aggregate((s, t) => s + "\r\n" + t));
            
      Console.ReadLine();
    }
}

public static class ExtensionesChuckNorris
{
    /// <summary>
    /// Devolvemos un rango enumerable desde inicio a fin.
    /// </summary>
    /// <param name="a">Valor inicial</param>
    /// <param name="b">Valor final</param>
    /// <returns>Un rango ascendente</returns>
    public static IEnumerable<int> To(this int a, int b)
    {
        return Enumerable.Range(a, b);
    }

    /// <summary>
    /// Devolvemos un rango inverso enumerable desde fin a inicio.
    /// </summary>
    /// <param name="a">Valor inicial</param>
    /// <param name="b">Valor final</param>
    /// <returns>Un rango descendente</returns>
    public static IEnumerable<int> DownTo(this int a, int b)
    {
        //Invocamos To y le damos la vuelta
        return Enumerable.Reverse(b.To(a));
    }

Y éste es el resultado por pantalla:

Y esto es todo, amigos. Gracias a Fernando Lozano, gerente de Ilitia, que amablemente me ha dado permiso para escribir este post al haber terminado el reto y no aceptar más candidaturas para esa oferta.

¿Es el iPhone Spyware?

Published 32 weeks, 5 days ago
Mon Nov 19 2007

Pues al parecer sí. De todas, todas.

Por supuesto, ya están tardando todos los fanboys en decir que no, que es algo que hacen todas las compañías (lo dudo mucho), que no les importa, etc...
Bueno, importarles no debe importarles mucho, porque lo han firmado por contrato (énfasis mío):

When you interact with Apple, we may collect personal information relevant to the situation, such as your name, mailing address, phone number, email address, and contact preferences; your credit card information and information about the Apple products you own, such as their serial numbers and date of purchase; and information relating to a support or service issue.

Lo es cual, por cierto, la única razón por la cual no podemos calificar al iPhone como spyware en toda regla: si nos atenemos a la definición de la Wikipedia (de nuevo, énfasis mío):
Los programas espías o spywares son aplicaciones que recopilan información sobre una persona u organización sin su conocimiento.
pues efectivamente no es spyware... al menos, no legalmente.

Pero, una vez más, como es Apple no va a pasar absolutamente nada. Ahí están los fanboys para defender los desmanes de la marca, haga lo que haga y saque lo que saque. No está de más recordar la graciosa parodia del iProduct:


Está visto que, al menos para los compradores de Apple, esto del diseño es como un buen par de tetas: tiran más que dos carretas. Tenemos un teléfono que es más caro, tiene menos opciones que la competencia, menos potentes cuando las tiene, con software y plataforma (de momento) completamente cerrado, que ahora además resulta que nos espía... pero es que es taaaaaaaannnn boniiiiitoooooooooo....

Links del viernes (9)

Published 33 weeks, 19 hours ago
Fri Nov 16 2007

Por poco no llegamos. Es lo que pasa cuando tu Windows Live Writer portable y el proxy del curro se dejen de hablar, de repente.

  • James Avery nos presenta la primerísima versión de su AutoTest.NET, una herramienta que realiza automáticamente los tests unitarios sobre nuestras clases... cada vez que grabamos un cambio en ellas.
  • Proyecto Astoria, sugerente título que esconde un framework en desarrollo en los laboratorios de Microsoft: una API REST para enlazar con ADO.NET. Tim Anderson tiene más detalles.
  • Truco en Javascript para prevenir que el ENTER recargue la página. No especialmente complicado, pero muy útil.
  • Un IDE para NAnt, por desgracia de pago: NAntBuilder.
  • Otro esquema de colores oscurecido para Visual Studio: Desert Nights. Los colores no están nada mal, pero el tamaño de fuente es excesivamente grande. Ideal para presentaciones.
  • Aprende a añadir capacidad de auto-actualización a tus programas de escritorio, gracias a este artículo de CodeProject.
  • Un post de Scott Guthrie que es casi el capítulo de un libro: enorme, en todos los sentidos, tutorial de MVC.NET. Otro.
  • Siguiendo con los tutoriales, uno sobre MSBuild.
  • El blog de Brennan Stehling, que he vinculado justo arriba, tiene entre otras muchas cosas un interesante artículo sobre las razones para bloguear... y cómo hacerlo bien.
  • Mike Duncan nos enseña la lista de herramientas que le han hecho ser el Paris Hilton del .NET. Muchas de ellas, viejas conocidas.
  • Sprites CSS, qué son y cómo usarlos.

Syntax Highlighter y dasBlog

Published 33 weeks, 2 days ago
Wed Nov 14 2007

Syntax Highlighter son un conjunto de librerías en Javascript desarrolladas por Alex Gorbatchev, gratuitas y disponibles en Google Code. Gracias a ellas, podemos escribir bloques de código fuente en blogs o páginas Web con un formato realmente elegante, y con sintaxis preparada para C#, VB, Delphi, C++, Java, JScript, Python, Ruby, PHP y unos cuantos lenguajes más. Se instala y se configura en pocos minutos y es sencilla de usar. En concreto, vamos a ver cómo podemos usarla en un blog que utilice dasBlog como motor.

Configuración Inicial

Si te descargas el código de Syntax Highlighter, verás que tiene una serie de ficheros JavaScript comprimidos y sin comprimir, más un fichero Flash y un fichero de CSS. Subimos los scripts que vayamos a usar (o todos, que nunca se sabe), junto con el fichero Flash, a la carpeta que deseemos de nuestra estructura de directorios, pero recordando la ruta. Lo mismo para el fichero de estilos CSS. En mi caso he subido los scripts a la carpeta /scripts y el CSS a la ruta donde se aloja el tema de la página, /themes/dandelion/.
Después tenemos que preparar nuestro blog para que admita bloques de texto y los prepare como código fuente. Para ello modificaremos el fichero homeTemplate.blogtemplate, que es el fichero que utiliza dasBlog como maestro, y que contiene las distintas partes de nuestro blog: capas para dividir menús de entradas, cabeceras, etc. En el homeTemplate.blogtemplate, antes de la etiqueta </head>, incluimos el siguiente código:
<!-- Syntax Highlighter by Alex Gorbatchev -->
<link type="text/css" rel="stylesheet" href="themes/dandelion/SyntaxHighlighter.css"></link>
<script type="text/javascript" language="javascript" src="scripts/shCore.js"></script>
<script type="text/javascript" language="javascript" src="scripts/shBrushCSharp.js"></script>
<script type="text/javascript" language="javascript" src="scripts/shBrushXml.js"></script>
<script type="text/javascript" language="javascript">
window.onload = function () {
    dp.SyntaxHighlighter.ClipboardSwf = 'Scripts/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
}
</script>

Y ya está, ya tenemos preparado nuestro dasBlog para usar Syntax Highlighter.

Modo de empleo

Hay dos maneras principalmente de usar Syntax Highlighter. Mediante las etiquetas <pre> y <textarea>.
Mediante la etiqueta <pre> el uso es como sigue:
<pre name="code" class="codigoLenguaje">
...
Y aquí vendría el código, teniendo en cuenta que
codigoLenguaje hay que sustituirlo por el alias 
del lenguaje que estemos usando
...
</pre>
También puede usarse así:
<textarea name="codigoLenguaje" class="c#" cols="60" rows="10">
...
Y aquí vendría el código, teniendo en cuenta que
codigoLenguaje hay que sustituirlo por el alias 
del lenguaje que estemos usando
...
</textarea>
Estos son los alias disponibles:
Lenguaje Alias
C++ cpp, c, c++
C# c#, c-sharp, csharp
CSS css
Delphi delphi, pascal
Java java
JavaScript js, jscript, javascript
PHP php
Python py, python
Ruby rb, ruby, rails, ror
SQL sql
VB vb, vb.net
XML/HTML xml, html, xhtml, xslt

Hay que tener muy en cuenta una precaución: para que el código funcione correctamente debemos cambiar todos los signos < y > por sus equivalentes en HTML, es decir & lt ; y & gt ;.

Y como podéis comprobar, el código queda así de bien:
/// <summary>
/// Código para la búsqueda de empresas. Este código lo usé en el proyect (fallido) de 
/// Intranet de mi antigua empresa, Axco Consulting. Usa SubSonic, pero no lo
/// hagáis ni p*to caso, que no explica nada. Está cogido a modo de ejemplo.
/// </summary>
/// <param name="empresa">El nombre de la empresa que queremos encontrar</param>
/// <param name="FIni">Fecha de Inicio</param>
/// <param name="FFin">Fecha de Fin</param>
public void SearchEmpresas(string empresa, string FIni, string FFin)
{
CATEMPRGRUPOCollection col = new CATEMPRGRUPOCollection();
Query qry = new Query(CATEMPRGRUPO.Schema);
qry.AddWhere(CATEMPRGRUPO.Columns.IDBAJA, false);
//Validamos los criterios de búsqueda introducidos,
//para ver si los añadimos a la query o no
if (empresa != "") 
    qry.AddWhere(CATEMPRGRUPO.Columns.DSEMPRESA, 
        Comparison.Like, "%" + empresa + "%");
DateTime dFIni, dFFin;
if (ControllerUtils.IsDate(FIni) && 
    ControllerUtils.IsDate(FFin))
{
    dFIni = DateTime.Parse(FIni);
    dFFin = DateTime.Parse(FFin);
    if(dFIni <= dFFin)
    {
        qry.AddBetweenAnd(CATEMPRGRUPO.Columns.FEALTA, 
            dFIni, dFFin);
    }
}
else if (ControllerUtils.IsDate(FIni))
{
    dFIni = DateTime.Parse(FIni);
    qry.AddWhere(CATEMPRGRUPO.Columns.FEALTA, 
        Comparison.GreaterOrEquals, dFIni);
}
else if (ControllerUtils.IsDate(FFin))
{
    dFFin = DateTime.Parse(FFin);
    qry.AddWhere(CATEMPRGRUPO.Columns.FEALTA, 
        Comparison.LessOrEquals, dFFin);
}
//qry.OrderBy = OrderBy.Asc(CATEMPRGRUPO.Columns.DSEMPRESA);
col.Load(CATEMPRGRUPO.FetchByQuery(qry));
if (col.Count > 0) LlenarColeccion(col);
else _empresasList.Clear();
}
y además trae de serie la posibilidad de abrir el código en una ventana externa en texto plano, copiarlo al portapapeles e imprimirlo.

Hibernando

Published 33 weeks, 5 days ago
Mon Nov 12 2007

Habida cuenta que ya han pasado más de cuatro meses desde que me contaron esta historia, creo que ya puedo escribirla aquí sin miedo a implicar a nadie o hacer saltar ninguna liebre antes de tiempo. De todos modos, y por si acaso, los nombres y entidades mencionadas en esta entrada están cambiados para proteger a los inocentes.

Hará cosa de un mes o mes y medio me acerqué por las oficinas centrales de Axco Consulting, mi ex-empresa, por última vez. Iba a recoger mi finiquito y a terminar mi relación contractual con ellos de una vez por todas y con amplia satisfacción por ambas partes: suya porque se habían ahorrado más de dos mil euros en mi finiquito; mía por haberme largado sin dar ni un minuto de preaviso y deseando que utilizaran mis dos mil euros como supositorios, en monedas de a 20.

A pesar del ratio de rotación de personal entre bajas voluntarias y despidos, y teniendo en cuenta la absurda pero muy real política empresarial de sólo despedir a los buenos empleados; aunque parezca mentira aún quedan grandes profesionales y mejores personas por allí, y una vez cumplimentado el proceso del finiquito me acerqué por la tercera planta a saludar a uno de mis ex-gerentes (llamémosle Esteban), despedirme y desearle lo mejor porque se lo merece. Y ahí fue cuando me enteré de la historia que quiero contaros. Reproduzco el diálogo que tuve con Esteban, más o menos fielmente:

Esteban (así, a bocajarro. Nada más verme. Como si no llevara más de quince días sin verme el pelo. Las despedidas y parabienes vinieron luego).- ¡Hombre, Pica! (girándose hacia su jefe) ¡Este seguro que lo sabe! (girándose hacia mí) A ver... ¿Tú sabes lo que es NHibernate?
Picacódigos.- Claro. Es un O/RM OpenSource para .NET, portado desde el Hibernate de Java.
Esteban (hacia su jefe).- ¿Lo ves? Te dije que Carlitos lo sabría... (hacia mí) ¿Lo has manejado alguna vez?
Pica.- Puessss... no. He jugado con él en casa, y en mi ex-empresa estuve trabajando con el Hibernate de Java un tiempo; pero vamos,... todo sería ponerse.
Esteban.- Te cuento. Es que estamos buscando un tío con dos años de experiencia mínimo en .NET, y es importante que sepa NHibernate porque tendría que trabajar bastante con la herramienta y responsabilizarse de enseñar su uso a los nuevos programadores que entraran en el equipo. Básicamente el cliente está pasando todo su software de gestión a .NET, y hay que diseñar una capa de datos y una de negocio para usar con distintos clientes, y blah blah blah... ¿Te interesa?
Pica.- Pues suena interesante, Esteban, pero te recuerdo que ya no trabajo para vosotros.
Esteban.- Ah, ¿no te lo he dicho? El cliente es Peyote, el fabricante de coches japonés, para su central en España. Y te contratarían directamente ellos, Axco Consulting sólo hace de headhunter en este caso.
Pica.- Tentador. Pero ya he firmado un precontrato, Esteban...

Y aquí continuó la conversación por derroteros que no llevan al caso. Pero no he terminado la historia: cuando le pregunté a Esteban porqué estaba tan desesperado en su búsqueda, me contó lo que en su momento me dejó de piedra y es el motivo por el que escribo esta entrada. Cito de memoria:

"Pues llevo entrevistados a unos doce o quince tíos, Pica, todos con dos años de experiencia mínimo, todos ellos dicen ser analistas, todos ellos piden como mínimo 30.000 euros brutos anuales,... y ninguno de ellos sabía siquiera de oídas lo que es NHibernate. No hablemos ya de haberlo manejado alguna vez."

De piedra, en serio.

De acuerdo que no se sepa manejar, que no se haya utilizado nunca en un proyecto ni personal ni de trabajo, pero... ¿ni siquiera saber qué es? ¿Ni siquiera que te suene? ¿Y presentarse a una entrevista como analista .NET pidiendo 30K eurazos al año? Me hubiera encantado estar en esas entrevistas para haber profundizado, porque me apuesto el cuello a que en la mayoría de ellas tampoco conocerían ningún otro O/RM, o siquiera lo que es un O/RM.

Luego lo pensé más en frío y me di cuenta de que es perfectamente posible: gente que se ha dedicado al .NET de libro, que lleva 2 o 3 años programando páginas Web ASP.NET sin conocer más separación en capas que la que promulga Microsoft, sin conocer otros métodos de acceso a datos que los incluidos en Visual Studio, sin usar ninguna otra cosa que no sea exactamente lo que le piden en el día a día. También pensé en ese momento que no es culpa suya: el 99,99% de los clientes no quieren cosas raras en sus programas, el 99,99% de los jefes no quieren ni oír hablar de innovaciones y piensan que los experimentos se hacen con gaseosa.

Luego lo pensé aún más en frío y llegué a mi convicción actual: será perfectamente posible, pero no es deseable. Será perfectamente posible, pero alguien que no sabe ni siquiera de oídas lo que es NHibernate me está demostrando que no lee blogs de programación, no consulta de vez en cuando CodeProject, ni DotNetKicks, ni cualquiera de los cientos o miles de sitios de información sobre .NET en cualquier idioma que quieras. O, casi peor, lo hace puntualmente llevado por Google para corregir un error o implementar una funcionalidad que desconoce: copia y pega el código que se encuentra y si funciona no lo toca, no vaya a ser que aprenda algo aunque sea por contagio. Alguien que hace lo que le mandan todos los días sin añadir ni un punto y coma de más, sin intentar investigar formas mejores de hacer las cosas, sin preguntarse cómo las hacen otras personas. Alguien sin interés alguno por crecer profesionalmente excepto en su sueldo. En definitiva, alguien con muy poco amor por su profesión.

Y menead esta entrada o barrapunteadla o haced lo que os dé la real gana con ella, y volver a ponerme chorrocientos comentarios dudando de la integridad moral y profesional de mi santa madre y ciscaos en mis hijos hasta la séptima generación; pero no puedo evitarlo. Tengo que hacer en voz alta la pregunta que me hice en su momento. La pregunta que hace que me dé miedo coger el teléfono y preguntarle directamente a mi ex-gerente: ¿Cuántos de esos doce o quince entrevistados tendrían el título universitario, y sobre todo y mucho más importante cuántos de ellos se considerarían a sí mismos ingenieros de primera?

Links del Viernes (8)

Published 34 weeks, 1 day ago
Fri Nov 09 2007

Viernes festivo para los madrileños y, milagrosamente, no estoy enfermo. ¿Nunca cesarán las maravillas?

  • Confiesa. Tienes una PDA con capacidades de teléfono, una iPAQ por ejemplo, y estás bastante contento con ella. Pero viste los vídeos del HTC Touch y sentiste cierta envidia del TouchFlo, ¿verdad? Pues tu problema está resuelto: con Touch Commander, un programa para Windows Mobile 5 o superior con el cual obtendrás las tres pantallas deslizables con el dedo, los contactos y accesos rápidos con foto, etc. Por $14,95, teniendo en cuenta cómo anda el dólar, es un regalo.
  • Para que no se queje nadie de que soy parcial hacia Subsonic (aunque resulta que nadie se ha quejado y de que sí, lo soy) aquí tenéis un tutorial bastante accesible de NHibernate.
  • Ya tengo (casi) decidido el regalo que me voy a hacer para Reyes: el Asus Eee PC (y luego nos quejamos de los nombres de Microsoft). Un ultra-portátil con pantalla de 7'' y sin disco duro: con una memoria SSD que lo permite arrancar en 15 segundos. Viene de serie con un Linux personalizado con una aplicación de kiosko, aunque el hardware es compatible con Windows XP. Tenéis una review más completa en Trusted Reviews, y supongo que Jeff Atwood hará una cuando reciba el suyo, que ya lo ha pedido. Eso sí, yo voy a esperar al modelo de 1Gb de memoria, con 8Gbs de disco duro. O quizás me decida por este Sony Vaio, claro que entonces el factor económico se irá al traste...
  • Tengo que reconocer que yo era de los que usaban campos numéricos autogenerados como claves únicas de las tablas, pero este artículo de Wade Wright me ha convencido de las bondades de usar Globally Unique Identifiers, o GUIDs. La razón #3 es particularmente convincente, y me hubiera ahorrado un buen montón de problemas en el pasado.
  • Un artículo cargado de razones, que me lleva a especular un poco. Jeff Perrin coincide con Ayende en afirmar que el principal defecto de ASP.NET WebForms consiste en ser una abstracción de HTTP que termina siendo más complicada que el modelo que abstrae. Y estoy de acuerdo. Mi opinión es que WebForms ha sido (y es) como las ruedas auxiliares de una bicicleta. Para muchos programadores que no nos habíamos enfrentado al desarrollo Web jamás, WebForms nos permitió desarrollar aplicaciones para la Web con cierta facilidad gracias a disponer de un modelo basado en eventos bastante familiar. Pero si uno quiere realmente aprender a pedalear en una bici tiene que dejar las ruedas auxiliares tarde o temprano; lo que en nuestro caso viene a ser dejar WebForms y utilizar una abstracción más adecuada para programación Web, como puede ser MVC, ya sea el existente MonoRail o el inminente MVC.NET. De hecho, ya se ha anunciado que MVC.NET no viene a sustituir a WebForms, sino a proporcionar una alternativa a los programadores. Si unimos a todo esto el anuncio que ya vinculé la semana pasada sobre Volta (que no me extrañaría nada que resultara ser una simplificación de WebForms), o como Microsoft está desarrollando un framework para desarrollar para Web con la facilidad de Visual Basic; creo que podemos especular con la dirección que tomará el desarrollo Web en la facción Microsoft en el futuro. Por un lado, un desarrollo Web profesional, más complicado pero mucho más potente mediante MVC.NET. Por el otro, un desarrollo más orientado a sitios pequeños y/o no profesionales mediante Volta. ¿Qué pasa con WebForms? Creo que se mantendrá durante un tiempo, pero su supervivencia a largo plazo dependerá directamente del éxito que tengan las otras dos alternativas.
  • La gente tiene mucho tiempo libre: el tema del Mario Bros tocado con bobinas de Tesla.
  • Por último por hoy (que es fiesta, leches); comentaros que el otro día estuve probando el gOS. Hasta donde yo sé, no ha tenido mucha repercusión mediática, y sinceramente no me extraña: el invento consiste en coger una distribución de Ubuntu, cambiarle los colores y añadir una barra de accesos directos en la parte inferior de la pantalla al estilo del Dock de Macintosh. Todos ellos accesos directos a aplicaciones Google: GMail, GDocs, etc. Aprovechamos el tirón del mítico (por inexistente) Google OS y a tirar. Y para ser más alternativos eliminamos del sistema la barra de tareas (lo que lo hace realmente incómodo de usar) y ponemos los botones de maximizar, minimizar etc. a la izquierda de las ventanas, como en los Mac (lo que también incomoda lo suyo). Francamente, el gOS me ha dejado muy, pero que muy frío: los accesos directos a las aplicaciones Google se limitan a levantar un Firefox con la URL de la aplicación Google ya cargada en la barra de direcciones. Buff, una innovación tecnológica de quitar el hipo. Si, al menos, se hubieran currado el sistema de login de tal manera que tu nombre de usuario y contraseña del sistema fuera el mismo que tu ID de Google, para que el acceso a las aplicaciones online de Google fuera directo, pues hubiera tenido su puntito. Pero ni eso.

Precaución: las startups de software no son tan fáciles como dicen todos

Published 34 weeks, 2 days ago
Wed Nov 07 2007

Lo que viene a continuación es un artículo traducido. Habiendo conversado ayer con Jomaweb, y habiendo leído su artículo sobre la Burbuja 2.0 en la que ambos creemos estar inmersos ahora mismo, aunque el mercado y los MBAs lo nieguen; no he podido por menos que admirar la sincronía que ha llevado a Rob Walling a escribir un artículo al respecto a medio mundo de distancia. Le he pedido permiso para traducirlo, como ya hice con otro artículo suyo y aquí lo tenéis:

Hace unos meses tuve una conversación con un amigo mío triunfador (por triunfador me refiero a que tiene 29 años, trabaja por su cuenta, gana un salario de seis dígitos y tiene dos casas en el norte de California). Dirige su propia compañía de software. Discutíamos sobre lo que hace falta para ser un emprendedor en el campo del software y en un momento de introspección me dijo: "No tengo tanto éxito como esperaba. Creía que el éxito sería más fácil."

Un chico listo
Cuando eres joven la gente te lanza cumplidos a diestro y siniestro.
Si te lavas las manos, te aplauden.
Si te atas los zapatos, te ovacionan.
Si te lees el libro Guinness de los Récords de cabo a rabo... bueno, eso hará que te peguen los niños de preescolar... pero ya me entendéis.

Cuando eres joven, la gente te dice que el éxito es fácil para evitar que te sientas desanimado. Te dicen que cualquier cosa es posible si trabajas lo bastante duro. Según vas haciéndote mayor, si lees cualquier cosa aparte de lo que te mandan en la escuela ya sabes más que tus compañeros. Acabas en clases con prefijos con "Máster" o sufijos como "Avanzado". Y empiezas a sentirte listo.
En algún momento comienzas a ver anuncios o publirreportajes que te dicen lo sencillo que es hacer dinero invirtiendo en cancelación de hipotecas, o en tu propio negocio, o en internet. Pero el cebo es obvio. (Te daré una pista, empieza con "Pero espera, ¡aún hay más!").
Y escuchas las historias de tu fracasado Tío Eduardo que terminan diciendo "... inventó el churriflurri digital y se convirtió en millonario de la noche a la mañana. ¡Lo que hubiera dado por ser él!" Por supuesto, lo que tu tío Eduardo no te cuenta son los miles de horas que el inventor estuvo trabajando solo en su sótano, preparándose para el éxito "de la noche a la mañana". Eso arruinaría la historia.

La Conspiración de las Startup
Tus padres, tus profesores, la televisión, internet y tu tío Eduardo han inculcado en tu cerebro que ser listo y tener una idea es suficiente para garantizarte un lugar en la portada de Gaceta de los Negocios Farolero's 2.0 Fast Company. Parece haber una suerte de conspiración que dice que el éxito de las startup es sencillo; que es algo que te entregan como un collar de flores hawaiiano cuando te bajas del avión en el aeropuerto de Honolulu.
Pero no es sencillo. Es muy difícil. Es una combinación de enormes cantidades de trabajo duro, inteligencia y suerte. Cualquiera que te diga lo contrario te está intentando vender algo. Aunque sólo sea una suscripción a una revista.

Tu posibilidad del 2%
Si vuelvo a leer una historia más sobre aplicaciones Facebook le arreo a alguien en todo el Facebook.
Da la impresión de que cada vez que abro mi lector RSS veo citas como ésta (de un reciente artículo de Fast Company): "Creada en una semana por dos hermanos en la India, [su aplicación para Facebook] se expandió como la pólvora, con medio millón de usuarios apuntándose en las primeras 10 semanas."
Este es sólo uno de entre unos 20 artículos que he leído sobre el fenómeno de las aplicaciones para Facebook. Cada uno tiene numerosos ejemplos de aplicaciones construidas en cuestión de días que ahora poseen enormes cantidades de usuarios.
¡Super empuja a tu amigo!
¡Tírale una oveja a tu amigo!
¡Tírale mierda virtual a tu amigo!
Eso no es suerte, es genio puro... en serio.
Un desarrollador animoso lee estos artículos y piensa "Quiero escribir una aplicación que consiga medio millón de usuarios en 10 semanas. ¡Voy a hacer lo mismo!" Así que se tira una semana en su sótano y termina una aplicación Facebook. Cuando la sube se encuentra con unos pocos miles de usuarios y con apenas los suficientes ingresos por anuncios mensuales como para comprarse un Frapuccino. ¿Por qué?
Porque la inmensa mayoría del tráfico (87%) va a 84 de las 5.000 aplicaciones existentes actualmente para la plataforma. Eso es menos del 2%. Ni uno sólo de los artículos que he leído menciona esta proporción, o el enorme factor suerte relacionado con crear una aplicación para Facebook "exitosa".

Suerte por un Tubo
Ya puedo oír a alguno pensando:
"¿Y qué hay de HotOrNot y PlentyOfFish? Sus fundadores se forran, no parecen excepcionalmente listos, y no se mataron a trabajar. Para ellos fue sencillo..."
Hot Or Not y Plenty of Fish son los ejemplos perfectos del viejo sueño de generar enormes cantidades de dinero con poco esfuerzo (si no estás familiarizado con ellos, son dos sitios de contactos que se convirtieron en superéxitos "de la noche a la mañana" y que permiten a sus dueños ganar millones de dólares al año por más o menos 10 horas de trabajo a la semana).
Si escuchas sus historias y comparas la cantidad de suerte con la cantidad de talento y trabajo duro que hizo falta para que sus sitios tuvieran éxito... la cantidad de suerte es impresionante. No sólo el timing fue absurdamente fortuito y sus ideas no excepcionalmente creativas, además los sitios web en sí mismos fueron bastante sencillos de construir. Parece que ambos se encontraron con una especie de anomalía extraña en el tejido temporal que ha ocurrido... hasta donde puedo ver... exactamente en dos ocasiones.
Si crees que todo lo que hace falta para construir una compañía de software es un sitio web chulo, una aplicación bonita y un enlace desde GigaOm... por favor, piénsatelo mejor.
La web está repleta de aplicaciones lanzadas por gente que pensó que sería así de sencillo. Leen acerca de Hot or Not, construyen y lanzan una aplicación, reciben un vínculo o dos de un bloguero de élite y cuando el dinero no empieza a llegar, abandonan. Y ahora venden el fruto de sus esfuerzos en Sitepoint.
No dejes que eso te pase a tí.

Moraleja
Hay excepciones a la regla las startups de software son difíciles. Pero si tu plan es tener éxito con una idea estilo lanzar ovejas virtuales, más te valdría seguir currando tus 40 horas semanales y gastarte el sueldo en comprar billetes de lotería.
Si quieres tener alguna oportunidad de éxito deberías evitar en todo lo posible el intentar copiar las historias de "una entre un millón". Tus oportunidades de tener éxito son un orden magnitud mayores con una idea aburrida como bug tracking o software de facturación que con el nuevo sitio web social. Tu pregunta a los chorrocientos sitios de contactos gratuitos que se lanzaron después de que Plenty of Fish tuviera éxito.
Puedes malgastar tu tiempo soñando con el éxito y pensando que si tuvieras tan sólo una idea brillante ganarías millones, tu cara en la portada de Sexy Startup Magazine, tendrías un Ferrari ecológico, y esa hermosa/o mujer/marido trofeo. O puedes agachar la cabeza, convertirte en un experto en tu campo, trabajar a destajo y; algún día, quizás... tendrás tu ración de éxito.


Artículo Copyright © 2007 Rob Walling

Este artículo aparece originalmente en el blog Software por Rob: El lado humano del desarrollo de software.

Sobre el autor
Rob Walling es un programador .NET que vive y trabaja en New Haven, Connecticut. Su blog, Software by Rob, es leído por 50.000 personas todos los meses; y habla sobre la contratación de programadores, técnicas de entrevista, técnicas de motivación, gerencia de proyectos de software y características de personalidad de los mejores programadores. Su empresa de consultoría, The Numa Group realiza desarrollo en ASP.NET para compañías en todos los Estados Unidos. Se puede contactar con Rob aquí.

Mi opinión

Dejando aparte el hecho de que soy incapaz de entender qué le ve la gente a FaceBook (tengo un perfil, pero en serio que no le veo la gracia); cada vez estoy más convencido de que estamos inmersos en otra burbuja. En España la estamos notando mucho menos, a pesar de ejempos como expone Joma en el artículo que vinculo al principio; pero en Estados Unidos están volviendo a las andadas de ofrecer cantidades millonarias por empresas con modelos de negocio entre tenues e inexistentes, o basados exclusivamente en los ingresos por publicidad. Creo que los ingresos por publicidad estaban bien cuando las fuentes de dichos ingresos estaban diversificadas, pero ahora la mayoría viene de un sólo sitio: Google Ads. ¿Y si Google cierra el grifo, o hace que gotee menos?

La primera regla del GPhone...

Published 34 weeks, 4 days ago
Mon Nov 05 2007

oha_main_rgb... es que no hay GPhone.

Efectivamente, Google ha anunciado Android, que siguiendo el modelo Google no tiene absolutamente nada que ver con el hardware y se centra en el software: Android, también conocido como la Open Handset Alliance, es un conjunto completo de software para dispositivos móviles, que incluye un sistema operativo (basado en el kernel de Linux), middleware y aplicaciones de terceros.

Por supuesto, Google no está sola en el empeño: Motorola, Qualcomm, HTC y T-Mobile entre otros forman parte de la Open Handset Alliance, con lo que veremos terminales basados en Android en la segunda mitad de 2008.

Miguel, habrá que ir pensando en hacer algo parecido al .NET Compact Framework para esta plataforma, ¿verdad? :) 

Links del viernes (7)

Published 35 weeks, 1 day ago
Fri Nov 02 2007

Trabajando en medio de un puente, habiendo estado en casa el día de fiesta, enfermo. Que no decaiga.

  • Jeffrey Palermo nos presenta otro tutorial sobre MVC.NET.
  • Abundando en el tema, Ted Kristensen se pregunta si el nuevo framework no resultará perjudicial, ya que la posibilidad de separar a la comunidad en dos está ahí. Llevando sus ideas un poco al extremo, ¿no se convertirá MVC.NET en el ASP.NET para listos, despreciando a todo aquél que siga usando el modelo actual? ¿Qué va a pasar con todas las empresas que desarrollan controles para ASP.NET?
  • Y ya que estamos con la división entre listos y tontos, parece ser que Microsoft está trabajando en un proyecto que permitirá a los desarrolladores aficionados crear sitios Web con la misma facilidad que Visual Basic permitía en Windows. Y ya sabemos todos la fama que tenía Visual Basic, y la fama que teníamos los que lo usábamos.
  • Hace ya tiempo que cambié los settings de mi VS a un fondo oscuro, y la verdad es que se nota y lo recomiendo. Ahora hay un sitio web dedicado a ello, aunque de momento tiene poca cosa para descargar: los settings para que podáis importarlos desde Visual Studio y la fuente Inconsolata. Aunque Inconsolata me gusta, de todas las fuentes "modernas" para programación que he probado recientemente, mi favorita sigue siendo Monaco.Si os interesa el tema, aquí tenéis un listado muy completo.

IDE oscuro