Cuando me enteré de la existencia de Go, el propio lenguaje de programación de Google, quedé intrigado. Diseñado y lanzado en 2007, Go, también conocido como Golang, se encontraba entre una multitud de nuevos lenguajes -Rust, D, Nim, Scala, Clojure- que generaban expectación a principios y mediados de la década de 2010: En aquel momento, los programadores parecían ansiosos por alejarse de la verborrea de los lenguajes de fondo más antiguos (Java, C++), así como de la ineficiencia computacional y la inseguridad de tipos de los lenguajes dinámicos utilizados en la web (PHP, Ruby, Python). Querían seguridad de tipos, lo que significaba que querían tipado estático. Y querían velocidad.
Fue fácil encontrar historias sobre startups, como IronMQ, que pasó de tener docenas de servidores utilizados para alojar Rails a un par que podían alojarse en un lenguaje como Go. Y como alguien que estaba, en ese momento, empapado de PHP5 y todos sus problemas, me conté entre la multitud de los interesados.
Cuando conocí Go, en mi antiguo trabajo como CTO en ActiveCampaign, intenté escribir algo de código en él. Y no me gustó. Me daba problemas cada vez que dejaba una variable sin usar o importaba un paquete sin usar. Go era particularmente estricto en cuanto a la tipificación: estaba familiarizado con la coerción de tipos de PHP, pero también estaba acostumbrado a C y C++, que te permitían mezclar enteros con y sin signo, así como mezclar tamaños de enteros (16 bits, 32 bits, 64 bits).
Go no tenía genéricos. De hecho, uno de sus principales diseñadores de lenguaje (Rob Pike) fue bastante estridente sobre lo que le faltaba al lenguaje. Como dijo Pike, esto era algo bueno, y bueno para ti. El lenguaje fue diseñado para los ingenieros «medios» que trabajaban en Google, si se les puede llamar así. En cierto sentido, lo que se leía sobre Go en aquella época parecía un menosprecio. Y a día de hoy, no es difícil encontrar gente que siga compartiendo esa crítica.
¿Qué me hizo cambiar de opinión?
Go es sencillo. Se distingue de otros lenguajes en ese sentido. La simplicidad es una virtud, y cualquier complejidad que uno introduzca en el lenguaje es cuidadosamente considerada.
Durante mucho tiempo -demasiado tiempo, si se pregunta a algunos- Go carecía de una verdadera gestión de paquetes. No fue hasta 2018-después de varias rondas de participación de la comunidad y un gestor de paquetes experimental no oficial llamado «dep»-que se añadió al lenguaje cualquier soporte oficial para su solución («módulos»).
Pero dentro de esa simplicidad encuentras mucho valor. Puedes escribir fácilmente algunas líneas de código en Ruby que hacen cosas geniales, pero escondido en esas líneas de código hay mucha magia: es difícil para el desarrollador sin pretensiones comprender siempre el proceso que ocurre detrás de las escenas. Tal vez se necesiten cinco líneas de código para escribir lo mismo en Go, pero se sabe lo que hacen esas cinco líneas.
Go también elimina uno de los conceptos clásicos de la POO: la herencia. No puedes escribir una clase base en Go y que otra clase herede de ella. De hecho, no tienes «clases» en absoluto.
Al principio, se siente como una tremenda restricción para tener una de las herramientas básicas de la reutilización del código y la encapsulación tomada de ti. Y es natural que tu primera inclinación sea un sentimiento de resentimiento.
Pero, hoy en día, a menudo no utilizas la herencia, incluso si pudieras. Usas interfaces, te centras en el comportamiento y las abstracciones, y esto lo puedes hacer fácilmente en Go. De hecho, es todo lo que puedes hacer en Go. Después de un tiempo, la falta de herencia se siente bien porque estás evitando una capa de deuda técnica al no tener que revisar el peligroso nido de relaciones que habías construido usando la herencia. Tal vez Pike estaba en algo después de todo.
Hoy en día, Go se ha hecho un hueco definido en la ecosfera del lenguaje. No está tratando de reemplazar a C++, como alguna vez se pensó (y se sugirió). Mientras que hace 10 años se pensaba que se necesitaba Java para un determinado proyecto, hoy en día es mejor optar por Go.
Lenguajes para aprenderLos líderes de la ingeniería hablan de Ruby on Rails, C#, Python y JavaScript