Páginas

martes, 22 de marzo de 2022

Para qué sirve Kubernetes: un ejemplo

Para qué sirve Kubernetes.

El despliegue de aplicaciones está evolucionando para facilitar a los ingenieros del software la tarea. Parece una contradicción que los ingenieros no dispongan de los mejores productos software para suministrarles ayuda en su trabajo, pero haciendo honor al dicho “en casa de herrero, cuchillo de palo”.

En los orígenes, no hace demasiado tiempo, las aplicaciones eran monolíticas e incluían grandes áreas de funcionalidad. En estos momentos el despliegue era algo manual que no comportaba la misma problemática que actualmente, puesto que el despliegue de un sistema no interfería con otros. Cada sistema era estanco y auto-contenido y las dependencias entre sistemas eran mínimas.

Con el advenimiento del micro-servicio las cosas han cambiado. Ahora los sistemas no son obligatoriamente monolíticos, hay otras opciones. Un sistema se puede construir en numerosas pequeñas partes que tienen que colaborar para suministrar la funcionalidad completa. Esta forma de desarrollar sistemas contribuye a que los desarrolladores puedan ser más efectivos a la hora de incorporar nuevas funcionalidades a los programas y también para llevar a cabo su mantenimiento tanto de eliminación de errores como de incorporación de mejoras. No es aceptable hoy en día que un cambio en una aplicación sea largo y tedioso, las organizaciones necesitan que sus sistemas evolucionen al mismo ritmo que suceden los acontecimientos.

En este escenario, el despliegue de sistemas es el despliegue de sus pequeñas partes. Esas partes tienen que trabajar de forma orquestada como un equipo en el que cada parte hace lo que se espera de ella y de forma coordinada con el resto de las partes.

Entonces surge un problema que antes no existía, orquestar adecuadamente todas las partes o micro-servicios. Los micro-servicios tienen dependencias, en el mundo del desarrollo actual los programadores hacen uso de librerías para llevar a cabo funcionalidades ya resueltas y que han sido programadas por otros. Esto hace que normalmente un desarrollo dependa de las librerías en las cuales se apoya. Esto produce muchos quebraderos de cabeza a los ingenieros que tienen que desplegar software, porque si se despliegan dos sistemas que dependen de una misma librería esta librería tiene ser utilizada exactamente en la misma versión. En caso contrario surgen los problemas de incompatibilidades.

Para esto se ideó la tecnología de contenedores. En esta tecnología cada micro-servicio se empaqueta con sus librerías y hay automatismos (capas) que se encargan de controlar las versiones de las librerías comunes y otros elementos. En este ejemplo se va a utilizar Docker como tecnología de contenedores.

Con Docker no tenemos problemas dependencias, pero surgen problemas de gestión de los numerosos contenedores que tiene que manejar el equipo de operaciones. Cuantos contenedores están activos, que recursos consume cada uno, es necesario replicar alguno de ellos para que no se produzcan cuellos de botella, se ha caído alguno, están en la versión adecuada, es necesario dar marcha atrás en un despliegue, etc.

Para esta gestión viene al rescate Kubernetes.

Qué es Kubernetes.

Kubernetes también conocido como K8s es un sistema open-source para la automatización del despliegue, escalado y gestión de aplicaciones contenorizadas.

Un cluster Kubernetes está formado por componentes que sirven para gestionar un conjunto de máquinas llamadas nodos.

No se van a describir aquí todos los tipos de componentes que existen en Kubernetes. Solo se van a exponer aquellos componentes de los que hace uso el ejemplo que aquí se explica.

El componente de orden superior que se utiliza es el Deployment que representa un despliegue. En el ejemplo el Deployment tiene un Pod, un Service y varios ReplicaSet. Los Pod albergan contenedores, los ReplicaSet se encargan de mantener activas tantas copias de un pod como se hayan establecido. Los servicios exponen los pods, es decir los contenedores que incluyen como un servicio de red.

Para ilustrar los componentes que utiliza el ejemplo, se utiliza la siguiente figura:

Ejemplo de Uso de Kubernetes

Se crea un contenedor que incluye un servidor web nginx que muestra una página html. Para ello se realizan las siguientes acciones:

  1. Instalar Docker https://docs.docker.com/get-docker/
  2. Crear un contenedor Docker
    • Crear un contenedor Docker que incluye: un servidor web nginx, una página html, una hoja de estilos y dos imágenes. Para construir un contenedor hay que crear un fichero con nombre dockerfile que describe su contenido. En el caso del ejemplo:
      FROM nginx
      COPY pagina.html /usr/share/nginx/html
      COPY pagina.css /usr/share/nginx/html
      COPY LogoDocker.png /usr/share/nginx/html
      COPY LogoKubernetes.png /usr/share/nginx/html
    • En el directorio donde está el dockerfile se ejecuta el comando para crear el contenedorcon el comando:
      docker build -t containerprueba .
  3. Se publica en un registro de contenedores, para luego usarlo desde kubernetes. En este caso en: http://hub.docker.com con el nombre
    marisaafuera/containerprueba
  4. Instalar Minikube https://minikube.sigs.k8s.io/docs/start/ y arrancarlo. Minikube es una herramienta que administra maquinas virtuales en donde corre una instancia de Kubernetes en un solo nodo y es útil a efectos de aprendizaje y pruebas.
  5. Crear un deployment en kubernetes (se crean automáticamente el pod y el servicio) con el comando:
    kubectl create deployment containerprueba --image=marisaafuera/containerprueba
  6. Exponerlo en Kubernetes para que sea accesible con:
    kubectl expose deployment containerprueba --type=LoadBalancer --port=8090
  7. Ahora debería de funcionar http://localhost:8090/pagina.html, pero no funciona. Después de unas cuantas horas buscando por qué no funciona, al final con port forward funciona:
    kubectl port-forward pod/<nombre pod> 8091:80
  8. Para acceder a la aplicación contenorizada y kubernetizada:
  9. Minikube tiene un dashboard que da información sobre el entorno de ejecución y permite gestionarlo. Se arranca con minikube dashboard.

    Para terminar

    Este artículo explica en la práctica en qué consiste Kubernetes. La ventaja de utilizar una herramienta de este tipo es apoyar el despliegue de sistemas con software que ayude a los equipos de desarrollo y operaciones a dar mejor servicio a los usuarios. Automatizar el trabajo, si se hace correctamente ayuda a que las tareas repetitivas se hagan mejor y con menos errores.

domingo, 13 de febrero de 2022

¿Qué es LOW CODE?

Low Code es una corriente de desarrollo de software que ayuda a construir aplicaciones sin la necesidad de escribir código o escribiendo poco código.

Hay numerosas herramientas que se publicitan como “Low Code” y que prometen:

  • Construir aplicaciones sin necesidad de ingenieros del software o expertos que dominen algún lenguaje de programación
  • Desarrollar apps para móviles, cloud y/o web
  • Crear aplicaciones haciendo “arrastrar y soltar”
  • Usar APIs REST  sin necesidad de conocer los end-points o interfaz técnica
  • Conectar con bases de datos sin usar lenguajes técnicos: SQL o similares
  • Embellecer aplicaciones web o móviles sin saber html, css, ni javascript
  • Desarrollar flujos de trabajo adaptados a las necesidades del negocio
  • Utilizar plantillas preestablecidas como base de la creación de apps o flujos de trabajo


La corriente “Low Code” viene de antiguo. En 1968 en la universidad de Michigan se inició el proyecto ISDOS (Information System Design and Optimization System) que estaba enfocado en ayudar a los equipos de desarrollo durante las fases del desarrollo del software. Este proyecto iluminó a otros muchos que acabaron elaborando lo que se denominó herramientas CASE (Computer Aided Software Engineering). Estas herramientas ayudaban en el análisis y diseño permitiendo realizar gráficos del sistema a construir y documentar los elementos que lo componían. También basándose en distintos esqueletos, servían para generar código de forma automatizada.

En la década de los 90 surgió la corriente de los lenguajes de programación basados en el paradigma de orientación a objetos (OO). A finales de los 90 con el auge de internet, estos lenguajes se llevaban toda la cuota de los nuevos desarrollos. Alentados por el éxito de las herramientas CASE del pasado, los expertos idearon un lenguaje de modelado específico para el desarrollo con lenguajes OO. Este lenguaje llamado UML (Unified Modeling Languaje) es un compendio de especificaciones para representar gráficamente todo lo que se puede desarrollar con un lenguaje OO. Partiendo de esta representación gráfica se crearon herramientas que generaban el código de los programas.

Todas estas iniciativas se pueden considerar precursoras de Low Code puesto que finalmente conseguían que los programadores tuvieran que escribir menos código.

El desarrollo de sistemas software consiste en su creación y posterior mantenimiento. Las empresas grandes y pequeñas invierten bastante dinero en el software que utilizan. Las herramientas de Low Code pretenden conseguir que esta inversión se minimice.
 
Veamos un ejemplo. Un departamento de ventas necesita hacer un resumen de los productos que se han vendido durante el año, se requiere elaborar un informe de los productos se han vendido mejor y han supuesto más ingresos para la compañía. Es necesario un resumen anual y un resumen mensual. Esta labor, antes de que existiesen las herramientas para hacer hojas de cálculo, requería un análisis en el que colaboraban un experto en ventas y un experto en desarrollo. Después un diseño para dar solución a lo analizado y para terminar una programación en algún lenguaje. Tras la puesta en marcha del sistema, viene el mantenimiento. ¿Qué pasa si el resumen además de mensual se requiere que sea semanal? Con las hojas de cálculo (Excel como máximo exponente) alguna persona del departamento de ventas, aprendió a diseñar, hacer cálculos y gráficos que resolvieron la situación con menos recursos (menos personas y menos tiempo).

En este ejemplo la hoja de cálculo es una herramienta de Low Code. A los avezados empleados que aprendieron sin conocimientos de programación a construir estas hojas, en la terminología Low Code les llaman Citizen Developers. Yo lo traduciría como desarrolladores de a pie. Resuelven la papeleta sin conocimientos de lenguajes de programación, ni bases de datos, ni sistemas operativos.

Estos Citizen Developers se suben al carro de los desarrolladores de software. Low Code dice que de esta forma se democratiza la construcción de software no necesitando grandes gurús de las tecnologías para construir sistemas de información.

No obstante, no es oro todo lo que reluce. Hay que tener en cuenta que la gestión de los sistemas de información de una empresa no es algo sencillo. La complejidad es directamente proporcional al tamaño de la organización, pequeña poca complejidad, grande mucha. O sea, Low Code es una buena corriente que posibilita la creatividad software de más personas que no solo los expertos en tecnologías. Pero toda está creación de software debe estar orquestada de forma coherente y coordinada. De otra forma las empresas caminan hacia el caos. Le suena a alguien que un mismo dato que proviene de varias fuentes no sea igual. Por ejemplo las ventas en diciembre de un determinado producto, que tiene registradas Alberto y las que tiene registradas Ana.

Pues eso,  Low Code si pero con cabeza.

jueves, 27 de enero de 2022

¿Qué es Docker y para qué sirve?

En informática un contenedor es una unidad estándar de software que empaqueta código y todas sus dependencias de tal forma que una aplicación se despliega y ejecuta rápida y fiablemente entre diferentes entornos. Un contenedor Docker es una imagen ligera, aislada y ejecutable que incluye todo lo necesario para ejecutar un software: código, herramientas, librerías y configuración.

Las imágenes de Docker llegan a ser contenedores cuando se ejecutan bajo el motor de Docker. Este motor está disponible para Linux, Windows y Mac.

La tecnología Docker se lanzó en 2013 como código abierto, enfocada en las necesidades de los desarrolladores y administradores de sistemas para ayudarles a separar las dependencias de la infraestructura. Esta tecnología ayuda a eliminar los problemas de instalar un software en distintos entornos y que las diferencias en la infraestructura produzcan fallos. De todos los desarrolladores y administradores es conocido el problema de desplegar el software desde los entornos de desarrollo a los de pruebas y producción.

El éxito que cosechó Docker en Linux condujo a la asociación con Microsoft que creó contenedores Docker para Windows. La tecnología Docker también está muy implantada en centros de datos, proveedores de servicios en la nube y frameworks serverless.

En una misma máquina pueden ejecutarse múltiples contenedores compartiendo el núcleo del sistema operativo, pero cada uno ejecutando los procesos de forma aislada en su propio espacio de nombres.

Un ejemplo de uso de Docker

  1. Instalación de Docker
    En https://hub.docker.com/ se descarga el producto para el sistema operativo que se necesite: Linux, Windows o Mac, y se procede a su instalación. Normalmente tiene más que seguir las indicaciones (siguiente, siguiente, .. ya sabes)
  2. Descarga del container getting-started
    Tras la instalación se puede proceder a descargar y ejecutar el primer contenedor de muestra que proporciona Docker. Este contenedor incluye un servidor web Nginx y una web con la documentación de Docker. Para instalarlo en cada sistema operativo acceder al modo comando y escribir:
    docker run -d -p 80:80 docker/getting-started

    este comando comprueba si tenemos esta imagen en nuestro ordenador, sino la tenemos la descarga (es nuestro caso, que acabamos de llegar a docker) y lo arranca.
  3. Ejecución de la aplicación del contenedor
    Lo que tenemos que hacer ahora el ir al navegador y escribir localhost. Esto arranca la web de documentación de Docker, que se ha instalado en el puerto 80 como si esta aplicación web de documentación y el servido Nginx estuviesen en nuestro ordenador.
    Si miramos en detalle vemos la url escrita en el navegador y corresponde con nuestro ordenador.

Uso de Docker desktop

El Docker dektop se instaló con la instalación de docker y permite entre otras cosas gestionar las imágenes y contenedores.

Si miramos en detalle vemos que el contenedor que está arrancado es el getting-started que acabamos de instalar y usar, que se llama vigorous-hofstadter

Conclusión

La tecnología de contenedores está actualmente en boga y ayuda a desarrollar y desplegar software evitando los quebraderos de cabeza que producen las dependencias entre unos paquetes software y otros.

Referencia

Para saber lo que es Docker está muy bien el post https://www.luisllamas.es/que-es-docker-y-como-usarlo/

viernes, 7 de enero de 2022

Javascript: Para qué sirve AJAX (Asynchronous JavaScript And XML)

AJAX es el acrónimo de Asynchronous JavaScript And XML, y son un conjunto de técnicas ideadas alrededor de 2005 para mejorar el desarrollo de aplicaciones web. En ese momento las aplicaciones web eran mucho menos fléxibles que las aplicaciones de escritorio y con AJAX esta circunstancia cambió notablemente.

AJAX es un nombre para aglutinar varias tecnologías desarrolladas entorno a internet:


  • XHTML+CSS
  • DOM
  • XMLHTTPRequest
  • Javascript
  • XML+XSLT (Actualmente en muchos casos JSON)

De todas estas tecnologías el objeto JavaScript XMLHTTPRequest es el motor. Este objeto es capaz de hacer peticiones "no bloqueantes" al servidor. Esto mejora la experiencia de usuario, puesto que el navegador puede lanzar peticiones al servidor y mientras este realiza el proceso necesario para contestar a esa petición el navegador no ha de estar esperando. El navegador puede seguir recibiendo ordenes del usuario y encadenar peticiones que cuando van siendo respondidas incorporan datos que se actualizan en la página html ya cargada mediante funciones javascript que acceden a las etiquetas de la página con DOM.

Para explicar la diferencia de acceso al servidor con AJAX y sin AJAX se puede acceder a las siguientes grabaciones:

Sin AJAX

Con AJAX

Conclusión

AJAX ha permitido desarrollar numerosas aplicaciones web, que tan útiles nos resultan en nuestro día a día. Eso si, no sin entrañar dificultades al tratar con las asincronías de XMLHTTPRequest y por lo tanto del API FETCH que tantos quebraderos de cabeza nos producen a los programadores.

domingo, 26 de diciembre de 2021

La paradoja del circunnavegante

Académicos sirios y franceses en el siglo XIII desarrollaron la "Paradoja del Circunnavegante" de la siguiente manera: supongamos que tres personas se reúnen en un lugar fijo: una se dirige hacia el oeste, otra sale hacia el este y la tercera permanece donde está, esperando a que las otras dos completen su viaje alrededor del mundo. A su regreso, el que viajó al oeste habrá perdido un día, mientras que el que viajó al este lo ganará.

Se demostró que esto era cierto en el primer viaje alrededor del mundo. En 1519 partió de Sanlucar de Barrameda una flota con Fernando de Magallanes al frente, el objetivo era abrir una ruta comercial hacia la isla de las especias por occidente. En aquellos tiempos las especias eran vitales para la conservación de los alimentos, la elaboración de medicamentos y para mejorar y/o potenciar el sabor de los alimentos que no siempre se comían en el mejor estado de conservación. El mercadeo de especias fue un negocio muy próspero durante 9 siglos. Acceder a este próspero negocio fue el motivo que llevo a la corona de España a financiar el viaje que fue el primero en el que varios hombres consiguieron dar una vuelta completa al globo terráqueo.

De la tripulación formaba parte Antonio Pigafetta que ocupaba el puesto de Sobresaliente. Este era un hombre cultivado que escribió un diario durante el viaje que fue de vital importancia para saber lo que acaeció durante los 3 años que duró la travesía. Entre todas las cosas para las que sirvió tal diario, una fue obtener una demostración práctica de la paradoja del circunnavegante. Cuando llegarón a Cabo Verde habían completado la vuelta completa a la tierra. Para Pigaffeta según sus anotaciones era miércoles 8 de julio de 1522 pero en Cabo Verde era 9 de julio jueves. Esto no se debía a un error en las anotaciones del diario.

Cuando se avanza hacia el oeste el sol sale y se pone cada vez más tarde, es decir los días son más largos que si estás en un punto fijo de la tierra. Concretamente por cada 111,32 km de avance el día se alarga 4 minutos. Teniendo en cuenta que el diámetro de la tierra es de 40.075 km, cuando has recorrido todo el diámetro de la tierra el sol saldrá: 4 minutos * (40.075 km / 111,32 km) más tarde. Esto es igual a 1440 minutos más tarde, que son 24 horas. Si el sol sale 24 horas más tarde que cuando se comenzó el viaje, cuando se llega al destino se ha perdido 1 día completo.

Si se viaja hacia el este lo que ocurre es que se gana 1 día puesto que el sol sale 24 horas antes ya que en este caso los días son más cortos. Julio Verne utilizó esta paradoja para su novela La Vuelta al Mundo en 80 días.

Desde 1884 durante una conferencia se convino crear la Línea Internacional de Cambio de Fecha. Esta línea sirve para que al ser traspasada los viajantes cambien de día y así uniformar las fechas de toda la humanidad aunque unos estén viajando hacia el este y otros hacia oeste.

miércoles, 1 de diciembre de 2021

Javascript: Ejemplos de Template Literal

Los Template Literal son plantillas que permiten intercalar expresiones dentro de una cadena, lo cual hace posible escribir cadenas sin tener que recurrir a la concatenación con el uso del operador +. También permiten escribir cadenas que tengan más de una línea, de nuevo sin recurrir al +. Además con los Templates etiquetados podemos incorporar procesamiento ad hoc. 

Ejemplo simple

Un ejemplo muy simple de es:

let miPrimerTemplateLiteral = `Este es un template literal`;

aquí se está usando el caracter ` que es el que declara un template literal, pero no se está haciendo uso de ninguna de sus ventajas comparativas con las cadenas normales declaradas con ' o ".

Ejemplo de intercalado de expresiones

Un ejemplo que si saca partido a las posibilidades de un Template Literal sería:

let nombre = "Luis";
let cantidad = 23;
let precioUnitario= 105;
let iva = 1.21;
let plantilla= `Querido/a ${nombre},\nEspero que te encuentres bien.
Te recuerdo que el importe de la factura asciende a ${cantidad*precioUnitario*iva}`;
console.log(plantilla);
// Resultado:
// Querido/a Luis,
// Espero que te encuentres bien.
// Te recuerdo que el importe de la factura asciende a 2922.15

aquí el uso de ${} muestra como se pueden incluir expresiones dentro del literal que se sustituyen por su valor en tiempo de ejecución. También se puede observar cómo un Template Literal puede ocupar más de una línea y cómo puede incluir un salto de línea \n.

Ejemplo de anidación

Los template literal se pueden poner unos dentro de otros

let color = 'rojas';
let count = 3;
let message = `Tengo ${color ? `${count} manzanas ${color}` : `${count} manzanas`} `; // Noncompliant; nested template strings not easy to read
console.log('Mesagge ', message)
// Resultado: Mesagge  Tengo 3 manzanas rojas

No  obstante esta forma de codificación está desaconsejada por SonarQube, herramienta que vela por la calidad del código. El motivo es la poca legibilidad del mismo, aconsejando esta herramienta codificar de la siguiente manera

let apples = color ? `${count} manzanas ${color}` : `${count} manzanas`;
message = `Tengo ${apples}`;
console.log('Mesagge ', message)
// Resultado: Mesagge  Tengo 3 manzanas rojas
 

Ejemplo de templates etiquetados

Un tTmplate se puede etiquetar con el nombre de una función. Esta recibe los textos y expresiones del Template Literal pudiendo procesarlo como se requiera.

function templatetag(literales, ...expresiones){
  console.log('lit ', literales, 'exp ', expresiones)
}

templatetag`amigo ${2+2} mio`
// Resultado; lit  [ 'amigo ', ' mio' ] exp  [ 4 ]

Esta característica de los Template Literal permite procesar su contenido según se requiera, por ejemplo

function priceonSeason(literales, ...expresiones) {
  let precio = 100;
  if (literales[1] == ' diciembre')    
     return `Su reserva para temporada baja ha sido confirmada.
     ${expresiones[0]} personas por un importe de ${precio*0.90}`
  else
    return `Su reserva para temporada alta ha sido confirmada.
    ${expresiones[0]} personas por un importe de ${precio}`
}
let pax = 2;
let respond = priceonSeason`Reserva de plaza para ${pax} diciembre`;
console.log ('Ejemplo etiquetado', respond)
// Resultado
// Ejemplo etiquetado Su reserva para temporada baja ha sido confirmada.      
//      2 personas por un importe de 90
 

Conclusión

Los Template Literal son cadenas de caracteres con características avanzadas que proporcionan medios al programador para trabajar con cadenas de caracteres de una muy versatil.

domingo, 7 de noviembre de 2021

Javascript: Ejemplos de uso del operador spread

El operador spread permite manejar elementos considerados iterables como son arrays(un array tiene/itera elementos), strings(tiene/itera caracteres) u objetos(tiene/itera pares clave-valor) sin necesidad de preparar un algoritmo cíclico o de bucle. 

Con spread se puede: 

  • En llamadas a funciones, que arrays o strings expandan sus elementos. 
  • Operar entre arrays, el operador expande sus elementos. Se pueden copiar, mezclar, intercalar.
  • Operar con objetos spread expande los pares clave-valor. Lo mismo que los arrays 

Ejemplos básicos


// expande el string en sus 3 caracteres
console.log('String expandido: ', ..."abc"); 
// expande el array en sus 4 elementos
console.log('Array expandido: ', ...[1,2,3,4]); 
// Expande el primer objeto y le añade el par clave-valor masattr: 'def'
console.log('Objeto expandido: ', {...{id1desc:'abc'}, masattr'def' }); 
// Expande los arrays y crea uno nuevo con los elementos de los dos
console.log('Une dos arrays: ',[...[1,2,3,4],...[5,6]])

// String expandido:  a b c
// Array expandido:  1 2 3 4
// Objeto expandido:  { id: 1, desc: 'abc', masattr: 'def' }
// Une dos arrays:  [ 1, 2, 3, 4, 5, 6 ]

 

Otros ejemplos

 En el siguiente ejemplo se intercalas los elementos de un array en otro

// Spread en array 
let otrosIdiomas = ['inglés''aleman'];
let idiomasHablados = ['español', ...otrosIdiomas'frances'];
console.log ('Ver idiomasHablados: 'idiomasHablados)
// Ver idiomasHablados:  [ 'español', 'inglés', 'aleman', 'frances' ]

En el siguiente ejemplo se copia un array en otro. La copia es poco profunda (shallow), es decir el array original es totalmente independiente de nuevo obtenido con la copia.

// Copiar array como arr.slice()
let numeros1 = [123];
let numeros2 = [...numeros1]; 
numeros2.push(4);
console.log ('numeros1 y numeros2: 'numeros1numeros2
// numeros1 y numeros2:  [ 1, 2, 3 ] [ 1, 2, 3, 4 ]

En el siguiente ejemplo el array es pasado a una función, el operador spread expande el array y se convierten en los argumentos de la función llamada.

//Spread en llamadas a funciones
function miFuncion(a1a2a3) { 
    console.log ('Argumentos: 'a1a2a3)
}
let argumentos = [012];
miFuncion(...argumentos);

En el siguiente ejemplo se copian y mezclan objetos siendo de nuevo una copia poco profunda.

// Con objetos
let objeto1 = { desc'ob1'p11 };
let objeto2 = { desc'ob2'p22 };
let objetoCopiado = { ...objeto1 };
let objetoMezclado = { ...objeto1, ...objeto2 };
console.log ('Objetos copiado y mezclado: 'objetoCopiadoobjetoMezclado)
// Objetos copiado y mezclado:  { desc: 'ob1', p1: 1 } { desc: 'ob2', p1: 1, p2: 2 }

 

Conclusión

El operador spread facilita las tareas del desarrollador cuando se trata de realizar ciertas operaciones con objetos iterables: array, strings y objetos.