Aprende Go, el lenguaje backend del futuro

2020-05-21

post-thumb

En los últimos años, un lenguaje en particular ha crecido mucho: GoLang, o simplemente Go. Después de todo, ¿qué emociona más a un desarrollador que un nuevo lenguaje? F̶r̶a̶m̶e̶w̶o̶r̶k̶s̶ ̶J̶a̶v̶a̶s̶c̶r̶i̶p̶t̶

Comencé a estudiar Go debido a los proyectos en Kubernetes en Getup Cloud y después en QueroQuitar gracias al buen incentivo que tuve allí para aprender cosas nuevas. Quien ama programar, siempre está emocionado con nuevos frameworks, soluciones, libs, SOs, etc…

Fue así como junto con Guilherme Caruso , decidimos crear Gommunity . Por cierto, si estás empezando ahora, su serie Goschool fue hecha especialmente para ti.

Hay buenos artículos explicando sobre Go en internet y en Gommunity, así que en este artículo vamos a hablar un poco sobre el momento actual y por qué deberías aprender un nuevo lenguaje.

¿Alguna vez te detuviste a pensar que la Ley de Moore ya no se aplica?

No podemos agregar más caché al procesador para aumentar el rendimiento, ya que el caché tiene límites físicos: cuanto mayor es el caché, más lento se vuelve. Agregar más núcleos al procesador también tiene su costo. Además, esto no puede escalar para siempre.

Si no podemos confiar en las mejoras de hardware, el único camino será un software más eficiente para aumentar el rendimiento. Pero, desafortunadamente, los lenguajes de programación modernos no son muy eficientes. E̶x̶c̶e̶p̶t̶o̶ ̶P̶H̶P̶,̶ ̶e̶s̶e̶ ̶e̶s̶ ̶s̶ú̶p̶e̶r̶ ̶p̶e̶r̶f̶o̶r̶m̶á̶t̶i̶c̶o̶.̶

Tenemos Go Routines

Golang

Sin la posibilidad de esperar que el hardware escale para siempre, el software que desarrollamos y los lenguajes de programación que usamos deben soportar la concurrencia fácilmente y deben ser escalables con el aumento del número de núcleos.

Sin embargo, la mayoría de los lenguajes de programación modernos (como Java, Python, etc.) son del ambiente single-threaded de los años 90. La mayoría de estos lenguajes de programación soportan multi-threading. Pero el problema real viene con la ejecución concurrente, threading-locking, race conditions y deadlocks. Estos problemas dificultan la creación de un sistema/aplicación multi-threaded en estos lenguajes.

Por otro lado, Go fue lanzado en 2009 cuando los procesadores multi-core ya estaban disponibles. Es por eso que Go está construido con la intención de mantener la concurrencia. Go tiene goroutines en lugar de threads. Consumen casi 2 KB de memoria del heap. Entonces, puedes ejecutar millones de goroutines en cualquier momento.

Beneficios:

  • Las goroutines tienen pilas segmentables crecibles. Esto significa que usarán más memoria solo cuando sea necesario. [1] [2]
  • Las goroutines tienen un tiempo de inicio más rápido que los threads. [1] [2] [3]
  • Las goroutines vienen con primitivas integradas para comunicarse de forma segura entre sí (canales). [1] [2]
  • Las goroutines permiten evitar el bloqueo de mutex al compartir estructuras de datos. [1] [2] [3]
  • Además, las goroutines y los threads del SO no tienen un mapeo 1:1. Una sola goroutine puede ejecutarse en varios threads. Las goroutines se multiplexan en un pequeño número de threads del SO. [1]

Go se ejecuta directamente en el hardware

Gopher Love

Un beneficio considerable del uso de C, C++ en relación con otros lenguajes modernos de nivel superior como JavaScript/Python es su rendimiento. Porque C/C++ son compilados y no interpretados.

Los procesadores entienden los binarios. Generalmente, cuando creas una aplicación usando Java u otros lenguajes basados en JVM al compilar tu proyecto, compila el código legible por humanos a bytecode que puede ser entendido por la JVM u otras máquinas virtuales ejecutadas en el SO subyacente. Durante la ejecución, la VM interpreta estos bytecodes y los convierte en los binarios que los procesadores pueden entender.

Código legible por humanos -> VMs -> Procesador

Sin embargo, C/C++ no se ejecuta en VMs y esto elimina una etapa del ciclo de ejecución y aumenta el rendimiento. Compila directamente el código legible por humanos a binarios.

Código legible por humanos -> Procesador

Sin embargo, liberar y asignar variables en estos lenguajes es una tristeza. Mientras que la mayoría de los lenguajes de programación manejan la asignación y eliminación de objetos usando los algoritmos Garbage Collector o Reference Counting.

Go trae lo mejor de ambos mundos. Como lenguajes de nivel inferior como C/C++, Go es un lenguaje compilado. Esto significa que el rendimiento está casi más cerca de los lenguajes de nivel inferior. También usa la recolección de basura para asignar y eliminar los objetos. Por lo tanto, no más declaraciones malloc() y free().

El código escrito en Go es fácil de mantener

Con una sintaxis simple y concisa, Go es un placer para programar.

Los diseñadores de Go en Google pensaron en esto cuando crearon el lenguaje. Como Google tiene una base de código muy grande y miles de desarrolladores estaban trabajando en esa misma base de código, el código debía ser simple de entender para otros desarrolladores y un bloque de código debe tener un efecto secundario mínimo en otro bloque del código. Esto hace que el código sea fácilmente mantenible y fácil de modificar. Go intencionalmente deja fuera muchas características de los lenguajes modernos de POO.

  • Sin clases. Todo se divide solo en paquetes. Go solo tiene estructuras en lugar de clases.
  • No soporta herencia. Esto hará que el código sea fácil de modificar. En otros lenguajes como Java/Python, si la clase ABC hereda la clase XYZ y haces algunos cambios en la clase XYZ, esto puede producir algunos efectos secundarios en otras clases que heredan XYZ. Al eliminar la herencia, Go facilita la comprensión del código también (ya que no hay una superclase que mirar mientras se mira un fragmento de código).
  • Sin constructores. La experiencia con Kotlin también me hace extrañarlos un poco.
  • Sin anotaciones.
  • Sin genéricos. Admito que los extraño en mis maps/filters/reducers (background de JavaScript presente).
  • Sin excepciones.

Los cambios anteriores hacen que Go sea muy diferente de otros lenguajes y hacen que programar en Go sea diferente de otros lenguajes. Puede que no te gusten algunos puntos anteriores. Pero, no es como si no pudieras programar tu solución sin las características anteriores.

Quienes me conocen ya me han visto refunfuñando por tener que escribir for para filtrar.
¿Extraño el operador ternario? Sí :(

A diferencia de otros nuevos lenguajes como Swift , la sintaxis de Go es muy estable. Ha permanecido igual desde el lanzamiento público inicial 1.0 en el año 2012. Esto lo hace compatible con versiones anteriores.

Cree en tus sueños (y en Go)

Aunque Go es muy diferente de otros lenguajes orientados a objetos, sigue siendo lo mismo. Go proporciona alto rendimiento como C/C++, manejo de concurrencia súper eficiente como Java y código divertido como Python/JavaScript/Kotlin.

Si no tienes planes de aprender Go, aún diré que el límite del hardware nos presiona, a los desarrolladores de software, a escribir código súper eficiente. El desarrollador necesita entender el hardware y optimizar el programa en consecuencia.

Mi próximo proyecto será desarrollar alguna solución en Go para mi Raspberry Pi 4, pronto les contaré sobre él aquí. Mientras tanto, hasta pronto, futura marmotita que leyó este texto.