Cuando comencé a aprender programación, fue con los dolores de cabeza que trae consigo C. En ese entonces, hasta guardar un string en una struct me detenía a pensar cosas como ¿Cuánta memoria debo reservar? Luego de eso, vino Java, donde todo cambió. La Programación Orientada a Objetos se presentó como una alternativa mucho más fácil de comprender y manejar, y Java con su garbage collector aceleró mucho el proceso de desarrollo, evitando que estuviera pensando algorítmicamente cómo ir reservando y liberando memoria de manera dinámica cuando los requerimientos del software se complejizaban.
Ya sintiéndome más cómodo con Java vanilla (o en buen chileno, Java pela’o), empecé a aprender Java Spring Framework 5 (con Spring Boot), pudiendo al fin desarrollar aplicaciones web más robustas. Sin embargo, siempre me pareció que era necesario bastante código de preparación (boilerplate) para que una aplicación fuera funcional.
Cuando comencé a aprender Ruby on Rails (RoR), para mí, el desarrollo de aplicaciones web tuvo un antes y un después.
RoR es un framework de desarrollo web de código de abierto, escrito en Ruby, que sigue la arquitectura MVC (modelo-vista-controlador). Es increíblemente rápido en cuanto a preparación para tener algo funcional. Uno puede generar una aplicación con un solo comando (rails new nombre_aplicacion), y además se puede generar un CRUD con otro comando. Por ejemplo, si quisiera crear un CRUD para artículos de un blog, usaría uno de los generadores que tiene rails, llamado scaffold (que significa andamio en inglés, queriendo decir que te ayuda a armar el andamiaje que va a necesitar la construcción de tu aplicación a futuro):
rails generate scaffold article title:string body:text
Este comando, “en humano”, sería algo como “Rails, quiero que generes el código necesario para un CRUD de la clase Article, con los atributos ‘title’ de tipo varchar en la base de datos, y ‘body’ de tipo text en la base de datos”. En concreto, este comando genera una serie de archivos dentro de la estructura de archivos que utiliza rails: Modelo, Vista, Controlador y Migración (una migración es un archivo que genera cambios en la base de datos de manera programática, es decir, utilizando Ruby se pueden agregar declaraciones en la base de datos sin saber su lenguaje de consultas, como SQL). Un CRUD creado con scaffold de Rails se ve así:
Si bien es muy simple, tiene toda la funcionalidad necesaria para comenzar con un MVP. Y ahora, con esto en mente, sabiendo que es posible literalmente generar una página web básica con un simple comando, ¿te imaginas por qué Rails es considerada una tecnología startup?
Hay bastantes artículos que hablan sobre este tema. Entre ellos, algunos recomendados son: Why Ruby on Rails is Still a Strong Choice for Startups in 2020 — Hatchpad, 8 Startups That Owe Their Success to Ruby on Rails y Which startups are using Ruby on Rails now?. Aunque el último es del 2018, muestra gráficos (y links a gráficos actualizados al 2020) sobre la tendencia del uso del Rails, y las páginas famosas o con gran tráfico que utilizan Rails (entre ellas, Slideshare, Wetransfer, Goodreads e incluso XVideos [yep, xvideos… imaginen la escalabilidad]). A continuación, voy a escribir algunos puntos a considerar sobre Ruby on Rails, sin un orden particular de importancia.
1. Está escrito en Ruby
Ruby es un lenguaje de programación interpretado, principalmente orientado a objetos, que trata de parecerse mucho al lenguaje natural. En Ruby, literalmente TODO es un objeto. Incluso los tipos de datos que uno podría pensar que son primitivos, como los números, son objetos y es posible llamar métodos sobre ellos. La forma en que se escribe Ruby es muy fácil de entender. Un ejemplo de ello, es esta línea de código: 5.times { print "Nos encanta Ruby!" } que significa imprime “Nos encanta Ruby!” cinco veces.
2. Sigue el principio DRY
DRY (Don’t Repeat Yourself) significa literalmente “No te repitas a ti mismo” (aunque la interpretación sería más como “No hagas algo que ya hiciste”). Se basa en re-utilizar tu código cada vez que se pueda, en vez de escribirlo de nuevo para distintos casos muy similares. Un caso notable de esto, es el principio de Fat Model, Skinny Controller (modelo gordo, controlador delgado), que se refiere a escribir los métodos que tiene una entidad en su modelo, y sólo ejecutarlos en el controlador. Además, Rails usa un sistema de templates para las vistas, donde se puede escribir HTML con Ruby embebido, y es posible crear partials (o parciales), que — como su nombre lo dice — son vistas parciales, que pueden repetirse en varios lugares. Por ejemplo, Una fila con el preview de un artículo dentro de una lista de artículos. En ese caso, no tendría sentido copiar y pegar el código de la fila cambiando su contenido, y se extrae el elemento hacia un parcial, llamándolo dinámicamente cada vez que se necesite, con contenido diferente.
3. Convención por sobre configuración
Rails sigue la filosofía Convention over Configuration, y tiene una forma especial de nombrar las clases, métodos y archivos, de tal manera que no es necesario crear relaciones explícitas entre ellos (i.e. con código) para que internamente sepa que están relacionados. Por ejemplo, el comando de scaffold anterior (rails g scaffold article title:string body:text) crea un modelo llamado Article, un controlador llamado ArticlesController y una carpeta con vistas llamada ‘articles’ (si la palabra fuera blog_articles, se traduciría a BlogArticles como nombre de clase. Rails usa snake_case [separar palabras con guión bajo] para nombrar sus métodos, variables y usar generadores). Además, cada método dentro del controlador (llamado acción en Rails), tiene un archivo html.erb asociado con el nombre de dicha acción. Es decir, si el controlador tiene una acción index (descrita como ArticlesController#index), la vista que renderice ese método, será ‘/app/views/articles/index.html.erb’. En general, los controladores se escriben en plural, y los modelos en singular. Y como si eso fuera poco, si existiera una relación entre un modelo Comment y Article (algo como que un artículo tenga comentarios), sería posible acceder a los comentarios del objeto article, de la clase Article, simplemente haciendo article.comments (el nivel de abstracción de la capa de datos que tiene Rails, llamada Active Record, es algo que me impresionó mucho).
4. La comunidad Rails es muy activa
Rails tiene una comunidad muy grande y activa, siempre dispuesta a resolver los problemas que tengas. Además, su documentación es genial (Rails Guides). “Debe haber una forma mejor de hacer lo que estoy haciendo” es algo que he pensado muchas veces, y casi siempre es verdad. Los usuarios expertos en Rails siempre tienen una forma muy idiomática de escribir Ruby, y algo que normalmente se escribiría en 4 o 5 líneas, puede escribirse en sólo una, sin sacrificar legibilidad. Además, hay muchísimas gemas (que son bibliotecas, plug-ins, add-ons, cachivaches o como quieras llamarles), que facilitan muchísimo el desarrollo, y entregan métodos muy idiomáticos, como Time.now.beginning_of_day que literalmente te entrega la fecha y hora en que comienza el día actual. Algunas gemas notables son Devise (que genera un sistema de usuarios), Spree (para e-commerce), Rspec (para pruebas) y Business Time (para hacer cálculos con fechas).
5. Es fácil empezar a utilizar Rails
Ruby es un lenguaje simple y muy poderoso, con muchos métodos que abstraen bloques complejos de lógica. Rails se instala como una gema luego de instalar Ruby, y al generar una nueva aplicación, crea automáticamente toda la estructura de archivos para comenzar a desarrollar. Es recomendable instalar Ruby utilizando RVM (Ruby Version Manager), que te permite instalar distintas versiones de Ruby sin que haya conflictos entre ellas, así como también instalar distintos conjuntos de gemas. Es decir, podrías tener varias versiones de Rails instaladas para distintas versiones de Ruby, y podrías seleccionar en cuál quieres trabajar. La combinación de un lenguaje idiomático, un framework poderoso y con generadores que hacen el trabajo por ti y un fácil acceso al conocimiento y código fuente de Rails, hace que RoR sea una opción especialmente buena para la gente que quiera seguir el camino de la agilidad.
Estoy seguro de que este artículo dejó muchas más preguntas que respuestas, y es que Rails tiene asociados demasiados conceptos, debido a la gran cantidad de herramientas que te facilitan el trabajo, pero una vez que entiendes lo básico, se hace bastante fácil desarrollar. Instala Ruby con RVM, instala Rails, entra a la documentación oficial y pruébalo por ti mism@!
Garage Labs
Publicaciones oficiales de la consultora tecnológica Garage Labs | Santiago de Chile