Te convertirá en un mejor programador de Java.
Y un mejor programador en general.
Hice el mismo viaje hace unos 6 años. En ese momento, Java 5 había existido por solo un par de años, y aunque Java EE 5 acababa de ser lanzado, todos los principales frameworks y servidores de aplicaciones todavía estaban sacando sus últimos lanzamientos (anotaciones de soporte y genéricos).
- ¿Cuál es la mejor manera de detectar un cambio en un cuadro de texto HTML?
- ¿Qué debo mostrar primero, una página de destino o el sitio real?
- ¿Cuál es la forma más rápida de crear su propio sitio web?
- ¿Cómo funciona HARO? (funcionalmente)
- ¿Contratarás un programador sin título en India?
Entonces, estaba sólidamente en Spring 2.x (todo XML), luchando con Hibernate (todo XML) y evitando Java EE 1.4 (y todo su XML) en general.
Había incursionado en PHP y ASP mucho antes de eso y sentí un nivel general de disgusto por la programación de spaghetti a la que tendían.
Me encantaban las pruebas unitarias, pero a menudo me encontraba teniendo dificultades cada vez que necesitaba burlarme de mi comportamiento. La inclinación de Spring por las interfaces y el desacoplamiento ayudó bastante, aunque trajo consigo una explosión de clase y un poco más de verbosidad / complejidad.
Logré superar mis herramientas para presentarlas y de alguna manera conseguí que Eclipse y Tomcat trabajaran juntos correctamente, lo que me permitió hacer algunos cambios, esperar un tiempo y luego actualizar la aplicación web. Esto estaba usando Maven, que, a pesar de todas sus fallas (moar XML) me ayudó a administrar mis dependencias y compilar-probar-paquete-implementar ciclo lo suficientemente bien. Sin embargo, no pude hacer que funcionen a la perfección con Glassfish en ese momento.
Trabajando en una máquina Unix (Mac OS X), me acostumbré a escribir varios scripts para trabajos extraños usando bash. Sin embargo, nunca dominé realmente cómo usar grep
, sed
y awk
(todavía no lo he hecho).
Me las arreglé y estaba orgulloso de mí mismo.
A menudo me preguntaba: ¿Es esto tan bueno como se pone?
Afortunadamente me equivoqué.
Ruby y Rails eran un soplo de aire fresco proveniente del ecosistema de peso pesado de Java y Java EE.
Pronto me encontré recurriendo a irb
cada vez que necesitaba algunos cálculos rápidos (SHA-256 de una cadena, por ejemplo).
Mis scripts .sh
comenzaron a dar paso a los scripts .rb
, aunque solo fuera porque la recursividad, la coincidencia de patrones de .rb
regulares y el análisis CSV eran mucho más fáciles en Ruby que en bash.
Me encontré abrazando la semántica de la programación funcional: prefiriendo .each
, .map
e .inject
over for...
iteración.
Sonreí al ver cómo las bibliotecas de guayaba de Google proporcionaban construcciones similares, aunque algo menos elegantes.
Vi cómo las clases anónimas que implementaban cualquier número de interfaces eran un pobre sustituto de las funciones de primera clase, lambdas y bloques.
El dinamismo me dejó boquiabierto y me di cuenta de cómo las pobres técnicas de reflexión de Java se comparaban con el poder de la metaprogramación. Empecé a desear que las interfaces Java pudieran contener código y ser utilizadas como mixins.
Aprendí a apreciar, pero lo más importante, cómo crear lenguajes específicos de dominio con sintaxis fluida.
Me encantó cómo Rubygems lo liberó de preocuparse por las dependencias, y cómo las convenciones de Rails impidieron la necesidad de XML y cómo YAML (en estos días, JSON) era un sustituto más eficiente e igualmente capaz de XML.
Me encantó cómo Rails realmente te permite guardar un archivo y actualizarlo de inmediato para ver tus cambios en acción. Me encantó cómo ERB (en estos días, HAML) era mucho más poderoso (pero más fácil de usar) que las plantillas JSP o Velocity / Freemarker.
Me encontré aprendiendo estas y una gran cantidad de otras tecnologías y técnicas y pensando: desearía que Java las tuviera.
(Bueno, ha tomado un tiempo y todavía no está allí, pero al menos Java 8 tiene cierres adecuados y métodos predeterminados en las interfaces ahora).
¿Estaba realmente mejor por eso?
Permítanme decirlo de esta manera: decidí aprender Objective-C. Si bien los protocolos de Objective-C son tan familiares como las interfaces de Java, el mecanismo de envío de métodos de Objective-C (y el dinamismo que permite) es fácilmente accesible para alguien versado en el envío de métodos de Ruby, ambos después de Smalltalk.
Incluso la sintaxis de paso de parámetros de Objective-C, que parece extraña desde un fondo de Java, es bastante similar al paso de parámetros usando la nueva sintaxis hash de Ruby 1.9.
Las categorías de Objective-C son tan entendibles como los módulos de Ruby (aunque menos potentes). El comportamiento de “clase parches” en tiempo de ejecución de una clase (a través de una categoría que reescribe sus métodos) no es una técnica arcana, sino una herramienta familiar (aplicada juiciosamente, por supuesto).
Ruby me expuso a suficientes técnicas funcionales que he decidido aprender Scala. Rails me expuso a Prototype (en estos días, JQuery) y SASS & HAML y ‘Javascript discreto’ que probablemente encontraría una forma de incorporarlos a mi próxima aplicación web Java.
No es que recomiende Java para aplicaciones web nunca más, ten en cuenta. Para cosas del lado del servidor, middleware o backends REST-ful, seguro. Pero para desarrollar e iterar rápidamente una aplicación web UI / UX-heavy, me quedaré con Ruby on Rails (hasta, tal vez, hasta que aprenda Angular + Node 😉
tl; dr: Ruby le enseñará programación de lenguaje dinámico, técnicas de programación funcional, metaprogramación y DSL, y Rails lo expone a una gran cantidad de otras técnicas y tecnologías.
Además, como he experimentado, y esto también es cierto para los idiomas naturales, cuantos más idiomas conozcas, más fácil será para ti aprender otro.
La curva de aprendizaje, ya sea que te lleve 1 mes o 1 año, vale la pena.