Capítulo 0: ¿Por qué aprender Go?

Nicolás Quiroz
Aprendiendo Go
Published in
7 min readJul 25, 2017
Septiembre del 2007, mail de Rob Pike sugiriendo el nombre “Go.”

¡Llegamos al primer capítulo!

Es el capítulo cero porque hoy no vamos a escribir código, sino a tratar de entender las razones por las que existe esta tecnología y por qué deberías aprenderla.

Empecé a aprender Go hace ~2 meses. Es un lenguaje que a mi particularmente me gusta mucho, porque se alinea con muchas de las ideas que tengo sobre qué es la programación y cómo debería funcionar.

Paso entonces a contarte un poco.

Se llama Go, no Golang

Lo primero: el lenguaje se llama Go. El tema es que, si buscás “Go” en Google es complicado porque es un término que se refiere a muchas cosas…

Entonces por razones de SEO a veces vas a encontrar otros tutoriales, artículos, cursos, etc donde usan el término Golang. Pero se llama Go a secas.

La web oficial misma lo usa.

Ahora si, sigamos.

¿Por qué programamos?

Esto es algo que me pregunto bastante seguido. Estoy de acuerdo con mucha gente en que programar es resolver problemas.

No escribir código.

Pero también con que es generar conocimiento sobre el problema que estamos intentando resolver.

No escribir código.

¿A dónde voy? A que escribir código es parte del proceso, pero no es el proceso.

Y el lenguaje que estemos usando como tal tiene que servirnos para ese proceso. Es una herramienta más en nuestra caja, pero no el fin.

¿No está bueno entonces que las herramientas que usemos nos faciliten el trabajo?

Bueno, por ahí viene la mano con Go.

Diseñando un lenguaje al servicio del desarrollo de software

En esta charla, Rob Pike explica por qué se creó Go.

Te lo resumo muy rápido (después mirala): se pasaron años analizando los problemas que tenían los ingenieros de Google durante el proceso de desarrollo.

Google quería contar con una herramienta que les permita construir software rápido, que facilite el trabajo en equipo, que prevenga todos los errores que pueda en tiempo de compilación, detecte potenciales bugs a tiempo, que consuma pocos recursos y tenga buena performance.

Que facilite el trabajo y les permita enfocarse mucho más en la tarea de entender y resolver problemas y menos en lidiar con las herramientas que usan para el proceso.

Compila muy rápido

Imaginate que estás trabajando en Google. ¿Cuánto tiempo perdés cada vez que compilás un archivo de C++, de varios miles de líneas de código para saber si el cambio que hiciste arregló o no algo? Y todavía te falta testear.

Además, en cada archivo tenés dependencias, librerías que usás. Tal vez estés importando muchas más de una vez. Esto es trabajo innecesario y consume más tiempo del que debería.

Por eso Go tiene un sistema de dependencias “plano”, nada se incluye más de 1 vez y es una de las razones por las que compila casi instantáneamente.

En la práctica parece un lenguaje interpretado.

Tiene una sintaxis muy limpia y explícita

Go tiene una sintaxis clara, concisa, limpia y eso me parece importante, no sólo porque escribimos menos, sino porque hace al código más legible y entendible.

Acordate que estamos intentando entender y resolver problemas, y queremos que el resto de la gente entienda nuestras ideas. Para eso tienen que leer nuestro código.

Está preparado para construir las aplicaciones de hoy… y del futuro

¿Escuchaste hablar de la concurrencia?

Sino no importa, te cuento: se trata de lidiar con muchos problemas a la vez (no es lo mismo que hacer muchas cosas a la vez).

Algo así como lo que hacemos todos los días, por ejemplo, cuando le mandás un mail a alguien: no te quedás esperando a que te responda para seguir con tus cosas. Seguís con tus cosas y cuando te responden, leés la respuesta. Eso es lidiar con muchos problemas a la vez.

Esto mismo en programación se conoce como concurrencia ¿Por qué es necesaria? Por que el software que desarrollamos es cada vez más masivo, complejo y hace cada vez más cosas.

¿Qué necesitamos para programar de forma concurrente? Lenguajes que lo soporten y lo hagan bien.

No son la mayoría. Esto tiene motivos históricos: pensá que la mayoría de los lenguajes fueron diseñados antes de que existieran los procesadores con más de 1 núcleo. Era todo single-thread y por lo tanto el software y los lenguajes estaban pensados para funcionar en ese contexto y no en el actual.

Este artículo explica eso con detalle.

Hoy es al revés, es muy raro conseguir procesadores nuevos de 1 sólo núcleo.

Pero no alcanza con tener el hardware, también necesitamos software diseñado para aprovechar esto.

Tiene un compilador muy estricto

Go es un lenguaje que compila a código nativo.

El compilador trae funcionalidades de muchas herramientas externas como los linters que solés usás con otros lenguajes.

El chequeo de errores en tiempo de compilación incluye por ejemplo, detectar variables y paquetes declarados pero no usados.

Es eficiente

Intenta aprovechar lo recursos lo mejor posible, usar la menor cantidad de procesador y memoria.

Antes hablábamos de concurrencia. A diferencia de otros lenguajes donde manejás threads, en Go la concurrencia es nativa, es parte del lenguaje, no usa los threads del sistema operativo: cada thread (se llaman goroutines) en Go consume apenas 2kb de RAM.

La simpleza como feature

Como venimos viendo, Google desarrolló Go con objetivos muy claros: hacer que el proceso de desarrollo sea más simple, eliminar todas las fricciones posibles, facilitarnos el trabajo.

Esto implica tener no sólo una sintaxis simple sino también un lenguaje minimal.

Es por esto que Go tiene pocas features. Las necesarias. Algunos dirán que le faltan cosas, como los generics. Es algo que está en discusión y quizás aparezca más adelante, en futuras versiones del lenguaje.

Where are my generics?!

También tenés gente que te dice que no es necesario agregarlas.

Veamos algunas características:

  • No es orientado a objetos: no hay objetos, clases ni herencia.
  • No es funcional, aunque tiene first-class functions
  • No hay excepciones.
  • Tiene muy pocas keywords.
  • Scope simple (dentro del bloque, a nivel del paquete o global), no hay scope “privado”.
  • Todos los valores se pasan por copia.
  • Inferencia de tipos.
  • Tiene punteros, pero no aritmética de punteros a la C/C++.
  • Garbage collector para el manejo automático de memoria.
  • Un sólo tipo de loop: for
  • Es fácil desplegar aplicaciones escritas en Go: generás un binario y lo ejecutás. Listo.

Todas estas cosas hacen que aprender y usar el lenguaje sea más sencillo.

También, como mencionamos anteriormente, nos permite programar de forma concurrente con facilidad.

Todo esto es algo que Russ Cox llama The Go Balance: elijamos qué cosas queremos hacer bien y hagámoslas, saquemos el resto.

How does Go accomplish those things?

How does it make scalable concurrency and scalable software development easier?

Most people answer this question by talking about channels and goroutines, and interfaces, and fast builds, and the go command, and good tool support. Those are all important parts of the answer, but I think there is a broader idea behind them.

I think of that idea as Go’s balance. There are competing concerns in any software design, and there is a very natural tendency to try to solve all the problems you foresee. In Go, we have explicitly tried not to solve everything. Instead, we’ve tried to do just enough that you can build your own custom solutions easily.

The way I would summarize Go’s chosen balance is this: Do Less. Enable More.

Go can’t do everything. We shouldn’t try. But if we work at it, Go can probably do a few things well. If we select those things carefully, we can lay a foundation on which developers can easily build the solutions and tools they need, and ideally can interoperate with the solutions and tools built by others.

Te dejo también la versión en video. Mirala que está muy buena.

Librería estándard muy completa y muchas herramientas incluídas

Querés formatear tu código? gofmt.

Testear? Ya tenés un framework de testing incluído.

Querés hacer benchmarks, profiling? Podés.

Documentar? También tenés herramientas para eso.

La librería standard de Go ya trae un montón de cosas para que puedas hacer casi lo que se te ocurra sin recurrir a librerías externas o frameworks.

De nuevo, todo esto está pensado para que usemos el tiempo para entender y resolver problemas y no para lidiar con los nuevos problemas que nos traen las herramientas que usamos.

Es estable

Todo el código que podés escribir hoy con la última versión del lenguaje es compatible con la primer versión que se hizo pública en Marzo del 2012, por lo que es un lenguaje maduro y robusto a pesar de su corta edad.

Es open source y multi-plataforma

No importa dónde estés, vas a tener soporte asegurado y que se trate de un proyecto abierto te da cierta tranquilidad de que no desaparezca de un día al otro y esté en constante evolución.

Está en ascenso

A pesar de todavía tratarse de un lenguaje “de nicho”, el interés por el mismo está creciendo mucho últimamente y probablemente lo siga haciendo.

Según cálculos estimados, la cantidad de usuarios de Go en el mundo está entre medio millón y 1 millón.

Evolución constante

La versión 1.x de Go tiene poco más de 5 años. Ya se está empezando a desarrollar la versión 2 del lenguaje.

Claramente ayuda mucho tener a Google atrás invirtiendo en el desarrollo del mismo, pero también es una señal de que hay cada vez más tracción de parte de la comunidad y ya no es sólo una herramienta que le sirve a la gente del buscador. Fijate acá.

Te dejo otra charla muy reciente de Russ Cox, en la GopherCon, donde habla de lo que se viene.

Conclusión

Ese fue un repaso de las cosas que nos ofrece Go, los motivos por los que fue creado y por qué está bueno usarlo.

No te preocupes si no entendiste algún término o concepto, la idea de estos tutoriales es ir aprendiéndolos, ya vamos a verlos en más detalle.

Si todavía no lo hiciste, te recomiendo tener instalado Go para los próximos tutoriales.

En el próximo capítulo vamos a hablar un poco sobre los paquetes en Go y a escribir el obligado Hola Mundo.

Si querés recibir las actualizaciones en tu correo cuando se publique un nuevo tutorial, ¡suscribite al newsletter!

Si te gustó este artículo, ¿me harías el favor de recomendarlo y compartirlo en tus redes?

¡Gracias!

--

--