Aprendiendo Vaadin #1: Hola Mundo

Gestor de proyectosLlevaba tiempo buscando una forma de poder desarrollar una aplicación RIA sin tener que sufrir una dura curva de aprendizaje, aprovechando mis conocimientos de Java y obteniendo unos resultados suficientemente buenos. De primeras, GWT me pareció una buena opción, pero después descubrí Vaadin, que bajo mi punto de vista va un paso más allá y me convenció mucho más. En esta serie de entradas compartiré mis primeras experiencias con este framework.

Y bien, ¿por qué Vaadin? Creo que es un framework muy a tener en cuenta pues aporta a cualquier equipo de desarrollo RIA grandes y claras ventajas competitivas. Generalmente en este tipo de proyectos suelen existir 2 perfiles claramente diferenciados: el desarrollador de front-end y el de back-end. Aunque se pueda dar el caso, no es muy común contar con miembros en el equipo que dominen ambas vertientes, y más difícil aún es encontrar alguien de estas características en el mercado laboral con cierta urgencia.
Pues bien, usando Vaadin, sólo con perfiles Java es posible desarrollar aplicaciones 100% RIA de resultados sorprendentemente buenos, lo cual aporta una gran flexibilidad para poder echar en cualquier momento más carne en el asador de un lado o de otro.
Por otro lado, la posibilidad de crear aplicaciones móviles HTML5 mediante el add-on TouchKit usando exclusivamente Java para su desarrollo me parece muy atractiva.

Cómo no podía ser de otra forma, el primer acercamiento será creando el típico “Hola Mundo”. Crearé el proyecto AprendiendoVaadin montando primeramente un entorno siguiendo las indicaciones del libro de Vaadin. En mi caso, como voy a usar Eclipse, he seguido las instrucciones para instalar el plugin de Eclipse y para crear y ejecutar un nuevo proyecto. Tras ello me encuentro que ya tengo un pequeño código de ejemplo:

public class AprendiendoVaadinUI extends UI {

	@Override
	protected void init(VaadinRequest request) {
		final VerticalLayout layout = new VerticalLayout();
		layout.setMargin(true);
		setContent(layout);

		Button button = new Button("Click Me");
		button.addClickListener(new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				layout.addComponent(new Label("Thank you for clicking"));
			}
		});
		layout.addComponent(button);
	}
}

Resulta fácil de leer y muy claro lo que hace. La clase extiende UI (User Interface) que es la clase padre de donde deben heredar las interfaces de usuario que vayamos a crear. A continuación sobreescribe el método init que inicializará la interfaz de usuario.
Define un Layout vertical que se asigna a la interfaz. Después crea un botón al que asigna un comportamiento ante el evento Click y añade el botón al layout creado previamente.
Ante un click en el botón lo que ocurrirá es que aparecerá un Label dándonos las gracias justo debajo del botón, ya que el layout definido es vertical.

VaadinClickMe

Para llevar este ejemplo tan sencillo un pequeño paso más allá voy a hacer que el mismo botón sirva tanto para mostrar como para ocultar el mensaje “Hola Mundo!!!”. Para ello bastará con jugar con la visibilidad del Label que contiene el mensaje y con la propiedad Caption del botón como se puede ver en el código:

public class AprendiendoVaadinUI extends UI {

	private final String BTN_CAPTION_MOSTRAR_MENSAJE = "Mostrar mensaje";
	private final String BTN_CAPTION_OCULTAR_MENSAJE = "Ocultar mensaje";
	private final String MENSAJE = "Hola Mundo!!!";

	@Override
	protected void init(VaadinRequest request) {
		final VerticalLayout layout = new VerticalLayout();
		final Label mensaje = new Label(MENSAJE);
		final Button button = new Button(BTN_CAPTION_MOSTRAR_MENSAJE);

		layout.setMargin(true);
		setContent(layout);

		layout.addComponent(button);
		mensaje.setVisible(false);
		layout.addComponent(mensaje);

		button.addClickListener(new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				mensaje.setVisible(!mensaje.isVisible());
				if (mensaje.isVisible())
					button.setCaption(BTN_CAPTION_OCULTAR_MENSAJE);
				else
					button.setCaption(BTN_CAPTION_MOSTRAR_MENSAJE);
			}
		});
	}
}

Como primer acercamiento no está mal. De una forma muy sencilla y rápida he conseguido algo que de otra forma seguramente me habría costado más, y usando sólo Java. ¿Alguien da más?

Puedes descargar el código fuente de este ejemplo aquí.

Mi carrera de desarrollador de software: el perfil de gestor

Gestor de proyectosPara terminar con la mini-serie de artículos sobre orientación profesional del desarrollador de software trataré con algo más de detalle las peculiaridades del perfil de gestión en desarrollo de proyectos de software. ¿Es éste tu objetivo profesional? ¿Te estás dedicando ya a ello?

Si has leído el primer post de esta mini-serie es probable que hayas decidido que tu orientación profesional debería enfocarse a la rama de gestión. Esta rama puede aportarte, sin lugar a dudas, grandes satisfacciones, sobre todo si no son las cuestiones puramente técnicas las que más te atraen de este trabajo. Igualmente esta rama te puede aportar muchos quebraderos de cabeza.

Para afrontar con éxito la carrera de gestión de software necesitarás una fase previa de preparación:

  • Paso obligatorio es contar con experiencia en desarrollo como técnico antes de ejercer como gestor. Sólo así sabrás de primera mano cómo funcionan las tripas de la profesión, qué problemas pueden aparecer, la experiencia te enseñará a estimar y te ayudará a planificar, etc.
  • Como ya he mencionado anteriormente en anteriores posts, durante esa fase previa a la gestión ejerciendo como técnico, intenta tocar todos los palos posibles y consigue un perfil técnico horizontal: no sólo lenguajes y herramientas de desarrollo, también gestores de BB.DD., servidores web y de aplicaciones, etc. pero sin profundizar demasiado en ninguna de estas tecnologías. Lo que después te servirá es tener una base firme y visión general.
  • Procura ser bueno en tu trabajo pero evita hacerte imprescindible. Si te haces imprescindible por ser el único que posee alguna aptitud técnica te quedarás anclado y no progresarás. Comparte tu trabajo, tus conocimientos, y documenta lo que hagas, y evitarás esa situación.

Esta fase previa de toma de experiencia debería durar entre unos 5 y 10 años, dependiendo del caso. Al final de esta fase será muy conveniente cuidar tu formación orientándola a la gestión:

  • Fórmate en software de gestión de proyectos. Los diagramas de Gantt se convertirán en una herramienta fundamental. Microsoft Project es un clásico en este campo. Herramientas de gestión de proyectos como Redmine (entre otras) también son muy recomendables.
  • En algunos sitios son muy valoradas las certificaciones en gestión de proyectos. Una certificación PMP puede dar mucho peso a tu CV y abrirte muchas puertas, además de convertirte en un solicitado profesional. También una certificación PRINCE2 te puede resultar muy útil si piensas desarrollar tu carrera en Reino Unido.

Así mismo, también es importante contar con una serie de aptitudes que si no son tu fuerte puedes tratar de mejorar durante esta fase previa:

  • Es fundamental contar con dotes de liderazgo. Debes conseguir que el equipo te respete, y debes tratar de transmitir al equipo empuje, ganas y motivación.
  • Como líder debes mostrar interés en entender a los miembros del equipo; cada uno tiene situaciones, inquietudes y objetivos muy diferentes y sólo así podrás conducirles adecuadamente para lograr el éxito del proyecto.
  • Es muy importante que seas ordenado y metódico. La gestión de un proyecto no puede ser un caos o estará abocado irremediablemente al fracaso, y el origen de ese orden debe partir de raíz del gestor del proyecto.
  • Es importante que seas un buen orador. Hablar en público no debe ser ningún problema. Si no es éste tu fuerte, existen técnicas para desarrollarlo.
  • Siempre debes mostrar seguridad. Si te muestras inseguro no conseguirás el adecuado respecto ni de los miembros del equipo ni de tus jefes o clientes. Es natural que sientas inseguridades, pero te las debes quedar para ti.
  • Desarrollar la capacidad de negociación se debe convertir en unos de tus principales objetivos. Convencer, persuadir, involucrar e integrar al personal será fundamental.
  • Al igual que en el caso del gurú técnico, es importante conseguir y mantener una buena red de relaciones profesionales. Herramientas como LinkedIn o Xing pueden ayudar mucho en esta tarea.

En definitiva, esta orientación profesional requiere de una preparación y experiencia previas más larga que la carrera puramente técnica, así como contar con una serie de aptitudes personales que si no son tu fuerte sí que puedes cultivar.

Y hasta aquí la mini-serie de artículos sobre orientación profesional del desarrollador de software. Espero haber servido de ayuda a los compañeros que empiezan o a los que se sienten un poco perdidos.

Mi carrera de desarrollador de software: el perfil de gurú técnico

Gurú técnicoEn mi anterior post hablaba sobre cómo enfocar la carrera de desarrollador de software en torno a dos vertientes: el gurú técnico o perfil vertical, y el gestor o perfil horizontal. Si te ves más identificado con el perfil vertical continúa leyendo pues a continuación pretendo desgranar las características, pros y contras de ejercer como gurú.

Ya has decidido tu opción profesional dentro de la carrera de desarrollador de software, y crees que encajas como un gurú técnico. Hay que reconocer que resulta ciertamente atractivo: algunos de estos gurús son incluso famosos, con gran cantidad de seguidores ¡casi parecen estrellas del rock o del celuloide!
Si es así tendrás una serie de características propias de dicho perfil que van a condicionar el desarrollo de tu carrera, y te van a aportar ciertas ventajas y desventajas en el mundo laboral. Pues bien, ¿qué tendrás que exigirte a ti mismo para llevar a buen término tu carrera? Veámoslo:

  • Necesitarás reciclarte continuamente, estar al día de las novedades y “en la cresta de la ola” de todo lo que acontezca relacionado con tu especialidad.
  • Será fundamental y completamente necesario mantener un blog donde puedas dar fe de tus aptitudes, a modo de escaparate de tus capacidades. Tienes que venderte y ¿qué mejor que un escaparate para vender los artículos de tu tienda?
  • Además del blog, te será mucho más que conveniente participar activamente en portales, foros, etc. relacionados con tu especialidad. Debes darte a conocer.
  • Deberás dedicar regularmente parte de tu tiempo a “moverte por el mundillo” para  conseguir y mantener una red de contactos profesionales. Asiste a encuentros, charlas, conferencias, etc.

Si esto es lo tuyo, seguramente te sientas cómodo y feliz, pero deberás estar atento y alerta a una serie de peligros derivados de la esclavitud tecnológica. Ser un experto en una tecnología implica dedicar grandes esfuerzos a ella, y prácticamente el 100% de tu tiempo o casi. Esto tiene consecuencias:

  • Tu perfil puede quedarse flojo en otros ámbitos, y puedes tener dificultad para sacar adelante trabajos diferentes a los que estás habituado. Esto sin duda puede cerrarte alguna puerta o restarte libertad de actuación.
  • Tendrás una dependencia o bien de un proveedor o fabricante, o bien de modas. Puede que tu rama sea muy demandada y un día de repente puede dejar de serlo, o dejar de ser una vertiente estratégica para el fabricante.
  • A largo plazo puede que algún día te aburras de trabajar siempre con el mismo tema y lo que un día fue tu pasión se puede convertir en tu hastío.

Como defensa de estos peligros lo mejor será saber cuándo es el momento de cambiar de rumbo o especialidad y estar atento a los movimientos y tendencias del mercado para pivotar a tiempo. Siempre será mejor un pequeño viraje en la dirección correcta que un contraproducente empecinamiento hacia el lugar equivocado.

Como conclusión, trabajar en lo que te gusta es un lujo del que no mucha gente puede disponer, pero como todo, no hay nada perfecto y siempre debemos estar alerta a lo que ocurre a nuestro alrededor. Las ventajas están claras. ¿Se te ocurren otros peligros y formas de defensa? Si es así, agradezco tus comentarios.

Mi carrera de desarrollador de software: ¿hacia dónde la enfoco?

Futuro profesionalEn la evolución profesional de todo desarrollador de software se presentan múltiples disyuntivas; ya incluso antes de poder considerarse como tal, una primera duda podría ser orientar la carrera a técnico de sistemas o a desarrollo de software, y una vez elegido el camino del soft se siguen encadenando múltiples decisiones a tomar y posibles caminos a seguir. Hurguemos en la especialización: ¿hacia dónde enfoco mi desarrollo profesional, me convierto en un gurú de una tecnología (especialización vertical) o en un profesional multidisciplinar (especialización horizontal)?

Esta pregunta se la debe haber planteado todo profesional del desarrollo de software con una mínima conciencia de sí mismo y de su situación, y como en todo, no existe una respuesta única y válida para todo el mundo. Si estás empezando o llevas poco tiempo en este mundillo, o simplemente te encuentras un poco perdido, puedo plantearte una serie de preguntas de fácil respuesta que te servirán para orientarte.

Antes de continuar, dejar claro que nada de lo que pueda decir a continuación es 100% tajante y/o cierto para todos los casos, aunque sí puede ser una buena aproximación.

  • Pregunta 1: ¿tienes claro cuál es tu objetivo profesional?

Esto es fundamental. Si no tienes esto claro, lo único que te quedará es navegar en un mar revuelto a donde te lleve el viento, que con suerte puede ser un buen destino o el peor de ellos. Si es éste tu caso, ya va siendo hora de que cojas las riendas de tu carrera y la dirijas a ese punto que te interesa, sin que nada te distraiga de ello.

Básicamente existen 2 posibles evoluciones profesionales para un desarrollador que están íntimamente ligadas a tu objetivo: la vertiente técnica y la de gestión.

Si tu objetivo es ser un gran técnico, especialízate en una tecnología en particular, conviértete en el gurú de esa tecnología y siempre intenta evitar distracciones de otras tecnologías.

Si quieres ser un buen gestor y/o terminar montando tu propia empresa, intenta tocar todos los palos, cuantos más mejor, pero no profundices demasiado. De esta forma conseguirás una visión global que te permitirá gestionar más eficientemente equipos con miembros especializados en diferentes tecnologías.

  • Pregunta 2: ¿eres un apasionado de la informática y tecnología o estás aquí porque es una buena salida profesional?

Para muchos el desarrollo de software es algo más que su trabajo, es su hobby, su pasión. Disfrutan trabajando. Si es éste tu caso te interesará más especializarte en una tecnología, la que más te apasione, pues si terminas haciendo gestión dejarás de disfrutar trabajando. Además, si imprimes tu pasión en lo que haces conseguirás grandes logros.

Si elegiste la informática por sus perspectivas profesionales no pierdas el tiempo convirtiéndote en el gurú técnico que realmente no quieres ser. Opta por una especialización horizontal.

  • Pregunta 3: ¿prefieres interactuar con máquinas o con personas?

A lo largo del día tenemos que interactuar tanto con máquinas como con personas: el ordenador o el teléfono, y tus compañeros o el conductor del autobús. Sin embargo, a largo plazo, para dedicar horas, debes saber cuál es tu preferencia.

Si te gusta más la interacción con la máquina te conviene más optar por especializarte en una vertiente técnica.

Un gestor sin embargo necesitará dedicar más tiempo a tratar con personas. Si es éste tu caso, opta por una especialización horizontal.

  • Pregunta 4: ¿tienes las aptitudes necesarias para ser un buen técnico o un buen gestor?

Es importante considerar esto porque no todo el mundo dispone de los “skills” necesarios para cualquier cosa. Yo mismo desde muy temprana edad ya sabía que no podría ser un gran deportista.

Un buen técnico debe tener capacidad de abstracción, una mentalidad analítica y pragmática, y saber enfocarse a la resolución de problemas. Además debe estar dispuesto a reciclar sus conocimientos constante y rápidamente ya que la tecnología evoluciona a una velocidad vertiginosa. ¿Encajas tú aquí? Si es así, elige una tecnología y céntrate en ella.

Un buen gestor debe ser ordenado y metódico o de lo contrario trasmitirá el caos a su equipo, debe tener capacidad de planificación, que sepa ver el bosque en lugar de los árboles, disponer de buenas aptitudes comunicativas, ser capaz de transmitir y tener carisma de líder. Si te ves mejor aquí, no dediques tiempo a convertirte en gurú de una tecnología en concreto.

Aunque no sea lo más habitual, es posible que te guste la tecnología y el trato con personas al mismo tiempo, y es posible que tengas aptitudes como buen técnico y como buen gestor. En este caso mi recomendación sería elegir basándote en qué opción encaja más en tu estilo de vida. Aquí ya entraríamos en aspectos más personales en los que no pretendo entrar. Lo que sí te recomiendo si fuera este tu caso es que no te quedes en tierra de nadie pues difícilmente podrás llegar a ser un gran gestor y un gran técnico al mismo tiempo.

Bien, si ya tienes claro cuál es tu objetivo, ponte manos a la obra. Hazte un plan de carrera y no dejes que los demás lo hagan por ti, ni te dejes llevar por las corrientes azarosas. Establece hitos, metas, metas volantes, y ve a por ello bien focalizado, sin que nada te desvíe. ¡Ah! ¡Y suerte!

Seguramente se quede en el tintero alguna cuestión más que debería ser planteada. Si así lo crees, te invito a que lo hagas constar en un comentario.

¿Por qué NO voy a utilizar Google Keep?

No-keep-Google-Keep

Justo después de anunciar el cierre de Reader, la todopoderosa Google presenta una nueva herramienta en forma de SaaS: Google Keep. Yo lo tengo claro. Yo tengo claro que no voy a usarla, y también tengo claro que algo ha cambiado en Google. Señores: torres más grandes han caído.

¿Y qué es Google Keep? No es más que una muy muy simple aplicación para gestionar notas, algo así como la versión electrónica de los clásicos Post-it! Lo primero que llama la atención es esa simplicidad extrema: ¿cuestiones de Time To Market o es más bien seguir fieles al estilo y estética que tanto éxito ha dado a la compañía? Pues tras hacer unas primeras pruebas, me inclino más por pensar que se trata de la primera motivación. De hecho opino que el producto no está minimamente maduro, y tengo mis fundamentos:

  • Al crear mi primera nota veo que existe la posibilidad de incluir imágenes. Lo único que se puede hacer es subir imágenes desde tu equipo, no es posible incluir imágenes desde un enlace. Pero por si esto fuera poco, la subida de imágenes no me funciona y me muestra un error invitándome a intentarlo más tarde.

Error al subir imagen

  • No veo por ninguna parte ninguna forma de relacionarse con otras aplicaciones, no tiene ninguna faceta social, y ni mucho menos una forma de exportar la información. Para mi son muy importantes todos estos aspectos, en la línea de lo que comentaba en mi anterior post. Si usas Google Keep estás aislado completamente. Sólo esto ya es motivo más que suficiente como para no usar esta herramienta sin vacilar.
  • Teniendo en cuenta que la herramienta está totalmente aislada, ¿qué ocurriría si de repente Google decide que ya no es una herramienta estratégica o rentable para la compañía? Mejor no pensarlo.
  • Intento destacar un texto en negrita… ¡imposible! No me lo permite, no tengo la opción. Sólo puedo usar texto plano tal cual. Casi que para eso prefiero usar un editor de textos de toda la vida.

En definitiva son razones más que de sobra, y más que de peso, para fundamentar mi idea de no usar Google Keep de ninguna manera, pero es más, empiezo a plantearme dejar de usar muchos más servicios de la compañía. Debo admitir que hasta el momento he sido todo un fan de Google y fiel usuario pero a día de hoy me lo estoy planteando y mucho:

  • En su día dejé Firefox para usar Chrome y últimamente me está dando problemas preocupantes. Se han empeñado en incluir su reproductor PepperFlash que no hace más que dar problemas y no funciona correctamente. Y lo peor de todo, si lo deshabilitas en favor del reproductor Flash de Adobe (que sí funciona como debe ser) al poco tiempo se vuelve a habilitar él solito. La vuelta a Firefox parece ser el mejor movimiento.
  • Drive me pareció una buena opción en su día hasta que he empezado a usarlo más intensivamente. Bastante a menudo me salta con errores que sólo dejan como opción cerrar la aplicación. Desde luego que Drive no puede ser mi herramienta de almacenamiento cloud de uso prioritario.

En definitiva, Google ya no es diferente, o sí lo es pero en el mal sentido. Ya no es innovadora ni ágil como lo fue en el pasado. Ha perdido el espíritu que la hizo grande. Sus nuevos servicios suelen ser copias de baja calidad de servicios ya existentes y además llenas de errores (da la sensación de estar siempre en fase beta). Constantemente dejan en la cuneta a sus usuarios, y no sólo por lo ocurrido con Reader (aparte de que han cerrado muchos más servicios, pregunto ¿qué fue de GWT?). Intento buscar alguna razón para usar Keep pero vaya, es que no encuentro ni una sola. Me reitero en lo dicho anteriormente, “señores, torres más grandes han caído“. Bienvenidos a la etapa oscura de Google.

El problema de la volatilidad de servicios en la nube: cómo conseguir la independencia

Cloud ComputingEl cierre de Google Reader ha sacado a flote de nuevo los miedos por la incertidumbre que nos crea la discontinuidad de una herramienta o servicio que estamos habituados a usar. Adaptas tus costumbres, tanto personales como profesionales, a una forma de trabajar durante mucho tiempo y de repente desaparece la herramienta. Igualmente ocurre con cualquier servicio en la nube, tanto PaaS, como SaaS o IaaS.  ¿Cómo te defiendes ante esto?

La clave para tu defensa está en establecer como prioridad máxima, dentro de tus factores de decisión, la futura independencia del proveedor. Para ello tienes que evaluar los siguientes aspectos:

  • Exportación y/o backup de datos en formato estándar: que tu información se encuentre guardada o bien la puedas recuperar en un formato 100% portable entre diferentes sistemas es fundamental. Es la única forma de asegurarte de que podrás explotar tus datos usando cualquier servicio. El rey indiscutible como estándar en este terreno es XML aunque existen alternativas a tener en cuenta como JSON, YAML, etc. y otros formatos según el tipo de archivo y/o dato que estemos utilizando.
    Como ejemplo, para el caso de Google Reader es posible realizar una exportación a un fichero OPML con la herramienta Google Takeout, que exporta en formato XML y JSON.
    También como ejemplo, en el servicio SaaS Google Docs existe la posibilidad de exportar la información en formato de Microsoft Office y OpenOffice entre otros. De no existir esta posibilidad seríamos esclavos del servicio.
  • Inter-compatibilidad entre servicios: siempre, en la medida de lo posible, será fundamental que elijas un proveedor cuyo servicio (protocolos, APIs, lenguajes soportados…) sea compatible con las ofertas de la competencia. De esta forma podrás cambiar de proveedor y por ejemplo migrar tus aplicaciones en cualquier momento y sin dificultad. En este sentido es importante, desde el punto de vista de desarrollo de software, usar siempre en tus desarrollos tecnologías estándar:
    • Desarrolla en Java, tendrás más puertas abiertas y menos limitaciones. Es el lenguaje más soportado en la nube. Como ejemplo, si desarrollas en PHP (soportado en Amazon EC2) no podrás portar tu aplicación a Google App Engine.
    • Utiliza APIs estándar, e intenta evitar en la medida de lo posible APIs propietarias de la plataforma, o te encontrarás con un problema. Como ejemplo, no es recomendable usar como método de autenticación cuentas de Google y su correspondiente API si estás usando Google App Engine. Mucho mejor será basarse en estándares como OpenID y OAuth.
  • Trata de no colocar todos tus huevos en la misma cesta: tu ubicuidad siempre será una ventaja para ti. Si usas varios proveedores al mismo tiempo estarás más preparado ante discontinuidades del servicio y serás más ágil a la hora de moverte y migrar de un sitio a otro si tienes problemas con un proveedor.Huevos en distintas cestas
    • Como ejemplo, en mi caso, para almacenamiento en la nube uso DropBox, Google Drive y SkyDrive al mismo tiempo. Puedo repartir y/o clonar mis datos entre ellos consiguiendo evidentes ventajas ante la posible discontinuidad o incluso caída del servicio de cualquiera de estos proveedores.
    • En cuanto a desarrollo de aplicaciones, la mejor forma de conseguir esto es usar la filosofía SOA en todo lo que hagas. Podrás mover servicios de un lugar a otro en la nube y conseguirás gran independencia, flexibilidad y escalabilidad. Aún más notable será la escalabilidad y eficiencia si optamos por un modelo REST en lugar de SOAP, siempre que las necesidades lo permitan.

Si tienes en cuenta estos aspectos, gracias al cloud computing podrás llegar a tocar el cielo de la independencia pues conseguirás entre otras ventajas:

  • Independencia de equipos dedicados: los problemas de CPU, memoria RAM, discos, etc. pasarán a la historia. Estos recursos te los proveerá dinámicamente la nube, aportando gran flexibilidad y escalabilidad.
  • Independencia en la supervisión: ya no será necesario estar pendiente de que tus servicios y aplicaciones estén funcionando correctamente. Tu proveedor se encargará de esto.
  • Independencia económica: ya no es necesario hacer grandes esfuerzos en inversiones iniciales para equipos que no sabemos bien cómo dimensionar.

Como conclusión, si partimos de la premisa de que el futuro está en la nube, para que la nube tenga futuro debe basar su desarrollo en estándares adoptados por toda la industria. Es muy sencillo: simplemente debe aprender de errores del pasado, como los cometidos por Internet Explorer. Todo lo que se salga de ahí, tanto por parte de los proveedores como de los consumidores, será como ponerse palos en las ruedas.

Integración de aplicaciones: creación de una correspondencia semántica de códigos mediante Excel

cabeceraUna tarea ineludible cuando integramos varias aplicaciones es la creación de diccionarios de códigos de forma que se pueda traducir la información, con diferentes códigos pero la misma semántica, entre sí. Un ejemplo típico podría ser el sexo: mientras una aplicación usa ‘H’ para identificar al varón, otra aplicación puede usar ‘V’. En este ejemplo es poco problemático construir una correspondencia semántica entre códigos, pero si tenemos que construir, por ejemplo, una correspondencia entre códigos de varios cientos de ciudades nos encontramos ante un problema.

Existen diversas herramientas avanzadas para solventar estos problemas, pero dentro de un desarrollo de recursos limitados (esto seguro que le suena a mucha gente) donde el uso de estas herramientas pueda resultar como matar moscas a cañonazos, resulta incuestionable la utilidad de las hojas de cálculo.

Vamos a partir de un ejemplo muy común y veremos la solución usando Excel. Supongamos que tenemos dos listados de provincias españolas. En uno de ellos las tenemos identificadas numéricamente según códigos postales; a esta hoja la llamaremos “CP”. En el otro listado, las provincias están identificadas con códigos no numéricos del ministerio de interior; a esta hoja la llamaremos “MI”. Finalmente queremos conseguir hacer la correspondencia y obtener algo como esto, que luego podríamos guardar en una tabla de nuestra aplicación o donde y de la forma que más nos convenga; a esta tercera hoja la podemos llamar “Resultado”.

La hoja de cálculo de partida sería la siguiente: HojaProvincias_Inicial

Al inspeccionar la hoja nos encontramos con los primeros típicos problemas:

  1. En un caso las provincias vienen con la primera letra mayúscula y en otro caso todo en mayúsculas.
  2. En un caso vienen incluídas las tildes y en otro no.
  3. La descripción no siempre coincide del todo.

El primer paso para solucionar estos problemas consiste en normalizar los literales. Lo pasaremos todo a mayúsculas, sin tildes o acentos y sin espacios sobrantes. Para el paso a mayúsculas la solución es sencilla, aplicar la fórmula MAYUSC de Excel. Después necesitamos eliminar las tildes. Existen varias formas de solventar este problema. La más simple, aplicando la siguiente fórmula nos quitamos los dos primeros problemas de un plumazo:

=ESPACIOS(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(MAYUSC([celda]);"Á";"A");"É";"E");"Í";"I");"Ó";"O");"Ú";"U"))

Sustituyendo [celda] por la referencia a la celda que queremos transformar. En nuestro caso, con esto nos valdría como solución, pero en casos en los que tratemos con varios idiomas será necesaria una función más avanzada para hacer sustitución de tildes y otros caracteres. Una buena solución sería crear la siguiente función VBA en un módulo de nuestra hoja de cálculo:

Function SinAcentos(ByVal Celda As String) As String

Dim temp, strA$, strB$, i&, p&
strA = "áàäâãåçéèêëíìîïóòôöõð?úùûüýÿ?" & _
       "ÁÀÄÂÃÅÇÉÈÊËÍÌÎÏÓÒÔÖÕÐ?ÚÙÛÜÝ?? "
strB = "aaaaaaceeeeiiiioooooosuuuuyyz" & _
       "AAAAAACEEEEIIIIOOOOOOSUUUUYYZ"
temp = Celda

For i = 1 To Len(temp)
    p = InStr(strA, Mid(temp, i, 1))
    If p > 0 Then Mid(temp, i, 1) = Mid(strB, p, 1)
Next

SinAcentos = temp

End Function

Usando esta función podremos hacer cualquier transformación de un carácter por otro muy fácilmente, y aplicar la normalización en la columna C de cada hoja así:

=SinAcentos(ESPACIOS(MAYUSC([celda])))

La hoja Excel con las provincias normalizadas quedaria así: HojaProvincias_Normalizadas

Ahora que ya tenemos las descripciones de provincias normalizadas, nos queda el tercer problema para terminar por conseguir una solución: las descripciones no coinciden de forma exacta. Por ejemplo, tenemos “SANTA CRUZ DE TENERIFE” y “S. CRUZ DE TENERIFE”.

La primera solución que se puede venir a la cabeza es modificar a mano los registros que no coincidan. Para el ejemplo que tenemos, donde tratamos con alrededor de 50 registros puede ser la mejor opción, pero ¿lo haremos si disponemos de varios cientos o miles de registros? Para estos casos la solución ideal será aplicar el algoritmo de la distancia de Levenshtein. En la wikipedia se describe así:

En Teoría de la información y Ciencias de la Computación se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter.

Pues bien, implementamos en VBA el algoritmo de Levenshtein en nuestro módulo de Excel de la siguiente forma:

Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long

Dim i As Long, j As Long
Dim string1_long As Long
Dim string2_long As Long
Dim distancia() As Long

string1_long = Len(string1)
string2_long = Len(string2)
ReDim distancia(string1_long, string2_long)

For i = 0 To string1_long
    distancia(i, 0) = i
Next

For j = 0 To string2_long
    distancia(0, j) = j
Next

For i = 1 To string1_long
    For j = 1 To string2_long
        If Asc(Mid$(string1, i, 1)) = Asc(Mid$(string2, j, 1)) Then
            distancia(i, j) = distancia(i - 1, j - 1)
        Else
            distancia(i, j) = Application.WorksheetFunction.Min _
            (distancia(i - 1, j) + 1, _
             distancia(i, j - 1) + 1, _
             distancia(i - 1, j - 1) + 1)
        End If
    Next
Next

Levenshtein = distancia(string1_long, string2_long)

End Function

Después necesitaremos una función que saque partido de este algoritmo y nos busque los resultados deseados. En la hoja que habíamos denominado “Resultado” tendremos referenciados los códigos postales y descripciones de provincias de la hoja “CP”. Necesitamos, por cada una de estas provincias, buscar entre las provincias que se encuentren en la hoja “MI” y devolver el código de aquella cuyo mejor resultado dé el algoritmo de Levenshtein.

Para ello lo ideal sería crear una nueva función VBA en nuestro módulo Excel a la que pasamos como parámetros la provincia que vamos a buscar, el rango de búsqueda, y dentro del rango la columna donde buscaremos los valores a comparar y finalmente la columna donde se encuentra el código resultante a devolver. Esta función sería algo así:

Function Correspondencia(ByVal string1 As String, ByVal rango As Range, ByVal columnaABuscar As Integer, ByVal columnaADevolver As Integer) As String

Dim i As Long
Dim levDist As Long
Dim levTemp As Long
Dim result As String

levDist = Len(string1)
For i = 1 To rango.Rows.Count
    levTemp = Levenshtein(string1, rango.Cells.Item(i, columnaABuscar))
    If levTemp = 0 Then
        result = rango.Cells.Item(i, columnaADevolver)
        Exit For
    Else
        If levTemp < levDist Then
            levDist = levTemp
            result = rango.Cells.Item(i, columnaADevolver)
        End If
    End If
Next

Correspondencia = result

End Function

Aplicamos esta función en la hoja de resultado usando referencias absolutas para definir el rango de celdas donde buscar; por ejemplo, en la celda C2 de la hoja “Resultado” tendríamos:

=Correspondencia(B2;MI!$A$2:$C$53;3;1)

Y de esta forma conseguimos el resultado final, que se puede descargar aquí: HojaProvincias_Resultado

Para terminar el post, una cuantas observaciones/comentarios:

  • Para que todo esto funcione es necesario habilitar las macros en Excel y habilitar el editor de Visual Basic, dependiendo de la versión instalada.
  • Aplicar el algoritmo de Levenshtein es algo que sólo se puede hacer si existe tolerancia a errores, pues con él no siempre se consiguen los resultados esperados.
  • Otra opción a considerar además de Levenshtein es el algoritmo n-gram para la detección de secuencias. En algunos casos puede ser incluso más recomendable que Levenshtein. Sería una mejora “para nota” crear un algoritmo que combine a ambos. Una versión fácilmente adaptable a VBA del algoritmo n-gram se encuentra aquí.