Blog

Las diez claves de Angular 2+











Plantearse qué framework vamos a utilizar en nuestros proyectos no es cosa pequeña. Es una decisión crítica.


Las opciones disponibles son muchas, algunos dirían que demasiadas, y podemos vernos abocados a una especie de caza del tesoro entre una pléyade de herramientas que consume tiempo y recursos.


El presente artículo pretende exponer, a mi juicio, cuáles podrían ser los elementos a tener presentes en el caso de que estemos considerando darle una oportunidad a Angular 2+


No hay orden ni implícito ni explícito en los diez puntos que siguen. Se trata simplemente de una enumeración de características que son importantes, en mi opinión .


Espero que lo encontréis útil.


¿Cuáles son las claves de Angular 2+? 

1.- Soporte

Para emplear una herramienta y su ecosistema en proyectos reales, es esencial contar a medio plazo (al menos) tanto con su presencia en el mercado como con su actualización frecuente.


La herramienta en cuestión debe tener un timeline hasta el presente y una fuerte proyección hacia el futuro. 

Angular está soportado por Google, y se actualiza con una revisión más o menos mayor cada seis meses. Por ello, parece razonable plantearse su uso en nuestras aplicaciones Web


2.- Entorno

La calidad, potencia y sencillez de las herramientas de desarrollo empleadas por los programadores es fundamental.


Clave para no reinventar la rueda, clave para reducir los tiempos de puesta en producción y clave para automatizar todas aquellas tareas que no requieran lo que mejor sabemos hacer: pensar.


Angular está provisto de un “tooling” extremadamente potente, flexible y personalizable, basado en Node.js, npm, yarn, un generador de programas y algún editor que entienda la sintaxis y estructura de una aplicación Angular.


En relación con esto último, uno de los más empleados es el Visual Studio Code de… Microsoft (!!!). ¡Ojo! No es el Visual Studio, y sí, es gratis.


3.- TypeScript

Las frameworks modernas diseñadas para la creación de aplicaciones Web descansan cada vez con mayor fuerza en JavaScript (JS). 

Angular no es una excepción.


Sin embargo, no es sencillo crear una aplicación completa en JS, como a menudo sucede en los lenguajes llamados dinámicos, los cuales adolecen de un sistema de tipos fuerte (JS, Groovy, Clojure, etc.) y proporcionan a cambiouna extraordinaria flexibilidad y grado de interacción que puede ayudar a acortar considerablemente los tiempos de desarrollo

Además, en el caso de JS, hay que considerar que existen varias versiones, de manera que algunas características no están disponibles en todas ellas.


La solución de Angular gira alrededor de TypeScript, el cual exhibe todas las funcionalidades que esperamos en JS, aportando dos elementos esenciales: una implementación completa de la orientación a objetos clásica y un sistema de tipos fuerte. 

Además, el compilador de TypeScript produce como salida código JS estándar que cualquier navegador puede entender, con el valor añadido de que la versión de JS correspondiente al código generado por TypeScript la decidimos nosotros por configuración. 

Conceptualmente, el compilador es en realidad un transpilador

Por tanto, podemos olvidarnos de un viejo problema que todos los desarrolladores de JS conocen, y tal vez han sufrido: mi código JS no se ejecuta en todos los navegadores.


4.- Paso a producción

Crucial, como todos sabéis. 

Angular incorpora mecanismos automáticos de optimización que pueden describirse brevemente al menos en dos categorías:
a) Conseguir que lo que escribimos pese menos, ocupe menos memoria, mejorando los tiempos de carga de la aplicación en el navegador del usuario final
b) Examinar el código que hemos escrito y sus dependencias de librerías de terceros para tratar de eliminar todo aquello que no se use(Tree Shaking).


5.- Angular “fuera del navegador”

La respuesta de Angular al asunto de optimizaciones SEO (Search Engine
Optimization). Dicho de forma sencilla, facilitar que los indexadores encuentren nuestra web.


Para ello, nuestras páginas deben residir en el servidor, pero Angular por defecto lo lleva todo al cliente, con lo cual los indexadores se quedan en ayunas por completo. Malas noticias.


Así que Angular “fuera del navegador” proporciona un mecanismo razonablemente automático por el cual nuestras páginas también están presentes en el servidor.
Muy buenas noticias.


6.- Arquitectura
Angular está perfectamente engranado con una arquitectura muy precisa que podemos seguir de forma sistemática para crear aplicaciones. La noción clave es el módulo.

En un módulo guardamos otros elementos que conforman la aplicación, y podemos precargarlos o adquirirlos bajo demanda.


Además, Angular sigue una noción estándar en arquitectura lógica: la separación en capas.


Así, por ejemplo, los componentes son los encargados de gestionar la interfaz de usuario,y se comunican con los servicios, responsables de la lógica de negocio y el intercambio de datos con servidores remotos mediante un mecanismo implementado automáticamente con Angular: la inyección de dependencias.


7.- Intercambio de datos con otras aplicaciones

Angular es una solución completa para el lado cliente, esto es, no se ocupa de la implementación del lado servidor, pero sí resuelve la comunicación con el mismo.


Existen básicamente dos maneras de hacer esto, pero en ambas subyace la misma idea: un API que por debajo usa AJAX y funciona de forma asíncrona, de manera que las operaciones a través de la red (lentas) no bloqueen la interfaz de usuario, por ejemplo.


8.- Programación Reactiva

El software que fabricamos hoy cada vez está más profundamente imbricado con la concurrencia y el procesamiento paralelo

Una de la formas de hacer frente a esta realidad que está ganando cada vez más peso es la Programación Reactiva

En el caso de Angular, esto se materializa en el uso de algunos artefactos típicos de esta aproximación: las promesas, los observables y lo que podríamos llamar operadores de transformación funcional

A través de una biblioteca de apoyo,Angular nos permite diseñar según esta estrategia, e incluso unas cuantas de sus propias APIs (punto 7) nos entregan observables como resultado.


9.- Extender HTML

Hay muchas maneras de enriquecer una aplicación Web. Una de ellas, apoyado por Angular, es el uso extensivo de TypeScript (JavaScript)

El otro es la creación de artefactos que se comportan como extensiones del lenguaje HTML: etiquetas y atributos (las directivasde Angular). Algunos que también extienden el HTML necesitan de una sintaxis específica de Angular: los tubos (pipes)


10.- Aplicaciones de una sóla página

Una aplicación tradicional (en el buen sentido de la palabra) suele traerse las páginas Web necesarias del servidor remoto, bajo demanda, en función de la lógica de la propia aplicación y/o las acciones explícitas del usuario final. Esta estrategia tiene el potencial inconveniente de que hacemos esperar al usuario.


Angular opina que nuestro usuario debe esperar lo menos posible, y que la interfaz gráfica de una aplicación Angular debe estar viva, y responder instantáneamente a la lógica del programa y/o a lo que haga el usuario final.


Angular por defecto carga todas las páginas (convenientemente optimizadas) en el navegador y las va mostrando bajo demanda, pero sin descargarlas del servidor, con lo que el tiempo de espera disminuye espectacularmente.


Tenemos una aplicación de una sola página (SPA) y el mecanismo que usa Angular para conseguirlo es básicamente sus APIs de enrutamiento y navegación.


Conclusión

Si todo lo visto hasta aquí ha despertado tu interés por ANGULAR, te invitamos a que des un paso más y adquiera las competencias para desarrollar una aplicación con Angular desde cero.


Te proponemos una formación acorde a tu nivel de conocimientos:


- Angular 2+

- Angular Avanzado.


Tú eliges.

Un saludo.


José Mª Díaz Charcán

Consultor y formador en tecnologías






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