¿Cuáles son las principales debilidades de Ruby como lenguaje de programación?

Dado que Ruby se ejecuta en al menos tres plataformas diferentes listas para producción en este momento (MRI, Rubinius, JRuby), uno debe distinguir entre la debilidad del lenguaje Ruby y la plataforma Ruby.

Las debilidades de Ruby, la plataforma, por supuesto, dependen en gran medida de la plataforma que elija. El GVL / GIL, el modelo de subprocesos, el comportamiento de GC y la huella de memoria son en gran medida características (erróneas) de MRI o “C Ruby”; no se aplican del todo a JRuby o Rubinius, que tienen un conjunto diferente de costos y beneficios. Incluso dentro de MRI, la implementación de Ruby 1.9 es una plataforma significativamente diferente de Ruby 1.8. El GIL es ahora el GVL, los hilos verdes se han reemplazado por hilos POSIX, algunos de los comportamientos de memoria más tontos (por ejemplo, las nuevas líneas en el código fuente que aumentan su huella de tiempo de ejecución) se han corregido.

Del mismo modo, las debilidades de la comunidad de Ruby, que son numerosas y severas, no son realmente debilidades del lenguaje de Ruby (excepto en la medida en que se podría argumentar que este último induce al primero a la Sapir-Whorf). Estas debilidades incluyen la neofilia obsesiva generalizada, la apoteosización (y la posterior defensa de culto de) cualquier defensor de la dudosa filosofía de programación que uno encuentra por primera vez, la intimidación generalizada en el patio de la escuela en nombre de “trolling” y un entorno singularmente desagradable para las programadoras.

Entonces, dado todo eso, ¿cuáles son las debilidades del lenguaje Ruby? En mi opinión, las mayores debilidades son:

  • Alcance dinámico de los cambios de monkeypatch. Ruby proporciona un patrón de llamada OO muy consistente en forma de “object.method”, y proporciona herramientas simples para escribir su código de esta manera a través de clases abiertas, pero no proporciona una forma de determinar estos cambios léxicamente. Como resultado, esta técnica (ahora conocida peyorativamente como “parches de monos”), que permite un código potente y elegante, y es básicamente alentada por el lenguaje y la biblioteca estándar, no suele utilizarse en la práctica, especialmente para los autores de bibliotecas. .
  • Las técnicas de “metaprogramación” basadas en la herencia más sofisticadas de Ruby, popularizadas por cosas como ActiveRecord, implican conceptos demasiado complicados como las metaclases, que en gran medida se sienten como artefactos de implementación, no como componentes de primera clase del lenguaje.
  • El soporte de I18n es pobre (Ruby 1.8) o doloroso (Ruby 1.9). Las opciones de diseño que se incluyeron en el soporte i18n de 1.9 no se adaptaron muy bien a un lenguaje de tipo dinámico, y el resultado final es que el programador se sorprende continuamente de dónde surgirá la próxima excepción relacionada con i18n, incluso en el código que funcionó perfectamente en Ruby 1.8.

Tengo algunas otras liendres menores (“def” devuelve nil, los módulos se usan tanto para el espacio de nombres como para los mixins, etc.) pero esos son los grandes.

Dicho esto, como lenguaje, Ruby sigue siendo mi forma favorita de programar, y mi lista de sus puntos fuertes es mucho más larga.

Ruby todavía tiene una tendencia cultural hacia el parcheo de mono, también conocido como acción a distancia. Hay muchas gemas que modifican las clases existentes, a veces de manera que pueden romper el código de trabajo.

La pregunta implica que puedes comparar idiomas como ese. No puedes

Un lenguaje viene con su horticultura: marcos de “aplicación asesina”, aplicaciones típicas, etc. Python era un lenguaje biotecnológico antes de que se generalizara, y Ruby sigue siendo básicamente un lenguaje en el que Rails está escrito (sé que estoy simplificando excesivamente – en el punto.)

Una pregunta más hábil sería: “cuando empiezo a escribir (aplicaciones web, se supone) en Ruby, ¿qué problemas debo esperar?”

La mayoría se enumeraron anteriormente, algunas agregaré:

  • terminalmente lento en comparación con un lenguaje de tipo estático bien compilado, basado en máquinas virtuales o de otro tipo (Java, Scala, Haskell, etc.). Puede, y probablemente lo será, mejorar, pero no de manera significativa, debido a las elecciones fundamentales de diseño del lenguaje que ahora están protegidas en
  • te da una tremenda cantidad de cuerda para ahorcarte , que la comunidad usa con gran abandono. Rails tiene tanta magia para nombrar y preocupaciones enredadas, que esperaría que los productores de las películas de Harry Potter soliciten opciones de guión en cualquier momento.
  • falta de agudeza de ingeniería en torno a herramientas y procesos . La actualización de Ruby 1.8 a 1.9 rompió las operaciones de cadena y fecha . No tengo dudas de que esto mejorará, pero la línea de base se ha establecido baja
  • a pesar del tipeo dinámico (y la consiguiente ausencia de declaraciones de tipo), la falta de documentación es, con pocas excepciones, generalizada . Se espera que termine teniendo que leer la fuente, un concepto erróneo fundamental de cómo las personas realmente adquieren habilidades de codificación

Por todo eso, obtienes un lenguaje de scripting maravillosamente apto y (para algunas clases de aplicaciones) el framework web más productivo y rentable que existe. Compensaciones. Tehy iz everywer.

More Interesting

Programación vs diseño: ¿Cuál es más fácil de aprender y cuál tendrá más valor en la industria tecnológica en los próximos años?

¿Debo dejar mi trabajo e ir a Dev Bootcamp?

¿Qué habilidades esenciales se necesitan para ser un programador web de pila completa (mínimamente viable)?

¿Cuáles son algunos de los trabajos de investigación en Ingeniería Industrial que han tenido un gran impacto en el campo?

¿Qué hace que un desarrollador front-end sea 'senior'?

¿Qué lecciones debo aprender en Java que me basten para ser probablemente deseable como programador de Java?

¿Qué hace Takipi?

¿Cómo funcionan los sistemas de back-end?

¿Debería un aspirante a ingeniero de software estudiar metodologías como RUP, Agile, Scrum o debería centrarse en los aspectos del software en sí?

De ser un DBA, ¿debería aprender el aprendizaje automático o continuar como administrador de la base de datos?

Para convertirme en un ingeniero de software con las oportunidades más abiertas, ¿debería especializarme en ciencias de la computación o ingeniería de software? Muchas universidades superiores solo tienen una u otra (Ejemplo, Berkeley con informática pero no ingeniería de software).

¿Cuál es su opinión sobre la programación de pares?

¿En qué circunstancias es aceptable no escribir pruebas automatizadas para su código?

¿Cuál es la diferencia entre un SILC y un SDLC?

¿El software del teléfono inteligente se hincha deliberadamente para funcionar peor en dispositivos más antiguos?