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.

Hello world!

hello_worldCuriosamente justo al crear un nuevo blog en WordPress.com la primera entrada que sugiere automáticamente se titula “Hello World!”.  Y digo yo: ¿qué mejor título que éste para un primer post en un blog sobre desarrollo de software (aunque aparezcan 2 posts anteriores, éste se puede considerar el primer post ya que los otros 2 son rescatados de un antiguo blog)?

Pues bien, hurgando en el baúl de los recuerdos, se me antoja un agradable ejercicio de nostalgia hacer un repaso sobre los “Hello World!” que he visto y experimentado en mis propias carnes desde que empecé en el mundo de la programación allá por el año…

1986: el primer ordenador que tuve en mis manos fue un Commodore Vic20. El primero que fue mío, un MSX de Sanyo. Ambos arrancaban con un intérprete de Basic:

10 print "Hello World!"

¡Qué sencillo era programar! Dediqué incontables horas a picar los listados de programas que publicaban en revistas de la época. Después los guardaba en cintas de cassette y los ejecutaba con un “RUN”.

¡Qué tiempos! Mis amigos tenían Spectrum 48K, Commodore 64K, Amstrad CPC464… y yo un MSX de 64K con monitor de fósforo verde!

1988: este año empecé con el ensamblador del Z-80. El Basic se me quedó lento y quería sacar el máximo rendimiento a la máquina. Ahora soy incapaz de escribir de memoria un “Hello World!” en ensamblador pero buscando en la web pude encontrar algo:

 EQU CR    = #0D          ; carriage return
 EQU PROUT = #xxxx        ; character output routine
 ;
         LD  HL,MSG       ; Point to message
 ;
 PRLOOP  LD  A,(HL)       ; read byte from message
         AND A            ; set zero flag from byte read
         RET Z            ; end of text if zero
         JSR PROUT        ; output char
         INC HL           ; point to next char
         JR  PRLOOP       ; repeat
 ;
 MSG     DB  "Hello world!",CR,00
 ;

¡Qué recuerdos! Básicamente lo que hace es guardar un puntero al mensaje en el registro HL y luego va cargando uno a uno los caracteres a imprimir en el acumulador y los va imprimiendo hasta encontrar un cero, momento en el que el programa termina y retorna.

1990: en este año conseguí ser el propietario de un flamante ordenador PC con procesador Intel 80386. ¡Guau! El MSX quedaba atrás y empezaba con palabras mayores. Así, con un buen manual y esa máquina, pude aprender MS-DOS:

echo Hello world!

1992: en octubre de este año ingresé en la universidad para estudiar informática. En el primer curso aprendimos Pascal. Para mi fue una grata sorpresa aprender este lenguaje, teniendo en cuenta que sólo conocía el Basic y el ensamblador Z-80; aquello de la programación estructurada resultaba genial:

program HelloWorld;
begin
  WriteLn('Hello World!')
end.

1993: ya en el segundo año en la universidad aprendimos C. Me pareció aún más interesante que Pascal. Aún podía usar técnicas de programación estructurada pero con accesos de bajo nivel que me recordaban el potencial del ensamblador:

#include <stdio.h>
int main(int argc, char *argv[])
{
 printf("Hello world!\n");
}

Varios dolores de cabeza tuve con punteros perdidos, memorias no liberadas…

1994: el tercer año en la universidad aprendimos bastante sobre bases de datos, y esto me dio la oportunidad de conocer SQLPL/SQL:

SET SERVEROUTPUT ON;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello world!');
END;

1995: ya en cuarto curso, gracias a la asignatura de Inteligencia Artificial, pude conocer nuevos lenguajes. Primero fue LISP (menudo lío de paréntesis):

(princ "Hello world!")

y después vino Prolog:

main :- write('Hello world!'), nl.

También fue ese año cuando conocí lo que para mi era un nuevo e interesantísimo concepto, la programación orientada a objetos, y fue con Smalltalk y la torre de Hanoi:

Transcript show: 'Hello world!'.

1996: este año conocí el CGI scripting con Perl. Aquello sí que me maravilló ¡era posible construir páginas web con contenido dinámico!

print "Hello World!\n";

1997: un curso de verano en la universidad me hizo descubrir Javascript. De nuevo estaba maravillado: las páginas web podían ser dinámicas gracias a los scripts CGI y además era posible ejecutar código en cliente!

document.write('Hello world!');

Luego ya vendrían los problemas de compatibilidad entre navegadores etc. pero eso ya es otra guerra… por entonces usábamos el timón de Netscape.

1999: andaba este año buscando mi primer empleo como programador, y una empresa me dio la oportunidad de aprender primero Visual Basic:

MsgBox "Hello, world!"

He de reconocer que me gustó. El lenguaje no era extraño para mi y me daba nuevas e interesantes posibilidades.
A continuación topé con Java por primera vez:

public class HelloWorld {
   public static void main(String[] args) {
       System.out.println("Hello world!");
   }
}

Java me recordaba mucho a C y me enamoró en seguida (y aún lo estoy): escribía un código que funcionaba en todas las plataformas, con programación a la vez estructurada y orientada a objetos, y sin los problemas y dolores de cabeza que ocasionaba C. ¡Eran todo ventajas!

2003: en esta ocasión se me ocurrió desarrollar un proyecto personal, una página web, dinámica por supuesto. Sopesé las opciones que se me planteaban y finalmente decidí que la herramienta ideal para este desarrollo era PHP:

<!--?php print 'Hello world' ?-->

Se me antojaba un extraño potaje entre HTML y programación y de primeras no me terminó de convencer. Aún así, como es habitual en mi, una nueva herramienta, un nuevo reto y un nuevo aprendizaje eran una motivación añadida.

2006: en este año tenía entre manos el desarrollo de una intranet corporativa y Microsoft Sharepoint 2003 resultó ser una gran herramienta para ello, motivo por el cual tuve mi primer contacto con C#, que luego continué con otros proyectos personales:

using System;
class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello world!");
    }
}

Seguramente se me haya quedado algún lenguaje o herramienta por el camino. ¿Por dónde continuar? Pues por ejemplo por Python, Groovy, Objective-C, Ruby, …

Como reflexión, vistos todos estos años con la perspectiva de la experiencia acumulada, el que se ha mantenido ahí siempre y sigo usando a día de hoy es Java, y aún no está muerto en absoluto. Si bien está claro que no es el lenguaje ideal para todo (de hecho no existe tal lenguaje) sí ha quedado claro su gran potencial y que ha sabido evolucionar con el paso de los años sin quedar obsoleto.

Midlet Tetris v0.2

Siguiendo con mi querido Tetris, le he hecho una pequeña ampliación, muy solicitada por mis amigos más jugones.
Se trata de que al pulsar la tecla “abajo”, en lugar de acelerar la caída de la pieza, ésta cae directamente.
Para ello, sólo tuve que crear un nuevo método, “caer”, en la clase abstracta AbstractPieza.
La idea es muy simple, como se puede ver en el código:

	synchronized public void caer(int colorFondo, Graphics g) {
		// Guardar las coordenadas originales
		int antX = this.getPosX();
		int antY = this.getPosY();
		// Hacer caer la pieza
		while (isMovibleAbajo())
			setPosY(getPosY() + 1);
		// Repintar
		borrar(Recursos.ANCHO_LADRILLO, Recursos.ANCHO_LADRILLO, antX, antY,
				colorFondo, g);
		pintar(Recursos.ANCHO_LADRILLO, Recursos.ANCHO_LADRILLO, g);
		cont.pantalla.repaint();
	}

Al igual que en la versión anterior, aún quedan muchas cosas por hacer, como un sistema de puntos, diferentes pantallas o niveles, música, etc.
Pretende ser 100% compatible con cualquier dispositivo que implemente J2ME MIDP 1.0.
Lo que os podeis encontrar en la descarga es el código fuente completo, y los archivos .jad y .jar correspondientes y “obfuscados”.
Me gustaría colocar los .jad y .jar en un servidor que tuviera correctamente configurados los tipos MIME para hacer la descarga del videojuego directamente al móvil via OTA, pero no conozco ninguno de esas características que sea gratuito. Si conoceis alguno, por favor, hacédmelo saber.

Para los novatos sobre el tema, decir que si quereis instalar el videojuego en vuestro teléfono, lo que tendreis que hacer es pasar el archivo Tetris v0.2.jar a vuestro móvil a través de Bluetooth, infrarojos o cable de conexión al PC; y si lo que quereis es destripar el código fuente y jugar con él, como mínimo vais a necesitar el J2ME Wireless Toolkit de Sun.

Para descargar pinchar aquí

Midlet Tetris versión 0.1: código fuente

Hace algo así como un año, hice un midlet que se trataba de una implementación libre del clásico y archiconocido videojuego Tetris.
Tras pensarlo un poco, he decidido publicar el código en internet bajo licencia de código abierto. Aún quedarían muchas cosas por hacer, como un sistema de puntos, diferentes pantallas o niveles, música, etc., pero con calma, todo se andará.
Pretende ser 100% compatible con cualquier dispositivo que implemente J2ME.
Lo que os podeis encontrar en la descarga es el código fuente completo, y los archivos .jad y .jar correspondientes y “obfuscados”.
Me gustaría colocar los .jad y .jar en un servidor que tuviera correctamente configurados los tipos MIME para hacer la descarga del videojuego directamente al móvil via OTA, pero no conozco ninguno de esas características que sea gratuito. Si conoceis alguno, por favor, hacédmelo saber.

Para los novatos sobre el tema, decir que si quereis instalar el videojuego en vuestro teléfono, lo que tendreis que hacer es pasar el archivo Tetris.jar a vuestro móvil a través de Bluetooth, infrarojos o cable de conexión al PC; y si lo que quereis es destripar el código fuente y jugar con él, como mínimo vais a necesitar el J2ME Wireless Toolkit de Sun.

Para descargar pinchar aquí (sólo disponible la versión 0.2)