Saltar al contenido
Trovadores
Archivo rescatado de la blogosfera española, 2003-2006

Go se publicó en 2009, lo llamaron «el lenguaje para tontos» y hoy la nube entera corre encima

Publicado
Sección
General
Firma
sofia_salas
Sala de reuniones con una pizarra llena de diagramas

El 21 de septiembre de 2007, a las dos de la tarde, tres ingenieros se metieron en una sala de reuniones llamada Yaoundé, en el edificio 43 del campus de Google en Mountain View. Robert Griesemer, Rob Pike y Ken Thompson. Salieron de allí con el boceto de un lenguaje de programación nuevo. Cuando lo publicaron, dos años después, buena parte de la profesión se rió de ellos.

Hoy, casi todo lo que llamamos «la nube» está escrito en ese lenguaje.

El problema era esperar

Lo que había detrás de aquella reunión no era una ambición intelectual, era una molestia diaria. En Google el software se escribía sobre todo en C++, todo el código de la empresa vivía junto y cualquier cambio arrastraba a medio mundo detrás. Los ingenieros se pasaban las mañanas esperando a que la máquina tradujera su código, que es lo que significa compilar.

En 2007, los responsables del sistema de compilación de Google instrumentaron el montaje de uno de sus binarios grandes para ver qué estaba pasando. El resultado que Rob Pike contó después en una conferencia: una vez expandidos todos los ficheros de cabecera, al compilador se le estaban entregando más de ocho gigabytes de texto. Aquel binario tardaba cuarenta y cinco minutos en construirse, y eso repartiendo el trabajo entre muchas máquinas a la vez.

El mecanismo tiene nombre y es viejísimo. En C y en C++, un fichero de cabecera es un trozo de código que se pega dentro de otro antes de compilar. Si A incluye a B y B incluye a C, el compilador acaba leyendo C aunque nadie lo pidiera. Pike lo ilustraba con un dato de 1984: una compilación de ps.c, el código del comando de Unix que lista los procesos, acababa incluyendo el fichero sys/stat.h treinta y siete veces. Veintitrés años después, el mismo mecanismo movía ocho gigabytes por binario.

Thompson ya había visto morir algo por exceso. En los años sesenta trabajó en Multics, el sistema operativo que iba a tenerlo todo, y lo vio hundirse bajo su propio peso: el manual ocupaba metros de estantería para algo que aún no funcionaba. De ahí sacó lo que llamaba el síndrome del segundo sistema, la enfermedad de meterle a la segunda versión todo lo que no cupo en la primera. Bell Labs se salió del proyecto y a Thompson le prohibieron tocar sistemas operativos. Escribió Unix igualmente, en una PDP-7 vieja que nadie miraba, aprovechando tres semanas de 1969 en las que su mujer se había ido a California con el niño. De aquel sistema descienden hoy macOS y, por imitación, Linux y Android.

Pantalla de terminal con una compilación en marcha
Cuarenta y cinco minutos por binario, repartidos entre muchas máquinas a la vez.

La regla de los tres

El acuerdo con el que empezó Go fue una regla sola, y explica el lenguaje entero mejor que su documentación: ninguna característica entraba si los tres no coincidían en que era la correcta. No valía que a uno le gustara mucho. No valía el «estaría bien tenerla». Los tres o ninguno.

Con tres cabezotas de perfiles distintos haciendo de filtro —Griesemer venía de las máquinas virtuales y se había leído el manual de cualquier lenguaje moderno que le nombraran; Thompson llevaba décadas construyendo lenguajes y compiladores; Pike sufría los tiempos de compilación de Google desde dentro—, casi nada sobrevivía. Griesemer lo resumió como reducirlo al mínimo indispensable. Mientras el resto del sector competía por añadir, ellos diseñaban por resta.

Go se publicó el 10 de noviembre de 2009, abierto y gratis. Y la profesión abrió el manual buscando lo de siempre.

Lo que faltaba

No tenía tipos genéricos, esas piezas de código que escribes una vez y valen igual para números que para texto. No tenía excepciones. No tenía herencia. La lista de ausencias circuló deprisa: un lenguaje nacido en 2009 con menos cosas que el Java de 1995.

El desprecio se organizó rápido y con formatos propios de la época: hubo webs dedicadas a atacarlo y un repositorio en GitHub que coleccionaba, como cromos, cada artículo que explicaba por qué Go era malo.

El mote llegó en 2012, y se lo puso el propio equipo sin querer. Explicando en una charla para quién habían diseñado el lenguaje, Pike dijo que los programadores de Google son gente joven, recién salida de la carrera, que aprendió Java, quizá C o C++, probablemente Python, y que «no son capaces de entender un lenguaje brillante», pero que la empresa quería que construyeran buen software con él. La traducción de internet fue instantánea: nuestros programadores no dan para tanto, así que les hemos hecho uno simple. Go pasó a ser el lenguaje para tontos.

En marzo de 2015, un desarrollador británico llamado Gary Willoughby publicó el artículo que mejor resumió esa posición, con un título que ya era una bofetada: por qué el diseño de Go es un flaco favor a los programadores inteligentes. El argumento no era que el lenguaje fuera pobre, sino que quitarle herramientas a quien sabe usarlas es tratarle como a un niño.

Quién pagaba esto

Conviene mirar la parte aburrida, porque explica la diferencia con casi todo lo demás que se cuenta en esta casa. Go no tenía modelo de negocio. No había licencias que vender, ni versión de pago, ni empresa detrás buscando rentabilizarlo. Google pagaba los sueldos de un equipo pequeño porque el lenguaje le resolvía un problema interno de miles de millones: sus propios tiempos de compilación y sus propios servidores. Todo lo demás salió abierto desde el primer día, y por eso lo que vino después pudo pasar sin pedirle permiso a nadie.

Lo ganó una característica aburrida

En 2013, mientras en los foros se discutía la dignidad de los lenguajes, en los sótanos de la industria se estaba montando otra cosa. Un francés llamado Solomon Hykes presentó en una charla relámpago un proyecto que ni siquiera funcionaba del todo: Docker, una forma de meter un programa con todo lo que necesita en una caja que corre igual en cualquier servidor.

La pieza que decidió la partida no tenía nada de brillante. Un programa escrito en Go se compila en un único fichero que se copia y funciona: sin instalar nada, sin arrastrar dependencias, sin que el servidor de destino tenga que llevar encima las bibliotecas correctas. Meter eso en un contenedor son dos líneas. En el mundo de antes, poner un programa en un servidor era un proyecto con gente dedicada a ello.

Detrás vino la avalancha, y nadie la coordinó. Google liberó Kubernetes en junio de 2014, escrito en Go. Y después etcd, Terraform, Prometheus, Helm, Istio. Empresas distintas, que no hablaban entre ellas, eligiendo lo mismo por su cuenta y por las razones exactas que la crítica consideraba de principiantes: que se aprende en una semana, que el resultado es un fichero que se copia, y que el código lo entiende el que llega después.

Ahí estaba la trampa del debate. Go no se diseñó para lucirse escribiéndolo, se diseñó para leerse, porque el código se escribe una vez y se lee durante años, casi siempre por gente que no estaba cuando se escribió. Trae incluso una herramienta oficial, gofmt, que formatea el código por ti; nadie obliga a usarla, la usa todo el mundo, y el efecto secundario es que en Go las discusiones eternas sobre dónde va cada llave no existen.

Qué quedó

Pike volvió al escenario en 2015, en la conferencia dotGo de París, con una charla titulada «la simplicidad es complicada». Allí dijo lo contrario de lo que se esperaba de él: que Go no es simple, que es de las cosas más complicadas en las que ha trabajado, y que aun así se siente simple. La complejidad no desaparece; la paga quien construye la herramienta para que no la pague quien la usa.

Los genéricos, la ausencia más criticada durante una década, entraron por fin en marzo de 2022 con la versión 1.18. El equipo tardó tanto porque cualquier añadido tenía que encajar con las interfaces del lenguaje, y las implementaciones que no encajaban acabaron en la basura una detrás de otra.

Y el artículo de Willoughby sigue en pie, con una nota que su propio autor le añadió arriba del todo años después: que su opinión era errónea cuando lo escribió, que hoy considera Go uno de los mejores lenguajes que ha usado, y que trabaja como ingeniero de Go. El texto y la rectificación conviven en la misma página, que es una forma bastante limpia de dejar el registro de lo que uno pensaba.

Thompson, que tiene ochenta y tantos años y se describe como empleado virtual, cuenta que hoy escribe casi exclusivamente en Go. Nadie del equipo pidió perdón por haberlo hecho simple. No hizo falta contestar a nada: cada contenedor que arranca en cualquier parte del mundo lo hace sobre software escrito en el lenguaje al que llamaron tonto.