¿Que hay De nuevo con la Java Virtual Machine? | Entrevista con Josh Long

Java’s Cutting Edge Comeback (with Josh Long)

La historia no contada de Java

«Java y la JVM han resurgido con una rapidez que no esperaría de un lenguaje de 30 años.»

  • Este video presenta una narrativa sobre la evolución de Java y la Máquina Virtual de Java (JVM), comparándola con un boxeador veterano que ha tenido que enfrentar desafíos significativos, pero que ha encontrado una nueva vida tras un período de estancamiento.
  • Hace 10 o 15 años, Java estaba perdiendo terreno frente a lenguajes como Scala y parecía que la JVM no tenía un futuro prometedor. Sin embargo, recientemente, Java y la JVM han comenzado a recuperar impulso y evoluciona a una velocidad sorprendente.
  • Se menciona que el orador intenta mantenerse al día con los cambios en Java, pero reconoce que no ha seguido cada detalle, lo que lo llevó a consultar a Josh Long, un entusiasta de la JVM, sobre las nuevas innovaciones en esta área.

Innovaciones en Java y la JVM

«Se están introduciendo nuevas técnicas para la computación de alto rendimiento y la programación orientada a datos.»

  • Josh Long describe varios avances, incluidos nuevos enfoques para la programación asíncrona y un nuevo modelo de subprocesos, así como esfuerzos serios para que Java compita con Python y C en el ámbito de la inteligencia artificial.
  • Long destaca que la mejora y evolución de Java y la JVM es un tema emocionante. Identifica que hay un montón de nuevo material que explorar en el lenguaje, lo que contrasta con la percepción de que Java había llegado a ser obsoleto.

La comunidad de JVM y el futuro de Java

«Kotlin ha logrado evitar muchos de los errores que afectaron a los lenguajes que comenzaron en 1995.»

  • Durante una conversación, se toca la relación entre la comunidad de JVM y el papel de Cotlin como un lenguaje moderno que se beneficia de las lecciones aprendidas a lo largo de los años.
  • Josh Long expresa su aprecio por la elegancia y modernidad de Cotlin, señalando que fue diseñado con un nuevo enfoque y con una visión fresca, lo que lo coloca por delante de muchos lenguajes más antiguos.

Desafíos y reflexiones sobre el desarrollo en Java

«Java aún presenta cierta ceremonia que no se encuentra en otros lenguajes.»

  • En esta sección, se discuten las peculiaridades de Java, incluidas sus limitaciones y su compromiso con la compatibilidad hacia atrás, lo que a veces resulta en soluciones intermedias en lugar de enfoques más elegantes.
  • Bajo su crítica, se menciona cómo Java, a pesar de sus beneficios, puede ser percibido como riguroso o excesivamente ceremonial, lo que puede dificultar el desarrollo fluido en comparación con otros lenguajes más modernos.

Sistema de Paréntesis y Ceremonia en Java

«La experiencia del principiante es importante, pero se ve eclipsada por la experiencia del experto.»

  • Se discute la complejidad del sistema de paréntesis en Java, enfatizando que muchos consideran esto como «ceremonial» al comparar Java con lenguajes como Python, que tiene un enfoque más sencillo para imprimir «Hello World». Sin embargo, es importante entender que ambos lenguajes tienen propósitos y contextos de uso diferentes.
  • Java es particularmente fuerte en el desarrollo a gran escala, donde la complejidad y la estructura son fundamentales. La implementación inicial y las líneas de código simples no representan el verdadero uso de Java; es importante enfocarse en el desarrollo de proyectos no triviales con el tiempo.

Eficiencia de Tipos de Datos en Java

«Si utilizas un array en Java, es extremadamente eficiente porque estamos almacenando tipos primitivos.»

  • Se menciona que la distinción de tipos en Java entre arrays y colecciones permite que los arrays, que son bloques contiguos de memoria, ofrezcan un rendimiento superior en comparación con otros lenguajes que no hacen esta distinción.
  • Se destaca que si bien algunas personas pueden ver la declaración de tipos en Java como «ceremonial», esta precisión en la tipificación permite una gran eficiencia en el manejo de datos, especialmente en aplicaciones que requieren un alto rendimiento.

Proyecto Valhalla y Rendimiento

«Una de las cosas en las que están trabajando es el Proyecto Valhalla, que unificará los tipos de datos.»

  • El Proyecto Valhalla permite añadir tipos primitivos como ciudadanos de primera clase en Java, lo que mejora la eficiencia al simplificar la forma en que se manejan los objetos y el rendimiento en aplicaciones como videojuegos y inteligencia artificial, donde la localidad del caché de CPU es crucial.
  • Se explica que, con este proyecto, los desarrolladores podrán crear «clases de valor» donde los cálculos se realizan sin la sobrecarga de los encabezados de objetos, lo que provoca un mejor uso de la memoria y un mejor rendimiento en general.

Evolución de Java y su Interacción con C

«Java no alentaba el acceso fácil a las API nativas desde mi código Java en su momento.»

  • Históricamente, Java se desarrolló en un contexto donde predominaban los applets y los clientes basados en navegadores, lo que significaba que no se fomentaba la interacción directa con APIs nativas. Esto llevó a una estructura en la que los desarrolladores debían escribir código C adicional para acceder a funcionalidades nativas.
  • A pesar de que se introdujo el Interfaz de Función Extranjera (JNI) para facilitar estas interacciones, se requiere más código C para enlazar Java con C, lo que complicaba la implementación de funcionalidades nativas en Java.

Introducción de Project Panama en Java 22

«Ahora tenemos eso en Java desde Java 22, se llama Project Panama.»

  • Con el lanzamiento de Java 22, se introdujo Project Panama, que permite a los desarrolladores interactuar con código nativo sin la necesidad de escribir código C adicional. Esta nueva funcionalidad permite la creación de arenas de memoria y la definición de estructuras directamente desde Java.
  • Los desarrolladores ahora pueden describir el diseño de estructuras en C y asignar valores a sus campos, lo que facilita el trabajo con tipos nativos directamente en el lenguaje Java.

Integración de Funciones nativas y Lenguajes Compilables

«Cualquier cosa que puedas llamar en C puedes ahora llamar desde Java.»

  • Project Panama revela que cualquier funcionalidad que se pueda compilar a código máquina C se puede invocar en Java. Esto incluye lenguajes como Go y Rust, expandiendo significativamente las capacidades de Java al integrar diversas bibliotecas y funcionalidades avanzadas.
  • Esta característica resalta la evolución del lenguaje, que ahora se puede usar junto al poder de otros lenguajes modernos.

Anticipaciones sobre Projetos Futuros

«Hay un esfuerzo contemporáneo llamado Project Valhalla.»

  • Junto a Project Panama, se anticipa la llegada de Project Valhalla, el cual tiene como objetivo mejorar aún más el rendimiento y la funcionalidad de Java con nuevas características para el manejo de tipos de valor.
  • También se menciona la API de vectores, que permitirá realizar cálculos de matrices y transformaciones geométricas de manera eficiente, potencialmente facilitando el desarrollo de aplicaciones avanzadas en áreas como el aprendizaje automático.

Rendimiento de GraalVM y su API Vectorial

«Es asombroso que podamos procesar mil millones de registros en un par de segundos.»

  • Thomas Wartinger es el creador de Gravium, una herramienta que se destaca por su rendimiento en comparación con otros métodos. Su entrada en una competencia lo colocó en el lugar número ocho, utilizando la API vectorial, logrando procesar mil millones de registros en solo dos segundos. El competidor más rápido completó la tarea en un tiempo de uno punto cinco segundos.
  • A pesar de que los primeros lugares de esta competencia se benefician del compilador de imágenes nativas de Gravium, la API vectorial permite optimizar el rendimiento en tiempo de ejecución, aunque en el momento de la competencia las características avanzadas de esta herramienta aún no estaban completamente implementadas.
  • Al parecer, si la comparación se repetiese hoy, el desempeño de la entrada de Wartinger sería aún más rápido gracias a las mejoras en Gravium.

Sencillez de Programación con Hilos Virtuales

«Los hilos virtuales son mucho más elegantes y menos ceremoniales que los ‘async/await’.»

  • La introducción de hilos virtuales ha transformado la programación en Java, permitiendo manejar la entrada y salida no bloqueante de manera más eficiente sin la complejidad de los modelos tradicionales como ‘async/await’. Al cambiar solo el tipo de ejecutor en un programa, cada hilo que se genere puede operar como un hilo virtual.
  • Además, se discute la comparación entre la ceremoniabilidad y la simplicidad de diferentes lenguajes de programación, enfatizando que, en lugar de centrarse en cosas como los puntos y comas en el código, es más importante cómo la máquina interpreta y ejecuta las órdenes.

Discutiendo la Ceremonialidad en Java

«No hay razón en Java para no tener solo una clase principal y compilarla en el mismo directorio.»

  • Aunque Java tiene ciertas convenciones de ceremonialidad, como la estructura de directorios y la organización del código en múltiples carpetas, estas no son obligatorias por el lenguaje en sí. Realmente, estas son prácticas comunes en proyectos de Java que se han desarrollado a lo largo de 20 años.
  • A pesar de conectar con leyendas de distintos lenguajes, el debate sobre qué tan ceremonioso es un lenguaje en comparación con otro a menudo no tiene sustento práctico; más bien, es la eficiencia y el rendimiento, especialmente en el manejo de colecciones de datos, lo que debería ser el enfoque principal en la comparación entre lenguajes.

Introducción al uso de async await en C#

«Ahora la cosa que habría sido una promesa o como un futuro muy elegante, ahora puedes llamar a await.»

  • En C#, la palabra clave async permite a las funciones ejecutar operaciones de manera asincrónica. Al declarar una función como async, estás indicando que esta función puede realizar tareas sin bloquear el hilo principal.
  • El resultado de una función async es un objeto de tipo Task, que déjame manejar diferentes tipos de resultados, como booleano o un objeto de tipo genérico T.
  • Un aspecto clave de async y await es que al esperar el resultado, el valor almacenado en la variable resulta ser del tipo T en lugar de Task<T>, simplificando así el manejo de resultados.

Ventajas de la programación asincrónica

«La ventaja es que mientras espero, soy libre de continuar mi hilo de ejecución.»

  • La programación asincrónica es beneficiosa porque permite que un hilo se libere para realizar otras tareas mientras se espera que una operación como la lectura de datos de un socket de red finalice.
  • Esto se traduce en una administración más eficiente de los recursos del sistema, ya que no se bloquean hilos innecesariamente mientras se está en espera de respuestas que pueden tardar un tiempo considerable.
  • Este modelo también permite que el sistema reaccione de manera más efectiva al contexto en que se trabaja, manteniendo disponible la capacidad de procesamiento para otros hilos.

Cómo funciona async await bajo el capó

«El compilador envuelve el resto del código en esa parte en una continuación.»

  • El mecanismo async await no solo facilita la escritura de código que parece sincrónico, sino que también organiza internamente cómo administrar ese código asincrónico.
  • Cuando se llama a una función con await, el compilador transforma el código para que, después de la llamada a la función, el hilo no se mantenga ocupado; en su lugar, se permite que el flujo de ejecución continúe en otro hilo hasta que se complete la operación esperada.
  • Este enfoque es particularmente útil en operaciones de entrada/salida (I/O), donde las esperas pueden ser prolongadas y no hay ningún procesamiento activo en la CPU.

Programación asincrónica y su influencia en el diseño de lenguajes

«Con IO, si estoy solo esperando, significa que ese hilo podría ser liberado y alguien más podría usarlo.»

  • La disponibilidad de recursos como hilos es crítica, especialmente en sistemas donde las operaciones de entrada/salida son comunes. Por ello, lenguajes como Java han implementado mecanismos que permiten la programación no bloqueante.
  • Se busca maximizar la eficiencia del sistema liberando hilos en espera de operaciones de I/O y asegurándose de que las tareas que requieren CPU se realicen en hilos adecuados.
  • Este diseño subraya la importancia de utilizar el rendimiento del sistema de manera efectiva, lo que es fundamental para aplicaciones que requieren eficacia y rapidez en la respuesta.

Hilos Virtuales y Programación Asincrónica

«Siempre hemos querido como programadores la capacidad de escribir código asincrónico, pero que se vea como código regular.»

  • La implementación de hilos virtuales permite a los programadores escribir código que parece síncrono, pero que en realidad es asincrónico. Esto se puede lograr sin complicaciones adicionales de gestión de asincronía o modelos de concurrencia.
  • La comparación con otros lenguajes como Go muestra que Java ha logrado realizar estas innovaciones de manera efectiva, a pesar de tener que considerar la compatibilidad hacia atrás con versiones anteriores. Go había implementado esta funcionalidad mucho antes, pero Java ha logrado hacer ajustes significativos.

Ejecución de Tareas en Java

«Todo se ejecuta sobre la misma base, y desde que la mayoría de los servicios son dependientes de IO, eso es una ampliación gratuita.»

  • Con los ejecutores en Java, los programadores pueden enviar tareas (Runnable) de manera sencilla utilizando un nuevo ejecutor de tareas virtual. Esto ha adaptado el antiguo enfoque de programación con utilidades concurrentes a un modelo que ofrece una mejor escalabilidad, especialmente para operaciones de IO.
  • Este enfoque permite a los desarrolladores mantener la misma base de código que han estado utilizando durante años mientras aprovechan las ventajas que ofrecen los hilos virtuales.

Mejora de Rendimiento con Valhalla

«Ya han realizado pruebas donde el uso de Valhalla es tres o cuatro veces más rápido que simplemente ejecutar en el JVM.»

  • Valhalla se presenta como una solución que mejora la eficiencia del código e incluso hace que ciertas operaciones sean más baratas en términos de recursos. Este proyecto se enfoca en manejar tipos de datos más eficientes y proporciona mayores beneficios para la programación de datos.
  • Las mejoras de rendimiento que ofrece Valhalla se destacan especialmente en operaciones comunes, lo cual es un avance significativo para Java, que tradicionalmente se ha enfrentado a limitaciones en su ritmo de innovación.

Especificaciones de Nullabilidad en Java

«Normalmente se dice que esto es anulable y que eso es el default.»

  • La introducción de tipos primitivos y su manejo en colecciones lleva a una discusión sobre la especificación de nulidad en Java. La nulidad debe gestionarse de tal manera que los desarrolladores puedan tener claridad sobre qué valores pueden ser nulos y cuáles no.
  • Esto implica un enfoque proactivo para definir la nulidad en el código, que mejorará la calidad del mismo y facilitará la programación más segura, donde los errores por null no serán comunes.

Sincronización y uso de bloques sincronizados

«No tiene sentido hacer operaciones de entrada/salida dentro de un bloque sincronizado.»

  • Discutir el uso de synchronized en Java implica entender cuándo y por qué es necesario. La sincronización se utiliza para asegurar que solo un hilo pueda acceder a un recurso compartido a la vez. Sin embargo, hacer operaciones de entrada/salida desde un hilo sincronizado no es práctico y generalmente se evita.
  • Si se ejecuta una operación de entrada/salida dentro de un bloque sincronizado, a menudo puede llevar a un comportamiento inesperado, ya que la sincronización de un hilo no garantiza el estado de otros hilos o del sistema.
  • Al manejar operaciones de entrada/salida, es más eficiente hacerlas primero fuera del bloque sincronizado y solo modificar el estado crítico dentro del bloque. Esto mitigará los problemas de rendimiento.

Mejoras en Java 24 y comentarios sobre programación con hilos virtuales

«El 99.99% de las personas que usarán hilos obtendrán beneficios ahora de los hilos virtuales.»

  • Java 24 introduce mejoras significativas en el manejo de hilos, especialmente para aquellos que utilizan programación con hilos virtuales. Los usuarios simplemente necesitan actualizar su configuración para beneficiarse de estas optimizaciones.
  • Además, es sencillo habilitar hilos virtuales con una sola propiedad en Spring, lo que puede maximizar el rendimiento de sus aplicaciones sin necesidad de cambios extensos en el código.
  • Aunque hay algunas consideraciones específicas al trabajar con código nativo usando JNI, la mayoría de los desarrolladores no se verán afectados por los problemas de «thread pinning».

Innovaciones en el mundo de Java y su comparación con Linux

«Java ha tenido 30 años de innovación, y Oracle ha sido un excelente cuidador de su desarrollo.»

  • La evolución de Java ha estado fuertemente influenciada por las contribuciones de diversas empresas y programadores en todo el mundo, lo que permite un desarrollo robusto y continuo. Esto ha llevado a Java a ser una de las plataformas más utilizadas en entornos empresariales.
  • Se argumenta que la comunidad de Java puede ser incluso más extensa que la de Linux, dado que Java tiene un acceso más fácil y menos técnico para los nuevos desarrolladores.
  • La alta inversión de recursos y la colaboración internacional en Java ha resultado en un ecosistema muy fuerte que ha mantenido a Java como una opción preferida para el desarrollo de software.

Programación orientada a datos en Java

«La programación orientada a datos se ha vuelto fundamental en el desarrollo de aplicaciones modernas.»

  • En el contexto del desarrollo actual, la programación orientada a datos destaca por enfocarse en la comunicación entre servicios en lugar de crear jerarquías complejas de tipos abstractos. Esto permite una mayor flexibilidad y escalabilidad en las aplicaciones.
  • Las mejoras en el lenguaje de Java, que incluyen coincidencias de patrones y expresiones más inteligentes, facilitan esta nueva forma de programación, haciendo que el código sea más claro y conciso.
  • La introducción de jerarquías selladas permite una mejor gestión de subtipos, asegurando que el compilador pueda detectar errores relacionados con implementaciones no deseadas o inválidas en contextos críticos como los servicios financieros.

La importancia de las interfaces y clases abstractas

«La interfaz definirá quién está permitido usarla.»

  • Las interfaces y clases abstractas en programación sirven como marco para definir comportamientos y restricciones sobre qué subtipos pueden acceder a ciertos métodos y propiedades. La clase abstracta juega un papel crucial al establecer quién está permitido interactuar con las funciones definidas, permitiendo una mayor organización y control del código.

Beneficios de Java y rendimiento operativo

«Es raro que puedas actualizar a una nueva versión y obtener ganancias de rendimiento gratuitas.»

  • Una de las características destacadas del lenguaje Java es su capacidad para mejorar el rendimiento de las aplicaciones simplemente al actualizar a una nueva versión del lenguaje. Esto se considera raro en otros lenguajes de programación, donde las mejoras suelen requerir cambios significativos en el código. Java es visto como una opción sólida para las organizaciones grandes, ya que ofrece estabilidad y integración eficiente con sistemas existentes.

Java y la inteligencia artificial

«Java tiene la ventaja de integrar los LLM existentes.»

  • Java está posicionándose como un lenguaje relevante en el ámbito de la inteligencia artificial, gracias a su sólida capacidad de integración con modelos de lenguaje de gran tamaño (LLM). A través de APIs REST, Java permite conectar y utilizar LLM de manera efectiva, asegurando que las organizaciones con una infraestructura Java existente puedan beneficiarse de estas nuevas tecnologías sin realizar un cambio drástico en su bases de código.

Evolución de Spring hacia la inteligencia artificial

«Se lanzará Spring AI 1.0 el 20 de mayo de 2025.»

  • Spring está en proceso de evolucionar e integrar capacidades de inteligencia artificial en su ecosistema. El anuncio del lanzamiento de Spring AI 1.0 en 2025 representa un avance significativo, ya que ofrecerá un marco para facilitar el uso de modelos de IA. Además, la creciente adopción del protocolo de contexto de modelo (MCP) permitirá interacciones más eficientes entre modelos de IA y herramientas disponibles en el mercado.

Plataforma de Nubes y Comandos Ejecutivos

«Esto es la capacidad de decir y hacer algo mediante herramientas, no solo se trata de datos.»

  • Se discute cómo las plataformas en la nube están integrando la generación aumentada de recuperación en sus modelos, permitiendo la conectividad con otros recursos en tiempo real. Este enfoque se asemeja a un nivel de comando ejecutivo dentro del software, donde los desarrolladores son libres de agregar herramientas específicas al modelo según sus preferencias.
  • Se hace hincapié en que estas nuevas funcionalidades no otorgan acceso total a los sistemas, sino que permiten que los desarrolladores elijan qué herramientas incorporar en sus aplicaciones.

SDK de Java y Spring AI

«Desarrollamos un SDK de Java tan bueno que se convirtió en el oficial para MCP.»

  • Se menciona la creación de un Kit de Desarrollo de Software (SDK) de Java que ha sido reconocido oficialmente para el Protocolo de Modelo Contextual (MCP) por el grupo Anthropic. Este SDK es independiente de otras estructuras como Spring y se le anima a los usuarios a utilizarlo de forma genérica.
  • Se explica que almacenar y manipular herramientas dentro de las aplicaciones Java se vuelve más intuitivo y accesible, promoviendo la facilidad de integración con distintas tecnologías.

Integración de Herramientas en Aplicaciones

«Puedes conectar tu modelo y el servidor MCP en tu aplicación web con una línea de código adicional.»

  • Se detalla el proceso para integrar herramientas en las aplicaciones, donde los desarrolladores deben exportar métodos y funciones a través de anotaciones específicas. Estas anotaciones ayudan a la IA a entender el contexto y la finalidad de cada función.
  • La facilidad para realizar esta integración se enfatiza con la posibilidad de importar herramientas sin complicados procesos de configuración, enfocándose en la simpleza que da la nueva arquitectura.

Reflexiones sobre Arquitectura y Microservicios

«Los servicios orientados a la arquitectura se convirtieron en un lío por la complejidad de la integración.»

  • El orador reflexiona sobre cómo se ha desarrollado la arquitectura de servicios a lo largo del tiempo, desde los primeros enfoques de arquitecturas orientadas a servicios hasta la adopción de microservicios. Enfatiza la búsqueda de soluciones más simples y eficientes a través de modelos de servicios descentralizados.
  • Se destaca que la conversión de la complejidad en sencillez permite que las herramientas sean aprovechadas de manera más efectiva, eliminando la necesidad del trabajo pesado que esto solía requerir, lo que sugiere un cambio hacia una forma más eficiente de integrar y utilizar servicios en la nube.

Evolución de la Tecnología Web y la Importancia del Chat

«Cinco años atrás, si me hubieras preguntado cuál debería ser el MVP para cualquier servicio lanzado, habría dicho que necesitas tener una experiencia de navegador web, una que funcione en escritorio y móvil.»

  • Ya no es suficiente contar solo con aplicaciones móviles para Android e iPhone; la competencia actual exige una experiencia de chat integrada. La simplicidad del chat es fundamental, pero es esencial abordar y resolver las brechas existentes sin caer en complejidades innecesarias.
  • Se hace mención de que el arquitecto debe preservar la simplicidad del actual estado de MCP mientras se llenan los huecos. Esto incluye la implementación de seguridad efectiva: la respuesta simple es utilizar OAuth, que produce tokens que identifican al usuario temporalmente.

Implementaciones y Desafíos de OAuth

«Cuando digo servidores OAuth, me refiero a una entidad que produce tokens que, si los posees, te identifican como actuando en nombre de otra persona.»

  • OAuth es un proveedor de identidad que valora la autenticación y entrega de tokens. Un desafío clave es evitar la creación de nuevas identidades para cada servicio. Para agilizar la experiencia, los desarrolladores están considerando cómo los servidores MCP pueden actuar como servidores de recursos desde su estructura original.
  • La conexión a largo plazo y la gestión de sesiones son otros aspectos destacados. Se discutió la necesidad de poder reanudar una conexión sin tener que empezar desde el principio, lo que se ha incorporado a la especificación.

La Adopción de Tecnologías Modernas en Spring

«En noviembre, dedicaremos tiempo a discutir sobre Spring Framework 7 y Spring Boot 4, que traerán muchas características nuevas.»

  • A medida que avanza el desarrollo de Spring, se anticipa la llegada de nuevas versiones que integran función mejorada de gRPC. Esto es importante ya que la comunidad ha experimentado con numerosos proyectos gRPC, pero muchos no han progresado debido a limitaciones.
  • La implementación de nuevas características con un enfoque en la simplicidad es crucial, permitiendo que Spring AI soporte las nuevas versiones y expandiendo la versatilidad de su implementación.

Reflexiones sobre desarrollo en Java y Rust

«Es un momento realmente interesante para ser un desarrollador de Java y Spring.»

  • La conversación se centra en la evolución del desarrollo en Java, destacando el interés en aprender cosas nuevas y sorprendentes.
  • Se menciona el deseo del presentador de explorar nuevas oportunidades en Java, algo inesperado para él, lo cual resalta la dinámica cambiante en el mundo del desarrollo de software.
  • Los participantes discuten sobre el uso de diferentes lenguajes de programación, específicamente Java y Rust, sugiriendo que ambos seguirán caminos paralelos en el ámbito del desarrollo.
  • Se sugiere que aunque Spring no sería la herramienta adecuada para construir una extensión de kernel, Rust es definitivamente viable para tales tareas.

Agradecimientos y apoyo a la comunidad

«Quiero tomar un breve descanso y agradecer a Madn y Open Rewrite por ser nuestros anfitriones.»

  • Se ofrece un reconocimiento a los patrocinadores que han estado apoyando el podcast a través de Patreon, lo que es fundamental para la continuidad del programa.
  • Se anima a los oyentes a participar en el apoyo a la comunidad, ya sea a través de Patreon o compartiendo episodios con amigos.
  • La interacción con la audiencia es reafirmada como un aspecto clave para el crecimiento y el éxito del podcast.

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *