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

Nicolás Quiroz
Jul 25, 2017 · 7 min read
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

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?

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

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

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

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

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

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

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

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

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

Es open source y multi-plataforma

Está en ascenso

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

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

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!

Aprendiendo Go

Capítulos semanales en español sobre programación en el lenguaje Go

Nicolás Quiroz

Written by

Dev🖥🚀 | Co-organizo freecodecampba.org | nicolasquiroz.com

Aprendiendo Go

Capítulos semanales en español sobre programación en el lenguaje Go

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade