Go nació porque Google tardaba horas en compilar: la apuesta de Ken Thompson por simplificar

En 2007, Google tenía un problema con pinta de tontería para una empresa con algunos de los mayores recursos de computación del mundo: algunos de sus proyectos gigantes en C++ tardaban muchos minutos, a veces horas, en compilar. Ken Thompson, el creador de Unix y ganador del premio Turing, se unió a Robert Griesemer y Rob Pike para diseñar un lenguaje que atacara parte de ese problema quitando complejidad de en medio. De ahí salió Go, presentado en público en 2009 y adoptado más tarde por proyectos de infraestructura como Docker, Kubernetes, Prometheus y Terraform.

La historia de Go en 20 segundos

  • Robert Griesemer, Rob Pike y Ken Thompson empezaron a diseñar Go en Google el 21 de septiembre de 2007.
  • Los tiempos de compilación larguísimos en proyectos grandes fueron una de las motivaciones reconocidas del lenguaje.
  • Go apostó por compilar rápido, traer herramientas integradas y mantener un lenguaje deliberadamente pequeño.
  • Esa sencillez le costó críticas, sobre todo por ausencias como los genéricos.
  • Go 1.18 acabó trayendo los genéricos en marzo de 2022.

La historia se suele contar como una rebelión contra C++, pero la realidad tiene más matices. Go no nació porque a Thompson le pareciera malo otro lenguaje de programación. Google estaba construyendo sistemas con decenas de millones de líneas de código, mantenidos por cientos o miles de desarrolladores y conectados mediante grafos de dependencias enormes. Rob Pike explicó más tarde que las compilaciones podían tardar horas incluso con grandes clústeres de compilación disponibles.

La documentación oficial de Go confirma también que esperar a que un servidor grande de Google terminara de compilar fue una de las motivaciones originales del lenguaje. El objetivo era crear algo más adecuado para el tipo de software a gran escala que Google desarrollaba y operaba.

El problema que Go quiso resolver era el desarrollo de software a escala

La filosofía detrás de Go se entiende mejor si miramos varias décadas atrás.

Ken Thompson había trabajado con Dennis Ritchie y otros investigadores de Bell Labs en Unix, un sistema operativo cuya influencia acabó extendiéndose mucho más allá de su propio código fuente. Linux no deriva directamente de ese código, aunque reproduce buena parte del modelo Unix; Android usa el kernel de Linux, mientras que macOS pertenece a otra rama histórica distinta, construida alrededor de Darwin y tecnologías heredadas de BSD, NeXT y Mach.

Llamar a Thompson «el padre de todos los sistemas operativos modernos» queda muy bien como titular, pero no es del todo exacto. Su influencia es enorme, aunque el árbol genealógico real es bastante más complicado.

Décadas después, Thompson se topó con un problema de ingeniería que ya conocía de sobra: cómo evitar que un sistema acumule tanta complejidad que esa misma complejidad acabe frenando el desarrollo.

El 21 de septiembre de 2007, Robert Griesemer, Rob Pike y Ken Thompson se pusieron delante de una pizarra a esbozar los objetivos de un lenguaje nuevo, según cuenta la propia documentación de Go.

El tiempo de compilación no era el único problema.

Google trabajaba con programas enormes mantenidos a la vez por equipos de ingeniería grandes. En ese contexto importa la velocidad de compilación, pero también cuánto cuesta entender el código de otro, analizar las dependencias, incorporar desarrolladores nuevos y mantener las herramientas internas.

Go intentó atacar varios de esos problemas desde el propio diseño del lenguaje.

En vez de ir añadiendo mecanismos sin parar para dar cabida a todos los estilos de programación posibles, sus creadores recortaron a propósito el número de decisiones disponibles.

Ese enfoque tuvo una consecuencia interesante para las organizaciones de ingeniería: menos opciones individuales podían traducirse en más coherencia en todo un equipo.

Uno de los ejemplos más claros sigue siendo gofmt.

En muchos lenguajes, los equipos de ingeniería mantienen guías de estilo enormes sobre indentación, espacios en blanco, saltos de línea y dónde va cada cosa. Go trae una herramienta oficial que estandariza automáticamente el formato del código fuente.

La documentación oficial describe automatizar tareas rutinarias, formato incluido, como uno de los objetivos generales del lenguaje.

Para un desarrollador suelto, el formato puede parecer un detalle menor. En un repositorio que mantienen cientos de ingenieros durante años, elimina de un plumazo toda una categoría de decisiones y de discusiones.

De las críticas por funciones ausentes al lenguaje de la infraestructura cloud

La sencillez tuvo un precio.

Las primeras versiones de Go carecían de funciones que los desarrolladores ya daban por hechas en cualquier lenguaje moderno. No tenía genéricos, por ejemplo, y tampoco adoptó el modelo tradicional de excepciones ni las jerarquías de herencia de clases que se conocen de Java y C++.

Esas decisiones se ganaron críticas casi desde el momento en que Go se hizo público.

Una explicación bastante conocida de Rob Pike sobre el tipo de programadores a los que Google necesitaba que Go sirviera ayudó también a que se extendiera la idea de que el lenguaje se había simplificado a propósito para programadores poco sofisticados. La interpretación popular acabó generando etiquetas como «lenguaje para programadores torpes», aunque reducir la postura de Pike a esa frase deja fuera buena parte de su argumento real: Google necesitaba software que equipos enormes pudieran entender y mantener durante mucho tiempo.

El lenguaje encontró un entorno especialmente favorable pocos años después.

El auge de los contenedores, los sistemas distribuidos y la infraestructura cloud generó demanda de software relativamente fácil de compilar, distribuir y desplegar.

Go encajaba bien ahí.

Docker se desarrolló principalmente en Go. Kubernetes, publicado originalmente por Google en 2014, también eligió Go. Detrás llegaron proyectos que hoy forman parte del día a día de administradores de sistemas, SRE y equipos de DevOps, como Prometheus y buena parte de los componentes del stack cloud-native.

Terraform, creado originalmente por HashiCorp, es otro ejemplo destacado de Go aplicado a herramientas de infraestructura.

No hay una sola función que explique esa adopción.

Go junta compilación nativa, concurrencia integrada mediante goroutines y channels, gestión automática de memoria, una biblioteca estándar amplia y un conjunto de herramientas bien integrado entre sí.

También puede generar ejecutables especialmente cómodos de distribuir en muchos escenarios de despliegue.

Para software de infraestructura eso tiene consecuencias prácticas. Un proveedor puede entregar un ejecutable sin obligar necesariamente a los administradores a preparar todo un entorno de ejecución equivalente al que usó el equipo de desarrollo.

Go tampoco exige un sistema de compilación externo para los casos habituales.

El propio proyecto explica que uno de sus objetivos originales era que el código fuente llevara la información suficiente para compilarse a sí mismo, reduciendo la necesidad de Makefiles obligatorios o configuraciones equivalentes.

Esa combinación le abrió a Go un mercado donde su aparente austeridad se convirtió en ventaja operativa.

Go acabó aceptando los genéricos sin renunciar a su filosofía

La historia no se quedó congelada en las decisiones que se tomaron en 2009.

Durante años, una de las peticiones más repetidas de los desarrolladores de Go fue soporte para programación genérica.

El equipo se resistió hasta encontrar un diseño que le pareciera compatible con el resto del lenguaje.

Go 1.18 acabó trayendo los genéricos el 15 de marzo de 2022, mediante tipos parametrizados. El propio proyecto Go lo describió como el cambio más grande del lenguaje desde que se liberó como código abierto.

La incorporación es interesante precisamente porque demuestra que sencillez no es sinónimo de inmovilismo.

Go añadió una función a la que se había resistido durante más de una década, y siguió recomendando usarla solo donde aporta un beneficio concreto. Ian Lance Taylor resumió después esa filosofía recomendando empezar por escribir funciones normales e introducir parámetros de tipo cuando su utilidad se vuelva evidente, en lugar de diseñar los programas alrededor de abstracciones genéricas desde el principio.

El lenguaje sigue moviéndose.

Una publicación oficial del proyecto Go fechada el 26 de agosto de 2026 explica que Go 1.27 trae métodos genéricos, ampliando el modelo de genéricos que arrancó con Go 1.18.

Casi dos décadas después de aquella primera sesión frente a la pizarra en Google, la historia de Go se puede mirar con bastante más perspectiva.

No «humilló» a C++, a Java ni a ningún otro lenguaje moderno. Todos ellos siguen resolviendo problemas para los que Go quizá no sea la mejor opción.

Lo que Go sí demostró es algo que interesa especialmente a desarrolladores y administradores de sistemas: un lenguaje de programación puede ganar terreno no por ofrecer más posibilidades, sino por reducir el número de decisiones necesarias para construir, leer, compilar y desplegar software.

El problema que Thompson, Pike y Griesemer intentaban resolver en 2007 no era cómo crear el lenguaje más sofisticado.

Era cómo permitir que grupos grandes de ingenieros construyeran sistemas grandes sin que la complejidad del propio proceso de desarrollo se convirtiera en otro problema de ingeniería más.

La presencia posterior de Go en Docker, Kubernetes y buena parte del software de infraestructura cloud convirtió esa decisión de diseño en algo bastante más importante que otro debate sobre lenguajes de programación.

Preguntas frecuentes

¿Por qué creó Google el lenguaje Go?

Los tiempos de compilación larguísimos y la dificultad de trabajar con bases de código enormes fueron parte de las motivaciones. Google también necesitaba herramientas adecuadas para software mantenido por equipos de ingeniería grandes y desplegado a gran escala.

¿Quién creó Go?

Robert Griesemer, Rob Pike y Ken Thompson empezaron a definir el lenguaje en Google el 21 de septiembre de 2007. Go se anunció públicamente en noviembre de 2009.

¿Por qué se usa tanto Go en infraestructura cloud?

Su compilación nativa, el modelo de concurrencia, las herramientas integradas y lo fácil que resulta distribuir sus ejecutables encajan bien con servicios de red y software de infraestructura. Kubernetes, Docker y Prometheus son ejemplos destacados.

¿Go tiene genéricos?

Sí. Go 1.18 introdujo los genéricos en marzo de 2022, más de una década después de que el lenguaje se hiciera público. El modelo de genéricos ha seguido evolucionando desde entonces.

Fuentes

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP