En 2012 escribí un artículo sobre el lenguaje Go y desde entonces no me tomé mucho en serio esa plataforma. Esta última semana después de 6 años y viendo el auge que está teniendo me he propuesto hacer un proyecto. ¿Lo revisamos?
En principio recabé algunos datos sobre el uso de Golang, sí, parece que para no confundir al lenguaje con el verbo y encontrar cientos de páginas antes que el propio lenguaje los creadores y la comunidad de usuarios han accedido a llamarlo golang
en lugar de go
.
Si comenzamos por Github podemos ver que Go ocupa en sus estadísticas el puesto 4. Ha estado incrementando su presencia desde 2012 y sigue en aumento. En el índice TIOBE sin embargo su tendencia parece que desciende este año justamente desde el puesto número 10 hasta el 18. No obstante cabe destacar que ganó dos premios al Lenguaje del Año en 2009 y 2016.
Por otro lado en sitios como remote a día de hoy hay publicadas ofertas de 270 empresas para trabajar en remoto por un sueldo medio de 97.500,00 dólares americanos anuales. Lo que hace un pago mensual de unos 8.125,00 dólares mensuales o al cambio actual 6.968,12 € al mes. Nada mal.
Preparando el entorno
Las herramientas de construcción de Golang son diferentes a las de otros lenguajes con los que he trabajado anteriormente. Si bien lenguajes interpretados deben tener disponible en el sistema el intérprete (como el caso de Python, Ruby o PHP) por otro lado los compilados suelen trabajar con librerías dinámicas que requieren tener instaladas una vez vayamos a ejecutar nuestro código.
Además, muchos compiladores tienden a ser bastante simples (como Java, Erlang, Elixir o C/C++) y compilan únicamente el fichero o ficheros pasados. Para compilar proyectos se requiere de alguna otra herramienta externa (como maven, rebar, mix o make). En el caso de Golan el compilar es la herramienta. Se hace un poco incómodo depender de las variables de entorno para configurar el espacio de trabajo y mantener accesible todo el código para el compilador pero merece la pena. El proceso de compilación se encarga de buscar el código necesario y generar el binario final.
Las ventajas de Golang en este sentido:
- Velocidad. Creo que no he visto ningún sistema compilar más rápido. Gracias a tener acceso a todo el código, no disponer de preprocesador y ser un lenguaje de tipado estático la compilación es increíblemente rápida.
- Portabilidad. Todo se compila de forma estática. Puedes copiar el fichero compilado y llevarlo a otro sistema con la misma arquitectura y correrá sin problemas.
Después lo siguiente es entender cómo funcionan los paquetes y la creación de los comandos.
Escribiendo el código
Después de tanto tiempo escribiendo principalmente para Python, Ruby, Elixir y sobretodo Erlang me propuse escribir un código que emplease grafos para obtener el camino más corto entre dos nodos dados. Al principio empleando mapas pero luego implementando estructuras enlazadas con punteros tal y como aprendí en mis años de carrera.
Me resultó curioso ver lo sencillo que se hace (en comparación a C) montar los códigos y algoritmos típicos (como Dijkstra) en Golang pero me dejó un poco mal sabor de boca encontrar algunas carencias aún en el sistema concurrente (gorutinas) y sin embargo darme de bruces con sugerencias de implementar algunas construcciones como las etiquetas (las que aún se empleaban en C y Pascal junto con goto).
En principio me resultó curioso que al igual que pasa con Elixir, el nombre de los ficheros es accidental. Los directorios tienen parte de responsabilidad sobre los paquetes pero tampoco excesivamente al final. Lo importante es agrupar los ficheros que pertenezcan al mismo paquete e intentar mantener una correlación entre el nombre del fichero y lo que contiene. Deja un poco al programador la responsabilidad de la organización.
La disponibilidad de librerías para realizar el código es algo que me sorprendió para bien. Tanto las librerías disponibles de forma nativa para el lenguaje como la cantidad de librerías que puedes encontrar en sitios como Github o Bitbucket. Además agregar una dependencia es tan simple como incluir en el fichero de código donde necesitas ese código la importación de dónde se encuentra en Internet. Golang se encarga del resto.
Aún no puedo enseñar nada del código pero pronto publicaré algo.
Paradigmas
Como dije al principio mi principal lenguaje de programación es Erlang. En Erlang al igual que en Golang la programación basada en lanzar procesos paralelos con coste reducido es una buena práctica y muy difundida pero la diferencia entre ambos es que Erlang dispone de estructuras que permiten monitorizar y supervisar procesos porque las metodologías de desarrollo permiten tanto mantener procesos longevos como procesos de corta duración para hacer tan solo una tarea específica.
En Golang parece que la tendencia es la segunda. Crear procesos pequeños para tareas específicas. Además de tratar los fallos como retornos y no como excepciones. De hecho las excepciones no existen en Golang. Teniendo en cuenta que hay mucha gente que piensa que las excepciones son el goto de la programación estructurada esto puede ser muy positivo.
El paradigma que parece que se impone en Golang es el de la programación orientada al raíl. En ciertas ocasiones da la sensación de tratarse de nuevo de programación defensiva pero va más allá. Este modelo de programación simplifica mucho el flujo típico aislando y normalizando los posibles fallos y manteniendo la línea ideal de ejecución clara para el programador. Hablaré de ello en otro artículo ya que da para una buen charla.
Conclusiones
Quería haber podido explicar aún más de lo que he hecho porque me ha gustado mucho zambullirme en Golang y poder desarrollar algo en este lenguaje. Me ha gustado volver a sentir que los procesos de compilación pueden ser simples y rápidos, obtener un ejecutable portable y simple para el usuario final y me ayuda a entender porqué es el lenguaje de preferencia para la creación de herramientas como Docker.
En mis procesos de aprendizaje me gusta escribir mucho porque me gusta reflexionar y entender mejor lo que estoy aprendiendo. Enseñar es otra forma y aprovecho en principio este blog para ello. Últimamente incluso hasta la escritura de libros.
¿Te ha llamado la atención como a mi Golang? ¿te interesaría aprender más sobre este lenguaje? ¿ya lo has empleado en algún proyecto profesional o personal? ¡Déjanos tu comentario!