sábado, julio 26, 2014

Impresiones Go (golang)


Tal y como todos sabéis (después de la paliza que he dado durante estos días) durante la PiWeek me dedique a aprender el lenguaje Go.

Este post resume mis sensaciones sobre este lenguaje en el poco tiempo que lo llevo usando. Desde luego estas son mis opiniones, son intransferibles y cambian con el tiempo... (como todo).
:-)

Me ha gustado

  • Facilidad de expresar concurrencia. Esta parte en realidad me ha encantado, definir patrones de concurrencia usando comunicación por canales ha resultado muy sencillo y en nada de tiempo he desarrollado soluciones que solo de pensar en desarrollarlas y depurarlas en C++, me da dolor de cabeza. (Entiendo que los patrones aprendedidos en la ErlangCamp con actores y todo lo leído sobre sistemas distribuidos ha ayudado a que resulte fácil).
  • Me ha encantado la eficiencia en memoria de las soluciones generadas (comparando con el equivalente en python, ruby o en java).
  • Da gusto ver los ocho cores aumentando y disminuyendo su carga de forma uniforme. :-)
  • Generar  binarios estáticos o dinámicos que sólo dependen de la libc o la libpthreads es una delicia, sobre todo cuando tienes máquinas con distintas versiones de linux. Los despliegues se simplifican de forma brutal... quedando reducidos a un scp :-)
  • Orientación a Objetos, muy sencilla, siempre y cuando estés acostumbrado a hacer diseños en los que predomine la composición. Si eres de los que piensas que Orientación a Objetos es diseñar jerarquías, estás en un problema (en mi opinión, tanto en Go, como en cualquier otro lenguaje Orientado a Objetos).
  • Inferencia de tipos, hace que tengas las ventajas de un lenguaje estáticamente tipado sin tener toda la verbosidad.
  • Gran cantidad de documentación de alta calidad (charlas, ejemplos, libros). Esto desde luego tiene que ver con que han decido estabilizar la versión 1.x del lenguaje y ser muy conservadores en cuanto a los cambios.
  • El compilador es MUY rápido y el ecosistema es muy simple, lo que permite que el flujo de trabajo en cuanto a trabajo con tests, y feedback casi instantáneo, sea muy similar a trabajar con lenguajes dinámicos como python y ruby.

No me ha gustado

  • Aunque es algo más difícil, puedes liarla con los punteros. 
  • Se da bastante flexibilidad para cualquier solución de concurrencia, incluidas algunas formas de solventarlas que pueden ser peligrosas (Mutexes que dejemos sin cerrar, semáforos, etc). Por otro lado el lenguaje 
  • Evidentemente es un lenguaje de un nivel de abstracción bajo/medio, que permite estar en contacto con los tipos de datos a nivel de procesador y usar los recursos de una forma eficiente, pero en ocasiones echo de menos construcciones más expresivas y compactas de otros lenguajes de más alto nivel (bloques ruby, list comprehension python, etc.)
  • La sintaxis para los mapas se me hace poco legible.
  • Por supuesto, soy un enamorado de los lenguajes dinámicos, por lo que en algunas ocasiones me siento encorsetado al definir las estructuras de datos. Pero supongo que es por cómo suelo programar...
  • Si nos salimos de el tipo de aplicaciones para los que fue inventado, vamos a echar en falta bibliotecas potentes, aunque entiendo que eso es cuestión de tiempo.

No tengo opinión clara

  • Control de errores, sensación no definida, por un momento,  parece demasiado verboso, por otro lado parece buena idea obligar a los desarrolladores a que piensen en los errores...
  • La parte de testing integrada en el core del lenguaje y las herramientas me parece una gran idea, pero no los he usado como para tener una opinión formada sobre su funcionamiento.

Otros comentarios

  • Si estás acostumbrado a hacer objetos pequeños y facilitar el reuso por composición en Golang no vas a tener ningún problema.
  • Los escenarios en los que Go creo que es una opción muy viable son:
    • Aplicaciones de alta concurrencia y que requieran escalabilidad.
    • Aplicaciones reactivas y centradas en eventos.
    • Aplicaciones de networking.
    • Sistemas de monitorización, de control.
    • Lenguaje de sistemas
  • Escenarios en los que veo que hay mejores opciones:
    • Lógica de negocio complicada
    • Sistemas de información con flujos muy complejos
    • Existen tipos de aplicaciones en los que se van a echar en falta bibliotecas (pero esto dependerá de hacia donde evolucione la comunidad).
  • Lenguajes/entornos para los que creo que es un buen competidor
    • Susituto de Node
    • Susituto de C++ en aplicaciones de red y lenguaje de sistemas
    • Rust
    • Lenguajes dinámicos (python/ruby) para sistemas escalables o programación de sistemas

Go no es un lenguaje no hecho para hipsters. Aunque lo parezca porque es muy reciente y está consiguiendo mucha tracción, se trata de un lenguaje muy conservador, con una sintaxis simple y con pocas funcionalidades a nivel de lenguaje.
Parece que han decido que solo introducen funcionalidades al lenguaje en caso de que todos los diseñadores/desarrolladores del core estan de acuerdo, por lo que en general se añaden muy pocas cosas.
Se han centrado en tener la versión 1.0 y la van a mantener la compatibilidad durante varios años. Esto permite que se creen muchos recursos de gran calidad (charlas, libros, etc), cosa que no se ha visto con otros lenguajes que evolucionan mucho más rápido.

Patrón para la concurrencia :-)

Conclusiones

Creo que Go esta para quedarse, tienen muchos y grandes apoyos, y cubre una necesidad real (concurrencia y paralelismo, en un entorno de desarrollo y necesidades para despliegue extremadamente sencillo)
Es un lenguaje suficientemente bueno, centrado en un mundo escalable y reactivo, muy estable y que está creciendo a una velocidad de vértigo con una gran comunidad.
Es un lenguaje sin construcciones muy avanzadas y es un gran paso para desarrollos concurrentes y paralelos sin resultar disruptivo, de forma que lo más probable es que obtenga un gran exito (bueno, en realidad creo que ya lo está teniendo).

En esto de los lenguajes es lo de siempre:
"There are only two kinds of languages: the ones people complain about and the ones nobody uses". Bjarne_Stroustrup

Recursos Go:

Para empezar:
Más información de calidad:
Otros recursos interesantes:
Charlas recomendadas:

Enlaces relacionados: