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.
- ¿Debo aceptar una oferta de pasantía de verano de Zynga?
- Cómo cambiar el idioma de un programa de software
- Cómo volverse competente en el diseño de algoritmos
- ¿Quién ha sido el primero en introducir los lenguajes de patrones de Christopher Alexander en el campo de la ingeniería de software?
- ¿Cuál es la diferencia entre los tres tipos de ingeniería: informática e ingeniería, informática e ingeniería de software?
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.