Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

miércoles, 27 de julio de 2011

Manejando minidumps en .NET

Por mucho cuidado que pongamos en la programación, por exhaustivas que sean las pruebas unitarias que dirigen nuestros desarrollos y meticulosas las personas que realicen las funcionales, de integración o aceptación, lo cierto es que de cuando en cuando nos encontraremos ante la tesitura de tener que depurar un error en nuestras aplicaciones sobre una máquina de producción. En estos equipos no tendremos disponible nuestro IDE favorito y, aparte de las trazas de depuración que podamos habilitar para ayudarnos a determinar el origen del problema, lo cierto es que a priori solo nuestra holmesiana capacidad de deducción nos ayudará a lograr nuestro objetivo.

Sin embargo, no estamos del todo “vendidos”, y además de numerosas herramientas de depuración que nos ofrece Microsoft en su paquete Debugging Tools for Windows o de instalar en .NET Reflector add-ins como Deblector –técnicas en las que entraremos más adelante– podemos hacer uso de la función de la API MiniDumpWriteDump para obtener un archivo con un volcado de memoria que nos ayude, ya en nuestra máquina de desarrollo, a depurar el problema, bien con alguna de las aplicaciones diseñadas a tal fin, bien con el propio Visual Studio que, especialmente en su versión de 2010 sobre el .NET Framework 4, cuenta con poderosas herramientas a tal fin.

Los minidumps permiten la depuración post mórtem de nuestras aplicaciones, es decir, llevarla a cabo cuando la aplicación está “muerta”. Son usados, por ejemplo, por Microsoft, cuando un usuario envía información sobre un error desde el cuadro de diálogo correspondiente de Windows XP. Un minidump consiste en un volcado de la memoria de nuestra aplicación, y mediante la carga del mismo en un depurador podremos estudiar desde el hilo en el que se produjo una determinada excepción al valor de las variables involucradas o el estado de nuestro programa. Esto lo veremos más adelante. Por lo pronto, veamos cómo podemos usar la función nativa de Windows MiniDumpWriteDump desde nuestro código.

Obvia decir que al no tratarse de una función propia del .NET Framework es necesario realizar la llamada mediante Interop. Así, lo primero es definir las estructuras de datos que necesitaremos para hacer uso de aquella y, a continuación, importar las librerías necesarias y las funciones que usaremos, tanto de la Kernel32.dll para obtener información sobre el proceso como, en el caso de MiniDumpWriteDump, Dbghelp.dll.

Según la MSDN, la sintaxis de nuestra función es:
BOOL WINAPI MiniDumpWriteDump(
__in HANDLE hProcess,
__in DWORD ProcessId,
__in HANDLE hFile,
__in MINIDUMP_TYPE DumpType,
__in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
__in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
__in PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
Crearemos una clase que nos ofrezca el comportamiento que deseamos: un auxiliar que nos permita volcar a fichero el estado de la memoria cuando nuestro proceso capture una determinada excepción. El código podría quedar así:

    public class MiniDumpWriter
    {
        [Flags]
        public enum DumpType : uint
        {
            MiniDumpNormal = 0x00000000,
            MiniDumpWithDataSegs = 0x00000001,
            MiniDumpWithFullMemory = 0x00000002,
            MiniDumpWithHandleData = 0x00000004,
            MiniDumpFilterMemory = 0x00000008,
            MiniDumpScanMemory = 0x00000010,
            MiniDumpWithUnloadedModules = 0x00000020,
            MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
            MiniDumpFilterModulePaths = 0x00000080,
            MiniDumpWithProcessThreadData = 0x00000100,
            MiniDumpWithPrivateReadWriteMemory = 0x00000200,
            MiniDumpWithoutOptionalData = 0x00000400,
            MiniDumpWithFullMemoryInfo = 0x00000800,
            MiniDumpWithThreadInfo = 0x00001000,
            MiniDumpWithCodeSegs = 0x00002000,
            MiniDumpWithoutAuxiliaryState = 0x00004000,
            MiniDumpWithFullAuxiliaryState = 0x00008000,
            MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
            MiniDumpIgnoreInaccessibleMemory = 0x00020000,
            MiniDumpValidTypeFlags = 0x0003ffff,
        };

        [StructLayout(LayoutKind.Sequential, Pack = 4)]  
        struct MiniDumpExceptionInformation
        {
          public uint ThreadId;
          public IntPtr ExceptionPointers;
          [MarshalAs(UnmanagedType.Bool)]
          public bool ClientPointers;
        }

        [DllImport("dbghelp.dll",
          EntryPoint = "MiniDumpWriteDump",
          CallingConvention = CallingConvention.StdCall,
          CharSet = CharSet.Unicode,
          ExactSpelling = true, SetLastError = true)]

        static extern bool MiniDumpWriteDump(
          IntPtr hProcess,
          uint processId,
          IntPtr hFile,
          uint dumpType,
          ref MiniDumpExceptionInformation expParam,
          IntPtr userStreamParam,
          IntPtr callbackParam);

        [DllImport("kernel32.dll", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
        static extern uint GetCurrentThreadId();

        [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess", ExactSpelling = true)]
        static extern IntPtr GetCurrentProcess();

        [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcessId", ExactSpelling = true)]
        static extern uint GetCurrentProcessId();

        /// <summary>
        /// Generates a memory dump and save it into a file.
        /// </summary>
        /// <param name="fileName">The file where dump must be stored.</param>
        /// <param name="dumpType">The type of memory dump generated.</param>
        /// <returns></returns>       
        public static bool Write(string fileName, DumpType dumpType)
        {
            using (FileStream fs = new FileStream(fileName, 
                                                  FileMode.Create, 
                                                  FileAccess.Write, 
                                                  FileShare.None))
            {
                MiniDumpExceptionInformation exInfo;
                exInfo.ThreadId = GetCurrentThreadId();
                exInfo.ClientPointers = false;
                exInfo.ExceptionPointers = Marshal.GetExceptionPointers();
                
                bool value = MiniDumpWriteDump(GetCurrentProcess(),
                                               GetCurrentProcessId(),
                                               fs.SafeFileHandle.DangerousGetHandle(),
                                               (uint)dumpType,
                                               ref exInfo,
                                               IntPtr.Zero,
                                               IntPtr.Zero);                
                return value;
            }
        }
    }

Y para usarla, simplemente llamaremos al método correspondiente cuando nos interese tener un volcado de memoria, por ejemplo, cuando se produzca una excepción en nuestro programa:

 class Program
    {
        static void Main(string[] args)
        {
            try
            {
                object o = null;

                Console.WriteLine("Press ENTER to continue...");
                Console.ReadLine();

                o.ToString();

            }
            catch (System.Exception e)
            {                
                string dumpFile = @"Something\Like\lobosoft.dmp";                
                MiniDumpWriter.Write(dumpFile, MiniDumpWriter.DumpType.MiniDumpWithFullMemory);
            }
        }
    }

Hay que tener en cuenta que los ficheros generados son bastante voluminosos y que la ruta donde los guardará nuestra aplicación debe establecerse a una ubicación donde contemos con permisos suficientes como para que pueda ser escrito. Una vez generado podremos usar Visual Studio, o la Debugging Diagnostic Tool para analizar el error. Pero esto será objeto de una próxima entrada.

martes, 17 de mayo de 2011

Día de Internet 2011: ¿Llega la web 3.0?

Entre las actividades del curso de periodismo ambiental que estoy realizando se nos propuso la lectura del libro Bienvenida Web 3.0. Guía para sobrevivir en la Internet del 2011, de Eduardo Albalá, dentro de la unidad didáctica dedicada al periodismo digital visto desde la experiencia de las redes sociales. Aprovechando que hoy se celebra el Día de Internet (además del Día Internacional del Reciclaje, y es que hasta la gran red se recicla y renueva a sí misma) y que me apetecía reseñar siquiera de forma somera el libro, aquí os dejo con una entrada sobre el mismo.

El texto, que puede ser obtenido en su versión electrónica a través del enlace superior, presenta con una visión bastante clara y práctica la evolución de la red de redes en los últimos años, llevándonos de una web 2.0 en la que los usuarios tomaron el protagonismo hasta convertirse (convertirnos) en generadores de contenidos a través de los blogs, foros o redes sociales, y donde los grandes buscadores como Google tomaron relevancia gracias a potentes algoritmos de ordenación y búsqueda de contenidos con un negocio basado en la visualización (a más “impactos” más ingresos en publicidad), hacia una nueva Internet donde las aplicaciones, la computación en la nube y la semántica de los contenidos ganan terreno.

Los usuarios de esta web 3.0 podrán interactuar con la máquina sin utilizar engorrosas interfaces (teclado, ratón…) sino a través de su cuerpo gracias a tecnologías tan interesantes como el reconocimiento gestual o cámaras tridimensionales tan potentes como Kinect, de Microsoft, para la que los usuarios han desarrollado en un lapso relativamente breve de tiempo multitud de controladores y aplicaciones. Los móviles, para los que ya se preveía años atrás un mercado floreciente en la red, tanto como puerta de acceso a sus contenidos desde los navegadores (¡qué lejos quedan las páginas WAP hoy día!) como a través de aplicaciones propias, cada vez más presentes e imprescindibles en estos teléfonos inteligentes o smartphones, hoy día permiten incluso enriquecer la experiencia de usuario con interfaces avanzadas como las que permite la realidad aumentada.

La red semántica irá ganando contenido y permitirá a los usuarios realizar búsquedas mucho más potentes que las que pueda ofrecer hoy día cualquier buscador de Internet al uso, como Google o Bing entre otros. Los contenidos se ven así contextualizados, presentando interrelaciones con otra información y permitiéndoles dotarles de atributos, como si de objetos reales se tratase. Esto, junto a la intercomunicación de dispositivos (Machine to machine o M2M), la citada realidad aumentada y la inteligencia artificial (útil, por ejemplo, para el desarrollo de sistemas expertos que pueden desembocar en asistentes para los usuarios como Lucía, el bot de información al usuario de la Junta de Andalucía a través de Messenger) abre nuevos campos al uso de la informática por parte de personas que son, en gran medida, “nativos de la red”, así como a mercados que irán basándose más en la adquisición de servicios que en la publicidad: Internet deja de ser “gratis” y surgen cada vez más servicios de pago y “cotos” que dividen la red en espacios privados.

Como unión de aplicaciones y servicios surge la idea del cloud computing o la computación en la nube. Una idea tan interesante como peligrosa que abre el camino al software como servicio (SaaS), tal y como lo viene ofreciendo Google desde hace tiempo con su Google Docs, donde tanto los datos como las aplicaciones residen en la red, aislando al usuario de detalles “a bajo nivel” de las mismas (dónde residen, cómo se ejecutan, sobre qué máquinas) y permitiéndole acceder a las mismas desde cualquier lugar gracias al concepto de navegador como soporte universal para aplicaciones. En ese sentido irá enfocado el sistema operativo que la compañía desea sacar a la luz y que tiene en su Google Chrome una de sus mayores bazas. El pago por el servicio permite evitar la piratería de software y mantener un ritmo de actualizaciones muy interesante para las compañías y, a cambio, el usuario no necesita un ordenador especialmente potente ya que prácticamente la totalidad del cómputo se realiza en servidores (aparece así la noticia del nuevo portátil para la nube y, de paso, volvemos al concepto de terminal “tonto” que tanto primó en los años 80 en la informática).

Por el contrario, la nube se presenta como nubarrón cuando por problemas de servicio (de la operadora con la que tengamos contratado el acceso a Internet, por la propia compañía que nos ofrece el servicio software…) no podemos acceder a la nube y sus servicios. Aunque posiblemente muchas aplicaciones ofrezcan servicios en desconexión, como ya ocurriese con la API de Google Gears, lo cierto es que nos veríamos entonces muy limitados en cuanto a lo que podríamos hacer con nuestro ordenador. Esto sin citar los problemas de seguridad que podemos encontrarnos en la red y que ya no estará en nuestra mano gestionar, como ha ocurrido recientemente con el robo de datos personales a compañías como Sony o Microsoft, o con la gestión del servicio de almacenamiento virtual Dropbox.

Richard Stallman, el gurú del software libre y fundador de la GNU, es un duro crítico de la nube y del SaaS. El control del software para el usuario en la nube no es posible, lo que rompe con la filosofía del software libre y las libertades del mismo, a saber:
0.- Libertad de usar el programa con cualquier propósito.
1.- Libertad de estudiar cómo funciona el programa y modificarlo, adaptándolo a tus necesidades.
2.- Libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prójimo.
3.- Libertad de mejorar el programa y hacer públicas esas mejoras a los demás, de modo que toda la comunidad se beneficie.
Personalmente, como informático concibo los cambios de Internet y de las nuevas tecnologías como un reto apasionante, pero como usuario guardo serias dudas sobre cómo podrán influir estas en nuestras vidas: si ya las cookies en el navegador supusieron en su día un duro golpe a nuestra privacidad (recuerdo cómo explicaba el concepto a mis alumnos en algún curso sobre Internet mediante el ejemplo del refinamiento de búsquedas en Amazon gracias a la información que le íbamos dando a través de búsquedas precedentes) y la publicidad de Google Ad Sense a día de hoy usa los datos de nuestra cuenta de usuario en Google (vinculada al correo de Gmail, a nuestros gustos en YouTube, a las fotos de Picasa o a las búsquedas que hacemos en el propio buscador), me cuestiono qué podrán conseguir gracias a los datos que proporcionamos en Facebook, el seguimiento a través del chip RFID que contendrá nuestro futuro móvil, o a los controvertidos datos de geolocalización que arroja el GPS del mismo.

No se trata, por supuesto, de generar miedo o reticencia al uso de Internet, pero lo que sí está claro es que, ante la nueva red, más nos vale estar informados. El libro cuyo contenido, al menos así lo he intentado, he querido haceros vislumbrar a través de la entrada, así nos lo permite. Espero que os guste.

jueves, 5 de mayo de 2011

Nuevamente viernes

Hace tiempo inicié una sección que intenté que fuese semanal llamada “¡Por fin viernes!”. En ella incluía entradas en las que cada viernes realizaba un pequeño resumen de algunas de las entradas que durante la misma había descubierto en la red y me habían parecido interesantes o hacía una reflexión en torno a lo que había ocurrido en la misma. Hoy, meses –años– después, la retomo para realizar una declaración de intenciones implícita ya que si no terminará por truncarse como tantas otras, e insuflar vida al blog. He aquí el “¡Por fin viernes!” de la primera semana de mayo de 2011 con un breve resumen de lo acontecido en la misma.

Llevo un tiempo volviendo a “reenamorarme” de la profesión y durante el último par de meses he realizado varios cursos en diversas materias (HTML5 y CSS3, diseño y programación de videojuegos en Python y J2ME, LOPD, metodologías ITIL, Silverlight, este en curso) además de seguir con otro de Periodismo Ambiental y la Licenciatura en Ciencias Ambientales. Sin embargo, me seguía faltando algo. El blog, que en el pasado tanto me llenó, continuaba inactivo. Ya en su día, años atrás, fue el motor del cambio, el que me permitió redescubrirme como informático y creo que ha llegado el momento de que vuelva a ser así. A principios de la semana me llegaba un aviso de expiración del dominio y me estuve planteando si merecía la pena seguir con él. En el último año, tras pagar el servicio de hosting a unos indeseables y que me impidiesen el acceso a mi propia cuenta apenas un par de meses después de la renovación tomé la decisión de desvincularles como contacto técnico, ponerme a mí mismo y redirigir el dominio al blog de Blogger en el que está actualmente. Me dedicaría entonces a escribir más que a administrar el sitio, pero no fue así. Tras un año de actividad prácticamente nula he decidido darle una oportunidad y aquí estoy. Con el dominio y los ánimos renovados, una cuenta de Twitter (@Lobosoft_Es) y todas las antiguas entradas que había decidido dejar atrás y que finalmente (¡ay, espíritu voluble!) he determinado incluir en el blog e ir arreglándolas, vuelvo a recuperar las ganas de escribir y experimentar... ¡o justo al contrario!

Desde comienzos del verano pasado trabajaba y escribía en mi viejo portátil con alma de GNU/Linux (en concreto, la distro gNewSense. Con la tarjeta de vídeo fastidiada, los sistemas operativos del amigo Gates apenas funcionaban un minuto antes de que la imagen se congelase y tuviera que apagar el ordenador durante bastante tiempo -de minutos a horas- antes de que volviese a funcionar). Hoy, en ese afán de renovación, he hecho mío este otro pequeño: un HP DV6-3181SS con un corazoncito i7 y bastante guerra por delante. Aunque siempre me han gustado más los sobremesa, el portátil me permitirá gozar de mayor movilidad y, por supuesto, he buscado una marca que ofreciese calidad desde la responsabilidad. La presencia de coltán en los portátiles así como el importante consumo de recursos necesario para fabricarlos hace imprescindible, a mi parecer, que pensemos mu y bien nuestras compras antes de que, llevándolas a cabo, emitamos nuestro “voto” a favor de un modelo de producción u otro. Si tenéis curiosidad, podéis leer las respuestas de HP a las cuestiones planteadas por la organización Make IT Fair, una ONG que pide que la fabricación de móviles y otros equipos electrónicos se realice de forma social y medioambientalmente responsable.

En cuanto a los eventos de la semana, ayer se celebraba en Málaga el Asegúr@IT 9, “La cabeza en las nubes, los pies en el suelo” y creo que estuvo genial. Y digo creo porque por el trabajo no pude asistir (ay, qué tiempos gloriosos los de estudiante a tiempo completo, jajaja) aunque me habría encantado. Si alguno de vosotros estuvo por allí, ¿por qué no nos pone al tanto de la jornada? ¡Ah! Y para quien quiera y pueda, el martes de la próxima semana (día 10 de mayo) hay una jornada sobre seguridad en la web también en Málaga. De momento, nada más.

¡Buen fin de semana!

jueves, 14 de abril de 2011

Despejado

Tanto desde mi perfil profesional de informático como desde mi papel de usuario de las nuevas tecnologías considero que "la nube" abre un interesante campo de trabajo, con sus luces pero también sus sombras (y muchas). Una de ellas es la falta de disponibilidad.

Esto es lo que ocurre cuando intentas consultar un documento y el cielo aparece por completo despejado:

Al final, la tormenta se forma en tu interior.

Nuevas andanzas en la web

Llevo casi tanto tiempo apartado del blog (al menos, de la forma asidua y continuada de antaño) como del desarrollo web, al menos desde que salté de los protocolos de la capa de aplicación para ponerme a juguetear con los de la de transporte, así que como no es bueno dejar olvidarse de lo que un día te satisfizo y dio de comer, me propuse no hace mucho poner al día mis conocimientos en lo que a estas tecnologías informáticas se refiere.

Hace apenas unos días me ponía manos a la obra participando en un curso de Silverlight que ha comenzado a impartir el MVP Braulio Díez en Málaga y, como adalid del software libre, he empezado a investigar un poco sobre las maravillas de HTML5, CSS3 y librerías como jQuery. El mes pasado hice un curso sobre estos, aunque me resultó demasiado básico (al menos no he olvidado demasiado, me dije), y precisamente hoy, cuando investigaba sobre el tema, me he encontrado con un movimiento por parte de IBM: el lanzamiento hace apenas unos días de su IDE “Maqetta”, de código abierto -en su licencia figura un sospechoso “commercial-friendly open source” que no sé si la acerca más a una posible Licencia BSD modificada o a una licencia Libre Académica (AFL)- y totalmente basado en HTML5: el navegador es tu amigo.

He podido probar la Preview 1 aunque no en profundidad. Sin embargo, salvo una ligera tardanza en el tiempo de respuesta cuando se realizan operaciones algo más “pesadas”, lo cierto es que el uso de la herramienta es bastante intuitivo y no se aleja demasiado del que ofrecen otras herramientas de diseño y desarrollo visuales. Dado que está enfocada a la creación de proyectos para dispositivos móviles y aplicaciones de escritorio incorpora emuladores de dispositivos para comprobar la disposición de las páginas creadas en cada uno de ellos.


Con esta herramienta, liberada a través de la Fundación Dojo, IBM plantea que cualquier desarrollador podrá hacerla crecer y plantar cara a dos soluciones tan implantadas en el mercado como Flash y Silverlight. Aunque no es fácil, ya que habitualmente van “por detrás” de lo que los productos propios de cada compañía ofrecen, lo cierto es que apostar por los estándares en un escenario tan marcado por las incompatibilidades y las “guerras de navegadores” de las diversas empresas que han entrado en juego es, hasta cierto punto, aferrarse a una tabla de salvación.

Además, entre otras funcionalidades, Maqetta cuenta con edición WYSIWYG, diseño de prototipos (website wireframing, aunque personalmente me gusta bastante Balsamiq), posibilidad de pulsar y arrastrar controles sobre la propia “piel” de un móvil, edición simultánea en modo diseño y de código fuente, un editor de temas o la posibilidad de definir interacciones con el usuario sin necesidad de programar.


En resumen, una herramienta de diseño y desarrollo que parece ofrecer funciones de lo más interesantes y que no deberíamos perder de vista. Ahora que he decidido volver a Internet, incluyendo al blog, no le quitaré ojo de encima. Si queréis descargarla, podéis hacerlo a través de su sitio web o de este enlace directo.

viernes, 25 de febrero de 2011

Políglotas

En la anterior entrada del blog mencionaba lo interesante que resulta –a mi parecer– poseer un perfil profesional en el que, aunque nos hayamos especializado en una determinada materia o tecnología, dominemos un amplio espectro de conocimientos. A lo largo de los años las distintas batallas diarias nos hacen ver cómo hasta lo que menos podríamos imaginarnos nos ayuda a resolver un determinado problema. En muchas ocasiones son, en efecto, estos conocimientos que podríamos denominar periféricos los que nos ayudan a dar con la solución que andamos buscando.

Mientras escribía sobre la especialización y la diversificación recordaba un artículo escrito hace unos años por Paul Graham en su blog, “Beating the Averages”, en el que hacía referencia a “La paradoja de Blub”. Si no la conocéis, os invito a leer el artículo completo de Graham y, de cualquier modo, aquí presento un escueto resumen de la mencionada paradoja.

La Torre de Babel

Supongamos que Blub es un hipotético lenguaje de programación de propósito general que nos permite resolver diversos tipos de problemas y para el que existen, al menos, un lenguaje menos potente que él y otro que lo es más. Imaginemos a un programador de Blub que, por ejemplo, conoce la existencia del ensamblador y del lenguaje Pascal. Para nuestro desarrollador está claro que el ensamblador no es lo suyo (para eso están los compiladores) y, desde la perspectiva de Blub, Pascal no aporta mucho más que una sintaxis desconocida para él y, aunque desconoce a qué corresponde tal o cual función de Blub, intuye que Pascal no le aporta demasiado. También ha visto algo de Java, un lenguaje que, en este caso, es más potente que Blub, pero dado que “piensa en Blub”, no es capaz de apreciar la potencia de Java como lenguaje. Es decir, que si bien nuestro programador es capaz de, mirando “hacia abajo”, darse cuenta de esos lenguajes son inferiores a Blub, su desconocimiento hace que sea incapaz de mirar “hacia arriba” y apreciar las ventajas de otros lenguajes más potentes.

Esta paradoja fue usada por Graham para ilustrar la relación existente entre diversos lenguajes de programación y la completitud de Turing y, en particular, para hacer ver lo difícil que resulta comparar dos de ellos entre sí cuando no se conoce alguno de ellos en profundidad.

Volviendo al tema de la anterior entrada, cuanto más amplio y diverso sea nuestro perfil, mejor preparados estaremos para solucionar los problemas que se nos presenten por delante y más acertadas serán nuestras decisiones sobre qué tecnología o qué herramientas usar para construir la solución pensada. E incluso para elaborarla, por qué no. Quienes dominan varios idiomas y mejoran sus conocimientos filológicos son capaces de inferir el significado de un mensaje emitido en un idioma extraño para ellos si es afín a alguno de los que conocen, e incluso afirmar si uno de ellos ha más evolucionado que el otro desde una raíz común o si deriva de aquel. Con los lenguajes informáticos ocurre otro tanto: aunque la mayoría de ellos permite ofrecer soluciones teóricas a los problemas con que nos encontremos, algunos permitirán ponerlas en práctica de un modo más eficiente, ya sea por la plataforma sobre la que se sustentan o por el enfoque que posee el propio lenguaje.

Lo anterior, que parece de Perogrullo, no debe de serlo tanto cuando a lo largo de los años me he encontrado con gente tan acérrima seguidora de un determinado lenguaje o familia de tecnologías (“Jafa forever”, “Microsoft a muerte”, …) que era incapaz de admitir que montar un CMS para gestionar un blog era más rápido y eficiente usando PHP que Java sobre un Apache Tomcat o que, a largo plazo, un ERP en .NET Framework sería probablemente más fácil de mantener y extender que de hacerlo en Python, por ejemplo. Aunque a priori un desarrollador de Bulb tendrá listo su programa en menos tiempo si lo hace en “su” lenguaje antes que en otro que no domine, a largo plazo sus decisiones y forma de programar estarán supeditadas a aquello que le es familiar, y cuanto más estrecho sea su campo de visión más limitadas estarán sus propuestas.

Lo expuesto, por supuesto, sería extensible a multitud de aspectos de nuestra profesión, y no solamente a la programación. Y, “aunque los experimentos haya que hacerlos con gaseosa”, no es menos cierto que de vez en cuando no está de más ser un poco innovador y abrirse a nuevas experiencias. Además, resulta divertido.

Propongo así ser políglotas tecnológicos.

miércoles, 23 de febrero de 2011

¿Es siempre preferible la especialización?

Hace unos días conversaba con un gran informático y mejor amigo sobre diversos temas, hasta que uno de ellos me hizo recordar una de las entradas que tengo pendientes desde hace mucho. Hablábamos sobre las necesidades formativas de cada cual y cómo íbamos cubriéndolas de un modo u otro, así como de las ventajas y desventajas de un perfil profundamente especializado frente a uno excesivamente diversificado o difuso. Dicho en tres palabras: especialización versus diversificación.

Una de las facetas que me parecen más fascinantes del mundo de la ecología es el estudio de cómo interactúan las diversas especies con su entorno. Por poco que nos fijemos en ellas, observaremos que algunas especies se especializan en la obtención de recursos de un determinado hábitat, alcanzando el máximo aprovechamiento del mismo; alcanzan, por tanto, un nivel óptimo de integración con el entorno. Suelen aparecer en regiones aisladas geográficamente, como islas o territorios que presenten barreras biogeográficas (por ejemplo, una alta cadena montañosa), y como ejemplos podrían valernos el oso panda o el koala: grandes consumidores de bambú o eucalipto, respectivamente, y francamente despreocupados de improbables depredadores. Frente a estas, otras especies optaron por una estrategia generalista u oportunista, aprovechando cualquier recurso que esté en su mano alcanzar pero sin alcanzar una optimización máxima. Nuestros amigos los córvidos (por ejemplo, las cada vez más extendidas urracas) o muchos roedores (como la rata o el conejo) podrían servir de ilustración a este respecto. Entre ambos tipos de especies se encuentra un amplio espectro de otras más o menos adaptadas a su entorno.

¿Qué tiene que ver lo anterior con el perfil profesional de un informático? Bien, las especies especialistas alcanzan un aprovechamiento óptimo de los recursos en un entorno que ha resultado estable a lo largo del tiempo. De seguir así, resulta claro que estarán más adaptadas que cualesquiera otras para obtener el mejor rendimiento de aquello que necesiten para sobrevivir. Las especies generalistas, en cambio, no serán capaces de alcanzar ese máximo, pero obtendrán lo necesario para su supervivencia de diversas fuentes. En un ecosistema estable los especialistas vivirán “mejor” que los oportunistas, pero si las condiciones cambian –sobre todo si lo hacen de forma brusca o radical, sin dejar tiempo ni oportunidad para adaptarse a las nuevas- las poblaciones de especies oportunistas permanecerán más estables que las de especialistas y, posiblemente, si las nuevas circunstancias les son propicias, podrán incluso medrar en ellas.

Dentro del ecosistema de la informática, a mi parecer, resulta de lo más interesante poseer un perfil variopinto, especializado en lo posible en una rama del conocimiento, en efecto, pero que no deje de lado otras que puedan dotarte de un valor añadido en un momento dado. Creo que los dos extremos planteados pueden resultar nefastos para un profesional: una excesiva especialización puede hacer que carezcamos de valor a pocos años vista dentro de un sector tan cambiante como el nuestro, aunque en un hipotético presente nos dé cuantiosos réditos (como podría ser el caso de un consultor SAP o un desarrollador muy especializado en una tecnología floreciente), y una diversificación extrema nos llevaría a ser un claro ejemplo del refrán: “aprendiz de mucho, maestro de nada”.

Personalmente, hace unos años me encontré en una situación en la cual me “salvó” de una situación embarazosa poseer un perfil intermedio pero con una fuerte carga generalista. Aunque mi perfil académico está enfocado al área de sistemas, lo cierto es que, salvo un par de experiencias en este ámbito, mi carrera profesional me ha llevado a trabajar, sobre todo, en desarrollo de software. Mis intereses particulares, como bien sabéis quienes habéis seguido el blog durante un tiempo, se centran más en el área de la seguridad informática (aunque ahí me considero poco más que un neófito: ¡me queda tanto por aprender!). Y por haber vivido en Granada, una ciudad maravillosa para el estudiante pero nefasta para el trabajador, a lo largo del tiempo fui acumulando experiencias de lo más diversas en el mundo de la programación; desarrollador web (desde páginas básicas en HTML con sus CGIs hasta ASP.NET pasando por PHP y su terrible “hermano” ASP) y de aplicaciones de escritorio (Visual Basic, Java, VB.NET y C#). Pues bien, cuando cambié de ciudad (y trabajo) hace unos años y me vine a Málaga, lo hice para ocupar un puesto de analista programador en C#, pero finalmente acabé llevando a cabo labores de consultoría (definiendo el proceso de Gestión de la Configuración para un organismo público) junto a unos superiores de los que aprendí mucho, durante un tiempo planteando una serie de cambios sobre herramientas de software libre (volvía el PHP) e, incluso, volviendo a .NET en el último periodo que pasé allí.

De resultas de lo anterior, cuando me marchaba, mi responsable directo –y primigenio entrevistador– me comentó que, debido a cierto varapalo, las expectativas empresariales que habían propiciado mi contratación no se habían visto cumplidas y que únicamente me había salvado de la cola del desempleo (o de buscar un nuevo trabajo justo un par de meses después de mudarme a la ciudad) la capacidad de adaptación y aprendizaje que me había proporcionado el perfil que poseía.

Siempre he pensado que es más interesante (y divertido) poseer un perfil versátil a la par que completo, y en esta apreciación coincidía con mi amigo. Pero, ¿qué os parece a vosotros? ¿Veis mejor ser especialista o ser oportunista? ¿Un bólido o un todoterreno? Y, en el caso de un término medio, ¿hacia qué lado de la balanza os inclinaríais?