Un desarrollador sénior de Ruby explica cómo funciona el lenguaje y qué se escribe con él, cuánto ganan los «rubistas» y por qué Rails es un framework revolucionario.
Ruby: ¿Qué es?
Ruby es un lenguaje de propósito general orientado a objetos con tipificación dinámica. Apareció en Japón en 1995 y rápidamente ganó popularidad allí. Sin embargo, debido a la falta de documentación en inglés, el mundo lo conoció un par de años después.
El creador de Ruby, Yukihiro Matsumoto (Matz), inicialmente creó el lenguaje para que fuera comprensible para las personas, no para las máquinas.
Características de Ruby
Ruby se utiliza principalmente en el desarrollo web; el nicho del lenguaje lo definió el exitoso framework,
Ruby es conciso y tiene una sintaxis agradable.
La sintaxis de Ruby recuerda simultáneamente a Python, Perl y un poco a Pascal, debido a los bloques de apertura y cierre.
Comparemos el código del programa ¡Hola Mundo! en Ruby y C++.
Código en Ruby:
puts "¡Hola Mundo!"
Código en C++:
#include <iostream>
int main()
{
std::cout << "¡Hola Mundo!" << std::endl;
return 0;
}
Se puede migrar fácilmente a Ruby desde cualquier lenguaje. Pero será más fácil para quienes ya han trabajado con lenguajes de tipificación dinámica, como Python. Y si migras desde un lenguaje de tipificación estática, recuerda siempre el duck typing.
En Ruby se pueden obtener resultados de cálculos sobre la marcha: podemos detener el programa, observar qué se almacena en la memoria, continuar o saltar a otro lugar de ejecución. Por eso nos encantan Ruby y otros lenguajes dinámicos. 🙂
La tipificación dinámica es la principal ventaja de Ruby. Con ella, no es necesario recordar los tipos de variables y, al mismo tiempo, no temer recibir un montón de errores. Libera al programador de la rutina y le permite centrarse en cosas más importantes, como la lógica empresarial, en lugar de luchar con el diseño del lenguaje.
Además, con los lenguajes dinámicos no pensamos en pérdidas de memoria: no la asignamos ni describimos tipos. Declaramos una clase y escribimos código dentro, y luego el propio lenguaje supervisa todas las manipulaciones con la memoria.
Donde se Usa Ruby
Ruby es más adecuado para el desarrollo web. Numerosas aplicaciones en el comercio electrónico, soluciones SaaS, plataformas bursátiles y otros proyectos complejos están escritas en él. Lo único para lo que Ruby no funciona son las aplicaciones en tiempo real. Requieren trabajar con sockets e identificar usuarios constantemente, y Ruby tiene problemas con esto.
Las empresas emergentes suelen utilizar Ruby porque con él pueden probar ideas rápidamente. Junto con Rails, es simplemente un lenguaje ideal para crear prototipos y MVP. Abre el sitio web de Y Combinator y verás que 8 de los 10 proyectos principales están escritos en Ruby on Rails.
Empresas conocidas, como GitHub, GitLab, Shopify, Airbnb, SoundCloud, Dribbble, Kickstarter y Stripe, también implementan Ruby en sus proyectos. Hay quienes utilizan Ruby, pero no lo anuncian.
Qué Hay «bajo el capó» de Ruby
Ruby es un lenguaje de programación interpretado, es decir, no necesita una compilación previa en código de máquina para ejecutar un programa. En cambio, el intérprete ejecuta los programas directamente, leyendo el archivo secuencialmente de principio a fin.
Este enfoque tiene ventajas:
- no estamos vinculados a la plataforma; basta con instalar el intérprete para ejecutar el código;
- no es necesario describir los tipos de datos; la tipificación dinámica se encarga de eso;
- es más fácil agregar nuevas capacidades y características.
Pero también hay desventajas:
- velocidad de ejecución relativamente baja;
- errores relacionados con tipos.
Analicemos cómo funciona Ruby internamente. Digamos que tenemos un archivo Ruby con una línea: «puts 1 + 2
«. ¿Qué hace el intérprete?
Primero, lee todo el archivo y luego divide el código en tokens: «puts», » «, «1», » «, «+», » » y «2». Ten en cuenta que el espacio se guarda en un token separado.
Luego, Ruby inicia un analizador léxico que debe verificar y agregar parámetros adicionales para cada token. Toma el primero, «puts», y le agrega parámetros específicos para que la computadora sepa qué hacer con él a continuación. Y así para cada token.
Luego, se inicia un analizador sintáctico para crear un árbol abstracto, la ruta de ejecución del código. Y el paso final: Ruby traduce este árbol en un código de bytes de bajo nivel que la máquina virtual Ruby puede entender y lo ejecuta. Si se produce un error en alguno de estos pasos, se inicia el código Ruby que genera este error.
Entonces, esto es lo que hace Ruby:
- lee el archivo;
- lo divide en tokens;
- inicia el análisis léxico para obtener información adicional;
- inicia el analizador sintáctico para el árbol AST;
- traduce el árbol en un código de bytes de bajo nivel;
- ejecuta el código.
Hacia Dónde y Cómo Evoluciona Ruby
Casi todos los años salen nuevas versiones de Ruby. Recientemente salió la versión 3, a la que se le añadió la posibilidad de sobrescribir notaciones de tipos en archivos separados. ¿Cuál es el sentido?
En los lenguajes de tipificación estática, los tipos se pueden describir directamente en el código, pero Matz, el creador de Ruby, decidió que era una mala idea: agregar tipos al lenguaje es fácil, pero quitarlos después es difícil. Matz cree que pronto aparecerán herramientas que determinarán el tipo sobre la marcha. No quiere añadir tipificación estática directamente al código. Por eso, la versión 3 presentó la tipificación en archivos separados y la comparación de patrones, como en Elixir. Ruby v3 también añadió Ractors, una herramienta para el inicio paralelo de programas, un nuevo compilador JIT para acelerar la ejecución del código y un analizador estático de tipos, typeof.
Además, se mejoró el REPL: se agregó resaltado de sintaxis, autocompletado y «documentación rápida», se revisó la salida de algunos errores y se desarrollaron nuevas depuraciones.
Creo que el equipo de Ruby trabajará más duro para acelerar el lenguaje porque las empresas escriben cada vez más proyectos complejos en Ruby on Rails. Por ejemplo, Shopify ahora está mejorando su compilador YJIT para aumentar varias veces el rendimiento de las aplicaciones Rails; un compilador normal solo puede optimizar el código Ruby puro.
Creo que Ruby obtendrá más herramientas integradas en el futuro y comenzará a tomar prestadas construcciones sintácticas de otros lenguajes, como JavaScript con sus estándares ES6, ES7, etc.
Qué Problemas tiene Ruby
Ninguno. ¡Es perfecto! Bueno, casi… 🙂
Por supuesto, Ruby, como otros lenguajes, tiene sus inconvenientes. Los principales son GIL y el consumo de memoria.
GIL: Global Interpreter Lock. Debido a esto, no podemos utilizar eficazmente los núcleos del procesador. Por ejemplo, tengo un procesador de 16 núcleos. Inicio los cálculos de varios subprocesos para que el programa calcule algunas fórmulas en cada subproceso. Se inician los subprocesos. Primero, un subproceso funciona con un núcleo. Luego se detiene y guarda el estado, y el proceso cambia a otro subproceso, que también usa un núcleo. Los otros núcleos permanecen inactivos.
Resulta que de 16 núcleos, solo se utilizará uno a la vez. Esto se debe a que Ruby fue creado en una época en la que los procesadores solo tenían un núcleo. El equipo de Ruby está trabajando en este problema actualmente.
Ruby funciona con la memoria. Ruby tiende a retener la memoria incluso después de que ya no se necesita. Digamos que inicias una aplicación: en una hora consume dos gigabytes y en dos horas, cuatro. Es una exageración, pero los programas Ruby funcionan aproximadamente así.
Esto es lo que sucede internamente.
Qué Herramientas tiene Ruby
IDE: Cualquier editor de código extensible servirá para el desarrollo de Ruby – VS Code, Vim, Emacs, Sublime Text, Atom. Pero si necesitas un IDE completo, puedes usar RubyMine de pago.
Actualmente, utilizo RubyMine para trabajar y VS Code y Neovim para proyectos secundarios.
Pruebas: Para las pruebas, existe RSpec, un marco de trabajo genial y rico en funciones que ya se ha convertido en un estándar en la comunidad. Ruby tiene MiniTest y TestUnit integrados.
Estándares Ruby: La comunidad ha creado un estándar común para escribir código, llamado RuboCop. También hay guías en el sitio web rubystyle.guide. Todo esto está disponible gratuitamente; úsalo y escribe código perfecto. Y si los estándares de la comunidad no te satisfacen, puedes agregar los tuyos localmente.
Otras utilidades: Los programadores aman Ruby porque tiene un ecosistema muy rico: varias bibliotecas, administradores de dependencias (Bundler), administrador de paquetes (RubyGems), administrador de tareas integrado Rake, entornos de programación interactivos y depuradores (IRB). Si esto no es suficiente, puedes agregar el depurador Pry.
Para programadores avanzados, hay utilidades que permiten construir árboles AST y ver cómo funciona el depurador Ruby en el nivel de código C. Puedes consultar «gemas» en RubyGems y Ruby Toolbox. Y si no encuentras nada adecuado, puedes crear tu propia gema y publicarla en uno de estos sitios.
Las utilidades Ruby Version Manager (RVM) y ASDF permiten instalar varias versiones del lenguaje y administrar dependencias. Y Sidekiq permite procesar tareas en segundo plano: es una de las bibliotecas más populares y estables.
Qué es Ruby on Rails
Ruby ganó gran popularidad gracias al framework Ruby on Rails, que introdujo funciones que otros frameworks no tenían.
Rails es un framework fullstack para desarrollar aplicaciones de cualquier complejidad. Fue creado por la empresa 37signals (antes Basecamp) en 2005 y, por lo tanto, introdujo muchas novedades en el mundo del desarrollo web.
Por ejemplo, en Rails aparecieron migraciones reversibles de bases de datos, es decir, cuando podemos realizar una migración y luego revertir todos los cambios con un par de comandos. Otra característica no menos revolucionaria fue la compresión del cuerpo del código CSS: Asset Pipeline.
El principal problema de la mayoría de los frameworks de esa época era que no tenían un sistema unificado de configuración y ajuste de aplicaciones. Rails introdujo el concepto de «convención sobre configuración», apareciendo una estructura unificada y comprensible. Los programadores comenzaron a utilizar este acuerdo y a escribir proyectos en Ruby mucho más rápido. Aparecieron cada vez más tutoriales en vídeo, surgieron comunidades locales y se llevaron a cabo conferencias sobre Rails. En resumen, Ruby despegó.
Con el tiempo, Ruby perdió su posición como framework fullstack. En el front-end, aparecieron competidores más geniales: React, Vue.js y Angular. Como resultado, Rails comenzó a usarse principalmente solo en el backend. Pero la versión de Rails (7) lanzada recientemente cambió drásticamente la situación: los desarrolladores agregaron soporte para ECMAScript 6 y HTTP/2.0. Ahora, no es necesario instalar Node.js para iniciar el front-end. Antes, esto era impensable.
La séptima versión de Rails también presentó una nueva característica espectacular: Hotwire for Rails. Esto es cuando el HTML se envía a través de un socket: se abre un canal de socket y el archivo HTML llega a través de él. El framework ya no necesita realizar solicitudes separadas al backend; basta con suscribirse al socket. Y recientemente, los creadores de Ruby on Rails lanzaron el framework Stimulus, que permite al programador trabajar menos con código JavaScript.
En general, Rails sigue siendo el framework Ruby más utilizado. También están Hanami y Sinatra, pero tienen una serie de desventajas que Rails no tiene.
Cuánto se les Paga a los Desarrolladores de Ruby
Actualmente, los especialistas en Ruby tienen mucha demanda. Según algunos datos, la situación es la siguiente:
- junior: hasta 1000 dólares;
- junior+: de 1000 a 2000 dólares;
- intermedio: de 2000 a 4000 dólares;
- senior: de 4000 a 7000 dólares;
- los seniors que trabajan directamente con los clientes: de 4500 a 9500 dólares.
Qué Leer y Ver para los Rubistas Principiantes
Libros
Para principiantes, recomiendo leer tres libros básicos. De ellos, aprenderás cómo funciona el lenguaje, dominarás su modelo de objetos y metaprogramación:
Portada | Título y Autor | Enlace de Compra |
---|---|---|
Programming Ruby 1.9 & 2.0 4ed: David Thomas | Comprar | |
The Well-Grounded Rubyist: David Black | Comprar | |
Metaprogramming Ruby 2: Paolo Perrotta | Comprar | |
Programming Ruby 3.2: Noel Rappin | Comprar |
Para los juniors y superiores, también recomiendo estudiar metaprogramación y diseño orientado a objetos al trabajar con Ruby para comprender cómo hacer la inversión de dependencias, observar el principio de responsabilidad única o SOLID. También estudia el funcionamiento interno de Ruby: cómo analiza los datos, cómo se inicia y funciona su máquina virtual. Encontrarás respuestas a estas preguntas en los siguientes libros:
Boletines informativos
Puedes recibir noticias sobre Ruby en el boletín semanal Ruby Weekly, lo que te permite mantenerte «al día». También hay un boletín informativo This Week in Rails, dirigido por los creadores de Rails.
Canales de Telegram:
- Ruby hispano – Chat para de rubistas hispanohablante.s
- Ruby / Rails Inside — una gran colección de artículos sobre Ruby;
Canales de YouTube:
- Ruby desde Cero de Danisable Programacion
- Curso Ruby de codigofacilito
- Curso Ruby de OpenBootcamp
Extra: Un curso introductorio, Aprende Ruby desde CERO, por el precio de una taza de café (y con Garantía de 7 días!)
Recomiendo a los principiantes que primero comprendan el concepto del lenguaje y el modelo de objetos, y solo luego procedan a estudiar los marcos. De lo contrario, parecerá que Rails es magia. De hecho, es solo metaprogramación y mucho más.
Para aquellos que planean cambiar de pila (stack), les diré que Ruby on Rails es realmente una herramienta genial. Pásate a él, pruébalo y disfruta del desarrollo. Y si te cansas de este marco, siempre puedes cambiarte a otro. Considera los lenguajes de programación y los marcos como herramientas que te facilitan la vida y no te centres en una sola cosa.
Un buen programador debería poder cambiar a cualquier pila. Hoy escribimos en un lenguaje y en un mes, en otro. Sé un ingeniero de software que puede entenderlo todo.