- Ruby no es el lenguaje más rápido ni el más de moda, pero incluso después de pasar por varios lenguajes durante más de 15 años, sigue siendo el que uno vuelve a elegir cuando quiere disfrutar el trabajo
- refinements, Forwardable, SimpleDelegator,
Object#then,Kernel#tapy los parámetros numerados ofrecen pequeñas comodidades sintácticas y un flujo fácil de leer Thread::Queue,jsonycsvde la biblioteca estándar, junto con RuboCop y Ruby LSP, permiten mantener un entorno de desarrollo práctico sin gems pequeñas ni configuraciones complejas- YJIT en Ruby 3.x y ZJIT en 4.x están reduciendo la brecha en tareas intensivas de CPU, y en una comparación simple de Fibonacci, Ruby con ZJIT quedó a una distancia de 2 a 3 veces respecto a Go
- Aunque hay áreas donde Rust, Go y Python son más adecuados, en apps web, procesamiento en segundo plano y herramientas internas, la felicidad del desarrollador y la velocidad de iteración siguen siendo fortalezas de Ruby
Razones del lenguaje por las que Ruby se siente cómodo
- Ruby no es el lenguaje más rápido ni el más de moda, pero incluso después de moverse entre varios lenguajes durante más de 15 años, sigue siendo el lenguaje al que se vuelve cuando de verdad se quiere disfrutar el trabajo
- refinements permite abrir clases solo dentro de un alcance limitado, así que se pueden agregar pequeñas comodidades sintácticas dentro de un archivo o bloque sin contaminar todo el espacio de nombres
- Encaja bien con helpers de pruebas o DSL internos en bases de código grandes
- Métodos como
"hello".quotesolo se pueden usar donde se invoqueusing QuotingRefinement
- Forwardable y
SimpleDelegatorde la biblioteca estándar permiten una delegación limpia sin tener que escribir métodos envoltorio a mano ni traer gems adicionales- Si ya se usa Rails,
delegatede Active Support puede ser más cómodo, pero la versión base de Ruby mantiene ligeros los scripts generales
- Si ya se usa Rails,
Object#thenyKernel#tappermiten encadenar operaciones en un flujo que se lee de arriba hacia abajo sin crear variables intermedias- Se puede escribir un flujo de creación, logging, normalización y guardado como
User.new(params).tap { ... }.then { ... }.save
- Se puede escribir un flujo de creación, logging, normalización y guardado como
- Los parámetros numerados desde Ruby 2.7 reducen el ruido en callbacks cortos
- No hace falta declarar explícitamente los argumentos del bloque en algo como
items.map { _1.price * 1.1 }
- No hace falta declarar explícitamente los argumentos del bloque en algo como
- El fiber scheduler permite escribir código concurrente que se ve como código secuencial cuando se conecta a un event loop
- Expresa código que coopera con otras fibers en la forma
Fiber.schedule do ... end
- Expresa código que coopera con otras fibers en la forma
Estado actual de herramientas, rendimiento y ecosistema
- Ruby LSP de Shopify ofrece integración con el editor con configuración mínima, y funciona bien junto con Steep o RBS para una adopción gradual de tipos
- RuboCop ayuda a mantener un estilo consistente sin los procesos ceremoniales que se ven en otros ecosistemas
- La biblioteca estándar sigue siendo una fortaleza silenciosa, porque evita tener que agregar varias gems pequeñas para tareas comunes
- Si se necesita una cola, se puede usar
Thread::Queue - Para parsear JSON o CSV, las bibliotecas
jsonycsvcubren la mayoría de los casos reales sin demasiado trámite
- Si se necesita una cola, se puede usar
- Después de YJIT en Ruby 3.x, la serie 4.x está incorporando ZJIT
- ZJIT es un JIT más agresivo sobre la misma base, y compila de forma más efectiva las rutas de ejecución más calientes
- Los números iniciales muestran que la diferencia con lenguajes que antes sacaban una gran ventaja a Ruby en tareas intensivas de CPU se ha reducido de forma significativa
- CRuby ZJIT se está desarrollando en el repositorio principal de Ruby
- En un benchmark simple que comparó implementaciones recursivas de Fibonacci en la misma máquina, Ruby con ZJIT quedó a una distancia de 2 a 3 veces respecto a Go, no muy lejos de Rust optimizado en ese caso, mientras que Python con pypy quedó por detrás
- Los microbenchmarks tienen limitaciones, pero en rutas de código ya calientes donde el JIT tiene tiempo para optimizar, las aplicaciones reales también pueden beneficiarse más
- Comparado con Rust, Ruby destaca en la velocidad de iteración de la lógica de negocio
- En Rust puede terminar invirtiéndose tiempo en pelear con el borrow checker incluso para cosas que en tiempo de ejecución son claras
- Go tiene excelentes primitivas de concurrencia, pero hasta hace poco no tenía generics, y su manejo algo rígido de errores puede hacer que scripts simples se sientan más pesados de lo necesario
- Python es el primo mental más cercano, pero suele requerir más boilerplate para expresar ideas similares de alto nivel, especialmente alrededor de clases y decoradores
- Al poner código dentro del modelo, la eficiencia de tokens también funciona como una ventaja real de Ruby
- Los bloques pueden expresarse con
do/endo llaves, y si la legibilidad lo permite, casi nunca hacen falta paréntesis en llamadas a métodos - Los hashes y los argumentos con palabra clave son funciones de primera clase y concisas, así que cabe más lógica real en la misma ventana de contexto que en lenguajes con mucho ruido estructural
- Los bloques pueden expresarse con
- Las utilidades de metaprogramación de Ruby son buenas para crear APIs pequeñas y legibles
- Funciones como
define_method,class_evalo la intercepción de métodos faltantes permiten crear APIs expresivas sin una etapa de generación de código - Bibliotecas como
dry-rboaasmusan estas capacidades con moderación para ofrecer máquinas de estado y capas de validación limpias
- Funciones como
- Las herramientas de la comunidad y los flujos de despliegue también han madurado
- byebug y
pryse sienten más flexibles que muchos depuradores usados en otros entornos - En trabajos en segundo plano,
solid_queueygood_jobson tan simples que resulta posible entender toda la implementación en una tarde - Kamal ha reemplazado para muchos los viejos procesos al estilo capistrano, y de verdad se siente como una herramienta hecha por gente que opera equipos pequeños
- byebug y
- Esto no significa que Ruby supere a Rust o Go en todo, y sí hay áreas donde Rust o Go encajan mejor
- Pero en la amplia zona intermedia de aplicaciones web, procesamiento en segundo plano y herramientas internas, Ruby sigue ofreciendo felicidad del desarrollador sin ceremonias excesivas ni cambios constantes de contexto
- Las pequeñas comodidades y la sensación general del lenguaje siguen siendo lo que hace que uno lo elija primero incluso después de más de diez años, y el nuevo trabajo en JIT junto con las mejoras constantes del lenguaje refuerzan todavía más esa razón
1 comentarios
Opiniones en Lobste.rs
Me cuesta estar de acuerdo con la expresión de "RuboCop sin ceremonias"
Con RuboCop hay bastante discusión sobre qué cops elegir y ajustar, y sobre si conviene activar o no los nuevos cops que van agregando en actualizaciones recientes
StandardRB se acerca mucho más a un enfoque sin tanta ceremonia, pero al final igual hay que elegir uno
Los lenguajes que traen el lint integrado son mucho menos engorrosos que Ruby y también tienen menos discusiones de estilo por cosas triviales
Las restricciones, de hecho, dan libertad
En general estoy en contra de configurar el linter, y preferiría dejar este tipo de decisiones en manos de los valores por defecto de la comunidad
Por un lado, creo que los valores por defecto de RuboCop son lo bastante buenos como para seguirlos y hacerlos evolucionar juntos, en vez de fragmentar todavía más el estilo de código
Por otro lado, a veces tiene opiniones demasiado fuertes, y ahí sí parece necesario algo como standard.rb
Escribí desde la perspectiva de alguien que está aprendiendo Ruby o quiere volver a él y no debería tener que lidiar con montones de gems solo para poder escribir código de forma cómoda
Cuando salió Go, me pareció una gran decisión que trajera un único sistema oficial de formateo
El cerebro es una máquina de reconocer patrones, así que una vez que te acostumbras simplemente lo pasas por alto, pero cuando hay opciones te genera incomodidad y todos terminan jalando para un lado u otro
El problema es que ni RuboCop ni Standard pueden tener esa autoridad en Ruby
Esa autoridad tendría que venir del equipo core, pero probablemente no ocurra porque va en contra de la filosofía de Ruby
En mis proyectos apago todos los cops de RuboCop y solo activo algunos
Las comillas simples son lo máximo 😀
Parece que otro artículo también señala esto: https://caio.ca/blog/coding/my-complicated-relationship - "The Wild West of Code Formatting"
Va por la línea de: “No es una solución simple integrada. Hay cientos de cops configurables, lo que lleva a discusiones interminables sobre qué reglas activar”
En general estoy de acuerdo, pero me decepciona un poco que refinements sea el primer ejemplo
Entiendo por qué te gusta, pero entra más en la categoría de cosas de las que es mejor no saber cómo se hace la salchicha
La semántica es tan delicada que incluso 10 años después de su introducción siguen apareciendo bugs complicados en MRI
Por ejemplo, solo en las últimas 2 semanas hubo https://bugs.ruby-lang.org/issues/22071 y https://bugs.ruby-lang.org/issues/22058
También desde el punto de vista del rendimiento complica muchas optimizaciones, y ahora está volviendo a pasar algo parecido con boxes
Me imagino que a nivel de implementación todavía debe haber muchos bugs escondidos, y probablemente del lado de las librerías también
Ya no uso mucho Ruby, pero me da curiosidad ver cómo termina asentándose esto
Se ve interesante
Este artículo también se superpone bastante con mi experiencia en mi texto “Returning to Rails”[1]
Puede ser sesgo de confirmación, pero me da la impresión de que cada vez más gente está redescubriendo o volviendo a apreciar la belleza del código Rails
Aunque también me hace pensar en ese fenómeno de que los gustos musicales o artísticos se fijan entre el final de la adolescencia y los veintitantos
Quizá quienes conocieron Ruby por primera vez durante la “edad dorada” de Rails están mirando hacia atrás, a la época de Rails 3 y Capistrano, con lentes color de rosa
En ese momento yo estaba muy metido en el “shop” de Ruby y además todo mi entorno eran desarrolladores de Rails, así que sentía que Ruby estaba en todas partes
Pero al ver en un hilo de lobste.rs[2] la opinión de que Ruby en realidad siempre fue un lenguaje bastante de nicho, pensé que eso también pudo haber influido
Aun así, Ruby se sigue sintiendo como casa, y parece funcionar exactamente como funciona mi cabeza
Casi no hay traducción mental, rara vez me sorprende, y se siente más como hablar con un amigo que como redactar un ensayo formal
Todavía no encuentro otro lenguaje que me encaje así, y no creo que todo se deba solo a una mentalidad de “los jóvenes de hoy”
En cualquier caso, me alegra que siga vivo después de tanto tiempo
Y gracias por mostrar esa cadena de “tap / new”
Esa estructura me pareció tan bonita y útil que me hizo detenerme un momento, y seguro voy a probarla
PD: no está directamente relacionado con el tema, pero el avatar de IA de la página principal da un poco de escalofríos
Me da una fuerte sensación de valle inquietante, como de “¿esto lo escribió un bot?”
Cada vez que veo algo así, me quedo pensando un instante si de verdad estoy hablando con un ser humano real
[1]=https://www.markround.com/blog/2026/03/05/returning-to-rails-in-2026/
[2]=https://lobste.rs/s/jreqtw/returning_rails_2026
Solo que no quiero publicar una foto real, y ese avatar sí se parece lo suficiente como para que la gente que me conoce me reconozca
Ruby 3.4 agregó el parámetro de bloque
it, que puede usarse en lugar de_1en el ejemplohttps://rubyreferences.github.io/rubychanges/3.4.html/…
itComo es una función relativamente reciente, por alguna razón no logro acostumbrarme a escribir
iten iteradoresDe verdad me encantaba escribir código en Ruby, pero la carga de pruebas se volvió demasiado grande
Pensé que quizá ayudaría añadirle algo más de seguridad de tipos al lenguaje, pero cuando metimos Sorbet al codebase en
#{last_job}, se murió por completo el impulso y la diversión de escribir códigoPuede que sea una opinión impopular, pero para mí el simple hecho de que exista algo como Sorbet ya es más bien una mala señal para Ruby
Ruby en sí es un lenguaje potente y divertido, pero la gente empezó a usarlo para trabajos para los que no fue diseñado originalmente, y en ese proceso comenzaron a apilar herramientas para compensar las anti-funciones del lenguaje
Llegó un punto en que cada línea se sentía como una tarea pesada y aburrida, y pasaba mucho más tiempo esperando varias herramientas de build, pruebas y lint que escribiendo código real
Si a eso le sumas procesos de build y despliegue sobreingenierizados, incluso hacer cosas básicas tomaba mucho tiempo y trabajar se volvió doloroso
Extraño muchísimo el mundo Ruby de alrededor de 2012
Viéndolo en retrospectiva, de verdad fueron muy buenos tiempos
Entendí que con “trabajos para los que no fue diseñado originalmente” te referías a aplicaciones grandes de Rails
Volví a Ruby después de 10 años, y en la era de la “IA” es útil poder entender de verdad el código que pasa frente a ti y también poder orientar o frenar a los LLM
En lenguajes más verbosos, eso es más difícil
Extraño Ruby, y más aún extraño la mera posibilidad de que exista un lenguaje así en producción cotidiana
Era esperanza, o mejor dicho, la esperanza misma
Al menos para mí, lo fue durante mucho tiempo
Se lee como un texto hecho al aventón por IA
Otros posts recientes del blog también se sienten así
¿Qué indicios te hicieron verlo así?
Está bien señalar contenido de baja calidad generado por IA en este sitio, pero hay que evitar falsos positivos y decir con precisión por qué se piensa eso
¿Por qué te dio esa impresión?
Me parece bien hacer ese tipo de advertencias, pero prefiero mucho más que vengan acompañadas de las razones
Tengo buenos recuerdos de haber trabajado con Ruby al inicio de mi carrera
Ruby tiene de verdad algo muy agradable
Pero cuando usé un poco de Ruby recientemente, creo que el año pasado, sentí que era difícil navegar la documentación de la biblioteca estándar en la web
¿Soy solo yo? ¿Hay alguna alternativa a la documentación de ruby-lang.org?
[1] https://rubyapi.org
[2] https://devdocs.io/ruby/
Este artículo se siente medio raro
Tuve la oportunidad de escribir un proyecto y un SDK en Ruby, y no me quedaron nada de ganas de volver a usar Ruby