Blog

Café para todos

Desde hace unos meses (18 de Marzo de 2014), tenemos una nueva versión de la plataforma estándar de Java, JSE 8.0.

Nada que decir y nada que objetar.

¿Nada? Bueno, resulta que la gente de Sun MicroSystems en su día (Java 5.0)  y los chicos de Oracle en la actualidad están llevando a la práctica la (¿desagradable?, ¿cuestionable?, ¿inevitable?, ¿imprescindible?) costumbre de que las nuevas versiones incorporan novedades que ni siquiera compilan con versiones anteriores, funcionalidades bastante golosas para los desarrolladores, todo hay que decirlo.

Adiós a los “buenos viejos tiempos” de “tú escribe que yo lo compilo sin más”. Bien, podemos vivir con ello, siempre que el premio merezca la pena.

Estamos ante una revisión mayor del lenguaje, que parece iniciar un proceso irreversible de adaptación a los “buenos nuevos tiempos”. Por resumir, programación funcional y concurrencia fácil.

Java nunca ha sido un lenguaje funcional, sino parcialmente orientado a objetos (un 3 no tiene comportamiento asociado, no es un objeto, es, ¡horror de los horrores!, un dato), e imperativo más que declarativo.

Un lenguaje que implementa el paradigma funcional hasta sus últimas consecuencias, como Haskell, no tiene bucles (!) ni variables (!!!). En Haskell, un println se considera código impuro, por el amor de Dios. Cosas como las operaciones de entrada-salida nos avergüenzan, generan contextos mutables; ¡qué repelús!.

Se pretende trabajar tan solo con valores inmutables, mientras que Java hace exactamente lo contrario.

Sin embargo, Java tiene a su favor la portabilidad, una implantación impresionante en la industria, toneladas de software de código abierto para ayudar a hacer prácticamente cualquier cosa y una implementación más que buena de la orientación a objetos clásica.

Aún así, tenemos grandes novedades en Java 8.

Por ejemplo, ahora podemos introducir en interfaces métodos con código:


public interface EstoEsIncreible{

void hazAlgoDeUnaVez( Cosa usaEstoPeroYa);

default void cuéntameComoPasó(Logger log){

log(“Estoy en “ + this.getClass().getName());

}

}

Lo cual puede ser una ayuda considerable en la reutilización sin más de comportamiento común a un conjunto de clases. Nada de implementar N veces métodos como “cuéntameComoPasó”.

Tal vez lo más interesante, por prometedor, es la incursión de Java 8 en la programación funcional y en la concurrencia ad hoc.

Supongamos que tenemos una lista de empleados y queremos calcular la suma del salario bruto de aquéllos que tienen una antigüedad superior a 3 años:


List<Empleado> empleados = obtener de forma automágica todos los empleados...


Integer resultado = empleados.

stream().

filter(e -> e.getAntiguedad() > 3).

mapToInt(e -> e.getSalario()).sum();

Bueno, programación funcional en toda su gloria.Totalmente declarativa, sin decir en ningún momento más que lo queremos hacer, no cómo.

Aquí hay mucho que observar. El método stream() produce una especie de tubería (pipeline) que acumula operaciones sin ejecutarlas, hasta que se ve forzado a ello (método sum() ). Así que en lugar de generarse dos listas intermedias, para filter y mapToInt, no se usa más que una. Esto es también muy común en programación funcional, la llamada evaluación vaga (lazy evaluation).

Sigamos suponiendo. El ordenador que usamos tiene varios núcleos, y sabemos que nuestra operación de calcular el salario bruto podría hacerse en paralelo sin problemas, ganando presumiblemente en eficiencia.

¿Como hacemos?

¿Usamos threads a mano? Ni hablar. Menuda pesadilla.

¿Empleamos un Executor de JSE 1.5? Algo mejor, pero aún así, en cuanto a nivel de abstracción apenas hemos abandonado el suelo.

Java 8 propone la siguiente solución:

Integer resultado = empleados.

stream().parallel().

filter(e -> e.getAntiguedad() > 3).

mapToInt(e -> e.getSalario()).sum();

Mejor, mucho mejor. Basta incluir la llamada al método parallel() para que todas las operaciones se desarrollen en paralelo automáticamente.Ya veis, concurrencia a lo fácil.

Hay un libro gratuito, publicado en la Red, que se ha convertido lector a lector en una especie de leyenda. Por el tema, y sobre todo, por el ingenio y acierto con el que está escrito. Su título, traducido a nuestra lengua, podría ser “Aprenda Haskell por el bien de todos”.

¿Qué os parece? ¿Estamos más cerca con Java 8 de poder decir, con la cabeza muy alta, “Aprenda Java por el bien de todos”?

Saludos y hasta pronto.





El paradigma perdido

Llevamos mucho tiempo creando software. Hemos pasado por todo: sistemas estructurados, orientados a objetos, a aspectos, REST y unas cuantas tecnologías más.

Siempre hemos tenido un ánimo integrador, de sumar y crear sinergias más que de abandonar radicalmente algo que nos ha ayudado a sacar adelante muchos proyectos. Por ejemplo, el paradigma de la orientación a objetos es, en realidad, un superconjunto del estructurado.

Siempre hemos trabajado inmersos en algún paradigma, pero tal vez tengamos que reencontrarnos con uno que puede sernos muy útil.

Desde hace algún tiempo, nos enfrentamos a una situación completamente nueva: la explosión imparable de la conectividad, su ubicuidad. Internet, sus prestaciones y la cultura que se deriva de todo ello impregna nuestra sociedad a un ritmo imparable.

La gente está cambiando de hábitos en los procesos que tienen que ver con compartir información: personal, comercial, institucional, todos y cada uno de ellos. Los gobiernos también se han apuntado al carro.

Yo mismo escribo cada vez menos textos, ¡se los dicto a mi móvil!.

Adaptar nuestro negocio está en la mente de todos. Es muy sencillo: nuevos hábitos, nuevo software.

En Icono creemos que ese nuevo software podría ser reactivo o, si se quiere, proactivo. El motivo es también simple: abordar desde el principio, por diseño, las nuevas características que las aplicaciones de hoy demandan.

Se supone que las aplicaciones del siglo XXI deben ser capaces de desplegarse en cualquier dispositivo, desde teléfonos móviles y tabletas hasta estructuras de computación multinúcleo formadas por miles de servidores residentes en la nube. Deben ofrecer tiempos de respuestas de milisegundos, una disponibilidad de 24x7 y ser capaces de manejar millones de usuarios y petabytes de información.

Todo esto puede hacerse con los paradigmas actuales, pero aplicándoles parches (en el buen sentido). No se crearon para navegar por esas aguas.

Los sistemas reactivos y el paradigma de la programación funcional, sí.

Conceptualmente, un sistema reactivo exhibe las siguientes características:

  1. Dirigido por eventos (Event Driven)

  2. Escalable (Scalable)

  3. Tolerante a fallos (Resilient)

  4. De respuesta rápida (Responsive)


1.- Dirigido por eventos significa que los módulos de un sistema no se ven directamente entre sí (acoplamiento débil), con lo que la mantenibilidad crece y su coste disminuye. Cuando programamos un sistema interactivo, sabemos lo que el usuario va a hacer, pero no cuándo va a hacerlo. Los sistemas dirigidos por eventos cubren precisamente ese escenario, simplificando la programación e incidiendo en unos cuantos costes (para bien, claro).

2.- Escalable implica no sólo que un sistema sea capaz de crecer vertical y horizontalmente, sino que lo haga cuando se vea obligado a ello, y que esa decisión la tome el software de infraestructura y no nosotros, aunque naturalmente tengamos la última palabra. Se trata de optimizar el uso de recursos por razones obvias.

3.- Tolerante a fallos en este contexto quiere decir que ante un error, al sistema se le permite fallar, pero la arquitectura establecida pasa el problema a otro componente que sabe solucionarlo. Esto es, cada componente, si se desea, está supervisado. Con las herramientas adecuadas, esta organización compleja se articula a sí misma una vez configurada, más que programada.

4.- De respuesta rápida implica tiempo real. Cosas que ya estamos habituados a ver y usar, como por ejemplo editar simultáneamente entre varias personas un documento en, bien, tiempo real. Google Docs lo hace gratis (o así lo vende). No hay que olvidar que a los usuarios les gusta este tipo de cosas, las usan y fácilmente pueden echarlas en falta.

Estos cuatro puntos, tomados aisladamente, no son nuevos. Pero si los unificamos en un paradigma y creamos herramientas que lo implementen tendremos sistemas reactivos sin ningún esfuerzo especial, sin añadidos de última hora, por diseño desde el principio, de la misma forma que un sistema basado en Java (por ejemplo) es orientado a objetos de forma natural.

Estas herramientas ya existen y el paradigma que las hizo nacer también.

En Icono creemos que es el momento de reencontrarnos con la programación funcional, el paradigma perdido, para crear el software que nuestros clientes quieren tener, porque sus usuarios se lo demandan.




Responsabilidad social vs emprendimiento y empleabilidad

La responsabilidad social de una compañía no solamente se basa en las pautas teóricas que plasman en los diferentes documentos corporativos. 
La responsabilidad ante la sociedad ha de estar impregnada en el propio ADN de la compañía, aplicando sin esfuerzo añadido las diferentes acciones que facilitan el trabajo y la integración de todo el ámbito empresarial y social de la compañía. Trabajadores, socios partners, clientes, proveedores... Se han de sentir cómodos e integrados en la relación diaria con la empresa. 
Los directivos de las compañías debemos de desarrollar los mecanismos necesarios para la plena integración de los trabajadores actuales y potenciales, aplicarlos sin estridencias ni agravios pero rompiendo con las normas rígidas y encorsetadas que difícilmente sacan lo mejor de los actores de la vida Social.

Icono, desde su creación y dado que en la misma confluyen Personas cuya visión es la del individuo como elemento dinamizador y generador de oportunidades en el ámbito empresarial, apuesta por programas concretos que generen valor para la Sociedad en su conjunto. 
Programas de Emprendimiento y Empleabilidad basados en el conocimiento, habilidades y flexibilidad para la entrega de los mismos. 

Como ejemplo de ello participamos de forma activa en un programa de emprendimiento poniendo a disposición de todas aquellas personas que tienen la iniciativa de emprender basándose en una idea. En Icono, nos comprometemos con estos potenciales emprendedores para ayudarles a definir su plan de negocio basado en el uso eficiente de las tecnologías, en dos líneas de actuación reducción de costes y flexibilidad para la mejor integración de profesionales.
Participamos también en programas de compromiso de contratación que tienen por objetivo acercar a las personas que a pesar de su formación se ven alejadas del mundo laboral, nuestra aportación además de transmitirles conocimientos técnicos consiste en potenciar su autoestima, destapar sus habilidades y hacerles sentir útiles y necesarios para el empleo.
Estos programas se concretan en una formación y asesoramiento diario que les permite a las personas asistentes absorber el conocimiento y la experiencia de profesionales senior de gran responsabilidad con la Sociedad.



Visita nuestro perfil:


Icono Training Consulting